🍷

myCobotをMQTTで動かせるようにしてみた

2023/05/04に公開

前回では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で配布されています

https://www.elephantrobotics.com/en/downloads/

パッケージのインストール

mqtt_bridgeのインストール

ROSとMQTTの通信をするときには自分で実装する方法もありますが、mqtt_bridgeというmqttとROSの通信プロトコルを相互変換するインターフェースがパッケージとして公開されていたのでありがたく先人の知恵を借りることにします

https://github.com/groove-x/mqtt_bridge

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/configmycobot_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/launchmycobot.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を遠隔操作させるデモをイベント用に簡単に作ってみました(気が向いたらこの解説記事も書く予定です)

https://twitter.com/k_miura_io/status/1654004289461977088

Discussion