未知の障害物があるグリッド上のすべての到達可能なスペースを訪問する効率的な方法は何ですか?


13

探索を使用して、かなり粗い2Dグリッド空間に障害物のマップを作成しようとしています。ある空間から隣接する空間に移動しようとすることで障害物を検出し、それが失敗した場合、目的地に障害物があります(この問題には距離測定センサーの概念はありません)。

サンプルグリッドhttp://www.eriding.net/resources/general/prim_frmwrks/images/asses/asses_y3_5d_3.gif(例)

すべての到達可能な正方形が訪問されると、プロセスは完了します。言い換えると、一部のスペースは、囲まれているため障害物がなくても完全に到達できない場合があります。これは予想されることです。

最も単純なケースでは、DFSアルゴリズムを使用できますがこれを完了するには非常に長い時間がかかるのではないかと心配しています。ロボットは、新しい領域を探索するよりもバックトラッキングに多くの時間を費やします。ロボットはすべてのオプションを使い果たしてしまうので、到達不能な正方形に到達しようとするとき、これは特に問題があると思います。

より洗練された方法では、行うべき適切なことは、ブストロフェドン細胞の分解であると思われます。
ブストロフェドン細胞の分解

ただし、Boustrophedonセル分解アルゴリズムの適切な説明(つまり、簡単な用語での完全な説明)を見つけることができないようです。そこリソースは次のようにしているこのいずれかまたは垂直セル分解で、この一般の方が、彼らは関与ハイレベルのアルゴリズムも低レベルのデータ構造に多くの洞察を提供していません。

On2On4nn


非常に興味深い問題。明確にするために、特定のセルに繰り返しアクセスする回数が最も少ないことを「効率的」と定義していますか?
DaemonMaker

On2

これは、CNC加工ソフトウェアが直面している問題と同様の問題であると考えられます。CNC加工ソフトウェアは、切削工具で材料を訪問して材料を除去する必要があります。
Rocketmagnet

@Rocketmagnet:まったく違います。CNCマシンはアプリオリの「障害物」を知っているため、移動中にそれらを検出しています。
イアン

はい、これはロボットがその位置を知っている境界環境のオンライン検索です。障害物の量、位置、および形状は完全に不明であり、凸状ではない場合があります。
イアン

回答:


11

ブストロフェドン細胞の分解は、環境を、ブストロフェドン経路によって効率的にカバーできる領域に単純に細分することです。台形分解が行われ、ラインスイープアルゴリズムを使用して実現できます。[Choset 2000]、このWebサイト 、または(お勧めです!)Mark de Bergなどによる優れた本「Computational Geometry」を参照してください。al、必要なデータ構造とアルゴリズムの完全な説明。

チョセット、ハウィー。「既知の空間のカバレッジ:ブストロフェドン細胞分解」自律ロボット、2000。


たとえば、障害物のセットをエッジと頂点として考えます。環境も特別なポリゴンに囲まれているとします。次のようなものがあります。この空間を分解するには、すべての頂点と最も近いラインまたは頂点の間に垂直エッジを追加するだけです。

コードでこれを実現するには、線分交差テスト、エッジのソート済みリスト、および頂点のソート済みリストのみが必要です。

  1. v
  2. lv
  3. 各交差点で、新しい頂点を作成します。

これが完了すると、新しいエッジと頂点のセットは台形のみを囲みます。しかし、私は強調します、あなたはこれをオンラインで行うことはできません(障害の予備知識なしで)。事前の知識がなくても堅牢なカバレッジを実現したい場合は、「バグアルゴリズム」を参照してください。特に、環境が制限されていると仮定した場合の簡単なアルゴリズムを次に示します。


  1. 開始位置から、環境の左上隅に到達するまで上下に移動します。最初に障害物に遭遇した場合、その周辺を移動する必要があります。何かを迂回することができれば、障害物であることがわかります(バンプアンドムーブ)。

  2. 左上から、境界に達するまで右に移動します。次に、下に移動して左に移動します(空間全体のブーストロフェドンを実行しています)。

  3. 左右に並んでいて障害物に遭遇した場合、2つの選択肢があります。(i)カバーしようとしている左右の線に到達するまで迂回し、続行します。(ii)、障害物を通過するか、この状況に再び陥るまで、向きを変えて新しい左右の線をカバーできます。説明します。

左側では、私たちが追いかけようとした「ライン」に戻ることができるまで、障害物の周りを動き回ります。右側では、障害物の片側の(より小さい)エリアをカバーし続けます。

最初の方法の利点は、障害物を回避する方法を決定する前に、障害物を常に完全にマップすることです。したがって、より短い道を進むことができます。2番目の方法の利点は、障害物をまったく回避する必要がないことです。自分がいるエリアをカバーするために進むことができます。

これは、オンラインでのBoustrophedon分解を定義することに注意してください。障害物の間、または障害物と境界の間の領域をカバーします。

ただし、私の知る限り、最初の方法は分析が容易です。より複雑なアルゴリズム(BFSなど)は、環境が制限されていない(境界を永遠に探したくないため)か、基本的に環境を分割する方法に本当に厄介な障害があるために選択されます。なぜこれが悪いのですか?この例を見てください:

左から右に移動し、各障害物を周回すると、生成方法、各障害物との間に小さな部品のあまりに多くのカバーを。実際、グローバルパスプランニングなしで、これらの列を幅1ピクセル、環境全体と同じ高さ、1ピクセル離れて配置することで、グリッドの解像度と同じくらい悪いものにすることができます。その後、障害物にぶつかるたびに、障害物の周りを移動する必要があります。

これが、環境内のどこにいるのか、またはグローバルな経路計画を行うことができるかどうかを尋ねた理由です。しかし、オンラインオフラインの議論とこれに最適なアルゴリズムは、あなたが本当に望んでいたものではありません。


更新:(httpsではなく)画像を削除する必要があり、実際の実際のアプリケーションでよく使用される画像を投稿します。http://www.cs.cmu.edu/~motionplanning/papers/sbp_papers/integrated1/yamauchi_frontiers.pdf


Boustrophedon分解アルゴリズムの説明(簡単な用語)を見つけるだけで十分です。それに失敗すると、同様のパフォーマンスを備えたアルゴリズムの簡単な説明で十分です。
イアン

簡単なブストロフェドン分解の例を追加しました。
ジョシュヴァンダーフック

3

結局、これを行う最良の方法は、非常に単純なコンセプトであるFlood Fillを使用することであることがわかりました。私が使用されるスタックベースの反復アプローチの代わりに再帰オプションを、そして(既にのみグリッド正方形を使用して、スタック内の次の位置に現在位置から経路を見つけるために検索* Aを使用して、物理空間のためにそれを改変しました私はそれらの間にパスがあることが保証されているため、訪問されました)。

効率はかなり合理的です。


私のような、あなたはフロンティアベースの探査発見したcs.cmu.edu/~motionplanning/papers/sbp_papers/integrated1/...をし、それは確かにうまく機能
smirkingman
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.