此代码注册来自串行 USB 端口距离跟踪器的传入数据,并将数据流转换为 1
或 0
(如果它们超过特定阈值)并添加 Unix 时间戳
代码:
import serial
import datetime
import time
distance = 5
# Open serial usb port
ser = serial.Serial('/dev/tty.usbserial', 115200, timeout=0.05)
# converts data to 1/0
def convertData(data):
data = data.decode("utf-8")
data = data.replace('$BM,','')
try:
data = float(data)
if data <= distance:
data = 1
else:
data = 0
except ValueError:
pass
return data
while True:
data = ser.read(9999999)
measureunix = float(time.time())
specData = convertData(data)
print ('Distance:', specData,'Timestamp(Unix):', measureunix)
终端输出:
Distance: 1 Timestamp(Unix): 1495381131.521877
Distance: 1 Timestamp(Unix): 1495381131.572295
Distance: 1 Timestamp(Unix): 1495381131.626737
Distance: 1 Timestamp(Unix): 1495381131.677538
Distance: 1 Timestamp(Unix): 1495381131.73111
Distance: 1 Timestamp(Unix): 1495381131.786401
Distance: 1 Timestamp(Unix): 1495381131.839391
Distance: 0 Timestamp(Unix): 1495381131.889872
Distance: 0 Timestamp(Unix): 1495381131.940595
Distance: 0 Timestamp(Unix): 1495381131.991894
Distance: 0 Timestamp(Unix): 1495381132.043311
Distance: 0 Timestamp(Unix): 1495381132.097168
Distance: 0 Timestamp(Unix): 1495381132.149091
Distance: 0 Timestamp(Unix): 1495381132.200407
Distance: 0 Timestamp(Unix): 1495381132.25372
Distance: 0 Timestamp(Unix): 1495381132.306592
问题:
至于下一步 - 我不知道如何做到这一点,但我想设置一个计数器,当输出为(1)时开始计数,继续计数,直到有两个连续的(0),然后停止计数并打印出计数(time_of_last(1)-time_of_first(1))
所花费的时间除以 (1)
的数量,并等待下一个 (1)
并再次启动。
背景:
我正在尝试构建一个系统,使用距离跟踪激光来测量旋转盘的速度(盘上有固定直径的孔)。因此,激光会记录旋转,并且可以了解旋转圆盘的角速度和角度
也许有更好的方法来做到这一点,我不确定。
最佳答案
当然,我无法使用真实数据对此进行测试,但以下方法似乎适用于模拟输入。基本上,您正在做的是解析 0 和 1 的数据流,以及 Finite-State-Machine似乎是一个好方法。一个人的逻辑可以完全封装在一个类中:
class FSM(object):
def __init__(self):
self.state = self.state0
def transition(self, value):
self.state(value)
def state0(self, value):
if value == 1:
self.start = time.time()
self.count = 1
self.state = self.state1
def state1(self, value):
if value == 0: # first 0?
self.state = self.state2
if value == 1:
self.count += 1
def state2(self, value):
if value == 0: # second 0 in a row?
elapsed = time.time() - self.start
try:
rate = self.count / elapsed
except ZeroDivisionError:
rate = float('NaN')
print('rate {}'.format(rate))
self.state = self.state0
if value == 1:
self.count += 1
self.state = self.state1
使用它很简单 - 只需使用每个数据值调用其 transition()
方法即可:
fsm = FSM()
while True:
data = ser.read(9999999)
measureunix = float(time.time())
specData = convertData(data)
print('Distance:', specData, 'Timestamp(Unix):', measureunix)
fsm.transition(specData)
关于python - 如何记录系统输出1的时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44099063/