notes
Control

Task-space Ruckig (Cartesian OTG)

Ruckig を Cartesian 空間で回して手先を直線で動かす。joint-space と何が違うか

要点#

Ruckig は「速度・加速度・躍度制限を破らない online trajectory generation (OTG)」の ライブラリで、どの空間 (関節 or 手先) で目標と制限を与えるか を切り替えられる。 関節空間で回すと手先は円弧を描き、Cartesian で回すと手先が直線を描く。

数字 / 式#

joint-spacetask-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 のどこを読むか
最終更新:

On this page