# 第5章 RTDEReceiveInterface ## 本章について RTDEControlInterface が「ロボットを動かす」クラスであるのに対し、RTDEReceiveInterface は「ロボットの状態を取得する」クラスである。 実際のアプリケーションでは、 ・現在位置取得 ・動作完了判定 ・エラー監視 ・安全状態監視 など、Move命令と同じくらい利用頻度が高い。 本章では、SDU Robotics `ur_rtde` の `RTDEReceiveInterface` の主要 API と利用方法について説明する。 --- # 5.1 Receive Interfaceとは `RTDEReceiveInterface` は SDU Robotics `ur_rtde` が提供する状態取得 I/F であり、Universal Robots 公式 RTDE の output data を利用して Controller の状態を取得する。 ``` UR Controller │ RTDE Output │ RTDEReceiveInterface │ Python ``` Move命令は一切持たない。 --- # 5.2 インスタンス生成 ```python from rtde_receive import RTDEReceiveInterface ROBOT_IP = "192.168.0.10" rtde_r = RTDEReceiveInterface(ROBOT_IP) ``` 通常は RTDEControlInterface と同時に生成する。 ```python rtde_c = RTDEControlInterface(IP) rtde_r = RTDEReceiveInterface(IP) ``` --- # 5.3 関節角度取得 最も利用するAPIである。 ```python q = rtde_r.getActualQ() ``` 戻り値 ``` [ q1, q2, q3, q4, q5, q6 ] ``` 単位 ``` rad ``` Joint Degreeではない。 --- # 5.4 関節速度 ```python dq = rtde_r.getActualQd() ``` 単位 ``` rad/s ``` 停止判定にも利用できる。 --- # 5.5 TCP位置取得 ```python pose = rtde_r.getActualTCPPose() ``` 戻り値 ``` [ x, y, z, rx, ry, rz ] ``` 単位 ``` m rad ``` である。 mmではない。 --- # 5.6 TCP速度 ```python speed = rtde_r.getActualTCPSpeed() ``` TCP速度ベクトルを取得する。 停止判定に利用できる。 --- # 5.7 TCP Force Force Sensor 搭載機では ```python force = rtde_r.getActualTCPForce() ``` を利用できる。 戻り値 ``` Fx Fy Fz Mx My Mz ``` Force Modeで頻繁に利用される。 --- # 5.8 Robot Mode ```python mode = rtde_r.getRobotMode() ``` Robot Controller の状態を取得する。 代表例 ・Disconnected ・Booting ・Power Off ・Idle ・Running など。 運転開始前の確認に利用する。 --- # 5.9 Safety Mode ```python mode = rtde_r.getSafetyMode() ``` 安全状態を取得する。 例 ・Normal ・Protective Stop ・Recovery ・Emergency Stop など。 --- # 5.10 Runtime State ```python state = rtde_r.getRuntimeState() ``` 現在のプログラム状態を取得する。 例えば ``` Stopped Running Paused ``` などを判定できる。 Dashboard と組み合わせることが多い。 --- # 5.11 Digital Input ```python rtde_r.getDigitalInState(pin) ``` 入力状態を取得する。 戻り値 ``` True False ``` --- # 5.12 Digital Output ```python rtde_r.getDigitalOutState(pin) ``` 出力状態を取得する。 実際にONになっているか確認できる。 --- # 5.13 Joint Temperature ```python temp = rtde_r.getJointTemperatures() ``` 各関節温度を取得する。 長時間運転時の監視に利用される。 --- # 5.14 動作完了判定 Move命令だけでは 「到着したか」 は分からない。 例えば ```python target = [...] while True: q = rtde_r.getActualQ() if max(abs(a-b) for a,b in zip(q,target)) < 1e-3: break time.sleep(0.01) ``` のように現在位置との差で判定する。 --- # 5.15 停止判定 速度でも判定できる。 ```python dq = rtde_r.getActualQd() ``` すべての速度が十分小さくなれば停止していると判断できる。 --- # 5.16 wait_move() の考え方 ur_ctrl.py の ```python wait_move() ``` は内部で ``` 現在位置 ↓ 目標位置との差 ↓ 許容誤差以内 ↓ 終了 ``` または ``` 速度 ↓ ほぼ0 ↓ 終了 ``` などを利用して判定する。 MoveJ の戻り値だけでは十分ではない。 --- # 5.17 監視ループ 典型例 ```python while True: pose = rtde_r.getActualTCPPose() mode = rtde_r.getRobotMode() safety = rtde_r.getSafetyMode() print(pose) if safety != NORMAL: break time.sleep(0.02) ``` 約50Hz程度で十分なことが多い。 --- # 5.18 RTDEReceive の特徴 RTDEReceive は ・高速 ・読み取り専用 ・複数APIが豊富 という特徴を持つ。 一方、 Move命令は持たない。 Move命令は RTDEControl を使用する。 --- # まとめ RTDEReceiveInterface はロボット状態監視専用クラスである。 本ライブラリでは ・現在位置取得 ・速度取得 ・Robot Mode ・Safety Mode ・Runtime State を利用して、 wait_move() エラー監視 状態監視 を実装している。 次章では RTDEIOInterface を説明する。