M5Stack社製ESP32系モジュールでのmicro-ROSサンプルの確認


記事概要

micro-ROSがROS2 Foxy対応と時期を同じくしてESP32 MCUをサポートしたので,M5Stack社製ESP32系モジュール(M5StickC, M5Atom Lite, M5Atom Matrix)でpublisherサンプルを動作させるまでの手順を記す.先に挙げた3つのデバイスはいずれも,本手順で生成された同じファームウェアを同じように書き込むことができ,同じように動作した.
なお本記事の内容は基本的にはmicro-ROS公式サイト上の情報の拾い集めであり,筆者が新しく付け加えた情報は特にない.

環境

ベースOS ROS2 Micro-XRCE-DDS-Agent CPU, RAM
環境1 Ubuntu 20.04(amd64) Foxy v1.3.0 Core i5-7200U, 4GB x 2

手順

本手順においてはマイコン側ファームウェアのビルドまでをカバーし,動作確認の項で使用しているPC側のMicro-XRCE-DDS-Agentのビルドについては済んでいるものとする.大まかなステップとしては以下の通り.

Step1. ワークスペースの作成からファームウェアのコンフィギュレーション
Step2. WiFi接続の設定
Step3. ファームウェアのビルドと書き込み
Step4. 動作確認

ワークスペースの作成からファームウェアのコンフィギュレーション

# ROS2の環境変数を読み込む.
$ source ros2_foxy/install/setup.bash
# 筆者なりのワークスペースディレクトリ命名規則
$ mkdir -p uros_ws/freertos__esp32__int32_publisher
$ cd uros_ws/freertos__esp32__int32_publisher
$ git clone -b $ROS_DISTRO https://github.com/micro-ROS/micro_ros_setup.git src/micro_ros_setup
$ rosdep update && rosdep install --from-path src --ignore-src -y
$ colcon build
$ source install/local_setup.bash
# 次のコマンドを実行すると大容量のファイル群(ESP32用ツールチェーンやESP-IDF)がダウンロードされるので,太い回線下での実行を強く推奨
$ ros2 run micro_ros_setup create_firmware_ws.sh freertos esp32
# [your local machine IP]の部分はDDS-Agentを起動するPCのIPアドレス.
# ポート番号は8888以外でも動くと思われるが,とりあえずデフォルトの8888を使用する.
# 具体的には -t udp -i 192.168.11.2 -p 8888 のように指定する.
$ ros2 run micro_ros_setup configure_firmware.sh int32_publisher -t udp -i [your local machine IP] -p 8888

WiFi接続の設定

下記コマンドを実行してmenuconfigに入る.ここではWiFiルータに接続するためのSSIDとパスワードを設定する.設定ファイルにはSSIDとパスワードが平文で保存されるので取り扱い注意.

$ ros2 run micro_ros_setup build_firmware.sh menuconfig
  1. micro-ROS Transport Settings に入る.

  2. WiFi Configuration に入る.

  3. WiFi SSID とWiFi Password を設定後,保存してメニューを抜ける.

ファームウェアのビルドと書き込み

# 次のコマンドを実行して [100%] Built target app のメッセージが出たらビルド成功と思われる
$ ros2 run micro_ros_setup build_firmware.sh
# USBケーブル(M5StickCやM5Atomならデバイス側はType-C)で接続して,次のコマンドでファームウェアを書き込む
$ ros2 run micro_ros_setup flash_firmware.sh

動作確認

Micro-XRCE-DDS-Agentを起動する.

# MicroXRCEAgentのバイナリがあるディレクトリで実行する
$ ./MicroXRCEAgent udp4 --port 8888

マイコンをリセットして少し待つとWiFiルータからIPが配布され,セッションが確立される.

別のターミナルを立ち上げ,topic名を確認してsubscribeする.

$ source ros2_foxy/install/setup.bash
$ ros2 topic list
$ ros2 topic echo /freertos_int32_publisher

所感

publisherサンプルのソースコードを覗いてみると,FreeRTOSのタスクとして実装されているようである.より実践的なアプリケーションとしてI/Oを扱うには,ESP-IDFのAPIを叩くことになりそう(gpio_get_level関数やgpio_set_level関数など).

参考資料

1.micro-ROS公式サイト
2.ESP32 Overview
3.Micro-XRCE-DDS-Agent
4.ESP-IDF Programming Guide
5.@MAEHARA_Keisukeのポータル記事