Bilinmeyen engelleri olan bir ızgaradaki her erişilebilir alanı ziyaret etmenin etkili bir yolu nedir?


13

Keşif kullanarak, oldukça kaba bir 2B ızgara alanında engellerin bir haritasını oluşturmaya çalışıyorum. Bir boşluktan bitişik bir alana geçmeye çalışarak engelleri tespit ediyorum ve eğer bu başarısız olursa hedef alanda bir engel var (bu problemde bir menzil bulma sensörü konsepti yok).

örnek ızgara http://www.eriding.net/resources/general/prim_frmwrks/images/asses/asses_y3_5d_3.gif (örneğin)

Ulaşılabilir tüm kareler ziyaret edildiğinde işlem tamamlanır. Başka bir deyişle, bazı alanlar çevrelendikleri için engelleri olmasa bile tamamen ulaşılamayabilir. Bu bekleniyor.

En basit durumda, bir DFS algoritması kullanabilirim , ancak bunun tamamlanması çok uzun zaman alacağından endişeliyim - robot, yeni bölgeyi keşfetmekten daha fazla geri izleme harcayacak. Ulaşılamayan karelere ulaşmaya çalışırken bunun özellikle sorunlu olmasını bekliyorum, çünkü robot her seçeneği tüketecek.

Daha sofistike yöntemde yapılacak doğru şey Boustrophedon hücre ayrışması gibi görünmektedir .
Boustrophedon hücre ayrışması

Bununla birlikte, Boustrophedon hücre ayrışma algoritmasının iyi bir açıklamasını bulamıyorum (yani, basit terimlerle tam bir açıklama). Orada gibi kaynaklardır bu bir , ya da dikey hücre ayrışma bu daha genel olanına ancak üst düzey algoritmalar ne de katılan düşük seviye veri yapılarına fazla fikir sunmuyoruz.

O(n2)O(n4)nn


Çok ilginç bir problem. Anlaşılır olması için, "verimli" bir hücreye en az tekrarlanan ziyaret olarak mı tanımlıyorsunuz?
DaemonMaker

O(n2)

Sanırım bu, CNC işleme yazılımı ile karşılaşılana benzer bir sorun, malzemeyi kesme aleti ile ziyaret ederek çıkarması gerekiyor.
Rocketmagnet

@Rocketmagnet: tam olarak değil, çünkü CNC makinesi "engelleri" a priori biliyor, ben hareket ederken onları tespit ediyorum.
Ian

Evet, bu robotun yerini bildiği sınırlı bir ortamın çevrimiçi araştırmasıdır. Engellerin miktarı, yerleri ve şekilleri tamamen bilinmemektedir - dışbükey olmayabilirler.
Ian

Yanıtlar:


11

Boustrophedon hücre ayrışması, bir ortamı bir boustrophedon yolu ile etkili bir şekilde örtülebilen alanlara alt bölümlere ayırmaktır. Bir trapezoidal ayrışma yapılacaktır ve bir hat süpürme algoritması kullanılarak gerçekleştirilebilir. Bkz. [Choset 2000], Bu web sitesi veya (tavsiye ederim!) Mark de Berg, et. al, gerekli veri yapıları ve algoritmalarının tam bir açıklaması için.

Choset, Howie. "Bilinen Alanların Kapsamı: Boustrophedon Hücresel Ayrışması" Otonom Robotlar , 2000.


Örneğin, engel kümesini kenarlar ve köşeler olarak düşünün. Diyelim ki çevre özel bir çokgene de bağlı. Aşağıdaki gibi bir şeyimiz var. Bu alanı ayrıştırmak için, her tepe noktası ile en yakın çizgi veya tepe noktası arasına dikey kenarlar ekliyoruz.

Bunu kodda gerçekleştirmek için yalnızca bir çizgi segmenti kesişim testine, sıralı kenar listesine ve sıralı köşe listesine ihtiyacınız vardır.

  1. vi
  2. livi
  3. Her kavşakta yeni bir tepe noktası oluşturun.

Bu yapıldığında, yeni kenarlar ve köşeler kümesi sadece yamukları kapsar. Ama şunu vurgulıyorum, bunu çevrimiçi olarak yapamazsınız (engeller hakkında önceden bilgi sahibi olmadan). Önceden bilgi sahibi olmadan sağlam bir kapsama alanı oluşturmak istiyorsanız, "hata algoritmalarına" bakabilirsiniz. Özellikle, ortamın sınırlı olduğunu varsayarak basit bir algoritma.


  1. Başlangıç ​​konumundan, ortamın sol üst köşesine ulaşıncaya kadar yukarı ve sola hareket edin. İlk önce bir engelle karşılaşırsanız, onun etrafında seyahat etmelisiniz. Bir şeyin etrafı dolaştırılabiliyorsa (çarpma ve taşıma) bir engel olduğunu biliyorsunuz.

  2. Sol üst köşeden, sınırla karşılaşana kadar sağa hareket edin. Sonra aşağı ve sola hareket edin (tüm alanın bir bürokrasisini yapıyoruz).

  3. Sol-sağ çizgideyken ve bir engelle karşılaştığınızda iki seçeneğiniz vardır. (i) Kapsamaya çalıştığımız sol-sağ çizgiye ulaşana kadar dolaşabiliriz, sonra devam edebiliriz. (ii), Engeli aşarak ya da bu duruma tekrar gelene kadar yeni bir sol-sağ çizgiyi döndürebilir ve kaplayabiliriz. Ben açıklayacağım.

Solda, takip etmeye çalıştığımız “çizgiye” dönene kadar engelin etrafında hareket ediyoruz. Sağda, engelin bir tarafındaki (daha küçük) alanı kapatmaya devam ediyoruz.

İlk yöntemin avantajı, etrafta nasıl dolaşacağınıza karar vermeden önce her zaman engeli tamamen haritalamanızdır, böylece daha kısa yoldan gidebilirsiniz. İkinci yöntemin avantajı, engeli aşmak zorunda kalmamanızdır, sadece bulunduğunuz alanı kapsamaya devam edebilirsiniz.

Bunun boustrophedon ayrışmanızı çevrimiçi bir şekilde tanımladığını unutmayın : Engeller arasındaki veya engeller ile sınır arasındaki alanı kaplarsınız .

Ancak bildiğim kadarıyla, ilk yöntemin analiz edilmesi daha kolaydır. Daha karmaşık algoritmalar (BFS gibi), ya ortam sınırsız olduğu için (sonsuza kadar bir sınır aramak için harcamak istemediğiniz için) seçilir ya da temel olarak ortamı bölümlere ayırma yolunda gerçekten kötü bir engel vardır. Bu neden kötü? bu örneğe bakın:

Sağ-sol Hareketli sonra her engeli çizerek üretir yolu her engel arasındaki küçük parçaların çok fazla kapakları. Aslında, küresel yol planlaması olmadan, bu sütunları 1 piksel genişliğinde, tüm ortam kadar yüksek ve 1 piksel aralıklı yerleştirerek ızgara çözünürlüğünüz kadar kötü hale getirebilirsiniz. O zaman her vurduğunuzda engelin etrafında hareket etmelisiniz.

Bu yüzden çevrede nerede olduğunuz hakkında bir fikriniz olup olmadığını veya küresel yol planlaması yapabileceğinizi sordum. Ancak çevrimiçi ve çevrimdışı tartışma ve bunun için en uygun algoritmalar gerçekten istediğiniz şey değil.


Güncelleme: Görüntüleri kaldırmak zorunda kaldım (https değil) ve bunu pratik gerçek dünya uygulamalarında sıklıkla kullanılanı göndereceğim. http://www.cs.cmu.edu/~motionplanning/papers/sbp_papers/integrated1/yamauchi_frontiers.pdf


Sadece Boustrophedon ayrışma algoritmasının bir tanımını (basit terimlerle) bulmak yeterli olacaktır. Bunu yapmazsanız, benzer performansa sahip bir algoritmanın basit bir açıklaması iyidir.
Ian

Basit bir borostroedon ayrışma örneği ekledim.
Josh Vander Hook

3

Sonunda, bunu yapmanın en iyi yolunun çok basit bir konsept kullanmak olduğunu buldum: Taşkın Dolgusu . Kullanılmış bir yığın tabanlı iteratif bir yaklaşım yerine özyinelemeli seçeneği ve (zaten sadece bu ızgara kareler kullanılarak yığın sonraki konuma bulunduğunuz konumdan bir yolunu bulmak için arama * Bir A kullanılarak fiziksel alan için modifiye aralarında bir yol olmasını garantilediğim için ziyaret edildi).

Verimlilik oldukça makul görünüyor.


Benim gibi, sen sınır tabanlı keşif keşfettim cs.cmu.edu/~motionplanning/papers/sbp_papers/integrated1/... ve gerçekten iyi çalışıyor
smirkingman
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.