イベントハンドラの実装

イベントハンドラの実装

 使用するイベントハンドラはonExecuteのみです。スケルトンコードからonExecute部分のコメントをはずしてください。

 まず、画像処理RTCからの入力があった場合、画像中の物体のx位置座標(水平方向)が正しい値(0~320)であるか確認し、正しい値であった場合は物体が認識できた、として以下の処理をします。

・それまで物体が認識できていなかった場合は、新たにカメラ前に物体が現れたとし、音声合成RTCに「こんにちは」というせりふを送信する
・物体が認識できている場合は、物体の重心位置と、画像中の中心位置とのずれをモータへの角度指令に換算し、物体の方向にカメラを向ける
・物体が認識できない場合は、モータの角度を0度の位置に向ける

サンプルコードはこちらからダウンロードしてください。

RTC::ReturnCode_t RobotMain::onExecute(RTC::UniqueId ec_id)
{
  if(m_inIn.isNew()) { // もし画像処理結果を受け取ったら
    m_inIn.read();
    if(m_in.data.length() == 2) {
      double x = m_in.data[0]; // xは横[0, 320]
      double y = m_in.data[1]; // yは縦[0, 240],ただし原点は画像左上

      static int inSightFlag; // 物体が見えている状態フラグ
      static float motor_target_radian; // モータの目標位置
      if(x >= 0 && x < 320) { // 画像内に明るい物体がある
        if(!inSightFlag) { // 今までは見えていなかったら
          const char* str = "こんにちわ"; // 台詞を送信
          m_stringOut.data = str;
          m_stringOutOut.write();
          inSightFlag = 1;
        }
        float pos_x = (float)(x - 160.0); // 物体のx方向位置
        motor_target_radian += 0.10f * pos_x / 160; // モータ目標値計算
        m_motorOut.data = motor_target_radian; // モータ目標値送信
        m_motorOutOut.write();
      } else { // 見えなくなったら
        inSightFlag = 0; // フラグOFF
        motor_target_radian *= 0.8f; // モータ目標値がゼロに近づく
        m_motorOut.data = motor_target_radian; // モータ目標値送信
        m_motorOutOut.write();
      }
    }
  }
  return RTC::RTC_OK;
}

図2-1:イベントハンドラの実装

-------------------------------------------

図2-2:今回作成したロボットの動作

RTシステムの動作

 まず、これまでの記事で開発したRTCの実行ファイルとrtc.conf、および使用するライブラリ群 (rtc.zip:RTCs.zip) をダウンロードしてください。

 ロボットは前回(http://thinkit.jp/article/963/1/) 作成したRCサーボ制御のテスト機を使います。RCサーボのサーボホーンの上に両面テープなどでカメラを設置してください。

 RCサーボをお持ちでない方も、カメラおよび音声合成の部分のみで動作確認ができます。

 いつもどおり、ネームサーバーを起動し、RT System Editorを起動したのち、「USBCameraAcquire(OpenRTM-aistのサンプル)」「BinarizeComp(第2回で作 成)」「AquesTalkVoiceComp(第3回で作成)」「iMCs04ControlComp(第4回で作成)」を実行し、今回の RobotMainCompを実行します。

 RT System EditorでRTCを接続し、すべてのRTCをActivateします。ロボットの動作は図2-2の動画を見てください。

 場合によっては、カメラの画角が狭く動作がぎこちなく感じることがあると思います。お使いのカメラやサーボにあわせてモータへの指令値を調整するとよい でしょう。係数をコンフィグレーションとするとよいかもしれません。

 また第2回で開発した画像処理RTCにコンフィグレーションを追加し、2値化処理のしきい値を変更できるようにすると効果的です。

人気記事トップ10

人気記事ランキングをもっと見る

企画広告も役立つ情報バッチリ! Sponsored

ClickHouse Cloudが実現した広告運用SaaS「ATOM」のデータ基盤革新、パフォーマンスを向上しながら、運用負荷とコストを削減 11月11日 6:20 AIで開発が加速する時代、品質保証はどう変わる? Tricentisが示すAIエージェント活用の実像 11月9日 6:45 悪用までの猶予が「1分」に迫るフロンティアAI時代に開発と本番を貫く脆弱性管理が必要 10月29日 8:30 欧州CRA対応とSBOM運用。AI生成コードのOSS混入問題の対策とは ――スニペット単位で検出する「FossID」「Insignary Clarity」によるSBOM運用 9月16日 6:40 PostgreSQLからTiDBへ、稼働中SaaSで進める段階的DB移行の実践と再設計への展望 9月7日 6:30 機能安全開発におけるGoogleTestの活用を支援!「Parasoft C/C++test CT」で実現する効率化&AI連携 4月14日 6:30 【CNDW2025】Grafanaが明かす「オブザーバビリティの哲学」ー最小限の労力で実用的なインサイトを得るには 1月23日 6:30 【CNDW2025】プロダクト急増に備える基盤刷新 ーウェルスナビがECSからEKSへの移行で得た知見とは 1月15日 6:30 【CNDW2025】250環境を5人で運用、構築時間は30分に ーKINTOテクノロジーズが語るインフラ基盤組織の作り方 2025年12月18日 6:30 新たな自動化で熱視線! AIエージェントの「推論能力」を支える2つのコンポーネントとは? 2025年11月28日 6:30