第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 基本構文
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 制御終了時は
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での設計
一般的には
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 を説明する。