PR

RTコンポーネント開発を始めよう

2009年6月9日(火)
菅 佑樹

イベント・ハンドラの実装

 それでは、いよいよコーディングです。

 RTCでは、いくつかのイベント・ハンドラを実装することで処理を実現しま す。ここで紹介するのは、「onActivated」「onDeactivated」「onExecute」の3つのメソッドです。

 onActivatedは、RTCがアクティブ化された時点で1度だけ呼び出される関数です。同様にonDeactivatedは、RTCがディアクティブされた時点で呼ばれます。ここに初期化処理や、終了処理を記述することが多くなります。

 onExecuteは、いわゆるタイマ処理です。 前のページで説明した「Execution Rate」はこれにかかわってきます。100と入力したので、1秒間に100回、onExecuteが呼ばれるということです。

 これらのイベント・ハンドラは「Binarize.h」と「Binarize.cpp」の中に書かれていますが、生成された時点ではコメントアウトされています。まずはこのコメントを外して、機能を追加していくことになります。

 紙面の都合上、OpenCVを使ったコアロジックまで踏み込んで説明はしません。詳しい内容は、サンプルコードをダウンロード(BinarizeCompProj.zip)して確認してください。ここではRTCのデータポートを使う部分に関して説明をします。

==========

RTC::ReturnCode_t Binarize::onExecute(RTC::UniqueId ec_id) {
  if(m_inIn.isNew()) {  // もし入力ポートにデータが書き込まれていたら。
    m_inIn.read();  // データの読み込み
    if(m_in.data.length() != 320*240*3) {  // 読んだ画像のサイズが
320x240ではないなら
      return RTC::RTC_ERROR; // エラー状態に移行
    }

    …ここで何らかの処理を行う…

    m_out.data.length(320*240*3);  // 出力バッファのサイズ確保
    memcpy(&(m_out.data[0]), m_pDistImage, 320*240*3);  // 出力
バッファへのデータコピー
    m_outOut.write();  // 出力ポートの書き込み
  }  // if(m_inIn.isNew())
  return RTC::RTC_OK;
}

==========

 InPortでデータを読み込む場合は、まずポート(ここでは「m_inIn」)isNew()関数を使ってデータが書き込まれているか確認し、read()関数でデータを受け取ります。read()が呼ばれるとデータ格納用変数(ここでは「m_in」)にデータが格納されています。

 OutPortでデータを書き出すときはこの逆になります。データ格納用変数にデータを入れ、OutPortのwrite()関数でデータを書き出します。

 データ型にシーケンス型を設定している場合は、データ格納用変数にlength()関数が用意されています。引数をとらないlength()は受け取ったデータの配列の長さを返します。引数をとるlength()は、書き込む前に配列の長さを設定するときに使います。詳しくはソースコードを読んでみてください。

rtc.confの設定と実行

 さて、コーディングが終わった時点で、デバッグが始まりますが、実行前にもう1つ設定するものがあります。それが「rtc.conf」です。

 rtc.confには,実行周期やネームサーバの位置、コンフィグレーション(後述)などを設定することができます。このファイルは実行ファイルと同じフォルダに置くか、VC++からデバッグで実行する場合はプロジェクトがあるフォルダと同じ位置に置きます。

 プロジェクトのフォルダにrtc.confが生成されていますが、中を見ると「exec_cxt.periodic.rate:100.0」としか書かれていません。これにネームサーバに関する情報を追加する必要があります。「corba.nameservers: localhost」 という行を追加してください。

 いよいよ実行です。まずPCにUSBカメラを接続します。

 さらに前回と同様に、ネームサーバ、RT System Editorを実行して、「USBCameraAcquire」「USBCameraMonitor」を実行します。

 つぎに開発したBinarizeCompを実行して、図3のように接続を行い、Activateします。

 いかがでしょうか。紙面の都合上説明をかなり省きましたが、まずはサンプル コードをダウンロードして、コンパイルして実行することから始めてください。次にご自身で、RTC Builderでスケルトンコードを生成し、コアロジックをサンプルから移植してみましょう。

 次回は、再コンパイルすることなくしきい値などの設定を変更できる「コンフィグレーション」について解説します。


【参考文献】

奈良先端科学技術大学院大学 OpenCVプログラミングブック制作チーム 『OpenCV プログラミングブック』毎日コミュニケーションズ

長瀬 雅之ほか
『はじめてのコンポーネント指向ロボットアプリケーション開発 ~RTミドルウェア超入門~』毎日コミュニケーションズ

早稲田大学
早稲田大学創造理工学部総合機械工学科助手。博士(工学)。人間とロボットとの物理的な相互作用と飽きに関する研究に従事。その他に木登り・枝打ちロボットや、車椅子搭載型ロボットアームの開発などに携わる。計測自動制御学会RTミドルウェア賞受賞(2008年)。http://www.ysuga.net

Think IT会員サービス無料登録受付中

Think ITでは、より付加価値の高いコンテンツを会員サービスとして提供しています。会員登録を済ませてThink ITのWebサイトにログインすることでさまざまな限定特典を入手できるようになります。

Think IT会員サービスの概要とメリットをチェック

他にもこの記事が読まれています

RTコンポーネント開発を始めよう | Think IT(シンクイット)

Think IT(シンクイット)

サイトに予期せぬエラーが起こりました。しばらくたってから再度お試しください。