2017-02-16 3 views
0

Я пытался запустить следующий код при запуске на Raspberry Pi:запустить скрипт при запуске не регистрирует выход

#!/usr/bin/python3 

import numpy 
import math 
import cv2 
#this is python 3 specific 
import urllib.request 
from enum import Enum 
from VisionProcessor import VisionProcessor 
from GripPipeline import GripPipeline 
from networktables import NetworkTables 
import time 
import logging 
from networktables.util import ntproperty 

#proper networktables setup 
logging.basicConfig(level=logging.DEBUG) 
NetworkTables.initialize(server='10.17.11.76') 

#create the field to talk to on the network table 
class NTClient(object): 
    angle_difference = ntproperty('/Raspberry Pi/angle difference', 0) 
    distance_from_target = ntproperty('/Raspberry Pi/distance from target', 0) 

n = NTClient() 

frame = cv2.VideoCapture('https://frc:[email protected]/mjpg/video.mjpg') 

if(frame == None): 
    print("error: camera not found. check connection") 
#pipeline = GripPipeline() 
pipeline = VisionProcessor() 


print("pipeline created") 

def get_image(): 
    ret, img_array = frame.read() 
# cv2.imwrite("frame.jpg", img_array) 
    return img_array 

def find_distance(width, height, y): 
    #distances are in inches 
    KNOWN_WIDTH = 6.25 
    KNOWN_DISTANCE = 12.0 
    KNOWN_PIXELS = 135.5 
    KNOWN_HEIGHT = 424.0 

    focal_length = (KNOWN_PIXELS * KNOWN_DISTANCE)/KNOWN_WIDTH 
    #hypotenuse = (KNOWN_WIDTH * focal_length)/width 
    distance = (KNOWN_WIDTH * focal_length)/width 

    #0.2125 degrees per pixel vertical 
# theta = (0.2125) * (240 - y) 

# distance = KNOWN_HEIGHT * (math.tan((math.pi/2) - math.radians(theta))) 

    return distance 

x = True 
while x: 
    print("while loop entered") 
    img = get_image() 
    print("image gotten") 
    center_point = [160, 120] 
    file = open('output.txt', 'a') 
    try: 
     current_point, size, y = pipeline.process(img) 
     #negative means turn left, positive means turn right 
     pixel_difference = center_point[0] - current_point[0] 
     #4.7761 pixels per degree 
     angle_difference = (float)(pixel_difference)/4.7761 
     n.angle_difference = angle_difference 
     target_width = size[0] 
     target_height = size[1] 
     distance = find_distance(target_width, target_height, y) 
     n.distance_from_target = distance 
     print("angle") 
     file.write("angle: ") 
     print(n.angle_difference) 
     file.write(str(angle_difference)) 
     print(" distance: ") 
     file.write("distance") 
     print(distance) 
     file.write(str(distance)) 
     file.write("\n") 
    except UnboundLocalError: 
     print(":(") 
    except (TypeError, cv2.error) as e: 
     print(":(") 

# x = False 

Я делал это путем редактирования файла /etc/rc.local, и сценарий работает «успешно». Pi показывает ~ 25% использования ЦП при запуске, и он остается согласованным во время работы скрипта, поэтому я могу видеть, когда он активен (у меня нет других процессов на этом Pi). Использование ps -aux показывает активный процесс python3. Однако он ничего не выводит ни в файл output.txt, ни в сетевые таблицы.

Моя конечная цель - получить его для успешного вывода на сетевую таблицу. Если я запускаю его нормально (например, не при запуске, через python3 pipeline-test.py в терминале), он корректно выводит на output.txt и на сетевую таблицу. Я добавил output.txt как способ убедиться, что получаю правильный вывод, и он работает отлично, если только он не запускается при запуске.

У кого-нибудь есть представление о том, что может быть неправильным? Если вам нужна дополнительная информация, я могу сделать все возможное, чтобы ее предоставить.

EDIT: по какой-то причине, когда я скопировал свой код из Github, он потерял все отступы. Используемый код: here.

+1

Это помогло бы, если код в вопрос был отступом правильно. – martineau

+0

@martineau Да, извините, я скопировал это из своего Гитуба и почему-то отступ не перенесен. Я исправил это. Отступ правилен там, где он запускается. –

+0

Почему ваш 'открытый' оператор внутри вашей петли? Вы открываете файл снова и снова. Он должен быть вне цикла, и, вероятно, вам следует использовать шаблон 'with open' .... Также ваш отступ по-прежнему отключен ... ваши исключения должны быть на том же уровне, что и ваша попытка. – RobertB

ответ

1

Для начала скрипт /etc/rc.local выполняется как root, поэтому в корневом каталоге. Вам нужно будет добавить полный путь к вашей программе python. Это может или не может решить проблему.

python /dir/dir/python_program 

Вы можете записать выходные данные этой программы в файл ошибки. Сделать файл

sudo nano /home/pi/error.log 

В этом файле просто введите что-нибудь и выйдите (ctrl + x), сохранив изменения. Затем вы измените rc.local, так что сообщения добавляются в файл

python /dir/dir/python_program > /home/pi/error.log & 

Теперь выполнить перезагрузку

sudo reboot 

пи будет загружаться, и запустить программу, через несколько минут, pkill python и просмотреть файл /home/pi/error.log. Это даст вам лучшее представление о том, что происходит с вашими программами «Состояние сбоя»

Я заметил, что в вашей программе вы вызываете файл. а не output.txt, вам понадобится полный путь к файлу, так как программа запускается в корневом каталоге при запуске. это нужно будет изменить во всех случаях, когда ваша программа вызывает любой файл.

, если вы получите то ошибку разрешений в файле журнала, выполните следующие действия

sudo chmod 777 -R /filepath_to_your_script 
Смежные вопросы