python で RTコンポーネントを作る

環境設定

パッケージのインストール

最初に、pythonのためのパッケージのインストールが必要になります。
端末から、次のコマンドを実行してください。

 % sudo aptitude install openrtm-aist-python openrtm-aist-python-example omniidl4-python python-omniorb2-omg

このコマンドで、以下の四つのパッケージをインストールします。
  • openrtm-aist-python: OpenRTM を python から利用するためのモジュール
  • openrtm-aist-python-example: OpenRTM を python から利用するサンプルプログラム集
  • omniidl4-python: omniidl を python に対応させるモジュール
  • python-omniorb2-omg: pythonをomniidl に対応させるモジュール

Eclipse に PyDev をインストール

PyDev は、Eclipse で python を扱うプラグインです。
Eclipse のメニューから「ヘルプ」~「ソフトウェア更新」を選びます。
「ソフトウェア更新およびアドオン」ダイアログが開くので、「サイトの追加」ボタンを押してロケーションに「http://pydev.org/updates 」を入力します。
AddSite.png
使用可能なソフトウェアのタブに、この http://pydev.org/updates が追加されるので、これを開いてPyDev の下にある PyDev for Eclipse をチェックして、インストールボタンを押します。
PyDev.png

今回の目標

二つのRTコンポーネント VisionManipulation と MyScheduler を作成して、すでに作成済みの RTコンポーネント VVVRecogTrigger からデータを取得します。

メインとなるのは VisionManipulation です。
スケジューラからモデルのIDを受け取ったら、recogSDL サービスポートを通して VVVRecogTrigger に渡します。
VVVRecogTrigger がモデルIDを認識した結果は、recogResult データポート経由で受けとります。

RTコンポーネントを作成する

以下のページを参照してください。

RTコンポーネントを接続する

二つのRTコンポーネントができたので、まずはローカルで接続してみます。

Eclipse で RT System Editor パースペクティブを開き、ツールバーのONを押して System Diagram を開きます。
ツリーの「localhost:2809」を開くと、その下にさらに「(ホスト名)|host_cxt」というツリーがあると思うので、それも開いておきます。
いくつかRTコンポーネントが表示されるかもしれませんが、どれも□のアイコンで、起動できません。

端末ウインドウを二つ開き、一つでMyScheduler.py, もう一つで VisionManipulation.py を実行します。

すると、「(ホスト名)|host_cxt」ツリーの下に「MyScheduler0|rtc」「VisionManipulation|rtc」という項目が増えます。凸凹の文字を底でくっつけて倒したような形のアイコンになっています。

これを両方 System Diagram にドラッグ&ドロップすると、小さな□のついたブルーの長方形が現れます。これがRTコンポーネントです。
それぞれの下に、MyScheduler0, VisionManipulation0 と名前がついているのを確認してください。
また、小さな□はポートを示しています。ポートにマウスカーソルを合わせると、ポートの名前がわかります。

RTComponents.png

VisionManipulation には4つのサービスポートと1つのデータポートがあるので、右側に4つの□、左側に欠けた□が出ています。
4つの□のひとつが VisionManipulation0.scheduler となっています。
これをMyScheduler0の□にドラッグ&ドロップすると、「ポートプロファイルを入力してください」というダイアログが出るので、そのままOKを押します。
するとポートとポートが線でつながれます。
PortProfile.pngRTCConnected.png

ここでツールバーの緑のプレイボタンを押すと、RTコンポーネントがアクティベートされます。
双方が一瞬緑になったあと、MyScheduler側がエラーで赤くなります。
VisionManipulation を実行している端末のエラーメッセージを確認してください。

 setModelID: 42
 omniORB: Caught an unexpected Python exception during up-call.
 Traceback (most recent call last):
  File "/home/asahi/workspace/VisionManipulation/VisionManipulation_idl_example.py", line 48, in setModelID
    coord = self.recogSDL_service._ptr().recognize_by_ID(ModelID)
 AttributeError: 'NoneType' object has no attribute 'recognize_by_ID'

一行目でsetModelID: 42 が出ているので、MySchedulerからModelIDを受け取れているのがわかります。
その後出ているエラーは、recogSDL_service が未定義のため、recognize_by_ID を呼び出せなかったというエラーです。

これは VisionManipulation0 の recogSDL ポートに何もつないでいないのだから、当然です。

これでひとまず、MySchedulerからVisionManipulationの呼び出しができたということで、いよいよカメラとつないでみることにします。

(作成中)