経緯

OpenHRP3.0では距離センサは、タイプをDEPTHとしたVisionSensorの出力で代用していましたが、以下のような問題がありました。
  • Java3D 1.5以降ではデプスバッファの取得部分にバグがあり、1.4を使い続ける必要があった。
  • 1.4でもオフスクリーンレンダリングがうまくいかず、ウィンドウを常に前面に出しておく必要があった
  • 32bitのデプスバッファでは距離の分解能が不足していた。
そこでOpenHRP3.1では干渉チェックの為に使用しているOPCODEの半直線とポリゴンの干渉チェック機能を使用して距離センサをシミュレートする機能を実装しました。

センサのモデルへの追加

距離センサをモデル上に定義するには、RangeSensorノードのプロトタイプ宣言を距離センサを搭載するロボットのVRMLモデルの先頭部分に追加し、センサが取り付けられているリンクに対応するJointノードのchildrenフィールドにRangeSensorノードをぶら下げます。

GrxUI上でのセンサ出力の確認

GrxUI上では3DViewあるいはRangeSensorViewを使ってセンサの出力を視覚的に確認することができます。 ItemViewからモデルツリーを展開し、表示したいRangeSensorを選択すると、3DView上に計測結果が半透明のポリゴンとして表示されます。シミュレーション開始前は計測範囲に対応する扇形が表示され、シミュレーションを開始すると計測した距離に応じた形状に変化します。 またRangeSensorViewをEclipseのメニューから選択して表示し、ビューの上部にあるモデル名とセンサ名を選択すると、円と計測結果が表示されます。円はRangeSensorノードのmaxDistanceフィールドで設定した距離の円です。

ControllerBridge経由でのセンサ出力の取得

コントローラブリッジ経由でセンサ出力を取得するには、以下のようなオプションをopenhrp-controller-bridgeの引数として与えます。
 --out-port range:URG_SENSOR0:RANGE_SENSOR
出力されるのはTimedDoubleSequenceでシーケンス部分に計測方向に向かって右方向からスキャンした際の距離データが入っています。距離は干渉が発生する限り、maxDistanceよりも遠い場合も出力されます。干渉がない場合は0が出力されます。