DDSの通信プロトコルRTPS実装の一つFreeRTPSを試す (1)
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.xml
もCMakeLists.txt
もあるので、何かが足りないか間違っているのでしょう。 コントリビューションのしがいがあります笑
デモ実行
build
ディレクトリ以下にデモの実行ファイルが出来上がるので、実行してみましょう。
build/native-posix/apps/talker/talker
build/native-posix/apps/listener/listener
talker
とlistener
はString
のROSメッセージを送受信しているので、これまでのFastRTPS
を使ったノードとも通信できます。
Comments powered by Disqus.