名称 MIRS2403 micro-ROSを用いたマイコンとの通信
番号 MIRS2403-REPT-0003

版数 最終更新日 作成 承認 改訂記事
A01 2025.2.13 中村 介 第1版

1. 概要

2024年のMIRSでは共通システムとしてmicro-ROSを用いたマイコンとの通信システムを作成した。その詳細について記述する。

2. 予備知識

マイコンをあたかも一つのROS2ノードとして扱わせるrclc-client libraryをベースにしてさまざまなミドルウェアを統合したライブラリである。

単体では動作しないため、マイコンを接続しているコンピューター側にもmicro-ROS Agentを導入する必要がある。

3. MIRSへのmicro-ROS導入

3.1. 開発環境

micro-ROSの開発環境には大きく以下の二つがある。

Arduino IDE

授業でも利用する(2025/02/13現在)おなじみの開発環境。

Platform IO

主にVScode上で動かす開発環境。さまざまなIDEが統合されており、Arduinoからesp系列、stm32系統など幅広いマイコンの開発に対応している。ライブラリの管理をプロジェクトごとに行えるため非常に便利。

MIRSへの導入を考えた際

という理由からArduino IDEを採用した。

開発環境としては独自言語、独自ファイルを使用せずに済むのでPatform IOのほうが優秀である。また、micro-ROSの関しての資料もPlatform IOのほうが多い。よって今後生徒のレベルが上がったり授業でArduino IDEを扱わなくなったりするなら移行を推奨する。

3.2. 使用するマイコン

micro-ROSはROS2の通信に参加させるために最低限のスペックが必要となっている。従来使用していたArduino UNOは使用できない。候補として上がったマイコンを以下に示す。各マイコン独自の開発環境は基本的にmicro-ROSに対応していないので採用していない。値段は先生方に提案を行った2024年11月のもの。

table1. 候補マイコン

名称 開発環境 価格[円]
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を採択した。

4. micro-ROS-Arduinoの解説

micro-ROSの導入についてはインターネット上に様々な資料があるため詳細な手順については記載しない。ここでは

が終了していることを前提としている。

4.1. コード解説

以下はmirs24のメインファイルである。

1~15行

ここでは必要なライブラリのインポートをしている。

上記のこれらがmicro-ROSの中心的な機能のライブラリとなっている。

これらは使用するメッセージの型に関するライブラリ。必要に応じて追加していく。mirs_msgsから始まるものはmirs用に自作した型なので公式が配布しているmicro_ros_arduinoには存在しない。このプログラムをそのまま使用したい場合はmicro_ros_arduino_mirs240xが必要となる。

17~44行

ここでは必要な諸々の宣言をしている。

通信に使用する型とpublisher,sbscriber,serviceの宣言が必要となる。メッセージの型の記述はインポートしたライブラリの名前とほとんど同じで、ファイルの区切りを"/"のかわりに"__"を使用している。

serviceはリクエストとレスポンスの二つ分メッセージ型の宣言が必要。

executor,support,allocator,nodeに関してはROSの内部構造をなんとなく知っていると理解しやすい。それぞれ一つずつ宣言しておけばよい。

timerはそのままの意味。周期動作に用いられる。複数宣言ができるかは未確認。

79行

初期セットアップは別ファイルで行っている。詳細は後述。

84~87行

100ms周期でexecutorをspinさせている。

executor(執行者)は具体的に実行されるプログラムを指していると思えばよい。spinはROSにおけるloopの表現。

次に初期セットアップを行っているファイルを示す。

2~6行

micro-ROSで必要な処理。呪文と思ってそのまま記述。

8~10行

ドメインIDの設定。87~106行に処理が書かれている。

ドメインIDは同一ネットワーク内で通信内容が混戦しないようにするため各プロジェクトにつける判別番号。MIRSでは全班が同一のネットワークに接続するため設定していないと他班の情報が流れ込んできて暴走する。校内だと研究室の情報を拾うこともある。初期段階で何番を使用するか話し合ってお区必要がある。

foxyまでとhumbleから(ROS2のバージョン)で設定方法が異なる模様。コメントでも記述しているがおそらくライブラリのコンパイルをどちらのバージョンが入っているPCで行ったかに依存している?

ライブラリのコンパイルについては後述

12~60行

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(中身はサービスの型。ファイルはカンマで区切る),
            "サービス名"
          );
        

62~69行

タイマーの設定。

73行

executorの初期化。数字の部分だけ変更する必要がある。
コメントにも書いてあるように数字はイベントの発生点の数。割り込み処理がいくつあるかを示すイメージ。

このプログラムの場合、timerによる定期実行が1、subscriberが2、serviceが2で合計5となっている。publisherはtimerによる定期実行によって処理されるためここにカウントはされない。

ここで最も注意すべきなのはpublisher,subscriber,service等には存在できる上限があることである。
micro_ros_arduinoの初期設定の場合の数を以下に示す

table2. 初期設定の上限

種類 上限
node 1
publisher 10
subscription 5
service 1
client 1

この上限を超えると動作しなくなるので注意。

この設定ファイルについては/extras/library_generation/colcon.metaに記述されている。設定を変更した後はコンパイルが多分必要。

今年はactionを実装していないが、actionは2つのserviceと1つのtopicで構成されているため、実装する場合は上限数の設定に余裕をもたせておく必要がある。

74~78行

executorに処理を追加していっているイメージ。変更の必要がある項目を以下に示す。日本語で書かれていないところは基本的には設定不要。

          
            rclc_executor_add_subscription(&executor, subscriberのポインタ, メッセージ型のポインタ, メッセージを受け取った時に実行するコールバックのポインタ, ON_NEW_DATA);
            rclc_executor_add_service(&executor, serviceのポインタ, リクエストのメッセージ型のポインタ, レスポンスのメッセージ型のポインタ, リクエストを受け取った際のコールバック関数);
          
        

clientは今回実装しなかったので記述していない

4.2. ライブラリのコンパイル

メッセージ型を追加したり、上限数を変更した場合はライブラリを再コンパイルする必要がある。

やり方についてはmicro_ros_arduinoのGitHubに詳細が書かれているため、そこを参照して行えばよい。

コンパイルを行う際にarm系のCPUでは動作しないという報告もある。よってラズパイやjetsonではなく各自のPCでのコンパイルを推奨する。

メッセージ型の追加方法

ROS2へのメッセージ型の追加方法についてはROS2 turorialを参照。

ここではライブラリへの追加方法を解説する。メッセージ型のビルドは終了しているものとして扱う。

方法1. ローカルファイルへ追加

ビルドしたファイルを/extras/library_generation/extra_packages/に追加する。

/extras/library_generation/extra_packages/extra_packages.reposに

            
              mirs_msgs:
              type: local
              path: mirs_msgs
            
          

のように追記する。この場合はmirs_msgsというファイルに入ったmirs_msgsというメッセージ型を追加している

方法2. Gitからインポート

ビルドしたファイルをGitHubにアップロードしておく

/extras/library_generation/extra_packages/extra_packages.reposに

            
              mirs_msgs:
              type: git
              url: https://github.com/mirs240x/mirs_msgs.git
              version: main
            
          

のように追記する。




MIRS2031ドキュメント管理台帳