Navegación visual

Ya estamos de vuelta para ponernos manos a la obra con la última práctica (por fin!).

En esta ocasión el objetivo está en poder navegar por el mundo utilizando el pioneer (desde el simulador Gazebo) usando para ello sólo la información que nos da la cámara (nada de laser).

Las tareas a realizar serán las siguientes:

  1. Identificar el suelo en la imagen captada por la cámara (2D).
  2. Realizar una conversión de los puntos 2D a 3D (utilizando la biblioteca Progeo).
  3. Representarlo mediante segmentos.
  4. Utilizar esta información para navegar.

El mundo en el que se desarrolla esta práctica es el departamental de la URJC de Móstoles:

departamental

Anuncios

Construcción de mapas (final)

… o eso espero!

Por indicación de José María (el profe 😉 ), os muestro un último vídeo para que se pueda comprobar con detalle la eliminación de segmentos no válidos.

Para saber si un segmento es o no válido, por cada punto del laser detectado, comprobaremos si el segmento formado por la posición del robot y este punto tiene intersección con cualquiera de los segmentos que tenemos almacenados. En ese caso, si el segmento es “pequeño” lo eliminanos, mientras que si es grande lo acortamos por el punto de intersección.

Pero lo mejor es verlo:

Como podéis comprobar, al avanzar el robot azul, el rojo va detectando lo que había detrás de este, fusionando con los segmentos que ya teníamos e, igualmente, eliminando los segmentos “no válidos” (donde estaba el robot azul).

La calidad del video es peor que la de los anteriores, pero es que mi recordmydesktop se niega a trabajar (no se si es porque es fin de semana, porque no aguanta el player con los dos jde de cada robot, …) y he tenido que hacer uso de la cámara del móvil.

Hasta otra!

Construcción de mapas (parte I)

Ya estoy de vuelta,

después de una larga temporada sin escribir en este foro vuelvo para compartir mis nuevos logros en el campo de la robótica.

En este caso os muestro la práctica en la que me encuentro trabajando: contrucción de mapas a través de la interpretación de la información recibida del laser.

Lo que en un principio parece sencillo se complica cuando se quiere afinar el diseño.

En nuestro caso, lo que vamos a intentar es interpretar las 180 distancias recibidas del laser (una por cada grado), de forma que si es esta es menor de 7500 (realmente el laser llega hasta los 8000)  sabemos que existe un obstáculo.

La primera mejora es ir interpretando los puntos para agruparlos en segmentos, de manera que evitamos almacenar mucha información. Para cada segmento tan solo necesitaremos un punto inicial y otro final.

Tras conseguir realizar un escaneado de todos los puntos y agruparlos por segmentos, almacenándolos en la memoria, tendremos que volver a realizar otra pasada, pero en este caso, cada vez que se detecte un segmento comprobaremos si existe ya en memoria. Puede ocurrir que se detecte el mismo segmento (el robot no se ha movido), o bien que se pueda fusionar con alguno los que están en memoria.

En la siguiente imagen podéis ver cómo se interpretan los 180 puntos, construyendo 8 segmentos.

fusion2

Ahora tendremos que implementar un procedimiento que elimine los segmentos de memoria no válidos. Estos se detectan en el caso de que el segmento formado entre la posició del robot y el punto interpretado intersecte con alguno de los almacenados en memoria.

Un saludo!

Siguelínea Versión Mejorada

Hace unos días nos llevamos una sorpresa al conocer que la velocidad máxima no eran 1000mm/seg, sino que para esta práctica el software de simulación no trunca los valores superiores a 1000.

Así que nos pusimos a trabajar para poder mejorar los tiempos de vuelta, y hemos conseguido un algoritmo que hace que el robot complete una vuelta en unos 72 segundos, alcanzando una velocidad máxima de 2000 mm/sg.

Aquí podéis ver el resultado:

SigueLínea V2

En esta nueva versión hemos mejorado bastante  el funcionamiento de nuestro robot con respecto a la primera. Concretamente, hemos creado un navegacion.c completamente nuevo…

Para construirlo, en esta ocasión (y a petición del profe 😉 ), no hemos utilizado estados finitos, sino que hemos programado un par de controladores PD para que controlen el valor de la velocidad (v) y el giro (w).

Dichos controladores van calculando el error que existe entre lo esperado y lo realizado y modificando los valores de v y w en consecuencia.

En concreto, el error que hemos considerado es la distancia (en píxeles) entre el centro de la línea roja y la mitad de la imagen (píxel 120), todo ello medido en la última línea de la imagen capturada por la cámara.

Dicho error modifica el compartamiento del robot, afectando tanto a la velocidad como al giro, de forma que si es muy grande, el giro aumente considerablemente y la velocidad disminuya, y si el error es pequeño (porque estamos muy cerca de la línea roja) giramos menos y avanzamos más rápido, controlando que según nos acercamos al objetivo se suavicen los movimientos.

Igualmente controlamos que si ha perdido de vista la línea (porque la curva es pronunciada) se pare y siga girando (mantenemos la w anterior).

Resultado: Tras ajustar las constantes de los controladores PD hemos conseguido avanzar más rápido y con movimientos más suaves (se acabaron los zig-zags!!). En el siguiente vídeo podéis comprobarlo:

Si os fijáis, en la parte inferior se muestran los valores que van tomando la v (velocidad) y la w (el giro). En las rectas va muy estable, alcanzando normalmente la velocidad máxima (v=1000)…

Ahh y da una vuelta completa en 110 segundos!!

NOTA: el vídeo va un poco lento por las características de mi equipo.