jueves, 22 de abril de 2010

Reto de la autolocalizacion

En este apartado hemos aplicado el uso de particulas para conseguir que nuestro robot se localize en un mapa mediante la utilizacion de la clase TachoLocalizator, finalmente de este apartado hemos conseguido que se desplazen las particulas pero sin conseguir que el robot sepa donde esta. Añadiendo las dificultades de que nuestro ladrillo se ha roto, no hemos podido completar el total de la practica

jueves, 15 de abril de 2010

Reconocimiento de la posicion

En este ejercicio, teníamos dos apartados:
Localizarnos:
En este apartado lo que realizamos es la toma de histogramas de cada punto, después tomamos otro histograma para comprobar en que punto nos encontramos, y realizamos el algoritmo.
El algoritmo consta de restar el histograma que tenemos actual con todos los que teníamos almacenados, una vez comparados, nos quedamos con el que nos haya dado el menor resultado y esa sera la posición en la que nos encontramos.
Posición estimada:
Para calcular la posición estimada, necesitamos primero realizar un escaneo de todos los puntos con el radar del primer apartado.
Una vez tenemos tomados todos los puntos con ese radar, realizamos un escaneo de la posición en la que estamos, utilizando el mismo radar.
Con el nuevo histograma tomado, y con el que teníamos almacenado con la posición conocida, empezamos a realizar comprobaciones y a rotar el nuevo histograma, de esta forma tras realizar todas las rotaciones y comparaciones, buscamos el valor de la resta menor, que sera los grados a los que esta de nuestro punto de origen

Diseño del Radar

En este ejercicio tenemos que implementar un radar, creando una clase la cual recibe una serie de parámetros para su creación:
public Radar (int vel, int resol, int amp, UltrasonicSensor sonar, Motor motor)
vel: Velocidad del escaneo.
resol:Resolución del escaneo.
amp:Amplitud del escaneo, es decir grados en los que realiza el escaneo.
Sonar: El sonar con el que realizamos el escaneo
Motor: Motor que mueve el sonar.

Luego hemos realizado, un método que realiza un escaneo y devuelve un RangeReadings con las medidas.

Visualizacion del Mapa y las Particulas

En este ejercicio de la practica 5 hemos tenido que cargar un fichero proporcionado por los profesores en el que teníamos un mapa implementado del circuito para la realización de la practica. Tambien teniamos que inicializar una población de partículas y mostrar el mapa con las partículas repartidas de forma homogénea.
Aquí mostramos una foto de la resolución del ejercicio:





jueves, 25 de marzo de 2010

Calculo de la Trayectoria 3º

Calculo de la Trayectoria
Parte 3º

En este apartado nos pedían que como conseguir mediante dos arcos que el robot llegara a su destino con la orientación final.
Para este ejercicio lo que hemos pensado que seria mejor, es realizar un punto intermedio del destino a donde quieres llegar, y dirigirse primero hacia ese destino.
Una vez en el primer destino, tendríamos que realizar otro arco en la dirección opuesta para poder quedarnos en la posición indicada.
Es importante indicar que la orientación en la que tendría que empezar el robot depende de la orientación destino que nos indique, ya que tendríamos que orientarnos de forma similar a la orientación destino para finalmente, cuando realicemos el segundo arco terminar en una posición similar.
También es de interés la amplitud del primer arco, ya que si la orientacion tiene unos valores altos, el primer arco tendría que alejarse bastante del punto para poder realizar en el segundo arco un giro de mayor amplitud.
Aquí indicamos con pseudocódigo como quedaría:

Tomamos los valores de la X,Y,Ang
Calculamos la distancia hacia el punto
Dividimos la distancia en dos puntos dependiendo del ángulo de destino.
Calculamos el primer arco, con un radio determinado y un ángulo de giro dependiendo del ángulo final
Realizamos el segundo arco.

Calculo de la Trayectoria 2º

Calculo de la Trayectoria
Parte 2º

En la segunda parte de este ejercicio, es realizar lo mismo que el anterior, pero consiguiendo que el robot realice una curva hacia el destino.
Esta petición nueva complica notablemente la realización de los cálculos ya que ahora no tienes que calcular una recta sino una curva, con el radio y el ángulo que vas a realizar.
Los pasos son los siguientes:
1- Creación de un menú donde introducimos las coordenados X e Y y el ángulo de destino
2- Calculo del radio y el ángulo que tenemos que tomar para llegar al destino
3- Desplazamiento hacia el destino.

Seguidamente mostramos un vídeo ilustrativo de la realización de la practica:

Calculo de la Trayectoria

Calculo de la Trayectoria:
Parte 1º
En este ejercicio, lo que se nos pedía es que mediante la introducción de unas coordenadas al robot y un ángulo de orientación final, el robot pudiera
dirigirse a ese punto satisfactoriamente.
Los pasos que hemos seguido han sido los siguiente.
1- Creación de un menú donde introducimos las coordenadas X e Y y el ángulo de destino
2- Orientación del robot hacia ese destino
3- Movimiento del robot hacia las coordenadas indicadas
4- Orientación final del robot, al ángulo previamente introducido.
Con estos pasos hemos conseguido que el robot llegue al punto deseado quedándose en el estado indicado.

Con este vídeo ilustrativo podemos observar el resultado de lo dicho:

Practica 4->Modelo de movimiento probabilistico mediante filtro de particulas

Esta practica consta del conocimiento de los mapas de partículas.
Para la realización de la misma, nos hemos tenido que crear un mapa de 100 partículas que se colocan aleatoriamente, después hemos tenido que inicializar esas partículas en el punto de partida de nuestro robot, y seguidamente actualizar las partículas con el movimiento del mismo, consiguiendo de esta forma una estela de partículas que nos va informando del movimiento del robot. Para la actualización de las partículas hemos tenido que introducir un error probabilístico, en el cual nos hemos dado cuenta, que cuanto mas erro metíamos mas se dispersan las partículas.
Para poder mostrar el mapa, hemos tenido que crear un mapa de antemano donde se puedan colocar las partículas.
La creación de este mapa se ha hecho mediante un conjunto de lineas dentro de un rectángulo.
Aquí mostramos un vídeo de la finalización del primer apartado de la practica:
Como podemos observar, vemos como las partículas se mueven por el monitor del robot, dejando la estela antes mencionada




jueves, 11 de marzo de 2010

Practica 3

Hola otra semana mas y una nueva practica.
En este caso hemos realizado la implementacion de los programas de forma distinta a las anteriores practicas.
En esta hemos realizado las acciones del robot mediante comportamientos, estos comportamientos tienen 3 métodos que son obligatorios de implementar ya que extienden de una interfaz llamada Behavior, en esta interfaz tenemos 3 métodos.
TakeControl: Este método se ejecuta constantemente y busca que se cumpla una determinada condición , tras la cual ser cierta, entramos en el método Action.
Action: Este ejecuta el comportamiento del robot cuando se cumple la condición del takeControl
Supress: Este método se ejecuta cuando se cambia de comportamiento.

Esta practica ha sido una de las mas dificil por ahora, sobre todo el ejercicio de VFF, en el cual hemos intentado conseguir llegar al os requisitos sin mucho éxito y con mucho esfuerzo.
Aqui os dejamos unos cuantos videos sobre los puntos que hemos alcanzado

Choque-sigue luz

Este es el ultimo ejercicio, utilizando los sensores de choque y los de luz,permitiendo que en todo momento el robot, sepa que cuando choca tiene que evitar el obstáculo y cuando pierde la luz seguirla.

Luz

Este es el tercer ejercicio de la practica, en el que podemos observar como el robot mediante los sensores de luz, se dirige hacia la misma.

miércoles, 10 de marzo de 2010

Estamos ante el primer ejercicio de la practica 3, en el cual mediante el sensor de contacto tenemos que evitar un obstáculo.


miércoles, 24 de febrero de 2010

Matriz de covarianza

Con las medidas tomadas anteriormente hemos sacado las siguiente matrices de covarianza:
Todas las matrices son cuando el elemento aparece a 10 cm en el eje y
40cm:

x=1,5 xy=11,25
xy=11,25 y=7,5

50cm
x=1,5 xy=6,75
xy=6,75 y=4,5

60cm
x=1,5 xy=8,25
xy=8,25 y=5,5

70cm
x=1,55 xy=10,075
xy=
10,075 y=6,5

Para los demas valores el sensor no nos detectaba el objeto nada mas que cuando estaba enfrente

Ejercicio 4.4

4.4

4.1:


40cm-> 41,5/41,5/41,5/41,5/41,5/41,5/41,5/41,5/41,5/41,5/

media para 40cm->(1,5*10)/10=1.5

50cm->51,5/51,5/51,5/51,5/51,5/51,5/51,5/51,5/51,5/51,5/

media para 50cm->(1,5*10)/10=1.5.

60cm->61,5/61,5/61,5/61,5/61,5/61,5/61,5/61,5/61,5/61,5/

media para 60cm->(1,5*10)/10=1.5.

70cm->71,5/71,5/71,5/71,5/71,5/72,5/72,5/72,5/71,5/71,5/

media para 70cm->15,5/10=1,55.

80cm->82,5/82,5/82,5/82,5/82,5/82,5/81,5/81,5/81,5/81,5/

media para 80cm->21/10=2,1

90cm->93,5/92,5/93,5/92,5/92,5/93,5/92,5/93,5/93,5/93,5/

media para 90cm->31/10=3,1.

Para los demás valores ya no nos detectaba la pared, así que todos los demás son 255

Podemos observar que el fallo incrementa con la distancia, cosa normal ya que tiene que

medir cuanto tarda la honda en llegarle, dándose el caso que cuanto mas lejano este mas se

puede distorsionar la honda o perderse.



4.2

Distancia real-->Distancia robot

40x->10y--->47,5

50x->10y--->54,5

60x->10y--->65,5

70x->10y--->76,5

Para las demas tomas el robot no detecta nada, excepto si se lo ponemos enfrente.

80x->0y---->82,5

90x->0y---->93,5


Si depende de la distancia al robot, debido a que cuanto mas lejos estamos del objeto mas le cuesta comenzar a verlo, viéndolo casi siempre cuando lo tiene justo enfrente

Ejercicio 4.3

4.3

Medidas reales->Medidas Robot->error
20cm->24'5cm ->4'5cm
30cm->31'5cm->1'5cm
40cm->41'5cm ->1'5cm
50cm->51'5cm ->1'5cm
60cm->61'5cm ->1'5cm
70cm->71'5cm->1'5cm
80cm->81'5cm->1'5cm
90cm->93'5cm->3'5cm
100cm->255cm
Con estos datos tenemos que nuestro robot tiene una media de fallo de 17/8=2,125.

Si tenemos que nuestra media de error es distinta de 0 y que cuanto mas nos alejemos mas error nos da, excepto cuando estamos cerca que también tiene un error alto.

Ejercicio 4.2

4.2:Para este apartado como dice en el enunciado hemos colocado al robot a 40cm de la pared, desde esa posición hemos ido colocando el robot de 10 en 10 grados desde nuestro eje, dándonos cuenta que el robot como máximo tiene un rango en que ve la pared de (-50,50) grados

Tabla con los valores:

90º->41,5

80º->42,5

70º->43,5

60º->45,5

50º->50,2

-80º->42,5

-70º->43,7

-60º->44,5 -50º 90º 50º

-50º->47,5.

Ejercicio 4.1

Bueno aquí comienza el ejercicio de tomar medidas para ver los fallos que tiene el robot y así en practicas futuras medir mejor su incertidumbre:

4.1

Distancia real mínima: Nosotros colocamos el robot a 7 cm y nos dice que esta a 10cm de la pared, con lo cual la distancia mínima que detecta pero con fallos es 7cm.

Distancia real máxima:Lo colocamos a 90cm y nos dice que estamos a 93cm, a partir de esta distancia el robot no nos detecta nada.


Sigue-Pared

Bueno estamos ante la parte de la practica que mas trabajo ha costado.
Nuestra experiencia ha sido bastante dura, debido a que en un principio utilizamos la clase motor y la clase tachopilot para mover al robot, esta combinación nos dio dolores de cabeza ya que el robot se volvía loco y cuando le apetecía empezaba a andar marcha atrás(sin decírselo en el código).
También hemos tenido problemas con el sensor de ultrasonidos porque no capta bien las distancias. Pero finalmente con la clase TachoPilot y el steer el robot anda mejor que sus creadores(literalmente) :P!.

ClapControl

En este apartado lo que hemos realizado ha sido una lectura de los valores del sensor de sonido permitiéndonos así saber cuando teníamos que parar el robot.
Hemos utilizado un sleep debido a que sino el programa se ejecutaba tan rápido que la segunda palmada no la detectaba.

SimpleAvoidObstacle

Este es el tercer apartado de la practica, muy similar al anterior pero creando un objeto de la clase UltrasonicSensor en vez de uno de la clase TouchSensor.
Lo hemos conseguido sacando la distancia a la que el robot detecta los objetos y cuando ve que esta muy cerca(20cm) da marcha atrás y gira un numero aleatorio de grados, para evitar chocar contra el objeto.

BumpAndGo

Bueno este ha sido el segundo apartado de la practica, en el que mediante el sensor de contacto hemos conseguido que el robot, cuando choque contra un objeto lo detecte y de marcha atrás unos centímetros para después realizar un giro aleatorio e intentar escapar del objeto.

jueves, 18 de febrero de 2010

miércoles, 17 de febrero de 2010

Video 2

Bueno aquí tenemos el primer intento que hicimos para dibujar el cuadrado, aunque luego lo realizamos de forma mejor en una cartulina ya que tuvimos problemas con el bolígrafo, que se enganchaba :)


Video1

Bueno aqui tenemos un ejemplo de como el robot va moviendose por el cuadrado

Visualizacion de la Odometria del Motor

En este apartado, hemos puesto en marcha un motor y mediante un bucle que no terminaba hasta que no llegáramos a los 360º hemos ido imprimiendo el valor de los grados en cada momento.
Seguida mente lo hemos realizado pero en el sentido contrario.

Consiguiendo con esto que en la pantalla del robot, nos valla saliendo la información de los grados en los que se encuentra el motor desde el comienzo

Matriz de Covarianza

Calculo de la Matriz de Covarianza:
En este ejercicio, hemos utilizado un folio con los ejes de coordenadas pintado e indicando de donde partia el robot y donde terminaba, tomando las cordenadas respecto del punto de partida al punto de finalizacion.
Hemos realizado la prueba para un numero de 10 iteraciones quedando los siguientes puntos:
1->(1.3,0)
2->(0,1.5)
3->(1.2,-1.5)
4->(3,0)
5->(1.2,-2)
6->(0,-1.5)
7->(0.5,1)
8->(0,0.9)
9->(-1.3,0)
10->(-0.7,-1)
Una vez cogidas todas las tomas, aplicando la formula nos queda la siguiente matriz de covarianza:

1,4236 0

0 1,288

Siendo la media de X=0.42 y la media de Y=-0.26

Practica1

Esta practica uno ha sido mas complicada de lo que esperábamos, ya que nos hemos encontrado con varios problemas a la hora de realizarla, sobre todo al mostrar el cuadrado con el LCD.
Los primeros apartados han sido sencillos de realizar, incluso el de que haga un cuadrado como trayectoria, la única anéctdota de esto es que el bucle que hace que se ejecute hay que ponerlo hasta 39.5 -39.9 porque sino con la función traveldistancia habría que meterle un valor mayor que 40, ya que el getTravelDistance comete pequeños errores que hacen que falle.
Respecto a dibujar el cuadrado y mostrar la trayectoria del robot en cada momento, el principal problema que hemos tenido ha sido calcular la distancia recorrida ya que al principio utilizábamos la x para ese propósito pero luego cuando el robot pintaba uno de los lados de la x, lo hacia al revés, lo solucionamos añadiendo un par de variables auxiliares;hemos tenido también que truncar los grados ya que nunca giraba 90 grados exactos unas veces salia algo menos que 90,lo hemos truncado para conseguir el cuadrado perfecto.
Por ultimo aunque parezca sencillo el hecho de que pinte el cuadrado en un folio, a nosotros nos sale bien pero el poner el rotulador pegado con celo e intentar que este no modifique la trayectoria del robot nos ha costado mas de la cuenta.
A destacar también que nuestro robot, creemos que debido al uso en años anteriores hace los giros mejor hacia la izquierda que hacia la derecha asique en el ejercicio de mostrar a la derecha giramos a la derecha y en el de pintar el cuadrado hemos hecho que gire a la izquierda para que quede mejor.
Como anotación a la ultima pregunta los errores son mas o menos sistematicos ya que queda un poco por detrás del punto inicial.
Aquí colgamos unas fotos y vídeos de la realización de la practica y la matriz:

jueves, 4 de febrero de 2010

Primer dia

Esta primera toma de contacto con el sistema operativo lejos ha estado bastante entretenida.
Hoy hemos empezado tenido la primera toma de contacto con el ladrillo, hemos cargado algunos programas de demo para probar el buen funcionamiento e ir trasteando un poco con el sistema operativo cargando cosas , lo malo es que hemos tenido la mala suerte que nos ha tocado un ladrillo al cual no se le podía cambiar el nombre por lo tanto nuestro robot se sigue llamando cacharro.
Mas adelante iremos colgando vídeos de nuestros avances con el robot, un saludo hasta la semana que viene.