ページ

2013年6月8日土曜日

rtcdを利用して複数コンポーネントを同一マネージャ上に起動する

OpenRTMで複数のRTコンポーネントを纏める際などに、rtcdを利用することがあると思います。
rtcdを利用する際に、躓いた点などをメモ程度に書いておくことにします。

(1)rtcdが起動しない
Pythonが正しくインストールされていない可能性があります。rtcd自体がPythonで実装されているため、動作にはPythonが必要となります。OpenRTM-aist-Pythonの実行の際には2.4、2.5、2.6のいずれかのバージョンのPythonが必須になりますので、取り敢えずその中でバイナリ配布されてるもので一番新しいPython 2.6.6をインストールしておけば問題ないでしょう。

(2)実行するとrtcprof_pythonに関するエラーメッセージが表示される
rtcdを実行した際に、

Load failed.
Load failed.
Load failed.
Load failed.

と、


'rtcprof_python' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。

という2種類のエラーメッセージ(Windows版)が表示されます。
エラーメッセージを無視しても正しく動作はするようなのですが…気になります。

ログを吐かせてみてみると、Load Failedの方はどうやら./から探してきたdllをコンポーネントとして読み込もうとして失敗している様子

Jun 08 06:16:43.390 DEBUG: ModuleManager: Module load path: ./
Jun 08 06:16:43.390 DEBUG: ModuleManager: File list (path:./, ext:dll): coil110.dll, coil110d.dll, RTC110.dll, RTC110d.dll
Jun 08 06:16:43.390 DEBUG: ModuleManager: New module: ./coil110.dll
Jun 08 06:16:43.390 DEBUG: ModuleManager: New module: ./coil110d.dll
Jun 08 06:16:43.390 DEBUG: ModuleManager: New module: ./RTC110.dll
Jun 08 06:16:43.390 DEBUG: ModuleManager: New module: ./RTC110d.dll

rtcprof_pythonのほうは、Pythonのモジュールを探してきた時にrtcprof cmd sub processが起動されるらしいのですが、その際にrtcprof_pythonが必要らしいです。
公式のrtc.conf設定項目一覧によると、rtcprof_pythonというのはPython用のプロファイル取得コマンド名らしいのですが…OpenRTMのPython版をインストールしても問題は解決せず…
ソースの中にはrtcprof_python.pyとrtcprof_python.batが存在しているのですが、どうしたもんか…

--

とりあえず、Load failedの方はload_modulesに指定していないのに./を勝手に読みに行ってしまうのが問題っぽいので、嫌ならコンポーネントと一緒に一つのディレクトリに纏めるのがいいのでしょうか?

rtcprof_pythonのほうはC++しか使わない前提なら

manager.supported_languages: C++

を指定しちゃってもいいかもしれないですね…勝手にスレーブマネージャ起動されるよりは、明示的にそれぞれの言語のマネージャを起動した方が事故が起こりにくそうですし…
まぁ、スタートメニューにあるrtcdもrtc.confもあくまでサンプルで、詳しくは自分でいじれってことなんでしょうかね?

これらを踏まえて、rtc.confを作ってみました。適当なディレクトリにこのconfigとrtcdをコピーして、componentsディレクトリを下に作ってその中にコンポーネントのdllを置いてrtcdを起動すればOKです。
※manager.modules.load_pathに./を指定してしまうと、コンポーネントが2回読み込まれてしまうバグがあります

あとはRT System Editorからmanagerを選択
(1) LoadableModulesからコンポーネントを選択してLoad
(2) Createを押して、コンポーネント名を指定
することでRTコンポーネントを動的に同一マネージャ上(同一プロセス上)に生成出来ます。

自動でLoadとCreateをしたいときには、rtc.conf設定項目一覧を参考に、rtc.confにmanager.modules.preloadとmanager.components.precreateを指定すればOKです。



0 件のコメント:

コメントを投稿