ロボットシミュレーションの構成
ロボットシミュレーションの環境設定
ODEシミュレーションの基本的な環境は、「重力」「物体間の衝突状態」「刻み時間(ステップタイム)」となります。
「重力」の設定はMainサブルーチン内にあるdWorldSetGravity (world,0,0,-0.5)で行います。もし現実世界の重力と同じ状態にしたいのならば、Z軸の負の方向に+9.8[m/s2]となりますので、dWorldSetGravity (world,0,0,-9.8)と設定してください。
ここで、dWorldSetGravity (world,0,0,+9.8)と設定する(Z軸の正の方向に+9.8[m/s2])と物体が浮き上がりますし、dWorldSetGravity (world,+9.8,0,0)と設定する(X軸の正の方向に+9.8[m/s2])と物体が横に飛んでいきます。
「物体間の衝突状態」は、「nearCallback」内で設定を行います。「demo_buggy.cpp」における衝突する物体とは、平らな地面である「static dGeomID ground」、障害物である「static dGeomID ground_box」、「static dSpaceID」で宣言されている物体の集合体「car_space」となります。なお、物体の集合体に関する説明は次節を参照してください。これら3者の衝突状態の設定は下記のようになっています。
contact[i].surface.mode = dContactSlip1 | dContactSlip2 |
dContactSoftERP | dContactSoftCFM | dContactApprox1;
contact[i].surface.mu = dInfinity;
contact[i].surface.slip1 = 0.1;
contact[i].surface.slip2 = 0.1;
contact[i].surface.soft_erp = 0.5;
contact[i].surface.soft_cfm = 0.3;
ロボットシミュレーションの肝!地面との接触設定
上記の1~2行目にある「surface.mode」の設定は、値を指定する衝突状態の宣言をしています。ここに示されている以外にも多くありますので、詳しくはODEのユーザーガイドサイト(http://www.ode.org/ode-latest-userguide.html)の「7.3.7. Contact」にある表を参考にしてください。3~7行目では実際に値を指定します。
「surface.mu」は摩擦係数、「surface.slip1」「surface.slip2」はFDS摩擦係数、「surface.soft_erp」と「surface.soft_cfm」は粘弾性質を示しています。
ロボットシミュレーションをつくる上で最も重要な設定パラメータは、地面とロボットの衝突です。一般に地面は摩擦、粘弾性質で表現されるので、「surface.mu」「surface.soft_erp」「surface.soft_cfm」の3種類についての詳細を説明します。
摩擦係数の値は0~∞で設定します。値が0だと全く摩擦のないすべり状態になります。∞(ODEでは「dInfinity」)だと全くすべりを生じない状態です。物理学などで一般の摩擦係数は1として扱われていますが、摩擦係数はロボットの行動に大きな影響を与えますので、試行錯誤しながら設定してみるとよいでしょう。
粘弾性質はERP(Joint error and the error reduction parameterの略)、CFM(Soft constraint and constraint force mixingの略)で表現されています。これらパラメータは粘性係数と弾性係数から算出可能であり、Kを弾性係数・Cを粘性係数・DTを刻み時間とすると、ERPの算出式は以下の式(1)となり、CFMの算出式は以下の式(2)となります。
(1)ERPの算出式
ERP=DT*K/(DT*K+C)
(2)CFMの算出式
CFM=1/(DT*K+C)
私の場合、Kは5000-10000(N/m)、Cは5000-10000(Ns/m)と比較的硬めの地面となるように設定しています。