micro-ROSで配列データを扱うには, MultiArray系のメッセージを利用します.
しかし, このMultiArray系のメッセージはセットアップが少し面倒で, かつmallocによる動的メモリ確保を行う必要があります.
以上の2点が理由で「ロボコンにおいてはカスタムメッセージ作った方が楽では?」という考えに至りました.
マイコン向けにカスタムメッセージをビルドする方法を調べたところ, 公式サイトにそれらしいものを見つけました.
ところが, Dockerでmicro-ROSの環境を構築していたこともあってかこのページの通りに実行しても上手くいかず...
諦めきれずにさらに調査を進めたところ, 以下のページの方法にてビルドすることができました.
大筋はこのページの通りに実行すれば上手くいくのですが, いくつか違うポイントもあったので本記事で紹介します.
環境
Dockerでmicro-ROSの環境構築をしていることを前提とします.
PlatformIOで開発を行っている想定で話を進めますが, ArduinoIDEとかでも可能です.
私が動作を確認した環境は以下の通りです.
項目 | バージョン |
---|---|
OS | Ubuntu22.04 |
ROS2 | humble |
マイコン | STM32F746ZG |
カスタムメッセージをビルドする
始めに micro_ros_arduino
ライブラリの中にある extra_packages
ディレクトリまで移動します.
私の環境では以下の場所でした(参考ページと若干違います). <>の部分は適宜読み替えてください.
/home/<USER_NAME>/Documents/PlatformIO/Projects/<PROJECT_NAME>/.pio/libdeps/<ENV_NAME>/micro_ros_arduino/extras/library_generation/extra_packages
次に extra_packages
ディレクトリ内にカスタムメッセージのファイルを作成します.
手順はmicro-ROS公式サイトの通りです(msgファイル記述・CMakeLists.txtとpackage.xml書き換えまで).
今回はサイト通りに my_custom_message/msg/myCustomMessage
というファイルを作成した想定で話を進めます.
続いて micro_ros_arduino
ライブラリのルートディレクトリに移動します.
私の環境では以下の場所です.
/home/<USER_NAME>/Documents/PlatformIO/Projects/<PROJECT_NAME>/.pio/libdeps/<ENV_NAME>/micro_ros_arduino
いよいよビルドを行います.
今回はターゲットとなるマイコンのMCUがCortex-M7なので, cortex_m4
オプションを付けています.
本来はCortex-M4用のオプションですが互換性があるので気にしないことにします.
docker pull microros/micro_ros_static_library_builder:humble
docker run -it --rm -v $(pwd):/project --env MICROROS_LIBRARY_FOLDER=extras microros/micro_ros_static_library_builder:humble -p cortex_m4
使えるオプションの代表例は以下の通りです.
extra_packages
ディレクトリと同じ階層にある library_generation.sh
に書かれています.
オプションを指定しないとすべてのターゲットに対してビルドを行うのか, かなり時間がかかりますのでご注意ください.
ターゲット | オプション |
---|---|
OpenCR | opencr1 |
STM32F4 | cortex_m4 |
Teensy 4.0(4.1?) | teensy4 |
ESP32 | esp32 |
これでビルドは完了です.
上手くいっていれば以下の場所に作成したメッセージがビルドされたものが格納されています.
逆に失敗していると空のディレクトリになっているかと思います.
/home/<USER_NAME>/Documents/PlatformIO/Projects/<PROJECT_NAME>/.pio/libdeps/<ENV_NAME>/micro_ros_arduino/src/my_custom_message
実際のプログラムでは次のようにしてカスタムメッセージを利用します.
#include <my_custom_message/msg/my_custom_message.h>
my_custom_message__msg__MyCustomMessage msg;
msg.bool_test = True;
msg.uint16_test = 223;
まとめ
micro-ROSカスタムメッセージをビルドして使えるようにする手順を, 参考ページを基に紹介しました.
たまにメッセージの内容によっては通信ができない現象が発生することがあったので, それについて調査を進めていきたいと考えています.
何かお気づきの点がありましたらコメントいただけますと幸いです.