Qual é uma maneira eficiente de visitar todos os espaços acessíveis em uma grade com obstáculos desconhecidos?


13

Estou tentando criar um mapa dos obstáculos em um espaço de grade 2D bastante grosso, usando a exploração. Detecto obstáculos tentando mover-me de um espaço para um espaço adjacente e, se isso falhar, haverá um obstáculo no espaço de destino (não há conceito de sensor de alcance neste problema).

grade de exemplo http://www.eriding.net/resources/general/prim_frmwrks/images/asses/asses_y3_5d_3.gif (por exemplo)

O processo está concluído quando todos os quadrados alcançáveis ​​foram visitados. Em outras palavras, alguns espaços podem ser completamente inacessíveis, mesmo que não tenham obstáculos porque estão cercados. Isso é esperado.

No caso mais simples, eu poderia usar um algoritmo DFS , mas estou preocupado que isso demore muito tempo para ser concluído - o robô passará mais tempo retornando do que explorando um novo território. Espero que isso seja especialmente problemático ao tentar alcançar os quadrados inacessíveis, porque o robô esgotará todas as opções.

No método mais sofisticado, a coisa certa a fazer parece ser a decomposição das células de Boustrophedon .
Decomposição de células de Boustrophedon

No entanto, não consigo encontrar uma boa descrição do algoritmo de decomposição de células de Boustrophedon (ou seja, uma descrição completa em termos simples). Existem recursos como este , ou este mais geral, sobre decomposição vertical de células, mas eles não oferecem muita percepção dos algoritmos de alto nível nem das estruturas de dados de baixo nível envolvidas.

Como posso visitar (mapear) esta grade com eficiência? Se ela existir, gostaria um algoritmo que executa melhor do que O(n2) com relação ao número total de quadrados de grelha ( isto é, melhor do que O(n4) para uma nn grade).


Problema muito interessante. Para maior clareza, você está definindo "eficiente" como o menor número de visitas repetidas a qualquer célula?
DaemonMaker

O(n2)

Acho que esse é um problema semelhante ao enfrentado pelo software de usinagem CNC, que deve remover o material visitando-o com a ferramenta de corte.
Rocketmagnet 20/02

@Rocketmagnet: não exatamente, já que a máquina CNC conhece os "obstáculos" a priori , enquanto eu os detecto enquanto me movo.
Ian

Sim, esta é uma pesquisa on-line de um ambiente limitado onde o robô sabe sua localização. A quantidade, a localização e a forma dos obstáculos são completamente desconhecidos - eles podem não ser convexos.
21413 Ian Ian

Respostas:


11

A decomposição de células de Boustrophedon está simplesmente subdividindo um ambiente em áreas que podem ser eficientemente cobertas por um caminho de Boustrophedon. Uma decomposição trapezoidal fará e pode ser realizada usando um algoritmo de varredura de linha. Veja [Choset 2000], Este site , ou (eu recomendo!) O excelente livro "Computational Geometry" de Mark de Berg, et. al, para uma descrição completa das estruturas de dados e algoritmos necessários.

Choset, Howie. "Cobertura de espaços conhecidos: a decomposição celular de Boustrophedon" Robots Autônomos , 2000.


Por exemplo, considere o conjunto de obstáculos como arestas e vértices. Digamos que o ambiente também seja limitado por um polígono especial. Temos algo como o seguinte. Para decompor esse espaço, basta adicionar arestas verticais entre todos os vértices e a linha ou vértice mais próximo.

Para fazer isso no código, você precisa apenas de um teste de interseção de segmento de linha, uma lista classificada de arestas e uma lista classificada de vértices.

  1. vEu
  2. euEuvEu
  3. Em cada interseção, crie um novo vértice.

Quando isso é feito, o conjunto de novas arestas e vértices inclui apenas trapézios. Mas enfatizo que você não pode fazer isso online (sem o conhecimento prévio dos obstáculos). Se você deseja fazer uma cobertura robusta sem conhecimento prévio, consulte "algoritmos de erros". Em particular, aqui está um algoritmo simples, supondo que o ambiente seja limitado.


  1. A partir da posição inicial, mova-se para cima e para a esquerda até chegar ao canto superior esquerdo do ambiente. Se você encontrar um obstáculo primeiro, deve percorrê-lo. Você sabe que algo é um obstáculo se puder ser circunavegado (bater e mover).

  2. Do canto superior esquerdo, mova para a direita até encontrar o limite. Em seguida, mova-se para baixo e para a esquerda (estamos fazendo um boustrophedon de todo o espaço).

  3. Quando você está na linha esquerda-direita e encontra um obstáculo, você tem duas opções. (i) Podemos circunavegar até chegar à linha esquerda-direita que estamos tentando cobrir e continuar. (ii), podemos nos virar e cobrir uma nova linha esquerda-direita até encontrarmos o caminho para superar o obstáculo ou acabar nessa situação novamente. Vou ilustrar.

À esquerda, contornamos o obstáculo até retornar à "linha" que estávamos tentando seguir. À direita, continuamos cobrindo a área (menor) de um lado do obstáculo.

A vantagem do primeiro método é que você sempre mapeia completamente o obstáculo antes de tomar uma decisão sobre como contorná-lo, assim pode seguir o caminho mais curto. A vantagem do segundo método é que você não precisa contornar o obstáculo, basta prosseguir para cobrir a área em que está.

Observe que isso define sua decomposição de microfones em uma maneira on-line : você cobre a área entre os obstáculos ou entre os obstáculos e os limites.

No entanto, tanto quanto eu sei, o primeiro método é mais fácil de analisar. Os algoritmos mais complicados (como BFS, etc), são escolhidos porque o ambiente é ilimitado (você não quer gastar eternamente procurando por um limite) ou há um obstáculo realmente desagradável na maneira como basicamente divide o ambiente. Por que isso é ruim? veja este exemplo:

Movendo-se da esquerda para a direita, em seguida, circulando cada obstáculo produz maneira demasiados capas das peças pequenas entre cada obstáculo. De fato, sem o planejamento de caminho global, você pode tornar isso tão ruim quanto a resolução da sua grade, colocando essas colunas com 1 px de largura, com a altura de todo o ambiente e 1 px de distância. Então você teria que se mover ao redor do obstáculo cada vez que o atingisse.

É por isso que perguntei se você tinha alguma idéia de onde estava no ambiente ou se poderia fazer um planejamento global do caminho. Mas a discussão online versus offline e os algoritmos ideais para isso não é o que você realmente queria.


Atualização: tive que remover as imagens (não https) e publicarei isso que é frequentemente usado em aplicativos práticos do mundo real. http://www.cs.cmu.edu/~motionplanning/papers/sbp_papers/integrated1/yamauchi_frontiers.pdf


Apenas encontrar uma descrição (em termos simples) do algoritmo de decomposição de Boustrophedon seria suficiente. Caso contrário, é simples uma descrição simples de um algoritmo com desempenho semelhante.
21413 Ian

Adicionei um exemplo simples de decomposição boustrophedon.
Josh Vander Gancho

3

No final, descobri que a melhor maneira de fazer isso era empregar um conceito muito simples: preenchimento de inundação . Usei uma abordagem iterativa baseada em pilha em vez da opção recursiva e modifiquei-a para espaço físico usando uma pesquisa A * para encontrar um caminho do local atual para o próximo local na pilha (usando apenas os quadrados da grade que já foram foi visitado, já que tenho a garantia de ter um caminho entre eles).

A eficiência parece bastante razoável.


Como eu, você descobriu baseada fronteira de exploração cs.cmu.edu/~motionplanning/papers/sbp_papers/integrated1/... e que, efectivamente funciona bem
smirkingman
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.