4

Python を使用して arduino から値を読み取り、ビデオ カメラを制御するプロジェクトに取り組んでいます。Arduino は 2 つの超音波センサーを制御し、距離を cm で報告します。次に、python スクリプトは ser.readline() を使用して Arduino から距離を読み取ります。スクリプトが範囲外の値を読み取ると、すべて正常に機能します。ただし、必要な範囲内の距離のループに入ると、一度正しく機能し、現在の「ライブ」値の代わりに Arduino から古い値を読み取るため、ループを終了する代わりに記録ループを続行します。バッファ内の古い値を取り除き、最新の値のみを読み取るにはどうすればよいですか? いくつかの方法を見つけてテストしましたが、今のところうまくいきません。

これが私が使用しているコードです(よく書かれていないことは知っていますが、pythonを使用してmatlab外でコードを書くのは初めてです)

import sys, time
import serial
import cv
import os
from time import strftime

#Create window for Camera 0
cv.NamedWindow("Camera 0", cv.CV_WINDOW_AUTOSIZE)
capture0 = cv.CreateCameraCapture(2)
cv.ResizeWindow("Camera 1", 640, 480)
cv.MoveWindow("Camera 0", 0, 0)
#Create window for Camera 1
cv.NamedWindow("Camera 1", cv.CV_WINDOW_AUTOSIZE)
capture1 = cv.CreateCameraCapture(1)
cv.MoveWindow("Camera 1", 150, 150)

#Initialize connection to Arduino
arduino = serial.Serial('COM12', 9600)

connected = False

#Confirm that Arduino is connected and software is able to read inputs
while not connected:
    serin = arduino.readline()
    connected = True
    f = 'Sensor Connected'
    print f

'''#Dummy variables for testing
value1 = 145
value2 = 30'''

#Initialize video record on as false (0)
vid = 0

#Initialize counter
counter_vid = 0
counter = 0

Accel = 1

def Camera0():
    frame0=cv.QueryFrame(capture0)
    cv.WriteFrame(writer0,frame0)
    cv.ShowImage("Camera 0", frame0)

def Camera1():
    frame1=cv.QueryFrame(capture1)
    cv.WriteFrame(writer1,frame1)
    cv.ShowImage("Camera 1", frame1)

while True:
    status = arduino.readline()
    value1=int((status[6:10]))-1000
    value2=int((status[17:21]))-1000
    print(value1)
    print(value2)
    if value1>180 and value2>180 and vid==0:
        vid = 0
    elif value1>180 and value2>180 and vid==1:
        vid = 0
    elif value1<180 and vid==0 or value2<180 and vid==0:
        filename0 = strftime("OUTPUT\%Y_%m_%d %H_%M_%S") + " camera0.avi"
        writer0=cv.CreateVideoWriter(filename0, 1, 15.0, (640,480), is_color=1)
        filename1 = strftime("OUTPUT\%Y_%m_%d %H_%M_%S") + " camera1.avi"
        writer1=cv.CreateVideoWriter(filename1, 1, 15.0, (640,480), is_color=1)
        vid=1
        while counter_vid<25 and vid==1:
            Camera0()
            Camera1()
            counter_vid += 1
            print(counter_vid)
            cv.WaitKey(10)
    else:
        while counter_vid<25 and vid==1:
            Camera0()
            Camera1()
            counter_vid += 1
            print(counter_vid)
            cv.WaitKey(10)        

    cv.WaitKey(25)
    counter_vid = 0
    counter += 1
    print('End of Loop Counter')
    print(counter)
4

1 に答える 1

2

バッファがいっぱいになるのは正しいです。バッファから常に最新の値を取得する方法が必要です。

これを置き換えることをお勧めします:

status = arduino.readline()

これとともに:

status = getLatestStatus()

そして、カメラ機能によって、さらに上に向かって:

def getLatestStatus():
    while arduino.inWaiting() > 0:
        status = arduino.readline()
    return status

この関数 getLatestStatus は、呼び出されるたびにバッファ全体を調べ、その間に返されたすべてのステータスを無視して、最新のステータスのみを返します。

他のオプションは、arduino がコマンドを受信するたびに距離センサーの値を返すように「ファームウェア」を変更することです (「M\n」など)。これにより、バッファの問題を心配する必要がなくなります。それが私がarduinoを搭載した超音波距離デバイスに対して行ったことであり、「バッファー全体を読み取る」ソリューションよりもクリーンだと感じました。ただし、距離測定にもう少し遅延が発生します。

于 2012-12-10T23:04:26.843 に答える