いよいよ本体の VisionManipulation RTC の作成に入ります。
MyScheduler RTC からの setModelID の呼び出しを受けたら、VVVRecogTrigger RTC にこのコマンドを飛ばし、結果を recogResult データポートで受け取って表示するRTコンポーネントです。
概念としてはこういう形になります。
設定する項目だけ列挙します。設定の仕方の詳細は MyScheduler RTC を作る を参照してください。
Eclipse プロジェクト名: VisionManipulation
MyScheduler の Schedulerポートとほぼ同じですが、コマンドを呼ばれる側なので方向が Provided になります。
以下のポートは今回は実装しませんが、今後の拡張のためにあらかじめ定義しておきます。
ここでrecogResult ポートを定義します。
前回は設定しなかったタブなので、ここだけ詳しく解説します。
DataPort プロファイルのセクションが、「*ポート名(InPort)」と「「*ポート名(OutPort)」」の二つのリストに分かれています。
このうちのInPort側のAddボタンを押すと、ポート名リストに「dp_name」が加わり、Detail セクションにポート情報が入ります。
ポート名リストのdp_nameをクリックすると名前の変更ができるので、ポート名 recogResult を設定します。
すると、ここで設定したポート名がDetailセクションのポート名として反映します。
さらに、Detail セクションの項目を以下のように設定します。
このとき、データ型が選択できないことがあります。
そのときは、RtcBuilder にIDLファイルのパスを設定します。
メニューバーからウィンドウ~設定を選び、左のツリーからRtcBuilderを選択します。
すると「データ型: IDL File Directories」というリストが現れます。
右の「新規」ボタンを押して、場所に「/usr/include/rtm/idl」を追加します。
そうすると、IDLファイルからデータ型を読み込んで、たくさんの候補が選択できるようになります。
これで、倍精度浮動小数点数の配列が流れてくる入力データポート、recogResult が定義できました。
BuildViewはこのような形になっています。
コード生成を行ってください。
「'SchedulerService' is not found in IDL」が出るようなら、IDLのinclude文をコメントアウトします。
VisionManipulation.conf の内容を以下のように修正して、rtc.conf にシンボリックリンクを貼ります。
corba.nameservers: localhost:2809
exec_cxt.periodic.rate: 10
次に、idlcompile.sh を実行します。
エラーが出る場合は、スクリプトのコマンドラインに -I/usr/include を挿入して、やり直してください。
MyScheduler RTC が setModelID を呼び出すと、VisionManipulation では SchedulerService_i::setModelID が呼び出されます。
そこで、VisionManipulation_idl_example.py の該当部分を以下のように修正します。
# void setModelID(in long ModelID) def setModelID(self, ModelID): print "setModelID: %s" % ModelID coord = self.recogSDL_service._ptr().recognize_by_ID(ModelID) print "recognize_by_ID: %s" % coord
その結果はデータポート recogResultIn で受けることになります。
ところで、self.recogSDL_service はまだ定義していません。
これは、呼び出し元からセットしてもらうことにします。
SchedulerService_i クラスに新しいメソッドを追加します。
def setRecogSDLService(self, recogSDL_service): self.recogSDL_service = recogSDL_service
self._scheduler.setRecogSDLService(self._recogSDL)
def onExecute(self, ec_id): if self._recogResultIn.isNew(): print "resultIn:" indata = self._recogResultIn.read() val = indata.data print val print "\n" time.sleep(0.01) return RTC.RTC_OK