mc_rtc::Configuration 設定タスク空間の各軸に異なる重みを持たせることができます。例えば、質量中心の垂直方向の位置を無視できます。
ほとんどのタスクでは、Eigen::VectorXd型の追加パラメーターdimWeightを受け取り、それを使って方向ごとに異なる重みを持たせることが可能になります。
dimWeightは、重みをその値で置き換えるのではなく、重みにその値を乗算します。例えば、重みが1000で、dimWeightが[1., 1., 1e-3]であるcomTaskは、トータルの重みが[1000., 1000., 1.]であるタスクとして動作します。dimWeightは、サイズが可変のベクトルです。ユーザーが正しいサイズを設定する必要があります。なお、このパラメーターに対してdim()を呼び出すと、(下位レベルの)タスクサイズを取得できます。comTaskの垂直方向の誤差を無視します。
Eigen::VectorXd dimWeight(3);
dimWeight.setOnes();
dimWeight[2] = 0.;
comTask = std::make_shared<mc_tasks::CoMTask>(robots, robots().robotIndex(), 5.0, 100.);
comTask->dimWeight(dimWeight);
EndEffectorTaskは、エンドエフェクターの向きと位置を制御するための2つのタスクで構成されています。そのため、dimWeightメソッドは6次元のベクトルを必要とします。最初の3つの次元は向きの次元の重みを制御し、残りの3つの次元は位置の次元の重みを制御します。EndEffectorTaskでx方向とy方向の平行移動を無視するには、以下のようにします。
Eigen::VectorXd dimWeight(6);
dimWeight << 1., 1., 1., 0., 0., 1.;
efTask = std::make_shared<mc_tasks::EndEffectorTask>("RARM_LINK6", robots(), 5.0, 100);
efTask->dimWeight(dimWeight);
または、タスクの位置の部分を直接操作します。
Eigen::VectorXd dimWeight(3);
dimWeight.setZero();
dimWeight(2) = 1.;
efTask = std::make_shared<mc_tasks::EndEffectorTask>("RARM_LINK6", robots(), 5.0, 100);
efTask->positionTask->dimWeight(dimWeight);
注: これは制約条件ではありません。これらの方向にタスクが何も作用しないことを意味します。特定の方向への動きを制限したい場合は、接触面自由度または速度制約条件を使用します。