重心の制御
このチュートリアルでは、ロボットの質量中心(CoM: Center of Mass)を制御します。先のチュートリアルと同じく、質量中心を20cm下げてから元の位置に戻す関数を記述します。
接触面
質量中心を動かす前に、接触面を考慮する必要があります。先のコントローラーでは、接触面のセットは空のままでしたが、何も問題は起こりませんでした。しかし、質量中心を制御する場合、そのコマンドをそのまま使用すると、ロボットが地面の下に沈んだり空中に浮いたりしてしまいます。これは、単に接触面がないためです(姿勢の誤差を最小限に抑えつつ質量中心を動かしたい場合は、接触面を空にするのが最もよい方法です)。
そこで、ロボットの足と地面との間に接触面を追加します。
注: ロボットの現在の表面を「見つける」方法については、表面の可視化に関するチュートリアルを参照してください。
力学的制約条件
ここまでは、キネマティクスモードでコントローラーを実行してきました。次に力学モードに切り替えると、以下のことが行えるようになります。
- 外力とそれに伴うトルクを計算する
- 外力を接触面の摩擦円錐内に収める
- トルクをロボットのトルク限界内に収める
モードを切り替えるには、コード内のkinematicsConstraint
をdynamicsConstraint
に変更します。kinematicsConstraints
によって適用されていた制約条件は、dynamicsConstraint
でも適用されます。
質量中心タスクを作成して問題に追加する
以下の作業を行います。
- 質量中心タスクを作成する
- 作成したタスクを最適化問題に追加する
- 目標が正しく設定されているか確認する
今回の例では、以下の点を考慮してタスクを作成します。
robots()
を使用する
- インデックスが0のロボットに適用する。インデックス0は常に、mc_rtcで読み込まれるメインロボットを指します。
- 目標に向かって剛性
10.0
で引っ張る。このパラメーターは、ロボットを目標に向かって引っ張る「ばね」の強さを規定します。
- 重み
1000
を割り当てる。この重みは、最適化問題におけるタスクの優先度を表します。今回の場合、デフォルトの姿勢の重みは5.0
であるため、質量中心タスクのほうが優先されます。なお、タスクの誤差は正規化されないため、状況に応じて重みを調節する必要があります。
- 質量中心タスクと干渉しないように、姿勢制御タスクの剛性を下げる。
質量中心を上下に動かす
switch_com_target()
関数を使用して、先のチュートリアルと同様のメソッドを実装します。ここでは、bool型変数comDown
と質量中心の初期位置を表すEigen::Vector3d
変数comZero
が追加されていると仮定します。
最後に、質量中心タスクの誤差を監視して目標を変更します。
このコントローラーを実行すると、ロボットが上下に動くのが分かります。次のチュートリアルでは、エンドエフェクターを動かす方法と、タスクの構成をディスクから読み込む方法について見ていきます。
このコントローラーの完全なソースは、こちらから入手できます。