# 第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 では ```python q = rtde_c.getInverseKinematics(pose) ``` のように 事前に IK を計算できる。 これにより ``` moveL前 ↓ IK確認 ↓ 失敗なら処理中止 ``` という安全な設計が可能になる。 --- # 15.14 Forward Kinematics 逆に ```python pose = rtde_c.getForwardKinematics(q) ``` を利用すると Joint角度から TCP位置を確認できる。 ティーチングソフトなどで便利である。 --- # 15.15 Safety Check 例えば ```python rtde_c.isPoseWithinSafetyLimits(pose) ``` などを利用すると Workspace や Safety 設定内かどうかを 事前に確認できる。 Move 実行前にチェックすると エラーを減らせる。 --- # 15.16 典型的な利用例 ``` Pose生成 ↓ Safety Check ↓ IK ↓ MoveL ``` この順番が推奨される。 --- # 15.17 ur_ctrl.pyでの実装 高レベルAPIでは ```python 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 からのエラー復旧について詳しく説明する。