¿Cómo puedo mejorar el mapa en mi robot autónomo móvil usando KINECT?

9

Un pequeño trasfondo de mi puntería

Estoy en el proceso de construir un robot autónomo móvil que debe navegar por un área desconocida, debe evitar obstáculos y recibir información de voz para realizar diversas tareas. También debe reconocer caras, objetos, etc. Estoy usando un sensor Kinect y datos de odometría de rueda como sensores. Elegí C # como mi idioma principal ya que los controladores oficiales y SDK están disponibles. He completado el módulo Visión y PNL y estoy trabajando en la parte de Navegación.

Mi robot actualmente utiliza el Arduino como módulo de comunicación y un procesador Intel i7 x64 bit en una computadora portátil como CPU.

Esta es la descripción general del robot y su electrónica:

resumen del robot electrónica del robot


El problema

Implementé un algoritmo SLAM simple que obtiene la posición del robot de los codificadores y agrega todo lo que ve usando el kinect (como una porción 2D de la nube de puntos 3D) al mapa.

Así es como se ven actualmente los mapas de mi habitación:

cómo se ve un mapa de mi habitación Otro mapa mi cuarto

Esta es una representación aproximada de mi habitación real:

ingrese la descripción de la imagen aquí

Como puede ver, son mapas muy diferentes y muy malos.

  • ¿Se espera esto del uso de un cálculo justo?
  • Soy consciente de los filtros de partículas que lo refinan y estoy listo para implementar, pero ¿cuáles son las formas en que puedo mejorar este resultado?

Actualizar

Olvidé mencionar mi enfoque actual (que antes tenía que olvidar pero olvidé). Mi programa hace más o menos esto: (estoy usando una tabla hash para almacenar el mapa dinámico)

  • Nube de puntos de agarre de Kinect
  • Espere los datos entrantes de odometría en serie
  • Sincronice utilizando un método basado en marca de tiempo
  • Estime la pose del robot (x, y, theta) usando ecuaciones en Wikipedia y datos del codificador
  • Obtenga un "corte" de la nube de puntos
  • Mi segmento es básicamente una matriz de los parámetros X y Z
  • Luego, trace estos puntos según la pose del robot y los parámetros X y Z
  • Repetir
Shreyas Kapur
fuente

Respuestas:

1

¿Es esto lo que se esperaría? En principio sí. Aunque es posible que pueda mejorar su modelo de odometría, en general no es suficiente obtener un buen mapa. Sin una descripción de su sistema, es difícil decir cómo mejorarlo. En la mayoría de los sistemas, la estimación de la traducción es mejor que la rotación. Puede agregar un giroscopio y medir la rotación. Esto debería mejorar sus resultados significativamente.

En lugar de implementar un filtro de partículas usted mismo, puede usar una implementación SLAM, por ejemplo, desde openslam . Esto debería ahorrarle mucho tiempo y lo más probable es que le dé mejores resultados.

Jakob
fuente
Me haces sentir mejor al decir eso esperado: D, pero estoy realmente seguro de que mi odometría es muy buena ( especialmente mi rotación : D). He agregado una actualización que describe brevemente el sistema (si eso no es suficiente, puedo darle el código o cualquier otra información). Intentaré usar un giroscopio mañana y luego actualizaré los resultados. Me encantaría usar los algoritmos de openslam, pero estoy usando C # (para poder usar el SDK oficial), y la mayoría de las bibliotecas para tales tareas están en C ++ o se proporcionan en ROS (solo Linux). ¡Ciertamente me encantaría usarlos, pero simplemente no lo veo bien!
Shreyas Kapur
tinyslam afirma usar 200 líneas de código c. Supongo que portarlo a C # no debería ser tan difícil.
Jakob
¡Guauu! Pero supongo que no usa ningún filtro de partículas y hace lo mismo que estoy haciendo. Pero seguramente intentaré implementar eso. Muchas gracias :-)
Shreyas Kapur
1

Te sugiero que pruebes filtros de partículas / EKF.

Lo que haces actualmente:

-> Dead Reckoning: estás mirando tu posición actual sin ninguna referencia.

-> Localización continua: sabes aproximadamente dónde estás en el mapa.

Si no tiene una referencia y no sabe dónde se encuentra en el mapa, independientemente de las acciones que realice, le resultará difícil obtener un mapa perfecto.

Por ejemplo: estás en una habitación circular. Sigues avanzando. Sabes cuál fue tu último movimiento. El mapa que obtienes será el de una caja recta como estructura. Esto ocurrirá a menos y hasta que tenga alguna forma de localizar o saber dónde está exactamente en el mapa, de forma continua.

La localización se puede realizar a través de EKF / Filtros de partículas si tiene un punto de referencia inicial. Sin embargo, el punto de referencia inicial es imprescindible.

Naresh
fuente
Gracias por la respuesta, muy buen ejemplo, seguramente usaré EKF, pero el problema es que no soy malo en matemáticas, pero tampoco muy bueno, y estoy usando C #, así que no tengo ninguna biblioteca e implementación Yo mismo me llevará años. ¿Alguna sugerencia sobre eso?
Shreyas Kapur
Sería mucho mejor repasar tus matemáticas y tomar algunos cursos que hacer algo que no entiendas y que no puedas depurar. Aprenderlo e implementarlo. Definitivamente será de utilidad en el futuro.
Naresh
También busque implementaciones de C # en github. El trabajo es más popular de lo que parece.
Naresh
Gracias por las sugerencias, seguramente lo haremos mañana. Estoy haciendo todo lo posible para aprender las matemáticas, y espero hacerlo y estoy seguro de que será de gran ayuda. Tengo 13 años, que es el cuello de botella para aprender aquí, ¡ni siquiera nos han presentado a las matrices en la escuela! :-(
Shreyas Kapur
Sé que tienes 13 :) A Internet no le importa. Puedes recoger matrices de Khan Academy. Probabilidad y estadística también.
Naresh
1

Debido a que está usando el cálculo muerto, los errores al estimar la pose del robot se acumulan en el tiempo. Desde mi experiencia, después de un tiempo, la estimación de pose de cálculo muerto se vuelve inútil. Si usa sensores adicionales, como el giroscopio o el acelerómetro, la estimación de la postura mejorará, pero dado que no tiene retroalimentación en algún momento, divergerá como antes. Como resultado, incluso si tiene buenos datos del Kinect, construir un mapa preciso es difícil ya que su estimación de pose no es válida.

Necesita localizar su robot al mismo tiempo que intenta construir su mapa (¡SLAM!). Entonces, a medida que se crea el mapa, el mismo mapa también se utiliza para localizar el robot. Esto asegura que su estimación de pose no divergerá y que la calidad de su mapa debería ser mejor. Por lo tanto, sugeriría estudiar algunos algoritmos SLAM (es decir, FastSLAM) e intentar implementar su propia versión.

Demetris
fuente
Gracias por tu respuesta :-). Me doy cuenta de que el cálculo de los muertos es erróneo, pero el mapa que construí era a muy pequeña escala. Moví el robot lenta y lentamente para minimizar la mayor cantidad de error posible, el robot no se movió mucho. De hecho, he estudiado muchos algoritmos SLAM de openslam, pero como le dije a Naresh: "No soy malo en matemáticas, pero tampoco soy muy bueno, y estoy usando C #, así que no tengo ninguna biblioteca e implementación. yo mismo me llevará años ". ¿Alguna sugerencia sobre eso?
Shreyas Kapur
¿Hace algún procesamiento posterior con los datos de Kinect? Es posible que los datos contengan algo de ruido y si lo deja sin tratar podría invalidar su mapa. Intenta simplificar el problema. Deje que el robot se detenga y mapee las paredes por delante. ¿Cómo funciona ahora? Si el mapa está despejado, significa que el problema ocurre debido al movimiento. Si no, entonces el problema es mucho más fundamental.
Demetris