M5ATOM Liteから超音波センサーを3つ動かしてみた(ROS2編)

スポンサーリンク

前回の続きで、次は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用超音波測距ユニットのドキュメント