VRMLモデルの概要
OpenHRPでは、ロボットや環境を構成する物体のモデルを、3次元モデルを記述するための言語VRML2.0(Virtual Reality Markup Language)を用いて定義します。環境に存在する個体一つに対してファイルを一つ作成します。したがって、ある床面の上にロボットが立っている状況を表現したサンプルファイルの場合は、床とロボットそれぞれに対し1つずつ、合計2つのVRMLファイル(***.wrl)を作成することになります。
それぞれのVRMLファイルの基本的な構成は、
- 冒頭 :
- PROTO宣言部(構造体宣言部)
- 残り :
- 実モデル定義部(PROTOを用いたインスタンス表記部)
となります。
PROTO宣言部ではVRML97では定義されていない新たなノードを定義するため,C言語における構造体にあたる「PROTO」と呼ばれるノードを使います(詳しくは「PROTOノード」を参照)。
実モデル定義部は例えば人間型ロボットの場合,
Humanoid sample(一塊のモデルのルート)
+ Joint 腰部 (ヒューマノイドの中心。空中に浮遊する非固定点)
| ・・・・
| + Joint 胸部
| + Joint 頭部
| + Joint 左腕部
| + Joint 右腕部
|
+ Joint 左脚部
|
+ Joint 右脚部
となります。つまり、空中に浮いた”腰部”に”左脚”、”右脚”に対応する鎖と”胸部”へと繋がる鎖がつながっており、さらに”胸部”から、”頭”、”左腕”、”右腕”の鎖がつながっている、という構成です。
PROTOノード
OpenHRPでは、以下のようなPROTOノードの
インスタンスを組み上げていくことにより、モデルを作成します。PROTOノー
ドは、ヒューマンフィギュアを記述するためのフォーマット
h-anim1.1
で制定されているPROTOノードをOpenHRPモデル記述用に拡張/変更したものです。こ
れらのノードのインスタンスを組み合わせて階層構造を作ることで、モデルを
作成していきます。
また、上記3つのPROTOノードの他に、各種センサを定義するためのPROTOノードも用意されています。カメラ,6軸力センサ、ジャイロセンサ、加速度センサ,距離センサを階層中に埋め込むことにより、各種センサのシミュレーションを行うことが可能です。
以下、各ノードで定義する項目について説明していきます。
なお、各項目に対しユーザー値を陽に定義しなかった場合、下記の4列目に示されるデフォルト値が読み込まれることになります。
Humanoid
Humanoidノードは、モデルのルートノードです。
PROTO Humanoid [
field SFVec3f bboxCenter 0 0 0
field SFVec3f bboxSize -1 -1 -1
exposedField SFVec3f center 0 0 0
exposedField MFNode humanoidBody [ ]
exposedField MFString info [ ]
exposedField MFNode joints [ ]
exposedField SFString name ""
exposedField SFRotation rotation 0 0 1 0
exposedField SFVec3f scale 1 1 1
exposedField SFRotation scaleOrientation 0 0 1 0
exposedField MFNode segments [ ]
exposedField MFNode sites [ ]
exposedField SFVec3f translation 0 0 0
exposedField SFString version "1.1"
exposedField MFNode viewpoints [ ]
]
{
Transform {
bboxCenter IS bboxCenter
bboxSize IS bboxSize
center IS center
rotation IS rotation
scale IS scale
scaleOrientation IS scaleOrientation
translation IS translation
children [
Group {
children IS viewpoints
}
Group {
children IS humanoidBody
}
]
}
}
bboxCenter | OpenHRPでは使用しません。 |
bboxSize | OpenHRPでは使用しません。 |
center | Jointノードの "center" を参照してください。 |
humanoidBody | 子ノードをぶら下げるフィールドです。0個以上のJointノード、0または1個のSegmentノードをぶらさげます。 |
info | モデルに関するコメントを記述するフィールドです。 |
joints | 定義したJointの一覧を格納するフィールドです。 |
name | モデルの名前を指定するフィールドです。 |
rotation | Jointノードの "rotation" を参照してください。 |
scale | Jointノードの "scale" を参照してください。 |
scaleOrientation | Jointノードの "scaleOrientation" を参照してください。 |
segments | 定義したSegmentの一覧を格納するフィールドです。 |
sites | OpenHRPでは使用しません。 |
translation | Jointノードの "translation" を参照してください。 |
version | モデルのバージョン番号を指定するフィールドです。 |
viewpoints | 仮想環境における視点位置を指定するフィールドです。 |
モデルのルートノードとなるHumanoidノードがただ一つだけ存在するようにします。また、Humanoidノードのjoints/segmentsフィールドには、自分の使用したJoint/Segment名をすべて列挙します。
Joint
Jointノードはリンクフレームを定義します。
PROTO Joint [
exposedField SFVec3f center 0 0 0
exposedField MFNode children []
exposedField MFFloat llimit []
exposedField MFFloat lvlimit []
exposedField SFRotation limitOrientation 0 0 1 0
exposedField SFString name ""
exposedField SFRotation rotation 0 0 1 0
exposedField SFVec3f scale 1 1 1
exposedField SFRotation scaleOrientation 0 0 1 0
exposedField MFFloat stiffness [ 0 0 0 ]
exposedField SFVec3f translation 0 0 0
exposedField MFFloat ulimit []
exposedField MFFloat uvlimit []
exposedField SFString jointType ""
exposedField SFInt32 jointId -1
exposedField SFVec3f jointAxis 0 0 1
exposedField SFFloat gearRatio 1
exposedField SFFloat rotorInertia 0
exposedField SFFloat rotorResistor 0
exposedField SFFloat torqueConst 1
exposedField SFFloat encoderPulse 1
]
{
Transform {
center IS center
children IS children
rotation IS rotation
scale IS scale
scaleOrientation IS scaleOrientation
translation IS translation
}
}
center | 関節回転中心の位置を指定するフィールドです。ローカル座標系原点からのオフセットで指定します。 |
children | 子ノードをぶら下げるフィールドです。0個以上のJointノード、0または1個のSegmentノードをぶらさげます。 |
llimit(1) | 関節回転角度の下限値[rad]を指定するフィールドです。(デフォールト値:"-∞") |
lvlimit(1) | 関節回転角速度の下限値[rad/s]を指定するフィールドです。(デフォールト値:"-∞") |
limitOrientation | OpenHRPでは使用しません。 |
name | Joint名を指定するフィールドです。 |
rotation | ローカル座標系の姿勢を設定するフィールドです。親ノードからのオフセットを指定します。 |
scale | スケーリングを設定するフィールドです。centerで指定した位置を中心にスケーリングします。 |
scaleOrientation | スケーリングを行う際にスケーリングを行うための座標系の姿勢を設定するフィールドです。(定義しなくても問題なし) |
stiffness | OpenHRPでは使用しません。 |
translation | ローカル座標系の位置を設定するフィールドです。親ノードからのオフセット値を指定します。 |
ulimit(1) | 関節回転角度の上限値[rad]を指定するフィールドです。(デフォールト値:"+∞") |
uvlimit(1) | 関節回転角速度の上限値[rad/s]を指定するフィールドです。(デフォールト値:"+∞") |
jointType | 関節タイプを設定するためのフィールドです。free/slide/rotate/fixedのうちのいずれかを指定します。
- free
- 任意軸方向への並進・任意軸回りの回転が可能です(6自由度)。ルートの関節にのみ使用できます。
- rotate
- jointAxisで指定する軸回りの回転のみ可能です(1自由度)。
- slide
- jointAxisで指定する軸方向への並進直動関節となります(1自由度)。
- fixed
- 関節を固定します(自由度なし)。
|
jointId | 関節番号を指定するためのフィールドです。
jointIdは関節角度等の属性値を配列形式に並べて格納する際に何番目の要素に入れるかを指定するために利用されます。多くの場合,ロボットのコントローラ開発において関節角度を読み取ったり,指定したりできるのは制御可能な関節のみですから,そのような関節にjointIdを付ける、と考えていただければよろしいかと思います(必ずそうでなければならないということではありません)。以下、Idのつけ方に関するルールを示します。
- jointIdは0から始まる。
- jointIdには連続した整数値を用いる(間が空いたり,重複したりしていないこと)。
なお、本フィールドの型は OpenHRPの旧バージョンではSFFloat型でしたが、
version 3 より SFInt32型 となりましたので、ご注意ください。 |
jointAxis | 関節の軸を指定するためのフィールドです。
OpenHRPの旧バージョンでは文字列の"X", "Y", "Z"のいずれかで軸を指定していましたが、
OpenHRP3ではベクトルを用いて任意方向への軸を指定可能となっています。
旧バージョンの指定法もサポートはされますが、今後は新しい指定法をお使いください。 |
gearRatio | ギヤ比: モータから関節までの減速比が1/100で
あれば、100と記述します |
gearEfficiency | 減速器の効率。効率が 60%であれば0.6と記述します。
このフィールドがなければ、効率100%の減速器を想定します。 |
rotorInertia | モータ回転子の慣性モーメント [kgm^2] |
rotorResistor | モータコイルの抵抗 [Ohm] ※コントローラで
使用 |
torqueConst | トルク定数 [Nm/A] ※コントローラで使用 |
encoderPulse | エンコーダパルス数
[pulse/rotate] ※コントローラで使用 |
(1) : これらの値はシミュレーションでは使用されません。コントローラがこれらの値を読み込んで限界値を超えないように制御するために定義されているパラメータです。
関節は、Jointノードを用いて定義します。Jointノードは、リンクフレームの情報を含みます。関節の親子関係は、そのままJointノードの親子関係に対応します。例えば人間の腕を考えたとき、「肩→肘→手首」の順に関節が存在するわけですから、この場合のリンク構造はJointノードを用いて、
図1.腕のリンク構造
DEF 肩 Joint {
children [
DEF 肘 Joint {
children [
DEF 手首 Joint {
:
:
:
]
}
]
}
のように定義します。
1関節にn自由度(n≧2)を持たせたい場合、その関節は、原点が一致したn個の関節から構成されていると考えることが出来ます。この場合はリンクフレームの原点を重ねるようにしてJointをn個定義します。例えば人間の肘は下図のように2自由度存在すると考えられ、
図2.肘のリンク構造
この場合は、
DEF 肘0 Joint { ← 肘の曲げ
children [
DEF 肘1 Joint { ← 肘のひねり
:
:
:
}
]
translation 0 0 0 ← 座標原点を合わせる
}
のように定義します。
Segment
Segmentノードはリンク形状を定義します。
PROTO Segment [
field SFVec3f bboxCenter 0 0 0
field SFVec3f bboxSize -1 -1 -1
exposedField SFVec3f centerOfMass 0 0 0
exposedField MFNode children [ ]
exposedField SFNode coord NULL
exposedField MFNode displacers [ ]
exposedField SFFloat mass 0
exposedField MFFloat momentsOfInertia [ 0 0 0 0 0 0 0 0 0 ]
exposedField SFString name ""
eventIn MFNode addChildren
eventIn MFNode removeChildren
]
{
Group {
addChildren IS addChildren
bboxCenter IS bboxCenter
bboxSize IS bboxSize
children IS children
removeChildren IS removeChildren
}
}
bboxCenter | OpenHRPでは使用しません。 |
bboxSize | OpenHRPでは使用しません。 |
centerOfMass | 重心位置を指定するフィールドです。 |
children | 子ノードをぶら下げるフィールドです。ここに、形状を定義するノードを追加します。 |
coord | OpenHRPでは使用しません。 |
displacers | OpenHRPでは使用しません。 |
mass | 質量を指定するフィールドです。 |
momentsOfInertia | 重心位置回りの慣性テンソルを指定するフィールドです。 |
name | Segment名を指定するフィールドです。 |
addChildren | OpenHRPでは使用しません。 |
removeChildren | OpenHRPでは使用しません。 |
リンク形状は、Segmentノードに定義します。Segmentノードは、Jointノードの子ノードとして複数個設定でき、Transformノードの子ノードとして記述することも可能です。
DEF JOINT1 Joint {
children [
DEF SEGMENT1 Segment {
children [
:
]
}
Transform {
translation 0 0 0.5
rotation 1 0 0 1.57
children DEF SEGMENT2 Segment {
children [
:
]
}
}
]
}
例えば、人間の肩から肘にかけての形状を定義したい場合、この形状が肩のリンクフレームに属するとすると、
図3.肩から肘にかけての形状
DEF 肩 Joint {
children [
DEF 肩から肘 Segment {
children [
:
: ←ここに実際の形状を記述する
:
]
}
DEF 肘 Joint {
:
:
:
}
]
}
のように構造を定義します。
Segmentノードのchildrenフィールド下に実際の形状を定義します。形状の定義にはモデリングツールを使用されることをお勧めします。簡単な形状であればテキストエディタを使用して手作業で編集することも可能です。
ExtraJoint
ExtraJointノードは閉リンク機構を定義します。閉リンクの1つの関節がボールジョイントで接続されていると考え、2つのリンクが離れないように拘束力を発生させます。
PROTO ExtraJoint [
exposedField SFString link1Name ""
exposedField SFString link2Name ""
exposedField SFVec3f link1LocalPos 0 0 0
exposedField SFVec3f link2LocalPos 0 0 0
exposedField SFString jointType "xyz"
exposedField SFVec3f jointAxis 1 0 0
]
{
}
link1Name | ボールジョイントを受けているジョイント名を指定します。 |
link2Name | ボールジョイントが付いているジョイント名を指定します。 |
link1LocalPos | link1Nameジョイントの拘束位置をそのジョイントのローカル座標で指定します。 |
link2LocalPos | link2Nameジョイントの拘束位置をそのジョイントのローカル座標で指定します。 |
jointType | 拘束する軸数を指定します。xyz:互いに直交する3軸 xy:jointAxisで指定した軸に直交する2軸 z:jointAxisで指定した1軸 |
jointAxis | link1Nameジョイントのローカル座標で単位ベクトルを指定します。ベクトルの意味は、jointTypeの指定で変わります。 |
閉リンク機構のサンプルclosed-link-sample.wrlが、サンプルモデルにありますので、参考にして下さい。
AccelerationSensor
AccelerationSensorノードは、3軸加速度センサを定義します。
PROTO AccelerationSensor [
exposedField SFVec3f maxAcceleration -1 -1 -1
exposedField SFVec3f translation 0 0 0
exposedField SFRotation rotation 0 0 1 0
exposedField SFInt32 sensorId -1
]
{
Transform {
translation IS translation
rotation IS rotation
}
}
maxAcceleration | 計測可能な最大加速度を指定します。 |
translation | ローカル座標系の位置を、親ノード座標系からのオフセット値で指定します。 |
rotation | ローカル座標系の姿勢を、親ノード座標系からのオフセット値で指定します。 |
sensorId | センサのIDを指定します。センサIDは一つのモデル内の同一種類のセンサに対して0番から順に番号の飛びや重複がないように設定して下さい。このIDは同一種類のセンサからのデータを並べる際に順番を決定するために使用されます。 |
各種センサノードはそのセンサが取り付けられているJointノードの下に取り付けます。
例えば、サンプルモデルの腰部(WAIST)に加速度センサを取り付けられている場合は、次のように記述します。
DEF WAIST Joint
{
:
children [
DEF gsensor AccelerationSensor
{
:
}
:
]
}
GyroSensor
Gyroノードは、3軸角速度センサを定義します。
PROTO Gyro [
exposedField SFVec3f maxAngularVelocity -1 -1 -1
exposedField SFVec3f translation 0 0 0
exposedField SFRotation rotation 0 0 1 0
exposedField SFInt32 sensorId -1
]
{
Transform {
translation IS translation
rotation IS rotation
}
}
maxAngularVelocity | 計測可能な最大角速度を指定します。 |
translation | ローカル座標系の位置を、親ノード座標系からのオフセット値で指定します。 |
rotation | ローカル座標系の姿勢を、親ノード座標系からのオフセット値で指定します。 |
sensorId | センサのIDを指定します。 |
VisionSensor
VisionSensorノードは、視覚センサを定義します。
PROTO VisionSensor
[
exposedField SFVec3f translation 0 0 0
exposedField SFRotation rotation 0 0 1 0
exposedField SFFloat fieldOfView 0.785398
field SFString name ""
exposedField SFFloat frontClipDistance 0.01
exposedField SFFloat backClipDistance 10.0
exposedField SFString type "NONE"
exposedField SFInt32 sensorId -1
exposedField SFInt32 width 320
exposedField SFInt32 height 240
exposedField SFFloat frameRate 30
]
{
Transform
{
translation IS translation
rotation IS rotation
}
}
translation | 視点の位置を、親ノード座標系からの相対位置で指定します。 |
rotation | 視点の姿勢を、親ノード座標系からの相対姿勢で指定します。
視点の姿勢は以下のように定義されます。
- 視線前方向 ・・・ ローカル座標系でZ軸の負の向き
- 視線上方向 ・・・ ローカル座標系でY軸の正の向き
|
fieldOfView | カメラの視野角度を指定します。単位はradで、(0, pi)の値が設定可能です。 |
name | センサの名称を指定します。 |
frontClipDistance | 視点から前クリップ面までの距離を指定します。 |
backClipDistance | 視点から後クリップ面までの距離を指定します。 |
type | センサから取得する情報の種類を指定します。
- "COLOR"
- 色情報を取得します。
- "DEPTH"
- 深さ情報を取得します。
- "COLOR_DEPTH"
- 色情報と深さ情報を取得します。
- "NONE"
- いずれの情報も取得しません。
|
sensorId | センサのIDを指定します。 |
width | 画像の幅を指定します。 |
height | 画像の高さを指定します。 |
frameRate | カメラが毎秒何枚の画像を出力するかを指定します。 |
ForceSensor
ForceSensorノードは、力/トルクセンサを定義します。
PROTO ForceSensor [
exposedField SFVec3f maxForce -1 -1 -1
exposedField SFVec3f maxTorque -1 -1 -1
exposedField SFVec3f translation 0 0 0
exposedField SFRotation rotation 0 0 1 0
exposedField SFInt32 sensorId -1
]
{
Transform {
translation IS translation
rotation IS rotation
}
}
maxForce | 計測可能な力の最大値を設定します。 |
maxTorque | 計測可能なトルクの最大値を設定します。 |
translation | ローカル座標系の位置を、親ノード座標系からのオフセット値で指定します。 |
rotation | ローカル座標系の姿勢を、親ノード座標系からのオフセット値で指定します。 |
sensorId | センサのIDを指定します。 |
RangeSensor
RangeSensorノードは、距離センサを定義します。
PROTO RangeSensor [
exposedField SFVec3f translation 0 0 0
exposedField SFRotation rotation 0 0 1 0
exposedField MFNode children [ ]
exposedField SFInt32 sensorId -1
exposedField SFFloat scanAngle 3.14159 #[rad]
exposedField SFFloat scanStep 0.1 #[rad]
exposedField SFFloat scanRate 10 #[Hz]
exposedField SFFloat maxDistance 10
]
{
Transform {
rotation IS rotation
translation IS translation
children IS children
}
}
translation | このセンサが取り付けられているリンクに対するこのセンサの位置 |
rotation | このセンサが取り付けられているリンクに対するこのセンサの姿勢。センサ座標系において、Z軸マイナス方向が計測正面、スキャンする場合の計測面はXZ平面となります。
これはVisionSensorと同じですので、従来VisionSensorで代用していたモデルを変更する場合は
位置、姿勢はそのまま使えます。 |
sensorId | このロボットに取り付けられているRangeSensorの中での通し番号 |
scanAngle | 距離をスキャンする角度[rad]。0度を中心として、その両側にscanStepの倍数の角度でscanAngleの範囲内の角度が計測されます。センサにスキャン機能がない場合は0とします。 |
scanStep | スキャン中に距離が計測される角度の刻み[rad] |
scanRate | 1秒間あたり行うスキャン回数[Hz] |
maxDistance | 計測可能な最大距離[m] |
|