# 第11章 servoJ と servoL ## 本章について servoJ および servoL は、UR のリアルタイムサーボ制御 API である。 moveJ や moveL が「目的地へ移動する命令」であるのに対し、servoJ は「現在の目標値を一定周期で更新し続ける命令」である。 ジョイスティック制御 画像追従 Visual Servo 外部制御 力制御 などでは servo 系 API を利用する。 --- # 11.1 moveJとの違い moveJ ``` 目標位置 ↓ Controllerが軌道生成 ↓ 移動 ↓ 終了 ``` servoJ ``` 現在目標 ↓ 少し移動 ↓ 新しい目標 ↓ 少し移動 ↓ 新しい目標 ↓ ・・・ ``` つまり servoJ は 「連続的に目標位置を書き換える」 ための API である。 --- # 11.2 servoJ の考え方 例えばジョイスティックを操作すると ``` 100 Hz ↓ 現在のレバー位置 ↓ 新しいJoint角度 ↓ servoJ() ``` を毎周期実行する。 ロボットは 「常に最新目標」 へ向かって動く。 --- # 11.3 基本構文 ```python rtde_c.servoJ( q, speed, acceleration, dt, lookahead_time, gain, ) ``` --- # 11.4 q 目標Joint角度 ``` [ q1, q2, q3, q4, q5, q6 ] ``` 単位 ``` rad ``` --- # 11.5 dt 制御周期 例えば ``` 0.002 ``` なら 500 Hz ``` 0.008 ``` なら 125 Hz である。 この値に合わせて PC 側も一定周期で servoJ を送信する。 --- # 11.6 lookahead_time もっとも誤解されるパラメータである。 Controller は ``` 現在位置 ↓ 速度 ↓ 未来位置予測 ↓ 補正 ``` を行っている。 lookahead_time は その未来予測時間である。 一般に ``` 0.03〜0.20 s ``` 程度を使用する。 --- # 11.7 gain 追従ゲインである。 イメージとしては ``` P制御ゲイン ``` に近い。 小さい ``` 追従が遅い 滑らか ``` 大きい ``` 追従が速い 振動しやすい ``` --- # 11.8 speed と acceleration servoJ では moveJ ほど重要ではない。 Controller 内部で安全制限を考慮して補間される。 実際には lookahead_time gain の方が挙動へ与える影響が大きい。 --- # 11.9 毎周期送る理由 moveJ は ``` 一回送信 ↓ 終了 ``` servoJ は ``` 500 Hz ↓ 送信 ↓ 500 Hz ↓ 送信 ↓ 500 Hz ↓ 送信 ``` である。 途中で送信を止めると 目標更新が止まる。 --- # 11.10 servoStop() servo 制御終了時は ```python rtde_c.servoStop() ``` を呼ぶ。 そのまま moveJ を送ることは推奨されない。 --- # 11.11 servoL servoL は TCP位置 を毎周期更新する。 ``` Pose ↓ servoL ↓ Pose ↓ servoL ↓ ・・・ ``` Visual Servo などで利用される。 --- # 11.12 moveJとの比較 |項目|moveJ|servoJ| |---|---|---| |目標|最終位置|毎周期更新| |周期|不要|125〜500 Hz| |用途|一般移動|リアルタイム制御| |終了|自動|servoStop()| --- # 11.13 speedJとの違い speedJ ``` 速度指令 ``` servoJ ``` 位置指令 ``` である。 --- # 11.14 ジョイスティック制御 典型的な流れ ``` Joystick ↓ Joint角度計算 ↓ servoJ() ↓ 2 ms ↓ servoJ() ↓ 2 ms ↓ ・・・ ``` この方法が最も滑らかに動作する。 --- # 11.15 Visual Servo 画像認識では ``` Camera ↓ 位置誤差 ↓ PID ↓ Pose ↓ servoL ``` となる。 画像処理結果を毎周期反映できる。 --- # 11.16 通信遅延 servoJ は 通信遅延に敏感である。 周期が乱れると ``` ガタつき 追従遅れ 停止 ``` などが発生する。 そのため ・リアルタイムOS ・有線LAN ・一定周期送信 が推奨される。 --- # 11.17 よくある失敗 ・周期が一定でない ・servoStop() を呼ばない ・lookahead_time を極端に小さくする ・gain を極端に大きくする ・Move系APIと混在させる --- # 11.18 ur_ctrl.pyでの設計 一般的には ```python servo_start() servo_update() servo_stop() ``` の3段階APIに分けると扱いやすい。 利用者は周期だけを意識すればよい。 --- # 11.19 servoJを使うべき場面 ・ゲームパッド操作 ・マウス操作 ・Visual Servo ・Force Control ・外部センサ追従 通常のティーチングでは moveJ の方が適している。 --- # まとめ servoJ はリアルタイム位置制御APIである。 moveJ の高速版ではなく、 「一定周期で目標位置を書き換え続ける」 ための API である。 servo 系 API を使う場合は、 ・一定周期 ・lookahead_time ・gain ・servoStop() の4点を正しく理解することが重要である。 次章では Force Mode と Freedrive Mode を説明する。