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 .
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 com relação ao número total de quadrados de grelha ( isto é, melhor do que para uma grade).
Respostas:
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.
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.
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).
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).
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
fonte
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.
fonte