En este caso no se trataba de implementar dicho método (lejos ya contiene una serie de clases que lo hacen*) , sino de entenderlo para poder usarlo correctamente.
*CLASES DE LEJOS: LineMap, MCLParticleSet, Line, Point, Movement.
MODELO DE MOVIMIENTO MEDIANTE LA CLASE MCLParticleSet
Una vez entendido cómo funciona de forma teórica el filtro de partículas habia que llevarlo a la práctica. Para ello creamos un pequeño mapa (new LineMap...) en el que creamos 100 partículas (new MCLParticleSet (map,numPartículas)), a las que aplicamos un cierto error en distancia y ángulo con setDistanceNoiseFactor y setAngleNoiseFactor, error que habíamos calculado previamente realizando diversas mediciones y hallando la desviación típica de dicho error.Una vez hecho esto las situamos en el punto de partida con setLocation, y nos creamos una pequeña función con la el robot realizaba una trayectoria en forma de cuadrado. Mientras el robot avanza las partículas van actualizando su posición, se van moviendo con applyMove, mostrándose los resultados por pantalla.
Si juegas con el error en la distancia y el ángulo puedes comprobar como varían los resultados. Mientras que con errores pequeños la trayectoria en cuadrado es claramente visible, si introduces un error un poco más grande, las partículas se dispersan por toda la pantalla obteniendo como resultado un manchurrón negro que poco tiene que ver con el movimiento del robot.
CÁLCULO DE TRAYECTORIAS
En este caso se trata de conseguir que el robot llegue a unas coordenadas introducidas por pantalla y acabe con una cierta orientación.
Para la primera implementacion (pathfollow1) el robot tiene que orientarse hacia el punto, avanzar en linea recta hacia él, y por útimo corregir su orientación si fuese necesario.
Para este problema hemos usado la clase vector, que ya habíamos implementado para prácticas anteriores. Un vector de este tipo se construye con dos coordenadas, y tiene funciones muy útiles como getAngulo o getMódulo. Partiendo de la base de que nuestro robot está siempre en el eje de coordenadas (0,0), es fácil obtener la trayectoria gracias al uso de dichas funciones, y llevarla a cabo por medio de travel y rotate.
Para la segunda versión de pathfollow hay realizar trayectorias en forma de arco, y finalmente corregir la orientación (de nuevo solo si es necesario).
Este apartado es bastante más complejo que el anterior, y nos llevo mucho más tiempo obtener la solución. Finalmente creemos que, en el fondo, es como aquellos problemas infernales del bachillerato de encuentra la circunferencia que pase por dos puntos y sea tangente a la recta dada (en este caso el eje de abscisas), qué se le va a hacer. Así obtenemos el centro del arco y el ángulo, que es lo que nos queda, se calcula hallando el ángulo que forman el destino con el centro del arco a partir del eje de ordenadas.
Con todo esto sacamos una fórmula, muy bien pero ¿funciona de verdad o es otro fracaso más? Cigarro no es un buen sitio para probarla porque la mitad de las veces hace lo que quiere así que tuvimos que hacer esto de abajo para probarla cómodamente.
El código de la animación (está en as3):
Funciona bien y todo. Abajo, cómo se comporta en el mundo real™:
Por último hemos intentado dar repuesta a la pregunta: ¿Sería posible realizar una trayectoria compuesta por dos arcos, de maneraque se alcanzase el punto de destino y la orientación correctos sin necesidad de rotar adicionalmente una vez llegados al punto de destino?
En una primera aproximación se nos ha ocurrido que sería buena idea hacer un waitpoint a mitad de camino. Con el primer arco te desplazarías hacia dicho punto, por lo que tu orientación ya comenzaría corregirse. Y con el segundo arco llegarías al punto de destino. Gracias a este segundo arco podrías realizar trayectorias en zig-zag o en forma de S, logrando acabar con la orientación correcta.
Con una segunda pensada tenemos lo siguiente:
Podría calcularse una trayectoria más eficiente usando además una recta aunque esto se saldría de lo que dice el guión de la práctica.

