# 第12章 Force Mode ## 本章について 通常のロボット制御は ``` 位置 ``` を制御する。 一方、Force Mode は ``` 力 ``` を制御する。 例えば ・一定荷重で押す ・部品を押し当てる ・面に沿って滑らせる ・バネのような動きをする などを実現できる。 --- # 12.1 位置制御と力制御 通常の moveJ や moveL は ``` 位置制御 ``` である。 例えば ``` 100 mm ``` まで移動しようとする。 途中に障害物があっても 可能な限り目標位置へ行こうとする。 --- Force Mode は ``` 10 N ``` で押し続ける。 位置は保証されない。 代わりに 力 が一定になる。 --- # 12.2 Force Mode の用途 代表例 ・コネクタ挿入 ・部品組立 ・研磨 ・バリ取り ・ボタン押し ・ばね測定 ・荷重試験 --- # 12.3 基本構成 Force Mode は ``` 開始 ↓ Force Mode ↓ 一定周期で制御 ↓ Force Mode終了 ``` という流れになる。 moveJ のような 一回だけ送る命令 ではない。 --- # 12.4 基本API 例 ```python rtde_c.forceMode( task_frame, selection_vector, wrench, force_type, limits, ) ``` Force Mode 中は Controller が内部で力制御を行う。 --- # 12.5 task_frame 力制御を行う座標系である。 例えば ``` Base座標 Tool座標 Feature座標 ``` などを指定できる。 通常は ``` TCP座標 ``` を利用することが多い。 --- # 12.6 selection_vector どの自由度を 力制御 するか指定する。 ``` [ 1, 1, 1, 0, 0, 0 ] ``` なら XYZ のみ力制御する。 回転方向は位置制御になる。 --- 例 ``` [ 0, 0, 1, 0, 0, 0 ] ``` なら Z方向だけ押し付ける。 --- # 12.7 wrench 目標荷重 ``` [ Fx, Fy, Fz, Mx, My, Mz ] ``` 単位 ``` N Nm ``` である。 例えば ``` Fz=10 N ``` なら 下方向へ10 N 押し付ける。 --- # 12.8 force_type Controller の制御方式を指定する。 通常は 標準設定 を利用すれば十分である。 特殊な用途以外で変更することは少ない。 --- # 12.9 limits 許容変位 である。 例えば ``` 10 mm ``` まで押しても 10 N にならなければ それ以上は動かない。 安全機能でもある。 --- # 12.10 Force Mode 中の動作 Controller 内部では ``` 現在荷重 ↓ 目標荷重との差 ↓ PID ↓ Joint補正 ↓ Motor ``` という制御が毎周期行われる。 利用者は 毎回荷重を計算する必要はない。 --- # 12.11 荷重取得 Force Mode と組み合わせるAPI ```python rtde_r.getActualTCPForce() ``` 戻り値 ``` Fx Fy Fz Mx My Mz ``` 現在荷重を確認できる。 --- # 12.12 終了 Force Mode は ``` forceModeStop() ``` で終了する。 終了後は 通常の moveJ moveL へ戻る。 --- # 12.13 よくある用途 ### コネクタ挿入 ``` moveJ ↓ moveL ↓ ForceMode ↓ 10 N ↓ 挿入 ↓ 終了 ``` --- ### ボタン押し ``` moveL ↓ ForceMode ↓ 5 N ↓ 0.5秒保持 ↓ 終了 ``` --- ### 面追従 ``` ForceMode ↓ 一定荷重 ↓ XY方向へMove ``` 研磨などで利用される。 --- # 12.14 注意事項 Force Mode は ・TCP設定 ・Payload設定 が正しくないと 期待した荷重にならない。 実機では Payload のキャリブレーションが重要である。 --- # 12.15 moveJとの違い moveJ ``` 位置 ↓ 停止 ``` Force Mode ``` 荷重 ↓ 一定保持 ``` 目的が全く異なる。 --- # 12.16 ur_ctrl.pyでの設計 高レベルAPIでは ```python start_force_mode() stop_force_mode() ``` のように 開始・終了を分けると扱いやすい。 また ```python get_tcp_force() ``` を組み合わせることで、 力監視を容易に実装できる。 --- # まとめ Force Mode は 位置ではなく 荷重 を制御するための機能である。 通常の Move 系 API とは目的が異なり、 組立 押し付け 研磨 接触作業 などで利用される。 Force Mode を利用する際は ・TCP設定 ・Payload設定 ・ForceModeStop() を適切に設定することが重要である。 次章では Freedrive Mode を説明する。