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