如何使用pyserial流式传输机器人传感器数据?

0 投票
1 回答
559 浏览
提问于 2025-04-16 07:25

我正在尝试用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获取一些调试信息。

撰写回答