Um pouco do meu objetivo
Estou no processo de construção de um robô autônomo móvel que deve navegar em uma área desconhecida, evitar obstáculos e receber informações de fala para executar várias tarefas. Ele também deve reconhecer faces, objetos etc. Estou usando um sensor Kinect e dados de odometria da roda como sensores. Eu escolhi o C # como meu idioma principal, pois os drivers oficiais e o sdk estão disponíveis. Concluí o módulo Vision e NLP e estou trabalhando na parte Navigation.
Atualmente, meu robô usa o Arduino como módulo de comunicação e um processador Intel i7 x64 bit em um laptop como CPU.
Esta é a visão geral do robô e de seus componentes eletrônicos:
O problema
Eu implementei um algoritmo SLAM simples que obtém a posição do robô dos codificadores e adiciona o que vê usando o kinect (como uma fatia 2D da nuvem de pontos 3D) ao mapa.
É assim que os mapas do meu quarto atualmente se parecem:
Esta é uma representação aproximada do meu quarto real:
Como você pode ver, eles são mapas muito diferentes e muito ruins.
- Isso é esperado usando apenas o acerto de contas morto?
- Estou ciente dos filtros de partículas que o refinam e estão prontos para implementar, mas quais são as maneiras pelas quais posso melhorar esse resultado?
Atualizar
Eu esqueci de mencionar minha abordagem atual (que antes eu tinha que esquecer). Meu programa aproximadamente faz isso: (estou usando uma hashtable para armazenar o mapa dinâmico)
- Pegue a nuvem de pontos do Kinect
- Aguarde os dados de odometria serial recebidos
- Sincronizar usando um método baseado em carimbo de data / hora
- Estimar a pose do robô (x, y, teta) usando equações na Wikipedia e dados do codificador
- Obter uma "fatia" da nuvem de pontos
- Minha fatia é basicamente uma matriz dos parâmetros X e Z
- Em seguida, plote esses pontos com base na pose do robô e nos parâmetros X e Z
- Repetir
Eu sugiro que você tente filtros de partículas / EKF.
O que você faz atualmente:
-> Dead Reckoning: Você está vendo sua posição atual sem nenhuma referência.
-> Localização contínua: você sabe aproximadamente onde está no mapa.
Se você não tem uma referência e não sabe onde está no mapa, independentemente de quais ações realiza, será difícil obter um mapa perfeito.
Por exemplo: você está em uma sala circular. Você continua seguindo em frente. Você sabe qual foi sua última jogada. O mapa que você obtém será o de uma caixa reta como a estrutura. Isso ocorrerá a menos e até que você tenha alguma maneira de localizar ou saber onde você está precisamente no mapa, continuamente.
A localização pode ser feita via EKF / Particle Filters se você tiver um ponto de referência inicial. No entanto, o ponto de referência inicial é obrigatório.
fonte
Como você está usando o cálculo morto, os erros ao estimar a pose do robô se acumulam com o tempo. Da minha experiência, depois de um tempo, a estimativa de pose de acerto de contas torna-se inútil. Se você usar sensores extras, como o giroscópio ou o acelerômetro, a estimativa da pose será aprimorada, mas como você não tem feedback em algum momento, ela divergirá como antes. Como resultado, mesmo se você tiver bons dados do Kinect, é difícil criar um mapa preciso, pois sua estimativa de pose não é válida.
Você precisa localizar seu robô ao mesmo tempo em que tenta construir seu mapa (SLAM!). Assim, à medida que o mapa está sendo criado, o mesmo mapa também é usado para localizar o robô. Isso garante que sua estimativa de pose não seja divergente e que a qualidade do seu mapa seja melhor. Portanto, sugiro estudar alguns algoritmos do SLAM (por exemplo, FastSLAM) e tentar implementar sua própria versão.
fonte