# 第4章 RTDEControlInterface ## 本章について 本章では、SDU Robotics `ur_rtde` の `RTDEControlInterface` が提供するモーション制御 API について説明する。 UR を Python から制御する場合、最も頻繁に利用するクラスである。 本章を読み終えると、 ・moveJ ・moveL ・moveP ・speedJ ・speedL ・servoJ ・servoL ・停止命令 の違いを理解できる。 --- # 4.1 RTDEControlInterface とは `RTDEControlInterface` は、SDU Robotics `ur_rtde` が提供する **PC 側モーション制御 I/F** である。Universal Robots 純正 RTDE protocol の motion API ではない。 例えば ```python rtde_c.moveJ(...) ``` を呼び出すと、PC 側 `RTDEControlInterface` は Universal Robots 公式 RTDE の register を利用して command と parameter を controller に渡す。Robot 側では SDU の control URScript がその値を読み取り、対応する `movej` などの URScript motion command を実行する。URControl がその command を実行して実際のロボット制御へ接続する。 したがって、`RTDEControlInterface` から Servo Controller を公式 RTDE で直接呼び出しているわけではない。 状態取得は `RTDEReceiveInterface` が担当する。 --- # 4.2 Move命令の分類 RTDEControl が提供する代表的な命令は次のように分類できる。 |種類|API|用途| |----|----|--------------------| |関節補間|moveJ|最も一般的| |直線補間|moveL|加工・計測| |円弧補間|moveC|円軌道| |複合補間|moveP|Blendを利用した軌道| |速度制御|speedJ|関節速度| |速度制御|speedL|TCP速度| |サーボ|servoJ|リアルタイム制御| |サーボ|servoL|リアルタイム制御| まずは moveJ と moveL を理解することが重要である。 --- # 4.3 moveJ moveJ は Joint Move である。 ロボットは **各関節角度** を目標として動く。 ``` 開始姿勢 ↓ 各関節が同時に回転 ↓ 目標姿勢 ``` 途中のTCP軌道は保証されない。 --- ## 引数 ```python moveJ( q, speed, acceleration, asynchronous ) ``` 例 ```python q = [ 0.0, -1.57, 1.57, 0.0, 1.57, 0.0, ] rtde_c.moveJ(q) ``` --- ## 利点 ・高速 ・逆運動学不要 ・最も安定 ・教示点移動向き --- ## 欠点 TCPは曲線軌道になる。 加工用途には向かない。 --- # 4.4 moveL moveL は Linear Move である。 TCPが **一直線** に移動する。 ``` A ──────────── B ``` TCP軌跡を保証する。 --- 用途 ・加工 ・塗布 ・レーザー ・測定 ・ピックアンドプレース --- ## 引数 ```python pose = [x,y,z,rx,ry,rz] ``` ```python rtde_c.moveL(pose) ``` 姿勢は Rodrigues Vector で表現する。 --- # 4.5 moveJとmoveLの違い ``` moveJ TCP ○ ╲ ╱ ○ moveL TCP ○────────○ ``` moveJ は関節補間 moveL はTCP補間 である。 --- # 4.6 moveP moveP は Process Move である。 複数点を Blend しながら滑らかに接続する。 ``` ○────○────○ ↓ 滑らかな軌道 ``` 停止時間を減らしたい場合に利用する。 --- # 4.7 加速度 moveJ moveL ともに ```python acceleration ``` を指定できる。 単位は ``` rad/s² または m/s² ``` APIによって異なる。 --- # 4.8 速度 ```python speed ``` は 目標速度 である。 大きく設定しても 安全制限 Payload Joint Limit などにより自動で制限される。 --- # 4.9 非同期実行 ```python moveJ(..., asynchronous=True) ``` とすると、 関数は 移動終了を待たず すぐ戻る。 ``` moveJ() ↓ すぐreturn ↓ ロボットは動き続ける ``` 同期実行では ``` moveJ() ↓ 移動終了 ↓ return ``` となる。 --- # 4.10 停止命令 代表的な停止命令 ```python stopJ() ``` 関節停止 ```python stopL() ``` TCP停止 急停止ではなく、 減速停止である。 Emergency Stopとは異なる。 --- # 4.11 戻り値 moveJ moveL などは 通常 ```python True ``` または ```python False ``` を返す。 Falseは ・通信失敗 ・制御失敗 などを意味する。 ただし Protective Stop などでは 例外が発生する場合もある。 そのため 戻り値だけではなく 例外処理も必要である。 --- # 4.12 推奨パターン ```python try: ok = rtde_c.moveJ(q) if not ok: print("Move failed") except RuntimeError as e: print(e) ``` この形を推奨する。 --- # 4.13 ur_ctrl.pyでの利用 本ライブラリでは ``` move() ↓ moveJ() または moveL() ``` へ自動的に振り分ける。 利用者は RTDEControlInterface を直接意識する必要はない。 --- # まとめ RTDEControlInterface は ロボットへ動作命令を送るクラスである。 最も重要なのは ・moveJ ・moveL であり、 まずこの二つを理解すれば、 ほとんどのアプリケーションを作成できる。 次章では RTDEReceiveInterface を説明する。