ブストロフェドン細胞の分解は、環境を、ブストロフェドン経路によって効率的にカバーできる領域に単純に細分することです。台形分解が行われ、ラインスイープアルゴリズムを使用して実現できます。[Choset 2000]、このWebサイト
、または(お勧めです!)Mark de Bergなどによる優れた本「Computational Geometry」を参照してください。al、必要なデータ構造とアルゴリズムの完全な説明。
チョセット、ハウィー。「既知の空間のカバレッジ:ブストロフェドン細胞分解」自律ロボット、2000。
たとえば、障害物のセットをエッジと頂点として考えます。環境も特別なポリゴンに囲まれているとします。次のようなものがあります。この空間を分解するには、すべての頂点と最も近いラインまたは頂点の間に垂直エッジを追加するだけです。
コードでこれを実現するには、線分交差テスト、エッジのソート済みリスト、および頂点のソート済みリストのみが必要です。
- v私
- l私v私
- 各交差点で、新しい頂点を作成します。
これが完了すると、新しいエッジと頂点のセットは台形のみを囲みます。しかし、私は強調します、あなたはこれをオンラインで行うことはできません(障害の予備知識なしで)。事前の知識がなくても堅牢なカバレッジを実現したい場合は、「バグアルゴリズム」を参照してください。特に、環境が制限されていると仮定した場合の簡単なアルゴリズムを次に示します。
開始位置から、環境の左上隅に到達するまで上下に移動します。最初に障害物に遭遇した場合、その周辺を移動する必要があります。何かを迂回することができれば、障害物であることがわかります(バンプアンドムーブ)。
左上から、境界に達するまで右に移動します。次に、下に移動して左に移動します(空間全体のブーストロフェドンを実行しています)。
左右に並んでいて障害物に遭遇した場合、2つの選択肢があります。(i)カバーしようとしている左右の線に到達するまで迂回し、続行します。(ii)、障害物を通過するか、この状況に再び陥るまで、向きを変えて新しい左右の線をカバーできます。説明します。
左側では、私たちが追いかけようとした「ライン」に戻ることができるまで、障害物の周りを動き回ります。右側では、障害物の片側の(より小さい)エリアをカバーし続けます。
最初の方法の利点は、障害物を回避する方法を決定する前に、障害物を常に完全にマップすることです。したがって、より短い道を進むことができます。2番目の方法の利点は、障害物をまったく回避する必要がないことです。自分がいるエリアをカバーするために進むことができます。
これは、オンラインでのBoustrophedon分解を定義することに注意してください。障害物の間、または障害物と境界の間の領域をカバーします。
ただし、私の知る限り、最初の方法は分析が容易です。より複雑なアルゴリズム(BFSなど)は、環境が制限されていない(境界を永遠に探したくないため)か、基本的に環境を分割する方法に本当に厄介な障害があるために選択されます。なぜこれが悪いのですか?この例を見てください:
左から右に移動し、各障害物を周回すると、生成方法、各障害物との間に小さな部品のあまりに多くのカバーを。実際、グローバルパスプランニングなしで、これらの列を幅1ピクセル、環境全体と同じ高さ、1ピクセル離れて配置することで、グリッドの解像度と同じくらい悪いものにすることができます。その後、障害物にぶつかるたびに、障害物の周りを移動する必要があります。
これが、環境内のどこにいるのか、またはグローバルな経路計画を行うことができるかどうかを尋ねた理由です。しかし、オンライン対オフラインの議論とこれに最適なアルゴリズムは、あなたが本当に望んでいたものではありません。
更新:(httpsではなく)画像を削除する必要があり、実際の実際のアプリケーションでよく使用される画像を投稿します。http://www.cs.cmu.edu/~motionplanning/papers/sbp_papers/integrated1/yamauchi_frontiers.pdf