gpt4 book ai didi

python - 在 python 脚本中仅使用从 Arduino 读取的最新值,而不是存储在缓冲区中的值?

转载 作者:太空宇宙 更新时间:2023-11-03 11:32:57 25 4
gpt4 key购买 nike

我一直在做一个项目,使用 Python 从 arduino 读取值,然后控制摄像机。 Arduino 控制两个超声波传感器并以厘米为单位报告距离。然后 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)

最佳答案

关于缓冲区已满,您是对的。您需要一种始终从缓冲区中获取最新值的方法。

我建议替换这个:

status = arduino.readline()

用这个:

status = getLatestStatus()

然后通过相机功能进一步向上移动:

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

getLatestStatus 函数每次调用时都会遍历整个缓冲区,只返回最新的状态,忽略同时返回的所有状态。

你的另一个选择是修改你的arduino的“固件”,让它在每次收到命令时返回一个距离传感器值,(比如“M\n”)这样你就不必担心缓冲区问题.这就是我为 arduino 驱动的超声波测距设备所做的,我觉得它比“读取整个缓冲区”解决方案更干净。不过,它会给您的距离测量带来更多的延迟。

关于python - 在 python 脚本中仅使用从 Arduino 读取的最新值,而不是存储在缓冲区中的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13663591/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com