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:
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:
Esta es una representación aproximada de mi habitación real:
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
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.
fuente
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.
fuente