mc_rtc::Configuration
設定エンドエフェクタータスクを作成してその目標を操作できます。
// エンドエフェクタータスクのヘッダーをインクルードする(ヘッダファイル)
#include <mc_tasks/EndEffectorTask.h>
// クラスのプライベートメンバーを追加 (ヘッダファイル)
std::shared_ptr<mc_tasks::EndEffectorTask> efTask;
// コンストラクター内でタスクを作成して問題に追加する
efTask = std::make_shared<mc_tasks::EndEffectorTask>("l_wrist", robots(), 0, 5.0, 500.0);
solver().addTask(efTask);
// reset関数内で、現在のエンドエフェクターの位置に合わせてタスクをリセットする
efTask->reset();
# mc_tasksモジュールをインポートする
import mc_tasks
# コンストラクター内でタスクを作成して問題に追加する
self.efTask = mc_tasks.EndEffectorTask("l_wrist", self.robots(), 0, 10.0, 1000.0)
self.qpsolver.addTask(self.efTask)
# resetコールバック関数内で、現在のエンドエフェクターの位置に合わせてタスクをリセットする
self.efTask.reset()
これにより、メインロボットのl_wrist
という名前のボディに作用するタスクが作成されます。タスクを作成した後に、その目標を変更することができます。
// 現在の目標を取得する
auto pt = efTask->get_ef_pose();
// 回転と位置の目標を更新する
efTask->set_ef_pose(sva::PTransformd{sva::RotY(-M_PI / 2), Eigen::Vector3d{0.5, -0.5, 1.2}});
# 現在の目標を取得する
pt = efTask.get_ef_pose()
# 回転と位置の目標を更新する
efTask.set_ef_pose(
sva.PTransformd(sva.RotY(-math.pi / 2), eigen.Vector3d(0.5, -0.5, 1.2))
)
このチュートリアルでは、先のチュートリアルと同様の作業を繰り返す代わりに、JSON形式またはYAML形式で記述された設定ファイルからタスクを読み込む方法について説明します。この方法は、本フレームワーク内のどのタスクについても使用できます。
注: 現在、これはC++側でのみ使用できます。
ここでは、説明を簡単にするため、task.json
(YAML形式の場合はtask.yaml
)というファイルが/my/path/
ディレクトリに作成されているものとします。実際には、CMakeを使用してファイルをインストールし、インストールディレクトリをコントローラーに指定することもできますが、チュートリアルが複雑になるため、ここではその方法は使用しません。
以下のタスク記述ファイルを使用します。
{
"type": "body6d",
"body": "l_wrist",
"orientation": [0.71, 0, 0.71, 0],
"position": [0.4, 0.4, 1.0]
}
type: body6d,
body: l_wrist,
orientation: [0.71, 0, 0.71, 0]
position: [0.4, 0.4, 1.0]
以下のようにしてタスクの目標を取得します。
// タスクローダーを取得する
#include <mc_tasks/MetaTaskLoader.h>
// JSONファイルからタスクを取得する
auto task = mc_tasks::MetaTaskLoader::load(solver(), "/my/path/task.json");
// YAMLファイルからタスクを取得する
auto task = mc_tasks::MetaTaskLoader::load(solver(), "/my/path/task.yaml");
// 実際には、任意のmc_rtc::Configurationエントリからタスクを取得できる
auto task = mc_tasks::MetaTaskLoader::load(solver(), config("task"));
// 上記のいずれの場合も、タスクはstd::shared_ptrとして取得される。<mc_tasks::MetaTask>
// ただし、型を具体的に指定して取得することもできる。
// ディスクから取得されたタスクとユーザーが要求したタスクとの間に
// 互換性があるかどうかがmc_rtcによってチェックされる
auto task = mc_tasks::MetaTaskLoader::load<mc_tasks::EndEffectorTask>(solver(), config("task"));
手作業でタスクを作成した場合と同じように、このタスクを使用できます。この方法は、タスクの設定を試すのに非常に便利です。
このWebサイトのJSON/YAMLのドキュメントに、本フレームワークで読み込み可能なすべてのタスクと、それらのタスクを正しく読み込むためのJSON/YAML形式のサンプルが掲載されています。