ROS2でM5StackとPCをつなぐ

Ubuntu 18.04 なPCとM5Stack GrayとをROS2で結んでみたので忘れないようにメモ。

参考にしたのは以下のサイト

使用環境

PC側

  • 普通のノートPC(本当はあまり普通じゃない GPD MicroPCだけど変わらないはず)
  • Ubuntu 18.04
  • Visual Studio Code
  • vscode の Platform IO 拡張

M5Stack側

  • M5Stack Gray (多分 Basic でも Fire でも同じ)

インストール作業いろいろ

ROS2のインストール

以下のサイトの手順にてROS2 Dashing Diademataをインストールした。「Install additional RMW implementations」以外は全て実施した。(手順は省略)

https://index.ros.org/doc/ros2/Installation/Dashing/Linux-Install-Debians/

python-rosdep2 パッケージをインストールした後で、以下を行った。

sudo rosdep init
rosdep update

サンプルプログラムのインストール

ROS2ではじめよう次世代ロボットプログラミング」で勉強中なので、書籍で説明されていたサンプルコードを使った。(丁寧でわかりやすいです)

あらかじめ working と ros2_ws のフォルダは作成済み。

cd ~/working
git clone https://github.com/youtalk/get-started-ros2.git
cd get-started-ros2
git submodule update --init
cd ~/ros2_ws
ln -s ~/working/get-started-ros2/ros2 src
rosdep install --from-paths src --ignore-src -r -y
colcon build

colcon build が何度か失敗したけど、やり直したら全てビルドできた。不思議。

Micro-XRCE-DDSのインストール

M5Stackは、Micro-XRCE-DDSをインストールしたPCと接続するとROS2でつながれるらしい。そこでMicro-XRCE-DDSをインストールする。以下のページを見ながらインストール。

https://micro-xrce-dds.readthedocs.io/en/latest/installation.html

ほぼ上の通りだが、 https://speakerdeck.com/anoken/m5stack-x-ros2?slide=16 によると、cmake のところでオプション指定しているので、そのように変更した。それがどんな意味を持っているか(まだ)わかっていない。

cd ~/working
git clone https://github.com/eProsima/Micro-XRCE-DDS.git
cd Micro-XRCE-DDS
mkdir build
cd build
cmake -DTHIRDPARTY=ON -DCONFIG_UDP_TRANSPORT_MTU=4096 -DCONFIG_SERIAL_TRANSPORT_MTU=4096 ..
make
sudo make install

ros2arduino のインストール

M5Stack 側のプログラムでは ros2arduino のライブラリが必要となるのでインストールする。vscode + platformio で開発しているので 、PIO Home から Libraries で ros2arduino を検索してインストールする。非常に簡単。

プログラミング

今回はテストとしてchatterプログラムを使用し、PC側をListener 、M5Stack側をPublisherとした。

PC側のプログラミング

PC側については、ふつうにROS2のプログラムを作成する。先ほどビルドしたROS2のサンプルプログラムとして入っているものをそのまま使用した。

. ~/ros2_ws/install/setup.bash
ros2 run hello_world listener

上記のサンプルでは、chatterトピックのメッセージを受け取って画面に表示するものである。別のターミナルを開いて以下を実行すれば、PC内で動作確認できる。

. ~/ros2_ws/install/setup.bash
ros2 run hello_world talker

動作を確認したら talker は止めておく。

M5Stack 側のプログラミング

vscode でPIO HomeからNew Project を選んで新規プロジェクトを作成する。Nameに適当な名前を入力し、Boardで適切なデバイスを選択し(使ったのは M5Stack GREY ESP32)、FrameworkはArduinoとした。

Libraries で Installed を選んで ros2arduino の Examplesを探した。今回は、 publisher_wifi_udp というそれらしいものを選んで内容をコピーし、 src/main.cpp に丸ごと貼り付けた。

サンプルからの変更点としては、以下の通り。(サンプルを見ればわかるので詳細は省略)

  • 先頭に #include <M5Stack.h> を挿入した。
  • SSID, SSID_PW を適切な内容に変更した。
  • AGENT_IP をPCのIPアドレスにした。
  • 27行目付近にある “arduino_chatter” を “chatter” に変更した。
  • setup に、適宜 M5.begin やら M5.print などを入れ、動作しているかわかるようにした。

あとは普通にビルドして、M5Stack に転送。転送すると自動的に起動するが、とりあえず放置。

動作確認

PC側では、ROS2のノード(今回は chatter の listener)と、Micro-XRCE-DDSのエージェントが必要となる。ノードの起動は上で行ったので、Micro-XRCE-DDSを起動させる。

MicroXRCEAgent udp -p 2018

ポート番号は ros2arduino のサンプルに記述されているものを指定した。

次に M5Stack をリセットして起動しなおす。アクセスポイントに接続できれば、Micro-XRCE-DDSのエージェントに接続にいく。(なので先にエージェントを起動しておく必要がある)エージェントのログに、session established と表示されれば無事に接続が済んでいる。

ばっちスクショだが、上のようになればOK。左側にMicroXRCEAgentのログ、右側にM5Stackからのメッセージが表示されている。

環境構築に少し手間取ったが、ROS2でPCとM5Stackが簡単につながるようになったのは嬉しい。これで何を作ろうかな。