Я пытался запустить следующий код при запуске на 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.
Это помогло бы, если код в вопрос был отступом правильно. – martineau
@martineau Да, извините, я скопировал это из своего Гитуба и почему-то отступ не перенесен. Я исправил это. Отступ правилен там, где он запускается. –
Почему ваш 'открытый' оператор внутри вашей петли? Вы открываете файл снова и снова. Он должен быть вне цикла, и, вероятно, вам следует использовать шаблон 'with open' .... Также ваш отступ по-прежнему отключен ... ваши исключения должны быть на том же уровне, что и ваша попытка. – RobertB