第15章 順運動学と逆運動学
本章について
UR は 6 軸ロボットである。
そのため、
・TCP の位置
と
・各関節角度
は一対一ではない。
本章では
・順運動学 (Forward Kinematics)
・逆運動学 (Inverse Kinematics)
・特異点 (Singularity)
について説明する。
これらは moveL、servoL、Force Mode を理解する上で重要な基礎となる。
15.1 関節空間と直交座標空間
UR には大きく二つの空間が存在する。
Joint Space
[q1 q2 q3 q4 q5 q6]
と
Cartesian Space
[x y z rx ry rz]
である。
moveJ は Joint Space を制御する。
moveL は Cartesian Space を制御する。
15.2 順運動学(Forward Kinematics)
順運動学とは
Joint角度
↓
TCP位置
を計算することである。
例えば
q
↓
FK
↓
Pose
となる。
これは一意に決まる。
同じ Joint 角度なら
TCP は必ず同じ位置になる。
15.3 逆運動学(Inverse Kinematics)
逆運動学は
TCP
↓
Joint角度
を求める計算である。
Pose
↓
IK
↓
q
となる。
こちらは一意ではない。
15.4 なぜ複数解があるのか
例えば
同じ場所へ
肘を上げる
姿勢でも
肘を下げる
姿勢でも
到達できる。
○
/
Base
と
○
\
Base
では
TCP は同じでも
Joint は異なる。
15.5 Wrist Flip
手首にも複数解が存在する。
例えば
180°
反転しても
TCP姿勢は同じになる場合がある。
このため
IK の解は
複数存在する。
15.6 moveL が難しい理由
moveL は
Pose
↓
IK
↓
Joint
を
毎制御周期
実行する。
そのため
IK が解けないと
途中で停止する。
15.7 到達不能
例えば
Workspace外
なら
IK は存在しない。
Pose
↓
×
となる。
moveL は失敗する。
15.8 Joint Limit
Workspace内でも
Joint Limit
を超える場合は
IK が存在しない。
例えば
J1 が
400°
必要なら
実際には到達できない。
15.9 特異点(Singularity)
特異点とは
少しTCPを動かす
↓
Jointが大量に回る
状態である。
速度が無限大に近づくため
Controller は速度制限を行う。
15.10 手首特異点
最も有名なのは
Wrist Singularity
である。
手首軸が一直線になると
姿勢自由度が失われる。
moveL が遅くなったり、
速度制限が働いたりする。
15.11 肘特異点
腕が一直線になる姿勢も
特異点である。
Base
──────TCP
のように
伸び切る姿勢では
制御が不安定になりやすい。
15.12 moveJ と moveL の違い
moveJ は
Joint を直接制御するため
IK を使用しない。
そのため
特異点を比較的避けやすい。
moveL は
毎周期 IK を解くため
特異点の影響を受けやすい。
15.13 getInverseKinematics()
ur_rtde では
q = rtde_c.getInverseKinematics(pose)
のように
事前に IK を計算できる。
これにより
moveL前
↓
IK確認
↓
失敗なら処理中止
という安全な設計が可能になる。
15.14 Forward Kinematics
逆に
pose = rtde_c.getForwardKinematics(q)
を利用すると
Joint角度から
TCP位置を確認できる。
ティーチングソフトなどで便利である。
15.15 Safety Check
例えば
rtde_c.isPoseWithinSafetyLimits(pose)
などを利用すると
Workspace や Safety 設定内かどうかを
事前に確認できる。
Move 実行前にチェックすると
エラーを減らせる。
15.16 典型的な利用例
Pose生成
↓
Safety Check
↓
IK
↓
MoveL
この順番が推奨される。
15.17 ur_ctrl.pyでの実装
高レベルAPIでは
check_pose()
inverse_kinematics()
forward_kinematics()
などを公開すると
利用者が直接 RTDE API を呼び出す必要がなくなる。
Move 前に
安全判定と IK 判定を自動実行する設計も有効である。
15.18 よくあるトラブル
・到達可能だと思っていたが IK が解けない
・Tool を変更したら moveL が失敗する
・Joint Limit に到達して停止する
・特異点付近で極端に速度が低下する
・姿勢だけ変更したつもりが大きく回転する
まとめ
Forward Kinematics は
Joint
↓
TCP
Inverse Kinematics は
TCP
↓
Joint
である。
moveJ は Joint Space を制御するため IK を必要としない。
一方、moveL・servoL・Force Mode は Cartesian Space を制御するため、IK・Joint Limit・特異点の影響を受ける。
そのため、高信頼なアプリケーションでは Move 実行前に IK と安全範囲を確認することが推奨される。
次章では、Safety System と Protective Stop、Emergency Stop、Fault の違い、および Python からのエラー復旧について詳しく説明する。