Edited at

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で構築する」まで読みとばしてください。

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


ROSとROS2

ROS(Robot Operation System)とは、


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


(ROS Wikiより引用)

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

また、ROS2はその次世代バージョンです。


Micro XRCE-DDSとは?

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

このDDS-XRCEの実装を、スペインのeProsima社が公開しています。

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)から発売が予定されているGR-ROSEを使用しました。

※私はプロデューサーミーティングに参加してβ版を入手

GR-ROSEに関する情報は、がじぇっとるねさすコミュニティで見ることができます。GR-ROSEでは、1線シリアル(半二重)をサポートしており、近藤科学 KRS-3301 ICSDynamixel XL-320といったシリアルコマンドサーボでの動作が確認されています。

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

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からOpenCRやArduino MKR ZERO、ESP32で動作するものが公開されています。(今回は未確認)


Micro-DDS-XRCE Agent環境

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

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

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


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


Ubunutu 18.04のインストール

まずは、Raspberry PiにUbuntu 18.04の64bit ARM版をインストールします。

ここで注意ですが、64bit版をインストールする必要があるため、Raspberry Piは3 (B/B+/A+)である必要があります。2以前およびZeroは残念ながら対象外です。

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

詳しいインストール方法は、アールティロボットショップさんのブログで記載されていますので、そちらを参照ください。

ただし、まだ「ROS2のインストール」はしないでください。「Raspberry Pi 3にUbuntuをインストール」だけを行ってください。(理由は後述)


ROS2のインストール

次に、ROS2をインストールします。現在(2019/3/15)のMicro XRCE-DDS Agentのリポジトリは、Crystal Clemmysがターゲットとなっているようです。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/

以上で準備完了です。

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


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を取得する場合は必要ありません。

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

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は、ROSのカンファレンスであるROSCON2018にて、Intelの方が発表されました。

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


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

Raspberry Pi上にros2-web-bridgeをインストールします。

基本的に、GitHubの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

以上になります。