# 第16章 Safety・Protective Stop・エラー復旧 ## 本章について UR は協働ロボットであるため、多数の安全機能を備えている。 通常の産業用ロボットではエラーとして扱われる状態でも、UR では安全機能が正常に動作した結果として停止する場合が多い。 本章では ・Robot Mode ・Runtime State ・Safety Mode ・Protective Stop ・Emergency Stop ・Fault ・Pythonからの復旧方法 について説明する。 --- # 16.1 URの状態 Controller は複数の状態を持っている。 ``` Robot Mode Runtime State Safety Mode ``` これらは別々の情報であり、 一つだけ見ても現在状態は判断できない。 --- # 16.2 Robot Mode Robot Mode は ロボット本体の状態 を表す。 例 ``` NO_CONTROLLER DISCONNECTED BOOTING POWER_OFF POWER_ON IDLE BACKDRIVE RUNNING ``` Move命令を送る前には ``` RUNNING ``` であることを確認すると安全である。 --- # 16.3 Runtime State Runtime State は プログラム実行状態 である。 例 ``` STOPPED PLAYING PAUSED ``` Robot Mode が RUNNING でも Program は STOPPED という状態は普通に存在する。 --- # 16.4 Safety Mode Safety Mode は 安全システム の状態である。 例 ``` NORMAL REDUCED PROTECTIVE_STOP SAFEGUARD_STOP SYSTEM_EMERGENCY_STOP ROBOT_EMERGENCY_STOP FAULT ``` Move実行前には NORMAL であることが望ましい。 --- # 16.5 Protective Stop もっとも発生頻度が高い停止である。 原因 ・衝突 ・速度超過 ・過負荷 ・異常姿勢 ・安全監視 など。 Protective Stop は 安全機能が正常に働いた結果 である。 故障ではない。 --- # 16.6 Emergency Stop Emergency Stop は 非常停止ボタン による停止である。 Protective Stop より 優先度が高い。 非常停止中は Dashboard から解除できない。 人が非常停止を解除する必要がある。 --- # 16.7 Safeguard Stop 安全柵 ライトカーテン など 外部安全入力 による停止である。 安全装置が復帰しない限り ロボットは動かない。 --- # 16.8 Fault Fault は Controller内部異常 または 重大エラー である。 Protective Stop より 復旧が難しい。 Controller再起動が必要になる場合もある。 --- # 16.9 エラー判定 Pythonでは ```python mode = rtde_r.getSafetyMode() ``` などで確認する。 例 ```python if mode != NORMAL: print("Safety Error") ``` 状態監視スレッドで 定期的に監視するとよい。 --- # 16.10 Dashboardによる復旧 代表的なコマンド ``` close safety popup unlock protective stop ``` 必要なら ``` power on brake release ``` も実行する。 --- # 16.11 推奨復旧シーケンス ``` Move失敗 ↓ Safety Mode確認 ↓ Popup閉じる ↓ Protective Stop解除 ↓ Robot Mode確認 ↓ Power ON ↓ Brake Release ↓ Move再開 ``` 状態を確認しながら 順番に復旧する。 --- # 16.12 RuntimeError ur_rtdeでは 通信エラーや安全停止時に ``` RuntimeError ``` が送出されることがある。 例 ```python try: rtde_c.moveJ(q) except RuntimeError as e: print(e) ``` 例外を捕捉せずに運用すると アプリケーション全体が終了する場合がある。 --- # 16.13 Moveの戻り値 Move命令では ``` True False ``` が返る場合もある。 しかし 戻り値だけでは 十分ではない。 例外と Safety Mode の両方を確認する。 --- # 16.14 wait_move() move終了後 ```python wait_move() ``` で ``` 現在位置 ↓ 目標との差 ↓ Robot Mode ↓ Safety Mode ``` まで確認すると 安全性が向上する。 --- # 16.15 reset_error() 高レベルAPIでは ```python reset_error() ``` を用意すると便利である。 内部では ``` close safety popup ↓ unlock protective stop ``` を実行する。 必要に応じて Robot Mode を確認する。 --- # 16.16 turn_on_motor() Motor ON は ``` power on ↓ brake release ``` の二段階である。 これらをまとめて ```python turn_on_motor() ``` として提供すると 利用者は内部手順を意識しなくてよい。 --- # 16.17 自動復旧 完全自動復旧は推奨されない。 例えば ``` 衝突 ↓ Protective Stop ↓ 即復旧 ↓ 再衝突 ``` となる可能性がある。 原因を確認した上で 再開することが重要である。 --- # 16.18 状態監視スレッド 典型例 ``` while True ↓ Robot Mode取得 ↓ Runtime State取得 ↓ Safety Mode取得 ↓ 異常なら通知 ``` 10〜50 Hz 程度で監視することが多い。 --- # 16.19 ur_ctrl.pyでの設計 高レベルAPIでは ```python get_robot_mode() get_runtime_state() get_safety_mode() is_protective_stopped() reset_error() turn_on_motor() ``` などを提供すると扱いやすい。 Move API と同様に 利用者は Dashboard を直接操作する必要がなくなる。 --- # 16.20 実運用での推奨フロー ``` 接続 ↓ Power ON ↓ Brake Release ↓ Move ↓ Move完了確認 ↓ Safety確認 ↓ 異常なら reset_error() ↓ 必要なら turn_on_motor() ↓ Move再開 ``` この流れを基本とすると、 多くの自動運転システムで再利用できる。 --- # まとめ UR の安全機能は ・Robot Mode ・Runtime State ・Safety Mode の三つを組み合わせて判断する。 Protective Stop は故障ではなく、安全機能による停止である。 一方、 Emergency Stop や Fault は復旧方法が異なる。 高レベルライブラリでは ・状態取得 ・エラー解除 ・Motor ON を個別 API として提供し、 利用者が Dashboard の詳細を意識しなくて済む設計が望ましい。 次章では、Python による実践的なサンプルプログラム(接続、ティーチング、ピックアンドプレース、状態監視、エラー復旧)をまとめて解説する。