myCobotをMQTTで動かせるようにしてみた
前回ではrosbridgeを使いWebsocketでmyCobotを動かせるようにしました。
ただ、今後別のデバイスと通信をするとなったときにはWebsocketよりもMQTTを使いたくなります。
というわけで今回はmyCobotをMQTTで操作する方法を試してみました。
動作環境
今回の動作環境は以下の通りです。myCobot Pi 280には予めROSがインストールされており、ROSで動かすためのパッケージもインストールされています。M5 Stack版でROSを使う場合はこちらを参考に環境構築をします。(M5 Stack版は手元にないので検証はできていません)
- myCobot Pi 280(OS: Ubuntu 20.04, ROS: Noetic)
前回はMelodicを使っていましたが、今回の環境構築にあたり依存関係を解消するのに手間取ったのでこそっとイメージを変更しましたw
myCobot用のイメージは以下のURLで配布されています
パッケージのインストール
mqtt_bridgeのインストール
ROSとMQTTの通信をするときには自分で実装する方法もありますが、mqtt_bridgeというmqttとROSの通信プロトコルを相互変換するインターフェースがパッケージとして公開されていたのでありがたく先人の知恵を借りることにします
myCobot内に作られているワークスペースのディレクトリにパッケージをクローンしてきます。
cd ~/catkin_ws/src
git clone https://github.com/groove-x/mqtt_bridge
クローンできたらビルドしてパスを通せばインストール完了です
cd ..
catkin_make
source ~/catkin_ws/devel/setup.bash
mosquittoをインストール
今回はローカルで行えるようにしたいので、mqttブローカーのmosquittoをインストールします。
インストールは以下のコマンドで行います。
sudo add-apt-repository ppa:mosquitto-dev/mosquitto-ppa
sudo apt-get update
sudo apt-get install mosquitto mosquitto-clients
とりあえず動作確認
インストールができたところで動作確認として、パッケージに予め入っている文字列をやり取りするだけのデモを動かしてみます
まずは、mqtt_bridgeのノードを立ち上げます。
roslaunch mqtt_bridge demo.launch
もう一つターミナルを立ち上げて以下のコマンドでmosquitto側でsubscriberを立ち上げます。
mosquitto_sub -t echo
これでMQTTでデータを受け取れる状態になったので、もう一つターミナルを立ち上げて以下のコマンドで文字列のトピックをpublishします。
rostopic pub /echo std_msgs/String "data: 'hello'" -r 5
無事に先程立ち上げたmosquittoのsubscriberでROSでpublishしたメッセージが表示されたらセットアップは正常に完了しています。
myCobot用の設定を用意する
ここから本題のmyCobotをMQTTで操作できるようにするための設定をやっていきます。
今回の目標としてはMQTTブローカー経由でmyCobotを操作できるようにしていくことです。
~/catkin_ws/src/mqtt_bridge/config
にmycobot_config.yaml
を新規作成し、以下の内容を書き込みます。
mqtt:
client:
protocol: 4 # MQTTv311
connection:
host: localhost
port: 1883
keepalive: 60
serializer: json:dumps
deserializer: json:loads
bridge:
# pose joint_state
- factory: mqtt_bridge.bridge:RosToMqttBridge
msg_type: sensor_msgs.msg:JointState
topic_from: /joint_states
topic_to: pose
- factory: mqtt_bridge.bridge:MqttToRosBridge
msg_type: sensor_msgs.msg:JointState
topic_from: ~/pose
topic_to: /joint_states
ポイントとしては msg_type
の箇所で設定するメッセージは rospyでインポートするモジュールを書くことです。
例えばpythonで from sensor_msgs.msg import JointState
と呼び出すときにはmsg_typeには sensor_msgs.msg:JointState
と記述します。
このやり方さえわかれば他のトピックでMQTTを使いたいときも大体対応できます。
ここで書いた設定ファイルを呼び出すために ~/catkin_ws/src/mqtt_bridge/launch
に mycobot.launch
を新規作成し、以下の内容を書き込みます。
<launch>
<arg name="use_tls" default="false" />
<node name="mqtt_bridge" pkg="mqtt_bridge" type="mqtt_bridge_node.py" output="screen">
<rosparam command="load" file="$(find mqtt_bridge)/config/mycobot_config.yaml" />
<rosparam if="$(arg use_tls)" command="load" ns="mqtt" file="$(find mqtt_bridge)/config/tls_params.yaml" />
</node>
</launch>
書き込んだら以下のコマンドでmqtt_bridgeを立ち上げ直します。
roslaunch mqtt_bridge mycobot.launch
あとは、前回同様以下のコマンドで実機を動かすためのノードを立ち上げます。
rosrun mycobot_280 slider_control.py _port:=/dev/ttyAMA0 _baud:=1000000
動かしてみる
これで動かすために必要なセットアップは完了しました。
mqttのpublishをするために以下のシェルスクリプトを任意のディレクトリに保存して実行します。
payload=$(cat << EOS
{
"name": [
"joint2_to_joint1",
"joint3_to_joint2",
"joint4_to_joint3",
"joint5_to_joint4",
"joint6_to_joint5",
"joint6output_to_joint6"
],
"position": [
0,
0,
0,
0,
0,
0
]
}
EOS
)
mosquitto_pub -t /pose -m "$payload"
スクリプト実行後、myCobotを直立させることができたら動作確認成功です。
まとめ
今回はMQTTでROSが動いているmyCobotを操作してみました。
MQTTを使うことができればクラウドのブローカーと接続して遠隔操作システムを実装するのも簡単にできるようになります。
というわけでM5StickCを使ってmyCobotを遠隔操作させるデモをイベント用に簡単に作ってみました(気が向いたらこの解説記事も書く予定です)
Discussion