カメラや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の最新版では有効になるようにしましたので、参加者各位のプロジェクトにおいてもこれを取り込んでいただきますようお願いします。