Micro XRCE-DDSのAgentをRaspberry Piで構築してTopicを送受信する

# はじめに

ここではMicro XRCE-DDSのAgentをRaspberry Piで構築し、サンプルのtalker/listenerを使って、ROS2で文字列のTopic送受信を行うまでの手順を記載します。
おまけで、ros2-web-bridgeを使って、WebブラウザーからTopicを送信する方法も記載します。

ROS/ROS2が初めての方向けに簡単な説明をしていますので、Raspberry Piでの構築から始めたい方は、「[Micro-XRCE-DDSのAgentをRaspberry-Piで構築する](#micro-xrce-ddsのagentをraspberry-piで構築する)」まで読みとばしてください。

ros2-web-bridgeの話だけ見たい方は、「[ros2-web-bridgeを使ってwebブラウザからtopicを送信する](#ros2-web-bridgeを使ってwebブラウザからtopicを送信する)」まで読み飛ばしてください。

## ROSとROS2

[ROS(Robot Operation System)](http://wiki.ros.org/)とは、


> ROS (Robot Operating System)はソフトウェア開発者のロボット・アプリケーション作成を支援するライブラリとツールを提供しています. 具体的には, ハードウェア抽象化, デバイスドライバ，ライブラリ，視覚化ツール, メッセージ通信，パッケージ管理などが提供されています.

（ROS Wikiより引用）

と、いろいろなロボットアプリケーションを作成するために必要となる機能を提供するソフトウェア群（ミドルウェア）です。

また、[ROS2](https://index.ros.org/doc/ros2/)はその次世代バージョンです。

## Micro XRCE-DDSとは？

ROS2ではマイコン等のリソースが少ない環境(eXtremely Resource Constrained Environments = XRCEs)をターゲットに含んでおり、それに向けた通信仕様である[DDS-XRCE](https://www.omg.org/spec/DDS-XRCE/)が[OMG](https://www.omg.org/)にて標準化がすすめられています。

このDDS-XRCEの実装を、スペインの[eProsima社](https://www.eprosima.com/)が公開しています。

- [eProsima Micro XRCE-DDS](https://micro-xrce-dds.readthedocs.io/en/latest/)

Micro XRCE-DDSはマイコン側の実装のMicro-DDS-XRCE Clientと、このclientと他のROS2ノードと通信を仲介するMicro-DDS-XRCE Agentから構成されます。

ROS2のノードとの接続は以下のようになります。

```
+---------------------+                +--------------------+                 +---------+
|Micro-DDS-XRCE Client|<--[DDS-XRCE]-->|Micro-DDS-XRCE Agent|<--[RTPS(DDS)]-->|ROS2 Node|
+---------------------+                +--------------------+                 +---------+

```

# 環境構築の準備

## Micro XRCE-DDS Client環境

Micro XRCE-DDS Clientとして、今回は2019年4月末に[がじぇっとるねさす(GR)](http://gadget.renesas.com/ja/)から発売が予定されているGR-ROSEを使用しました。
※私は[プロデューサーミーティング](http://gadget.renesas.com/ja/event/2018/pm_rose.html)に参加してβ版を入手

- [GR-ROSE](http://gadget.renesas.com/ja/product/rose.html)

GR-ROSEに関する情報は、[がじぇっとるねさすコミュニティ](https://japan.renesasrulz.com/gr_user_forum_japanese/f/gr-rose)で見ることができます。GR-ROSEでは、1線シリアル(半二重)をサポートしており、[近藤科学 KRS-3301 ICS](https://kondo-robot.com/product/krs-3301-ics) や[Dynamixel XL-320](http://support.robotis.com/en/product/actuator/dynamixel_x/xl_series/xl-320.htm)といったシリアルコマンドサーボでの動作が確認されています。

GR-ROSE用のMicro XRCE-DDS Client環境は、以下のGitリポジトリで公開されていますが、Webコンパイラ、IDE for GRにはSDKが含まれています。Gitリポジトリで示されているe2studioでの環境構築はWindows用のためMac OSで試す場合はWebコンパイラかIDE for GRを使ってください。

- [a DDS-XRCE implementation for RX65N MCU](https://github.com/godzilla-max/rose_sketch)
- [日本語での解説](https://github.com/godzilla-max/rose_sketch/blob/master/README.ja.md)
- [Webコンパイラのチュートリアル](http://gadget.renesas.com/ja/product/rose_sp/1.html)
- [IDE for GRのチュートリアル](http://gadget.renesas.com/ja/product/rose_sp/2.html)

GitリポジトリのREAMDE.mdの"Write the sketch to GR-ROSE"まで進めてClient側を用意してください。WebコンパイラやIDE for GRの場合、スケッチ例として「tcp_talker_besteffort」が用意されているため、これをスケッチに読み込んでビルドしてください。
GR-ROSE側のIPアドレスを変更したい場合は、sketch.cppの以下の行を変更してください。

```
IPAddress ip(192, 168, 2, 52);
```

GR-ROSE以外には、[ROBOTIS](http://jp.robotis.com/)からOpenCRやArduino MKR ZERO、ESP32で動作するものが公開されています。（今回は未確認）

- [ros2arduino](https://github.com/ROBOTIS-GIT/ros2arduino)

## Micro-DDS-XRCE Agent環境

Micro-DDS-XRCE Agentのソースは、以下のGitリポジトリから入手できます。

- [Micro XRCE-DDS Agent respository](https://github.com/eProsima/Micro-XRCE-DDS-Agent)

このソースを簡単に構築するには、ROS2の環境が必要となり、これまではUbuntuのインストールされたLinux PCを用意することが一般的だとおもいます。

今回はこの環境をRaspberry Pi 3Bで構築する手順を以下でまとめていきます。

# Micro XRCE-DDSのAgentをRaspberry Piで構築する

## Ubunutu 18.04のインストール

まずは、Raspberry PiにUbuntu 18.04の<font color="Red">64bit ARM版</font>をインストールします。
ここで注意ですが、64bit版をインストールする必要があるため、<font color="Red">Raspberry Piは3 (B/B+/A+)である必要があります。</font>2以前およびZeroは残念ながら対象外です。

Ubuntuの公式から、Preinstalled server imageが公開されていますので、それを使用します。<font color="Red">かならず「Raspberry Pi 3 (64-bit ARM) preinstalled server image」を選択してください。Hard-Floatを選んではいけません。</font>

- [Ubuntu 18.04.2 LTS (Bionic Beaver) - Select an image](http://cdimage.ubuntu.com/ubuntu/releases/bionic/release/)


詳しいインストール方法は、[アールティロボットショップ](https://www.rt-shop.jp/)さんのブログで記載されていますので、そちらを参照ください。
<font color="Red">ただし、まだ「ROS2のインストール」はしないでください。「Raspberry Pi 3にUbuntuをインストール」だけを行ってください。（理由は後述）</font>

- [Raspberry Pi 3にROS2をインストール](https://www.rt-shop.jp/blog/archives/11061)

## ROS2のインストール

次に、ROS2をインストールします。現在(2019/3/15)のMicro XRCE-DDS Agentのリポジトリは、<font color="Red">Crystal Clemmysがターゲットとなっているようです。</font>Bouncy Bolsonでは、コンパイル時にエラーになります。

Crystal Clemmys, Bouncy BolsonはROS2のバージョンで、Ardent Apalone -> Bouncy Bolson -> Crystal Clemmysとなっています。
先ほどのブログでは、Bouncy Bolsonをインストールする手順になっているため、以下の様にして、Crystal Clemmysをインストールします。

```
$ sudo apt install curl
$ curl http://repo.ros2.org/repos.key | sudo apt-key add -
$ sudo sh -c 'echo "deb [arch=amd64,arm64] http://repo.ros2.org/ubuntu/main `lsb_release -cs` main" > /etc/apt/sources.list.d/ros2-latest.list'
$ sudo apt update
$ sudo apt install ros-crystal-ros-base
```

つづいて、

```
$ sudo apt install python3-argcomplete
$ sudo apt install python3-colcon-common-extensions
```

も実行しておきます。

## Micro-DDS-XRCE Agentのビルドとインストール

リポジトリからクローンします。

```
$ git clone https://github.com/eProsima/Micro-XRCE-DDS-Agent.git
```

その後、

```
$ cd Micro-XRCE-DDS-Agent
$ mkdir build && cd build
$ cmake -DTHIRDPARTY=ON ..
$ make
$ sudo make install
$ sudo ldconfig /usr/local/lib/
```

以上で準備完了です。

詳しい解説は、公式のドキュメントを参照ください。

- [eProsima Micro XRCE-DDS - Installation](https://micro-xrce-dds.readthedocs.io/en/latest/installation.html)

## talker/listenerのインストール

GR-ROSE向けのMicro-DDS-XRCE Clientのリポジトリは、デフォルトでtalkerのデモが実装されています。

そこで、動作確認のために、Raspberry PiのROS2環境にtalker/listenerのデモをインストールします。talker/listenerのデモは、demo-node-cppパッケージにありますので、それをインストールします。

```
$ sudo apt install ros-crystal-demo-nodes-cpp
```

## 動作確認

それでは、動作確認をします。

ハードウェアの接続について、AgentとなるUbuntu側とClientとなるGR-ROSEをLANケーブル(直結の場合はクロスケーブル)で接続する場合、Ubuntu側は固定IPに設定する必要があります。設定には以下を参照してください。アクセスポイントを使い、DHCPでIPを取得する場合は必要ありません。

- [How To Configure IP Address In Ubuntu 18.04 LTS](https://www.ostechnix.com/how-to-configure-ip-address-in-ubuntu-18-04-lts/)

例えば、以下のようにネットワークの設定を行います。

```
network:
    version: 2
    ethernets:
        eth0:
            addresses: [192.168.2.101/24]
            gateway4: 192.168.2.1
            dhcp4: no
            (以下略、デフォルトのまま)
```

それではまず、Micro-DDS-XRCE Clientを起動します。

GR-ROSEの場合は、シリアルコンソールを立ち上げて、GR-ROSEに接続したUSBを接続します。すると、

```
Discovery Agent...
```

と表示され、Agentを探しはじめます。
ただし、この時点ではMicro-DDS-XRCE Agentが起動していないので、Raspberry Piにログインして、Micro-DDS-XRCE Agentを起動します。

```
$ cd Micro-XRCE-DDS-Agent/build/agent/
$ ./MicroXRCEAgent --tcp 2020
```

すると、GR-ROSEに接続したシリアルコンソール上に、

```
Discovery Agent...
Found agent => ip: 192.168.xx.xx, port: 2020
Chosen agent => ip: 192.168.xx.xx, port: 2020
 Sent topic: Hello DDS world!: 0
 Sent topic: Hello DDS world!: 1
 Sent topic: Hello DDS world!: 2
 Sent topic: Hello DDS world!: 3
```

と表示されます。メッセージにあるように、Agentを発見して接続しトピックを送信しはじめます。

次に、Raspberry Piに別のコンソールからログインして、

```
$ source /opt/ros/crystal/setup.bash
$ ros2 run demo_nodes_cpp listener
```

と入力します。すると、

```
$ ros2 run demo_nodes_cpp listener
[INFO] [listener]: I heard: [Hello DDS world!: 102]
[INFO] [listener]: I heard: [Hello DDS world!: 103]
[INFO] [listener]: I heard: [Hello DDS world!: 104]
```

のように表示されて、トピックが受信されたことがメッセージからわかります。
以上で動作確認は終了です。

GR-ROSE側のソースのexamplesフォルダ配下には、様々な通信方式(UDP/TCP, reliable/besteffor)のtalker/listenerのサンプルがありますので、試したいもののソースをsketch.cppに貼り付けてビルドしなおすことで、利用できます。

# ros2-web-bridgeを使って、WebブラウザからTopicを送信する

## ros2-web-bridgeとは？

ros2-web-bridgeはrosbridge_serverのROS2版で、rosbridge_serverはROSのTopicやServiceをWebブラウザ等から送受信する仕組みを提供します。
またRobot Web Toolsからは、JavaScriptのrosライブラリであるroslibjs等が提供されています。

- [ros2-web-bridge (GitHub)](https://github.com/RobotWebTools/ros2-web-bridge)
- [rosbridge_server (ROS Wiki)](http://wiki.ros.org/rosbridge_server)
- [Robot Web Tools](http://robotwebtools.org/)
- [roslibjs (GitHub)](https://github.com/RobotWebTools/roslibjs)

ros2-web-bridgeは、ROSのカンファレンスである[ROSCON2018](https://roscon.ros.org/2018/)にて、Intelの方が発表されました。

- [Node.js Cl ient & Web Bridge Ready for ROS 2.0(slide)](https://roscon.ros.org/2018/presentations/ROSCon2018_nodejs_client.pdf)
- [Node.js Cl ient & Web Bridge Ready for ROS 2.0(video)](https://vimeo.com/293310573)

このros2-web-bridgeを使って、WebブラウザーからMicro-DDS-XRCE Clientにメッセージを送信してみます。

## ros2-web-bridgeのインストール

Raspberry Pi上にros2-web-bridgeをインストールします。
基本的に、[GitHubのREADME.md](https://github.com/RobotWebTools/ros2-web-bridge/blob/develop/README.md)の内容に従ってインストールすればよいです。

Micro-DDS-XRCE Client側には、listenerのデモを設定しておきます。

次に、サンプルのHTML(example/html/publisher.html)を修正します。

Topicの名前をClient側のものに変更します。

```examples/html/publisher.html
  // Publish a Topic
  var example = new ROSLIB.Topic({
    ros : ros,
    name : '/chatter',
    messageType : 'std_msgs/String'
  });
```

もし、Raspberry Pi以外の端末からアクセスする場合は、ros2-web-bridgeの接続部分である以下のアドレスをRaspberry Piのものに変更します。

```examples/html/publisher.html
ros.connect('ws://192.168.xx.xx:9090');
```

また、アクセスする端末からインターネットに接続できない場合は、以下のjsファイルをダウンロードして、Raspberry Piのhtml配下(例えば、examples/html/js/等）に配置して、URLを変更します。

```examples/html/publisher.html
<script src="http://192.168.xx.xx:3000/html/js/eventemitter2.min.js"></script>
<script src="http://192.168.xx.xx:3000/html/js/roslib.js"></script>
```

## 動作確認

まず、Micro-DDS-XRCE AgentおよびMicro-DDS-XRCE Clientを起動しておきます。

次に、ros2-web-bridgeを起動します。

```
$ cd ros2-web-bridge
$ node bin/rosbridge.js
```

その後、Webサーバー(Node.jsのExpress Server)を起動します。

```
$ cd ros2-web-bridge/examples
$ node index.js
```

その後、Webブラウザから`http://<Raspberry PiのIP>:3000/html/publisher.html`にアクセスすれば、メッセージが送信されます。

GR-ROSEの場合は以下のようなメッセージが出力されます。

```
Discovery Agent...
Found agent => ip: 192.168.11.7, port: 2020
Chosen agent => ip: 192.168.11.7, port: 2020
Received topic: hello from ros2bridge 0
Received topic: hello from ros2bridge 1
Received topic: hello from ros2bridge 2
```

以上になります。