Robotics
URDF の joint limit と状態依存拘束
URDF の `<limit>` は定数のみで他関節の値に依存できない。mimic は固定線形結合まで。状態依存の可動域はコード側(IK / planner / controller)で埋める
要点: URDF の <joint><limit lower/upper effort velocity> は定数しか書けない。他関節の値に応じて可動域が変わる(例: shoulder_pitch の値で beam_pitch の上限が変わる)ような拘束は URDF 単体では表現不能。実行時にコード側で狭める。
URDF/xacro が持つ表現力
| 手段 | できること | 状態依存 |
|---|---|---|
<joint><limit> の 4 属性 | 定数 lower/upper/effort/velocity | 不可 |
<safety_controller> | soft_lower/soft_upper と k_position/k_velocity。ros2_control が使う場合あり | 定数のみ |
<mimic joint="A" multiplier="k" offset="c"/> | q_B = k * q_A + c の固定線形結合 | 係数は定数 |
xacro ${expr} | 展開時に定数として評価 | 展開後は URDF に焼き付き |
mimic は「連動」させる仕組みで、片方の値で他方の値を強制するが limit を動かすわけではない。式は multiplier と offset の 2 定数だけ。
状態依存の拘束の書き方
URDF 側では**機械的な最大枠(包絡)**にしておき、実行時に狭める。狭める場所の選択肢は 3 つ。
- IK / planner 側でクランプ
q_B_max = f(q_A)を関数で持ち、IK 出力や軌道生成器の目標を毎 tick 上限で切る。表引きを yaml で持てばキャリブしやすい。 - collision で表現
干渉が limit の実体なら、干渉面を<collision>として置いて planner の self-collision check に任せる。allowed_collision_matrix の設計が要る。 - passive joint + カスタム controller
4節平行リンクなどの物理拘束はros2_controlの transmission か、Pinocchio / CasADi の拘束求解に任せる。
URDF を狭めない理由
URDF の <limit> を「安全側」で狭く書くと、姿勢によっては到達可能な領域まで刈られる。URDF は包絡・実行時に狭めるが定石。
関連
最終更新: