IKを用いたOpenArmの駆動について #552
Replies: 1 comment
|
手先位置を指定してOpenArmを駆動するためには、手先の目標姿勢から関節角を求め(IK: Inverse Kinematics)、それをFollower側の各関節へ指令として送る、という流れになります。 IKにつきましては、以下の openarm_control パッケージの Kinematics クラスで提供しております。 使い方の流れは次のとおりです。 1. IKを有効にして初期化Kinematics は IKParams を渡したときだけ IK が有効になります。 from openarm_control.kinematics import Kinematics, IKParams
kin = Kinematics(setup, IKParams())2. 目標姿勢をセット
kin.set_target("right", pose) # pose: [px, py, pz, qw, qx, qy, qz]3. 解いて関節角を得る
result = kin.solve() # -> float32[16] or Noneなお dt や反復回数は solve() の引数ではなく、初期化時の IKParams( 注意点このIKは mink + MuJoCo による差分IK(QPベースの速度IK)です。解析的に一発で目標姿勢へ到達するのではなく、現在の関節配置から目標へ1ステップぶん近づける動作を返します。 そのため、
という使い方になります。これを行わないと内部configと実機がずれ、挙動が不安定になりますのでご注意ください。 4. Follower(実機)へ送るsolve() の戻り値(各関節の目標値)を、そのまま OpenArm のFollowerドライバへ関節位置指令として送れば駆動します。 dora構成であれば、この一連の処理は dora-openarm-ik ノードとして提供しています(内部で上記 Kinematics を利用しています)。
dora-openarm-vr でも同じ構成(目標姿勢 → ik ノード → Follower)で動作しております。
|
Uh oh!
There was an error while loading. Please reload this page.
手先位置をFollowerの終端位置に反映するようにOpenArmを駆動したいです。
方法を教えてください。
All reactions