10.07.2015 Views

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 ...

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

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!