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

# 記事概要
[micro-ROS][1]がROS2 Foxy対応と時期を同じくして[ESP32 MCU][2]をサポートしたので，M5Stack社製ESP32系モジュール（M5StickC, M5Atom Lite, M5Atom Matrix）でpublisherサンプルを動作させるまでの手順を記す．先に挙げた3つのデバイスはいずれも，本手順で生成された同じファームウェアを同じように書き込むことができ，同じように動作した．
なお本記事の内容は基本的にはmicro-ROS公式サイト上の情報の拾い集めであり，筆者が新しく付け加えた情報は特にない．
![micro-ROS_on_M5Atom.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574178/00234250-782d-388d-d629-c4dab9dce8b3.gif)

# 環境

||ベース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][3]のビルドについては済んでいるものとする．大まかなステップとしては以下の通り．

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

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

```shell
# 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とパスワードが平文で保存されるので取り扱い注意．

```shell
$ ros2 run micro_ros_setup build_firmware.sh menuconfig
```

1. micro-ROS Transport Settings に入る．
![0-entry_menuconfig.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574178/0f86878e-330d-ebdb-749b-0a63d9a99790.png)

2. WiFi Configuration に入る．
![1-micro-ROS_Transport_Settings.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574178/6a723167-b53f-7d82-2db7-7c07fff58fd5.png)

3. WiFi SSID とWiFi Password を設定後，保存してメニューを抜ける．
![2-WiFi_Configuration.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574178/9b6e8061-586e-d026-26bc-caefd13dea86.png)

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

```shell
# 次のコマンドを実行して [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を起動する．

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

![dds-agent_waiting.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574178/b7375762-6553-9b2c-3046-afbca982ff93.png)

マイコンをリセットして少し待つとWiFiルータからIPが配布され，セッションが確立される．
![dds-agent_session-established.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574178/4850c801-295e-6aca-eb3b-c00483f4f561.png)

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

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

![micro-ROS_on_M5Atom.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574178/00234250-782d-388d-d629-c4dab9dce8b3.gif)

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

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

[1]:https://micro-ros.github.io/
[2]:https://www.espressif.com/en/products/socs/esp32
[3]:https://github.com/eProsima/Micro-XRCE-DDS-Agent
[4]:https://docs.espressif.com/projects/esp-idf/en/latest/esp32/
[5]:https://qiita.com/MAEHARA_Keisuke/items/31faa68cf5c51831acc6