tag:blogger.com,1999:blog-66677028510704054022024-03-19T06:01:58.743+01:00Viva BenderJose Manuel Bermudohttp://www.blogger.com/profile/03277318970188973445noreply@blogger.comBlogger6125tag:blogger.com,1999:blog-6667702851070405402.post-9329014642054798802011-03-22T21:06:00.004+01:002011-03-24T15:24:03.716+01:00Práctica 4. Buscando el equilibrioAqui viene la entrada para la práctica 4, en ella hemos tenido que implementar un Segway con nuestros NXT asi que hemos tenido que rediseñar el aspecto de nuestro robot.<br /><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJBV1S5QspSCYEVJMCC6H1H-lyyLmKLizQpz1jPMMS4f4Mm3OPM6N9Z-ATZf94Jp3u6GxR_jbOpyy_O-WLmA6QBUCvzmfRcWvCk9-OKGhrrhOflH6rHbe9ZCshyphenhyphenkosF2sE_URWtekQzmc/s1600/VivaBender+-+Segway1.jpg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJBV1S5QspSCYEVJMCC6H1H-lyyLmKLizQpz1jPMMS4f4Mm3OPM6N9Z-ATZf94Jp3u6GxR_jbOpyy_O-WLmA6QBUCvzmfRcWvCk9-OKGhrrhOflH6rHbe9ZCshyphenhyphenkosF2sE_URWtekQzmc/s320/VivaBender+-+Segway1.jpg" alt="" id="BLOGGER_PHOTO_ID_5587004383249253730" border="0" /></a><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAJfuRp8drWIHQiilpG0mnQa0iDXXhXSLH9UNsjPwxTpyIjeTL5lx5tx1NgHXx7MavUWpITCZY2xjzoasDfKMygaIPTBG9hlj-gtwhyXPiPEpCxg9PhLEVpzrE-RSzp5OMHE0cPVYKFFw/s1600/VivaBender+-+Segway2.jpg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAJfuRp8drWIHQiilpG0mnQa0iDXXhXSLH9UNsjPwxTpyIjeTL5lx5tx1NgHXx7MavUWpITCZY2xjzoasDfKMygaIPTBG9hlj-gtwhyXPiPEpCxg9PhLEVpzrE-RSzp5OMHE0cPVYKFFw/s320/VivaBender+-+Segway2.jpg" alt="" id="BLOGGER_PHOTO_ID_5587004389018801874" border="0" /></a><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwD_T0sTnUiUTcfemOilKcZrTCDUMdA5N8ppqW7G-nAAT2HBh2pOKHnZ9NxCdLxkotN38PPxb_c47fUb41d6EyzphgxgLmHqk_WMGOavwbBJxmDVID5o12lwT-U-k8wvKBDS-yPYvTCSU/s1600/VivaBender+-+Segway3.jpg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwD_T0sTnUiUTcfemOilKcZrTCDUMdA5N8ppqW7G-nAAT2HBh2pOKHnZ9NxCdLxkotN38PPxb_c47fUb41d6EyzphgxgLmHqk_WMGOavwbBJxmDVID5o12lwT-U-k8wvKBDS-yPYvTCSU/s320/VivaBender+-+Segway3.jpg" alt="" id="BLOGGER_PHOTO_ID_5587004396519360994" border="0" /></a><br /><br />Como vemos ahora VivaBender tiene un aspecto mucho mas simple, con dos motores y un sensor de luz que nos serán suficientes para implementar este Segway.<br /><br />El concepto de la práctica es sencillo, tenemos que equilibrar al robot basándonos en los valores que obtenemos del sensor de luz, si se inclina hacia delante obtendremos más luz y tendremos que corregir moviendo la base hacia delante y en caso de caer hacia atrás percibiremos menos luz y moveremos la base hacia atrás.<br /><br />¿La manera de conseguir esto? Un controlador PID. Este tipo de controlador es una forma sencilla de mantener un estado concreto en un sistema (en nuestro caso mantenernos en equilibrio), basa su funcionamiento en tres constantes: la proporcional (P) corrige el error de forma proporcional a este; la integral (I) corrige un error prolongado en el tiempo y la derivativa (D) hace que no tratemos igual a un mismo error si este está disminuyendo o si está aumentando.<br /><br />La fórmula final queda como sigue:<br /><br />Valor PID = Kp * error + Ki * error_integral + Kd * error_derivativo<br /><br />En lo referente a código esta práctica apenas tiene nada más que esta fórmula pero donde realmente nos ha hecho pensar es en la correcta elección de cada una de las constantes. Sin duda hay que elegir una constante Kp correcta y en base a esto ir eligiendo las demás, todo se basa en ensayo y error, hemos observado que una vez elegida una constane Kp que creemos adecuada aumentar Ki hace al sistema más reactivo, pero pasarse en esta constante crea grandes oscilaciones, asimismo aumentar Kd proteje al sistema frente a cambios bruscos pero lo hace algo mas lento en su reaccion general.<br /><br />Tras mucho calibrar y probando distintas atenuaciones y cotas para la componente integral (sin ninguna duda la que más quebraderos de cabeza nos ha dado) llegamos a esto.<br /><br /><br /><div style="text-align: center;"><iframe title="YouTube video player" src="http://www.youtube.com/embed/ydVtc5i1bvI" allowfullscreen="" frameborder="0" height="349" width="425"></iframe><br /><br /><br /><div style="text-align: left;">Es un comportamiento bastante satisfactorio pero todavía nos quedaba un as en la manga, como se observa en el video el sensor está al descubierto, quedando asi expuesto a la luz ambiental, esto puede alterar las lecturas del sensor de modo que en la siguiente prueba colocamos una "pantalla" a VivaBender, con esto creamos una zona de sombra debajo del sensor y permitimos que este tome medidas mucho mas fiables. He aqui el resultado final.<br /><br /><br /><div style="text-align: center;"><iframe title="YouTube video player" src="http://www.youtube.com/embed/97Frrxt2NHk" allowfullscreen="" frameborder="0" height="349" width="425"></iframe><br /><div style="text-align: left;"><br /><br />Ahora si quedamos satisfechos, hemos intentado enfocar desde todos los ángulos para que se observe como en todo momento el robot se mantiene en equilibrio únicamente por acción del controlador PID. Para conseguir un equilibrio lo más exacto posible hemos incluido la posibilidad de un ajuste "al vuelo", es decir, podemos ajustar el punto que el robot cree como su vertical durante la propia ejecución de este modo si al soltar al robot detectamos que tiene tendencia a irse hacia alante o hacia atrás lo podemos corregir.<br /><br />Y hasta aqui la entrada, quizas la más corta y más aburrida (por lo monotono de los videos) que hemos publicado hasta ahora, pero sin más... esto ha sido todo!<br /><br /><br /></div></div></div></div>Rubén Salamanqués Ballesteroshttp://www.blogger.com/profile/08887060577347129484noreply@blogger.com1tag:blogger.com,1999:blog-6667702851070405402.post-89146532854388590062011-03-09T19:56:00.011+01:002011-03-10T12:58:55.042+01:00Práctica 3. Navegación Local evitando obstáculosEn esta nueva entrada vamos ha demostrar una forma de navegación basada en VFF, en la que tendremos que evitar obstáculos (latas) y en la que haremos uso del sensor de luz para guiar a nuestro robot y los sensores de contacto y el sensor de ultrasonido. Vamos por partes:<br /><br /><b><span class="Apple-style-span" style="font-size: large;">Evitando obstáculos con el sensor de contacto</span></b><br /><br />Lo primero, es realizar un buen diseño que se ajuste a nuestros objetivos. En este caso queremos que si detecta un obstáculo por la derecha el robot retroceda y realice un giro por la izquierda sorteando el obstáculo. Igual ocurre con obstáculos que detecte por la izquierda, salvo que en ese caso el giro lo realizará por la derecha. Y por último, si detectamos un objeto bastante centrado se activarán los dos sensores y realizaremos un giro bastante mas pronunciado.<br />Aquí tenéis un diseño que cumple estos aspectos:<br /><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAnc2TlOu5oL45wtAh33m3LZHeIwMf5_E-cUY7gIhph05Ui80xbb_U6Ud3IQ-npp2RBTaHJypjY-tR7mMZJPykF-ybm99SqmENcQugZaMsekJjmZJYPCcTSx2j_6mBkhtyS2vf7punzIZB/s1600/IMG_0040.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAnc2TlOu5oL45wtAh33m3LZHeIwMf5_E-cUY7gIhph05Ui80xbb_U6Ud3IQ-npp2RBTaHJypjY-tR7mMZJPykF-ybm99SqmENcQugZaMsekJjmZJYPCcTSx2j_6mBkhtyS2vf7punzIZB/s320/IMG_0040.jpg" width="320" /></a></div><br /><br />Se ha seguido una técnica basada en casos, avanzar, girar derecha, girar izquierda, y girar_centrado, siendo avanzar el caso con menos relevante y girar_centrado el mas relevante.<br /><br /><div style="text-align: center;"><iframe allowfullscreen="" frameborder="0" height="349" src="http://www.youtube.com/embed/7APEKD9Nh9I" title="YouTube video player" width="425"></iframe></div><br /><b><span class="Apple-style-span" style="font-size: large;">Evitando obstáculos con el sensor de US</span></b><br /><br />Primero, antes de nada, debemos construir un buen diseño que se adapte a nuestras necesidades.<br />En este caso vamos a utilizar el sensor de ultrasonidos, pero de una forma especial. Queremos que recoja datos del entorno, concretamente distancias a obstáculos. Queremos que el sensor vaya girando de un lado para otro, para ello, hemos colocado un tercer motor que manejará el sensor de nuestro robot.<br />Y lo ultimo, y mas importante, es hacerle una estructura que incline la cabeza ligeramente hacia abajo para que esquive latas por ejemplo.<br /><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgncxQqUoI5r2aiuGTWsQDd7oO-T7n8gN2BFYCPr5Y9pqml4HcXccMnkfRUbh20JocwGzKUaHU1qmZQ8O4-cUkAkPBXKl8dLazR5Rr8lwYa5LEYSBJjuco-olRv548kfiYZbnvOrao-VIRj/s1600/IMG_0035.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgncxQqUoI5r2aiuGTWsQDd7oO-T7n8gN2BFYCPr5Y9pqml4HcXccMnkfRUbh20JocwGzKUaHU1qmZQ8O4-cUkAkPBXKl8dLazR5Rr8lwYa5LEYSBJjuco-olRv548kfiYZbnvOrao-VIRj/s320/IMG_0035.jpg" width="320" /></a></div><br /><br /><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;">Este comportamieto calcula el vector resultante a partir del vector atractivo y el vector repulsivo.</div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;">Para ello utilizamos el sensor de US para que mida en un array de 10 posiciones (entre -45º y 45º) a que distancia se encuentran los objetos y en función de esto calcularemos los vectores repulsivos.</div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;">Una vez que tengamos los vectores repulsivos calculamos el vector resultante sumando el vector repulsivo con el vector atractivo.</div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;">Nuestro vector atractivo tiene una magnitud dependiente del vector repulsivo (magnitud_repulsivo - 20) y una dirección contraria al giro del robot (p.ejemplo: Si el robot está girado a -45º el vector atractivo tendrá un ángulo de 45º).</div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"><br /></div><br /><div style="text-align: center;"><iframe allowfullscreen="" frameborder="0" height="349" src="http://www.youtube.com/embed/w0WImDvMhZY" title="YouTube video player" width="425"></iframe></div><br /><b><span class="Apple-style-span" style="font-size: large;">Siguiendo la luz como un mosquito!</span></b><br /><br />Una vez mas, debemos reconstruir nuevo robot, para que el robot recoja intensidades de luz por los lados del robot, hemos creado una estructura para colocar los dos sensores de luz. Algo sencillo.<br /><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEis_buvd4C2KCubUM98VQpFuiw-eO7mJkvqZ_G79qENYdmnMqf0h094O-qqwOvGW56u_WXuoplKUn2aO1snYW_w4X4Wfwt-P57IgQelr2VuUW20rZcohymqLsJOIM2r1m9umistwNpHQjUk/s1600/IMG_0030.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEis_buvd4C2KCubUM98VQpFuiw-eO7mJkvqZ_G79qENYdmnMqf0h094O-qqwOvGW56u_WXuoplKUn2aO1snYW_w4X4Wfwt-P57IgQelr2VuUW20rZcohymqLsJOIM2r1m9umistwNpHQjUk/s320/IMG_0030.jpg" width="320" /></a></div><br />Este comportamiento realiza una operación bastante sencilla, realiza restas de intensidad lumínica (derecha - izquierda), de tal manera que si la resta es >= 25 gira a la derecha y si es <= -40 gira a la izquierda, estas cifras aparentemente aleatorias corresponden a la diferencia de medidas en cada uno de los sensores, cada uno devuelve valores distintos para la misma intensidad de luz, de ahi ese ajuste de cifras.<br />La única complicación que tiene, es saber en que modo poner los sensores, ya que como dice en la API, hay dos modos, Pasivo y Activo, en modo Activo el rango de valores es mucho más pequeño y en modo Pasivo hay mucho más rango de valores, con lo que podemos obtener mas precisión en los sensores.<br /><br /><div style="text-align: center;"><iframe allowfullscreen="" frameborder="0" height="349" src="http://www.youtube.com/embed/Wu7xsju_DRU" title="YouTube video player" width="425"></iframe></div><br /><b><span class="Apple-style-span" style="font-size: large;">Evitando obstáculos con el sensor de US y guiando el robot con los sensores de luz</span></b><br /><br />El diseño para este ejercicio, es la combinación de los ejercicios anteriores.<br /><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj13ZX4tg71Wk9crRr_MuGdcnhBE3imAbBrEJC7lbtnccgpzBpchyphenhyphenHVB4oSCtNsUlM5TkyyUbe_cWh2YmcejusGS-lkPmqDzIM3mjqm7uR9hrh5uGz9jb-ASa4p2beplEmU3rzmKWK-Aw2r/s1600/IMG_0036.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj13ZX4tg71Wk9crRr_MuGdcnhBE3imAbBrEJC7lbtnccgpzBpchyphenhyphenHVB4oSCtNsUlM5TkyyUbe_cWh2YmcejusGS-lkPmqDzIM3mjqm7uR9hrh5uGz9jb-ASa4p2beplEmU3rzmKWK-Aw2r/s320/IMG_0036.jpg" width="320" /></a></div><div class="separator" style="clear: both; text-align: center;"><br /></div>Para evitar obstáculos con el US, no hemos utilizado vectores, hemos hecho una simplificación semejante al ejercicio con el sensor de contacto, si detecta obstáculo por la izquierda el giro se realiza por la derecha, si detecta algo por la derecha el giro se realiza por la izquierda y si detecta algo bastante centrado el giro es mucho mas pronunciado.<br /><br /><div style="text-align: center;"><iframe allowfullscreen="" frameborder="0" height="349" src="http://www.youtube.com/embed/D3Rk7CfimX4" title="YouTube video player" width="425"></iframe></div>Jose Manuel Bermudohttp://www.blogger.com/profile/03277318970188973445noreply@blogger.com0tag:blogger.com,1999:blog-6667702851070405402.post-5319963727461216912011-02-24T14:54:00.004+01:002011-02-24T15:42:52.930+01:00Práctica 2. Calibrando el ultrasonidosEn esta entrada vamos a responder a las cuestiones que tienen que ver con la calibración de nuestro sensor de ultrasonidos, gracias a esta prueba tendremos un conocimiento más exacto de nuestro sensor, pudiendo actuar en consecuencia sobre las medidas que nos proporcione.<br /><br /><br /><span style="font-weight: bold;">Punto 1.</span><br /><br />Distancia mínima = 22cm (20cm reales)<br />Distancia máxima = 193cm (190cm reales)<br /><br />Por debajo de los 20cm el sensor ofrece lecturas pero con un error cada vez mas grande, la mínima lectura que observamos fue de 7cm (estando a 4cm reales), como vemos es un error enorme y decidimos que las medidas de las que nos podemos empezar a fiar estan en el rango puesto arriba.<br /><br />Como veremos a continuación en valores intermedios de este rango el error del sensor baja bastante hasta ser prácticamente cero para distancias medias.<br /><br /><br /><span style="font-weight: bold;">Punto 2</span><br /><br />Ahora medimos la sensibilidad del sensor frente a los obstáculos situados en ángulo, realizando las pruebas que se nos indican en el enunciado los resultados fueron los siguientes:<br /><br />0º − 37cm<br />10º − 38cm<br />20º − 38cm<br />30º − 40cm<br />40º - 41cm<br />-10º − 38cm<br />-20º − 40cm<br />-30º − 41cm<br />-40º - 44cm<br /><br />Para inclinaciones mayores (de 50º en adelante) el sensor se salia de rango mostrando 255 de modo que podemos deducir que nuestro sensor es fiable para ángulos de aproximación menores de 50º.<br /><br />Se supone que los pares de ángulos (Xº/ -Xº) deberían dar lecturas idénticas, en nuestro caso aunque se aproximan no llegan a serlo, esto puede deberse simplemente a colocaciones ligeramente diferentes en cuanto a los ángulos positivos y negativos, no se puede atinar exactamente con el mismo ángulo siempre.<br /><br /><br /><span style="font-weight: bold;">Punto 3</span><br /><br />En esta prueba realizamos medidas a las distancias indicadas en el enunciado y en cada una de ellas el sensor de VivaBender detectaba siempre 1cm por encima de la medida real de modo que según nuestros datos la media de error era igual a 1cm. Si tenemos en cuenta posibles errores mínimos en la posición exacta del robot a la hora de medir llegamos a la conclusión de que para el rango estudiado el sensor de ultrasonidos es muy preciso.<br /><br /><br /><span style="font-weight: bold;">Punto 4</span><br /><br />Este punto fue el más tedioso en cuanto a mediciones se refiere, realizamos las múltiples medidas que se nos pedían en el enunciado, no vamos a poner aqui la larga lista de números obtenidos asi que los resumiremos directamente en las ecuaciones de la matriz de covarianza.<br /><br />Siguiendo la fórmula empleada anteriormente en la práctica 1:<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://i1101.photobucket.com/albums/g430/josemanuelbd/covarianza.jpg"><img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 404px; height: 49px;" src="http://i1101.photobucket.com/albums/g430/josemanuelbd/covarianza.jpg" alt="" border="0" /></a><br />Obtuvimos los siguientes resultados:<br /><br /><div style="text-align: left;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJJtMab4WW1PaSpqx9-XpmzFRD1Krmes7CIbBGa4hkswKnJ2Jcz3wdcxCp6d0XqAXZWNYNi9m6kJccc1q3O51aVbrAi5RL5cKKqV-zN0CrngmWTQxB3yfH0H0XoidiuCjwpHPIp1q4PpM/s1600/Covarianza+Practica2.jpg"><img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 186px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJJtMab4WW1PaSpqx9-XpmzFRD1Krmes7CIbBGa4hkswKnJ2Jcz3wdcxCp6d0XqAXZWNYNi9m6kJccc1q3O51aVbrAi5RL5cKKqV-zN0CrngmWTQxB3yfH0H0XoidiuCjwpHPIp1q4PpM/s400/Covarianza+Practica2.jpg" alt="" id="BLOGGER_PHOTO_ID_5577263300265154738" border="0" /></a><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFALIJZPadOdAE2ib3DS4l92AJlbTOqcgcmw8f0JI_nsidbPJ7f5xbKnFnCm39n1fOs9jVUTmflTMkeIBuqs9EHq6J45rDlpuJuUKnrbFUDJq2Cz7Q6EINkomGxcvVRoGss2LmSShYg7k/s1600/Covarianza+Practica2.jpg"><span style="font-weight: bold;"></span></a><br /></div>Observamos que el error en X es bastante pequeño, no asi como el error en Y, y como hay una relación entre ambos ejes, cuanto mas aumenta X mayor error hay en Y, para observar mejor este aspecto podemos observar la siguiente gráfica.<br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitNImmeP8IAJwn7CIRQqcqzzB-92nIT2rchudL4PsEonT__-_h2xnPhzVQj4EDZkel-KPU7pe3507EWnAUMbpStYBNf8XlIS8aMUUzh-itfwUqg3dSuj9cQN2UAmdbShZwdjRH74i-k1k/s1600/grafica+incertidumbre3.png"><img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 199px; height: 320px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitNImmeP8IAJwn7CIRQqcqzzB-92nIT2rchudL4PsEonT__-_h2xnPhzVQj4EDZkel-KPU7pe3507EWnAUMbpStYBNf8XlIS8aMUUzh-itfwUqg3dSuj9cQN2UAmdbShZwdjRH74i-k1k/s320/grafica+incertidumbre3.png" alt="" id="BLOGGER_PHOTO_ID_5577264197391156482" border="0" /></a><br /><br />En ella vemos representado el cono de apertura del sensor (como era de esperar el sonido se expande cuanta más distancia recorre), este cono debe ser simétrico hacia las Y negativas (no representado en la gráfica). No sale un cono suave como cabría esperar pero esto es debido a la dificultad de realizar mediciones precisas que nos hubieran dado un cono mucho mas "continuo".<br /><br /><br />Hasta aquí la calibración del sensor de ultrasonidos, hemos obtenido resultados algo sorprendentes (no esperabamos tanta precisión en rangos medios) y resultados esperados (como la representación del cono de apertura), en conclusión teniendo en cuenta las limitaciones en distancia y ángulo de nuestro sensor podemos decir que los datos que nos envia son bastante exactos de acuerdo a la realidad.Rubén Salamanqués Ballesteroshttp://www.blogger.com/profile/08887060577347129484noreply@blogger.com0tag:blogger.com,1999:blog-6667702851070405402.post-87925265679916346722011-02-24T11:51:00.041+01:002011-02-24T13:41:21.416+01:00Práctica 2. Algo más que pintar un cuadradoBueno y aquí está la entrada de la prática 2. En esta práctica usaremos por primera vez los sensores de nuestro robot, lo que permitirá a VivaBender realizar tareas un poco más complejas que las realizadas hasta ahora.<br /><br />Para empezar a familiarizarnos con los sensores hemos tenido que hacer un programa que mostrase por pantalla la información recogida por varios de ellos y a tiempo real.<br /><br /><div style="text-align: center;"><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_owHPFX1CQFSvaJuO-B720csT0NBnm7N3YvWvYZPIGHWKKR3ojHsACrwa77jAWcXT9NnJa0AlddcSzIRlr5LWtOq4YYeyhZBe2-65oA5K2iWO_vm3n4EaRkQcfHsSYvf7emx7jsDYxo4/s1600/Info.jpg"><img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 200px; height: 150px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_owHPFX1CQFSvaJuO-B720csT0NBnm7N3YvWvYZPIGHWKKR3ojHsACrwa77jAWcXT9NnJa0AlddcSzIRlr5LWtOq4YYeyhZBe2-65oA5K2iWO_vm3n4EaRkQcfHsSYvf7emx7jsDYxo4/s200/Info.jpg" alt="" id="BLOGGER_PHOTO_ID_5577208344691115138" border="0" /></a><span style="font-size:78%;">La información cambia en tiempo real.</span><br /></div><br />Este punto no ha tenido más complicación que encontrar que funciones nos devolvían la información requerida, nada que un paseo por la API de lejOS no pueda solucionar. Con esto hecho podíamos pasar al siguiente punto.<br /><br /><br /><span style="font-size:130%;"><span style="font-weight: bold;">Controlando mediante palmas.</span><br /></span><br /><span style="font-size:100%;">El primer programa a realizar consistía en controlar a VivaBender mediante sonido, cada vez que escuchase una palmada echaría a andar y en caso de ya estar andando se pararía, un comportamiento sencillo que podemos apreciar en el siguiente video.<br /></span><br /><div style="text-align: center;"><span style="font-size:100%;"><iframe title="YouTube video player" src="http://www.youtube.com/embed/O__3JJeYRMY" allowfullscreen="" center="1" width="350" frameborder="293" height="349"></iframe></span></div><br /><br /><span style="font-size:100%;">Como podemos observar en el video se realiza una calibración del nivel de la palmada antes de empezar para así asegurarnos de que el robot reaccionará adecuadamente al sonido. Una vez registrado ese nivel le aplicamos cierto margen de tolerancia en la reacción (por si en la calibración hemos hecho una palmada muy fuerte). </span><br /><br /><br /><span style="font-weight: bold;font-size:130%;" >Rebotando contra las paredes </span><br /><span style="font-size:100%;"><br />En el siguiente ejercicio usamos el sensor de contacto.<br /><br /></span><div style="text-align: center;"><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNBNJasFs7HyKt3o8B1wB0HG-IVwNl_qR1L3WPWlHgrYjdnrHSQ5lTfuaRSYLHdXIQgaoIWw7_tfgbG86Uh3CLW6jTsRpHpYBHS6dsgirDeg08n2u70kgkRgZvTRU0IxneVuvc9MJYrdE/s1600/Parachoques.jpg"><img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 200px; height: 150px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNBNJasFs7HyKt3o8B1wB0HG-IVwNl_qR1L3WPWlHgrYjdnrHSQ5lTfuaRSYLHdXIQgaoIWw7_tfgbG86Uh3CLW6jTsRpHpYBHS6dsgirDeg08n2u70kgkRgZvTRU0IxneVuvc9MJYrdE/s320/Parachoques.jpg" alt="" id="BLOGGER_PHOTO_ID_5577214126563555442" border="0" /></a><span style="font-size:78%;">Debajo de ese enorme parachoques está el sensor de contacto.</span><br /></div><br /><span style="font-size:100%;">La tarea consiste en avanzar hasta encontrar un obstáculo, "rebotar" contra él, girar un número aleatorio de grados y volver hacia delante hasta encontrar el siguiente obstáculo y vuelta a empezar.<br /></span><br /><div style="text-align: center;"><iframe title="YouTube video player" src="http://www.youtube.com/embed/UDGsyrscBMg" allowfullscreen="" width="350" frameborder="0" height="293">&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;br /&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;</iframe></div><span style="font-size:100%;"><br />Podemos ver como realiza giros aleatorios no sólo en ángulo sino también en sentido de giro.</span><br /><br /><br /><span style="font-weight: bold;font-size:130%;" >Rebotando... con cuidado</span><br /><br /><span style="font-size:100%;">Ahora tenemos que echar mano del sensor de ultrasonidos. El ejercicio es básicamente el mismo que el anterior, sólo que esta vez evitaremos chocar gracias a los ultrasonidos.<br /><br /></span><div style="text-align: center;"><iframe title="YouTube video player" src="http://www.youtube.com/embed/mgLd6_mvhGE" allowfullscreen="" width="350" frameborder="0" height="293"></iframe><br /><br /><span style="font-size:100%;"><br /></span><div style="text-align: left;"><span style="font-size:100%;">Midiendo constantemente el valor que nos da el sensor podemos saber si nos aproximamos a un obstáculo en cuyo caso podemos reaccionar a tiempo para no chocar contra él. Como se observa en el video hemos dado un margen algo alto cuando el robot se acerca de frente a la pared para así poder tener más seguridad en las aproximaciones a la pared con ángulos más complicados, aun así este sensor falla si a VivaBender le da por acercarse a la pared con un ángulo muy oblicuo (como observaremos en la sección de calibración de este sensor).</span><br /><br /><br /><span style="font-weight: bold;font-size:130%;" >Escapando del laberinto</span><br /><br /><span style="font-size:100%;">Llegamos al ejercicio más complicado de la práctica, VivaBender tiene que seguir una pared a cierta distancia para poder escapar de un laberinto.</span><br /></div><br /><div style="text-align: center;"><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6HANH1_1EWKFlrVNFdK4mhT2fzQyJYuETU2r2zBsVQsuR72OhH5wKLQlljiwTXzfukKkDHigMjp1SL0DlHvpPwrtQjEtjbRVZ6Ond3hZbHL2x_kmAwlsI1MzE7P1TOAIS2RjeVYsshXU/s1600/Orientado.jpg"><img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 200px; height: 150px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6HANH1_1EWKFlrVNFdK4mhT2fzQyJYuETU2r2zBsVQsuR72OhH5wKLQlljiwTXzfukKkDHigMjp1SL0DlHvpPwrtQjEtjbRVZ6Ond3hZbHL2x_kmAwlsI1MzE7P1TOAIS2RjeVYsshXU/s200/Orientado.jpg" alt="" id="BLOGGER_PHOTO_ID_5577220234457729170" border="0" /></a><span style="font-size:78%;">Con el sensor orientado en ángulo podemos percibir los rincones.<br /><br /></span><div style="text-align: left;">En este ejercicio hemos implementado un control basado en casos basándonos únicamente en la información recogida mediante el sensor de ultrasonidos distinguiendo:<br /><br />- Estás muy cerca.- Giro muy cerrado a la izquierda (el único giro bloqueante, hay que asegurarse de que se aleja lo suficiente).<br />- Estás cerca.- Giro cerrado hacia la izquierda.<br />- Te empiezas a acercar desde una distancia aceptable .- Giro muy abierto hacia la izquierda.<br />--- Distancia aceptable a la pared --- (el robot mantiene el rumbo de la última orden hasta entrar en algún caso concreto)<br />- Te empiezas a alejar desde una distancia aceptable a la pared.- Giro muy abierto hacia la derecha.<br />- Pierdes la pared.- Giro cerrado a la derecha.<br /><br />Observamos el resultado en estos dos videos.<br /><br /><div style="text-align: center;"><iframe title="YouTube video player" src="http://www.youtube.com/embed/KMG1ZZKH0H0" allowfullscreen="" width="300" frameborder="0" height="255"></iframe><br /><br /><iframe title="YouTube video player" src="http://www.youtube.com/embed/0hX-Me2Jihs" allowfullscreen="" width="300" frameborder="0" height="255"></iframe><br /></div><br /></div></div><span style="font-size:130%;"><span style="font-size:100%;"><span style="font-size:130%;"><span style="font-size:100%;"><br /><br /></span></span></span></span><div style="text-align: left;">Hasta aquí la primera parte, más tarde publicaremos la entrada dedicada a la calibración del sensor de ultrasonidos.<br /></div></div>Rubén Salamanqués Ballesteroshttp://www.blogger.com/profile/08887060577347129484noreply@blogger.com0tag:blogger.com,1999:blog-6667702851070405402.post-22501892597694424402011-02-06T15:05:00.017+01:002011-02-10T00:00:44.469+01:00Práctica 1. Primeros pasos con Viva Bender<div class="separator" style="clear: both; text-align: left;">Una vez ya terminado el diseño de nuestro robot seguido del manual que trae nxt, nos disponemos a llevar a cabo una serie de ejercicios básicos.</div><div class="separator" style="clear: both; text-align: left;"><br />
</div><div class="separator" style="clear: both; text-align: left;"><b><span class="Apple-style-span" style="font-size: large;">1.1 El Cuadrado</span></b></div><div class="separator" style="clear: both; text-align: center;"></div><div class="separator" style="clear: both; text-align: center;"></div><div class="separator" style="clear: both; text-align: center;"></div><div class="separator" style="clear: both; text-align: center;"></div><div class="separator" style="clear: both; text-align: left;">Después de haber aprendido funciones básicas de los motores, nos disponemos a llevar a cabo un ejercicio que nos dará la diferencia de lo que nosotros queremos y lo que realmente es el resultado.</div><div class="separator" style="clear: both; text-align: left;"><br />
</div><div class="separator" style="clear: both; text-align: left;">Lo primero, es buscar un buen sitio para colocar nuestro lápiz, ya que vamos a necesitar que nuestro robot pinte su trayectoria, la mejor posición es la que está en el centro del eje, ya que al girar, si el lápiz está colocado en el centro, este no verá modificada su posición en el plano.</div><div class="separator" style="clear: both; text-align: left;">Con la mayor precisión que hemos podido y con la ayuda de nuestro viejo compañero el celo, hemos colocado un lápiz en el eje de esta forma:</div><div class="separator" style="clear: both; text-align: left;"><br />
</div><div class="separator" style="clear: both; text-align: center;"><a href="http://i1101.photobucket.com/albums/g430/josemanuelbd/IMG_0015.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="150" src="http://i1101.photobucket.com/albums/g430/josemanuelbd/IMG_0015.jpg" width="200" /></a><a href="http://i1101.photobucket.com/albums/g430/josemanuelbd/IMG_0017.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="150" src="http://i1101.photobucket.com/albums/g430/josemanuelbd/IMG_0017.jpg" width="200" /></a></div><div class="separator" style="clear: both; text-align: left;"><br />
</div><div class="separator" style="clear: both; text-align: left;">Ahora, queremos pintar un cuadrado de 40x40 (linea blanca), pero como podemos observar en la imagen inferior, Viva Bender ha pintado su propio cuadrado de 40x40 (linea roja), muy diferente de la teoría. Esto se debe principalmente a nuestro diseño del robot, distancia entre las ruedas, resistencia con el lápiz al pintar,orientación manual de nuestro robot...etc, una serie de parámetros que dificultan la realización correcta de nuestro objetivo. Cuanto mas preciso sea nuestro robot, mayor aproximación a la teoría, pero en la práctica hay dificultades.</div><div class="separator" style="clear: both; text-align: left;"><br />
</div><div class="separator" style="clear: both; text-align: center;"><a href="http://i1101.photobucket.com/albums/g430/josemanuelbd/Cuadrado.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="265" src="http://i1101.photobucket.com/albums/g430/josemanuelbd/Cuadrado.jpg" width="320" /></a></div><div class="separator" style="clear: both; text-align: center;"><br />
</div><div class="separator" style="clear: both; text-align: left;"><b><span class="Apple-style-span" style="font-size: large;">1.2 Calculo Matriz de Covarianza</span></b></div>Como siguiente ejercicio, realizamos el cálculo de la matriz de covarianza, a partir de la siguiente fórmula:<br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://i1101.photobucket.com/albums/g430/josemanuelbd/covarianza.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="38" src="http://i1101.photobucket.com/albums/g430/josemanuelbd/covarianza.jpg" width="320" /></a></div><br />
Nos disponemos a recorrer un metro con nuestro robot desde un " mismo punto inicial " (entrecomillado por la inexactitud del mismo). El objetivo es comprobar que a medida que avanzamos el grado de incertidumbre aumenta y su distancia también, ya que cuanto mas pegado al eje x (0) mayor distancia recorre y cuanto mas se aleja de y menos distancia recorre en x. (linea roja, trayectorias del robot)<br />
<br />
<pre style="white-space: pre-wrap; word-wrap: break-word;"><span class="Apple-style-span" style="background-color: #134f5c;"> Tomamos 10 medidas: </span></pre><pre style="white-space: pre-wrap; word-wrap: break-word;"><span class="Apple-style-span" style="background-color: #134f5c;"> X Y </span></pre><pre style="white-space: pre-wrap; word-wrap: break-word;"><span class="Apple-style-span" style="background-color: #134f5c;"> 1. (97'9,1'2)
2. (97'9,0'4)
3. (97'8,-0'2)
4. (98'1,-0'2)
5. (98'0,-0'4)
6. (98'1,-0'6)
7. (97'9,-0'7)
8. (97'8,-0'8)
9. (97'9,-1'9)
10.(98'1,-2'6)
media(97'95,-0'58)
Matriz P (0'0125 -0'0388)
(-0'0388 1'0336)</span></pre><br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://i1101.photobucket.com/albums/g430/josemanuelbd/Avanza1metro.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="160" src="http://i1101.photobucket.com/albums/g430/josemanuelbd/Avanza1metro.jpg" width="400" /></a></div><div class="separator" style="clear: both; text-align: center;"><br />
</div><div class="separator" style="clear: both; text-align: left;"><b><span class="Apple-style-span" style="font-size: large;">1.3 Visualización de la trayectoria</span></b></div><div class="separator" style="clear: both; text-align: left;">Por último, queremos mostrar el recorrido que realiza el robot en la pantalla, para ello solo programamos que hiciera un recorrido (mostrado en el segundo video), y que a su vez fuese dibujando en tiempo real su trayectoria.</div><div class="separator" style="clear: both; text-align: left;">Las fórmulas para el cálculo del desplazamiento y el cálculo del ángulo son :</div><div class="separator" style="clear: both; text-align: center;">(Desplazamiento)<a href="http://i1101.photobucket.com/albums/g430/josemanuelbd/Desplazamiento.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://i1101.photobucket.com/albums/g430/josemanuelbd/Desplazamiento.jpg" /></a></div><div class="separator" style="clear: both; text-align: center;">(ángulo)<a href="http://i1101.photobucket.com/albums/g430/josemanuelbd/angulo.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://i1101.photobucket.com/albums/g430/josemanuelbd/angulo.jpg" /></a></div><div class="separator" style="clear: both; text-align: center;"><br />
</div><div class="separator" style="clear: both; text-align: left;"><br />
</div>(Viva Bender en funcionamiento)<iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.youtube.com/embed/I8-a31ohMcg?feature=player_embedded' frameborder='0'></iframe><br />
Esta muestra es sencillamente fácil, solo hay que tener en cuenta la posición actual del robot y los ángulos hacia donde gira el mismo.<br />
<br />
<b>Limitaciones</b>: (La pantalla no es infinita, nuestro recorrido se ve completamente porque está dentro de los márgenes de la pantalla).<br />
(Trayectoria dibujada por VB) <iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.youtube.com/embed/QKjo0l6au2w?feature=player_embedded' frameborder='0'></iframe><br />
<div class="separator" style="clear: both; text-align: center;"><br />
</div><div class="separator" style="clear: both; text-align: left;"><b><span class="Apple-style-span" style="font-size: large;">1.4 Conclusión:</span></b></div><div class="separator" style="clear: both; text-align: left;">Aproximar la teoría a la práctica es bastante complicado, lo que para el robot creé ser correcto, en nuestra realidad hay imperfecciones, ya que no realiza la trayectoria con bastante perfección por ejemplo.</div><div class="separator" style="clear: both; text-align: left;">La situación en la que se encuentre también es un factor importante, porque la superficie de apoyo afecta directamente al correcto funcionamiento, se producen resbalones en superficies pulidas, no funciona bien en superficies con cierto ángulo etc...</div><div class="separator" style="clear: both; text-align: left;">Aún con todo ello, el robot es suficientemente preciso en las tareas que hemos realizado.</div><div class="separator" style="clear: both; text-align: left;"><br />
</div>Jose Manuel Bermudohttp://www.blogger.com/profile/03277318970188973445noreply@blogger.com0tag:blogger.com,1999:blog-6667702851070405402.post-24712515118934509532011-01-13T19:19:00.000+01:002011-01-13T19:26:10.731+01:00Bienvenidos al mundo del mañana!Hola mundo!<br />
<br />
Bienvenidos al blog con motivo de la asignatura de robótica de la Universidad Rey Juan Carlos, donde iremos desarrollando la práctica de la asignatura.<br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://www.capich.mx/wp-content/uploads/bender.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://www.capich.mx/wp-content/uploads/bender.jpg" width="308" /></a></div>Un saludo!Jose Manuel Bermudohttp://www.blogger.com/profile/03277318970188973445noreply@blogger.com0