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 
      }
    ]
  }
}

bboxCenterOpenHRPでは使用しません。
bboxSizeOpenHRPでは使用しません。
centerJointノードの "center" を参照してください。
humanoidBody子ノードをぶら下げるフィールドです。0個以上のJointノード、0または1個のSegmentノードをぶらさげます。
infoモデルに関するコメントを記述するフィールドです。
joints定義したJointの一覧を格納するフィールドです。
nameモデルの名前を指定するフィールドです。
rotationJointノードの "rotation" を参照してください。
scaleJointノードの "scale" を参照してください。
scaleOrientationJointノードの "scaleOrientation" を参照してください。
segments定義したSegmentの一覧を格納するフィールドです。
sitesOpenHRPでは使用しません。
translationJointノードの "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]を指定するフィールドです。(デフォールト値:"-∞")
limitOrientationOpenHRPでは使用しません。
nameJoint名を指定するフィールドです。
rotationローカル座標系の姿勢を設定するフィールドです。親ノードからのオフセットを指定します。
scaleスケーリングを設定するフィールドです。centerで指定した位置を中心にスケーリングします。
scaleOrientationスケーリングを行う際にスケーリングを行うための座標系の姿勢を設定するフィールドです。(定義しなくても問題なし)
stiffnessOpenHRPでは使用しません。
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
  }
}

bboxCenterOpenHRPでは使用しません。
bboxSizeOpenHRPでは使用しません。
centerOfMass重心位置を指定するフィールドです。
children子ノードをぶら下げるフィールドです。ここに、形状を定義するノードを追加します。
coordOpenHRPでは使用しません。
displacersOpenHRPでは使用しません。
mass質量を指定するフィールドです。
momentsOfInertia重心位置回りの慣性テンソルを指定するフィールドです。
nameSegment名を指定するフィールドです。
addChildrenOpenHRPでは使用しません。
removeChildrenOpenHRPでは使用しません。

リンク形状は、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ボールジョイントが付いているジョイント名を指定します。
link1LocalPoslink1Nameジョイントの拘束位置をそのジョイントのローカル座標で指定します。
link2LocalPoslink2Nameジョイントの拘束位置をそのジョイントのローカル座標で指定します。
jointType拘束する軸数を指定します。xyz:互いに直交する3軸 xy:jointAxisで指定した軸に直交する2軸 z:jointAxisで指定した1軸
jointAxislink1Nameジョイントのローカル座標で単位ベクトルを指定します。ベクトルの意味は、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]
scanRate1秒間あたり行うスキャン回数[Hz]
maxDistance計測可能な最大距離[m]