Navegación visual: mejoras I

Tras trabajar la cabeza y el código, he incluido las siguientes mejoras:

  1. He acotado la visión del robot, dado que a partir de una cierta distancia, las medidas son menos exactas. Con ello generamos menos segmentos imprecisos.
  2. He añadido una navegación sencilla, donde la aceleración (positiva / negativa) es progresiva, con lo que evitamos los movimientos bruscos del robot (y consecuentemente de la cámara) que nos daba coordenas incorrectas de los puntos.
  3. He afinado aún más las constantes de fusión, con lo que se fusionan más segmentos y por tanto se almacenan menos.

Aún cuento con dos problemas que explico en el foro de la asignatura y con la negativa de recordmydesktop para grabar los vídeos…

Una prueba de los resultados:

resultado11

En la imagen se ve al robot después de haber girado hacia el pasillo de la derecha. Se ve claramente el mapa en memoria generado desde su salida hasta que ha alcanzado la posición en la que se encuentra.

Otra imagen más, esta vez le he dado la vuelta al robot..

resultadoatras

Y en breve os colgaré un par de vídeos.

Anuncios

Navegación Visual: cambio de estrategia

Como dice Juanes en una de sus canciones, “It’s time to change”… ¿y por qué?. Porque después de complicar cada vez más el código intentando mantener la detección de la “frontera” descrita en los posts anteriores, me he dado cuenta de que para comprobar si existen obstáculos en el suelo se complica todo tanto que el código generado se ha vuelto demasiado ineficiente (da demasiadas vueltas).

Por ello he dado marcha atrás y he puesto a funcionar mi cabecita en busca de una solución mejor y…. ¡eureka! la encontré.

El nuevo método para obtener tanto la frontera como los obstáculos es el siguiente:

La idea es recorrer la imagen por columnas, de izquierda a derecha y de abajo hacia arriba. De esta forma buscamos el primer punto que no coincida con el color del suelo.

También comprobamos si detrás de ese primer punto encontrado, en la siguiente fila, hay suelo.  En ese caso el punto detectado no se corresponde con un límite, si no más bien con una esquina que no me deja ver lo que hay detrás…

Con ello estamos simulando, mejor que con el método anterior, el funcionamiento del laser, obteniendo un total de 340 puntos.

Realmente hemos reducido a una cuarta parte el código tanto del escaneado de la pantalla como de la construcción de segmentos.

Resultados:

Y un detalle de una esquina:

Navegación Visual III: Segmentación

Esta es quizás una de las tareas más sencillas, dado que vamos a reutilizar el código de la práctica anterior (construcción de mapas), modificándolo para que trabaje con los puntos obtenidos de la “frontera” en vez de con el laser.

Dado que estamos escaneando la imagen de abajo a arriba, y con el fin de simular un comportamiento similar (que no igual) al laser, realizaremos dos bucles:

  1. Recorrido por todos los límites izquierdos del suelo (de abajo a arriba).
  2. Lo mismo pero con el lado derecho.

De esta forma, cada punto frontera será traducido a su correspondiente punto en el mundo (coordenadas absolutas – explicado en el post anterior) y pasado al constructor de mapas.

Resultado:

funcionando