rclcppのサンプルプログラムを書く書くといってきたのですが、ROS 2の新しい機能を使ったアイデアをここ数日では思いつけなかったので、思いつき次第、続きをすることにして、次に進みます。

本日からは、ROS 2で採用された通信ミドルウェアDDSの通信プロトコルであるRTPSを掘り下げていきます。

rclcpp (ROS Client Library for C++) を読み解く (1)でも紹介した図でいうところの最下層のDDS vendorの部分です。

http://roscon.ros.org/2016/presentations/ROSCon%202016%20-%20ROS%202%20Update.pdf

上から順に取り上げていく予定です。

といいながら、最上層のrclcppを取り上げた次が最下層のDDS vendorである点はご愛嬌です。 興味の湧いた順に紹介させてください笑

DDSベンダ

ROS 1の通信プロトコル独自実装から一転、ROS 2は通信ミドルウェアのDDSを採用した経緯は、DDS (Data Distribution Service) とはをご参照ください。

商業的にも採用されているDDSを採用することで、ユーザが自由に組み込めるオープンソース・ソフトウェア実装のライブラリから、サポートもしっかりしたプロプライエタリなライブラリまで、どれを利用するかがユーザの自由となりました。

DDSは通信プロトコルにRTPS (Real-Time Publish-Subscribe) を採用しており、ROS 2では、このRTPSをインタフェースとするrmwという層を設け、その上位層はDDSベンダに依らない実装になるように構成されています。

http://roscon.ros.org/2016/presentations/ROSCon%202016%20-%20ROS%202%20Update.pdf

FreeRTPS

ROS 2が標準で利用するDDSベンダはApache 2.0ライセンスのFastRTPSです。

しかし、今回紹介するのは、OSRFが一から実装したFreeRTPSの方です。 こちらはレポジトリの説明にwork-in-progressとあるように、まだRTPSの全ての機能が実装されているわけではありません。 その代わり、その他のライブラリへの依存性がなく、非常に小さなライブラリにまとまっていることが最大の特徴です。 x86 CPUだけでなく、ARMでもコンパイルすることも最初から想定されています。

これなら、以前重すぎるROS 1のセットアップと実行で諦めてしまったLEGO Mindstorms EV3にも、ROS 2 + FreeRTPSの組み合わせなら再度挑戦しがいがありそうです。

クロスコンパイラ環境のセットアップ

https://github.com/ros2/freertps/wiki/Prerequisites

に従って、ARMのクロスコンパイラ環境を整えます。 PPA追加の設定が古くなっていましたが、僕の方で直しておきました。

sudo add-apt-repository ppa:team-gcc-arm-embedded/ppa
sudo apt-get update
sudo apt-get install gcc-arm-embedded
sudo apt-get install libtool autoconf automake pkg-config libusb-1.0-0-dev libhidapi-dev
cd ~
git clone http://repo.or.cz/openocd.git
cd openocd
./bootstrap
./configure --enable-stlink --enable-ftdi --enable-cmsis-dap --prefix=/usr/local
make -j4
sudo make install

x86 CPUのみを対象とする場合、この手順は必要ありません。

コンパイル

コンパイルはFreeRTPSのソースコードをクローンしてmakeするだけです。

git clone https://github.com/ros2/freertps
cd freertps
make

試してみたところ、amentを使ったビルドには対応していませんでした。 package.xmlCMakeLists.txtもあるので、何かが足りないか間違っているのでしょう。 コントリビューションのしがいがあります笑

デモ実行

buildディレクトリ以下にデモの実行ファイルが出来上がるので、実行してみましょう。

build/native-posix/apps/talker/talker

build/native-posix/apps/listener/listener

talkerlistenerStringのROSメッセージを送受信しているので、これまでのFastRTPSを使ったノードとも通信できます。