cvl-robot's diary

研究ノート メモメモ https://github.com/dotchang/

ネットワークの実時間性を保障してほしいので、DDSを調べる

DDSは、RTPSパケットを使って、Pub-Sub形式でネットワーク上のデータをやり取りする仕組み(分散ネットワーキングミドルウェア)だそうです。
https://ja.wikipedia.org/wiki/Data_Distribution_Service

諸悪の根源であるところのCORBAの系統のようなので使い勝手が心配ですが、レイテンシやディレイが一定範囲内であることを期待できるリアルタイムのデータ通信の手法としては本命視されています。
商用やオープンソースでいくつかの実装があるようです。オープンソースで使い勝手のよさそうなものを探していきます。

RTI Connext DDS

https://www.rti.com/products
商用で最も普及しているのがこれです。ただし、150万円ぐらいするようです。
大学や研究機関向けにはオープンソースで機能限定版を申請により提供してくれるようですが、プロジェクトに他の企業からの予算が少しでもついていると、使用できないそうです。
今時の大学は、一生懸命外部予算の獲得に励んでいますから、この使用条件を満たすところなんてほとんどないのではないでしょうか?
登録しようとすると、連絡はアメリカの本社に行きますが、結局日本には日本の代理店があるからそっちに聞いてくれ、と言われます。
ということで、使えません。

openSplice

かつてRTI社と一緒にDDS規格の仕様策定にかかわったThalesという会社が開発していたのを、Prismtechという会社が引き継いでオープンソースで提供されているライブラリです。
一見、良さそうに見えますが、最近はほとんどメンテナンスされていないようなので、開発が止まっているように見えます。
初期にはROS2での採用も検討されていたようですが、外されてしまいました。
http://qiita.com/sobeit@github/items/20d9f1478bbc1a33d096
Hello World exampleを動かしてみようとすればわかりますが、release.batという環境設定用のバッチファイルを実行したコマンドプロンプト窓から実行ファイルを呼び出す必要があります。
やりようによっては要らない作業なのかもしれませんが、よくわからない処理の上に面倒くさいです。
ということで、使えません。

FastRTPS

www.eprosima.com
eProsimaという会社がオープンソースとして管理しているライブラリです。RTPSはパケットの形式でDDSとは謡っていないのですが、RTPSでPub-Sub形式でデータをやり取りするライブラリなので、そのものですね。
ROS2でも採用されるようなので、大本命だと思います。

ROS2では、ほかにもTwin Oaks Softwareという会社のDDSも検討されているようです。
CoreDX DDS Data Distribution Service Middleware | Twin Oaks Computing, Inc
眺めた限り、HelloWorldExampleが一番簡素に書けているのでいずれこれも使ってみたいです。

FastRTPSをちょっと触ってみる

Windows10 64bit、VisualStudio 2015の環境です。
ソースも落ちていますが、コンパイルにはboostが必要で面倒くさいので、バイナリ提供版を使います。
上記ページのDownload Now!ボタンを押せばダウンロードページに飛びますが、なぜか異様に重いです。今日ここの環境では4分ぐらいかかりました。簡単なユーザー登録を済ませれば、ダウンロードページに飛びます。
ダウンロードしたexeを実行すればインストールが始まり、特に問題なく進むとは思いますが、そのままでは管理者権限の必要なC:\Program Files\eProsimaフォルダの下にインストールされてしまい、後で少し問題が出ます。できれば、c:\workspaceなど適当な場所にしておいたほうがよさそうに思います。
もっとも簡単そうなC:\Program Files\eProsima\fastrtps 1.3.1\examples\C++\HelloWorldExampleを見てみると,cmake形式でプロジェクトが提供されています。
ProgramFilesフォルダの下にファイルを書き込むことが億劫なので、適当な場所にコピーして適当にcmakeを通してやれば、slnファイルができるので普通にビルドします。
HelloWorldPublisher.bat

HelloWorldExample.exe publisher

HelloWorldSubscriber.bat

HelloWorldExample.exe subscriber

などの適当なバッチファイルを作って2つを実行してやれば、特に問題なくプログラムは動くかと思います。

自前のデータ形式をやり取りするプログラムを書くには。

お、簡単じゃん、などと思いながらソースコードを見てみることにすると、やたらとファイルが多いことに気が付きます。
HelloWorldPublisher.cxxと.h、HelloWorldSubscriber.cppと.hはわかるとしてもまだ余計なものが一杯ありすぎます。
HelloWorld_main.cppをのぞいてみると、これは単に引数によって2つのプログラムの呼び出しを変えているだけのものなので無視していいことが分かります。
残ったHelloWorldPubSubTypes.cxxはなんぞこれと見てみると、わけのわからないことが書かれています。こんなもの、書いてらんないぞ、と焦って頭のほうのコメントをよく見てみると、

This file was generated by the tool fastcdrgen.

なんてことが書かれていて、自動生成されたファイルだということが分かり、胸をなでおろします。
fastcdrgenとは何ぞ、と思ってフォルダの中を探してみても同じファイル名のものはありません。すわ、別のプロジェクトを入れる必要があるのかな、面倒くせーななどと思っていると、
C:\Program Files\eProsima\fastrtps 1.3.1\binの下にfastrtpsgen.bat
という名前がよく似た感じのファイルを見つけることができます。これかなー、と思ってググってみるとコレでした。このムービーを見るとよくわかりますし、最初からちゃんとマニュアルを追っていけば書いてあります。
www.youtube.com
ちゃんとマニュアルは読みましょう、という教訓ですね。

.idlファイルに定義したデータパケットの形式をfastrtpsgen.bat(中でjarが呼ばれているのでjavaプログラム)で、idlをコンパイルするとPub-Subテンプレートファイルが生成される、のでこれを各自で書き換えて使えということのようです。
main関数を乗っ取られた形で提供されるのが、とても気に入らないしスレッドを分けることが必須なのが多少厄介ですが、この枠組みに乗れば簡単に使うことはできるようです。
個人的には、CORBA時代の悪夢を思い出すようでアレルギーが発症しそうなのですが、stringだけをやり取りするように決めてしまって、stringの中をOSCパケットなどにして、openFrameworksなどから呼び出せるようにラップしてしまえば、何とか使えるようになりそうです。

まとめ

使えそうなことはわかったので、性能はどうなんだろう?ということを調べてみると、ちょうどいいことにZeroMQとの性能比較がまとめられていました。
www.eprosima.com
FastRTPSの方が良いよ、と言いたいのだと思いますが、ディレイもレイテンシもほとんど変わりませんね。メッセージサイズが大きいときにはややFastRTPSが有利で、小さいときにはZeroMQのほうが有利と読めます。
ロボットで使われるメッセージは、画像や音を除けば大半は短いコマンドなので、ZeroMQでいいじゃん、ということになります。
ネットワークの管理を厳密にやりたいときはFastRTPSの方がずっと良さそうです。
(が、正直、超絶面倒くさいから、当面はZeroMQでよくってROS2が本格的に動き出したら使わせてもらおう、という結論。)

今日の必要最小限パソコン

一応、日本のメーカーNEC製(中身はレノボに乗っ取られていますが)で、
MicrosoftのOfficeが付いていて、
拡張性は皆無だけど最低限度のスペックがあり、見た目がわりとカッコよくて、ぎりぎり頑張れるぐらいの値段、なので親に使わせるPCとかなら有り、かなぁ、と。