第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 を説明する。