第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 による実践的なサンプルプログラム(接続、ティーチング、ピックアンドプレース、状態監視、エラー復旧)をまとめて解説する。