我正在尝试使MQTTtoROS Bridge工作,并且我一直收到此错误:
Traceback (most recent call last):
File "/usr/lib/python2.7/threading.py", line 801, in __bootstrap_inner
self.run()
File "/usr/lib/python2.7/threading.py", line 754, in run
self.__target(*self.__args, **self.__kwargs)
File "/home/animu/.local/lib/python2.7/site-packages/paho/mqtt/client.py", line 2627, in _thread_main
self.loop_forever(retry_first_connection=True)
File "/home/animu/.local/lib/python2.7/site-packages/paho/mqtt/client.py", line 1407, in loop_forever
rc = self.loop(timeout, max_packets)
File "/home/animu/.local/lib/python2.7/site-packages/paho/mqtt/client.py", line 923, in loop
rc = self.loop_read(max_packets)
File "/home/animu/.local/lib/python2.7/site-packages/paho/mqtt/client.py", line 1206, in loop_read
rc = self._packet_read()
File "/home/animu/.local/lib/python2.7/site-packages/paho/mqtt/client.py", line 1799, in _packet_read
rc = self._packet_handle()
File "/home/animu/.local/lib/python2.7/site-packages/paho/mqtt/client.py", line 2275, in _packet_handle
return self._handle_publish()
File "/home/animu/.local/lib/python2.7/site-packages/paho/mqtt/client.py", line 2461, in _handle_publish
self._handle_on_message(message)
File "/home/animu/.local/lib/python2.7/site-packages/paho/mqtt/client.py", line 2615, in _handle_on_message
t[1](self, self._userdata, message)
File "/home/animu/catkin_ws/src/mqtt_bridge-master/src/mqtt_bridge/bridge.py", line 114, in _callback_mqtt
ros_msg = self._create_ros_message(mqtt_msg)
File "/home/animu/catkin_ws/src/mqtt_bridge-master/src/mqtt_bridge/bridge.py", line 124, in _create_ros_message
msg_dict = self._deserialize(mqtt_msg.payload)
File "msgpack/_unpacker.pyx", line 143, in msgpack._unpacker.unpackb (msgpack/_unpacker.cpp:2143)
ExtraData: unpack(b) received extra data.
我在互联网上找不到任何东西,因为这个桥我觉得不常用。唯一类似的问题是盐和卡夫卡,但解决方案无处可寻。所有python库都是最新的,我仔细检查过。桥接器将消息从RoS发送到MQTT而没有任何问题,包括STR和BOOL类型。从MQTT发送的任何消息都会以此错误结束,而不会收到ROS的接收。
答案 0 :(得分:0)
有点晚了,但我会为未来的读者提供一些建议。 首先,确保已安装桥接器的所有要求。通过阅读requirement.txt检查它们 其次,编辑mqtt_bridge配置文件以匹配来自ROS和MQTT服务器的主题。也是MQTT服务器的IP地址/端口。 多数民众赞成。
答案 1 :(得分:0)
由于Animu是一名学生,因此我认为这是他的培训或实习公司的一项任务。答案可能不再有用,但是由于我也遇到了这个问题,因此我为将来的读者提供一种解决方案:
在网桥存储库中,有一个名为“ demo_params.yaml”的文件。或者,如果您已经使用不同的名称命名,则包含您的“设置”的.yaml文件。
此文件包括以下内容:
mqtt:
client:
protocol: 4 # MQTTv311
connection:
host: localhost
postage: 1883
keepalive: 60
private_path: device / 001
serializer: msgpack: dumps
deserializer: msgpack: loads
bridge:
# ping pong
- factory: mqtt_bridge.bridge: RosToMqttBridge
msg_type: std_msgs.msg: Bool
topic_from: / ping
topic_to: ping
- factory: mqtt_bridge.bridge: MqttToRosBridge
msg_type: std_msgs.msg: Bool
topic_from: ping
topic_to: / pong
如您所见,它说msgpack用于序列化和反序列化来回发送的消息。这主要适用于MQTT的ROS。反之,则不起作用,因为在Python代码中未执行正确的操作。您有两种解决方案。
继续使用msgpack,并确保您已发布的MQTT消息已被编码为msgpack,可以对它们本身进行序列化。 (二进制)。这是一个棘手的解决方案,因为如果您手动发布MQTT消息,则只想使其易于阅读。如果您编写了另一个发布MQTT消息的程序,请随时先使用msgpack序列化消息,然后再发布。然后桥也可以工作。
另一个选择是进行JSON序列化,而不是msgpack序列化。这是网桥的默认选项,但是您也可以在.yaml文件中指定它。您可以通过编辑以下代码来做到这一点:
serializer: msgpack: dumps
deserializer: msgpack: loads
对此:
serializer: json: dumps
deserializer: json: loads
现在,您可以手动或在软件的帮助下发布mqtt消息。 您可以按照以下步骤进行操作:
mosquitto_pub -t 'echo' -m '{"data": "test"}