第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では
mode = rtde_r.getSafetyMode()
などで確認する。
例
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
が送出されることがある。
例
try:
rtde_c.moveJ(q)
except RuntimeError as e:
print(e)
例外を捕捉せずに運用すると
アプリケーション全体が終了する場合がある。
16.13 Moveの戻り値
Move命令では
True
False
が返る場合もある。
しかし
戻り値だけでは
十分ではない。
例外と
Safety Mode
の両方を確認する。
16.14 wait_move()
move終了後
wait_move()
で
現在位置
↓
目標との差
↓
Robot Mode
↓
Safety Mode
まで確認すると
安全性が向上する。
16.15 reset_error()
高レベルAPIでは
reset_error()
を用意すると便利である。
内部では
close safety popup
↓
unlock protective stop
を実行する。
必要に応じて
Robot Mode を確認する。
16.16 turn_on_motor()
Motor ON は
power on
↓
brake release
の二段階である。
これらをまとめて
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では
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 による実践的なサンプルプログラム(接続、ティーチング、ピックアンドプレース、状態監視、エラー復旧)をまとめて解説する。