Música libre

Ayer empezaron a hablar sobre música libre en la lista de correo del GUL. La música libre es un movimiento que pretende difundir la música por canales diferentes a los que imponen las discográficas. Poco a poco este movimiento extraño, justo en el lado opuesto a las campañas de la música se muere y tonterías similares ha empezado a extenderse. A día de hoy podemos encontrar bastantes grupos que distribuyen su música de esta forma, música que podemos descargar de la red. Una de las primeras discográficas que descubrí fue Magnatune y dentro de ella al grupo Emma’s Mini. A día de hoy solo tenemos que echar un vistazo a la lista de artistas de Magnatunes para ver que la música libre no goza de tan mala salud como querrían hacernos creer.

A parte de discográficas también existen radios de música libre en Internet. Uno de los proyectos que más me han gustado ha sido iRate (gracias por la referencia Ixra). Se trata de una aplicación multiplataforma que te permite descargar música libre de forma automática en función de tus gustos. Según vas escuchando y puntuando las canciones que escuchas el sistema te descarga nuevas canciones que han gustado al usuarios de gustos similares a los tuyos. Quién dijo que la cultura libre no innovaba. Os recomiendo que la probéis.

Que la fuerza te acompañe

Ayer, como no podía ser de otra forma, fui a ver La venganza de los Sith. La película me pareció simplemente impresionante, memorable y tremendamente oscura. Pero lo importante no es eso sino el hecho de ver el nacimiento de Darth Vader, uno de los más grandes villanos de toda la historia del cine, alguien que ha vivido con nosotros desde antes que yo naciera.

Muchos de los chicos de mi generación (nací en 1978) han crecido con Han Solo y su Halcón Milenario, con Yoda y sus enseñanzas, con Leia y sus peinados, con la guerra de las galaxias al fin y al cabo. Saben de memoria cada una de las películas y han esperado con ansia esta última entrega. Por fin la película era para nosotros. Los anteriores episodios de esta nueva trilogía no lo eran, buscaban un público más infantil, más simple. Pero en La venganza de los Sith los verdaderos destinatarios éramos nosotros, los que crecimos con la trilogía original y ya no somos niños. La oscuridad de la película llega más allá del dramático El imperio contraataca (la que sin duda es mi película favorita), en la que el lado oscuro únicamente gana una batalla. En esta ha ganado una guerra, un imperio, que incluso sabemos los años de que durará.

Si no has visto esta película, no pierdas más el tiempo y vete ahora mismo. Que la fuerza te acompañe.

No a las patentes software

Hoy se ha convocado una movilización en contra de las patentes de software. A dicha movilización se han unido multitud de universidades españolas, entre ellas la Universidad Rey Juan Carlos. En ella hay prevista una charla del profesor Jesús González Barahona que podrá seguirse en streaming en la red.

Hay más información en Proinnova y barrapunto.

Nos vemos en la movilización.

Definitivamente dejo C++

Hace un par de días comenté unas pequeñas pruebas que había hecho con C# y C++, para comprobar cuanto potencia perdía si decidía huir vilmente de mis programas en C++ para refugiarme en Mono. Los resultados eran más esperanzadores de lo que yo suponía en un principio pues con C# y Mono conseguí un 75 por ciento de la velocidad del mejor caso obtenido con C++. Incluso mejoraba la situación que yo tengo actualmente, con código C++ sin optimizar.

Mi amigo Fabian se interesó en las pruebas de velocidad y le ha dado un par de vueltas más que yo. Sus resultados son mucho más impresionantes que los míos. Yo no tengo ninguna .Net 1.0 y ni la nueva .Net 2.0 Beta1, así que no lo he probado en windows. Sus pruebas sí que han sido sobre una máquina con windows y linux instalado. Las comparaciones son odiosas (resultados conseguidos en la misma máquina, un celeron 2800):

S.O. Lenguaje y opción Bytes procesados Fotogramas
Windows C++ con -O0 14MBps 61fps Windows C++ con -O3 28.9MBps 125fps Windows C# con .Net 2.0 Beta1 28.8MBps 125fps Windows C# .Net 2.0 Beta1 y código unsafe 30MBps 130fps Linux C++ con -O0 15MBps 66fps Linux C++ con -O3 25.7MBps 112fps Linux C# con Mono 16MBps 70fps Linux C# con optimizaciones en mono 20.5MBps 89fps

Impresionantemente .Net 2.0 Beta1 va más rápido que nuestro querido gcc, tanto en windows como en linux. En windows el motivo es sencillo, el cygwin, pero en linux la cosa es un poco más peliaguda. Definitivamente dejo C++.

Gracias a Fabian por su ayuda y su windows.

Golpeado por C++ y rebotado a C#

Hace ya más o menos un año que estoy liado con un programa en C++ para el seguimiento de objetos con varias cámaras, cuestión de la que ya he hablado. Hace tiempo que no cuento nada sobre él, sobre todo porque he estado bastante ocupado haciendo que funcionara. Más de una vez me he preguntado porqué elegí usar C++ en vez de algo más
razonable, como C#. Razonable pensando en todos los problemas que siempre encuentro al usar C++:

  • Los punteros son muy útiles para manejar memoria cruda. El resto del tiempo son un dolor de impresión. Las referencias son mucho más fáciles de tratar.
  • El manejo de memoria con delete explícitos es como para liberar recursos en un momento dado. Con recolectores de basura es más difícil determinar cuando se borra un objeto. Aún así es un precio pequeño a pagar por tener las ventajas de un recolector de basura. Los delete se olvidan, a veces no sabes dónde hacerlos, los objetos se quedan o se borran antes de lo necesario. Segundo dolor de cabeza.
  • En general cuando un objeto se usa en dos sitios a la vez es difícil de saber cuándo hay que borrarlo. Estos problemas se pueden solucionar recubriendo los objetos con unos punteros inteligentes y unos contadores de referencia. Es bastante transparente, pero no deja de ser una solución artística.
  • La velocidad de C++ es alta. Muy alta. Eso sí, si eres capaz de compilarlo con -O3, claro. Una parte importante de los bugs (o por lo menos de los míos) aparecen mucho más claros con -O3. Para seguir usando el programa tiene a usar -O0, haciendo que las ventajas de velocidad ya no sean tan evidentes.
  • C++ es un buen lenguaje, pero no tiene las cosillas molonas de las nuevas generaciones de lenguajes. Por ejemplo la identificación de tipos en C++ solo aparece según el compilador usado. Esto hace que no sea utilizable si quieres tener la posibilidad de portar el código o por lo menos de usarlo en otras máquinas con compiladores diferentes.

Al final, tras dos días de depuración intensa, implementar punteros inteligentes e identificación de tipos el programa empezó a funcionar correctamente. La velocidad del resultado es buena, pero no consigo usar la optimización. Hay todavía unos cuantos bugs dispuestos a morderme detrás de la esquina. Esto me hace plantearme como de bueno sería este programa en C# y Mono. Con esta opción tendríamos desde el principio el recolector de basura y la identificación de tipos. Pero ¿sería suficientemete rápido?

Este pregunta no tiene una respuesta tan inmediata. Mucho se ha escrito acerca de la eficiencia de C# y Mono pero lo mejor es hacer una prueba para el entorno en que te mueves. En mi caso porté una un filtro de color a C# usando código unsafe y algún punterillo que otro. Para imágenes de 320×240 obtuve los siguientes resultados:

Posted in Software | 1 Reply

Localización tridimensional usando un filtro de partículas

Durante las últimas semanas he estado terminando el programa de localización tridimensional de un objeto de color usando dos cámaras. La idea es la siguiente: queremos obtener las posición tridimensional de un objeto en movimiento, descrito por su color, visto desde dos o más cámaras.

El funcionamiento del sistema es bastante sencillo. Mantener una representación completa del espacio, en términos, por ejemplo de probabilidad de la existencia de una objeto, es muy costoso computacionalmente. Existen técnicas para reducir este coste computacional realizando un muestreo inteligente de esta función de probabilidad, por ejemplo las técnicas de MonteCarlo. En particular nosotros empleamos un filtro de partículas para mantener una representación de la densidad de probabilidad de la existencia de un objeto en el espacio. En él las partículas pueden verse como posibles realizaciones del objeto en el espacio, es decir, podemos interpretar las partículas como puntos en el espacio tridimensional real.

Para contrastar estas hipótesis con la realidad tomada desde las cámaras proyectamos dichos puntos sobre los planos de imagen. Comprobando el color de los puntos proyectados y el de sus vecinos podemos realimentar la cercanía de la partícula con el objeto real.

En la siguiente imagen podemos ver el sistema en funcionamiento, convergiendo hasta la posición real del objeto (la pelota rosa).

Trabajo, trabajo, trabajo

Hace ya bastante tiempo que no escribo en la bitácora. La verdad es que estado bastante liado en la universidad y no he tenido tiempo ni para esto. Ayer el pico fuerte pasó el pico más fuerte. Teníamos que terminar un artículo para una conferencia sobre reconocimiento de patrones y visión computacional, la PRCV2005.

El deadline para presentar el artículo era ayer, día 20 de enero. Ahora sé porqué se llama así, tras dieciséis horas de sprint en las que por poco palmo. Hubiera sido más tiempo pero los servicios de seguridad de mi universidad me desalojaron a la una de la mañana puesto que un becario no puede estar tanto tiempo aquí por motivos de seguridad. Sigo ascendiendo meteóricamente puestos en la lista de delincuentes peligrosos‘. Entre esto y que no me abren las puertas cuando llego me traen por la calle de la amargura.

Ahora solo queda terminar el resto del trabajo: otro artículo para una conferencia ingeniería del software libre, un estudio sobre comunidades de software libre para el proyecto Morfeo y terminar la corrección de un libro con Teo. Cuando termine todo esto seré un hombre libre. ¿O no?

.dotcpu y robots navideños

Leyendo http://robots.net he visto un nuevo producto de Microsoft. Parece que Microsoft intenta acercar la tecnología .Net a ámbitos más empotrados, proporcionando con .netcpu un paquete que permite programar y controlar mediante el puerto serie una pequeña CPU ARM de 27MHz, orientada para aplicaciones de poca potencia, como sensores o dispositivos empotrados inteligentes.

Aunque pueda parecer interesante lo realmente interesante es el precio: 200$ por cpu y 500$ por el software. ¿De verdad esperan vender alguna unidad? Otra cuestión interesante es que en la página de .netcpu se cita como otra posible aplicación a la robótca. ¿27MHz? Un poco escaso para cuestiones reales o para visión.

Siguiendo con la robótica, parece que poco a poco está entrando en nuestras vidas y no solo con Microsoft. Los robot aspiradora y de juguete son un regalo muy interesante para estas navidades.

Rumbo al planeta

Alegre he comprobado que Fabian que me ha añadido al planeta de Monohispano. Espero que el resto de la gente de la comunidad Mono encuentren alguno de mis comentarios interesantes.

En cuanto tenga tiempo tendré que hacerme mi propio hackergotchi.

Justo la semana pasada la gente del Grupo de Sistemas y Comunicaciones, donde trabajo, empezó a mover nuestro planeta del gsyc, también conocido como el sindicato del crimen (porque sería un crimen no leerlo). Poco a poco los blogs se van haciendo un sitio más importante en nuestra forma de trabajar, de relacionarnos y de pasar el rato. La lista de enlaces del liferia/blam/straw no hacen más que crecer y crecer. El número de noticias nuevas sigue aumentando… Como dice mi amigo Teo: “No tienes un weblog, no tienes nada!”