GrxUIを用いたモデル作成
GrxUIを用いてOpenHRPで使用可能なVRMLモデルを作成する方法を説明します。
(注意:以下のスクリーンショットと実際の画面では表示される内容が多少異なる場合があります。)
準備するもの
以下のデータを準備して下さい。
- 各リンクの質量、リンク原点相対での重心位置、重心まわりの慣性マトリクス、形状データ。形状データはCAD等から出力した通常の(OpenHRPによる拡張が施されていない)VRML97形式のファイルとしてご用意下さい。
- 各リンクの位置関係
- 各センサの取り付け位置、姿勢
モデル作成の開始
GrxUIのアイテムビューに表示されている、Modelアイテムを右クリックし、createメニューを選択します。
以下のようにロボット(ロボットのアイコン)とそのルートとなるリンク(関節を表すアイコン)が一つ作成されます。
ツリーの作成
リンクアイテムを右クリックすると、以下のようなメニューが表示されます。"add joint", "add sensor", "add segment"を選択することでこのリンクの子となるリンク、このリンクに取り付けられているセンサ、このリンクのセグメントデータをそれぞれ設定することができます。また"add robot"を選択することで、既に作成されたモデルファイルを読み込むことができます。
これらのメニューを選択して必要なアイテムを追加していくことでロボットのツリーを作成していきます。
子リンクの追加
リンクの右クリックで出てくるメニューから"add joint"を選択すると、下のようなダイアログが出てきますので子リンクの名前を入力し、OKを押してください。
センサの追加
リンクの右クリックで出てくるメニューから"add sensor"を選択すると、下のようなダイアログが出てきますのでセンサの名前を入力し、OKを押してください。
セグメントの追加
リンクの右クリックで出てくるメニューから"add segment"を選択すると、下のようなダイアログが出てきますのでセグメントの名前を入力し、OKを押してください。
ロボットの追加
リンクの右クリックで出てくるメニューから"add robot"を選択すると、ファイルダイアログが出てきますのでファイルを選択してください。
ファイルは、OpenHRP3のモデル記述方式に従って定義されている必要があります。読み込んだファイルのルートリンクを選択したリンクの子リンクとして追加します。
読み込んだファイルのルートリンクのjointTypeが"free"になっていると正しくシミュレーションが行えません。以下に説明するプロパティの設定で、必ず"fixed"等、別のタイプに書き換えてください。
形状の追加
セグメントアイテム、センサアイテムを右クリックすると、以下のようなメニューが表示されます。"add shape from VRML97", "add primitive shape"を選択することで形状データを追加します。
VRMLファイルによる形状の追加
"add shape from VRML97"を選択すると、ファイル選択ダイアログが出てきますので、あらかじめ用意した形状データが記録されたVRML97ファイルを選択し、OKを押してください。
プリミティブ形状の追加
"add primitive shape"を選択すると、さらにBox", "Cone", "Cylinder", "Sphere"のメニューが表示されます。いずれかを選択することで,直方体,円錐,円筒,球といったプリミティブ形状を追加することができます。
プロパティの入力
リンク、センサ各アイテムを選択すると、Property Viewにそのプロパティが表示されますので、最初に準備したロボットの様々なパラメータを入力していきます。全てのプロパティはSI単位系です。
リンクのプロパティ
各リンクは下図のようなプロパティを持っています。
translation, rotationはこのリンクの親リンクに対する位置、姿勢です。translationには親座標系でのx,y,z方向の各並進量、rotationには親リンクに対する姿勢の回転ベクトル3要素と回転角度の合計4要素を設定します。この位置、姿勢の表現はセンサ、形状に関しても同様です。なお,translation等いくつかのプロパティは表示が煩雑になるのを防ぐために,小数点以下の桁数を制限しています。
centerOfMass, inertia, massはそれぞれこのリンクの重心位置、重心まわりの慣性マトリクス、質量です。ItemView上でリンクアイテムが選択されている時,これらの質量特性の値に応じた楕円体が半透明のオレンジ色で表示されます。これらの値は、編集できません。セグメントアイテムのプロパティで編集します。
encoderPulse, rotorResistor, torqueConstはそれぞれ、モータが1回転したときにエンコーダが出力するパルス数、ロータ抵抗、トルク定数ですが、これらはコントローラが使用する目的で定義されているもので、シミュレーションでは使用されません。
gearRatio, rotorInertiaはこのリンクが親リンクに対して接続されている関節のギヤ比とモータの慣性です。関節をトルク制御する場合にはこれらのパラメータを適切に設定しないと安定にシミュレーションすることが困難になります。
jointAxis, jointId, jointTypeは関節軸の向き、関節番号、関節のタイプです。関節軸の向きはこのリンクの座標系での表現で指定します。関節番号は全関節の情報を並べてベクトルを作る際に、このリンクの情報を何番目に入れるかを指定します。従って番号が重複しないように設定する必要があります。関節のタイプは自由関節(free)、回転関節(rotate)、並進関節(slide)、固定関節(fixed)から選択します。
llimit, ulimit, lvlimit, uvlimitはそれぞれこの関節の可動範囲最小値、可動範囲最大値、速度最小値、速度最大値です。これらもコントローラでの使用を想定したパラメータでシミュレーションでは使用しません。
センサのプロパティ
各センサは下図のようなプロパティを持っています。
typeはセンサのタイプです。加速度センサ(Acceleration)、角速度センサ(Gyro)、力/トルクセンサ(Force)、カメラ(Vision)から選択します。
translation, rotationにはこのセンサが取り付けられているリンクに対する相対位置、姿勢を設定します。
セグメントのプロパティ
各セグメントは下図のようなプロパティを持っています。
centerOfMass, inertia, massはそれぞれこのセグメントの重心位置、重心まわりの慣性マトリクス、質量です。
translation, rotationにはこのセグメントのリンクに対する相対位置、姿勢を設定します。
形状のプロパティ
各形状は下図のようなプロパティを持っています。
translation, rotationにはこの形状が属するリンクに対する相対位置、姿勢を設定します。
プリミティブ形状の場合は、形状に応じたプロパティを持っていますので、サイズや色などの編集が可能です。
モデルの保存
ツリーのトップにあるロボットアイテムを右クリックすると下のようなメニューが表示されます。ここで"save as"を選択するとファイル選択ダイアログが出てきますので、モデルを保存したい場所、ファイル名を指定してOKボタンを押してください。作成したモデルがOpenHRPで使用可能なVRML97形式で保存されます。
注意点・制限事項
- 現状各種プロパティはプロパティビューを用いて入力するようになっていますが、プロパティビューでは本来入力できる値を制限すべきような場合であっても何でも入力できてしまい、それに気づかずにシミュレーションしようとするとエラーが発生します(例えば本来数値を入力すべきところに文字列等が入力できてしまう)。将来的にはプロパティを入力するための専用のビューを作成し、このような問題が発生しないようにする予定ですが、それまでは入力の内容にはご注意下さい。
- モデルを編集した後で、そのままシミュレーションを開始することはできません。一旦VRMLファイルにモデルを保存し、再度そのモデルを読み込んで下さい。
モデル作成チュートリアル
ここではsample/model/simple_vehicleディレクトリに収録されている、車輪型ロボットを例にしてモデルの作成方法を順を追って解説します。
- 形状データを準備します。ロボットは車体と3つの車輪、カメラから構成されますが、車輪は3つとも同じ形状なので、3種類の形状データを用意します。車体、車輪、カメラがそれぞれbody.wrl, wheel.wrl, camera.wrlというファイル名で保存されていることとします。リンク,センサ,形状をItemView上で選択すると,下図のように赤,緑,青の3色の線分で構成される座標系が表示されます。この座標系の原点がこのアイテムの位置,赤,緑,青の3軸がそれぞれX軸,Y軸,Z軸を表します。
- まずアイテムビューのモデルアイテムのフォルダを右クリックしてcreateメニューを選択し、モデルアイテムを作成します。
- モデルの名前は自動的に生成されますが、わかりやすいようにここではsimple_vehicleに変更します。生成されたnewmodel0を右クリックしてrenameメニューを選択します。名前を入力するダイアログが表示されますので、simple_vehicleに書き換えます。
- 作成されたrootリンクを右クリックしてメニューからadd segmentを選択し、root_segmentと名前を付けます。さらにこのセグメントを右クリックしてメニューからadd shape fromVRML97を選択します。ファイル選択ダイアログが表示されますので、車体の形状データである、simple_vehicle/body.wrlを選択します。するとbody.wrlがロードされ3DViewに表示されます。
- 次に車体に固定されたセンサであるカメラを作成します。rootリンクを右クリックしてメニューからadd sensorを選択します。センサ名を入力するダイアログが表示されますので、ここでは"Camera"と入力します。
- センサはデフォルトで力センサとして作成されますので、まずはセンサのタイプをVisionに変更します。Cameraを選択し、プロパティビューでtypeをVisionに変更して下さい。
センサは親リンクの原点位置に作られますので、このままではカメラは車体に埋もれてしまいます。そこでCameraを選択し、プロパティビューで位置(translation)と姿勢(rotation)をそれぞれ(0.0 -0.3 0.1), (0 0.7071 0.7071 3.1415)に変更します。
またidを0に変更します。
- センサには形状を持たせることもできます。Cameraを右クリックしてメニューからadd shape from VRML97を選択します。ファイル選択ダイアログが表示されますので、カメラの形状データであるcamera.wrlを選択します。
- 現在は車体が半分地面に埋もれているので、rootのプロパティのtranslationを(0.0 0.0 0.1)として地面から浮かせます。またroot_segmentのプロパティの車体の重量(mass)、慣性マトリクス(inertia)をそれぞれ10.0、(0.1 0.0 0.0 0.0 0.1 0.0 0.0 0.0 0.5)とします。
-
車体(root)には右後輪、左後輪、ステアリングという3つのリンクが接続していますので、rootを右クリックしてメニューからadd jointを選択し、それぞれ名前をWheelR, WheelL, Steeringとして追加します。
- ステアリングの先にさらに前輪がつきますのでSteeringの右メニューからadd jointを選択してWheelCを追加します。
-
Steering,WheelC, WheelR, WheelLにセグメントを追加します。
-
WheelC, WheelR, WheelLは全てwheel.wrlに定義された同じ形状ですので、右クリックメニューからadd shape from VRML97で形状を追加します。
-
Steering, Steering_segment, WheelC, WheelC_segment, WheelR, WheelR_segment, WheelL, WheelL_segmentのプロパティをそれぞれ下図のように設定すれば完成です。
-
最後に作成したモデルをVRML97形式のファイルに保存します。simple_vehicleを右クリックし、メニューからsave asを選択します。ファイルを選択するダイアログが表示されますので、お好みの場所にディレクトリを移動し、ファイル名を入力して下さい。
モデルの結合
一台の車輪型ロボットが作成できたので、同じロボットをもう一台連結したロボットを作成してみましょう。
-
一台目のロボットのルートリンクを選択して右クリックメニューからadd robotを選択します。保存したファイルを選択すると、もう一台のロボットが重なって表示されます。
-
2台目のロボットのルートリンクのプロパティを書き換えます。まず、ルートリンクのタイプをfixedにします。
次に、translationの値を調節して、ロボットが重ならないようにすれば、出来上がりです。ファイルに保存してください。