視覚センサのON/OFFとBest Effort Modeについて

カメラやRGBDカメラ、レーザーレンジセンサ等の視覚センサについて、シミュレーション中に動作のON/OFFをできるようにしました。

視覚センサを多数搭載したロボットの場合、それらを全て同時にシミュレートすると、その分シミュレーションが遅くなってしまう可能性があります。センサの解像度が高かったり、フレームレートが高かったり、環境が複雑だったりする場合は特にその傾向が大きくなります。

しかしもし全ての視覚センサを同時に使わなくてもよいのであれば、一時的に使わないセンサはオフとしておくことで、シミュレーション速度の低下を抑えることができます。

ON/OFFの方法ですが、Choreonoid内部のセンサオブジェクト(デバイスオブジェクト)に

  • void on(bool on);
  • bool on() const;

というメンバ関数があります。最初の関数でON/OFFの状態を切り替えることができ、2番めの関数で現在のON/OFF状態を知ることができます。

例えばシンプルコントローラでしたら、該当するセンサがcameraだとすると、

camera->on(false);
camera->notifyStateChange();

とすることでカメラをオフにできます。再びオンにするときは、上記のfalseをtrueに変えて実行します。

このサンプルとして、sample/SimpleController/TankVisionSensors.cnoid のサンプルプロジェクトに、視覚センサのオンオフ機能を導入しました。

Tankモデル(share/model/Tank以下)は、視覚センサとして

  • RGBDカメラ (名前:Kinect)
  • 全方位カメラ (名前: Theta)
  • 全方位レーザーレンジセンサ (名前: VLP-16)

を搭載しているのですが、サンプルではゲームパッドのB、X、Yボタンで上記のセンサのON/OFFを切り替えられるようにしています。
切り替えのコードについては、sample/SimpleController/TankJoystickController.cpp をご参照ください。

BodyIoRTCでも同様にしてON/OFFを切り替えるポートを作れると思います。

また、この改良に伴い、AizuSpider、DoubleArmV7のモデルについて、搭載されているカメラの多くをデフォルトではOFFとしておきました。これはモデルファイル中の対象センサの記述において、

on: false

とすることで設定しています。

それらのセンサについては、使用する場合は明示的にONにして使用するようにしてください。またこれらのモデルは搭載センサの数が多いため、なるべく必要なセンサだけを使うようにした方がよいと思います。

そしてもう一点重要な点として、視覚センサのシミュレーションを行うGLVisionSimulatorアイテムについては、「ベストエフォートモード」というプロパティがあります。これをtrueにしておくと、シミュレーションにおいて負荷が高くなり各センサのフレームレートを達成できない状況でも、そこでシミュレーションをブロックせずに、最大限可能なフレームレートを実現するという動作となります。逆にここがfalseだと、スペック上のフレームレートを必ず実現するのですが、それを達成するためにシミュレーションが遅くなってしまうことがあります。

デフォルトでベストエフォートモードはfalseとなっておりますが、使用するセンサの数が多くて、フレームレートの達成がそこまで重要でない場合は、これをtrueとすることでシミュレーション速度が改善します。

WRSのシミュレーションでも、このプロパティは基本的にtrueとして有効にしておくことにしたいと思います。WRSのサンプルについてこれまでは有効になっていなかったのですが、githubの最新版では有効になるようにしましたので、参加者各位のプロジェクトにおいてもこれを取り込んでいただきますようお願いします。

VisionSensorIoRTCの初期化の際かシミュレーション開始の際に,各カメラがオンかオフか表示できるようにできないでしょうか.

また,親のボディファイルに応じて出力ポートが作られるのと同じように,オンオフを制御する例えばbool型の入力ポートが作られるようにできないでしょうか?性質的には,データポートではなく,サービスポートのような気もします.

いずれも自分でやってみようと調べたのですが,VisionSensorIoRTCの理解が進みません.

今これに関するサンプルを作成中です。
恐らく週明けになるかと思いますが、完成しましたらお知らせします。

ありがとうございます!
よろしくお願いいたします.

OpenRTMのサンプルに以下を導入しました。

  • シミュレーション開始の際に各視覚センサがオンかオフか表示する
  • 視覚センサのオンオフをbool型のポートを用いて行う

サンプルは、sample/OpenRTM/以下の

  • OpenRTM-TankVisionSensors.cnoid
  • OpenRTM-TankVisionSensors-NewIDL.cnoid

のプロジェクトに導入しています。

上記ポートを用いて、ゲームパッドのボタンでそれぞれ以下のデバイスのON/OFFを切り替えられるようになっています。

  • A(X)ボタン: ライト
  • B(◯)ボタン: RGB-Dカメラ(Kinect)
  • X(□)ボタン: 全方位カメラ(Theta)
  • Y(△)ボタン: LIDARセンサ(VLP-16)

Tankモデルの初期状態を反映して、ライトとRGB-Dカメラは初期状態でON、全方位カメラとLIDARセンサについては初期状態でOFFとなっています。OFFのデバイスは対応するボタンを押すとONになりますので、試してみてください。

なお、今回は「現在のON/OFF状態を出力・入力する」ポートは設けていないため、各デバイスのON/OFFに関する初期状態が不明となっています。これもあって初期状態はOFFという仮定でON/OFFの切り替えをするようにしているので、初期状態でONのデバイスは最初にボタンを押してもすぐにはOFFにならず、2回目でOFFになるようになっています。

今回の改良に対応するコードは、VisionSensorIoRTC.cpp になります。またON/OFFの切り替え用の出力ポートは TankJoystickControllerRTC.cpp に実装しています。

大変ありがとうございます.

OpenRTM-TankVisionSensors.cnoidで新機能を確認しました.このプロジェクトはいいですね.Choreonoidのいい所がぎゅっと詰まっています.これを参考に私供のチームのシステムに取り込みます.

ところで,前から気になっているのですが,VisionSensorIoRTCにおいて,format: COLOR_DEPTHのデバイスに対応して2つの出力ポートが作られ,色付きの点群だけでなく,通常の画像も出力されます.この通常の画像出力は必要でしょうか?

点群に合わせて解像度を低くするので,通常の画像としては不十分です.通常の画像が欲しければ,同じ位置にformat: COLORのカメラを設置すれば済みます(シミュレーションであれば,全く同じ位置にすることも可能です).というようなことから不要ではないかと思うのですが,いかがでしょうか?

また,この仕様のため,今回追加された視覚センサのON/OFFにおいても,入力ポートと出力ポートが1対1に対応していません.

OpenRTM-TankVisionSensors.cnoid のTerminal側の機能について質問があります.

コントローラを操作して砲台を動かしても,Terminal Sceneの中のロボットのモデルの砲台は動きません,また点群はワールド座標系で描画されているようで,センサの姿勢の変更が反映されません.RTMの枠組みでロボット側から操縦側へ関節角度を送ることはできると思います.その後,操縦側のロボットのモデルには反映させたり,点群のデータを座標変換したりすることは可能でしょうか?

この通常の画像出力は必要でしょうか?

format: COLOR_DEPTH については、通常のカメラに深度データもプラスされるというもので、カメラの機能も兼ね備えています。従って、この場合でも通常のカメラ画像用のポート型でも出力するようにすることで、カメラ画像用の機能もそのまま使えるようになりますので、意図的にカメラ画像のポートも含めるようにしています。ポイントクラウドとして3次元の可視化も行いたいが、同時に2次元の画像ビュアーでも見れるようにしたい、といったニーズもあるかと思いますので。

確かにそれが必要ないこともあるとは思うのですが、その場合はカメラ画像のポート出力を行わないBodyIoRTCを用意することができるかと思います。

サンプルとして用意しているVisionSensorIoRTCにおいても、設定オプションを追加するなどして、カメラ画像出力用ポートをつけるかつけないかを切り替えると言ったことは可能かと思います。今そこまで対応できていませんが、要望が多ければそのような対応も検討したいと思います。

そのような機能をサンプルに追加してみました。

これまで視覚センサのデータの受信に使っていたVisionSensorSubscriberRTCItemを、より一般的な BodyStateSubscriberRTCItemに変更し、その中にとりあえず関節角を入力する “q” というポートを追加してみました。

これを用いてOpenRTM-TankVisionSensors.cnoidのプロジェクトを改良し、Tankモデルの砲台の関節もリモート側に取り込まれるようにしました。

なお、互換性のためVisionSensorSubscriberRTCItemも使えるようにしていますが、今後は新しいBodyStateSubscriberRTCItemの方を正式な機能としていきたいと思っています。

確認しました。ありがとうございます。
私のイメージしたものです。WRSにおいて操縦側にもChoreonoidを使うチームにとっては強力な手段ですね。私どものチームは操縦側はChoreonoidではないのですが、この方法も使いたくなりました。