Práctica 5 - docencia de la ETSIT-URJC - Universidad Rey Juan ...

Práctica 5 - docencia de la ETSIT-URJC - Universidad Rey Juan ... Práctica 5 - docencia de la ETSIT-URJC - Universidad Rey Juan ...

docencia.etsit.urjc.es
from docencia.etsit.urjc.es More from this publisher
10.07.2015 Views

Prácticas con Lego NXTRobóticaUniversidad Rey Juan CarlosPráctica 5 - Auto-localización basada en filtro departículasEl objetivo de esta práctica es que apliques los conocimientos sobre filtros departículas aprendidos en la práctica 4 al problema de la auto-localización de unrobot móvil en un entorno conocido (mapa).Esta práctica será evaluada por los profesores de la asignatura en un plazo detres semanas desde su presentación en clase. Podrás conseguir hasta un total de18 puntos.Visualización del mapa y las partículas (2 puntos)El mapa del entorno con el que vamos a trabajar se muestra en la figura inferior.La clase LineMap permite crear un mapa utilizando un conjunto de segmentos y unrectángulo exterior (como hicimos en la fase 4). Adicionalmente, es posible volcarla información de un mapa a un fichero binario, para luego cargarlo sin necesidadde definir sus segmentos. Para esta práctica os proporcionamos el fichero map1.bincon el mapa que utilizaremos en esta práctica y que coincide con el mapa realinstalado en el laboratorio.A continuación os mostramos el fragmento de código necesario para cargar elmapa:try {FileInputStream fis = new FileInputStream(new File("map1.bin"));DataInputStream data = new DataInputStream(fis);map = new LineMap();map.loadMap(data);fis.close();} catch (Exception e) {System.out.println("File error");}Escribe un programa denominado Localization.nxt que cargue el mapa bin1.bine instancie un filtro de partículas como el de la fase anterior. Inicializa todas las

Prácticas con Lego NXTRobótica<strong>Universidad</strong> <strong>Rey</strong> <strong>Juan</strong> CarlosPráctica 5 - Auto-localización basada en filtro <strong>de</strong>partícu<strong>la</strong>sEl objetivo <strong>de</strong> esta práctica es que apliques los conocimientos sobre filtros <strong>de</strong>partícu<strong>la</strong>s aprendidos en <strong>la</strong> práctica 4 al problema <strong>de</strong> <strong>la</strong> auto-localización <strong>de</strong> unrobot móvil en un entorno conocido (mapa).Esta práctica será evaluada por los profesores <strong>de</strong> <strong>la</strong> asignatura en un p<strong>la</strong>zo <strong>de</strong>tres semanas <strong>de</strong>s<strong>de</strong> su presentación en c<strong>la</strong>se. Podrás conseguir hasta un total <strong>de</strong>18 puntos.Visualización <strong>de</strong>l mapa y <strong>la</strong>s partícu<strong>la</strong>s (2 puntos)El mapa <strong>de</strong>l entorno con el que vamos a trabajar se muestra en <strong>la</strong> figura inferior.La c<strong>la</strong>se LineMap permite crear un mapa utilizando un conjunto <strong>de</strong> segmentos y unrectángulo exterior (como hicimos en <strong>la</strong> fase 4). Adicionalmente, es posible volcar<strong>la</strong> información <strong>de</strong> un mapa a un fichero binario, para luego cargarlo sin necesidad<strong>de</strong> <strong>de</strong>finir sus segmentos. Para esta práctica os proporcionamos el fichero map1.bincon el mapa que utilizaremos en esta práctica y que coinci<strong>de</strong> con el mapa realinsta<strong>la</strong>do en el <strong>la</strong>boratorio.A continuación os mostramos el fragmento <strong>de</strong> código necesario para cargar elmapa:try {FileInputStream fis = new FileInputStream(new File("map1.bin"));DataInputStream data = new DataInputStream(fis);map = new LineMap();map.loadMap(data);fis.close();} catch (Exception e) {System.out.println("File error");}Escribe un programa <strong>de</strong>nominado Localization.nxt que cargue el mapa bin1.bine instancie un filtro <strong>de</strong> partícu<strong>la</strong>s como el <strong>de</strong> <strong>la</strong> fase anterior. Inicializa todas <strong>la</strong>s


partícu<strong>la</strong>s <strong>de</strong> manera que se repartan uniformemente por el mapa. Escribe unmétodo showParticles() que dibuje en <strong>la</strong> pantal<strong>la</strong> <strong>de</strong>l robot el mapa cargado, juntocon <strong>la</strong> posición <strong>de</strong> todas <strong>la</strong>s partícu<strong>la</strong>s (si te resulta útil para <strong>de</strong>purar tambiénpue<strong>de</strong>s dibujar <strong>la</strong> orientación <strong>de</strong> cada partícu<strong>la</strong> mediante un pequeño segmento).Punto X YO 0 0A 0 189B 89 189C 89 69D 95 69E 95 123F 189 120G 188 0Diseño <strong>de</strong>l radar (2 puntos)En este ejercicio tendrás que crear una nueva c<strong>la</strong>se Radar.java que contengalos siguientes métodos públicos:public Radar (int vel, int resol, int amp, UltrasonicSensor sonar, Motor motor)Éste será el constructor <strong>de</strong> <strong>la</strong> c<strong>la</strong>se y queremos que acepte como parámetros<strong>la</strong> velocidad <strong>de</strong> escaneo, <strong>la</strong> resolución en grados <strong>de</strong>l radar, <strong>la</strong> amplitud en gradosque es capaz <strong>de</strong> sensar, el objeto <strong>de</strong> tipo UltrasonicSensor que vamos a usar comosensor y el motor que va a contro<strong>la</strong>r el movimiento <strong>de</strong> escaneo.public RangeReadings newScan()Este método provocará un nuevo movimiento <strong>de</strong> escaneo. Se <strong>de</strong>berá hacer unbarrido completo con los parámetros apropiados y se <strong>de</strong>berán registrar <strong>la</strong>s medidaspara ser <strong>de</strong>vueltas en forma <strong>de</strong> objeto RangeReadings.La c<strong>la</strong>se RangeReadings se encuentra <strong>de</strong>c<strong>la</strong>rada en el paquete lejos.robotics ysu finalidad es encapsu<strong>la</strong>r toda <strong>la</strong> funcionalidad <strong>de</strong> un escaneo a varias distancias.2


Esta c<strong>la</strong>se mantiene como atributo una lista <strong>de</strong> objetos <strong>de</strong> tipo RangeReading,que permiten almacenar una medida concreta con su distancia y ángulo <strong>de</strong>s<strong>de</strong> <strong>la</strong>que se realizó. A continuación os mostramos el constructor <strong>de</strong> <strong>la</strong> c<strong>la</strong>se RangeReadingsy su método setRange() para especificar una medida concreta. Consulta <strong>la</strong>documentación <strong>de</strong> <strong>la</strong> c<strong>la</strong>se para ver todos los métodos disponibles.public RangeReadings(int numReadings)/*** Set the range reading** @param in<strong>de</strong>x the in<strong>de</strong>x of the reading in the set* @param angle the angle of the reading re<strong>la</strong>tive to the robot heading* @param range the range reading*/public void setRange(int in<strong>de</strong>x, float angle, float range)Reconocimiento <strong>de</strong> posición y orientación (4 puntos)Existe un mecanismo <strong>de</strong> auto-localización consistente en apren<strong>de</strong>r <strong>la</strong>s características<strong>de</strong> <strong>de</strong>terminados puntos <strong>de</strong>l mapa, para luego compararlos con <strong>la</strong>s medidasreales. Esta técnica requiere realizar una fase <strong>de</strong> aprendizaje para almacenar<strong>la</strong>s características <strong>de</strong> cada punto <strong>de</strong>l mapa. Por ejemplo, podría tomarse una serie<strong>de</strong> medidas <strong>de</strong>l sensor <strong>de</strong> ultrasonidos mientras se rota una vuelta completa. Elresultado obtenido podría ser simi<strong>la</strong>r al mostrado por <strong>la</strong> figura 1.El histograma real obtenido junto con uno aprendido pue<strong>de</strong> ser comparadorealizando un test <strong>de</strong> corre<strong>la</strong>ción, calcu<strong>la</strong>do como suma <strong>de</strong> diferencias al cuadrado.La diferencia D k entre el nuevo histograma H m (i) y el histograma <strong>de</strong>l <strong>de</strong>scriptor<strong>de</strong> posición almacenado H k (i) es:D k = ∑ i(H m (i) − H k (i)) 2 (1)La firma que obtenga menor valor D k se correspon<strong>de</strong>rá con el punto más probable.También podría consi<strong>de</strong>rarse disponer <strong>de</strong> un umbral mínimo, que si no essuperado se concluye que se estará en otro lugar.Un <strong>de</strong>talle a tener en cuenta es que para que está técnica funcione a<strong>de</strong>cuadamenteel histograma real y el aprendido <strong>de</strong>ben realizarse partiendo <strong>de</strong> <strong>la</strong> mismaorientación. En caso <strong>de</strong> no ser así, los dos histogramas se parecerán pero uno <strong>de</strong>3


Figura 1: Medidas <strong>de</strong> distancia obtenidas durante <strong>la</strong> fase <strong>de</strong> aprendizaje <strong>de</strong> un<strong>de</strong>terminado puntoellos estará <strong>de</strong>sp<strong>la</strong>zado. Este valor <strong>de</strong> <strong>de</strong>sp<strong>la</strong>zamiento pue<strong>de</strong> usarse para calcu<strong>la</strong>r<strong>la</strong> orientación obtenida.Puesto que el cálculo <strong>de</strong> <strong>la</strong> orientación requiere gran cantidad <strong>de</strong> operacionespor cada histograma almacenado, es posible almacenar una firma <strong>de</strong> cada posición<strong>de</strong> manera invariante a <strong>la</strong> orientación. Una vez localizada nuestra posición po<strong>de</strong>mosrealizar el test <strong>de</strong> corre<strong>la</strong>ción para conocer nuestra orientación, pero ya sobreun único punto candidato. El histograma invariante a <strong>la</strong> orientación almacena elnúmero <strong>de</strong> veces que hemos recibido cada distancia durante <strong>la</strong> prueba. La figura2 muestra un ejemplo.Escribe un programa que sea capaz <strong>de</strong> reconocer los cinco puntos que se encuentranmarcados en el mapa. El robot <strong>de</strong>berá ser capaz <strong>de</strong> i<strong>de</strong>ntificar en cuál <strong>de</strong>los cinco puntos se encuentra y especificar cuál es su posible orientación. Deberásindicar mediante algún mensaje por el LCD el resultado.Pue<strong>de</strong>s utilizar el método dumpReadings() <strong>de</strong> <strong>la</strong> c<strong>la</strong>se RangeReadings para volcaren un fichero el resultado <strong>de</strong> un histograma. De esta manera podrás reutilizarlocuando tu programa termine. Para cargarlo <strong>de</strong>berás usar el método loadReadings().A continuación mostramos un fragmento <strong>de</strong> código para almacenar en un ficherosignature1.bin el estado actual <strong>de</strong>l objeto signature <strong>de</strong> tipo RangeReadings.4


Figura 2: Histograma <strong>de</strong> medidas invariante a <strong>la</strong> orientacióntry {File file = new File ("signature1.bin");if(file.exists()){file.<strong>de</strong>lete();}file.createNewFile();FileOutputStream fos = new FileOutputStream(file);DataOutputStream dos = new DataOutputStream(fos);signature.dumpReadings(dos);fos.close();} catch (Exception e) {System.out.println("File error");}Reto <strong>de</strong> <strong>la</strong> auto-localización (8 puntos)En este ejercicio <strong>de</strong>berás combinar toda <strong>la</strong> potencia <strong>de</strong> los filtros <strong>de</strong> partícu<strong>la</strong>saplicados al problema <strong>de</strong> <strong>la</strong> auto-localización <strong>de</strong> nuestros robots. La prueba consistiráen colocar tu robot en uno <strong>de</strong> los cinco puntos marcados en el mapa, con unaorientación arbitraria. El robot <strong>de</strong>berá ser capaz <strong>de</strong> navegar hasta los cuatro puntosrestantes en el or<strong>de</strong>n que se consi<strong>de</strong>re oportuno, <strong>de</strong>teniéndose durante un segundoen cada punto (opcionalmente pue<strong>de</strong> emitir un sonido a<strong>de</strong>más <strong>de</strong> <strong>de</strong>tenerse), parafinalmente volver a su posición <strong>de</strong> salida. La orientación con <strong>la</strong> que se alcance los5


puntos intermedios y el punto <strong>de</strong> finalización <strong>de</strong> <strong>la</strong> prueba no será relevante.Para superar este verda<strong>de</strong>ro reto robótico tendrás que activar todas <strong>la</strong>s etapas<strong>de</strong> <strong>la</strong> auto-localización mediante filtros <strong>de</strong> partícu<strong>la</strong>s que explicamos en <strong>la</strong> práctica4. La c<strong>la</strong>se TachoLocalizer <strong>de</strong>l paquete lejos.robotics.localization nos será <strong>de</strong> granayuda. Esta c<strong>la</strong>se nos permitirá navegar por el mapa, mientras mantiene una estimación<strong>de</strong> nuestra posición en el mismo. Veamos los métodos más importantes <strong>de</strong>esta c<strong>la</strong>se:public TachoLocalizer(RangeMap map, int numParticles, int numReadings,float wheelDiameter, float trackWidth,Motor leftMotor, Motor rightMotor, float projection,boolean reverse)Éste es el constructor <strong>de</strong> <strong>la</strong> c<strong>la</strong>se y acepta varios parámetros: un mapa <strong>de</strong>lentorno, el número <strong>de</strong> partícu<strong>la</strong>s que <strong>de</strong>seamos utilizar, el número <strong>de</strong> lecturas quecompondrá nuestra observación (esto valor se utilizará para instanciar un objeto<strong>de</strong> tipo RangeReadings), el motor al que conectaremos nuestra rueda izquierda, elmotor al que conectaremos nuestra rueda <strong>de</strong>recha, un valor que indica <strong>la</strong> distancia<strong>de</strong>s<strong>de</strong> el sensor <strong>de</strong> ultrasonidos hasta <strong>la</strong> parte <strong>de</strong><strong>la</strong>ntera <strong>de</strong>l robot y un valor parainvertir el sentido <strong>de</strong> <strong>la</strong> marcha.A <strong>la</strong> hora <strong>de</strong> navegar es posible utilizar los métodos rotate() y travel(). Esimportante invocar el método updatePosition() para <strong>de</strong>sp<strong>la</strong>zar automáticamente<strong>la</strong>s partícu<strong>la</strong>s <strong>de</strong>spués cada movimiento (paso <strong>de</strong> actualización).Las observaciones obtenidas <strong>de</strong>l sensor <strong>de</strong> ultrasonidos también nos ayudarána que nuestra estimación converja hacia <strong>la</strong> zona don<strong>de</strong> nos encontramos. La c<strong>la</strong>seTachoLocalizer es una c<strong>la</strong>se abstracta. Esto obliga a que tengamos que realizarnuestra propia c<strong>la</strong>se heredando <strong>de</strong> TachoLocalizer e implementando el método takeReadings().En este método <strong>de</strong>beremos generar un nuevo escaneo <strong>de</strong> nuestroradar y actualizar el filtro <strong>de</strong> partícu<strong>la</strong>s con esta nueva observación (paso <strong>de</strong> corrección).El método calcu<strong>la</strong>teWeights() <strong>de</strong> <strong>la</strong> c<strong>la</strong>se MCLParticleSet se encarga <strong>de</strong>materializar este paso actualizando los pesos <strong>de</strong> cada hipótesis en función <strong>de</strong> <strong>la</strong>observación./*** Calcu<strong>la</strong>te the weight for each particle** @param rr the robot range readings*/public void calcu<strong>la</strong>teWeights(RangeReadings rr, RangeMap map)Es posible obtener el mapa mediante <strong>la</strong> l<strong>la</strong>mada getMap() <strong>de</strong> <strong>la</strong> c<strong>la</strong>se Tacho-Localizer.6


Finalmente, tras cada movimiento nuevo u observación es necesario generaruna nueva pob<strong>la</strong>ción <strong>de</strong> partícu<strong>la</strong>s (paso <strong>de</strong> remuestreo). El método resample() <strong>de</strong><strong>la</strong> c<strong>la</strong>se MCLParticleSet se encarga <strong>de</strong> esta tarea.public boolean resample()Para realizar los pasos <strong>de</strong> corrección y <strong>de</strong> remuestreo, el método getParticles()nos <strong>de</strong>vuelve el objeto <strong>de</strong> tipo MCLParticleSet asociado a nuestro objeto <strong>de</strong> tipoTachoLocalizer. A su vez, <strong>la</strong> l<strong>la</strong>mada getEstimatedPose() retorna <strong>la</strong> posición estimadapor nuestro algoritmo <strong>de</strong> auto-localización. Cabe <strong>de</strong>stacar que este métodono <strong>de</strong>vuelve ninguna información acerca <strong>de</strong> <strong>la</strong> incertidumbre <strong>de</strong> <strong>la</strong> estimación. Siqueremos conocer el grado <strong>de</strong> incertidumbre consulta <strong>la</strong> documentación <strong>de</strong> <strong>la</strong> c<strong>la</strong>seMCLParticleSet. Esta información podría ser muy valiosa para conocer el grado <strong>de</strong>fiabilidad <strong>de</strong> <strong>la</strong> estimación y si continuamos con <strong>la</strong> navegación o, por el contrario,tomamos nuevas medidas hasta estar más seguros <strong>de</strong> <strong>la</strong> posición que ocupamos<strong>de</strong>ntro <strong>de</strong>l mapa.Actualización semanal <strong>de</strong>l blog (2 puntos)Actualiza <strong>la</strong> bitácora <strong>de</strong> tu grupo <strong>de</strong> prácticas con todas <strong>la</strong>s curiosida<strong>de</strong>s, problemas,soluciones o aspectos interesantes que hayas extraído <strong>de</strong> todas <strong>la</strong>s prácticasrealizadas. Se valorará positivamente <strong>la</strong> inclusión <strong>de</strong> material multimedia (fotos yví<strong>de</strong>os), así como diagramas esquemáticos <strong>de</strong>l código realizado. Recuerda que espreferible una entrada corta pero valiosa que una entrada <strong>la</strong>rga y farragosa peroaburrida y sin aportes.7

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!