Como posso melhorar o mapa no meu robô autônomo móvel usando o KINECT

9

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:

visão geral do robô eletrônica do robô


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:

como é o mapa do meu quarto Outro mapa meu quarto

Esta é uma representação aproximada do meu quarto real:

insira a descrição da imagem aqui

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
Shreyas Kapur
fonte

Respostas:

1

É isso o que seria esperado: em princípio, sim. Embora você possa melhorar seu modelo de odometria, em geral não é suficiente obter um bom mapa. Sem uma descrição do seu sistema, é difícil dizer como melhorá-lo. Na maioria dos sistemas, a estimativa de conversão é melhor que a rotação. Você pode adicionar um giroscópio e medir a rotação. Isso deve melhorar significativamente seus resultados.

Em vez de implementar um filtro de partículas, você pode usar uma implementação SLAM, por exemplo, do openslam . Isso economiza muito tempo e provavelmente fornecerá melhores resultados.

Jakob
fonte
Você me faz sentir melhor dizendo o que é esperado: D, mas estou realmente confiante de que minha odometria é muito boa ( especialmente minha rotação : D). Eu adicionei uma atualização que descreve brevemente o sistema (se isso não for suficiente, posso fornecer código ou qualquer outra informação). Vou tentar usar um giroscópio amanhã e depois atualizar os resultados. Eu adoraria usar os algoritmos do openslam, mas estou usando C # (para poder usar o SDK oficial), e a maioria das bibliotecas para essas tarefas estão em C ++ ou são fornecidas em ROS (somente Linux). Eu certamente adoraria usá-los, mas não vejo nada nítido!
Shreyas Kapur
O tinyslam afirma usar 200 linhas de código c. Eu acho que portá-lo para c # não deve ser tão difícil.
Jakob
Uau! Mas acho que ele não usa nenhum filtro de partículas e faz a mesma coisa que estou fazendo. Mas certamente tentarei implementar isso. Thanks a lot :-)
Shreyas Kapur
1

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.

Naresh
fonte
Obrigado pela resposta, exemplo muito bom mesmo, certamente usarei o EKF, mas o problema é que não sou ruim em matemática, mas também não muito bom e estou usando C #, por isso não tenho bibliotecas e a implemento eu mesmo me levarei idades. Alguma sugestão sobre isso?
Shreyas Kapur
Seria muito melhor revisar sua matemática e fazer alguns cursos do que criar algo que você não entende e não pode depurar. Aprenda e implemente. Definitivamente, será útil no futuro.
Naresh
Procure também implementações em C # no github. O trabalho é mais popular do que parece.
Naresh
Obrigado pelas sugestões, certamente o fará amanhã. Estou tentando o meu melhor para aprender matemática, e espero fazê-lo e tenho certeza de que isso irá percorrer um longo caminho. Tenho 13 anos, que é o gargalo para aprender aqui, nem sequer fomos apresentados a matrizes na escola! :-(
Shreyas Kapur
Eu sei que você tem 13 anos :) A internet não se importa. Você pode pegar matrizes na Khan Academy. Probabilidade e estatística também.
Naresh
1

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.

Demetris
fonte
Obrigado pela sua resposta :-). Percebo que o acerto de contas morto é errado, mas o mapa que construí foi em uma escala muito pequena. Movi o robô lenta e lentamente para minimizar o máximo de erros possível, o robô não se moveu muito. Na verdade, estou estudando muitos algoritmos SLAM do openslam, mas como disse a Naresh: "Não sou ruim em matemática, mas também não muito bom e estou usando C #, por isso não tenho bibliotecas e a implemento. eu mesmo vou levar séculos. " Alguma sugestão sobre isso?
Shreyas Kapur
Você realiza algum pós-processamento com os dados do Kinect? É possível que os dados contenham algum ruído e, se você o deixar não tratado, poderá invalidar o seu mapa. Tente simplificar o problema. Deixe o robô parado e mapeie as paredes à sua frente. Como isso funciona agora? Se o mapa estiver claro, significa que o problema acontece por causa do movimento. Caso contrário, o problema é muito mais fundamental.
Demetris 13/06