notes
ProjectSalamander

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_pitched 1 回、joint_target を publish (jerk 制御なし)
  • cartesian_motion:=true — arm_cartesian_motion_node: task-space Ruckig で毎 tick IK

詳細#

joint_target に書く 3 系統#

writerソース通過経路上流 (Cartesian) Ruckig を通る?
arm_kinematics_nodeBT/mission の target_positionIK 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 を残すか#

  1. teleop / posture の jerk 保護 — 上流を通らない 2 系統に jerk 制限を掛ける 唯一の場所
  2. URDF 可動域の最終クランプ — writer 側の目標が範囲外でも下流で切る
  3. 中央集権的なリミット管理 — 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 のパッケージ配置
最終更新:

On this page