ProjectSalamander
重力・摩擦の同定 (静的保持)
salamander の shoulder_pitch × beam_pitch を 5×5 格子で上下 2 方向から保持し、feedback torque と Pinocchio 予測の残差から invert・スケール・τ_c を出す。RC27 の tuner は持ち込まない
要点: 25 点 × 上下 2 方向 × 2 s 静止、所要 10 分。出すのは静止摩擦 τ_c (定常誤差 τ_c/Kp) と重力モデルの残差。RC27 の mech_ff_tuner は duty 指令・1 軸・cos テーブル前提なので移植しない。使うのは手順だけ。
準備
ros2 launch salamander_bringup manual.launch.xml motor_names:="[shoulder_pitch, beam_pitch]"(重力補償 on)- 手先は空。pad_pitch 開、wrist_pitch 0
- 先に中央 1 点 (0.2, 0.75) で torque の桁と符号が
gravity/joint_commandと合うことを見る
格子 (URDF 上限から 0.1 rad 内側)
| 関節 | 点 [rad] | URDF 上限 |
|---|---|---|
| shoulder_pitch | −0.6, −0.2, 0.2, 0.6, 1.0 | [−0.785, 1.309] |
| beam_pitch | 0.15, 0.45, 0.75, 1.05, 1.3 | [0, 1.396] |
干渉する組み合わせは Isaac の運動学モードで先に除く。
手順
- 各点で +0.15 rad から降りて 2 s 静止、−0.15 rad から上がって 2 s 静止
- 動かすのは 1 関節ずつ
- 指令は
joint_targetへros2 topic pub -1を 4 s 間隔
ros2 bag record -o ~/rosbags/static_hold_$(date +%m%d_%H%M) \
/salamander/arm/shoulder_pitch/motor/feedback /salamander/arm/beam_pitch/motor/feedback \
/salamander/gravity/joint_command /salamander/joint_states \
/salamander/joint_target /salamander/ruckig/joint_setpoint後処理
- 各保持の最後 1 s (|velocity| < 0.01 rad/s) の torque 平均 τ_up, τ_down
- τ_g = (τ_up + τ_down)/2、τ_c = |τ_up − τ_down|/2
- 定常誤差 = τ_c / Kp (Kp 30 N·m/rad)。τ_c 0.5 N·m なら 16.7 mrad、手先 8 mm (箱の側壁すき間 1.95 mm)。MIT mode は積分器が無いので消えない
- τ_g と
gravity/joint_commandeffort の残差 → invert・スケール・4 パラメータ (質量×重心、2 軸連成) の最小二乗 - RobStride の torque は Iq 推定でモータ軸の値。減速機の効率は「スケール」に吸収する
前提
- 平行四節リンクは mimic で縮約。出るのは有効パラメータ
- payload モデル 0.10 kg は 2 缶で 0.18 kg。腕の重力トルクの 1 割未満なので後回し可
関連
- 組込み PD (MIT mode) モータでの FF 項と同定
- /docs/project/salamander/real-robot-bringup
最終更新:
gravity_compensation_node の内部モデル
URDF を Pinocchio で build (mimic=true で 4-bar 縮約) → g(q) = generalizedGravity。payload は円柱 inertia を tool 側 joint に加算した別 model で切替
IK と軌道の 2 段構え
salamander の joint_target には IK / teleop / posture の 3 系統が書く。上流 Cartesian Ruckig だけでは teleop/posture が jerk 保護を失うので下流 joint Ruckig を残す