簡単な設定で ROS と MQTT を連携できる mqtt_bridge パッケージを作成しました。
主な機能
- ROS Message 互換の MQTT <--> ROS 連携
- MQTT における TLS 機能
- カスタム Bridge の作成機能
- json または msgpack ベースの MQTT フォーマット。カスタムフォーマットも指定可能。
- MQTT のトピックパスへの動的な prefix 設定
準備
MQTT Broker の mosquitto とそのクライアントをインストールします。
# apt-get install mosquitto mosquitto-clients
mqtt_bridge は ROS の Package Directory に登録されていないので、 git clone して catkin_make, rodsep install してください。
$ cd ~/catkin_ws/src
$ git clone https://github.com/groove-x/mqtt_bridge
$ cd ~/catkin_ws
$ catkin_make --pkg mqtt_bridge
$ rosdep install mqtt_bridge
デモ
ROS トピックで配信されたメッセージを MQTT へ転送し、それを受信して、改めて ROS メッセージとして配信しなおします。
設定ファイルを作成
下記のような設定ファイルを作成し、
mqtt:
client:
protocol: 4 # MQTTv311
connection:
host: localhost
port: 1883
keepalive: 60
private_path: device/001
selializer: msgpack:dumps
deselializer: 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
# echo back
- factory: mqtt_bridge.bridge:RosToMqttBridge
msg_type: std_msgs.msg:String
topic_from: /echo
topic_to: echo
- factory: mqtt_bridge.bridge:MqttToRosBridge
msg_type: std_msgs.msg:String
topic_from: echo
topic_to: /back
# private path
- factory: mqtt_bridge.bridge:RosToMqttBridge
msg_type: std_msgs.msg:String
topic_from: /private/echo
topic_to: ~/echo
- factory: mqtt_bridge.bridge:MqttToRosBridge
msg_type: std_msgs.msg:String
topic_from: ~/echo
topic_to: /private/back
launch ファイルを記述します。
<launch>
<arg name="use_tls" default="false" />
<node name="mqtt_bridge" pkg="mqtt_bridge" type="mqtt_bridge_node.py" output="screen">
<rosparam file="$(find mqtt_bridge)/config/demo_params.yaml" command="load" />
<rosparam if="$(arg use_tls)" file="$(find mqtt_bridge)/config/tls_params.yaml" command="load" ns="mqtt" />
</node>
</launch>
デモノードを実行
デモノードを起動します。
$ roslaunch mqtt_bridge demo.launch
動作確認
ROS の /echo
トピックに "hello" を publish すると、
$ rostopic pub /echo std_msgs/String "data: 'hello'"
MQTT の echo
トピックに "hello" が転送され、
$ mosquitto_sub -t 'echo'
{"data": "hello"}
それがさらに ROS の /back
トピックに配信されます。
$ rostopic echo /back
data: hello
---
You can also see MQTT messages using mosquitto_sub
まとめ
ROS, MQTT 間を手軽にブリッジするための mqtt_bridge パッケージを作成しました。詳しくは mqtt_bridge の README をご確認下さい。なお、ROS, MQTT 間をブリッジするにあたって rosbridge_library
で実装されている ROS Message のシリアライザを利用したのですが、便利ですね。