[ROS2 foxy] ESP32を使ってmicro-ROS for Arduinoで遊ぼう

ROS2とマイコン間を通信したい欲求が出てきて、ESP32にmicro-ROSを導入して遊びました．
その記録を残します．

# 構築環境
- Ubuntu 20.04
- ros2 foxy
- ESPDuino (esp32-wroom-32)
  (ESP32 Dev Module)

すでにros2 foxyを導入していることを前提とします．

# micro-ROSの構成
大雑把にいうと、

```mermaid
flowchart TD;
  ROS2 <--> DDS;
  DDS <--> micro-ROS-Agent;
  micro-ROS-Agent <-- "micro-ROS for Arduino" --> ESP32;
```
という関係になります．

micro-ROS-Agentは、ros2で利用されるDDSとESP32のメッセージの橋渡しを行う中継役を担います．

# インストール

## 1.Arduino IDEにesp32ボードを導入

まず、ESP32ボードのArduino開発環境を手に入れます．

IDEツールバーの「ファイル」->「環境設定」から、追加のボードマネージャのURLに、以下のURLを追加する．
```url
https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
```

「ツール」->「ボード」->「ボードマネージャー」から、"esp32"を検索して、v2.0.4を選択しインストールします．

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1876613/58594955-be83-54fc-f9c1-e5ff8c73e6ed.png)

## 2. Arduino IDEにmicro-ROS for Arduinoを導入

https://github.com/micro-ROS/micro_ros_arduino

先に、以下のURLからmicro-ROS for Arduinoのfoxy版v2.0.5をダウンロードしておきます．

[https://github.com/micro-ROS/micro_ros_arduino/archive/refs/tags/v2.0.5-foxy.zip](https://github.com/micro-ROS/micro_ros_arduino/archive/refs/tags/v2.0.5-foxy.zip)

IDEツールバーの「スケッチ」->「ファイルのインクルード」->「.Zip形式のライブラリをインストール」から、先程ダウンロードしたmicro_ros_arduinoをインストールします．

## 3. micro-ROS-Agentを導入

https://github.com/micro-ROS/micro_ros_setup

公式でセットアップツールが用意されているので、そちらを使います．
（使わない場合も試したけど、色々と依存パッケージを解消しないといけないみたい）

```sh:setupツールのインストール
cd {ros2のwork spaceのパス}

source /opt/ros/$ROS_DISTRO/setup.bash

git clone -b $ROS_DISTRO https://github.com/micro-ROS/micro_ros_setup.git src/micro_ros_setup

rosdep update && rosdep install --from-paths src --ignore-src -y

colcon build

source install/local_setup.bash
```

セットアップツールを使って、次は、micro_ros_Agentをビルドします．

```sh:Agentのインストール
ros2 run micro_ros_setup create_agent_ws.sh
ros2 run micro_ros_setup build_agent.sh
source install/local_setup.sh
```

## 4. Arduino IDEでmicro-ROSサンプルをESP32に書き込む

### A. WiFI経由でmicro-ROS-Agentに接続
Arduino IDEで、「ファイル」->「スケッチ例」->「micro_ros_arduino」->「micro-ros_publisher_wifi」を選択します．

44行目のset_microros_wifi_transportsにWIFI情報を書き込みます．

IPは、micro-ROS-Agentを導入したPCのIP．
PORTは、デフォルトで8888ですが、Agent起動時にポートは変えることができます．

```c++
set_microros_wifi_transports("WIFI SSID", "WIFI PASS", "IP", "PORT");
```

「ツール」->「ボード」から、「ESP32 Arduino」->「ESP32 Dev Module」に変更し、コンパイルして書き込みましょう．

### B. USB経由でmicro-ROS-Agentに接続
Arduino IDEで、「ファイル」->「スケッチ例」->「micro_ros_arduino」->「micro-ros_publisher」を選択します．

「ツール」->「ボード」から、「ESP32 Arduino」->「ESP32 Dev Module」に変更し、コンパイルして書き込みましょう．

## 5. micro-ROS-Agentを起動する

ここまで行ければ、あとは、micro-ROS-Agentを起動するだけで、ros2に接続できます．

### A. WiFI経由でmicro-ROS-Agentに接続
```sh
ros2 run micro_ros_agent micro_ros_agent udp4 --port [PORT] -v6
```
### B. USB経由でmicro-ROS-Agentに接続
```sh
ros2 run micro_ros_agent micro_ros_agent serial --dev [ESP32のデバイス /dev/tty〇〇] -v6
```
## 6. トピック確認
最後にESP32から送られたトピックを確認しましょう．

- **/topic_name** : micro-ros_publisher_wifi
- **/micro_ros_arduino_node_publisher** : micro-ros_publisher

で配信されています．

```sh
ros2 topic list
---
/topic_name
/parameter_events
/rosout
```

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1876613/06f25117-bda1-1c72-dabb-23abcd40c453.png)

# トラブル対応マニュアル

※トラブルが起きたら、追加していきます．

- Arduino IDEでコンパイルできないんだが？
    - ESP32のversionが違うかも．v2.0.4になってるか確認しよう
    - ついでに、micro-ROS for Arduinoのバージョンもv2.0.5であることも確認しよう
    - 再起動も忘れずに．

- micro_ros_setupがコンパイルできないんだが？
    - 別のワークスペースを作ってもう一度やってみよう．何か別のパッケージが干渉しているかも？

- 全く通信されないんだが？
    - ROS_DOMAIN_IDを見直そう！ おそらく、ROS_DOMAIN_IDを変えているに違いない！
    - WIFI設定を見直そう！