Task-space Ruckig (Cartesian OTG)
Ruckig を Cartesian 空間で回して手先を直線で動かす。joint-space と何が違うか
要点
Ruckig は「速度・加速度・躍度制限を破らない online trajectory generation (OTG)」の ライブラリで、どの空間 (関節 or 手先) で目標と制限を与えるか を切り替えられる。 関節空間で回すと手先は円弧を描き、Cartesian で回すと手先が直線を描く。
数字 / 式
| joint-space | task-space | |
|---|---|---|
| 入力 | q_target ∈ ℝⁿ | Cartesian pose (SE(3)) |
| 制限 | 関節ごと vel/acc/jerk [rad/s] | 手先 並進 [m/s] + 回転 [rad/s] |
| IK | 端点で 1 回 | 毎 tick (100Hz 級) |
| 軌跡 | 関節直線 → Cartesian は円弧 | Cartesian 直線 |
Ruckig ライブラリ自体は DoF 汎用 (ruckig::Ruckig<N>)。Cartesian で使うときは並進 3 +
回転 3 の 6 チャンネル、姿勢は axis-angle か quaternion slerp を外で回す。
詳細
実装の型
毎 tick:
current_pose = FK(current_joints)
ruckig.update(current_pose, target_pose, cart_limits) → next_pose
joint_target = IK(next_pose)
publish(joint_target)joint-space の場合は最後の IK が要らない (Ruckig 出力がそのまま joint_target)。
メリット
- 手先が Cartesian 直線を描く。テーブルを舐める・箱へ真下に降ろす・見えた点へ直進、 全部素直に書ける (joint-space だと同じことに waypoint 分割が要る)
- 制限が物理量。「TCP を 0.4 m/s 以下で」「そっと 0.05 m/s で降ろす」が直接指定できる
- BT/上位側の記述が減る (疑似 Cartesian の多段 waypoint が要らない)
落とし穴
- 特異点: 特異姿勢の近傍で Cartesian の微小変位に必要な関節速度が発散する。 対策は damped least-squares IK、Cartesian 速度クリップ、特異点近傍検出 + 減速
- IK 解けない中間点: 端点で解けても軌道の中間で out_of_reach になることがある。 事前 pre-check か、失敗時に joint-space fallback
- 姿勢の補間: 純 Euler 直線補間はジンバルロックの近傍で不連続。quaternion slerp か axis-angle が安全
- IK ブランチの切替: 中間で ElbowUp/Down が入れ替わると関節が跳ねる。IK に前ブランチを 固定するヒントを持たせる (or Ruckig の per-axis 制限で吸収できる範囲を推定)
- 計算コスト: IK が O(制御周期) で走る。解析 IK なら軽い (μs 級)、Pinocchio/KDL の 数値 IK は 100Hz でも数 % の CPU
- 停止条件: joint-space の
stopは関節ごと、task-space は Cartesian で減速。 緊急停止のセマンティクスが変わる
joint-space の弧は「単峰の円弧」ではなく S 字になる
関節を直線補間 (q(s) = q0 + s·Δq) したときの手先のずれは単峰の弧で、机上で 見積もれる。しかし joint-space Ruckig の出力は関節ごとの時間同期プロファイルで、 関節間の比が一定ではない (速く動く関節が先に進む)。手先経路は直線補間の弧と 別物になり、ずれは大きくなる。
実測例 (2 リンク l1 = 0.400 / l2 = 0.450 m のアーム、鉛直 120 mm 降下、0.75 s):
- 関節直線補間の机上値: 単峰 +4.5 mm
- Ruckig 出力の FK: S 字。深さ 28 mm で +7.5 mm、深さ 105 mm で −2.5 mm、終点 0
見積もりを直線補間でやると実際の半分しか出ない。実機 (物理) の経路は この指令 S 字に追従遅れが乗る。
軌跡を評価するときは 深さ (or 経路長) を横軸に 取る。時刻で並べると 「指令は到着済み・物理は 20 mm 手前」の追従遅れが横ずれに見える。
waypoint 分割で逃げる場合: ずれはセグメント端点で 0 に戻り、振幅は概ね セグメント長の 2 乗で減る (120 mm → 60 mm ×2 で 1/4)。狭い所を横切る直前に 端点を置き、そこで静定させれば追従遅れも切れる。
既存の類似実装
- MoveIt2 の
pilz_industrial_motion_planner(LIN プランナ) — 概念は同じ - Franka の Cartesian impedance / motion generator — 姿勢は quaternion slerp
- 完全な task-space Ruckig ラッパーの確立された OSS は無い印象。多くは自前
関連
- /docs/robotics/spring-counterbalance — 定常たわみと減衰。ここは軌道側で解決しない
- /docs/ros/urdf-joint-vs-visual-origin — IK が URDF のどこを読むか