IK と軌道の 2 段構え
salamander の joint_target には IK / teleop / posture の 3 系統が書く。上流 Cartesian Ruckig だけでは teleop/posture が jerk 保護を失うので下流 joint Ruckig を残す
要点
joint_target に書く writer が 3 系統ある: 自律 IK / 手動 teleop / 姿勢 posture。
そのうち teleop と posture は関節空間の指令なので、上流 Cartesian Ruckig を
通り得ない。下流の joint-space Ruckig は「唯一 3 系統に共通するガード」 として残す。
数字 / コマンド
pipeline (arm_control.launch.xml):
target_position ──→ arm_kinematics_node (or arm_cartesian_motion_node)
↓
┌────── joint_target ←── joint_teleop_plugin (手動スティック)
│ ←── posture_node × 3 (home/rest, grasp/place, flat/up)
↓
trajectory_generator_node (joint-space Ruckig, 100–200 Hz)
↓
ruckig/joint_setpoint → gravity_comp → joint_command → bridge → モータ切替:
cartesian_motion:=false(既定) — arm_kinematics_node: 目標受信ごとにsolve_ik_pitched1 回、joint_target を publish (jerk 制御なし)cartesian_motion:=true— arm_cartesian_motion_node: task-space Ruckig で毎 tick IK
詳細
joint_target に書く 3 系統
| writer | ソース | 通過経路 | 上流 (Cartesian) Ruckig を通る? |
|---|---|---|---|
| arm_kinematics_node | BT/mission の target_position | IK 1 回 → joint_target | 通らない (arm_cartesian_motion なら通る) |
| joint_teleop_plugin | ゲームパッドのスティック軸 | joint_target 直書き | 通らない |
| posture_node (× 3) | posture_request 系トピック (String) | joint_target 直書き | 通らない |
teleop と posture は「関節空間で目標を出す」ので、Cartesian smoothing に落とすと 意味が壊れる (手先ぐるっと回ってから grasp、みたいなことになる)。
なぜ下流に joint-space Ruckig を残すか
- teleop / posture の jerk 保護 — 上流を通らない 2 系統に jerk 制限を掛ける 唯一の場所
- URDF 可動域の最終クランプ — writer 側の目標が範囲外でも下流で切る
- 中央集権的なリミット管理 — max_vel / max_acc / max_jerk を関節ごとに trajectory_generator.param.yaml で 1 か所に集約できる
なぜ上流 (Cartesian) Ruckig を用意したか (Phase 1)
BT が pose を 2 回投げるだけ (place_above → place_release) だと、
下流 joint Ruckig は 関節空間の直線補間 をするので手先が円弧を描いて前に
膨らむ (実測 dx +105 mm 中間、+7〜34 mm 終端)。
上流で Cartesian Ruckig を回して毎 tick IK すると手先が真下に降りる。
plan file (.claude/plans/sequential-meandering-lake.md) の Phase 1 で実装済み
(arm_cartesian_motion_node.cpp)。既定 off で検証段階。
「上流だけ」にしないのは 3 系統前提の設計だから
一般に industrial arm では
- teach pendant = Cartesian jog (twist)
- 姿勢マクロ = 関節空間
の両方が必要で、どちらも smoothing が要る。上流 Cartesian ruckig だけ + 下流 なしにすると teach pendant は速度制限が効いても posture / joint jog は生指令に なる。二段構えが自然。
関連
- [[task-space-ruckig]] — task-space vs joint-space の一般論
- [[salamander-package-layout]] — arm_control と teleop のパッケージ配置