良くいわれる質問を集めてみました.僕の意見なので間違っているかもしれません.責任はもちろん,とりません(笑)
RTミドルウエアについて
Q: 「ミドルウエア」って何?
いきなり難しい質問ですね.ミドルウエアはOSの垣根を取り払ってくれるソフトウエアのことをさすようです.「CORBA」とか「MySQL」とか「JBOSS」がミドルウエアのようです.たしかにMySQLなんかは,相手のサーバーで何のOSが動いているのか意識しないでも使えますよね.
Q: 使えるの?
使ってみてください.僕の用途(リアルタイム性よりも,ソフト実装効率重視)だとかなり使えます.もちろんロボット用ということでリアルタイムOS対応も進んでいます.その他の機能もどんどん向上してますし,PCの機能も上がってますからね,オープンソースだし,技術があって,その気になれば何とでもなります.
OpenRTM-aistについて
RTコンポーネント関連
Q:使えるRTコンポーネントはどこに行けば見つかるの?
これは手厳しい(笑)とりあえずは公式ウェブページでしょうか.このリンクからキーワードで攻めてみてください.あと,僕のwasanbonのページにもすこしRTコンポーネントの情報があります.
あと,各年度のRTミドルウェアコンテストのページも参考になるとおもいます.
データポート関連
Q:データポートで単純なバイト型データを送信できますか?
TimedOctetSeq型を使って下さい.構造体などをシリアライズして送信できます.ただ,ヘッダーを両方のRTCでインクルードしなくてはならず,違う構造体を送っていてもTimedOctetSeq同士ならばつながってしまうので,ちょっとリスクあります.
Q:独自のデータ型を定義できますか?
できます.IDLを編集しなくてはなりませんが,実は意外と簡単です.
Q:データポートの出力を,制御で使いながら別のRTコンポーネントから拾えますか?
データポートの複数接続が可能なので出来ます.
実行コンテキスト関連
Q:イベントドリブンなシステムは出来ますか?
FSMコンポジットという規格がありますが,まだ実装されてなさそうです.サービスポートを使えば,非同期にイベントを起こすことが出来るので,こちらがよさそうです.僕がつくったFIROSOPHYも使えるかもしれません.
Q:RTCごとの優先度は設定できますか?
うーん.RTCごとに周期を変更することは可能です.優先度は別々のプロセスならばシステム(OS)でやるしかないでしょうね.あとは独自の実行コンテキストを実装するのがいいと思います.プライオリティ付きFIFOのアルゴリズムで実現出来そうです.
Q:レイテンシ,リアルタイム性はどうですか?
OpenRTM-aistで利用しているCORBAはTCP/IPでデータ送受信しちゃうのですが,同一ホスト内でさらに同一プロセス上で複数のRTCを起動することができます(RTC daemon).これによってレイテンシは改善されます.
最近の実装でC++版の同一プロセスコンポーネント同士の通信がさらに高速化されました.さらに実行効率の必要な部分にはRTC-CANopen(芝浦工大 水川研)などの組み込み系RTミドルウエアを使うとか,独自のデータポートを実装することも可能です.共有メモリを使ったデータポートの実装などが使いまわしが効きそうですね.
Linux版ならば,2.6系カーネル以降からのプリエンプティブ・カーネルの機能でリアルタイム機能が付きます.どの程度の周期か,はシステム依存なので難しいですが1[ms]周期程度です.ARTLinuxの実装もあります.VxWorksにも移植しているそうです.
そのほか
Q:たくさん起動するのが面倒くさいです
わかります.でも実はRTC daemonなるツールがあり,これを使うとすっきりします.入門編の記事を最後まで読んでみてください.
Q:繋ぐのが面倒くさいです
わかります.いろんなツールがあるのでそれを使います.1.RT System Editor:システムの接続を保存する機能があります.右クリックしてsaveです.これで保存されるシステム・プロファイルを,再度ロードすれば接続を一気に出来ます.2.rtshell:コマンドラインからRTシステムの管理をすることが出来るツールです.先ほどのRT System Editorのプロファイルを読み込むことが出来るので,簡単なシェルスクリプトやバッチファイルでシステムを実行できます.
Q:複数のRTコンポーネントをまとめて一つに出来ますか?
RTCコンポジットという機能があります.まとめて一つに見えます.コンポジットになった場合,実行コンテキストがまとめられるので,まとめられたRTCが順番に実行されるようになります.同期実行できるようになるわけです.
Q:LinuxとWindowsとの間でソースの互換性は?
ロジックのみならばソースは互換になります.coilという産総研が作ったライブラリがあって,それを使えばMUTEXやシグナルのソースコードも一緒に出来ます.実際,僕が開発しているRTC-scilabはLinuxとWindowsと同じソースです.ほとんど#ifdefも使ってない.
Q:ライセンスは?
ライセンスはLGPLと産総研との直接契約のデュアル形式です.皆さんが使う場合,基本はLGPLだと思います.この場合,LGPLは僕の「誤解を恐れないひとこと説明」だと,「GPLのようにコピーレフトではないので,自分のソフトをオープンソースにしなくても良い.その代わり,LGPLのソフトは静的リンクではなく動的リンクでお願いします」って感じです.
トラブルがいやな人は自分のソフトを配布するとき,ソースもLGPLで公開した方がいいでしょうね.商用の場合は動的リンクで.変更しなけりゃ再配布も問題なし.ソースもオープン.その前にライセンスの勉強するのが得策でしょうけど.