Lo que hemos hecho para esta práctica es recoger información de la cámara, debido a la gran cantidad de información que ofrece este sensor hemos analizado únicamente la línea de abajo.
Analizamos dónde está el color rojo y para saber cual es el comportamiento según el lugar de este color hemos dividido la línea en 7 zonas:
- Zona central: indica que se recorre correctamente la línea y por lo tanto tan solo hay que avanzar sin corrección de giro.
- Zonas de ligera desviación: estas zonas estás a ambos lados de la zona central, si el rojo está en una de estas zonas el ángulo de giro es ligero hacia ese lado.
- Zonas de moderada desviación: son zonas a continuación de la anterior, el ángulo de giro es más pronunciado.
- Zonas de esquina: son las zonas más externas, indican que se ha llegado a una esquina por lo que el comportamiento es retroceder a la vez que se gira hacia el lado donde está la línea. La razón por la que se retrocede es ganar algo de tiempo.
También está implementada la opción de pérdida de línea, en ese caso lo que hacemos es retroceder hasta encontrar de nuevo nuestra línea roja.
Con todo esto hemos conseguido recorrer el circuito en 2 minutos 20 segundos.
Por alguna razón al grabar el vídeo el framerate es diferente del tiempo real, así que dura unos 4 minutos, de todas formas se puede ver en el contador de tiempo del simulador el tiempo real que son 150 segundos menos los diez que tardamos en hacer click para que iniciase.
miércoles, 4 de junio de 2008
martes, 3 de junio de 2008
Practica 3: El Rescate (2)
La segunda parte de la práctica consiste en conseguir comunicación por bluetooth con otro robot para que se coordinen en el recorrido, la cuestión es que al encontrarnos con algo de frente no sabemos si estamos frente a un robot o frente a un obstáculo, de modo que intentamos abrir la conexión y es el otro robot el que debería avisarnos de que estamos cerca.
En caso de que estemos cerca de algo y no nos contestara deberemos ejecutar la maniobra de evasión de obstáculo.
Como se puede ver en el vídeo la comunicación por bluetooth estaba separada del resto del movimiento, esto se debía a que la cantidad de funciones, variables y constantes llenaba la tabla de símbolos del programa que según hemos leído está limitada a 255 entradas, la solución ha sido escribir un código mas monolítico.
En caso de que estemos cerca de algo y no nos contestara deberemos ejecutar la maniobra de evasión de obstáculo.
Como se puede ver en el vídeo la comunicación por bluetooth estaba separada del resto del movimiento, esto se debía a que la cantidad de funciones, variables y constantes llenaba la tabla de símbolos del programa que según hemos leído está limitada a 255 entradas, la solución ha sido escribir un código mas monolítico.
Practica 3: El Rescate (1)
Enunciado
La idea de esta práctica es programar el robot para que siga una línea en la cual se encontrará discontinuidades, obstáculos (latas) y heridos, el comportamiento debe ser adecuado en cada situación como se indica en la guía.
Lo primero que hemos hecho es programar un sigue lineas básico que es capaz de seguir un camino completo, recuerda el último giro realizado de modo que para el siguiente giro toma la curva en la misma dirección, esto ayuda para que las curvas largas se hagan mas rápido.
Para las discontinuidades se comienza el mismo procedimiento de giro y si tras un numero n de iteraciones no se ha conseguido de nuevo encontrar la línea se alinea con la posición anterior y avanza hasta encontrar la linea o repetir el procedimiento.
Los heridos son de dos tipos, los plateados se toman como un caso especial de las discontinuidades, al encontrar un valor de luz menor que el de la línea puede ser el de un herido plateado o el del fondo. Si es un herido el robot hace un sonido y sigue.
Los heridos de color verde se consideran parte de la línea, de modo que solo se encuentran cuando se está avanzando, de esta manera durante el avance se comprueba el color encontrado, si es parecido al verde se comprueba que realmente está sobre un herido girando 10 grados y recomprobando.
Hicimos esto porque existe la posibilidad de que el borde de la línea se confunda con el verde.
Por último añadimos la funcionalidad de esquivar obstáculos, en nuestro caso una lata. Para poder identificarlo usamos el sensor de ultrasonidos que va tomando medidas constantemente, en el momento que identifica que hay un obstáculo cercano deja de seguir la línea y bordea la lata. Una vez bordeada vuelve a buscar la línea y sigue con el recorrido.

La idea de esta práctica es programar el robot para que siga una línea en la cual se encontrará discontinuidades, obstáculos (latas) y heridos, el comportamiento debe ser adecuado en cada situación como se indica en la guía.
Lo primero que hemos hecho es programar un sigue lineas básico que es capaz de seguir un camino completo, recuerda el último giro realizado de modo que para el siguiente giro toma la curva en la misma dirección, esto ayuda para que las curvas largas se hagan mas rápido.
Para las discontinuidades se comienza el mismo procedimiento de giro y si tras un numero n de iteraciones no se ha conseguido de nuevo encontrar la línea se alinea con la posición anterior y avanza hasta encontrar la linea o repetir el procedimiento.
Los heridos son de dos tipos, los plateados se toman como un caso especial de las discontinuidades, al encontrar un valor de luz menor que el de la línea puede ser el de un herido plateado o el del fondo. Si es un herido el robot hace un sonido y sigue.
Los heridos de color verde se consideran parte de la línea, de modo que solo se encuentran cuando se está avanzando, de esta manera durante el avance se comprueba el color encontrado, si es parecido al verde se comprueba que realmente está sobre un herido girando 10 grados y recomprobando.
Hicimos esto porque existe la posibilidad de que el borde de la línea se confunda con el verde.
Por último añadimos la funcionalidad de esquivar obstáculos, en nuestro caso una lata. Para poder identificarlo usamos el sensor de ultrasonidos que va tomando medidas constantemente, en el momento que identifica que hay un obstáculo cercano deja de seguir la línea y bordea la lata. Una vez bordeada vuelve a buscar la línea y sigue con el recorrido.

Rescue.java
miércoles, 23 de abril de 2008
Calibración de giro
Dados los problemas que tuvimos en el giro del robot, decidimos caracterizar el error producido por el giro de los motores para realizar la consecuente corrección en el movimiento para posteriores programas.
Tomamos varias medidas en diferentes ángulos.
- Ángulo de 90º

- Ángulo de 180º

- Ángulo de 270º

- Ángulo de 360º

- Ángulo de -90º

- Ángulo de -180º

- Ángulo de -270º

- Ángulo de -360º

Hemos realizado la toma de medidas cuatro veces para cada ángulo, teniendo en cuenta que los positivos son giros en sentido a las agujas del reloj y los negativos son en sentido inverso a las agujas del reloj.
Tomamos varias medidas en diferentes ángulos.
- Ángulo de 90º

- Ángulo de 180º

- Ángulo de 270º

- Ángulo de 360º
- Ángulo de -90º
- Ángulo de -180º
- Ángulo de -270º
- Ángulo de -360º

Hemos realizado la toma de medidas cuatro veces para cada ángulo, teniendo en cuenta que los positivos son giros en sentido a las agujas del reloj y los negativos son en sentido inverso a las agujas del reloj.
| Grados de giro | Media | Desviación típica |
|---|---|---|
| 90º | 1.8º | 0.03 |
| 180º | 3.8º | 0.62 |
| 270º | 7,4º | 1.1 |
| 360º | 9,1º | 1.81 |
Navegación con fuerzas virtuales
La idea en este caso es que dadas n medidas tomadas por el radar veremos si hay obstáculo o no, en caso de que lo haya este generara una fuerza virtual que será un vector con origen el obstaculo y con la direccion de la recta que une el obstaculo con el robot. Su modulo se calcula como inversamente proporcional a la distancia entre el robot y el obstaculo.
Con esto tenemos un vector resultante "negativo" es decir que apunta hacia atras segun la perspectiva de nuestro robot, para evitar esto le sumamos un vector en direccion al destino que queremos alcanzar. Si seguimos este vector con el robot el comportamiento sera tal que vamos hacia nuestro destino evitando los obstaculos que nos encontramos en el camino.

En la figura se ven en rojo los obstáculos, en verde el vector que apunta al destino actual, el vector rojo es el resultante de sumar las fuerzas repulsivas de los obstáculos y el vector amarillo es el resultante de la suma de los últimos dos, el robot seguiría finalmente la dirección en la que apunta el vector amarillo.
Una consideración que hay que tener es que mientras que las mediciones que obtenemos con el radar los vectores resultantes se obtienen en cartesianas, una vez obtenidos nuestros vectores tenemos que darle a los motores angulo y desplazamiento, es decir coordenadas polares de nuevo.
Para pasar de cartesianas a polares utilizamos:

Esto nos devuelve angulos en el rango
, por lo que para convertirlos a ángulos de motor hay que restarle 90 grados.
Con esto tenemos un vector resultante "negativo" es decir que apunta hacia atras segun la perspectiva de nuestro robot, para evitar esto le sumamos un vector en direccion al destino que queremos alcanzar. Si seguimos este vector con el robot el comportamiento sera tal que vamos hacia nuestro destino evitando los obstaculos que nos encontramos en el camino.

En la figura se ven en rojo los obstáculos, en verde el vector que apunta al destino actual, el vector rojo es el resultante de sumar las fuerzas repulsivas de los obstáculos y el vector amarillo es el resultante de la suma de los últimos dos, el robot seguiría finalmente la dirección en la que apunta el vector amarillo.
Una consideración que hay que tener es que mientras que las mediciones que obtenemos con el radar los vectores resultantes se obtienen en cartesianas, una vez obtenidos nuestros vectores tenemos que darle a los motores angulo y desplazamiento, es decir coordenadas polares de nuevo.
Para pasar de cartesianas a polares utilizamos:
Esto nos devuelve angulos en el rango
sábado, 19 de abril de 2008
Practica 2 (El Radar)
Enunciado
En esta práctica haremos un radar usando el ultrasonido, la idea es conseguir que el robot obtenga un mapa del entorno de modo que su información del entorno aumente y le permita navegar de forma autónoma esquivando los obstáculos por ejemplo.
(1) Montaje del robot con el ultrasonido sobre un motor para que sea capaz de moverse, hemos conseguido poner el ultrasonido mirando hacia adelante y hemos cambiado el diseño del robot para que sea mas estable.



(2) Creación del radar, el ultrasonido esta sobre un motor y gira con este mientras toma medidas de la distancia a la que estan los obstaculos. Tambien hay que dibujar en pantalla alguna representacion de lo anterior.
Como la información que nos devuelve el radar es la distancia del objeto y el ángulo en que se tomo la medida tenemos que convertir estas coordenadas polares en cartesianas para pintarlas:


Además hay que trasladar estas coordenadas a coordenadas de pantalla y normalizarlas para que se ajusten al tamaño de la pantalla.
(3) Navegación usando el radar
Dado el vector de distancias buscamos la medida mas alta, y seguimos su dirección. Esto nos garantiza que no iremos a parar contra un obstaculo cercano
En esta práctica haremos un radar usando el ultrasonido, la idea es conseguir que el robot obtenga un mapa del entorno de modo que su información del entorno aumente y le permita navegar de forma autónoma esquivando los obstáculos por ejemplo.
(1) Montaje del robot con el ultrasonido sobre un motor para que sea capaz de moverse, hemos conseguido poner el ultrasonido mirando hacia adelante y hemos cambiado el diseño del robot para que sea mas estable.



(2) Creación del radar, el ultrasonido esta sobre un motor y gira con este mientras toma medidas de la distancia a la que estan los obstaculos. Tambien hay que dibujar en pantalla alguna representacion de lo anterior.
Como la información que nos devuelve el radar es la distancia del objeto y el ángulo en que se tomo la medida tenemos que convertir estas coordenadas polares en cartesianas para pintarlas:
Además hay que trasladar estas coordenadas a coordenadas de pantalla y normalizarlas para que se ajusten al tamaño de la pantalla.
(3) Navegación usando el radar
Dado el vector de distancias buscamos la medida mas alta, y seguimos su dirección. Esto nos garantiza que no iremos a parar contra un obstaculo cercano
martes, 1 de abril de 2008
Práctica 1
Enunciado
En esta práctica tomamos contacto con el robot, la idea es imprimir en pantalla ciertos valores obtenidos de los sensores o del propio robot que son:
- Nombre del robot, le hemos llamado "Fermín"
- Valor del sensor de ultrasonidos en mm. hay que tener en cuenta que el sensor de ultrasonidos devuelve el valor en cm así que hay que multiplicarlo por 10.
- Valor del sensor de luz, al usar el metodo readNormalizedValue el sensor nos devuelve un valor entre 0 y 1023 correspondiente a la entrada en bruto del sensor, al llamar a readValue el sensor nos devuelve una entrada en porcentaje entre el valor mínimo y máximo usados al calibrar.
- Tensión de la batería expresada en milivoltios.
- Memoria libre expresada en bytes, para encontrar esto tenemos que buscar en el api de LejOS hasta encontrarnos con lo siguiente
Runtime.getRuntime().freeMemory()
jueves, 27 de marzo de 2008
Fermín y los 64 bits
Lo primero que hemos tenido que hacer es instalar el software para poder programar el robot, nos encontramos con algunos problemas que venían solucionados en el foro de la asignatura.
Pero nos encontramos con que una vez solucionados todos los problemas anteriores no compilaba por problemas con la arquitectura de 64 bits, o al menos eso parecía por el mensaje de error que salía.
Para solucionarlo hay que hacer lo siguiente:
(1) Entrar en el directorio ~/lejos_nxt/libnxt
(2) Editar el fichero build.xml y agregar lo siguiente:
< value="-fPIC">
Justo después de todas las demás entradas de compilerarg.
La opción -fPIC de gcc genera código independiente de la posición que se puede usar para enlazado dinámico y evita los problemas de límite en la tabla global de desplazamientos (que parece ser el problema con los 64 bits).
Esto según dice el man solo funciona con algunas máquinas (con nuestro portátil funciona).
(3) ir a la carpeta ~/lejos_nxt/build y ejecutar ant, saldrán algunos mensajes de warning por la conversión del tamaño de punteros (entre 64 y 32) pero no parece dar ningún problema (de momento).
Pero nos encontramos con que una vez solucionados todos los problemas anteriores no compilaba por problemas con la arquitectura de 64 bits, o al menos eso parecía por el mensaje de error que salía.
Para solucionarlo hay que hacer lo siguiente:
(1) Entrar en el directorio ~/lejos_nxt/libnxt
(2) Editar el fichero build.xml y agregar lo siguiente:
< value="-fPIC">
Justo después de todas las demás entradas de compilerarg.
La opción -fPIC de gcc genera código independiente de la posición que se puede usar para enlazado dinámico y evita los problemas de límite en la tabla global de desplazamientos (que parece ser el problema con los 64 bits).
Esto según dice el man solo funciona con algunas máquinas (con nuestro portátil funciona).
(3) ir a la carpeta ~/lejos_nxt/build y ejecutar ant, saldrán algunos mensajes de warning por la conversión del tamaño de punteros (entre 64 y 32) pero no parece dar ningún problema (de momento).
Suscribirse a:
Entradas (Atom)


