如何使用pyserial流式传输机器人传感器数据?
我正在尝试用pyserial来获取iRobot Create机器人的传感器数据。我导入了openinterface.py
,用CreateBot函数设置了一个机器人变量,然后调用了
bot.stream_sensors(6)
接着我收到了这个错误 - “流式线程错误!元组索引超出范围”。我之所以用6来调用这个函数,是因为我看到的例子是这么做的。我也试过stream_sensors(0)
、stream_sensors(1)
,一直到6。对于小于6的任何数字,我都得到了同样的错误,还有“非法传感器ID!
”。这个参数是根据什么来的?是我想要获取的特定传感器吗?如果是的话,我该怎么知道这个传感器的编号?任何帮助都很感激。
1 个回答
1
从openinterface.py的源代码来看,你遇到的“非法传感器ID”错误,是因为你在调用stream_sensors()时使用的ID值和已知传感器ID的字典不匹配。这个传感器ID的字典是在SensorPacketDecoderAPI类中定义的:
class SensorPacketDecoderApi:
"""
Transform sensor data in the form of bytes (from a serial stream)
into a dictionary of sensor values.
"""
names = {'left-velocity' : 42,
'right-velocity' : 41,
'radius' : 40,
'velocity' : 39,
'n-stream-packets' : 38,
'song-playing' : 37,
'song-number' : 36,
'oi-mode' : 35,
'home-base?' : 34,
'internal-charger?' : 34,
'user-analog-in-0' : 33,
'baud-rate-change?' : 32,
'user-digital-in-3' : 32,
'user-digital-in-2' : 32,
'user-digital-in-1' : 32,
'user-digital-in-0' : 32,
'cliff-right-signal' : 31,
'cliff-right-front-signal' : 30,
'cliff-left-front-signal' : 29,
'cliff-left-signal' : 28,
'wall-signal' : 27,
'capacity' : 26,
'charge' : 25,
'temperature' : 24,
'current' : 23,
'voltage' : 22,
'charging-state' : 21,
'angle' : 20,
'distance' : 19,
'advance?' : 18,
'play?' : 18,
'infrared-byte' : 17,
'left-wheel-overcurrent?' : 14,
'right-wheel-overcurrent?' : 14,
'low-side-driver-2-overcurent?' : 14,
'low-side-driver-0-overcurent?' : 14,
'low-side-driver-1-overcurent?' : 14,
'virtual-wall?' : 13,
'cliff-right?' : 12,
'cliff-front-right?' : 11,
'cliff-front-left?' : 10,
'cliff-left?' : 9,
'wall?' : 8,
'wheel-drop-caster?' : 7,
'wheel-drop-left?' : 7,
'wheel-drop-right?' : 7,
'bump-left?' : 7,
'bump-right?' : 7,
'all' : 6}
至于你为什么会看到“流媒体线程错误!...”,我不太确定。我从代码中看到的只是这个错误是在CreateBot类中的一个叫_stream_sensors_worker的函数里产生的。还有一个叫_test_sensor_streaming的函数,你也可以试着从_stream_sensors_worker获取一些调试信息。