剛体・関節系を構成する剛体の一部を,「エンドエフェクタ」に指定することができます. エンドエフェクタには目標位置・姿勢を指示することができます.IKエンジンは,エンドエフェクタ剛体が指定された目標位置・姿勢を達成するようアクチュエータを制御します.
エンドエフェクタはPHSceneIfのCreateIKEndEffectorを用いて作成します.引数にはPHIKEndEffectorDescを渡します.
// given PHSceneIf* phScene PHIKEndEffectorDesc descEndEffector; PHIKEndEffectorIf* ikEndEffector = phScene->CreateIKEndEffector(descEndEffector);
アクチュエータ同様,エンドエフェクタも作成時点では剛体との対応を持ちません.AddChildObjectにより剛体を子要素として登録する必要があります.
// given PHSolidIf* solid ikEndEffector.AddChildObject(solid);
次に,エンドエフェクタ剛体を親剛体に連結しているアクチュエータに対し,エンドエフェクタを子要素として登録します.
// given PHIKActuatorIf* ikActuatorParent ikActuatorParent.AddChildObject(ikEndEffector);
こうすることでエンドエフェクタはアクチュエータ木構造の葉ノードとなり,IKの計算に使用できるようになります.
なお,エンドエフェクタは一つの関節系に対して複数作成することができます.この場合,IKは複数のエンドエフェクタが可能な限り同時に目標位置・姿勢を達成できるようアクチュエータを制御します.また,エンドエフェクタは関節系の先端剛体に限りません.
エンドエフェクタの目標位置はSetTargetPositionによって指定します.
// solid3 goes to (2, 5, 0) ikEndEffector->SetTargetPosition(Vec3d(2, 5, 0));
エンドエフェクタに目標姿勢を指示し,エンドエフェクタが特定の姿勢をとるように関節系を動作させることもできます.
ikEndEffector->SetTargetOrientation( Quaterniond::Rot('x', rad(30)) ); ikEndEffector->EnableOrientationControl(true);
目標姿勢はQuaterniondで設定します.姿勢制御はデフォルトでは無効になっており,使用するにはEnableOrientationControlを呼んで有効化する必要があります.
EnablePositionControlおよびEnableOrientationControlを用いると,位置制御・姿勢制御の両方を個別に有効・無効化することができます.
// 位置制御あり,姿勢制御なし(デフォルト) ikEndEffector->EnablePositionControl(true); ikEndEffector->EnableOrientationControl(false);
// 位置制御なし,姿勢制御あり ikEndEffector->EnablePositionControl(false); ikEndEffector->EnableOrientationControl(true);
// 位置制御あり,姿勢制御あり ikEndEffector->EnablePositionControl(true); ikEndEffector->EnableOrientationControl(true);