我一直试图在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:frc@10.17.11.11/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%的CPU使用率,并且在脚本运行时保持一致,因此我可以看到它何时处于活动状态(我没有在此Pi上运行任何其他进程)。使用ps -aux
显示活动的python3进程。但是,它不会向output.txt
文件或网络表输出任何内容。
我的最终目标是让它成功输出到网络表。如果我正常运行(例如,在启动时没有通过终端中的python3 pipeline-test.py
),它会正确输出到output.txt
和网络表。我添加了output.txt
作为确保我获得正确输出的方法,并且除非在启动时运行,否则它的工作正常。
有没有人知道可能出现什么问题?如果需要更多信息,我可以尽力提供。
编辑:出于某种原因,当我从Github复制我的代码时,它丢失了所有缩进。正在使用的代码是here。答案 0 :(得分: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
pi将启动,并运行程序,几分钟后,pkill python并查看/home/pi/error.log文件。这将使您更好地了解您的计划正在发生的事情"失败状态"
我在你的程序中注意到你调用了一个文件。而不是output.txt,您将需要文件的完整路径,因为程序在启动时在根目录中执行。这需要在程序调用任何文件的所有实例中进行更改。
如果您在日志文件中收到权限错误,请运行以下
sudo chmod 777 -R /filepath_to_your_script