Micro-XRCE-DDSが試せる環境 2020年末版

# はじめに

ROS2からリソースが限定された組み込みデバイス(resource-constrained microcontroller、以降 microcontrollerと表記します)がサポートの対象に含まれるようになりました。microcontrollerが直接ROSをお話しできるのは夢が広がります。

※ ROS1にもシリアル接続専用ですがrosserial( http://wiki.ros.org/rosserial )がありますね

microcontrollerの性能アップや、オープンなRTOS(Real-time operating system)の充実といったことが、この進化の後押しをしているかと思います。

とはいえ、そのままのDDSを扱うのはmicrocontrollerには少し荷が重いため、The OMG DDS for eXtremely Resource Constrained Environment standard( DDS-XRCE : https://www.omg.org/spec/DDS-XRCE/ )では、microcontroller向けのプロトコルが定義されています。その実装の１つがeProsima社が公開しているMicro-XRCE-DDSです。

- Micro-XRCE-DDS : https://micro-xrce-dds.docs.eprosima.com/en/latest/

このMicro-XRCE-DDSの環境を構築するためには

- Micro-XRCE-DDSのClientが動作する組み込み環境
- Micro-XRCE-DDSのAgentおよび接続先のROS2ノードが動作する環境

の2つが必要となります。また、Micro-XRCE-DDSのバージョンと、対応するROS2のバージョンも影響してきます。

そこで今回は、いくつかの環境を用意し、サンプルを動作させてみて、2020年末時点でのMicro-XRCEが試せる環境を検証してみようと思います。

※時間がたりなく、一部まだ検証中です。確認が取れ次第、随時更新いたします。

# システム構成

システム構成のポイントは６つ（図の①〜⑥）あるかと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51272/d2f2acef-f13d-c432-0dd8-8682ad51e13f.png)


## ① Microcontroller

Micro-XRCE-DDS Clientが動作するハードウェアであり、実際にモータ等のハードウェアを制御します。

今回、手持ちのもので、動作報告があるもの（最後にリンク先をまとめておきます）を中心に８台を試します。ほとんどは[秋月電子通商](https://akizukidenshi.com/catalog/)、[千石電商](https://www.sengoku.co.jp/)、[共立電子](https://eleshop.jp/shop/default.aspx)、[マルツ](https://www.marutsu.co.jp/)、[スイッチサイエンス](https://www.switch-science.com/)等で個人購入できます。大きさの参考のために、一番下中央に、Raspberry Pi Zero Wを置きました。

![micon.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51272/60b37e13-dabe-d506-377e-7986a01b7ee2.jpeg)

1. Arduino Zero MKR ([秋月電子](https://akizukidenshi.com/catalog/g/gM-13031/))
2. Seeeduino XIAO ([秋月電子](https://akizukidenshi.com/catalog/g/gM-15178/))
3. STM32 Discovery kit IoT node ([STMicro eStore](https://estore.st.com/en/b-l475e-iot01a1-cpn.html))
4. STM32 Nucleo F767ZI ([スイッチサイエンス](https://www.switch-science.com/catalog/3363/))
5. M5Stack Core Gray([スイッチサイエンス](https://www.switch-science.com/catalog/3648/))
6. M5StickC([スイッチサイエンス](https://www.switch-science.com/catalog/3648/))
7. M5 ATOM Lite ([スイッチサイエンス](https://www.switch-science.com/catalog/6262/))
8. GR-ROSE ([秋月電子](https://akizukidenshi.com/catalog/g/gM-14318/))

手持ちがなく、今回試してないですが、以下も入手可能です。

- ROBOTIS OpenCR ([ROBOTIS SHOP](http://www.robotis-shop-jp.com/?act=shop_jp.goods_view&GS=32899))
- Olimex STM32-E407 ([ストロベリーリナックス](https://strawberry-linux.com/catalog/items?code=15075))
- Teensy 4.1 ([スイッチサイエンス](https://www.switch-science.com/catalog/6377/))

以下で、搭載されているプロセッサの種別と簡単な特徴をまとめてみました。

|#|Microcontroller|プロセッサ|特徴|
|:---|:---|:---|:---|
|1|Arduino Zero MKR|SAMD21(M0+)|Eterhnet、CAN、RS485、リレーのシールドが別売りであり。|
|2|Seeeduino XIAO|SAMD21(M0+)|小さくて安い(約500円)。リチウム電池の充電および管理機能チップを搭載し、Groveコネクタが付いた拡張基板あり。|
|3|STM32 Discovery kit IoT node|Cortex-M4|IoT Kitということで、WiFi/BluetoothやNFC、9軸センサ、ToFセンサー等が搭載されている。|
|4|STM32 Nucleo F767ZI|Cortex-M7|Cortex-M7 216MHz, Flash 2048kB, RAM 512kBというハイスペック。|
|5|M5Stack Core Gray|ESP32|WiFi/Bluetoothにディスプレイ、バッテリーが標準搭載。多数の拡張モジュールが発売されている。|
|6|M5StickC|ESP32|WiFi/Bluetoothに小型ディスプレイ、バッテリーが標準搭載で約1500円|
|7|M5 ATOM Lite|ESP32|WiFi/Bluetooth搭載で小さくて安い(約900円)|
|8|GR-ROSE|RX65N|EthernetとWiFi搭載。外部電源入力(4.5V～18V)がありモーターに電源供給可能。半二重回路対応のシリアルI/FとRS485があり、コマンド方式サーボをそのまま接続可能。|
|-|ROBOTIS OpenCR|Cortex-M7|DYNAMIXELのI/F(TTL/RS485)と外部電源入力(7-24V)あり。TurtleBot3に搭載されているもの。|
|-|Olimex STM32-E407|Cortex-M4|micro-ROSのリファレンスボード|
|-|Teensy 4.1|Cortex M7|600MHzというハイパフォーマンス。CANとイーサネットPHYを搭載。|

## ② PC / Single board Computer

Micro-XRCE-DDSのAgentとROS2が動作するハードウェアになります。

１つは、Intel版のMacBook AirにLinux(Ubuntu)をインストールしたものを使用しました。このPCにはUbuntu 20.04 LTSとROS2のFoxyをインストールしています。ROS2からは、WindowsやMacもサポート対象となっていますが、今回は試してません。

次に、64bitのArm版 Linuxが動作するSingle board Computerとして、以下のものを使用しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51272/1362dfbe-eab4-528e-1b26-c11a1a238176.png)

1. Jetson Nano ([スイッチサイエンス](https://www.switch-science.com/catalog/6239/))
2. NanoPi NEO2 ([秋月電子](https://akizukidenshi.com/catalog/g/gM-12302/))

Jetson NanoはJetpack 4.4.1-b50(Ubuntu 18.04 LTS)とROS2 dashingを、NanoPi NEO2にはArmbian 20.11 BionicにROS2 dashingをインストールしています。NanoPi NEO2は、Armbian Focalのイメージも公開されているのですが、まだ試せていません。

他にもRaspberry Pi 3/4は64bit版のUbuntu serverでROS2が動作します。64bit版のraspbianで動くかはためしたことがないのでわかりません。

## ③ Micro-XRCE-DDS Client

microcontroller側でROS2と通信するためのライブラリ群であり、今回は以下の３つを試しています。

- micro-ROS : https://micro-ros.github.io/
- ros2arduino : https://github.com/ROBOTIS-GIT/ros2arduino
- GR-ROSEのライブラリ: https://www.renesas.com/jp/ja/products/gadget-renesas/boards/gr-rose

現状、ros2arduinoとGR-ROSEはDashingまでのサポートとなっており、micro-ROSはDashingとFoxyをサポートしています。ただし、micro-ROSはDashingでのサポートデバイスは多くなく、今回はFoxyのみを使用しています。

## ④ ROS2

ここまでの説明で既にふれていますが、ROS2のバージョンは

- Dashing
- Foxy

から、使用するMicro-XRCE-DDS Clientの状況で決まってきます。

ros2arduinoとGR-ROSEの場合はDashingを、micro-ROSの場合はFoxyを選択するのがよいかと思います。

## ⑤ Micro-XRCE-DDS Agent

Agentについては、[eProsima](https://www.eprosima.com/)製のMicro XRCE-DDSの一択かと思います。

- eProsima Micro XRCE-DDS : https://github.com/eProsima/Micro-XRCE-DDS

ただし、使用するClientとバージョンを合わせる必要がありますので、必要に応じてtagを切り替えてソースを取得してビルドして使用します。

micro-ROSでは、micro-ROS-Agentというパッケージを作成できるので、それを使うこともできます。

## ⑥通信インターフェース

microcontrollers側に搭載されているか、使用するMicro-XRCE-DDS Clientでサポートされているかによって限定されますが、

- Serial
- Ethernet
- WiFi

の3種類があります。一部のClientではTCPがサポートされてない場合があるので注意ください。

以下に簡単にまとめてみました。A/B/Cは、A: ros2ardino, B: microROS, C: GR-ROSEライブラリに対応します。

|#|Microcontroller|搭載されてるI/F|A|B|C|備考|
|:---|:---|:---|:---|:---|:---|:---|
|1|Arduino Zero MKR|Serial|O|-|-|Ethernetシールドが別売りであるが対応しているかは未確認|
|2|Seeeduino XIAO|Serial|O|-|-||
|3|STM32 Discovery kit IoT node|Serial, WiFi|-|O|-||
|4|STM32 Nucleo F767ZI|Serial, Ethernet|-|O|-||
|5|M5Stack Core Gray|Serial, WiFi|O|O|-|Ethernetモジュールが別売りであるが対応しているかは未確認|
|6|M5StickC|Serial, WiFi|O|O|-||
|7|M5 ATOM Lite|Serial,WiFi|O|O|-||
|8|GR-ROSE|Serial, Ethernet, WiFi|-|-|O||

# 確認結果

では、いろいろな組み合わせで確認していきます。

情報は、12/23時点での状況です。逐次確認を行って追加、修正していきます。動いたという情報ありましたら、コメントでお知らせいただければこちらでも確認して修正いたします。

## 1. ros2arduino

まずはros2arduinoについて。

### Arduino Zero MKR

開発環境はArduino IDEを使用しました。gitからzipをダウンロードして、ライブラリーをインクルードで導入し、サンプルをビルドしました。

最初にJetson NanoでV1.3のAgentを起動して確認。

【結果】
〇 Agentへの接続
✖ `ros2 topoc list`でpublishされている`/arduino_chatter`が表示される
✖ `ros2 topic echo`でメッセージの受信

```
 Arduino Zero MKR                    Jetson Nano
+-----------------+              +----------+---------+
|ros2arduino 0.2.1|--- Serial ---|Agent V1.3| Dashing |
+-----------------+              +----------+---------+
```

次にNanoPi NEO2でV1.3のAgentを起動して確認。

【結果】
△ Agentへの接続　※initの表示はでるが、その後のcreate clientの表示がでない
✖ `ros2 topoc list`でpublishされている`/arduino_chatter`が表示される
✖ `ros2 topic echo`でメッセージの受信

```
 Arduino Zero MKR                  　 NanoPi NEO2
+-----------------+              +----------+---------+
|ros2arduino 0.2.1|--- Serial ---|Agent V1.3| Dashing |
+-----------------+              +----------+---------+
```

初っ端からつまづきました。ここで、ros2arduinoのバージョンを0.1.4に落としてみました。

【結果】
〇 Agentへの接続
〇 `ros2 topoc list`でpublishされている`/arduino_chatter`が表示される
〇 `ros2 topic echo`でメッセージの受信

```
 Arduino Zero MKR                    Jetson Nano
+-----------------+              +------------+---------+
|ros2arduino 0.1.4|--- Serial ---|Agent V1.1.6| Dashing |
+-----------------+              +------------+---------+
```

AgentがV1.1.6で動くことが確認できました。

### Seeeduino XIAO

開発環境はArduino IDEを使用しました。Arduino Zero MKRをビルドした環境で、ボードだけを切り替えてビルドしました。

最初、USB StackをArduinoにしてビルドしたところ、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51272/4770aa8e-41df-9d16-2fbc-86538a989574.png)

```
In file included from /Users/masa/Library/Arduino15/packages/Seeeduino/hardware/samd/1.7.9/cores/arduino/USB/USBAPI.h:37:0,
                 from
 ...
exit status 1
ボードSeeeduino XIAOに対するコンパイル時にエラーが発生しました。
```
というエラーがでたので、TinyUSBに切り替えてビルドしました。

【結果】
〇 Agentへの接続
〇 `ros2 topoc list`でpublishされている`/arduino_chatter`が表示される
〇 `ros2 topic echo`でメッセージの受信

```
       xiao                            Jetson Nano
+-----------------+              +------------+---------+
|ros2arduino 0.1.4|--- Serial ---|Agent V1.1.6| Dashing |
+-----------------+              +------------+---------+
```


### M5Stack

M5Stack/StickC/Atomの開発環境はArduino IDEを使用できますが、Arduino IDEのエディタ機能がチープなので、Visual Studio CodeでPlatformIOを使ってビルドしました。PlatformIOについては以下を参照ください。

- M5Stackの開発環境を整える - PlatformIO IDE編 : https://qiita.com/lutecia16v/items/1c560bdd7eac7ebeaff7

まず、M5Stackについては、まずNanoPi NEO2で確認してみました。

【結果】
〇 Agentへの接続　
〇 `ros2 topoc list`でpublishされている`/arduino_chatter`が表示される
〇 `ros2 topic echo`でメッセージの受信

```
　　　M5Stack        　　　　         NanoPi NEO2
+-----------------+            +----------+---------+
|ros2arduino 0.2.1|--- WiFi ---|Agent V1.3| Dashing |
+-----------------+            +----------+---------+
```

うまく動作しました。このままJetson Nanoで確認。

【結果】
〇 Agentへの接続
✖ `ros2 topoc list`でpublishされている`/arduino_chatter`が表示される
✖ `ros2 topic echo`でメッセージの受信

```
 　　　M5Stack　　                   Jetson Nano
+-----------------+            +----------+---------+
|ros2arduino 0.2.1|--- WiFi ---|Agent V1.3| Dashing |
+-----------------+            +----------+---------+
```

Jetson Nanoが悪いのかと思い、急遽、MacのParallels上にインストールしていたUbuntu18.04LTSにAgentを入れてみて確認したのですが、

【結果】
〇 Agentへの接続
✖ `ros2 topoc list`でpublishされている`/arduino_chatter`が表示される
✖ `ros2 topic echo`でメッセージの受信

```
 　　　M5Stack　　                    PC(Ubuntu 18.04)
+-----------------+            +----------+---------+
|ros2arduino 0.2.1|--- WiFi ---|Agent V1.3| Dashing |
+-----------------+            +----------+---------+
```

最新版だと何かがおこっているようです。そこで、Agentのバージョンを1.1.6にして、ros2arduinoを0.1.4としてみて確認してみました。

【結果】
〇 Agentへの接続
〇 `ros2 topoc list`でpublishされている`/arduino_chatter`が表示される
〇 `ros2 topic echo`でメッセージの受信

```
 　　　M5Stack　　                     Jetson Nano
+-----------------+            +------------+---------+
|ros2arduino 0.1.4|--- WiFi ---|Agent V1.1.6| Dashing |
+-----------------+            +------------+---------+
```

無事動作を確認できました。

※M5StickCとAtomについてはこれから確認する予定ですが、おそらくM5Stackで動く条件と同じかと思います。

## 2. micro-ROS

micro-ROSの環境構築はUbuntu上で行いました。micro-ROSの各ツールはROS2環境でcolconを使ってビルドするので、microcontrollerの組み込み環境(Arduino IED)でビルドできたros2arduinoとは少し勝手が違います。

### STM32 Nucleo F767ZI

以下のパラメータでfirmwareを作成。

```
$ ros2 run micro_ros_setup create_firmware_ws.sh freertos nucleo_f767zi
```

int32_publisherを、transportにudpを指定して、configure_firmware.shしてビルドしたところ、rosidl_generator_cで\<sys/socket.h\> がないというエラー発生。現在、対処を調査中。

【結果】
✖　サンプルのビルドでエラー

### STM32 Discovery kit IoT node

※現在確認中

### M5Stack/StickC/Atom

以下のパラメータでfirmwareを作成してビルドしました。

```
$ ros2 run micro_ros_setup create_firmware_ws.sh freertos esp32
```

サンプルにあったint32_publisherを使って動作を確認します。

Agentはmicro-ROS-Agentではなく、Micro-XRCE-DDSのAgentを使って動作確認してみました。

【結果】
〇 Agentへの接続
〇 `ros2 topoc list`でpublishされている`/freertos_int32_publisher`が表示される
〇 `ros2 topic echo`でメッセージの受信

```
　　　M5Stack    　　　          PC(Ubuntu 20.04)
+-----------------+            +----------+------+
| micro-ROS:foxy  |--- WiFi ---|Agent V1.3| Foxy |
+-----------------+            +----------+------+
```
※M5StickCとAtomについてはこれから確認する予定ですが、おそらくM5Stackで動く条件と同じかと思います。

## 3. GR-ROSE

開発環境は、Arduino IDEライクの[IDE for GR](https://www.renesas.com/jp/ja/products/gadget-renesas/ide-gr)を使用します。Version 1.13を使用しました。

サンプルは、udp_talker_besteffortを使用しました。Agentのバージョンはv1.1.6で確認。

【結果】
〇 Agentへの接続
〇 `ros2 topoc list`でpublishされている`/chatter`が表示される
〇 `ros2 topic echo`でメッセージの受信

```
  　 GR-ROSE                                 Jetson Nano
+---------------+                     +------------+---------+
|Clientライブラリ|--- WiFi/Ethernet ---|Agent V1.1.6| Dashing |
+---------------+                     +------------+---------+
```

# 最後に

想定していた以上に動作が確認できないケースがあり、時間がたりなくなってしまいました。

現在、継続して調査中です。ひとまず公開いたしますが、随時更新していきたく思います。

# リンク集

最後に、参考にさせてもらった記事へのリンクを以下にまとめておきます。

- micro-ROSチュートリアル｜ホストPC内 ping-pong : https://qiita.com/hssay/items/322dfd28b4a8a4cbd34d
- （たぶん）最小コスト・最短時間でROS2にマイコンを繋ぐ話 : https://qiita.com/MAEHARA_Keisuke/items/81ac6909444c23168eb3
- micro-ROSを使って、ROS2の世界とマイコンを繋いでみる : https://qiita.com/tatsuyai713/items/a45ee6d5d79a431f798b
- NanoPi-NEO2でROS2を動かしてみた : https://qiita.com/Spritaro/items/e13e2ae475452039f843
- ROS2を使って、GR-ROSEでZumoを動かす : https://qiita.com/lutecia16v/items/c8d6bd7a8a489256e898