名称 | MIRS2403 micro-ROSを用いたマイコンとの通信 |
---|---|
番号 | MIRS2403-REPT-0003 |
版数 | 最終更新日 | 作成 | 承認 | 改訂記事 |
---|---|---|---|---|
A01 | 2025.2.13 | 中村 介 | 第1版 |
2024年のMIRSでは共通システムとしてmicro-ROSを用いたマイコンとの通信システムを作成した。その詳細について記述する。
マイコンをあたかも一つのROS2ノードとして扱わせるrclc-client libraryをベースにしてさまざまなミドルウェアを統合したライブラリである。
単体では動作しないため、マイコンを接続しているコンピューター側にもmicro-ROS Agentを導入する必要がある。
micro-ROSの開発環境には大きく以下の二つがある。
授業でも利用する(2025/02/13現在)おなじみの開発環境。
主にVScode上で動かす開発環境。さまざまなIDEが統合されており、Arduinoからesp系列、stm32系統など幅広いマイコンの開発に対応している。ライブラリの管理をプロジェクトごとに行えるため非常に便利。
MIRSへの導入を考えた際
開発環境としては独自言語、独自ファイルを使用せずに済むのでPatform IOのほうが優秀である。また、micro-ROSの関しての資料もPlatform IOのほうが多い。よって今後生徒のレベルが上がったり授業でArduino IDEを扱わなくなったりするなら移行を推奨する。
micro-ROSはROS2の通信に参加させるために最低限のスペックが必要となっている。従来使用していたArduino UNOは使用できない。候補として上がったマイコンを以下に示す。各マイコン独自の開発環境は基本的にmicro-ROSに対応していないので採用していない。値段は先生方に提案を行った2024年11月のもの。
名称 | 開発環境 | 価格[円] |
---|---|---|
Renesas EK RA6M5, e2studio | PlatformIO | 11994 |
esp32 | PlatformIO, Arduino IDE | 1600 |
Arduino Portenta H7 | PlatformIO, Arduino IDE | 19380 |
Arduino Due | PlatformIO, Arduino IDE | 6920 |
Arduino Zero | PlatformIO, Arduino IDE | 4780 |
Raspberry Pi Pico RP2040 | PlatformIO | 700 |
ROBOTIS OpenCR1.0 | PlatformIO | 30000 |
Teensy 3.2 | PlatformIO, Arduino IDE | 3360 |
Teensy 4.0 | PlatformIO, Arduino IDE | 6045 |
NUCLEO-F446ZE | PlatformIO | 3246 |
Arduino R4も使用できるようだが、公式ページの対応ボードに記載されていないためここには載せていない。
値段の安さ、Arduino IDEで使用できることからESP32を採択した。
micro-ROSの導入についてはインターネット上に様々な資料があるため詳細な手順については記載しない。ここでは
以下はmirs24のメインファイルである。
ここでは必要なライブラリのインポートをしている。
上記のこれらがmicro-ROSの中心的な機能のライブラリとなっている。
これらは使用するメッセージの型に関するライブラリ。必要に応じて追加していく。mirs_msgsから始まるものはmirs用に自作した型なので公式が配布しているmicro_ros_arduinoには存在しない。このプログラムをそのまま使用したい場合はmicro_ros_arduino_mirs240xが必要となる。
ここでは必要な諸々の宣言をしている。
通信に使用する型とpublisher,sbscriber,serviceの宣言が必要となる。メッセージの型の記述はインポートしたライブラリの名前とほとんど同じで、ファイルの区切りを"/"のかわりに"__"を使用している。
serviceはリクエストとレスポンスの二つ分メッセージ型の宣言が必要。
executor,support,allocator,nodeに関してはROSの内部構造をなんとなく知っていると理解しやすい。それぞれ一つずつ宣言しておけばよい。
timerはそのままの意味。周期動作に用いられる。複数宣言ができるかは未確認。
初期セットアップは別ファイルで行っている。詳細は後述。
100ms周期でexecutorをspinさせている。
executor(執行者)は具体的に実行されるプログラムを指していると思えばよい。spinはROSにおけるloopの表現。
次に初期セットアップを行っているファイルを示す。
micro-ROSで必要な処理。呪文と思ってそのまま記述。
ドメインIDの設定。87~106行に処理が書かれている。
ドメインIDは同一ネットワーク内で通信内容が混戦しないようにするため各プロジェクトにつける判別番号。MIRSでは全班が同一のネットワークに接続するため設定していないと他班の情報が流れ込んできて暴走する。校内だと研究室の情報を拾うこともある。初期段階で何番を使用するか話し合ってお区必要がある。
foxyまでとhumbleから(ROS2のバージョン)で設定方法が異なる模様。コメントでも記述しているがおそらくライブラリのコンパイルをどちらのバージョンが入っているPCで行ったかに依存している?
ライブラリのコンパイルについては後述
subscriber,publisher,serviceの具体的な設定/宣言をしている
publisherの宣言方法
rclc_publisher_init_default(
宣言したpublisherのポインタ,
ノードのポインタ(共通),
ROSIDL_GET_MSG_TYPE_SUPPORT(中身はメッセージの型。ファイルはカンマで区切る),
"トピック名"
);
subscriberの宣言方法
rclc_subscription_init_default(
宣言したsubscriberのポインタ,
ノードのポインタ(共通),
ROSIDL_GET_MSG_TYPE_SUPPORT(中身はメッセージの型。ファイルはカンマで区切る),
"トピック名"
);
serviceの宣言方法
rclc_service_init_default(
宣言したserviceのポインタ,
ノードのポインタ(共通),
ROSIDL_GET_SRV_TYPE_SUPPORT(中身はサービスの型。ファイルはカンマで区切る),
"サービス名"
);
タイマーの設定。
executorの初期化。数字の部分だけ変更する必要がある。
コメントにも書いてあるように数字はイベントの発生点の数。割り込み処理がいくつあるかを示すイメージ。
このプログラムの場合、timerによる定期実行が1、subscriberが2、serviceが2で合計5となっている。publisherはtimerによる定期実行によって処理されるためここにカウントはされない。
ここで最も注意すべきなのはpublisher,subscriber,service等には存在できる上限があることである。
micro_ros_arduinoの初期設定の場合の数を以下に示す
種類 | 上限 |
---|---|
node | 1 |
publisher | 10 |
subscription | 5 |
service | 1 |
client | 1 |
この上限を超えると動作しなくなるので注意。
この設定ファイルについては/extras/library_generation/colcon.metaに記述されている。設定を変更した後はコンパイルが多分必要。
今年はactionを実装していないが、actionは2つのserviceと1つのtopicで構成されているため、実装する場合は上限数の設定に余裕をもたせておく必要がある。
executorに処理を追加していっているイメージ。変更の必要がある項目を以下に示す。日本語で書かれていないところは基本的には設定不要。
rclc_executor_add_subscription(&executor, subscriberのポインタ, メッセージ型のポインタ, メッセージを受け取った時に実行するコールバックのポインタ, ON_NEW_DATA);
rclc_executor_add_service(&executor, serviceのポインタ, リクエストのメッセージ型のポインタ, レスポンスのメッセージ型のポインタ, リクエストを受け取った際のコールバック関数);
clientは今回実装しなかったので記述していない
メッセージ型を追加したり、上限数を変更した場合はライブラリを再コンパイルする必要がある。
やり方についてはmicro_ros_arduinoのGitHubに詳細が書かれているため、そこを参照して行えばよい。
コンパイルを行う際にarm系のCPUでは動作しないという報告もある。よってラズパイやjetsonではなく各自のPCでのコンパイルを推奨する。
ROS2へのメッセージ型の追加方法についてはROS2 turorialを参照。
ここではライブラリへの追加方法を解説する。メッセージ型のビルドは終了しているものとして扱う。
ビルドしたファイルを/extras/library_generation/extra_packages/に追加する。
/extras/library_generation/extra_packages/extra_packages.reposに
mirs_msgs:
type: local
path: mirs_msgs
のように追記する。この場合はmirs_msgsというファイルに入ったmirs_msgsというメッセージ型を追加している
ビルドしたファイルをGitHubにアップロードしておく
/extras/library_generation/extra_packages/extra_packages.reposに
mirs_msgs:
type: git
url: https://github.com/mirs240x/mirs_msgs.git
version: main
のように追記する。