衝突判定の周期を一つの数値で決められない点が、このテーマで特に気になるところです。
先に結論
ロボットの衝突判定に、すべての用途で共通する固定周波数はありません。計画時の経路検証、実行時の軌道再検証、保護停止用の監視を分け、それぞれに適した精度と周期を設定します。
周期は単純なHzではなく、判定と判定の間にロボットと障害物が相対的にどれだけ移動するかで決めます。相対移動量が許容マージンを超えるなら、周期を短くするだけでなく、判定の細分化、連続衝突判定、保守的な掃引判定を検討します。
なぜ三つの層に分けるのか
計画層は、将来の状態列として生成された経路全体を、環境モデルと照合する役割を持ちます。実行層は、実行直前や実行中に、現在のロボット状態と最新の環境で軌道を再確認します。監視層はセンサー入力を使い、危険が迫った場合の速度制限や停止を担います。
計画用の判定頻度をそのまま保護監視へ使うことも、監視だけで計画経路全体の安全性を保証することも適切ではありません。再計画は新しい経路を生成する処理であり、衝突判定の代替ではないためです。再計画中もロボットが動くなら、別の監視層でその間を保護します。
前提となる用語と判定の仕組み
状態の有効性判定は、ある時点のロボット姿勢が障害物や自身のリンクと干渉していないかを調べる処理です。一方、モーション検証は二つの状態の間の動きを調べます。
始点と終点だけを判定すると、その間でリンクが障害物を通り抜ける衝突を見逃す可能性があります。OMPLでは状態の有効性判定と状態間のモーション検証を分け、離散的な検証では補間状態を検査します。MoveItのOMPLインターフェースでは、longest_valid_segment_fraction や longest_valid_segment_length により、モーション中に許す最大セグメント長を調整できます。
したがって、計画時の精度は「何Hzか」ではなく、状態空間における最大有効セグメント長として考える方が適切です。ロボット形状、障害物の薄さ、狭い隙間、姿勢変化による掃引領域を基準にします。長いリンクや大きな姿勢変化がある場合、同じ状態空間上の刻みでも空間内の移動量は大きくなり得ます。
flowchart LR
A["状態A"] --> B["状態間の動き"]
B --> C{"セグメント長は
形状・運動に対して適切か"}
C -->|"適切"| D["補間状態を検査"]
C -->|"長すぎる"| E["セグメントを細分化"]
E --> D
D --> F{"障害物・自己リンクとの
干渉を検出"}
F -->|"衝突なし"| G["次のセグメントへ"]
F -->|"衝突あり"| H["経路を不 valid として扱う"]
G --> I["状態B"]
A -.-> J["端点だけの判定では
途中の衝突を見逃し得る"]
I -.-> J動的障害物と安全マージン
動的環境では、判定した瞬間に安全でも、次の判定までにロボットや障害物が接近します。相対速度を v_rel、判定周波数を f_check、許容距離を d_allow とすると、周期設計の概念的な目安は次のように表せます。
v_rel / f_check ≤ d_allow
これは普遍的な安全式ではありません。d_allow には、形状モデルの簡略化誤差、センサー誤差、自己位置推定誤差、座標変換誤差、通信・計算・制御遅延、停止距離を含めて評価します。最大相対速度や遅延などが不明なら、具体的なHzは算出できません。
入力データが古い場合、判定周波数を上げても安全性が自動的に向上するわけではありません。保護監視ではセンサーのタイムアウトやデータの鮮度も扱い、更新が止まった場合の速度制限や停止を定義します。
判定方式の比較
| 判定方式 | 見逃しリスク | 計算量 | 向いている場面 | 注意点 |
|---|---|---|---|---|
| 端点中心の離散判定 | 高くなり得る | 小 | 単純な状態確認 | 状態間の衝突を見逃し得る |
| 細分化した離散モーション検証 | 分解能に依存 | 中〜大 | 計画時の経路全体 | セグメント長を形状・運動に合わせる |
| 連続衝突判定 | 運動中の接触を扱える | 大きくなり得る | 高速運動、相対速度の大きい障害物 | 最悪時の処理時間を確認する |
| 保守的な掃引判定 | 保守的 | 条件に依存 | 薄い障害物、安全側の監視 | 実際の可動領域より厳しくなり得る |
FCLは、衝突判定に加えて最近接距離クエリと連続衝突判定を提供します。連続判定は運動中の接触時刻を扱うため、単純な離散サンプリングとは異なります。高速運動や大きな相対速度では候補になりますが、処理時間は形状数、メッシュの複雑さ、計算環境などに依存します。一律の性能値で採用を決めることはできません。
flowchart LR
subgraph PLAN["計画層"]
E["環境モデル"] --> P["グローバルプランナー"]
R["現在のロボット状態"] --> P
P --> V["補間された経路の
離散モーション検証"]
V --> Q["計画経路"]
end
subgraph EXEC["実行・再検証層"]
Q --> PRE["実行直前の
Planning Scene整合性確認"]
PRE --> X["実行器"]
X --> STATE["実行中の現在状態"]
ENV["最新の環境情報"] --> RE["軌道の再検証"]
STATE --> RE
RE -->|"安全"| X
RE -->|"衝突または環境変化"| RP["再計画"]
RP --> P
end
subgraph MON["保護監視層"]
S["センサー入力"] --> FRESH{"入力は一定時間内に更新されたか"}
FRESH -->|"はい"| CM["独立した保護監視"]
FRESH -->|"いいえ"| SAFE["速度制限または停止"]
CM -->|"危険なし"| CONT["通常動作を継続"]
CM -->|"危険接近"| SAFE
SAFE --> X
end
ENV --> RE
S -.-> ENV
RP -.-> MON実装時の判断手順
まず、ロボットと障害物の最大相対速度、停止距離、センサー更新周期、通信・計算遅延を整理します。次に、形状、センサー、位置推定、座標変換の誤差を安全マージンへ反映します。
計画時は、薄い障害物、長いリンク、狭い通路、大きな姿勢変化がある領域を基準に最大セグメント長を決めます。静的障害物が中心で低速なら、細分化した離散モーション検証が候補です。高速運動や動的障害物では、連続判定または掃引判定を比較します。
実行時は平均処理時間ではなく、最悪時の衝突判定時間、周期ジッタ、センサーの古さ、再計画中の実行継続、連続する判定失敗を確認します。判定が間に合わない場合に、速度制限、停止、経路破棄、再計画のどれへ移行するかも定義します。
MoveIt Servoには collision_check_rate と、自己衝突・シーン衝突に対する近接しきい値の設定があります。公式設定例には collision_check_rate: 10.0 が示されていますが、これは特定実装の設定例であり、一般的な安全要求値ではありません。使用するリリースやコミットで確認する必要があります。
移動ロボットでは、Nav2のCollision Monitorのように、グローバルプランナーとは別の監視層を構成できます。センサー入力、保護ゾーン、速度制限・停止処理、入力データのタイムアウトを扱い、経路計画と保護動作を分離します。
どのような場合に採用すべきか
静的障害物、低速運動、単純な形状が中心なら、計画時の細分化離散検証と、実行時の周期的な再検証が基本候補です。動的障害物、薄い障害物、高速な姿勢変化、大きな遅延がある場合は、相対移動量と安全マージンを基準に周期を短くし、連続判定または保守的な掃引判定を検討します。
保護停止が必要なシステムでは、計画器から独立した監視層を設けます。最終的な設定値は、対象ロボットの速度、形状、センサー、遅延、停止性能を確認したうえで決めます。資料にある設定例を、そのまま安全値として扱ってはいけません。
まとめ
衝突判定は「何Hzにするか」ではなく、「判定間にどれだけ動くか」「どの誤差と遅延を許容するか」から設計します。計画時はモーション全体を十分な分解能で検証し、実行前後は最新状態で再検証し、危険時には独立した監視層で速度制限や停止を行う。この三層を分けることが、安全性と計算量を両立する基本方針です。
参考情報
- OMPL: State Validity Checking
- MoveIt: OMPL Interface Tutorial
- FCL: A General Purpose Library for Collision and Proximity Queries
- MoveIt: Realtime Servo
- MoveIt 2: servo_parameters.yaml
- Nav2: Collision Monitor Node Configuration
- MoveIt: Planning Scene
安全性と計算量の調整は、アルゴリズムだけでなく、遅延や停止性能を含むシステム全体で行う必要があります。
AI利用に関する注記
本サイトの記事は、複数のAIエージェントによる調査・執筆・レビューを経て公開しています。正確性と品質の向上に努めていますが、内容については必ず一次情報をご確認ください。