fkanehiro / openhrp3

Open Architecture Human-centered Robotics Platform
http://www.openrtp.jp/openhrp3
Other
24 stars 33 forks source link

不連続なsensorIdを持つモデルにおいてBody::numSensorsがセンサの総数を返さない #125

Closed orikuma closed 7 years ago

orikuma commented 7 years ago

同一のセンサ型で不連続なsensorIdを持つVRMLモデルにおいて, Body::numSensorsがセンサ総数を正しく返さず, 最大のsensorId+1を返します. この状態で欠けているsensorIdにBody::sensorなどでアクセスするとNULLが返ります. これは仕様でしょうか?

例: sensorIdが0と2(1は存在しない)のVisionSensorを持つVRMLを読み込むと, センサ総数は2であるにも関わらずnumSensors(hrp::Sensor::VISION)が3を返します. またsensor(hrp::Sensor::VISION, 1)はNULLを返します. (sample1.wrlのVISION_SENSOR1のsensorIdを1から2にすることで再現可能)

原因: Bodyにおいてセンサ情報を格納する配列のindexをsensorIdにしていることが原因です. 具体的には, https://github.com/fkanehiro/openhrp3/blob/master/hrplib/hrpModel/Body.cpp#L601 においてセンサ配列をsensorId+1に拡張し, sensor[id]にセンサ情報を格納しているため sensorIdが不連続な場合, Body::numSensorsはセンサ総数を返しません(最大のsensorId+1を返す). また存在しないsensorIdについて, sensor[id]はNULL(0)になります.

YoheiKakiuchi commented 7 years ago

ちゃんと確認したことはなかったですが、このページによると仕様のようです。 https://fkanehiro.github.io/openhrp3-doc/jp/create_model.html

ID(sensorIdとJointId)と書いてありますがコード上はidentificationではなくて、index numberとして使われて いるように見えます。

snozawa commented 7 years ago

https://github.com/start-jsk/rtmros_common/pull/1012#issuecomment-304750373 にもコメントさせていただいてますが,そもそも  VRMLが不連続なsensorIdをもつ というのが想定されてないコードが多々あるように思え, これをサポートするのは非常に困難かとなんとなく思います

不連続なsensorIdはややトリッキーかと思いますので, VRMLのsensorIdを変更して連続にするのがもっとも良いと思います. もしくは,(そういう状況があるかわからないですが) いずれかのVRMLファイルが部分的??にclosedなどで変更できない, というような場合でも, (今回の例では)VRMLにsensorId=1となるダミーなセンサを記述して, 連続のsensorId id = [0, 1, 2]をもつように変更するのもやぶさかではないくらいかと思います.

orikuma commented 7 years ago

OpenHRPのOfficial Homepageに仕様である旨記載があったのですね. 確認不足でした. 申し訳ございません. 不連続なsensorIdについては仕様として想定されていないということで承知いたしました. この件につきましては, VRML側を修正することで対処させていただきたく思います. お忙しいところ対応いただきありがとうございました.