<?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-9011645851883076273</id><updated>2011-11-05T23:17:40.843+01:00</updated><title type='text'>RoboByte</title><subtitle type='html'>Blog de robótica con Lego NXJ.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://robobyte.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9011645851883076273/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://robobyte.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Jose Antonio Fernandez</name><uri>http://www.blogger.com/profile/09711980692639603603</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_6S8Gy0qNIOc/S2RQcg_FZXI/AAAAAAAAAFI/Y1Eg4Kp5kQQ/S220/Foto+del+d%C3%ADa+30-01-2010+a+la(s)+16:20.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>14</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-9011645851883076273.post-737656768426780075</id><published>2010-04-22T22:00:00.127+02:00</published><updated>2010-05-03T03:46:39.189+02:00</updated><title type='text'>Práctica 5: Auto-localización basada en filtro de partículas</title><content type='html'>Volvemos a la carga ya con la última práctica sobre el robot Lego NXT, gracias a dios porque ya nos iba teniendo algo amargadillos ;-). En ella continuamos en la misma linea que la anterior, con filtros de partículas, pero esta vez enfocándonos más a un sistema final de auto-localización.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Visualización del mapa y de las partículas&lt;/span&gt;&lt;br /&gt;En este primer ejercicio se pretende que cargado un mapa desde fichero, dibujar este en el LCD del robot junto con las partículas del un filtro (método estadístico de localización de Montecarlo).&lt;br /&gt;Controlar el filtro de partículas no ha requerido ninguna dificultad, ya que en la práctica anterior casi implementamos un sistema de auto-localización, y el método de mostrar las partículas estaba ya implementado.&lt;br /&gt;No nos ha sido tan fácil hacer lo propio con el mapa, ya que la clase &lt;i&gt;LineMap&lt;/i&gt; solo dispone del método &lt;i&gt;inside&lt;/i&gt; al que se le pasa un punto y determina si este está dentro o no del Mapa.&lt;br /&gt;En una &lt;b&gt;primera implementación&lt;/b&gt;&amp;nbsp;traducíamos&amp;nbsp;los puntos del mapa real a los del LCD, determinado cuales estaban dentro y cuales fuera. Esto tenía varios problemas, el primero es que al ser el mapa tan grande, el cálculo tardaba del&amp;nbsp;orden&amp;nbsp;de minutos, y el segundo, es que se necesitaba un algoritmo que eliminara los puntos interiores del mapa,&amp;nbsp;dejando&amp;nbsp;solo los bordes (algoritmo de erosión).&lt;br /&gt;La &lt;b&gt;segunda implementación&lt;/b&gt; trataba de mejorar la primera, traduciendo inversamente los puntos del LCD al los del mapa, al igual que se hace en las rotaciones de imágenes, pero seguían habiendo problemas, como el de tiempo, que aun&amp;nbsp;habiéndose&amp;nbsp;reducido, tardaba del&amp;nbsp;orden&amp;nbsp;de 1 minuto , y nuevamente había que implementar un algoritmo de erosión.&lt;br /&gt;Surgió&amp;nbsp;entonces la idea de realizar un programa externo, que calculara el borde del mapa mediante la segunda implementación, pero esto no nos convencía.&lt;br /&gt;La &lt;b&gt;tercera&lt;/b&gt; y última &lt;b&gt;implementación&lt;/b&gt;, y debido a que anteriormente nos habíamos mirado el código de la clase &lt;i&gt;LineMap&lt;/i&gt; para determinar la distancia entre las partículas y el mapa, algo que se supone que está implementado pero que no nos funcionaba en la práctica anterior,&amp;nbsp;sabíamos&amp;nbsp;que esta clase guarda los segmentos del mapa, con los cuales se puede determinar fácilmente los bordes. Dicho y hecho, copiamos el código fuente de la clase y creamos una nueva con un método que devolviera los segmentos (no se puede heredar de la clase porque el atributo está con visibilidad privada), para que otra función determina su longitud y orientación en pantalla, y lo pinte píxel a píxel.&lt;br /&gt;Como una tontería como dibujar un mapa, nos puede complicarnos tanto la vida, :-)&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_UIIv50dshIk/S78NJ6n8myI/AAAAAAAAB9I/Ag6QlLDJulw/s1600/Practica5+-+Localization+4.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_UIIv50dshIk/S78NJ6n8myI/AAAAAAAAB9I/Ag6QlLDJulw/s320/Practica5+-+Localization+4.JPG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Diseño de un radar&lt;/span&gt;&lt;br /&gt;Este ejercicio consiste en realizar un radar con el sensor de ultrasonidos, devolviendo las mediciones de cada uno de los ángulos. Ya en la práctica 3 vimos que nos podría ser de utilidad para medir la distancia y ángulo al obstáculo, en la 4 para medir la distancia al mapa en el filtro de partículas, y en la 5 mejorar lo anterior para devolver las mediciones asociadas a sus ángulo en un tipo &lt;i&gt;RangeReadings&lt;/i&gt;.&lt;br /&gt;Además, se han implementado un par de funciones para mostrar las mediciones y el histograma de estas por pantalla:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_UIIv50dshIk/S8BAnR7qRvI/AAAAAAAAB9Q/C3TMQMHgPpc/s1600/Practica5+-+Radar+-+Con+botellas+-+Medidas.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="150" src="http://2.bp.blogspot.com/_UIIv50dshIk/S8BAnR7qRvI/AAAAAAAAB9Q/C3TMQMHgPpc/s200/Practica5+-+Radar+-+Con+botellas+-+Medidas.JPG" width="200" /&gt;&lt;/a&gt;&lt;a href="http://4.bp.blogspot.com/_UIIv50dshIk/S8BBo7k6cWI/AAAAAAAAB9g/6rkdYyhs22o/s1600/Practica5+-+Radar+3.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="150" src="http://4.bp.blogspot.com/_UIIv50dshIk/S8BBo7k6cWI/AAAAAAAAB9g/6rkdYyhs22o/s200/Practica5+-+Radar+3.JPG" width="200" /&gt;&lt;/a&gt;&lt;a href="http://4.bp.blogspot.com/_UIIv50dshIk/S8BA2fsYdvI/AAAAAAAAB9Y/h44Jw_vh3k4/s1600/Practica5+-+Radar+-+Sin+botellas+-+Medidas.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="150" src="http://4.bp.blogspot.com/_UIIv50dshIk/S8BA2fsYdvI/AAAAAAAAB9Y/h44Jw_vh3k4/s200/Practica5+-+Radar+-+Sin+botellas+-+Medidas.JPG" width="200" /&gt;&lt;/a&gt;&lt;a href="http://1.bp.blogspot.com/_UIIv50dshIk/S8BCCwMbZuI/AAAAAAAAB9o/XUSULlIGcPw/s1600/Practica5+-+Radar+-+Con+botellas+2.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="150" src="http://1.bp.blogspot.com/_UIIv50dshIk/S8BCCwMbZuI/AAAAAAAAB9o/XUSULlIGcPw/s200/Practica5+-+Radar+-+Con+botellas+2.JPG" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Reconocimiento de posición y orientación&lt;/span&gt;&lt;br /&gt;La realización de la práctica la hemos divido en 2 proyectos diferentes uno de ellos encargado de escanear con el Radar puntos bien conocidos del mapa y volcar esos datos en archivos que llamaremos measures(i).dat que serán nuestras muestras de aprendizaje. En nuestro caso particular y para realizar la autolocalización barriamos 360º con una resolución de 10º.&lt;br /&gt;&lt;br /&gt;Una vez tuvimos las muestras de aprendijaze y tras varios problemas de espacio en el ladrillo teniamos una referencia con la que comparar nuestra nueva medición.&lt;br /&gt;&lt;br /&gt;Como las mediciones del ultrasonido variaban con respecto a la orientación del mismo prodecimos a &lt;i&gt;normalizar &lt;/i&gt;esos valor como un array de frecuencias de la siguiente manera:&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;En primera instancia y como el ultrasonidos tiene cierta incertidumbre (para una misma medición puede devolver valores dentro de una elipse que discretizamos en prácticas anteriores) decidimos englobar los valores del array siendo cada posición del índice i*(5cm) y para hallar el índice en que que dada un medida incrementar uno utilizamos :&lt;br /&gt;&lt;div style="color: #2121c4; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;index = (&lt;span style="color: #971365;"&gt;int&lt;/span&gt;)((measure + (&lt;span style="color: #2121c4;"&gt;HIST_RESOLUTION&lt;/span&gt;/2)) / &lt;span style="color: #2121c4;"&gt;HIST_RESOLUTION&lt;/span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #2121c4; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #2121c4; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="color: black; font-family: Times;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;Tras normalizar tomamos una nueva medición, la normalizamos y la comparamos con las de aprendizaje obteniendo la que mayor compatibilidad, la que&amp;nbsp;con&amp;nbsp;más probabilidad cuadra con nuestra posición.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #2121c4; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="color: black; font-family: Times;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #2121c4; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="color: black; font-family: Times;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;Con esto obtenemos la posición y con ella la muestra en RageReading que más se corresponde así que con una función de desplazamiento que implementamos y &amp;nbsp;volcando previamente los datos de la muestra de aprendizaje y la de nuestra posición real obtenemos la orientación como elegimos la resolución de 10º tenemos al menos +- 10º de error en la medida.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #2121c4; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="color: black; font-family: Times;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #2121c4; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="color: black; font-family: Times; font-size: medium;"&gt;El único problema que encontramos fue que aparte de que el mapa se movía de forma constante, en ciertas mediciones la diferencia entre compatibilidades era relativamente pequeña.&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Auto-localización&lt;/span&gt;&lt;br /&gt;En este ejercicio se pretende combinar casi todo lo aprendido anteriormente sobre el robot NXT, desde los ejercicios anteriores de visualización de partículas, reconocimiento de la posición y orientación, y como no, filtro de partículas.&lt;br /&gt;Para la implementación del filtro de partículas se ha utilizado la clase TachoLocalizer, que no aporta más ayuda que en la gestión del movimiento de las partículas, e incluso el método de actualizar las partículas (updatePosition) tiene un pequeño bug en el paso de parámetros, teniendo el ángulo y la distancia intercambiados:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Original: mv = new Movement(MovementType.TRAVEL, angle, distance, isMoving);&lt;/blockquote&gt;&lt;blockquote&gt;Modificación: mv = new Movement(MovementType.TRAVEL, distance, angle, isMoving);&lt;/blockquote&gt;Además es necesario tener en cuenta llamar a la función de actualización cada vez que se realiza un movimiento, ya que no puede saber si primero realizar el 'avance' o la 'rotación'.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Para la obtención de el array de medidas de tipo RangeReadings hemos modificado nuestra famosa clase Radar para en vez de guardar estas en un array de forma interna, las pase a este tipo de estructura y la devuelva. Uno de los errores que teníamos en esto era que el sensor volviera a la posición inicial en la que partía, ya que lo&amp;nbsp;hacíamos&amp;nbsp;rotando el mismo número de grados en sentido contrario en vez de tener en cuenta la odometría del motor. Tan solo nos bastó la instrucción motor.rotateTo(0).&lt;br /&gt;&lt;br /&gt;Otro de los problemas que hemos tenido ha sido la actualización de los pesos de las partículas, que el diseño propuesto por LeJOS (MCLParticle - calculateWeight) no era el más correcto cuando el número de mediciones sobrepasaba las 3, y nosotros nada menos que 360º/10=36.&lt;br /&gt;&lt;blockquote&gt;Original: weight *= (float) Math.exp(-(diff * diff) / divisor);&lt;/blockquote&gt;&lt;blockquote&gt;Modificación:&amp;nbsp;weight *= (float) Math.exp(-(diff * diff) / (divisor*divisor));&lt;/blockquote&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Vídeo resumen&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Y sin más un video resumen de lo acontecido las últimas semanas&lt;/div&gt;&lt;object height="385" width="640"&gt;&lt;param name="movie" value="http://www.youtube.com/v/sCN3knpwYSc&amp;hl=es_ES&amp;fs=1&amp;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/sCN3knpwYSc&amp;hl=es_ES&amp;fs=1&amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Nos vemos próximamente ya en la última práctica sobre "visión" en Gazabo &amp;amp; JDE.&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Saludos!!!&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9011645851883076273-737656768426780075?l=robobyte.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robobyte.blogspot.com/feeds/737656768426780075/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://robobyte.blogspot.com/2010/04/practica-5-auto-localizacion-basada-en.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9011645851883076273/posts/default/737656768426780075'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9011645851883076273/posts/default/737656768426780075'/><link rel='alternate' type='text/html' href='http://robobyte.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>Daniel García Capel</name><uri>http://www.blogger.com/profile/10635528395549343800</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://2.bp.blogspot.com/-zDjIvUH7sug/TrW1zUz1_AI/AAAAAAAACS0/i0xe2KyZjBE/s220/dgcapel_twitter.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_UIIv50dshIk/S78NJ6n8myI/AAAAAAAAB9I/Ag6QlLDJulw/s72-c/Practica5+-+Localization+4.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9011645851883076273.post-2240615261976809340</id><published>2010-03-25T22:00:00.241+01:00</published><updated>2010-03-26T00:03:40.663+01:00</updated><title type='text'>Práctica 4: Filtro de partículas y cálculo de trayectorias</title><content type='html'>Buenas a todos como todas las semanas para enseñaros todos los avanzes que realizamos con nuestro NXT.&lt;br /&gt;En este caso utilizaremos un filtro de partículas para localizarnos en un mapa y aprenderemos a ir de un punto A a un punto B con una orientación específica ya sea en línea recta o en curva.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Filtro de Partículas&lt;/span&gt;&lt;br /&gt;En este apartado se nos pide implementar una 'simulación' de un filtro de partículas, en el que inicialmente estas se sitúan en una posición preestablecida del mapa y se mueven al mismo tiempo que lo hace el robot, consiguiendo esto mediante la odometría de los motores.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Cálculo de la Incertidumbre&lt;/span&gt;&lt;br /&gt;Para determinar el movimiento de las partículas es necesario calcular la incertidumbre al avanzar y al rotar el robot, para lo cual hemos implementado un sencillo programa que os dejamos &lt;a href="http://albatalia.com/robobyte/p4/MoveError_v100.tar.gz"&gt;aquí&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Tras realizar 10 muestras de cada tipo, hemos obtenido los siguientes  valores: &lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_UIIv50dshIk/S6orX7QbY3I/AAAAAAAAB8w/IxRQBnl5838/s1600/Practica4+-+ErrorAvanzar.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_UIIv50dshIk/S6orX7QbY3I/AAAAAAAAB8w/IxRQBnl5838/s320/Practica4+-+ErrorAvanzar.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_UIIv50dshIk/S6oqWI3MsWI/AAAAAAAAB8o/qr5PdRXP7Vc/s1600/Practica4+-+ErrorGiro.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_UIIv50dshIk/S6oqWI3MsWI/AAAAAAAAB8o/qr5PdRXP7Vc/s320/Practica4+-+ErrorGiro.png" /&gt;&lt;/a&gt;&lt;/div&gt;Vemos que la indertidumbre en la rotación es enorme, nada menos que de -26 grados, y esto se debe a que el robot empleado (spirit) no tiene tracción a las cuatro ruedas, arrastrando las dos de delante. Hemos corregido este error adecuando la distancia entre ruedas pasada a la clase &lt;i&gt;TachoPilot&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Implementación&lt;/span&gt;&lt;br /&gt;Nos ha parecido tan interesante el tema del filtro de partículas que no nos hemos limitado simplemente a la simulación, hemos realizado el algoritmo completo, que ajusta el peso de las partículas en función de la medición real del sensor de ultrasonidos.&lt;br /&gt;&lt;br /&gt;Hemos diferenciado varias clases:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;CInit: inicializa el algoritmo de 'Condensation'.&lt;/li&gt;&lt;li&gt;C: Clase principal del algoritmo.&lt;/li&gt;&lt;li&gt;CUpdate: Clase que llama a actualiza el peso de las partículas y la pantalla. &lt;/li&gt;&lt;ul&gt;&lt;li&gt;CUpdateScreen: Dibuja las partículas por pantalla.&lt;/li&gt;&lt;li&gt;CUpdateWeight: Recalcula el peso de las partículas.&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;CUScan: Calcula la distancia entre el robot y la pared del mapa, haciendo un pequeño barrido de 20 grados. Esta librería ya fue implementada en la práctica 3 y esta vez si hemos conseguido sacarle provecho.&lt;/li&gt;&lt;/ul&gt;A continuación se detalla el esquema del programa: &lt;br /&gt;&lt;ul&gt;&lt;/ul&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_UIIv50dshIk/S6pvkCsk6NI/AAAAAAAAB84/FZf6HXcdbXU/s1600/Practica4-EsquemaFiltroParticulas.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_UIIv50dshIk/S6pvkCsk6NI/AAAAAAAAB84/FZf6HXcdbXU/s320/Practica4-EsquemaFiltroParticulas.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span style="font-size: large;"&gt;Problemas &amp;amp; Soluciones&lt;/span&gt; &lt;br /&gt;La principal dificultad en el diseño del algoritmo, ha sido el remuestrear el filtro de partículas, ya que en un primer diseño había dos hilos de ejecución, uno actualizando la pantalla y otro reculculando el peso de las partículas. Esto era incompatible porque al remuestrear, las partículas que se salen del mapa, se crea nuevas instancias de ellas y entonces el hilo de actualizar la pantalla puede coger partículas inexistentes.&lt;br /&gt;Una primera solución fue la de que al avanzar 40 cm y girar 90 grados, y a continuación remuestreara el filtro y actualizara la pantalla, pero esto llevaba consigo una pausa de entre 2 y 4 segundos, algo que no nos convenció.&lt;br /&gt;La segunda opción fue aprovechar el tiempo que dura el siguiente movimiento de avanzar y rotar para realizar los cálculos. El problema ahora es que podía solaparse 2 hilos de actualización, provocando nuevamente una excepción en el programa. La solución definitiva fue que el hilo de actualización comprobara que el hilo anterior hubiera termina, y en caso de que no fuera así esperarlo.&lt;br /&gt;&lt;br /&gt;Otro problema fue el cálculo de la distancia de la partícula, con el fin de poder compararla con la distancia 'real' obtenida por el sensor de ultrasonidos, y así determinar el peso de cada partícula. Cabía pensar que esto iba a resolver fácilmente con el método &lt;i&gt;range&lt;/i&gt; de la clase &lt;i&gt;LineMap&lt;/i&gt;, pero este casi siempre devolvía un valor de -1. La solución fue imprementar un algoritmo que calculaba la intersección de la recta del vector de la partícula con las rectas de los lados del mapa, quedándose con la menor distancia.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Pruebas&lt;/span&gt;&lt;br /&gt;Hemos construido de la manera más artesanal posible nuestro mapa de 10x10 cm, donde hemos realizando las pruebas de localización ;-)&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_UIIv50dshIk/S6qGX9ftXkI/AAAAAAAAB9A/gHZEjKGCrnk/s1600/Practica+4+-+Condensation+Map+1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_UIIv50dshIk/S6qGX9ftXkI/AAAAAAAAB9A/gHZEjKGCrnk/s320/Practica+4+-+Condensation+Map+1.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Cálculo de Trayectorias&lt;/span&gt;&lt;br /&gt;En esta práctica hemos encontrado muchos problemas al menos en su segundo apartado en el cual hay que caminar girando, para ello no hemos ayudado de la interfaz de la practica 1&amp;nbsp;&lt;a href="http://robobyte.blogspot.com/2010/02/practica-1-calibracion-y-trayectoria.html"&gt;"menu p1"&lt;/a&gt;&amp;nbsp;añadiendo en configuración un nuevo menú ruta en la que especificar el X el Y y su orientación.&lt;br /&gt;&lt;br /&gt;En su primera versión el robot se orienta hacia el objetivo obteniendo el angulo al objetivo y rotando para ello o bien lo calculamos a mano o bien mediante la librería Pose, acto seguido andamos la distancia que nos separa del objetivo que es simplemente la distancia euclidea y por último calculamos la rotación necesaria para posicionarnos como ordena nuestro parámetro de orientación (teniendo en cuenta el acumulado al posicionarse.&lt;br /&gt;&lt;br /&gt;En su segunda versión nuestra orientación determina el eje de coordenadas y así las coordenadas del objetivo.&lt;br /&gt;¿Como vamos de A a B rotando? pues difícil sin duda tras mucho pensar y probar con métodos como steer y arc que se basan en un ratio y observar que no podíamos trazar todos los arcos optamos por utilizar travelarc(radio, distancia) pero claro necesitamos radio de giro, dependiente de la distancia e inversamente proporcional al ángulo( a más ángulo menor radio) y distancia que se obtiene mediante el perímetro de la circunferencia y dividendo por el ángulo a girar tras eso actualizamos la orientación y nos reorientamos a la orientación pedida mediante un rotate.&lt;br /&gt;&lt;br /&gt;Podeis ver en el vídeo resumen el resultado.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Vídeo Resumen&lt;/span&gt;&lt;br /&gt;A continuación os dejamos un vídeo resumen de estas dos semanas de desarrollo:&lt;br /&gt;&lt;br /&gt;&lt;object height="385" width="640"&gt;&lt;param name="movie" value="http://www.youtube.com/v/fLrcqBPR5SE&amp;hl=es_ES&amp;fs=1&amp;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/fLrcqBPR5SE&amp;hl=es_ES&amp;fs=1&amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Esperamos que nos volváis a visitar.&lt;br /&gt;Hasta la próxima!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9011645851883076273-2240615261976809340?l=robobyte.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robobyte.blogspot.com/feeds/2240615261976809340/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://robobyte.blogspot.com/2010/03/practica-4-filtro-de-particulas-y.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9011645851883076273/posts/default/2240615261976809340'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9011645851883076273/posts/default/2240615261976809340'/><link rel='alternate' type='text/html' href='http://robobyte.blogspot.com/2010/03/practica-4-filtro-de-particulas-y.html' title='Práctica 4: Filtro de partículas y cálculo de trayectorias'/><author><name>Daniel García Capel</name><uri>http://www.blogger.com/profile/10635528395549343800</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://2.bp.blogspot.com/-zDjIvUH7sug/TrW1zUz1_AI/AAAAAAAACS0/i0xe2KyZjBE/s220/dgcapel_twitter.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_UIIv50dshIk/S6orX7QbY3I/AAAAAAAAB8w/IxRQBnl5838/s72-c/Practica4+-+ErrorAvanzar.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9011645851883076273.post-768948654393777471</id><published>2010-03-11T21:54:00.003+01:00</published><updated>2010-03-25T12:31:07.798+01:00</updated><title type='text'>Práctica 3: Navegación local evitando obstáculos</title><content type='html'>Esta práctica ha consistido en el manejo de comportamiento y navegación mediante Vectores de Fuerza Virtuales (VFF - Virtual Force Field) en nuestro Lego NXT.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Sensor de Contacto&lt;/span&gt;&lt;br /&gt;Su implementación a sido muy sencilla. Tiene un primer comportamiento que trata de detectar que el sensor de contacto se pulse (takeControl), y en caso de hacerlo (action) evitar el obstáculo retrocediendo unos cm para girar aleatoriamente 90º en uno de los sentidos y volver a enderezar el robot con otro giro de 90º grados.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Sensor de Luz&lt;/span&gt;&lt;br /&gt;En este hemos innovado algo más de lo que realmente bastaba para resolverlo. En primer lugar hemos utilizado 3 sensores (2 del RCX y 1 del NXT) de luz en vez de 2, lo que nos ha permitido una mayor&amp;nbsp;precisión&amp;nbsp;para poner los sensores a 0 grados respecto al robot. Por otro lado hemos implementado un Thread de calibración de la luz, determinando la luz mínima, durante toda la ejecución, y la máxima en función de la luz ambiente actualizada cada cierto periodo de tiempo. De esta manera conseguimos que frente a condiciones lumínicas de menos luz el estímulo para el movimiento sea menor, y en las de más luz sea mayor.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Sensor de&amp;nbsp;Ultrasonidos &amp;amp;&amp;nbsp;Luz + Ultrasonido&lt;/span&gt;&lt;br /&gt;Esta ha sido la parte que más nos ha complicado, principalmente por el control el velocidad de los motores junto con el cálculo de los vectores de fuerza. Resumimos las distintas partes desarrolladas:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Hilo para calcular la posición (ángulo, distancia, ...) del objeto, para lo que va moviendo la cabeza del últrasonido entre un rango de -20 y +20 grados. Puede parecer sencilla implementarla, pero la última versión llega a tener 480 lineas de código, con comentarios y Javadoc, claro&amp;nbsp;;-)&lt;/li&gt;&lt;li&gt;Librería para el control en velocidad de los motores, vamos, una implementación del TachoPilot.&lt;br /&gt;Podéis&amp;nbsp;ver los principales cálculos para determinar el ángulo de giro entre ruedas:&amp;nbsp;&lt;a href="http://albatalia.com/robobyte/p3/speedtachomotor.pdf"&gt;SpeedTachoPilot&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Comportamiento de detección de Movimiento, cuya condición de entrada es que el Hilo haya detectado un objeto (takeControl). Una vez detectado, se obtiene su posición para así determinar su vector de fuerza (de repulsión), y sumarla a la del objetivo, seguir hacia delante o hacia la luz, según sea el caso. No finaliza el comportamiento hasta no sobrepasar el objeto.&lt;/li&gt;&lt;/ul&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Vídeo Resumen&lt;/span&gt;&lt;br /&gt;Os dejamos un&amp;nbsp;vídeo&amp;nbsp;resumen de nuestro progreso durante las dos semanas de desarrollo:&lt;br /&gt;&lt;br /&gt;&lt;object height="385" width="640"&gt;&lt;param name="movie" value="http://www.youtube.com/v/3GHSGAf4NPQ&amp;hl=es_ES&amp;fs=1&amp;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/3GHSGAf4NPQ&amp;hl=es_ES&amp;fs=1&amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Nos vemos la&amp;nbsp;siguiente&amp;nbsp;semana con más novedades sobre Filtros de Partículas, ;-)&lt;br /&gt;Saludos!!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9011645851883076273-768948654393777471?l=robobyte.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robobyte.blogspot.com/feeds/768948654393777471/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://robobyte.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/9011645851883076273/posts/default/768948654393777471'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9011645851883076273/posts/default/768948654393777471'/><link rel='alternate' type='text/html' href='http://robobyte.blogspot.com/2010/03/practica-3-navegacion-local-evitando.html' title='Práctica 3: Navegación local evitando obstáculos'/><author><name>Jose Antonio Fernandez</name><uri>http://www.blogger.com/profile/09711980692639603603</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_6S8Gy0qNIOc/S2RQcg_FZXI/AAAAAAAAAFI/Y1Eg4Kp5kQQ/S220/Foto+del+d%C3%ADa+30-01-2010+a+la(s)+16:20.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9011645851883076273.post-5842181736077559794</id><published>2010-03-04T19:43:00.000+01:00</published><updated>2010-03-04T19:43:49.049+01:00</updated><title type='text'>RoboByteDemo: Añadida práctica 2</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;a href="http://www.stefanoforenza.com/blog/wp-content/uploads/2009/06/software-update-available.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" src="http://www.stefanoforenza.com/blog/wp-content/uploads/2009/06/software-update-available.png" style="height: 200px; width: 200px;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;Acabamos de subir los siguientes ficheros pertenecientes a la práctica 2 a RoboByteDemo, con el fin de que los&amp;nbsp;podáis&amp;nbsp;probar:&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;BumpGO:&amp;nbsp;motores en los puertos A y B y sensor de contacto en el 3.&lt;/li&gt;&lt;li&gt;ClapControl: motores en cualquier puerto y micrófono en el 4.&lt;/li&gt;&lt;li&gt;Information: &amp;nbsp;sensor de ultrasonidos en el puerto 1 y el de luz en el 4.&lt;/li&gt;&lt;li&gt;Laberinto:&amp;nbsp;motores en los puertos A y B y sensor de ultrasonidos en el 1.&lt;/li&gt;&lt;li&gt;USonicBG: motores en los puertos A y B y sensor de ultrasonidos en el 1.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Si no&amp;nbsp;sabéis&amp;nbsp;de que va todo esto de RoboByteDemo, os invito a que os&amp;nbsp;paséis&amp;nbsp;por un &lt;a href="http://robobyte.blogspot.com/2010/02/robobytedemo-prueba-nuestras-practicas.html"&gt;post anterior&lt;/a&gt; donde lo explica que como utilizarlo.&lt;/div&gt;&lt;div&gt;Saludos!!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9011645851883076273-5842181736077559794?l=robobyte.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robobyte.blogspot.com/feeds/5842181736077559794/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://robobyte.blogspot.com/2010/03/robobytedemo-anadida-practica-2.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9011645851883076273/posts/default/5842181736077559794'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9011645851883076273/posts/default/5842181736077559794'/><link rel='alternate' type='text/html' href='http://robobyte.blogspot.com/2010/03/robobytedemo-anadida-practica-2.html' title='RoboByteDemo: Añadida práctica 2'/><author><name>Daniel García Capel</name><uri>http://www.blogger.com/profile/10635528395549343800</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://2.bp.blogspot.com/-zDjIvUH7sug/TrW1zUz1_AI/AAAAAAAACS0/i0xe2KyZjBE/s220/dgcapel_twitter.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9011645851883076273.post-340333308564603354</id><published>2010-02-25T23:41:00.003+01:00</published><updated>2010-02-25T23:53:23.611+01:00</updated><title type='text'>Práctica 2: Aplicaciones básicas con sensores</title><content type='html'>Durante éstos últimos días hemos estado centrados en cómo obtener información de nuestro entorno gracias a los sensores de nuestro NXT, para lo cual realizamos unas sencillas aplicaciones para familiarizarnos con ellos.&lt;br /&gt;Algunas de ellas como obtener información básica de los sensores como el infrarrojo, ultrasonidos o nivel de batería no se comentarán en éste blog debido a su simplicidad y a la gran documentación que se puede encontrar al respecto en la red.&lt;br /&gt;&lt;br /&gt;Algunos sin embargo, pese a su simplicidad, si los trataremos por sus vistosos resultados como un Bump&amp;amp;GO tanto por contacto como ultrasonidos, un "sigueparedes" o un robot controlado por sonido.&lt;br /&gt;&lt;br /&gt;Para el &lt;b&gt;Bump&amp;amp;GO&lt;/b&gt; decidimos realizar el giro en un valor aleatorio entre 90 y 180º puesto que menos de 90 produciría de nuevo un choque con el mismo objeto y más de 180 sería una andar de más porque en sentido contrario llegarías antes.&lt;br /&gt;Este mismo algoritmo se utiliza también en su versión ultrasónica sin más cambio que el evento que produce el retroceso.&lt;br /&gt;&lt;br /&gt;Para el &lt;b&gt;ClapControl&lt;/b&gt; y debido al los numerosos escenarios donde podría utilizarse hemos desarrollado un filtro adaptativo, que como su propio nombre indica adapta la sensibilidad del sensor al ruido ambiente gracias unas tomas de muestra.&lt;br /&gt;&lt;br /&gt;El robot sigue paredes en su forma original mantenía la pared y cuando una de sus medidas rebasaba el límite paraba y giraba. Ahora sigue andando y una nueva hebra de ejecución se encarga de los giros apropiados sin necesidad de parar el robot.&lt;br /&gt;&lt;br /&gt;La parte de mediciones del ultrasonido supuso todo un reto, ya que además de que en función de la distancia fuese más o menos preciso dependiendo de la distancia nuestro sensor medía algo o 255.&lt;br /&gt;Para evitar todo tipo de "ruido" repetimos las pruebas, con ese y con otro sensor diferente obteniendo para nuestra sorpresa valores completamente distintos.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_6S8Gy0qNIOc/S4b9QZm6V_I/AAAAAAAAAHg/HxHEs9kBXPA/s1600-h/Distancia+Minima+y+Maxima.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_6S8Gy0qNIOc/S4b9QZm6V_I/AAAAAAAAAHg/HxHEs9kBXPA/s320/Distancia+Minima+y+Maxima.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Tras eso procedimos a realizar una tanda de 10 medidas a distintas distancias para obtener su incertidumbre.&lt;br /&gt;&lt;div style="text-align: left;"&gt;Al hacerlo nos dimos cuenta que dependiendo a la distancia a la que midiésemos obteníamos un error sistemático que se aprecia perfectamente en la siguiente gráfica.&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_UIIv50dshIk/S4bRl_iPTwI/AAAAAAAAB8Q/A1BQBpXVwSc/s1600-h/Incertidumbre+X+-+Error.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_UIIv50dshIk/S4bRl_iPTwI/AAAAAAAAB8Q/A1BQBpXVwSc/s320/Incertidumbre+X+-+Error.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Aquí podemos comprobar la incertidumbre en Y&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_UIIv50dshIk/S4bVLrOnc9I/AAAAAAAAB8Y/CDaesQXa-Ys/s1600-h/Incertidumbre+Y+-+Error.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_UIIv50dshIk/S4bVLrOnc9I/AAAAAAAAB8Y/CDaesQXa-Ys/s320/Incertidumbre+Y+-+Error.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Y nuestra ventana de "visión" de ultrasonidos en función del ángulo:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_6S8Gy0qNIOc/S4bcUmDPsHI/AAAAAAAAAHY/4GVGJmjqMm8/s1600-h/Maximo+Angulo.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_6S8Gy0qNIOc/S4bcUmDPsHI/AAAAAAAAAHY/4GVGJmjqMm8/s320/Maximo+Angulo.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;En las matrices de covarianza vemos que conforme la distancia del ultrasonido aumenta, la incertidumbre es mayor, tanto en el eje X como en el Y:&lt;br /&gt;Distancia de 40 cm&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0.1000&amp;nbsp;&amp;nbsp;&amp;nbsp; 0.0844&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0.0844&amp;nbsp;&amp;nbsp;&amp;nbsp; 1.5071&lt;br /&gt;&lt;br /&gt;Distancia de 120 cm&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0.2333&amp;nbsp;&amp;nbsp; -0.3678&lt;br /&gt;&amp;nbsp;&amp;nbsp; -0.3678&amp;nbsp;&amp;nbsp;&amp;nbsp; 2.5623&lt;br /&gt;&lt;br /&gt;Un vídeo resumen del trabajo de esta semana.&lt;br /&gt;&lt;br /&gt;&lt;object width="560" height="340"&gt;&lt;param name="movie" value="http://www.youtube.com/v/Pbw4D-ZZg-g&amp;hl=es_ES&amp;fs=1&amp;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/Pbw4D-ZZg-g&amp;hl=es_ES&amp;fs=1&amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="560" height="340"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9011645851883076273-340333308564603354?l=robobyte.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robobyte.blogspot.com/feeds/340333308564603354/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://robobyte.blogspot.com/2010/02/practica-2-aplicaciones-basicas-con.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9011645851883076273/posts/default/340333308564603354'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9011645851883076273/posts/default/340333308564603354'/><link rel='alternate' type='text/html' href='http://robobyte.blogspot.com/2010/02/practica-2-aplicaciones-basicas-con.html' title='Práctica 2: Aplicaciones básicas con sensores'/><author><name>Jose Antonio Fernandez</name><uri>http://www.blogger.com/profile/09711980692639603603</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_6S8Gy0qNIOc/S2RQcg_FZXI/AAAAAAAAAFI/Y1Eg4Kp5kQQ/S220/Foto+del+d%C3%ADa+30-01-2010+a+la(s)+16:20.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_6S8Gy0qNIOc/S4b9QZm6V_I/AAAAAAAAAHg/HxHEs9kBXPA/s72-c/Distancia+Minima+y+Maxima.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9011645851883076273.post-473995220388940263</id><published>2010-02-22T15:43:00.001+01:00</published><updated>2010-02-22T22:59:54.135+01:00</updated><title type='text'>Bienvenidos al principio del fin</title><content type='html'>Bueno señores se acuerdan de tomatito?&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_6S8Gy0qNIOc/S4KMU_LHcJI/AAAAAAAAAGY/cww2heOJiA4/s1600-h/tomatito.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img src="http://3.bp.blogspot.com/_6S8Gy0qNIOc/S4KMU_LHcJI/AAAAAAAAAGY/cww2heOJiA4/s320/tomatito.jpg" border="0" /&gt;&lt;/a&gt;&lt;/div&gt;Pues bien tras mucho trabajo y esfuerzo nuestro tomatito ha evolucionado, tras una gran lucha interna entre el bien y el mal dentro de tomatito su alma impura se separó de su cuerpo dando lugar a un ente maligno sin cuerpo llamado Brutus cuyo único deseo es destruir a todos y cada uno de los robots que se encuentre por su camino.&lt;br /&gt;&lt;br /&gt;Tal maldad lejos de ser destruida ha sido canalizada y nuestros esfuerzos han dado su fruto al conseguirle a Brutus un nuevo cuerpo, y así tenerlo controlado y a mano por si nos pudiese ser de ayuda en un futuro contra ciertos robots enemigos.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_6S8Gy0qNIOc/S4KNoYYbUdI/AAAAAAAAAGg/Tn-ZCJJ7lGQ/s1600-h/Foto+del+d%C3%ADa+20-02-2010+a+la%28s%29+01:50.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img src="http://1.bp.blogspot.com/_6S8Gy0qNIOc/S4KNoYYbUdI/AAAAAAAAAGg/Tn-ZCJJ7lGQ/s320/Foto+del+d%C3%ADa+20-02-2010+a+la%28s%29+01:50.jpg" border="0" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_6S8Gy0qNIOc/S4KTnyDDyiI/AAAAAAAAAGo/5nqBNYZJDK4/s1600-h/Foto+del+d%C3%ADa+20-02-2010+a+la%28s%29+02:01.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img src="http://3.bp.blogspot.com/_6S8Gy0qNIOc/S4KTnyDDyiI/AAAAAAAAAGo/5nqBNYZJDK4/s320/Foto+del+d%C3%ADa+20-02-2010+a+la%28s%29+02:01.jpg" border="0" /&gt;&lt;/a&gt;Aquí podéis ver parte del proceso de creación del cuerpo de Brutus y antes de que se fundiese con el, debido a su inmenso poder y maldad tuvimos que incorporar al diseño original además del paragolpes que veis instalado, ya una jaula de protección antivuelco para prevenir males mayores.&lt;br /&gt;&lt;br /&gt;Aquí podéis ver a Brutus con su primera jaula instalada. Aunque simple y arcaica su primera jaula de protección hizo su cometido durante el proceso de fusión con su alma maldita.&lt;br /&gt;Proceso en el cual aun teniendo cuidado sufrimos graves daños personales y materiales.&lt;br /&gt;&lt;br /&gt;Por el momento Brutus permanece encerrado en una celda de adamantium esperando su propio destino...&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Bienvenidos al fin de los días de la mano de Brutus&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9011645851883076273-473995220388940263?l=robobyte.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robobyte.blogspot.com/feeds/473995220388940263/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://robobyte.blogspot.com/2010/02/bienvenidos-al-principio-del-fin.html#comment-form' title='4 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9011645851883076273/posts/default/473995220388940263'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9011645851883076273/posts/default/473995220388940263'/><link rel='alternate' type='text/html' href='http://robobyte.blogspot.com/2010/02/bienvenidos-al-principio-del-fin.html' title='Bienvenidos al principio del fin'/><author><name>Jose Antonio Fernandez</name><uri>http://www.blogger.com/profile/09711980692639603603</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_6S8Gy0qNIOc/S2RQcg_FZXI/AAAAAAAAAFI/Y1Eg4Kp5kQQ/S220/Foto+del+d%C3%ADa+30-01-2010+a+la(s)+16:20.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_6S8Gy0qNIOc/S4KMU_LHcJI/AAAAAAAAAGY/cww2heOJiA4/s72-c/tomatito.jpg' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9011645851883076273.post-4291626916612576206</id><published>2010-02-21T16:28:00.014+01:00</published><updated>2010-02-26T12:06:28.376+01:00</updated><title type='text'>RoboByteDemo: Prueba nuestras prácticas en tu robot</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;a href="http://www.stefanoforenza.com/blog/wp-content/uploads/2009/06/software-update-available.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" src="http://www.stefanoforenza.com/blog/wp-content/uploads/2009/06/software-update-available.png" style="height: 200px; width: 200px;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;Hemos estado pensando en que podáis probar los desarrollos de nuestras prácticas de Robótica, pero sin llegar a ofrecer el código fuente (todavía no, xD), y una opción era ir publicando los binarios junto a cada uno de los post en esta web, pero eso lleva el inconveniente de mantenerlo actualizado.&lt;br /&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;div&gt;Por esto motivo hemos creado RoboByteDemo, un Script al más puro estilo de repositorio de Linux para bajar de forma automática todos los binarios que vayamos colgando.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Os animo a que lo probéis!! Saludos!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Instrucciones de uso: &lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;Se le dan permisos de Ejecución&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;chmod uo+x robobytedemo.sh&lt;/blockquote&gt;&lt;/li&gt;&lt;li&gt;Se ejecuta&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;./robobytedemo.sh&lt;/blockquote&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;Descarga: &lt;a href="http://albatalia.com/robobyte/robobytedemo.sh"&gt;RoboByteDemo v1.00&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9011645851883076273-4291626916612576206?l=robobyte.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robobyte.blogspot.com/feeds/4291626916612576206/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://robobyte.blogspot.com/2010/02/robobytedemo-prueba-nuestras-practicas.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9011645851883076273/posts/default/4291626916612576206'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9011645851883076273/posts/default/4291626916612576206'/><link rel='alternate' type='text/html' href='http://robobyte.blogspot.com/2010/02/robobytedemo-prueba-nuestras-practicas.html' title='RoboByteDemo: Prueba nuestras prácticas en tu robot'/><author><name>Daniel García Capel</name><uri>http://www.blogger.com/profile/10635528395549343800</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://2.bp.blogspot.com/-zDjIvUH7sug/TrW1zUz1_AI/AAAAAAAACS0/i0xe2KyZjBE/s220/dgcapel_twitter.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9011645851883076273.post-6164973249937780980</id><published>2010-02-20T14:12:00.000+01:00</published><updated>2010-02-20T14:12:29.409+01:00</updated><title type='text'>Avances en robotica</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_6S8Gy0qNIOc/S3_ekH77bkI/AAAAAAAAAGQ/xSrqVmfrg_I/s1600-h/1266239067816.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_6S8Gy0qNIOc/S3_ekH77bkI/AAAAAAAAAGQ/xSrqVmfrg_I/s320/1266239067816.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;Esto que veis aquí que podría parecerse al mismísimo Bin Laden es el primer robot humanoide capaz de mantener &amp;nbsp;una conversación fluida con una persona el árabe.&lt;br /&gt;&lt;br /&gt;El artilugio capaz de hablar y entender árabe se encuentra deambulando por el aeropuerto de Dubai ayudando a los viajeros. Que pensarías vosotros si se os acercase este individuo mecanizado a echaros una mano?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Via:&lt;br /&gt;&lt;a href="http://www.rtve.es/noticias/fotos/tecnologia/15022010/buzz-vancouver-microsoft-haiti/"&gt;www.rtve.es&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9011645851883076273-6164973249937780980?l=robobyte.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robobyte.blogspot.com/feeds/6164973249937780980/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://robobyte.blogspot.com/2010/02/avances-en-robotica.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9011645851883076273/posts/default/6164973249937780980'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9011645851883076273/posts/default/6164973249937780980'/><link rel='alternate' type='text/html' href='http://robobyte.blogspot.com/2010/02/avances-en-robotica.html' title='Avances en robotica'/><author><name>Jose Antonio Fernandez</name><uri>http://www.blogger.com/profile/09711980692639603603</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_6S8Gy0qNIOc/S2RQcg_FZXI/AAAAAAAAAFI/Y1Eg4Kp5kQQ/S220/Foto+del+d%C3%ADa+30-01-2010+a+la(s)+16:20.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_6S8Gy0qNIOc/S3_ekH77bkI/AAAAAAAAAGQ/xSrqVmfrg_I/s72-c/1266239067816.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9011645851883076273.post-4256710068008268096</id><published>2010-02-18T11:00:00.000+01:00</published><updated>2010-02-18T11:40:54.511+01:00</updated><title type='text'>Práctica 1: Calibración y Trayectoria</title><content type='html'>El apartado más costoso de la primera práctica ha consistido en configurar el cuadrado de calibración y determinar el error cometido en las distintas pruebas realizadas. En el resto de apartados, como el control del motor, su odometría, y el manejo del LCD no nos paramos a comentarlos, ya que su manejo ha sido trivial.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Diseño del programa&lt;/span&gt;&lt;br /&gt;Además de que el programa proporcione la funcionalidad lógica del Robot, hemos desarrollado una interfaz de usuario, que entre sus características tiene:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Ejecución de la Inteligencia Artificial del robot mediante Hilos.&lt;/li&gt;&lt;li&gt;Configuración: puertos de los motores, distancia entre ejes y diámetro.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;MultiIdioma (Castellano/Inglés)&lt;/li&gt;&lt;li&gt;Soporte Multitactil (esto sí es broma, xD)&lt;/li&gt;&lt;/ul&gt;El esquema de transiciones del menú sería el siguiente:&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_UIIv50dshIk/S3xPFTVO0SI/AAAAAAAAB8E/pFpVdqORH98/s1600-h/Esquema+Practica+1+Robotica.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" id="BLOGGER_PHOTO_ID_5439309402463981858" src="http://2.bp.blogspot.com/_UIIv50dshIk/S3xPFTVO0SI/AAAAAAAAB8E/pFpVdqORH98/s320/Esquema+Practica+1+Robotica.png" style="cursor: pointer; height: 320px; width: 246px;" border="0" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Cuadrado de Calibración&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="560" height="340"&gt;&lt;param name="movie" value="http://www.youtube.com/v/N4bNPu3aEeQ&amp;amp;hl=es_ES&amp;amp;fs=1&amp;amp;"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/N4bNPu3aEeQ&amp;amp;hl=es_ES&amp;amp;fs=1&amp;amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="560" height="340"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;Como se puede comprobar el robot se comporta de diferente forma en función de la superficie en la que ruede, por lo que de alguna manera nos apoyábamos en el ancho entre ejes para calibrarlo de forma más exacta en cada superficie en tiempo de ejecución.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Errores de Ruta&lt;/span&gt;&lt;br /&gt;Para hacer los cálculos de los errores cometido hemos utilizado nuestro cuadrado de calibración, previamente determinados los ejes, una regla, paciencia y MatLab para facilitarnos los cálculos de la matriz de covarianza. Estos han sido nuestros resultados:&lt;br /&gt;&lt;br /&gt;Prueba 1: sobre papel rugoso,  distancia entre ejes de 11,5 cm&lt;br /&gt;&lt;blockquote&gt;0.4767    0.2750&lt;br /&gt;0.2750    4.7579&lt;/blockquote&gt;Prueba 2: sobre folios D4 y distancia entre ejes de 11,6 cm&lt;br /&gt;&lt;blockquote&gt;4.3856   -3.6440&lt;br /&gt;-3.6440    5.1768&lt;/blockquote&gt;Prueba 3:  sobre papel rugoso y distancia entre ejes de 11,5 cm&lt;br /&gt;&lt;blockquote&gt;1.0569   -0.5262&lt;br /&gt;-0.5262    0.9729&lt;/blockquote&gt;Prueba 4: sobre papel rugoso y distancia entre ejes de 11,4 cm&lt;br /&gt;&lt;blockquote&gt;5.4200   -7.2287&lt;br /&gt;-7.2287   10.3953&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/blockquote&gt;Comentar que el diámetro de la rueda se ha mantenido constante a 5,6 cm en todas las pruebas.&lt;br /&gt;&lt;br /&gt;Esperamos volver a escribiros pronto, como siempre para contaros nuestros avances.&lt;br /&gt;Saludos!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9011645851883076273-4256710068008268096?l=robobyte.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robobyte.blogspot.com/feeds/4256710068008268096/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://robobyte.blogspot.com/2010/02/practica-1-calibracion-y-trayectoria.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9011645851883076273/posts/default/4256710068008268096'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9011645851883076273/posts/default/4256710068008268096'/><link rel='alternate' type='text/html' href='http://robobyte.blogspot.com/2010/02/practica-1-calibracion-y-trayectoria.html' title='Práctica 1: Calibración y Trayectoria'/><author><name>Daniel García Capel</name><uri>http://www.blogger.com/profile/10635528395549343800</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://2.bp.blogspot.com/-zDjIvUH7sug/TrW1zUz1_AI/AAAAAAAACS0/i0xe2KyZjBE/s220/dgcapel_twitter.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_UIIv50dshIk/S3xPFTVO0SI/AAAAAAAAB8E/pFpVdqORH98/s72-c/Esquema+Practica+1+Robotica.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9011645851883076273.post-1395023716042362088</id><published>2010-02-16T20:19:00.000+01:00</published><updated>2010-02-16T20:48:53.252+01:00</updated><title type='text'>Configurar LeJOS en Eclipse [2º Parte]</title><content type='html'>Vamos a continuar mejorando la configuración de LeJOS en el entorno Eclipse, y en esta ocasión se tratará de hacer un script en bash que nos compile, enlace y suba automáticamente nuestro proyecto, con tan solo un clic. &lt;div&gt;&lt;ol&gt;&lt;li&gt;Para empezar creamos un fichero llamado "all.sh" en nuestro directorio de LeJOS (/opt/lejos/bin):&lt;br /&gt;&lt;blockquote&gt;cd /opt/lejos/bin&lt;br /&gt;sudo nano all.sh&lt;/blockquote&gt;&lt;/li&gt;&lt;li&gt;Copiamos este script, pegándolo con CTRL + INSERT&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;#!/bin/bash&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;#Constantes&lt;/div&gt;&lt;div&gt;lego_name="" #Nombre del Lego&lt;/div&gt;&lt;div&gt;lego_address="" #Dirección del Lego&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;#Comprueba el número de parámetros&lt;/div&gt;&lt;div&gt;if [ $# -eq 2 ]&lt;/div&gt;&lt;div&gt;then&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;echo "Uso: $(basename $0) &lt;clase principal=""&gt;"&lt;/clase&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;exit&lt;/div&gt;&lt;div&gt;fi&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;#Variable de Compilación&lt;/div&gt;&lt;div&gt;CLASSPATH=$PWD&lt;/div&gt;&lt;div&gt;mainFile=$(basename $1 .java)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;#Programa&lt;/div&gt;&lt;div&gt;echo "Compilando..."&lt;/div&gt;&lt;div&gt;for file in *.java&lt;/div&gt;&lt;div&gt;do&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;echo -e "\t$file"&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;nxjc $file&lt;/div&gt;&lt;div&gt;done&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;echo "Enlazando..."&lt;/div&gt;&lt;div&gt;nxjlink $mainFile -o $mainFile.nxj &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;echo "Subiendo a Lego..."&lt;/div&gt;&lt;div&gt;nxjupload -n $lego_name $mainFile.nxj&lt;br /&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;/li&gt;&lt;li&gt;Establecer las variables&lt;br /&gt;lego_name: nombre del lego (carrarro, hansF1, ...)&lt;br /&gt;lego_address : la dirección del lego (en el script no se utiliza)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;Le damos permisos de ejecución&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;sudo chmod o+x all.sh&lt;/blockquote&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;Creamos el enlace en Eclipse como explicamos en el post anterior&lt;br /&gt;Name: leJOS All&lt;br /&gt;Location: ${env_var:NXJ_HOME}/bin/all.sh&lt;br /&gt;Working Directory: ${project_loc}/src/&lt;br /&gt;Arguments: ${java_type_name}.java&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_UIIv50dshIk/S3r0dD2j2BI/AAAAAAAAB44/34POz_PluhY/s1600-h/ConfEclipse2+-+Parametros.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 255px;" src="http://4.bp.blogspot.com/_UIIv50dshIk/S3r0dD2j2BI/AAAAAAAAB44/34POz_PluhY/s320/ConfEclipse2+-+Parametros.png" alt="" id="BLOGGER_PHOTO_ID_5438928280090826770" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Aquellos que manejen el scripting de bash verán que no es gran cosa la que proponemos, pero cumple su cometido sin demasiadas florituras ;-)&lt;br /&gt;Saludos!!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9011645851883076273-1395023716042362088?l=robobyte.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robobyte.blogspot.com/feeds/1395023716042362088/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://robobyte.blogspot.com/2010/02/configurar-lejos-en-eclipse-2-parte.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9011645851883076273/posts/default/1395023716042362088'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9011645851883076273/posts/default/1395023716042362088'/><link rel='alternate' type='text/html' href='http://robobyte.blogspot.com/2010/02/configurar-lejos-en-eclipse-2-parte.html' title='Configurar LeJOS en Eclipse [2º Parte]'/><author><name>Daniel García Capel</name><uri>http://www.blogger.com/profile/10635528395549343800</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://2.bp.blogspot.com/-zDjIvUH7sug/TrW1zUz1_AI/AAAAAAAACS0/i0xe2KyZjBE/s220/dgcapel_twitter.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_UIIv50dshIk/S3r0dD2j2BI/AAAAAAAAB44/34POz_PluhY/s72-c/ConfEclipse2+-+Parametros.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9011645851883076273.post-5717464089717032374</id><published>2010-02-11T18:20:00.000+01:00</published><updated>2010-02-11T18:20:28.808+01:00</updated><title type='text'>Instalación de LejOS en MacOS Snow Leopard</title><content type='html'>Debido a que apenas se encuentra documentación sobre la instalación de LejOS el los equipos de la manzana, me he decidido a hacer este mini videotutorial el el que veremos paso a paso su instalación el un Macbook Pro (Late 2009) con Snow Leopard.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/eDqa2u4JdNo&amp;hl=es_ES&amp;fs=1&amp;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/eDqa2u4JdNo&amp;hl=es_ES&amp;fs=1&amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Recomendamos verlo a pantalla completa para las líneas a introducir.&lt;br /&gt;Referencias (&lt;a href="http://lejos.sourceforge.net/forum/viewtopic.php?p=8109&amp;amp;sid=6cd9e1b03093d7b60fd9e64e192a971b"&gt;http://lejos.sourceforge.net/&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="postbody"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="postbody"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9011645851883076273-5717464089717032374?l=robobyte.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robobyte.blogspot.com/feeds/5717464089717032374/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://robobyte.blogspot.com/2010/02/instalacion-de-lejos-en-macos-snow.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9011645851883076273/posts/default/5717464089717032374'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9011645851883076273/posts/default/5717464089717032374'/><link rel='alternate' type='text/html' href='http://robobyte.blogspot.com/2010/02/instalacion-de-lejos-en-macos-snow.html' title='Instalación de LejOS en MacOS Snow Leopard'/><author><name>Jose Antonio Fernandez</name><uri>http://www.blogger.com/profile/09711980692639603603</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_6S8Gy0qNIOc/S2RQcg_FZXI/AAAAAAAAAFI/Y1Eg4Kp5kQQ/S220/Foto+del+d%C3%ADa+30-01-2010+a+la(s)+16:20.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9011645851883076273.post-4026091796107109653</id><published>2010-02-10T20:36:00.000+01:00</published><updated>2010-02-16T20:35:48.723+01:00</updated><title type='text'>Configurar LeJOS en Eclipse [1º Parte]</title><content type='html'>Al igual que días pasados hicimos en referencia a la práctica 0, donde explicamos paso a paso como instalar LeJOS en Linux, en esta ocasión hacemos lo propio con el entorno de desarrollo Eclipse, explicado en la práctica 1.&lt;br /&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;&lt;br /&gt;Instalación de Entorno Eclipse&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Para los que se instalen por primera vez la versión 3.5.1, avisar de que esta tiene problemas con la gestión de ventanas de Gnome (debido a recientes cambios en Gtk). Cuando no funcionen los botones utilizar el INTRO ó ALT+Tecla Botón.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;Instalamos &lt;i&gt;Eclipse&lt;/i&gt; si todavía no lo tenemos&lt;br /&gt;Bajar la versión Classic desde &lt;a href="http://www.eclipse.org/downloads/"&gt;Eclipse.org&lt;/a&gt;&lt;br /&gt;Lo descomprimir en un directorio cualquiera y lo ejecutamos&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_UIIv50dshIk/S3MTeQahrnI/AAAAAAAAB10/R0sasXTLbKI/s1600-h/Descarga+Eclipse.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 194px;" src="http://4.bp.blogspot.com/_UIIv50dshIk/S3MTeQahrnI/AAAAAAAAB10/R0sasXTLbKI/s320/Descarga+Eclipse.png" alt="" id="BLOGGER_PHOTO_ID_5436710585689550450" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Añadir el Plugin a Eclipse&lt;br /&gt;&lt;i&gt;&lt;blockquote&gt;Help &gt; Install New Software &gt; Add...&lt;br /&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;Name: &lt;i&gt;leJOS&lt;br /&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;Location: &lt;i&gt;http://lejos.sourceforge.net/tools/eclipse/plugin/nxj/&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_UIIv50dshIk/S3MTVDGhfTI/AAAAAAAAB1s/gp028oGfwAU/s1600-h/A%C3%B1adir+Eclipse+Plugin.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 122px;" src="http://3.bp.blogspot.com/_UIIv50dshIk/S3MTVDGhfTI/AAAAAAAAB1s/gp028oGfwAU/s320/A%C3%B1adir+Eclipse+Plugin.png" alt="" id="BLOGGER_PHOTO_ID_5436710427497168178" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;/i&gt;&lt;/li&gt;&lt;li&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;Lo instalamos&lt;br /&gt;Para la versión 3.5.1 es necesario desmarcar la opción "Group items by category"&lt;br /&gt;Establecer las preferencias:&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/i&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt; Window &gt; Preferences &gt; leJOS NXJ&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;i&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;blockquote&gt;NXJ_HOME: /opt/lejos&lt;br /&gt;Marcar "Conection Type &gt; USB"&lt;br /&gt;Marcar "Run program after upload"&lt;br /&gt;Marcar "Verbose"&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_UIIv50dshIk/S3MTyRaFyjI/AAAAAAAAB18/3oAhjncqi_Y/s1600-h/Instalacion+Eclipse+Plugins.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 282px;" src="http://4.bp.blogspot.com/_UIIv50dshIk/S3MTyRaFyjI/AAAAAAAAB18/3oAhjncqi_Y/s320/Instalacion+Eclipse+Plugins.png" alt="" id="BLOGGER_PHOTO_ID_5436710929553541682" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/i&gt;&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-size:100%;"&gt;&lt;b&gt;&lt;span class="Apple-style-span"&gt;Crear un Proyecto&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Para crear un proyecto para nuestro lego lo hacemos como uno normal de Java&lt;br /&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;blockquote&gt;File &gt; New &gt; Java Project&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_UIIv50dshIk/S3MVM8FGjDI/AAAAAAAAB2E/XRCfZiwVdQ8/s1600-h/Eclipse+Nuevo+Proyecto.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 188px;" src="http://3.bp.blogspot.com/_UIIv50dshIk/S3MVM8FGjDI/AAAAAAAAB2E/XRCfZiwVdQ8/s320/Eclipse+Nuevo+Proyecto.png" alt="" id="BLOGGER_PHOTO_ID_5436712487196462130" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;&lt;li&gt;Convertimos el proyecto Java en leJOS&lt;br /&gt;&lt;blockquote&gt;Sobre el Proyecto, botón derecho: leJOS NXJ &gt; Convert to leJOS NXT Project&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_UIIv50dshIk/S3MV5vP_b6I/AAAAAAAAB2M/Se8hc6sA_Og/s1600-h/Eclipse+Convertir+Proyecto.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 188px;" src="http://3.bp.blogspot.com/_UIIv50dshIk/S3MV5vP_b6I/AAAAAAAAB2M/Se8hc6sA_Og/s320/Eclipse+Convertir+Proyecto.png" alt="" id="BLOGGER_PHOTO_ID_5436713256846585762" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:100%;"&gt;&lt;b&gt;&lt;span class="Apple-style-span"&gt;Añadir documentación Javadoc&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;Seleccionamos la librería desde el Package Explorer&lt;br /&gt;References Libraries &gt; classes.jar &gt; (botón derecho) &gt;Properties &gt; Javadoc Location&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;blockquote&gt;Javadoc URL: http://lejos.sourceforge.net/p_technologies/nxt/nxj/api/&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_UIIv50dshIk/S3MWVndEZaI/AAAAAAAAB2U/myBs3TU3pt8/s1600-h/Eclipse+Javadoc+Proyecto.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 195px;" src="http://4.bp.blogspot.com/_UIIv50dshIk/S3MWVndEZaI/AAAAAAAAB2U/myBs3TU3pt8/s320/Eclipse+Javadoc+Proyecto.png" alt="" id="BLOGGER_PHOTO_ID_5436713735790290338" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-size:100%;"&gt;&lt;b&gt;&lt;span class="Apple-style-span"&gt;Compilar un Proyecto&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;Podemos compilar el proyecto manualmente cada vez que queramos probarlo, pero resultará a la larga más cómodo tener unos accesos directos ya puestos en Eclipse. Vamos a crear tres enlaces, para compilar, enlazar y subir al Lego.&lt;br /&gt;&lt;ol&gt;&lt;li&gt; Nos dirigimos a: Run &gt; External Tools &gt; External Tools Configuration&lt;/li&gt;&lt;li&gt; Sobre: Program &gt; New launch configuration&lt;/li&gt;&lt;li&gt;Creamos el enlace de compilacion con los siguientes parámetros&lt;br /&gt;&lt;blockquote&gt;Name: LeJOS Compile&lt;br /&gt;Location: ${env_var:NXJ_HOME}/bin/nxjc&lt;br /&gt;Directory: ${project_loc}/src/&lt;br /&gt;Arguments: ${java_type_name}.java&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_UIIv50dshIk/S3MR8t5QwZI/AAAAAAAAB1k/vVzbRZrBWo8/s1600-h/LeJOS+Compile.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 262px;" src="http://4.bp.blogspot.com/_UIIv50dshIk/S3MR8t5QwZI/AAAAAAAAB1k/vVzbRZrBWo8/s320/LeJOS+Compile.png" alt="" id="BLOGGER_PHOTO_ID_5436708909975912850" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;/li&gt;&lt;li&gt; Creamos el enlace de enlazado&lt;br /&gt;&lt;blockquote&gt;Name: LeJOS Link&lt;br /&gt;Location: ${env_var:NXJ_HOME}/bin/nxjlink&lt;br /&gt;Directory: ${project_loc}/src/${java_type_name} -o ${java_type_name}.nxj&lt;br /&gt;Arguments: ${java_type_name} -o ${java_type_name}.nxj&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_UIIv50dshIk/S3MR1rur0AI/AAAAAAAAB1c/2blmwGN-YmU/s1600-h/LeJOS+Link.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 262px;" src="http://3.bp.blogspot.com/_UIIv50dshIk/S3MR1rur0AI/AAAAAAAAB1c/2blmwGN-YmU/s320/LeJOS+Link.png" alt="" id="BLOGGER_PHOTO_ID_5436708789135593474" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;/li&gt;&lt;li&gt;Creamos el enlace para subir el programa al lego&lt;br /&gt;&lt;blockquote&gt;Name: LeJOS Upload&lt;br /&gt;Location: ${env_var:NXJ_HOME}/bin/nxjupload&lt;br /&gt;Working Directory: ${project_loc}/src/&lt;br /&gt;Arguments: ${java_type_name}.nxj&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_UIIv50dshIk/S3MRjiRLS4I/AAAAAAAAB1U/xo2cQhXmaMU/s1600-h/LeJOS+Upload.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 262px;" src="http://3.bp.blogspot.com/_UIIv50dshIk/S3MRjiRLS4I/AAAAAAAAB1U/xo2cQhXmaMU/s320/LeJOS+Upload.png" alt="" id="BLOGGER_PHOTO_ID_5436708477358263170" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;/li&gt;&lt;li&gt;Creo obvio decir que para compilar y subir el programa habrá que seguir los pasos de forma ordenada: Compilar, Enlazar y Subir, xD&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;Como último paso, hacemos un simple "Hello World" para comprobar que toda la configuración está correcta y que ya podemos ponernos manos a la obra.&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Referencias&lt;br /&gt;&lt;/span&gt;&lt;a href="http://lejos.sourceforge.net/nxt/nxj/tutorial/Preliminaries/UsingEclipse.htm"&gt;LeJOS Manual - Using Eclipse&lt;/a&gt;&lt;/div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;a href="http://gsyc.escet.urjc.es/moodle/course/view.php?id=11"&gt;Robótica - I.T.I.Sistemas (URJC)&lt;/a&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9011645851883076273-4026091796107109653?l=robobyte.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robobyte.blogspot.com/feeds/4026091796107109653/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://robobyte.blogspot.com/2010/02/configurar-lejos-en-eclipse.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9011645851883076273/posts/default/4026091796107109653'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9011645851883076273/posts/default/4026091796107109653'/><link rel='alternate' type='text/html' href='http://robobyte.blogspot.com/2010/02/configurar-lejos-en-eclipse.html' title='Configurar LeJOS en Eclipse [1º Parte]'/><author><name>Daniel García Capel</name><uri>http://www.blogger.com/profile/10635528395549343800</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://2.bp.blogspot.com/-zDjIvUH7sug/TrW1zUz1_AI/AAAAAAAACS0/i0xe2KyZjBE/s220/dgcapel_twitter.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_UIIv50dshIk/S3MTeQahrnI/AAAAAAAAB10/R0sasXTLbKI/s72-c/Descarga+Eclipse.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9011645851883076273.post-4831320499699525016</id><published>2010-02-05T14:53:00.000+01:00</published><updated>2010-02-10T23:42:09.878+01:00</updated><title type='text'>Instalar LeJOS en Ubuntu 9.10</title><content type='html'>&lt;blockquote&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;/blockquote&gt;Aunque disponemos de la &lt;a href="http://gsyc.escet.urjc.es/moodle/file.php/11/Practicas/09_10/Practica0/p0.pdf"&gt;práctica 0&lt;/a&gt; donde explica como instalar el entorno de Lego NXT para Ubuntu, esta no es del todo completa ni tan detallada como la vamos a hacer ahora, donde se explica cada uno de los pasos a seguir. Por último decir que la instalación es idéntica para entornos de 32 y 64 bits, habiendo sido hecha en una máquina de 64 bits.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;Instalación JDK&lt;/span&gt;&lt;/b&gt; (Java Developmed Kit)&lt;/div&gt;&lt;div&gt;Antes de instalar leJOS, debemos disponer del paquete de desarrollo de Java. Puedes obviar este paso si tienes instalada una versión relativamente reciente.&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;De mi experiencia en el pasado, no recomiendo usar ninguna de las versiones que dispone Ubuntu en sus repositorios.&lt;/li&gt;&lt;li&gt;Bajamos la versión de la web de Sun Microsystem desde &lt;a href="http://java.sun.com/javase/downloads/widget/jdk6.jsp"&gt;aquí&lt;/a&gt;&lt;br /&gt;Bajar el .bin y NO el rpm.bin&lt;/li&gt;&lt;li&gt;La ejecutamos para que extraiga todos los ficheros&lt;br /&gt;&lt;blockquote&gt;chmod u+x jdk_6u18-linux.bin&lt;br /&gt;sudo ./jdk_6u18-linux.bin&lt;/blockquote&gt;&lt;/li&gt;&lt;li&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;Movemos el directorio /usr/lib/jvm&lt;br /&gt;&lt;blockquote&gt;sudo mv jdk1.6.0_18 /usr/lib/jvm&lt;/blockquote&gt;&lt;/span&gt;&lt;/i&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;Instalación de leJOS&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;Instalamos los paquetes: &lt;i&gt;libusb-0.1.4, libusb-dev, libbluetooth3, libbluetooth-dev, ant&lt;/i&gt;, &lt;span style="font-style: italic;"&gt;nano&lt;/span&gt; para lo que podemos usar:&lt;br /&gt;&lt;blockquote&gt;apt-get install libusb-0.1.4 libusb-dev libbluetooth3 libbluetooth-dev ant nano&lt;br /&gt;&lt;/blockquote&gt;&lt;/li&gt;&lt;li&gt;Bajar la última versión de leJOS desde &lt;a href="http://lejos.sourceforge.net/nxj-downloads.php"&gt;aqui&lt;/a&gt;. Actualmente es la 0.85beta.&lt;/li&gt;&lt;li&gt;Extraemos el archivo, para lo que podemos usar:&lt;br /&gt;&lt;blockquote&gt;tar xvfz lejos_NXJ_0_8_5beta.tar.gz&lt;br /&gt;&lt;/blockquote&gt;&lt;/li&gt;&lt;li&gt;Renombramos la carpeta a lejos y la copiamos (o cortamos) a &lt;i&gt;/opt/lejos/&lt;/i&gt;&lt;br /&gt;&lt;blockquote&gt;mv lejos_nxj lejos&lt;br /&gt;cp lejos /opt/lejos/&lt;/blockquote&gt;&lt;/li&gt;Añadimos las variables de entorno de las nuevas librerías, para lo que podemos hacer dos tres cosas distintas.&lt;br /&gt;1. Añadirlas para todos los usuarios y terminales (Recomendado)&lt;br /&gt;Nos dirigimos a /etc/profile.d/:&lt;br /&gt;&lt;blockquote&gt;cd /etc/profile.d/&lt;/blockquote&gt;Creamos un script, llamado por ejemplo nxt.sh, y que contenga:&lt;br /&gt;&lt;blockquote&gt;export NXJ_HOME="/opt/lejos"&lt;br /&gt;export PATH=$PATH:$NXJ_HOME/bin&lt;br /&gt;export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$NXJ_HOME/bin&lt;/blockquote&gt;2. Para unos usuarios determinados&lt;br /&gt;Edita tu fichero ~/.bash_profile o ~/.bashrc y añade las instrucciones export del primer método.&lt;br /&gt;&lt;li&gt;Compilamos la librería&lt;br /&gt;&lt;blockquote&gt;cd /opt/lejos/build&lt;br /&gt;ant&lt;br /&gt;&lt;/blockquote&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;&lt;b&gt;Permisos para acceder a Lego NXT&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Por defecto no tenemos permisos de escritura en los dispositivo USB o Bluetooth, o lo que es lo mismo, no se nos permite programar nuestro lego por temas de seguridad. Os voy a explicar dos maneras de hacerlo:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Dar permisos solo al dispositivo (Recomendado)&lt;br /&gt;Creamos un grupo de usuarios llamado "lego", que serán los que tengan permiso para programa el dispositivo:&lt;br /&gt;&lt;blockquote&gt;sudo addgroup lego&lt;/blockquote&gt;Añadimos nuestro usuario al grupo "lego":&lt;br /&gt;&lt;blockquote&gt;sudo usermod -a lego tuusuario&lt;/blockquote&gt;Añadimos una regla para acceder al dispositivo:&lt;br /&gt;&lt;blockquote&gt;sudo  nano /etc/udev/rules.d/70-lego.rules&lt;span class="Apple-style-span" style=";font-family:'Times New Roman';font-size:medium;"  &gt;&lt;em&gt;&lt;br /&gt;&lt;/em&gt;&lt;/span&gt;# Lego NXT&lt;span class="Apple-style-span" style=";font-family:'Times New Roman';font-size:medium;"  &gt;&lt;em&gt;&lt;span class="Apple-style-span" style="font-style: normal;font-family:monospace;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;/em&gt;&lt;/span&gt;BUS=="usb", SYSFS{idVendor}=="03eb", GROUP="lego", MODE="0660"&lt;br /&gt;BUS=="usb", SYSFS{idVendor}=="0694", GROUP="lego", MODE="0660"&lt;/blockquote&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Dar permiso a todos los usuarios (No recomendado)&lt;br /&gt;&lt;blockquote&gt;sudo chmod a+w /dev/busmonX, donde X es donde se encuentre montado el dispositivo&lt;/blockquote&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: 800;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Espero que os haya resultado de utilidad, porque aunque sea fácil de configurar, son bastantes pasos. Saludos y hasta la próxima!!!&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Referencias&lt;br /&gt;&lt;/span&gt;&lt;a href="http://lejos.sourceforge.net/nxt/nxj/tutorial/Preliminaries/GettingStartedLinux.htm"&gt;LeJOS Manual - Getting Started on Linux&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span" style="color: rgb(231, 111, 0); font-weight: bold;font-family:sans-serif;font-size:20px;"  &gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://gsyc.escet.urjc.es/moodle/course/view.php?id=11"&gt;Robótica - I.T.I.Sistemas (URJC)&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9011645851883076273-4831320499699525016?l=robobyte.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robobyte.blogspot.com/feeds/4831320499699525016/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://robobyte.blogspot.com/2010/02/instalar-lejos-en-ubuntu-910.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9011645851883076273/posts/default/4831320499699525016'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9011645851883076273/posts/default/4831320499699525016'/><link rel='alternate' type='text/html' href='http://robobyte.blogspot.com/2010/02/instalar-lejos-en-ubuntu-910.html' title='Instalar LeJOS en Ubuntu 9.10'/><author><name>Daniel García Capel</name><uri>http://www.blogger.com/profile/10635528395549343800</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://2.bp.blogspot.com/-zDjIvUH7sug/TrW1zUz1_AI/AAAAAAAACS0/i0xe2KyZjBE/s220/dgcapel_twitter.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9011645851883076273.post-7268884776980701055</id><published>2010-01-28T18:45:00.001+01:00</published><updated>2010-02-04T10:59:33.425+01:00</updated><title type='text'>Bienvenidos a tod@s</title><content type='html'>Bienvenidos a tod@s a nuestra página web, con ella queremos compartir con todos vosotros nuestros avances en robótica.&lt;br /&gt;En esta web iremos colgando nuestros vídeos para que podáis comentarlos y aportar nuevas ideas para que mejoremos poco a poco.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9011645851883076273-7268884776980701055?l=robobyte.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robobyte.blogspot.com/feeds/7268884776980701055/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://robobyte.blogspot.com/2010/01/bienvenidos-tods.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9011645851883076273/posts/default/7268884776980701055'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9011645851883076273/posts/default/7268884776980701055'/><link rel='alternate' type='text/html' href='http://robobyte.blogspot.com/2010/01/bienvenidos-tods.html' title='Bienvenidos a tod@s'/><author><name>Jose Antonio Fernandez</name><uri>http://www.blogger.com/profile/09711980692639603603</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_6S8Gy0qNIOc/S2RQcg_FZXI/AAAAAAAAAFI/Y1Eg4Kp5kQQ/S220/Foto+del+d%C3%ADa+30-01-2010+a+la(s)+16:20.jpg'/></author><thr:total>0</thr:total></entry></feed>
