<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-3626807390516031709</id><updated>2011-07-29T03:27:40.120+02:00</updated><title type='text'>Robótica 09/10</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://klaaturjc.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3626807390516031709/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://klaaturjc.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>P&amp;amp;J</name><uri>http://www.blogger.com/profile/17018684085962553279</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='20' src='http://1.bp.blogspot.com/_EOtCguTirEA/S2igpCRe7OI/AAAAAAAAAAM/PA2eQApLNKQ/S220/fotoblog.JPG'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>8</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-3626807390516031709.post-5809140343126013188</id><published>2010-05-23T12:52:00.004+02:00</published><updated>2010-05-23T13:03:07.533+02:00</updated><title type='text'>ADIÓS A CIGARRO</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_EOtCguTirEA/S_kKNTjbWJI/AAAAAAAAAJA/qGw5iY2NNw4/s1600/homerandbender.jpg"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 308px;" src="http://4.bp.blogspot.com/_EOtCguTirEA/S_kKNTjbWJI/AAAAAAAAAJA/qGw5iY2NNw4/s400/homerandbender.jpg" alt="" id="BLOGGER_PHOTO_ID_5474418045748992146" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Bueno por fin hemos acabado con todo lo que tiene que ver con este robot de lego.&lt;br /&gt;&lt;br /&gt;Lo cierto es que ya hace casi dos semanas que lo devolvimos y más de un mes que dejamos de hacer prácticas con él, pero hemos tenido que retrasar la despedida por culpa de los exámenes.&lt;br /&gt;&lt;br /&gt;Solo decir que aunque parezca un robot majo, trabajar con cigarro ha sido un infierno. Desmontarlo ha sido uno de los mayores placeres de este año y es que, aunque empezó muy bien llevar las prácticas al día ha acabado por ser un auténtico reto, que en ocasiones nos ha superado a todos (no, no seguimos pensando soluciones, el último post está cerrado hace ya muucho).&lt;br /&gt;Pero bueno al final hasta le hemos cogido cariño (sobre todo el señor X, que le ha tratado com a un auténtico hijo).&lt;br /&gt;&lt;br /&gt;Así que nada, el señor X (desde este año un auténtico experto en java) y bender (el típico amigo pringao) se despiden del mundo robótico para siempre.&lt;br /&gt;&lt;br /&gt;Suerte a todos los pringaos que quieran gozar de los placeres del nxt el año que viene, que os va a hacer falta xD.&lt;br /&gt;&lt;br /&gt;Adioss.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3626807390516031709-5809140343126013188?l=klaaturjc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://klaaturjc.blogspot.com/feeds/5809140343126013188/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://klaaturjc.blogspot.com/2010/05/adios-cigarro.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3626807390516031709/posts/default/5809140343126013188'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3626807390516031709/posts/default/5809140343126013188'/><link rel='alternate' type='text/html' href='http://klaaturjc.blogspot.com/2010/05/adios-cigarro.html' title='ADIÓS A CIGARRO'/><author><name>P&amp;amp;J</name><uri>http://www.blogger.com/profile/17018684085962553279</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='20' src='http://1.bp.blogspot.com/_EOtCguTirEA/S2igpCRe7OI/AAAAAAAAAAM/PA2eQApLNKQ/S220/fotoblog.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_EOtCguTirEA/S_kKNTjbWJI/AAAAAAAAAJA/qGw5iY2NNw4/s72-c/homerandbender.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3626807390516031709.post-7371941179217634008</id><published>2010-04-15T13:45:00.011+02:00</published><updated>2010-04-26T21:52:59.361+02:00</updated><title type='text'>Práctica 5: Auto-localización basada en filtro de partículas</title><content type='html'>Como el nombre indica esta práctica contiene ejercicios para comprobar la localización del robot en un entorno dado.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;VISUALIZACIÓN DEL MAPA Y LAS PARTÍCULAS&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Para comenzar a trabajar con el robot, lo primero es crear el mapa en el que se van a desarrollar las distintas pruebas. Dicho mapa se encuentra en un fichero .bin que le pasamos al filtro de partículas. Para poder mostrar los resultado por el LCD del robot se pinta el mapa con las medidas dadas en el enunciado.&lt;br /&gt;&lt;br /&gt;&lt;div class="hr"&gt;&lt;hr /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;DISEÑO DEL RADAR&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;En este apartado hay que crear un radar que funcione con los parámetros propuestos en el enunciado. Para ello hay que usar el sensor de ultrasonido montado sobre un motor, mediante el que realizar barridos.&lt;br /&gt;&lt;br /&gt;Es importante destacar la utilización de &lt;a href="http://lejos.sourceforge.net/nxt/nxj/api/index.html"&gt;RangeReadings&lt;/a&gt;, una clase en la que se guardan las mediciones y los ángulos obtenidos.&lt;br /&gt;&lt;br /&gt;Para comprobar que nuestro radar funcionaba de forma correcta creamos una serie de casos prueba, en los que fuera muy sencillo comprobar el resultado. Por ello mostramos las mediciones del radar por pantalla en forma de histrograma.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;Cuando vimos que los resultado era correctos pasamos a trabajar con el siguiente apartado.&lt;br /&gt;&lt;br /&gt;&lt;div class="hr"&gt;&lt;hr /&gt;&lt;/div&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;br /&gt;RECONOCIMIENTO DE POSICIÓN Y ORIENTACIÓN&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Para realizar el reconocimiento de posición modificamos el radar para que genere un histograma con las distancias obtenidas independientemente de la orientación.&lt;br /&gt;&lt;br /&gt;Para ello el robot pasa por una etapa de aprendizaje en la que se toman medidas sobre 5 localizaciones distintas dentro del mapa y se guardan en un fichero.&lt;br /&gt;Como nuestro sensor de ultrasonido es muy impreciso al principio no obtuvimos buenos resultados por lo que acabamos optando por mejorar el código un poco, haciendo que el sensor tomase  5 mediciones de cada punto que guardabamos en un array. Una vez obtenidas estas medidas realizamos la mediana para quedarnos con el valor más "preciso".&lt;br /&gt;En un primer momento pensamos en realizar la media, pero finalmente decidimos cambiar de opinión ya que la mediana es menos sensible ante los valores extremos.&lt;br /&gt;&lt;br /&gt;En cuanto a la orientación, una vez reconocido el punto en que te encuentras utilizamos la información obtenida con el radar anterior mediante rotaciones del RangeReading actual hasta hacerlo coincidir con el de referencia (punto en el que se encuentra).&lt;br /&gt;Teniendo en cuenta que el mapa era bastante simétrico, y que como ya hemos comentado nuestro sensor es bastante impreciso estamos contentos con nuestro resultado ya que el robot consiguió reconocer la mayoría de puntos, y siempre que este paso se hizo bien el ángulo también se adivinó.&lt;br /&gt;&lt;div class="hr"&gt;&lt;hr /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;RETO DE AUTO-LOCALIZACIÓN&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Este es sin duda el apartado más difícil al que nos hemos enfrentado en este curso, y es que conseguir autolocalizarse con los medios a nuestro alcance no es tarea fácil.&lt;br /&gt;Para empezar hay que tener en cuenta que este apartado se basa en gran medida en el anterior, ya que para recorrer los 5 puntos fijados en el mapa de forma correcta en necesario saber en primero lugar en que punto te encuentras y con que orientación, y si eso falla todo lo demás ira detrás.&lt;br /&gt;Suponiendo que el robot hiciera esta primera parte de forma correcta, habría que empezar a trabajar con las partículas, para poder ir corrigiendo el error que produce el movimiento por el mapa, de forma que la acumulación de errores sea la menor posible, consiguiendo así resultados mucho más precisos.&lt;br /&gt;En estos momentos aún seguimos trabajando en este apartado.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3626807390516031709-7371941179217634008?l=klaaturjc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3626807390516031709/posts/default/7371941179217634008'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3626807390516031709/posts/default/7371941179217634008'/><link rel='alternate' type='text/html' href='http://klaaturjc.blogspot.com/2010/04/practica-5-auto-localizacion-basada-en.html' title='Práctica 5: Auto-localización basada en filtro de partículas'/><author><name>P&amp;amp;J</name><uri>http://www.blogger.com/profile/17018684085962553279</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='20' src='http://1.bp.blogspot.com/_EOtCguTirEA/S2igpCRe7OI/AAAAAAAAAAM/PA2eQApLNKQ/S220/fotoblog.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-3626807390516031709.post-4527223798790013116</id><published>2010-03-24T20:20:00.045+01:00</published><updated>2010-03-25T23:50:17.154+01:00</updated><title type='text'>Práctica 4 - Modelo de movimiento probabilístico mediante filtro de partículas</title><content type='html'>Con esta nueva práctica comenzamos a indagar en el campo de la auto-localización, comenzando por el método de &lt;a href="http://es.wikipedia.org/wiki/Filtro_de_part%C3%ADculas"&gt;filtro de partículas&lt;/a&gt; (explicado de forma bastante amplia en el enunciado de la práctica).&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;*CLASES DE LEJOS: LineMap, MCLParticleSet, Line, Point, Movement.&lt;br /&gt;&lt;br /&gt;&lt;div class="hr"&gt;&lt;hr /&gt;&lt;/div&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;MODELO DE MOVIMIENTO MEDIANTE LA CLASE MCLParticleSet&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_EOtCguTirEA/S6ppRV174JI/AAAAAAAAAI4/Pg2_f6Bys9k/s1600/Imagen0013.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 200px; height: 150px;" src="http://1.bp.blogspot.com/_EOtCguTirEA/S6ppRV174JI/AAAAAAAAAI4/Pg2_f6Bys9k/s200/Imagen0013.jpg" alt="" id="BLOGGER_PHOTO_ID_5452286045527466130" border="0" /&gt;&lt;/a&gt;&lt;span&gt;Una vez entendido cómo funciona de forma teórica el filtro de partículas habia que llev&lt;/span&gt;&lt;span&gt;arlo 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.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;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.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;object width="400" height="318"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=10417345&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00adef&amp;amp;fullscreen=1" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=10417345&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00adef&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="318"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="hr"&gt;&lt;hr /&gt;&lt;/div&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;CÁLCULO DE TRAYECTORIAS&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;En este caso se trata de conseguir que el robot llegue a unas coordenadas introducidas por pantalla y acabe con una cierta orientación.&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;object width="400" height="318"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=10417417&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00adef&amp;amp;fullscreen=1" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=10417417&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00adef&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="318"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="hr"&gt;&lt;hr /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;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).&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;Con todo esto sacamos una fórmula, &lt;span style="font-style:italic;"&gt;muy bien&lt;/span&gt; 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.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;object height=300 width=500&gt;&lt;param name="movie" value="http://311897627391525694-a-1802744773732722657-s-sites.googlegroups.com/site/stavroginsdead/circulo.swf"&gt;&lt;param name="wmode" value="transparent"&gt;&lt;embed src="http://311897627391525694-a-1802744773732722657-s-sites.googlegroups.com/site/stavroginsdead/circulo.swf" type="application/x-shockwave-flash" wmode="transparent" height=300 width=500&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;El código de la animación (está en as3):&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: #000000;font-size: 12px;" id="snipplr_embed_30273" class="snipplr_embed"&gt;&lt;a href="http://snipplr.com/view/30273/trayectoria-curva/"&gt;Code snippet - Trayectoria curva&lt;/a&gt; on Snipplr&lt;/div&gt;&lt;script type="text/javascript" src="http://snipplr.com/js/embed.js"&gt;&lt;/script&gt;&lt;script type="text/javascript" src="http://snipplr.com/json/30273"&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;Funciona bien y todo. Abajo, cómo se comporta en el &lt;span style="font-style:italic;"&gt;mundo real&lt;/span&gt;™:&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;object width="400" height="318"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=10417269&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00adef&amp;amp;fullscreen=1" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=10417269&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00adef&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="318"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;object width="400" height="318"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=10417306&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00adef&amp;amp;fullscreen=1" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=10417306&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00adef&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="318"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="hr"&gt;&lt;hr /&gt;&lt;/div&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;P&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;or&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;ú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?&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;Con una segunda pensada tenemos lo siguiente:&lt;br /&gt;&lt;div align='center'&gt;&lt;object height=330 width=580&gt;&lt;param name="movie" value="http://5667073112321399955-a-1802744773732722657-s-sites.googlegroups.com/site/stavroginjhjhjhj/trayectoria.swf"&gt;&lt;param name="wmode" value="transparent"&gt;&lt;embed src="http://5667073112321399955-a-1802744773732722657-s-sites.googlegroups.com/site/stavroginjhjhjhj/trayectoria.swf" type="application/x-shockwave-flash" wmode="transparent" height=330 width=580&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;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.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3626807390516031709-4527223798790013116?l=klaaturjc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://klaaturjc.blogspot.com/feeds/4527223798790013116/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://klaaturjc.blogspot.com/2010/03/practica-4-modelo-de-movimiento.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3626807390516031709/posts/default/4527223798790013116'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3626807390516031709/posts/default/4527223798790013116'/><link rel='alternate' type='text/html' href='http://klaaturjc.blogspot.com/2010/03/practica-4-modelo-de-movimiento.html' title='Práctica 4 - Modelo de movimiento probabilístico mediante filtro de partículas'/><author><name>P&amp;amp;J</name><uri>http://www.blogger.com/profile/17018684085962553279</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='20' src='http://1.bp.blogspot.com/_EOtCguTirEA/S2igpCRe7OI/AAAAAAAAAAM/PA2eQApLNKQ/S220/fotoblog.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_EOtCguTirEA/S6ppRV174JI/AAAAAAAAAI4/Pg2_f6Bys9k/s72-c/Imagen0013.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3626807390516031709.post-3964520312261951373</id><published>2010-03-10T22:50:00.028+01:00</published><updated>2010-03-12T08:15:53.357+01:00</updated><title type='text'>Práctica 3 - Navegación local evitando obstáculos</title><content type='html'>En estas dos semanas nos hemos dedicado a desarrollar ciertos programas de navegación, ayudándonos de los sensores de contacto, ultrasonido y luz.&lt;br /&gt;&lt;br /&gt;En lineas generales esta práctica ha consistido en dejar al robot navegando en busca de un cierto punto de destino evitando los obtáculos que encontrase a su paso.&lt;br /&gt;&lt;br /&gt;Para trabajar c&lt;a style="" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_EOtCguTirEA/S5gVuqsv44I/AAAAAAAAAH8/ws2PTdw_yjk/s1600-h/Imagen0004.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 200px; height: 150px;" src="http://4.bp.blogspot.com/_EOtCguTirEA/S5gVuqsv44I/AAAAAAAAAH8/ws2PTdw_yjk/s200/Imagen0004.jpg" alt="" id="BLOGGER_PHOTO_ID_5447127640784757634" border="0" /&gt;&lt;/a&gt;omodamente con los sensores hemos tenido que cambiar el aspecto de nuestro robot (Cigarro, la encuesta salió positiva!!).  Como puede verse en la imagen, hemos situado el sensor de ultrasonido en la parte superior montado sobre un motor con el fin de poder realizar los barridos. A los dos lados del robot, en la parte delantera están los dos sensores de luz, formando un ángulo de unos 45 y -45º, y finalmente, el sensor de contacto con su parachoques.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;También cabe mencionar, que para esta práctica ha sido necesario implementar comportamientos (para ello es necesario usar la clase &lt;a href="http://lejos.sourceforge.net/p_technologies/nxt/nxj/api/index.html"&gt;Behavior&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;&lt;div class="hr"&gt;&lt;hr /&gt;&lt;/div&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-weight: bold;"&gt;COMPORTAMIENTO DE EVITACIÓN DE OBSTÁCULOS USANDO SENSORES DE CONTACTO&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;span style="font-weight: normal;"&gt;Como describe el nombre del apartado, se trataba de esquivar los obstáculos usando sensores de contacto. En este caso los obstáculos eran latas con un cierto peso. No hay que olvidar que el objetivo final es llegar a la meta. Por tanto, es fácil distinguir los comportamiento que el robot tiene que llevar a cabo: Avanzar hacia delante y esquivar los obstáculos.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: normal;"&gt;El robot tiene activado el comportamiento de ir para alante. Cuando el sensor de contacto advierte la presencia de un obstáculo salta el comportamiento esquivar, y una vez que el objeto ha sido sobrepasado se vuelve a activar el avanzar.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Avanzar:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: normal; color: rgb(0, 102, 0);"&gt;action:&lt;/span&gt;&lt;span style="font-weight: normal;"&gt; navegador.forward().&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: normal; color: rgb(0, 102, 0);"&gt;supress:&lt;/span&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="color: rgb(51, 204, 0);"&gt; &lt;/span&gt;navegador.stop().&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: normal; color: rgb(0, 102, 0);"&gt;takeControl:&lt;/span&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="color: rgb(0, 102, 0);"&gt; &lt;/span&gt;siempre true (es el comportamiento principal).&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Esquivar:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: normal; color: rgb(0, 102, 0);"&gt;action:&lt;/span&gt;&lt;span style="font-weight: normal;"&gt; realizar el giro (travel, rotate,...)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: normal; color: rgb(0, 102, 0);"&gt;supress:&lt;/span&gt;&lt;span style="font-weight: normal;"&gt; vacio.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: normal; color: rgb(0, 102, 0);"&gt;takeControl:&lt;/span&gt;&lt;span style="font-weight: normal;"&gt;  verdad si touch.isPressed().&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;object height="300" width="400"&gt;&lt;param name="allowfullscreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=10071519&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00adef&amp;amp;fullscreen=1"&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=10071519&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00adef&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" height="300" width="400"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="font-weight: normal;" class="hr"&gt;&lt;hr /&gt;&lt;/div&gt;&lt;span style="font-weight: normal;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-weight: bold;"&gt;COMPORTAMIENTO DE EVITACIÓN DE OBSTÁCULOS USANDO EL SENSOR DE ULTRASONIDOS.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Este aparto es sin duda el mayor reto al que nos hemos enfrentado hasta el momento, y al que le hemos dedicado mayor tiempo durante estas semanas. A pesar de ello los resultados hasta el momento no son tan buenos como a nosotros nos hubiera gustado.&lt;br /&gt;&lt;br /&gt;La temática de este ejercicio es muy similar a la del anterior, solo que esta vez no será necesario chocar con el objeto para saber que está ahí, sino que usaremos métodos más sofisticados.&lt;br /&gt;&lt;br /&gt;El robot deberá avanzar hacia delante realizando barridos con el sensor de ultrasonido. Si en ese barrido se detecta algún obstáculo hay que "guardar" su posición para no impactar con él. Es decir, de nuevo volvemos a tener dos comportamientos claramente diferenciados: Avanzar hacia delante (esta vez sensado con el ultrasonido) y esquivar.&lt;br /&gt;&lt;br /&gt;Para llevar a cabo el comportamiento esquivar es necesario usar el método  de navegación local conocido como VFF (Virtual Forces Field). Para este método hay que calcular la fuerza atractiva de tu punto de destino así como la fuerza repulsiva del obstáculo. Una vez que tienes los dos vectores puedes sumarlos, obteniendo así el vector resultante que determine el próximo movimiento del robot (evitando que impacte contra el obstáculo). Estos vectores deben actualizarse contínuamente, hasta que el objeto haya sido superado.&lt;br /&gt;&lt;br /&gt;¿Problemas? Muchos. Para empezar la incertidumbre en el eje y del sensor nos juega malas pasadas por lo que tuvimos que tomar medidas como realizar un segundo barrido, a parte del que va haciendo el robot cuando viaja hacia delante, que en cada ángulo halle tres distancias y devuelva la menor de ellas. También da muchísimos problemas la actualización de las coordenadas a medida que nos vamos moviendo. Esto lo solucionamos separando las rotaciones de los desplazamientos en línea recta. En los desplazamientos hacia delante utilizamos prácticamente las mismas fórmulas que en la práctica 1 y en las rotaciones simplemente aumentamos el ángulo del vector en sus coordenadas polares.&lt;br /&gt;&lt;br /&gt;Aquí podemos ver un esquemático del funcionamiento:&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://lh5.ggpht.com/_EOtCguTirEA/S5lnv-qodHI/AAAAAAAAAIo/XAya6WVNbVM/diagramaAvoidSonic.gif" /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Y un vídeo en el que se ve la movida:&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;object height="318" width="400"&gt;&lt;param name="allowfullscreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=10097160&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00adef&amp;amp;fullscreen=1"&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=10097160&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00adef&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" height="318" width="400"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="hr"&gt;&lt;hr /&gt;&lt;/div&gt;&lt;span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;COMPORTAMIENTO IR HACIA LA LUZ&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;a style="font-weight: bold;" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_EOtCguTirEA/S5gkd2TGNlI/AAAAAAAAAIE/Xq_UqP2dMdQ/s1600-h/Imagen0003.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 150px; height: 200px;" src="http://4.bp.blogspot.com/_EOtCguTirEA/S5gkd2TGNlI/AAAAAAAAAIE/Xq_UqP2dMdQ/s200/Imagen0003.jpg" alt="" id="BLOGGER_PHOTO_ID_5447143844515034706" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;br /&gt;En este caso el robot tiene que avanzar hacia la luz, representada por un foco.  Ahora nuestros comportamientos son avanzar y buscarluz. Pensando un poco en la solución reconocimos 4 posibles situaciones a las que deberíamos enfrentarnos:&lt;br /&gt;&lt;br /&gt;1: El robot no encuentra la luz: en ese caso debe girar hasta que la detecte, y comenzar a avanzar hacia ella.&lt;br /&gt;&lt;br /&gt;2: El sensor derecho detecta más luz que el izquierdo: La lámpara está a la derecha, hay que girar hacia ese mismo lado.&lt;br /&gt;&lt;br /&gt;3:El sensor izquierdo detecta más luz que el derecho: Igual que en el caso anterior, pero girando en el sentido contrario.&lt;br /&gt;&lt;br /&gt;4:Ambos sensores detectan la misma luz: El foco está en frente, hay que andar recto hacia el.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-weight: bold;"&gt;Avanzar:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;action:&lt;/span&gt; navegador.forward().&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;supress:&lt;/span&gt; navegador.stop().&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt; &lt;span style="color: rgb(0, 102, 0);"&gt;takeControl:&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt; &lt;/span&gt;siempre true (es el comportamiento principal).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;BuscarLuz:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;action:&lt;/span&gt; resolución de los casos anteriores.&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;supress:&lt;/span&gt; vacio.&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;takeControl:&lt;/span&gt; devolverá verdadero o falso según la luz captada por los sensores.&lt;br /&gt;&lt;br /&gt;Tanto para este como para el siguiente apartado merece la pena dar una vuelta por la &lt;a href="http://lejos.sourceforge.net/p_technologies/nxt/nxj/api/index.html"&gt;API de lejos&lt;/a&gt;, ya que estamos usando sensores de luz del modelo anterior, el &lt;a href="http://www.lego.com/eng/education/mindstorms/home.asp?pagename=rcx"&gt;RCX&lt;/a&gt;, y hay ciertos métodos de la clase &lt;a href="http://lejos.sourceforge.net/p_technologies/nxt/nxj/api/index.html"&gt;RCXLightSensor &lt;/a&gt;que están obsoletos y conviene usar lo menos posible.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt; Además&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; es necesario calibrar el robot cada vez que vaya a usarse, ya que la luz del ambiente puede variar, por lo que si no nos adaptamos al entorno, nuestro programa dejará de funcionar.&lt;br /&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;object height="300" width="400"&gt;&lt;param name="allowfullscreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=10071641&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00adef&amp;amp;fullscreen=1"&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=10071641&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00adef&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" height="300" width="400"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="hr"&gt;&lt;hr /&gt;&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;COMPORTAMIENTO IR HACIA LA LUZ EVITANDO OBSTÁCULOS&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt; Una vez implementados los ejercicios anteriores, obtener realizar este apartado resulta relativamente sencillo, ya que solo es necesario unir el comportamiento de buscar luz, al de avanzar hacia delante y esquivar obstáculo. Para este apartado podíamos elegir entre usar el sensor de contacto o el de ultrasonido. Nosotros nos hemos decantado por el de contacto, ya que su implementación es más simple y controlamos mejor su funcionamiento.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-weight: bold;"&gt;Avanzar:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;action:&lt;/span&gt; navegador.forward().&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;supress:&lt;/span&gt; navegador.stop().&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;takeControl:&lt;/span&gt;&lt;span style="color: rgb(0, 153, 0);"&gt; &lt;/span&gt;siempre true (es el comportamiento principal).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;BuscarLuz:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;action:&lt;/span&gt; resolución de los casos anteriores.&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;supress:&lt;/span&gt; vacio.&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;takeControl:&lt;/span&gt; devolverá verdadero o falso según la luz captada por los sensores.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span&gt;Esquivar:&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;span style="font-weight: normal; color: rgb(0, 102, 0);"&gt;action:&lt;/span&gt;&lt;span style="font-weight: normal;"&gt; realizar el giro (travel, rotate,...)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: normal; color: rgb(0, 102, 0);"&gt;supress:&lt;/span&gt;&lt;span style="font-weight: normal;"&gt; vacio.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: normal; color: rgb(0, 102, 0);"&gt;takeControl:&lt;/span&gt;&lt;span style="font-weight: normal;"&gt;  verdad si touch.isPressed().&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;object height="300" width="400"&gt;&lt;param name="allowfullscreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=10071755&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00adef&amp;amp;fullscreen=1"&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=10071755&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00adef&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" height="300" width="400"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3626807390516031709-3964520312261951373?l=klaaturjc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://klaaturjc.blogspot.com/feeds/3964520312261951373/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://klaaturjc.blogspot.com/2010/03/practica-3-navegacion-local-evitando.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3626807390516031709/posts/default/3964520312261951373'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3626807390516031709/posts/default/3964520312261951373'/><link rel='alternate' type='text/html' href='http://klaaturjc.blogspot.com/2010/03/practica-3-navegacion-local-evitando.html' title='Práctica 3 - Navegación local evitando obstáculos'/><author><name>P&amp;amp;J</name><uri>http://www.blogger.com/profile/17018684085962553279</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='20' src='http://1.bp.blogspot.com/_EOtCguTirEA/S2igpCRe7OI/AAAAAAAAAAM/PA2eQApLNKQ/S220/fotoblog.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_EOtCguTirEA/S5gVuqsv44I/AAAAAAAAAH8/ws2PTdw_yjk/s72-c/Imagen0004.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3626807390516031709.post-4061932037833865344</id><published>2010-02-22T22:52:00.133+01:00</published><updated>2010-02-25T13:52:45.124+01:00</updated><title type='text'>Práctica 2- Obteniendo información sensorial</title><content type='html'>Hola a todos.&lt;a style="" href="http://2.bp.blogspot.com/_EOtCguTirEA/S4MAMX5bxHI/AAAAAAAAAFs/mLKsgvDoJOI/s1600-h/IMG_8086.JPG" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" id="BLOGGER_PHOTO_ID_5441192987367031922" src="http://2.bp.blogspot.com/_EOtCguTirEA/S4MAMX5bxHI/AAAAAAAAAFs/mLKsgvDoJOI/s320/IMG_8086.JPG" style="margin: 0pt 10px 10px 0pt; cursor: pointer; float: left; height: 240px; width: 320px;" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Esta semana nuestro robot ha crecido, ha echado cuerpo y ha aprendido a extraer información del entorno gracias a sus sensores: desde la iluminación de la habitación, hasta la carga de la bateria.&lt;br /&gt;&lt;br /&gt;Para ello hemos tenido que implantarle estos sensores y luchar un poco con Cigarro para encontrar la forma de colocarlos todos de la mejor forma posible. La mayoría de ellos no fueron difíciles de ubicar, pero con el de ultrasonidos tuvimos que ejercitar la imaginación para conseguir que pueda apuntar hacia delante o hacia el lado. Tras gastar más de la mitad del celo decidimos optar por crear esa especie de plataforma circular que permite enforcar el sensor hacia donde nosotros queramos.&lt;br /&gt;&lt;br /&gt;&lt;div class="hr"&gt;&lt;hr /&gt;&lt;/div&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;&lt;br /&gt;&lt;br /&gt;OBTENIENDO INFORMACIÓN&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;En este apartado había que sacar por pantalla cierta información como el nombre del robot, los valores del sensor de luz y del de ultrasonido, la memoria RAM disponible y la información de la batería.&lt;br /&gt;&lt;br /&gt;Para obtener la información del ultrasonido utilizamos getDistance(), para la luz readValue() y getNormalizedLightValue(), para la batería getVoltageMilliVolt(), y por último para la memoria libre tuvimos que hurgar bastante en la documentación de la API hasta encontrar, bajo la clase Runtime el método freeMemory().&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;object height="300" width="400"&gt;&lt;param name="allowfullscreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=9685488&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00adef&amp;amp;fullscreen=1"&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=9685488&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00adef&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" height="300" width="400"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="hr"&gt;&lt;hr /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;CONTROL DEL ROBOT POR SONIDO&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Este apartado trata de hacer ruidos raros y asustar mucho a Cigarro. Para ello hay que elegir el porcentaje de decibelios a partir del cual el robot debía reaccionar.&lt;br /&gt;&lt;br /&gt;En principio el robot permanece parado, recogiendo mediciones del micrófono con readValue(). Cuando se de la palmada el microfono la recogerá y el robot empezará a andar. Con la segunda palmada el robot vuelve a su estado inicial de espera (parado). Hemos incluído también un par de sleeps estratégicamente situados para dejar al sensor reestablecer su valor, si no salía de los bucles demasiado rápido y la ejecución tenía muchísimos problemas.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;object height="300" width="400"&gt;&lt;param name="allowfullscreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=9685590&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00adef&amp;amp;fullscreen=1"&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=9685590&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00adef&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" height="300" width="400"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="hr"&gt;&lt;hr /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;BUMP &amp;amp; GO! USANDO SENSORES DE CONTACTO&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Para esta sección hay que poner a andar el robot en cualquier dirección con el sensor de contacto conectado. Cuando el sensor se pulsa ( sensor.isPressed()) el robot se para y ejecuta un método al que hemos llamado pasoAtrás. Como su nombre indica el robot realiza un pequeño movimiento hacia atrás para retirarse del obstáculo que ha detectado, y luego realiza un giro aleatorio gracias a la función random().&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;object height="300" width="400"&gt;&lt;param name="allowfullscreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=9685642&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00adef&amp;amp;fullscreen=1"&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=9685642&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00adef&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" height="300" width="400"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="hr"&gt;&lt;hr /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;BUMP &amp;amp; GO! USANDO SENSORES DE ULTRASONIDO&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;El código para este apartado es muy similar al anterior, de hecho, se puede usar el mismo procedimiento de pasoAtrás, solo que esta vez usamos el sensor de ultrasonido, y por tanto, evitamos el obstáculo antes de la colisión. De nuevo volvemos a usar getDistance().&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;object height="300" width="400"&gt;&lt;param name="allowfullscreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=9685814&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00adef&amp;amp;fullscreen=1"&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=9685814&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00adef&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" height="300" width="400"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="hr"&gt;&lt;hr /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;COMPORTAMIENTO SIGUE-PARED PARA SALIR DE UN LABERINTO&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Como su nombre indica se trata de hacer un programa para el robot con el fin de que este pueda seguir la pared de una habitación sorteando esquinas, objetos apoyados, etc.&lt;br /&gt;&lt;br /&gt;Para ello hay que ir tomando mediciones con el sensor de ultrasonido dirigido hacia la pared con un ángulo aproximado de 45º, y ir obteniendo datos del mismo para ir corrigiendo la ruta del robot.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;object height="300" width="400"&gt;&lt;param name="allowfullscreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=9698288&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00adef&amp;amp;fullscreen=1"&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=9698288&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00adef&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" height="300" width="400"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;br /&gt;Como podéis ver, el robot campa a sus anchas por nuestras casas como uno más yendo a la cocina a por algo de picoteo.&lt;br /&gt;&lt;br /&gt;&lt;div class="hr"&gt;&lt;hr /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;CALIBRACIÓN DEL SENSOR DE ULTRASONIDOS&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Aquí el reto consiste en medir experimentalmente las características de nuestro sensor de ultrasonidos.&lt;br /&gt;&lt;br /&gt;Primero comprobamos el rango de distancias para las que el sensor da una señal fiable.&lt;br /&gt;El resultado es [5cm, 240cm]. El rango de ángulos para el que las mediciones son válidas es [-45, 45] aproximadamente.&lt;br /&gt;&lt;br /&gt;La siguiente comprobación es saber si el sensor tiene un error sistemático o no. Para ello tomamos medias perpendicularmente a una pared, los resultados son en cm:&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;table class="sample" bgcolor="#1f3948" border="0" cellpadding="3" cellspacing="0"&gt;&lt;col width="114"&gt;   &lt;col span="8" width="21"&gt;   &lt;col width="28"&gt;&lt;tbody&gt;&lt;tr height="20"&gt;     &lt;td height="20" width="114"&gt;Distancia en X&lt;/td&gt;     &lt;td align="right" width="21"&gt;&lt;div align="center"&gt;20&lt;/div&gt;&lt;/td&gt;     &lt;td align="right" width="21"&gt;&lt;div align="center"&gt;30&lt;/div&gt;&lt;/td&gt;     &lt;td align="right" width="21"&gt;&lt;div align="center"&gt;40&lt;/div&gt;&lt;/td&gt;     &lt;td align="right" width="21"&gt;&lt;div align="center"&gt;50&lt;/div&gt;&lt;/td&gt;     &lt;td align="right" width="21"&gt;&lt;div align="center"&gt;60&lt;/div&gt;&lt;/td&gt;     &lt;td align="right" width="21"&gt;&lt;div align="center"&gt;70&lt;/div&gt;&lt;/td&gt;     &lt;td align="right" width="21"&gt;&lt;div align="center"&gt;80&lt;/div&gt;&lt;/td&gt;     &lt;td align="right" width="21"&gt;&lt;div align="center"&gt;90&lt;/div&gt;&lt;/td&gt;     &lt;td align="right" width="28"&gt;&lt;div align="center"&gt;100&lt;/div&gt;&lt;/td&gt;   &lt;/tr&gt;&lt;tr height="20"&gt;     &lt;td height="20"&gt;Distancia medida&lt;/td&gt;     &lt;td align="right"&gt;&lt;div align="center"&gt;23&lt;/div&gt;&lt;/td&gt;     &lt;td align="right"&gt;&lt;div align="center"&gt;32&lt;/div&gt;&lt;/td&gt;     &lt;td align="right"&gt;&lt;div align="center"&gt;42&lt;/div&gt;&lt;/td&gt;     &lt;td align="right"&gt;&lt;div align="center"&gt;52&lt;/div&gt;&lt;/td&gt;     &lt;td align="right"&gt;&lt;div align="center"&gt;62&lt;/div&gt;&lt;/td&gt;     &lt;td align="right"&gt;&lt;div align="center"&gt;72&lt;/div&gt;&lt;/td&gt;     &lt;td align="right"&gt;&lt;div align="center"&gt;81&lt;/div&gt;&lt;/td&gt;     &lt;td align="right"&gt;&lt;div align="center"&gt;92&lt;/div&gt;&lt;/td&gt;     &lt;td align="right"&gt;&lt;div align="center"&gt;101&lt;/div&gt;&lt;/td&gt;   &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;br /&gt;Existe un error sistemático de media 1.8cm en las medidas del sensor de ultrasonidos.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://lh3.ggpht.com/_EOtCguTirEA/S4SH6xi7gsI/AAAAAAAAAHI/76GOdmigwnc/Imagen0013.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" id="BLOGGER_PHOTO_ID_5441201229262162498" src="http://lh3.ggpht.com/_EOtCguTirEA/S4SH6xi7gsI/AAAAAAAAAHI/76GOdmigwnc/Imagen0013.jpg" style="margin: 0pt 10px 20px 30pt; cursor: pointer; float: left; height: 150px; width: 200px;" border="0" /&gt;&lt;/a&gt;&lt;a href="http://lh3.ggpht.com/_EOtCguTirEA/S4SH67jHSoI/AAAAAAAAAHM/g1toOn8icYk/Imagen0015.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" id="BLOGGER_PHOTO_ID_5441201523281373842" src="http://lh3.ggpht.com/_EOtCguTirEA/S4SH67jHSoI/AAAAAAAAAHM/g1toOn8icYk/Imagen0015.jpg" style="margin: 0pt 30px 20px 10pt; cursor: pointer; float: right; display: block; height: 150px; text-align: center; width: 200px;" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="clear: both;"&gt;&lt;/div&gt;El siguiente paso es calcular la incertidumbre de la medida en el eje X y en el eje Y independientemente. Para el eje X colocamos el robot a distintas distancias respecto a la pared y medimos, todas las medidas están en cm:&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;table class="sample" bgcolor="#1f3948" border="0" cellpadding="3" cellspacing="0"&gt;&lt;col width="74"&gt;   &lt;col span="10" width="28"&gt;   &lt;col width="80"&gt; &lt;tbody&gt;&lt;tr height="20"&gt;     &lt;td height="20" width="74"&gt;&lt;div align="center"&gt;Distancia    X&lt;/div&gt;&lt;/td&gt;     &lt;td width="28"&gt;&lt;div align="center"&gt;x1&lt;/div&gt;&lt;/td&gt;     &lt;td width="28"&gt;&lt;div align="center"&gt;x2&lt;/div&gt;&lt;/td&gt;     &lt;td width="28"&gt;&lt;div align="center"&gt;x3&lt;/div&gt;&lt;/td&gt;     &lt;td width="28"&gt;&lt;div align="center"&gt;x4&lt;/div&gt;&lt;/td&gt;     &lt;td width="28"&gt;&lt;div align="center"&gt;x5&lt;/div&gt;&lt;/td&gt;     &lt;td width="28"&gt;&lt;div align="center"&gt;x6&lt;/div&gt;&lt;/td&gt;     &lt;td width="28"&gt;&lt;div align="center"&gt;x7&lt;/div&gt;&lt;/td&gt;     &lt;td width="28"&gt;&lt;div align="center"&gt;x8&lt;/div&gt;&lt;/td&gt;     &lt;td width="28"&gt;&lt;div align="center"&gt;x9&lt;/div&gt;&lt;/td&gt;     &lt;td width="28"&gt;&lt;div align="center"&gt;x10&lt;/div&gt;&lt;/td&gt;     &lt;td width="80"&gt;&lt;div align="center"&gt;Media del error&lt;/div&gt;&lt;/td&gt;   &lt;/tr&gt;&lt;tr height="20"&gt;     &lt;td height="20"&gt;&lt;div align="center"&gt;40&lt;/div&gt;&lt;/td&gt;     &lt;td&gt;&lt;div align="center"&gt;42&lt;/div&gt;&lt;/td&gt;     &lt;td&gt;&lt;div align="center"&gt;42&lt;/div&gt;&lt;/td&gt;     &lt;td&gt;&lt;div align="center"&gt;42&lt;/div&gt;&lt;/td&gt;     &lt;td&gt;&lt;div align="center"&gt;42&lt;/div&gt;&lt;/td&gt;     &lt;td&gt;&lt;div align="center"&gt;42&lt;/div&gt;&lt;/td&gt;     &lt;td&gt;&lt;div align="center"&gt;43&lt;/div&gt;&lt;/td&gt;     &lt;td&gt;&lt;div align="center"&gt;42&lt;/div&gt;&lt;/td&gt;     &lt;td&gt;&lt;div align="center"&gt;42&lt;/div&gt;&lt;/td&gt;     &lt;td&gt;&lt;div align="center"&gt;42&lt;/div&gt;&lt;/td&gt;     &lt;td&gt;&lt;div align="center"&gt;43&lt;/div&gt;&lt;/td&gt;     &lt;td&gt;&lt;div align="center"&gt;2,2&lt;/div&gt;&lt;/td&gt;   &lt;/tr&gt;&lt;tr height="20"&gt;     &lt;td height="20"&gt;&lt;div align="center"&gt;50&lt;/div&gt;&lt;/td&gt;     &lt;td&gt;&lt;div align="center"&gt;52&lt;/div&gt;&lt;/td&gt;     &lt;td&gt;&lt;div align="center"&gt;53&lt;/div&gt;&lt;/td&gt;     &lt;td&gt;&lt;div align="center"&gt;52&lt;/div&gt;&lt;/td&gt;     &lt;td&gt;&lt;div align="center"&gt;52&lt;/div&gt;&lt;/td&gt;     &lt;td&gt;&lt;div align="center"&gt;52&lt;/div&gt;&lt;/td&gt;     &lt;td&gt;&lt;div align="center"&gt;52&lt;/div&gt;&lt;/td&gt;     &lt;td&gt;&lt;div align="center"&gt;52&lt;/div&gt;&lt;/td&gt;     &lt;td&gt;&lt;div align="center"&gt;52&lt;/div&gt;&lt;/td&gt;     &lt;td&gt;&lt;div align="center"&gt;52&lt;/div&gt;&lt;/td&gt;     &lt;td&gt;&lt;div align="center"&gt;52&lt;/div&gt;&lt;/td&gt;     &lt;td&gt;&lt;div align="center"&gt;2,1&lt;/div&gt;&lt;/td&gt;   &lt;/tr&gt;&lt;tr height="20"&gt;     &lt;td height="20"&gt;&lt;div align="center"&gt;60&lt;/div&gt;&lt;/td&gt;     &lt;td&gt;&lt;div align="center"&gt;62&lt;/div&gt;&lt;/td&gt;     &lt;td&gt;&lt;div align="center"&gt;62&lt;/div&gt;&lt;/td&gt;     &lt;td&gt;&lt;div align="center"&gt;62&lt;/div&gt;&lt;/td&gt;     &lt;td&gt;&lt;div align="center"&gt;62&lt;/div&gt;&lt;/td&gt;     &lt;td&gt;&lt;div align="center"&gt;62&lt;/div&gt;&lt;/td&gt;     &lt;td&gt;&lt;div align="center"&gt;62&lt;/div&gt;&lt;/td&gt;     &lt;td&gt;&lt;div align="center"&gt;62&lt;/div&gt;&lt;/td&gt;     &lt;td&gt;&lt;div align="center"&gt;62&lt;/div&gt;&lt;/td&gt;     &lt;td&gt;&lt;div align="center"&gt;62&lt;/div&gt;&lt;/td&gt;     &lt;td&gt;&lt;div align="center"&gt;62&lt;/div&gt;&lt;/td&gt;     &lt;td&gt;&lt;div align="center"&gt;2&lt;/div&gt;&lt;/td&gt;   &lt;/tr&gt;&lt;tr height="20"&gt;     &lt;td height="20"&gt;&lt;div align="center"&gt;70&lt;/div&gt;&lt;/td&gt;     &lt;td&gt;&lt;div align="center"&gt;72&lt;/div&gt;&lt;/td&gt;     &lt;td&gt;&lt;div align="center"&gt;72&lt;/div&gt;&lt;/td&gt;     &lt;td&gt;&lt;div align="center"&gt;72&lt;/div&gt;&lt;/td&gt;     &lt;td&gt;&lt;div align="center"&gt;72&lt;/div&gt;&lt;/td&gt;     &lt;td&gt;&lt;div align="center"&gt;72&lt;/div&gt;&lt;/td&gt;     &lt;td&gt;&lt;div align="center"&gt;72&lt;/div&gt;&lt;/td&gt;     &lt;td&gt;&lt;div align="center"&gt;73&lt;/div&gt;&lt;/td&gt;     &lt;td&gt;&lt;div align="center"&gt;72&lt;/div&gt;&lt;/td&gt;     &lt;td&gt;&lt;div align="center"&gt;72&lt;/div&gt;&lt;/td&gt;     &lt;td&gt;&lt;div align="center"&gt;72&lt;/div&gt;&lt;/td&gt;     &lt;td&gt;&lt;div align="center"&gt;2,1&lt;/div&gt;&lt;/td&gt;   &lt;/tr&gt;&lt;tr height="20"&gt;     &lt;td height="20"&gt;&lt;div align="center"&gt;80&lt;/div&gt;&lt;/td&gt;     &lt;td&gt;&lt;div align="center"&gt;81&lt;/div&gt;&lt;/td&gt;     &lt;td&gt;&lt;div align="center"&gt;81&lt;/div&gt;&lt;/td&gt;     &lt;td&gt;&lt;div align="center"&gt;81&lt;/div&gt;&lt;/td&gt;     &lt;td&gt;&lt;div align="center"&gt;82&lt;/div&gt;&lt;/td&gt;     &lt;td&gt;&lt;div align="center"&gt;81&lt;/div&gt;&lt;/td&gt;     &lt;td&gt;&lt;div align="center"&gt;82&lt;/div&gt;&lt;/td&gt;     &lt;td&gt;&lt;div align="center"&gt;82&lt;/div&gt;&lt;/td&gt;     &lt;td&gt;&lt;div align="center"&gt;82&lt;/div&gt;&lt;/td&gt;     &lt;td&gt;&lt;div align="center"&gt;82&lt;/div&gt;&lt;/td&gt;     &lt;td&gt;&lt;div align="center"&gt;81&lt;/div&gt;&lt;/td&gt;     &lt;td&gt;&lt;div align="center"&gt;1,5&lt;/div&gt;&lt;/td&gt;   &lt;/tr&gt;&lt;tr height="20"&gt;     &lt;td height="20"&gt;&lt;div align="center"&gt;90&lt;/div&gt;&lt;/td&gt;     &lt;td&gt;&lt;div align="center"&gt;92&lt;/div&gt;&lt;/td&gt;     &lt;td&gt;&lt;div align="center"&gt;92&lt;/div&gt;&lt;/td&gt;     &lt;td&gt;&lt;div align="center"&gt;92&lt;/div&gt;&lt;/td&gt;     &lt;td&gt;&lt;div align="center"&gt;91&lt;/div&gt;&lt;/td&gt;     &lt;td&gt;&lt;div align="center"&gt;92&lt;/div&gt;&lt;/td&gt;     &lt;td&gt;&lt;div align="center"&gt;92&lt;/div&gt;&lt;/td&gt;     &lt;td&gt;&lt;div align="center"&gt;92&lt;/div&gt;&lt;/td&gt;     &lt;td&gt;&lt;div align="center"&gt;92&lt;/div&gt;&lt;/td&gt;     &lt;td&gt;&lt;div align="center"&gt;91&lt;/div&gt;&lt;/td&gt;     &lt;td&gt;&lt;div align="center"&gt;92&lt;/div&gt;&lt;/td&gt;     &lt;td&gt;&lt;div align="center"&gt;1,8&lt;/div&gt;&lt;/td&gt;   &lt;/tr&gt;&lt;tr height="20"&gt;     &lt;td height="20"&gt;&lt;div align="center"&gt;100&lt;/div&gt;&lt;/td&gt;     &lt;td&gt;&lt;div align="center"&gt;102&lt;/div&gt;&lt;/td&gt;     &lt;td&gt;&lt;div align="center"&gt;102&lt;/div&gt;&lt;/td&gt;     &lt;td&gt;&lt;div align="center"&gt;101&lt;/div&gt;&lt;/td&gt;     &lt;td&gt;&lt;div align="center"&gt;102&lt;/div&gt;&lt;/td&gt;     &lt;td&gt;&lt;div align="center"&gt;102&lt;/div&gt;&lt;/td&gt;     &lt;td&gt;&lt;div align="center"&gt;102&lt;/div&gt;&lt;/td&gt;     &lt;td&gt;&lt;div align="center"&gt;102&lt;/div&gt;&lt;/td&gt;     &lt;td&gt;&lt;div align="center"&gt;101&lt;/div&gt;&lt;/td&gt;     &lt;td&gt;&lt;div align="center"&gt;102&lt;/div&gt;&lt;/td&gt;     &lt;td&gt;&lt;div align="center"&gt;102&lt;/div&gt;&lt;/td&gt;     &lt;td&gt;&lt;div align="center"&gt;1,8&lt;/div&gt;&lt;/td&gt;   &lt;/tr&gt;&lt;tr height="20"&gt;     &lt;td height="20"&gt;&lt;div align="center"&gt;110&lt;/div&gt;&lt;/td&gt;     &lt;td&gt;&lt;div align="center"&gt;112&lt;/div&gt;&lt;/td&gt;     &lt;td&gt;&lt;div align="center"&gt;112&lt;/div&gt;&lt;/td&gt;     &lt;td&gt;&lt;div align="center"&gt;113&lt;/div&gt;&lt;/td&gt;     &lt;td&gt;&lt;div align="center"&gt;112&lt;/div&gt;&lt;/td&gt;     &lt;td&gt;&lt;div align="center"&gt;112&lt;/div&gt;&lt;/td&gt;     &lt;td&gt;&lt;div align="center"&gt;112&lt;/div&gt;&lt;/td&gt;     &lt;td&gt;&lt;div align="center"&gt;113&lt;/div&gt;&lt;/td&gt;     &lt;td&gt;&lt;div align="center"&gt;112&lt;/div&gt;&lt;/td&gt;     &lt;td&gt;&lt;div align="center"&gt;112&lt;/div&gt;&lt;/td&gt;     &lt;td&gt;&lt;div align="center"&gt;112&lt;/div&gt;&lt;/td&gt;     &lt;td&gt;&lt;div align="center"&gt;2,2&lt;/div&gt;&lt;/td&gt;   &lt;/tr&gt;&lt;tr height="20"&gt;     &lt;td height="20"&gt;&lt;div align="center"&gt;120&lt;/div&gt;&lt;/td&gt;     &lt;td&gt;&lt;div align="center"&gt;122&lt;/div&gt;&lt;/td&gt;     &lt;td&gt;&lt;div align="center"&gt;122&lt;/div&gt;&lt;/td&gt;     &lt;td&gt;&lt;div align="center"&gt;123&lt;/div&gt;&lt;/td&gt;     &lt;td&gt;&lt;div align="center"&gt;122&lt;/div&gt;&lt;/td&gt;     &lt;td&gt;&lt;div align="center"&gt;122&lt;/div&gt;&lt;/td&gt;     &lt;td&gt;&lt;div align="center"&gt;122&lt;/div&gt;&lt;/td&gt;     &lt;td&gt;&lt;div align="center"&gt;122&lt;/div&gt;&lt;/td&gt;     &lt;td&gt;&lt;div align="center"&gt;123&lt;/div&gt;&lt;/td&gt;     &lt;td&gt;&lt;div align="center"&gt;122&lt;/div&gt;&lt;/td&gt;     &lt;td&gt;&lt;div align="center"&gt;122&lt;/div&gt;&lt;/td&gt;     &lt;td&gt;&lt;div align="center"&gt;2,2&lt;/div&gt;&lt;/td&gt;   &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;br /&gt;Podemos deducir que el error no depende de la distancia ya que el error medio no cambia respecto a la misma.&lt;br /&gt;&lt;br /&gt;Para la incertidumbre en el eje y colocamos un objeto a distintas distancias en el eje x y lo fuimos desplazando por el eje y hasta que dejabamos de recibir una medida válida. Los resultados han sido:&lt;br /&gt;&lt;br /&gt;&lt;div align="center" style="padding: 5px 0pt 0pt"&gt;&lt;br /&gt;&lt;table class='sample' cellspacing="0" cellpadding="0"&gt;   &lt;col width="74" /&gt;   &lt;col width="28" span="10" /&gt;   &lt;tr height="20"&gt;     &lt;td height="20" width="74"&gt;&lt;div align="center"&gt;Distancia X&lt;/div&gt;&lt;/td&gt;     &lt;td width="28"&gt;&lt;div align="center"&gt;&lt;img src="http://lh5.ggpht.com/_EOtCguTirEA/S4ZtUqRwt0I/AAAAAAAAAHU/joCn_mGHLio/y1.gif" style="margin: 0px;" align="absmiddle" /&gt;&lt;/div&gt;&lt;/td&gt;     &lt;td width="28"&gt;&lt;div align="center"&gt;&lt;img src="http://lh6.ggpht.com/_EOtCguTirEA/S4ZtU5YAGAI/AAAAAAAAAHY/5Clv0jiysBE/y2.gif" style="margin: 0px;" align="absmiddle" /&gt;&lt;/div&gt;&lt;/td&gt;     &lt;td width="28"&gt;&lt;div align="center"&gt;&lt;img src="http://lh4.ggpht.com/_EOtCguTirEA/S4ZtU3Lan_I/AAAAAAAAAHc/JzDmGBT37yg/y3.gif" style="margin: 0px;" align="absmiddle" /&gt;&lt;/div&gt;&lt;/td&gt;     &lt;td width="28"&gt;&lt;div align="center"&gt;&lt;img src="http://lh5.ggpht.com/_EOtCguTirEA/S4ZtU4J7nTI/AAAAAAAAAHg/70_ciwzYJGI/y4.gif" style="margin: 0px;" align="absmiddle" /&gt;&lt;/div&gt;&lt;/td&gt;     &lt;td width="28"&gt;&lt;div align="center"&gt;&lt;img src="http://lh6.ggpht.com/_EOtCguTirEA/S4ZtVFd3fgI/AAAAAAAAAHk/KB6kClbpvSs/y5.gif" style="margin: 0px;" align="absmiddle" /&gt;&lt;/div&gt;&lt;/td&gt;     &lt;td width="28"&gt;&lt;div align="center"&gt;&lt;img src="http://lh3.ggpht.com/_EOtCguTirEA/S4Ztcp6KhVI/AAAAAAAAAHo/Xlf5hhSCmr8/y6.gif" style="margin: 0px;" align="absmiddle" /&gt;&lt;/div&gt;&lt;/td&gt;     &lt;td width="28"&gt;&lt;div align="center"&gt;&lt;img src="http://lh3.ggpht.com/_EOtCguTirEA/S4Ztck76JTI/AAAAAAAAAHs/Dt5PvqsexZg/y7.gif" style="margin: 0px;" align="absmiddle" /&gt;&lt;/div&gt;&lt;/td&gt;     &lt;td width="28"&gt;&lt;div align="center"&gt;&lt;img src="http://lh6.ggpht.com/_EOtCguTirEA/S4Ztc8xAqsI/AAAAAAAAAHw/wv4BId1p0us/y8.gif" style="margin: 0px;" align="absmiddle" /&gt;&lt;/div&gt;&lt;/td&gt;     &lt;td width="28"&gt;&lt;div align="center"&gt;&lt;img src="http://lh5.ggpht.com/_EOtCguTirEA/S4Ztc1eXCBI/AAAAAAAAAH0/4qS6HohuQTE/y9.gif" style="margin: 0px;" align="absmiddle" /&gt;&lt;/div&gt;&lt;/td&gt;     &lt;td width="28"&gt;&lt;div align="center"&gt;&lt;img src="http://lh5.ggpht.com/_EOtCguTirEA/S4ZtdImSZ4I/AAAAAAAAAH4/W7gNqxfqc5M/y10.gif" style="margin: 0px;" align="absmiddle" /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr height="20"&gt;     &lt;td height="20" align="right"&gt;&lt;div align="center"&gt;40&lt;/div&gt;&lt;/td&gt;     &lt;td align="right"&gt;&lt;div align="center"&gt;10&lt;/div&gt;&lt;/td&gt;     &lt;td align="right"&gt;&lt;div align="center"&gt;11&lt;/div&gt;&lt;/td&gt;     &lt;td align="right"&gt;&lt;div align="center"&gt;11&lt;/div&gt;&lt;/td&gt;     &lt;td align="right"&gt;&lt;div align="center"&gt;11&lt;/div&gt;&lt;/td&gt;     &lt;td align="right"&gt;&lt;div align="center"&gt;11&lt;/div&gt;&lt;/td&gt;     &lt;td align="right"&gt;&lt;div align="center"&gt;13&lt;/div&gt;&lt;/td&gt;     &lt;td align="right"&gt;&lt;div align="center"&gt;10&lt;/div&gt;&lt;/td&gt;     &lt;td align="right"&gt;&lt;div align="center"&gt;12&lt;/div&gt;&lt;/td&gt;     &lt;td align="right"&gt;&lt;div align="center"&gt;12&lt;/div&gt;&lt;/td&gt;     &lt;td align="right"&gt;&lt;div align="center"&gt;10&lt;/div&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr height="20"&gt;     &lt;td height="20" align="right"&gt;&lt;div align="center"&gt;50&lt;/div&gt;&lt;/td&gt;     &lt;td align="right"&gt;&lt;div align="center"&gt;13&lt;/div&gt;&lt;/td&gt;     &lt;td align="right"&gt;&lt;div align="center"&gt;13&lt;/div&gt;&lt;/td&gt;     &lt;td align="right"&gt;&lt;div align="center"&gt;13&lt;/div&gt;&lt;/td&gt;     &lt;td align="right"&gt;&lt;div align="center"&gt;13&lt;/div&gt;&lt;/td&gt;     &lt;td align="right"&gt;&lt;div align="center"&gt;13&lt;/div&gt;&lt;/td&gt;     &lt;td align="right"&gt;&lt;div align="center"&gt;13&lt;/div&gt;&lt;/td&gt;     &lt;td align="right"&gt;&lt;div align="center"&gt;12&lt;/div&gt;&lt;/td&gt;     &lt;td align="right"&gt;&lt;div align="center"&gt;14&lt;/div&gt;&lt;/td&gt;     &lt;td align="right"&gt;&lt;div align="center"&gt;13&lt;/div&gt;&lt;/td&gt;     &lt;td align="right"&gt;&lt;div align="center"&gt;13&lt;/div&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr height="20"&gt;     &lt;td height="20" align="right"&gt;&lt;div align="center"&gt;60&lt;/div&gt;&lt;/td&gt;     &lt;td align="right"&gt;&lt;div align="center"&gt;15&lt;/div&gt;&lt;/td&gt;     &lt;td align="right"&gt;&lt;div align="center"&gt;16&lt;/div&gt;&lt;/td&gt;     &lt;td align="right"&gt;&lt;div align="center"&gt;16&lt;/div&gt;&lt;/td&gt;     &lt;td align="right"&gt;&lt;div align="center"&gt;17&lt;/div&gt;&lt;/td&gt;     &lt;td align="right"&gt;&lt;div align="center"&gt;15&lt;/div&gt;&lt;/td&gt;     &lt;td align="right"&gt;&lt;div align="center"&gt;15&lt;/div&gt;&lt;/td&gt;     &lt;td align="right"&gt;&lt;div align="center"&gt;16&lt;/div&gt;&lt;/td&gt;     &lt;td align="right"&gt;&lt;div align="center"&gt;16&lt;/div&gt;&lt;/td&gt;     &lt;td align="right"&gt;&lt;div align="center"&gt;17&lt;/div&gt;&lt;/td&gt;     &lt;td align="right"&gt;&lt;div align="center"&gt;17&lt;/div&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr height="20"&gt;     &lt;td height="20" align="right"&gt;&lt;div align="center"&gt;70&lt;/div&gt;&lt;/td&gt;     &lt;td align="right"&gt;&lt;div align="center"&gt;20&lt;/div&gt;&lt;/td&gt;     &lt;td align="right"&gt;&lt;div align="center"&gt;20&lt;/div&gt;&lt;/td&gt;     &lt;td align="right"&gt;&lt;div align="center"&gt;20&lt;/div&gt;&lt;/td&gt;     &lt;td align="right"&gt;&lt;div align="center"&gt;20&lt;/div&gt;&lt;/td&gt;     &lt;td align="right"&gt;&lt;div align="center"&gt;19&lt;/div&gt;&lt;/td&gt;     &lt;td align="right"&gt;&lt;div align="center"&gt;20&lt;/div&gt;&lt;/td&gt;     &lt;td align="right"&gt;&lt;div align="center"&gt;20&lt;/div&gt;&lt;/td&gt;     &lt;td align="right"&gt;&lt;div align="center"&gt;19&lt;/div&gt;&lt;/td&gt;     &lt;td align="right"&gt;&lt;div align="center"&gt;20&lt;/div&gt;&lt;/td&gt;     &lt;td align="right"&gt;&lt;div align="center"&gt;19&lt;/div&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr height="20"&gt;     &lt;td height="20" align="right"&gt;&lt;div align="center"&gt;80&lt;/div&gt;&lt;/td&gt;     &lt;td align="right"&gt;&lt;div align="center"&gt;12&lt;/div&gt;&lt;/td&gt;     &lt;td align="right"&gt;&lt;div align="center"&gt;14&lt;/div&gt;&lt;/td&gt;     &lt;td align="right"&gt;&lt;div align="center"&gt;14&lt;/div&gt;&lt;/td&gt;     &lt;td align="right"&gt;&lt;div align="center"&gt;14&lt;/div&gt;&lt;/td&gt;     &lt;td align="right"&gt;&lt;div align="center"&gt;13&lt;/div&gt;&lt;/td&gt;     &lt;td align="right"&gt;&lt;div align="center"&gt;13&lt;/div&gt;&lt;/td&gt;     &lt;td align="right"&gt;&lt;div align="center"&gt;13&lt;/div&gt;&lt;/td&gt;     &lt;td align="right"&gt;&lt;div align="center"&gt;12&lt;/div&gt;&lt;/td&gt;     &lt;td align="right"&gt;&lt;div align="center"&gt;13&lt;/div&gt;&lt;/td&gt;     &lt;td align="right"&gt;&lt;div align="center"&gt;13&lt;/div&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr height="20"&gt;     &lt;td height="20" align="right"&gt;&lt;div align="center"&gt;90&lt;/div&gt;&lt;/td&gt;     &lt;td align="right"&gt;&lt;div align="center"&gt;8&lt;/div&gt;&lt;/td&gt;     &lt;td align="right"&gt;&lt;div align="center"&gt;8&lt;/div&gt;&lt;/td&gt;     &lt;td align="right"&gt;&lt;div align="center"&gt;8&lt;/div&gt;&lt;/td&gt;     &lt;td align="right"&gt;&lt;div align="center"&gt;8&lt;/div&gt;&lt;/td&gt;     &lt;td align="right"&gt;&lt;div align="center"&gt;9&lt;/div&gt;&lt;/td&gt;     &lt;td align="right"&gt;&lt;div align="center"&gt;9&lt;/div&gt;&lt;/td&gt;     &lt;td align="right"&gt;&lt;div align="center"&gt;8&lt;/div&gt;&lt;/td&gt;     &lt;td align="right"&gt;&lt;div align="center"&gt;9&lt;/div&gt;&lt;/td&gt;     &lt;td align="right"&gt;&lt;div align="center"&gt;9&lt;/div&gt;&lt;/td&gt;     &lt;td align="right"&gt;&lt;div align="center"&gt;9&lt;/div&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr height="20"&gt;     &lt;td height="20" align="right"&gt;&lt;div align="center"&gt;100&lt;/div&gt;&lt;/td&gt;     &lt;td align="right"&gt;&lt;div align="center"&gt;10&lt;/div&gt;&lt;/td&gt;     &lt;td align="right"&gt;&lt;div align="center"&gt;10&lt;/div&gt;&lt;/td&gt;     &lt;td align="right"&gt;&lt;div align="center"&gt;10&lt;/div&gt;&lt;/td&gt;     &lt;td align="right"&gt;&lt;div align="center"&gt;10&lt;/div&gt;&lt;/td&gt;     &lt;td align="right"&gt;&lt;div align="center"&gt;10&lt;/div&gt;&lt;/td&gt;     &lt;td align="right"&gt;&lt;div align="center"&gt;10&lt;/div&gt;&lt;/td&gt;     &lt;td align="right"&gt;&lt;div align="center"&gt;10&lt;/div&gt;&lt;/td&gt;     &lt;td align="right"&gt;&lt;div align="center"&gt;9&lt;/div&gt;&lt;/td&gt;     &lt;td align="right"&gt;&lt;div align="center"&gt;10&lt;/div&gt;&lt;/td&gt;     &lt;td align="right"&gt;&lt;div align="center"&gt;10&lt;/div&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr height="20"&gt;     &lt;td height="20" align="right"&gt;&lt;div align="center"&gt;110&lt;/div&gt;&lt;/td&gt;     &lt;td align="right"&gt;&lt;div align="center"&gt;7&lt;/div&gt;&lt;/td&gt;     &lt;td align="right"&gt;&lt;div align="center"&gt;7&lt;/div&gt;&lt;/td&gt;     &lt;td align="right"&gt;&lt;div align="center"&gt;7&lt;/div&gt;&lt;/td&gt;     &lt;td align="right"&gt;&lt;div align="center"&gt;8&lt;/div&gt;&lt;/td&gt;     &lt;td align="right"&gt;&lt;div align="center"&gt;8&lt;/div&gt;&lt;/td&gt;     &lt;td align="right"&gt;&lt;div align="center"&gt;7&lt;/div&gt;&lt;/td&gt;     &lt;td align="right"&gt;&lt;div align="center"&gt;8&lt;/div&gt;&lt;/td&gt;     &lt;td align="right"&gt;&lt;div align="center"&gt;7&lt;/div&gt;&lt;/td&gt;     &lt;td align="right"&gt;&lt;div align="center"&gt;8&lt;/div&gt;&lt;/td&gt;     &lt;td align="right"&gt;&lt;div align="center"&gt;7&lt;/div&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr height="20"&gt;     &lt;td height="20" align="right"&gt;&lt;div align="center"&gt;120&lt;/div&gt;&lt;/td&gt;     &lt;td align="right"&gt;&lt;div align="center"&gt;5&lt;/div&gt;&lt;/td&gt;     &lt;td align="right"&gt;&lt;div align="center"&gt;6&lt;/div&gt;&lt;/td&gt;     &lt;td align="right"&gt;&lt;div align="center"&gt;5&lt;/div&gt;&lt;/td&gt;     &lt;td align="right"&gt;&lt;div align="center"&gt;5&lt;/div&gt;&lt;/td&gt;     &lt;td align="right"&gt;&lt;div align="center"&gt;5&lt;/div&gt;&lt;/td&gt;     &lt;td align="right"&gt;&lt;div align="center"&gt;5&lt;/div&gt;&lt;/td&gt;     &lt;td align="right"&gt;&lt;div align="center"&gt;5&lt;/div&gt;&lt;/td&gt;     &lt;td align="right"&gt;&lt;div align="center"&gt;5&lt;/div&gt;&lt;/td&gt;     &lt;td align="right"&gt;&lt;div align="center"&gt;6&lt;/div&gt;&lt;/td&gt;     &lt;td align="right"&gt;&lt;div align="center"&gt;5&lt;/div&gt;&lt;/td&gt;   &lt;/tr&gt; &lt;/table&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="center"&gt;&lt;img src="http://lh5.ggpht.com/_EOtCguTirEA/S4Woy9bA5bI/AAAAAAAAAHQ/sz_bb7uem2w/grafico.gif"/&gt;&lt;/div&gt;&lt;br /&gt;En este caso &lt;img src="http://lh5.ggpht.com/_EOtCguTirEA/S4RrAZR35OI/AAAAAAAAAGo/zL1VziiXnBE/media_y.gif" style="margin: 0px;" align="absmiddle" /&gt; puede comprobarse que tiene una fuerte dependencia respecto a la distancia al robot. Las distancias en teoría deberían mostrar una figura elíptica aunque en nuestro caso hay que echarle imaginación para verla pero la elipse estar está, creednos. La culpa de este error se la echamos al sensor que el pobre no puede defenderse.&lt;br /&gt;Matrices de covarianza a distintas distancias del robot:&lt;br /&gt;&lt;div style="float: left;margin-left:10px;margin-right:10px"&gt;&lt;br /&gt;A 40cm:&lt;br /&gt;&lt;div align="center"&gt;&lt;table class="sample" cellpadding="1" cellspacing="2"&gt;  &lt;col span="2"&gt;  &lt;tbody&gt;&lt;tr height="20"&gt;    &lt;td align="right" height="20"&gt;&lt;div align="center"&gt;5&lt;/div&gt;&lt;/td&gt;    &lt;td align="right"&gt;&lt;div align="center"&gt;24,5&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;  &lt;tr height="20"&gt;    &lt;td align="right" height="20"&gt;&lt;div align="center"&gt;24,5&lt;/div&gt;&lt;/td&gt;    &lt;td align="right"&gt;&lt;div align="center"&gt;124,1&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="float: left;margin-left:10px;margin-right:10px"&gt;&lt;br /&gt;A 50cm:&lt;br /&gt;&lt;div align="center"&gt;&lt;table class="sample" cellpadding="1" cellspacing="2"&gt;  &lt;col span="2"&gt;  &lt;tbody&gt;&lt;tr height="20"&gt;    &lt;td align="right" height="20"&gt;&lt;div align="center"&gt;4,5&lt;/div&gt;&lt;/td&gt;    &lt;td align="right"&gt;&lt;div align="center"&gt;27,3&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;  &lt;tr height="20"&gt;    &lt;td align="right" height="20"&gt;&lt;div align="center"&gt;27,3&lt;/div&gt;&lt;/td&gt;    &lt;td align="right"&gt;&lt;div align="center"&gt;169,2&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="float: left;margin-left:10px;margin-right:10px"&gt;&lt;br /&gt;A 60cm:&lt;br /&gt;&lt;div align="center"&gt;&lt;table class="sample" cellpadding="1" cellspacing="2"&gt;  &lt;col span="2"&gt;  &lt;tbody&gt;&lt;tr height="20"&gt;    &lt;td align="right" height="20"&gt;&lt;div align="center"&gt;4&lt;/div&gt;&lt;/td&gt;    &lt;td align="right"&gt;&lt;div align="center"&gt;32&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;  &lt;tr height="20"&gt;    &lt;td align="right" height="20"&gt;&lt;div align="center"&gt;32&lt;/div&gt;&lt;/td&gt;    &lt;td align="right"&gt;&lt;div align="center"&gt;256,6&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="float: left;margin-left:10px;margin-right:10px"&gt;&lt;br /&gt;A 70cm:&lt;br /&gt;&lt;div align="center"&gt;&lt;table class="sample" cellpadding="1" cellspacing="2"&gt;  &lt;col span="2"&gt;  &lt;tbody&gt;&lt;tr height="20"&gt;    &lt;td align="right" height="20"&gt;&lt;div align="center"&gt;4,5&lt;/div&gt;&lt;/td&gt;    &lt;td align="right"&gt;&lt;div align="center"&gt;41,4&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;  &lt;tr height="20"&gt;    &lt;td align="right" height="20"&gt;&lt;div align="center"&gt;41,4&lt;/div&gt;&lt;/td&gt;    &lt;td align="right"&gt;&lt;div align="center"&gt;388,3&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="float: left;margin-left:10px;margin-right:10px"&gt;&lt;br /&gt;A 80cm:&lt;br /&gt;&lt;div align="center"&gt;&lt;table class="sample" cellpadding="1" cellspacing="2"&gt;  &lt;col span="2"&gt;  &lt;tbody&gt;&lt;tr height="20"&gt;    &lt;td align="right" height="20"&gt;&lt;div align="center"&gt;2,5&lt;/div&gt;&lt;/td&gt;    &lt;td align="right"&gt;&lt;div align="center"&gt;19,6&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;  &lt;tr height="20"&gt;    &lt;td align="right" height="20"&gt;&lt;div align="center"&gt;19,6&lt;/div&gt;&lt;/td&gt;    &lt;td align="right"&gt;&lt;div align="center"&gt;172,1&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="float: left;margin-left:10px;margin-right:10px"&gt;&lt;br /&gt;A 90cm:&lt;br /&gt;&lt;div align="center"&gt;&lt;table class="sample" cellpadding="1" cellspacing="2"&gt;  &lt;col span="2"&gt;  &lt;tbody&gt;&lt;tr height="20"&gt;    &lt;td align="right" height="20"&gt;&lt;div align="center"&gt;3,4&lt;/div&gt;&lt;/td&gt;    &lt;td align="right"&gt;&lt;div align="center"&gt;15,3&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;  &lt;tr height="20"&gt;    &lt;td align="right" height="20"&gt;&lt;div align="center"&gt;15,3&lt;/div&gt;&lt;/td&gt;    &lt;td align="right"&gt;&lt;div align="center"&gt;72,5&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="clear: both;"&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="float: left;margin-left:10px;margin-right:10px"&gt;&lt;br /&gt;A 100cm:&lt;br /&gt;&lt;div align="center"&gt;&lt;table class="sample" cellpadding="1" cellspacing="2"&gt;  &lt;col span="2"&gt;  &lt;tbody&gt;&lt;tr height="20"&gt;    &lt;td align="right" height="20"&gt;&lt;div align="center"&gt;3,4&lt;/div&gt;&lt;/td&gt;    &lt;td align="right"&gt;&lt;div align="center"&gt;17,9&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;  &lt;tr height="20"&gt;    &lt;td align="right" height="20"&gt;&lt;div align="center"&gt;17,9&lt;/div&gt;&lt;/td&gt;    &lt;td align="right"&gt;&lt;div align="center"&gt;98,1&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="float: left;margin-left:10px;margin-right:10px"&gt;&lt;br /&gt;A 110cm:&lt;br /&gt;&lt;div align="center"&gt;&lt;table class="sample" cellpadding="1" cellspacing="2"&gt;  &lt;col span="2"&gt;  &lt;tbody&gt;&lt;tr height="20"&gt;    &lt;td align="right" height="20"&gt;&lt;div align="center"&gt;5&lt;/div&gt;&lt;/td&gt;    &lt;td align="right"&gt;&lt;div align="center"&gt;16,3&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;  &lt;tr height="20"&gt;    &lt;td align="right" height="20"&gt;&lt;div align="center"&gt;16,3&lt;/div&gt;&lt;/td&gt;    &lt;td align="right"&gt;&lt;div align="center"&gt;55&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="float: left;margin-left:10px;margin-right:10px"&gt;&lt;br /&gt;A 120cm:&lt;br /&gt;&lt;div align="center"&gt;&lt;table class="sample" cellpadding="1" cellspacing="2"&gt;  &lt;col span="2"&gt;  &lt;tbody&gt;&lt;tr height="20"&gt;    &lt;td align="right" height="20"&gt;&lt;div align="center"&gt;5&lt;/div&gt;&lt;/td&gt;    &lt;td align="right"&gt;&lt;div align="center"&gt;11,4&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;  &lt;tr height="20"&gt;    &lt;td align="right" height="20"&gt;&lt;div align="center"&gt;11,4&lt;/div&gt;&lt;/td&gt;    &lt;td align="right"&gt;&lt;div align="center"&gt;27,2&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="clear: both;"&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3626807390516031709-4061932037833865344?l=klaaturjc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://klaaturjc.blogspot.com/feeds/4061932037833865344/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://klaaturjc.blogspot.com/2010/02/practica-2-obteniendo-informacion.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3626807390516031709/posts/default/4061932037833865344'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3626807390516031709/posts/default/4061932037833865344'/><link rel='alternate' type='text/html' href='http://klaaturjc.blogspot.com/2010/02/practica-2-obteniendo-informacion.html' title='Práctica 2- Obteniendo información sensorial'/><author><name>P&amp;amp;J</name><uri>http://www.blogger.com/profile/17018684085962553279</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='20' src='http://1.bp.blogspot.com/_EOtCguTirEA/S2igpCRe7OI/AAAAAAAAAAM/PA2eQApLNKQ/S220/fotoblog.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_EOtCguTirEA/S4MAMX5bxHI/AAAAAAAAAFs/mLKsgvDoJOI/s72-c/IMG_8086.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3626807390516031709.post-7810915693835474345</id><published>2010-02-17T18:16:00.098+01:00</published><updated>2010-02-18T20:43:22.191+01:00</updated><title type='text'>Práctica 1- Primeros Pasos</title><content type='html'>En esta semana lo más destacable fue, sin duda, el bautizo de nuestro robot con el noble nombre de Cigarro. ¿Cambiaremos su nombre la semana que viene? sólo Dios sabe.&lt;br /&gt;&lt;br /&gt;En cuanto a la práctica 1, ésta podría dividirse en dos etapas. La primera correspondiente a la instalacion y uso de eclipse, y la segunda destinada a la creación de pequeñas aplicaciones para el robot.&lt;br /&gt;&lt;br /&gt;En lo que se refiere a la parte de uso del &lt;a href="http://www.eclipse.org/"&gt;eclipse&lt;/a&gt; no hay mucho que añadir, unicamente hay que tener cuidado en la configuración de los "external tools" (que nos ayudan a compilar, enlazar y enviar programas al robot desde eclipse). Aseguraos de rellenar bien los campos, y cuidado con VMware, parece que la versión 6.0 tiene algunos problemas a la hora de reconocer el robot.&lt;br /&gt;&lt;br /&gt;En cuanto a la descarga de eclipse, solo es necesario acceder a la sección de descargas de la propia página de eclipse para conseguir la ultima versión. (Si introducís eclipse en la shell y lo descargáis del enlace recomendado obtendréis una versión anterior y que no se puede actualizar).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(153, 204, 119);font-size:180%;" &gt;PRÁCTICAS:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_EOtCguTirEA/S3xwHMPh8TI/AAAAAAAAAEI/0CY_ZSZKdrs/s1600-h/Imagen0011.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 200px; height: 150px;" src="http://4.bp.blogspot.com/_EOtCguTirEA/S3xwHMPh8TI/AAAAAAAAAEI/0CY_ZSZKdrs/s200/Imagen0011.jpg" alt="" id="BLOGGER_PHOTO_ID_5439345718804476210" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;CONTROL BÁSICO DEL MOTOR&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Lo primero era enseñarle a Cigarro a moverse como Dios manda para lo que tuvimos que aprender a manejar los motores. Esta parte se divide en tres programas:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;BASIC MOTOR 1: &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Al pulsar el boton el motor conectado al puerto A empieza a girar.&lt;br /&gt;Button.waitForPress();&lt;br /&gt;Motor.A.forward();&lt;br /&gt;Cuando se pulsa el boton de nuevo el motor para.&lt;br /&gt;Button.waitForPress();&lt;br /&gt;Motor.A.stop();&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;br /&gt;&lt;object height="300" width="400"&gt;&lt;param name="allowfullscreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=9536076&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1"&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=9536076&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" height="300" width="400"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;BASIC MOTOR 2: &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Al pulsar el botón derecho el motor conectado al puerto A gira 45º a derecha, y viceversa con el botón izquierdo. Para ello hacemos uso de Motor.A.rotate() y Button.waitForPress().&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;br /&gt;&lt;object height="300" width="400"&gt;&lt;param name="allowfullscreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=9536157&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1"&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=9536157&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" height="300" width="400"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt; BASIC MOTOR 3:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;En este caso hay que obtener el mismo resultado que en el apartado anterior pero&lt;br /&gt;usando la funcion rotateTo(). Hay que tener en cuenta que la función rotateTo() gira hasta que la odometría del robot marca el ángulo pedido, es decir, que si la ejecutamos dos veces seguidas con el mismo ángulo, la segunda no producirá ningún cambio, ya que la odometría ya marca los grados solicitados. Por ello hay que usar la función resetTachoCount() para resetear la odometría.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;br /&gt;&lt;object height="300" width="400"&gt;&lt;param name="allowfullscreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=9536215&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1"&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=9536215&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" height="300" width="400"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="hr"&gt;&lt;hr /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;VISUALIZACIÓN DE LA ODOMETRÍA DEL ROBOT:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;En la solución de este problema mostramos por pantalla la odometría del motor B. El giro del motor lo consegimos con la función getTachoCount(). Para que los giros esten siempre comprendidos entre 0 y 360º acotamos el rango de valores haciendo uso de resetTachoCount() cada vez que se exceden estos valores.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;br /&gt;&lt;object height="300" width="400"&gt;&lt;param name="allowfullscreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=9536249&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1"&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=9536249&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" height="300" width="400"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="hr"&gt;&lt;hr /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;CUADRADO DE CALIBRACIÓN DE MOVIMIENTO:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_EOtCguTirEA/S3xumoXMDXI/AAAAAAAAADo/cc87XdBSxmE/s1600-h/Imagen0010.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 320px; height: 240px;" src="http://1.bp.blogspot.com/_EOtCguTirEA/S3xumoXMDXI/AAAAAAAAADo/cc87XdBSxmE/s320/Imagen0010.jpg" alt="" id="BLOGGER_PHOTO_ID_5439344059905478002" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Al ejecutar la aplicación el robot realiza una trayectoria en forma de cuadrado.&lt;br /&gt;Las funciones necesarias para este apartado son navegador.travel() y navegador.steer().&lt;br /&gt;Este apartado esta vinculado con el siguiente. Para poder realizar la matriz de covarianzas pusimos un rotulador al robot para que pintara sus trayectorias. Luego hay que anotar el error cometido en cada vuelta.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;br /&gt;&lt;object height="300" width="400"&gt;&lt;param name="allowfullscreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=9536549&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1"&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=9536549&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" height="300" width="400"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Como puede verse el cuadrado no es perfecto, trasteamos con los parámetros del constructor de la clase TachoPilot, variando un poco el ángulo de giro y reduciendo la velocidad pero de ninguna manera esto se solucionaba, no pasa nada, lo importante es tener salud. Como siempre se produce el mismo error, sobre todo en los giros, pensamos que podría fallar la rueda trasera giratoria así que mandamos a Cigarro a boxes para probar con varios tipos de ruedas fijas:&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;br /&gt;&lt;img style="margin: 0pt 0px 0px 25px; float: left; width: 240px; height: 267px;" src="http://2.bp.blogspot.com/_EOtCguTirEA/S30F2VOV7iI/AAAAAAAAAFM/aKO7YEIG_aw/s400/ruedaFija2.jpg" alt="" id="BLOGGER_PHOTO_ID_5439510355901804066" border="0" /&gt;&lt;img style="margin: 0pt 25px 0px 10px; float: right; width: 240px; height: 267px;" src="http://4.bp.blogspot.com/_EOtCguTirEA/S30Fq5INz1I/AAAAAAAAAFE/gJTYUUfcaEs/s400/ruedaFija1.jpg" alt="" id="BLOGGER_PHOTO_ID_5439510159381352274" border="0" /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="clear: both;"&gt;&lt;/div&gt;&lt;br /&gt;Tampoco sirvió de nada. Acabamos dándonos por vencidos y dejamos la que viene en el manual y es que en cuanto a ruedas al tío Lego no hay quien le tosa.&lt;br /&gt;&lt;br /&gt;Por ello podemos concluir que este error en el giro es sistemático, y ante eso poco podemos hacer...&lt;br /&gt;&lt;br /&gt;&lt;div class="hr"&gt;&lt;hr /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;CÁLCULO DE LA MATRIZ DE COVARIANZAS:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Para hallar la &lt;a href="http://es.wikipedia.org/wiki/Matriz_de_covarianza"&gt;matriz de covarianza&lt;/a&gt; no hay mas que seguir la fórmula indicada en el enunciado.&lt;br /&gt;&lt;br /&gt;Nosotros hemos tomado como origen de coordenadas el punto (0,0). Tras realizar el experimento 10 veces, las coordenadas de llegada obtenidas han sido : (2.6,-3.4),(2.9,-3.1),(2.3,-2.6),(3.0,-2.8),(2.9,-3.6),(2.9,-3.9),(3.1,-3.8),(3.3,-2.8),(3.7,-3.1),(3.1,-3.1), por lo que la matriz de covarianzas ha quedado de la siguiente manera:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;                                [        1.276                -0.023      ]&lt;br /&gt;  [      -0.023                  1.756       ]&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="hr"&gt;&lt;hr /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;VISUALIZACIÓN DE LA TRAYECTORIA:&lt;/span&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;div style="text-align: left;"&gt;Aquí el reto es que, a medida que el robot se desplaza por el mundo, vaya dibujando su trayectoria en pantalla con escala píxel/cm. Este punto fue el más difícil de implementar ya que este trazado ha de ser en tiempo real.&lt;br /&gt;Al final, superándonos a nosotros mismos, lo hemos conseguido y puede mostrar todo tipo de pirueta que pueda realizar Cigarro. Ved el vídeo en el que traza el cuadrado del punto anterior en pantalla:&lt;br /&gt;&lt;/div&gt;&lt;object height="300" width="400"&gt;&lt;param name="allowfullscreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=9535028&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00adef&amp;amp;fullscreen=1"&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=9535028&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00adef&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" height="300" width="400"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Quisimos ir más allá y probamos con una trayectoria curvilínea a ver si funcionaba igual de bien poniendo un humilde menú para elegir entre embos trayectos, el resultado nos dejó con las patas vueltas, véanlo:&lt;br /&gt;&lt;div align="center"&gt;&lt;br /&gt;&lt;object height="300" width="400"&gt;&lt;param name="allowfullscreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=9535225&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00adef&amp;amp;fullscreen=1"&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=9535225&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00adef&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" height="300" width="400"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-style: italic;"&gt;(* Para resolver las dudas sobre los comando a utilizar recomendamos mirar el  &lt;a href="http://lejos.sourceforge.net/nxt/nxj/tutorial/index.htm"&gt;NXJ Tutorial&lt;/a&gt;. A nosotros nos ha sido de gran ayuda.)&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3626807390516031709-7810915693835474345?l=klaaturjc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://klaaturjc.blogspot.com/feeds/7810915693835474345/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://klaaturjc.blogspot.com/2010/02/practica-1-primeros-pasos.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3626807390516031709/posts/default/7810915693835474345'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3626807390516031709/posts/default/7810915693835474345'/><link rel='alternate' type='text/html' href='http://klaaturjc.blogspot.com/2010/02/practica-1-primeros-pasos.html' title='Práctica 1- Primeros Pasos'/><author><name>P&amp;amp;J</name><uri>http://www.blogger.com/profile/17018684085962553279</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='20' src='http://1.bp.blogspot.com/_EOtCguTirEA/S2igpCRe7OI/AAAAAAAAAAM/PA2eQApLNKQ/S220/fotoblog.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_EOtCguTirEA/S3xwHMPh8TI/AAAAAAAAAEI/0CY_ZSZKdrs/s72-c/Imagen0011.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3626807390516031709.post-3529014736908910711</id><published>2010-02-04T18:59:00.021+01:00</published><updated>2010-02-08T11:38:50.051+01:00</updated><title type='text'>Práctica 0- Introducción al entorno NXJ</title><content type='html'>&lt;img style="margin: 40pt 0pt 10px 10px; float: right; width: 218px; height: 309px;" src="http://lh3.ggpht.com/_EOtCguTirEA/S27a7N6A5UI/AAAAAAAAADI/gCAU411JgWQ/ladrillo.png" alt="" /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Hola.&lt;br /&gt;&lt;br /&gt;Hoy hemos tenido la primera práctica con nuestro robot &lt;a href="http://mindstorms.lego.com/"&gt;Lego mindstorms NXT&lt;/a&gt;. Se trataba solo de instalar el entorno de desarrollo &lt;a href="http://lejos.sourceforge.net/index.php"&gt;&lt;span style="font-weight: bold;"&gt;leJOS&lt;/span&gt;&lt;/a&gt; y probar un par de aplicaciones.&lt;br /&gt;&lt;br /&gt;En cuanto al desarrollo de la práctica en el ordenador del laboratorio no hemos tenido ningún problema. El &lt;span style="font-weight: bold;"&gt;leJOS NXJ 0.8.5&lt;/span&gt; ya estaba instalado en los ordenadores, por lo que solo hemos tenido que seguir los pasos indicados en el enunciado para probar las aplicaciones HelloWorld, LCDUI, y por último nxjbrowse que permite gestionar los archivos del robot desde el ordenador de forma gráfica.&lt;br /&gt;&lt;br /&gt;Si hablamos ahora de nuestro ordenador personal, aquí la cosa se complica. Aconsejamos antes de empezar echar un vistazo a &lt;a style="font-weight: bold;" href="http://lejos.sourceforge.net/index.php"&gt;su web&lt;/a&gt; y prestar especial atención a los prerrequisitos que se pueden encontrar en la sección &lt;a href="http://lejos.sourceforge.net/nxt/nxj/tutorial/index.htm"&gt;tutorial&lt;/a&gt; y dependen de tu sistema operativo.&lt;br /&gt;&lt;br /&gt;No es extraño que no se cumpla algún prerrequisito en nuestro caso, que vamos a instalarlo en una ubuntu, tuvimos que instalar varios paquetes que faltaban, estos son: &lt;span style="font-style: italic; font-weight: bold;"&gt;ant&lt;/span&gt;, &lt;span style="font-weight: bold; font-style: italic;"&gt;sun-java6-jdk&lt;/span&gt;, &lt;span style="font-style: italic; font-weight: bold;"&gt;libusb-dev&lt;/span&gt; y &lt;span style="font-weight: bold; font-style: italic;"&gt;libbluetooth-dev&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Una vez cumplidos los prerrequisitos ya podemos descargar el software desde &lt;a style="font-weight: bold;" href="http://lejos.sourceforge.net/nxj-downloads.php"&gt;aquí&lt;/a&gt; e instalarlo siguiendo las &lt;a href="http://lejos.sourceforge.net/nxt/nxj/tutorial/Preliminaries/GettingStartedLinux.htm"&gt;instrucciones&lt;/a&gt;. Y eso es todo, al menos en teoría ya que en nuestra ubuntu corriendo en VMware Player sobre un Windows XP a la hora de &lt;span style="font-style: italic;"&gt;'flashear'&lt;/span&gt; el firmware con &lt;span style="font-style: italic; font-weight: bold;"&gt;nxjflash&lt;/span&gt; borraba el actual pero no instalaba el nuevo dejando el ladrillo en lo que se llama 'modo de actualización de firmware' en el que no se muestra nada en pantalla y se emite un &lt;span style="font-style: italic;"&gt;'click' &lt;/span&gt;periódicamente. La salida de &lt;span style="font-style: italic; font-weight: bold;"&gt;nxjflash&lt;/span&gt; era la siguiente:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="salida-consola" style="width: 380px;"&gt;&gt;: sudo nxjflash&lt;br /&gt;Building firmware image.&lt;br /&gt;VM file: /home/jmoral/lejos_nxj/bin/lejos_nxt_rom.bin&lt;br /&gt;Menu file: /home/jmoral/lejos_nxj/bin/StartUpText.bin&lt;br /&gt;VM size: 52752 bytes.&lt;br /&gt;Menu size: 38016 bytes.&lt;br /&gt;Total image size 91008/94208 bytes.&lt;br /&gt;Locating device in firmware update mode.&lt;br /&gt;Found NXT: %%NXT-SAMBA%% 1&lt;br /&gt;an error occurred: Failed to open device in SAM-BA mode.&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Como todos los pasos anteriores se habían ejecutado con éxito no conseguíamos averiguar el por qué del error que al final parece ser de cómo el &lt;span style="font-weight: bold;"&gt;VMware Player&lt;/span&gt; reconoce el ladrillo conectado por USB, actualizando el VMware a su versión &lt;span style="font-weight: bold;"&gt;Workstation&lt;/span&gt; el problema queda solucionado.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3626807390516031709-3529014736908910711?l=klaaturjc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://klaaturjc.blogspot.com/feeds/3529014736908910711/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://klaaturjc.blogspot.com/2010/02/practica-0.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3626807390516031709/posts/default/3529014736908910711'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3626807390516031709/posts/default/3529014736908910711'/><link rel='alternate' type='text/html' href='http://klaaturjc.blogspot.com/2010/02/practica-0.html' title='Práctica 0- Introducción al entorno NXJ'/><author><name>P&amp;amp;J</name><uri>http://www.blogger.com/profile/17018684085962553279</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='20' src='http://1.bp.blogspot.com/_EOtCguTirEA/S2igpCRe7OI/AAAAAAAAAAM/PA2eQApLNKQ/S220/fotoblog.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_EOtCguTirEA/S27a7N6A5UI/AAAAAAAAADI/gCAU411JgWQ/s72-c/ladrillo.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3626807390516031709.post-8203154919672317348</id><published>2010-01-28T19:18:00.000+01:00</published><updated>2010-01-28T19:19:20.166+01:00</updated><title type='text'>Primer post!</title><content type='html'>Día 1&lt;br /&gt;Hemos contado las piezas. Nos falta el muñeco...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3626807390516031709-8203154919672317348?l=klaaturjc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://klaaturjc.blogspot.com/feeds/8203154919672317348/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://klaaturjc.blogspot.com/2010/01/primer-post.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3626807390516031709/posts/default/8203154919672317348'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3626807390516031709/posts/default/8203154919672317348'/><link rel='alternate' type='text/html' href='http://klaaturjc.blogspot.com/2010/01/primer-post.html' title='Primer post!'/><author><name>P&amp;amp;J</name><uri>http://www.blogger.com/profile/17018684085962553279</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='20' src='http://1.bp.blogspot.com/_EOtCguTirEA/S2igpCRe7OI/AAAAAAAAAAM/PA2eQApLNKQ/S220/fotoblog.JPG'/></author><thr:total>0</thr:total></entry></feed>
