前回の続きで、次はROS2上で動かすべく、M5Atomとmicro-ROSで超音波センサー情報を配信するプログラム m5_ros2_multi_ultrasonic を作ってみました。
M5Stackとmicro-ROSの組み合わせは2~3年前は面倒な印象だったけど、いつの間にか以前より簡単になってました。
前回の内容:
www.sato-susumu.com
全体構成とプログラム
今回のプログラムは少しだけ長いので、GitHubに置いてます。
動作確認環境
■PlatformIOを使ったビルド環境、micro-ROSエージェント実行環境
PC: TRIGKEY: Green G5
OS: Ubuntu 22.04.3
ROS2 : Humble (事前にROS2 Humbleをインストール済み)
Software:PlatformIO, VSCode, docker
■micro-ROSクライアント実行環境と周辺ユニット
M5Atom Lite
M5Stack用Port A I2C拡張ハブユニット(PaHUB2 Unit)
M5Stack用超音波測距ユニット I2C 3つ
■micro-ROSクライアントとmicro-ROSエージェントの接続方法
USBケーブルを使ったシリアル通信
M5Atomでmicro-ROSを使うまでの流れ
①PlatformIOやVSCodeのセットアップをする。
②PlatformIO上で、micro-ROSライブラリなどを使って「micro-ROSクライアント」のソースコードを作成する。
③micro-ROSクライアントのソースコードをPlatformIOでビルドして、M5Atomに書き込む。
④micro-ROSエージェントを起動する。
⑤M5Atomを一度リセットすることで、micro-ROSクライアントを再起動する
⑥完成!
①~③の流れ自体は、普通のM5Stack用プログラムと大差ない。
④もdocker版があるので、特に何もセットアップしなくて簡単に起動できる。
(もちろん自分でエージェントをビルドして起動してもいい。)
②PlatformIO上で、micro-ROSライブラリなどを使って「micro-ROSクライアント」のソースコードを作成する。
依存ライブラリに「micro-ROS for PlatformIO」を追加する。
ライブラリを使って、いくつかのライブラリ関数を呼び出す必要がある。
詳しくは micro-ROS for PlatformIO 参照。
④micro-ROSエージェントを起動する
シリアル通信のデバイスファイルを確認
$ ls -l /dev/ttyACM* /dev/ttyUSB* ls: '/dev/ttyACM*' にアクセスできません: そのようなファイルやディレクトリはありません crw-rw---- 1 root dialout 188, 0 2月 23 20:38 /dev/ttyUSB0
M5Atomが /dev/ttyUSB0 で接続している場合、下記コマンドでmicro-ROSエージェント起動できる。
docker run -it --rm -v /dev:/dev -v /dev/shm:/dev/shm --privileged --net=host microros/micro-ros-agent:$ROS_DISTRO serial --dev /dev/ttyUSB0 -v6
⑤M5Atomを一度リセットすることで、micro-ROSクライアントを再起動する
エージェント → クライアントの順で起動する必要がある。
エージェントを起動したら、M5Atomを一度リセットしてmicro-ROSクライアントを再起動する。
そうすることで確実にエージェント → クライアントの順になるようにする。(起動の順番を守れるなら、他の方法でもいいかも。)
⑥完成
ちゃんと起動できたら、ソースコードで作成したTopicがTopic一覧に表示される。
$ ros2 topic list 省略 /ultrasonic0 /ultrasonic1 /ultrasonic2
Topicの内容確認
$ ros2 topic echo /ultrasonic0 header: stamp: sec: 0 nanosec: 0 frame_id: /ultrasonic0 radiation_type: 0 field_of_view: 0.5235999822616577 min_range: 0.019999999552965164 max_range: 4.5 range: 0.036396000534296036
Topicの送信頻度確認
$ ros2 topic hz /ultrasonic0 average rate: 2.381 min: 0.420s max: 0.420s std dev: 0.00011s window: 4 average rate: 2.381 min: 0.420s max: 0.420s std dev: 0.00020s window: 7
ハマったポイント
・Windows上ではmicro-ROSを使ったビルドができなかった。おそらく、WindowsにはROS2を入れてなかったのも原因。
・m5unifiedのおかげで機種間の差異は大きく減ったものの、まだまだ機種別の作法でつまづく。。。(micro-ROSとは関係ない)
・サンプルよりも複雑なことをしようとすると資料が少ない
・ROS/ROS2のプログラミングに詳しくないのにmicro-ROSに挑むのは少し無謀だった
リンク
m5_ros2_multi_ultrasonic
今回作ったプログラム
micro-ROS for PlatformIO
micro-ROS for Arduinoのサンプル
micro-ROS for PlatformIOにはサンプルが少ないので、こちらが参考になる。micro-ROS for PlatformIOで使うには微妙に修正が必要。
M5ATOM Liteのドキュメント
PaHUB2のドキュメント
M5Stack用超音波測距ユニットのドキュメント