2017-02-16 96 views
0

我一直試圖在啓動時運行在樹莓派下面的代碼:在啓動時運行的腳本不記錄輸出

#!/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%的CPU使用率,並且在腳本運行時保持一致,所以我可以看到它何時處於活動狀態(我沒有在此Pi上運行任何其他進程)。使用ps -aux顯示活動的python3進程。但是,它不會輸出任何內容,或者輸出到output.txt文件或網絡表。

我的最終目標是讓它成功輸出到網絡表。如果我正常運行它(例如,不在啓動時,通過終端中的python3 pipeline-test.py),它會正確輸出到output.txt和網絡表。我添加了output.txt作爲確保我獲得正確輸出的一種方式,除了在啓動時運行時,它工作得很好。

有沒有人有什麼可能是錯的想法?如果需要更多信息,我可以盡我所能提供。

編輯:出於某種原因,當我從Github複製我的代碼時,它失去了所有的縮進。正在使用的代碼是here

+1

這將有助於如果有問題的代碼被正確地縮進。 – martineau

+0

@martineau對不起,我把它從我的Github中複製出來,出於某種原因,縮進沒有結束。我修復了它。縮進在正在運行的位置是正確的。 –

+0

爲什麼你的循環中有'open'語句?您一遍又一遍地打開文件。它應該在循環之外,可能你應該看看使用'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 

的PI將啓動,並運行程序,幾分鐘後,pkill的python並查看/home/pi/error.log文件。這會讓你更好地瞭解你的程序發生了什麼「失敗狀態」

我注意到在你的程序中你調用了一個文件。而不是output.txt,您將需要該文件的完整路徑,因爲該程序在啓動時在根目錄中執行。這將需要在您的程序調用任何文件的所有情況下進行更改。

,如果你再拿到在日誌文件權限錯誤,運行以下

sudo chmod 777 -R /filepath_to_your_script