notes
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 つ。

  1. IK / planner 側でクランプ
    q_B_max = f(q_A) を関数で持ち、IK 出力や軌道生成器の目標を毎 tick 上限で切る。表引きを yaml で持てばキャリブしやすい。
  2. collision で表現
    干渉が limit の実体なら、干渉面を <collision> として置いて planner の self-collision check に任せる。allowed_collision_matrix の設計が要る。
  3. passive joint + カスタム controller
    4節平行リンクなどの物理拘束は ros2_control の transmission か、Pinocchio / CasADi の拘束求解に任せる。

URDF を狭めない理由#

URDF の <limit> を「安全側」で狭く書くと、姿勢によっては到達可能な領域まで刈られる。URDF は包絡・実行時に狭めるが定石。

関連#

最終更新:

On this page