jueves, 26 de agosto de 2010

Cámara para tráfico de bajo presupuesto

Un proyecto que vengo realizando desde hace un poco menos de un año está relacionado con la supervisión de un punto importante en una de las vías expresas en Caracas, Venezuela.

Todo surgió por la necesidad que tenía de saber algunas condiciones de este tramo de la autopista: ¿llueve?, ¿mucho tráfico?, ¿alguna situación que obstaculice el tránsito?

Entonces, decidí revivir un viejo laptop que tenía en alguna sombra de mi closet para hacer algo útil.

Esta publicación trata de cómo construí un sistema para supervisar el tramo del elevado de Santa Fé en la autopista de Prados del Este en Caracas, Venezuela.

Básicamente, este sistema lo que hace actualmente es tomar una fotografía en momentos determinados del día para luego copiarla en un directorio de un dominio identificado como www.ruedapoco.com.

En virtud de que no tenía mucho tiempo para publicitar el experimento, decidó crear un canal de twitter llamado www.twitter.com/ruedapoco que se encargara de informar del servicio. En poco tiempo, gracias a esta red social la cantidad de visitas para ver esta simple foto creció rápidamente.

Esta publicación está distribuída en los siguientes pasos:

1. Instalación de GNU/Linux Debian Lenny.
2. Instalación de la webcam.
3. Instalación del programa para tomar las fotografías.
4. Cronograma permanente para la creación de la fotografía y actualización del estado en "twitter".
5. Publicación de la fotografía en el servidor www.ruedapoco.com.

Aquí va la explicación de cada uno de ellos.

1. Instalación de GNU/Linux Debian Lenny.

Utilizando el programa "JIGDO", creé una imagen de un CD de instalación en su versión "netinstall" de Debian Lenny.

Realicé la instalación del sistema en mi viejo Toshiba Satellite que no tenía más que un Intel Pentium 3 con 512 MB en RAM. y un gigantezco disco de 40 Gb.

Para este sistema, sólo utilicé la opción de "Sistema Base". Es decir, quité la selección que me invitaba a mantener el instalador para "Sistema de Escritorio" y "Laptop". Con esto logré que el sistema operativo tuviera exclusivamente lo necesario.

2. Instalación de la webcam.

Para lograr una imagen "decente" y que no afectara el exceso o defecto de luminosidad cuando se tomara la foto, compré una cámara web Logitech modelo QuickCam Communicate MP/S55000 tal como la que se ve en la foto.

Al conectarla, verifiqué el log del sistema para confirmar que estaba siendo correctamente detectada:

# tail -f /var/log/syslog

La salida en el log fué:

Aug 24 19:23:25 multiplo kernel: [  308.716068] usb 1-1: new full speed USB device using ohci_hcd and address 2
Aug 24 19:23:26 multiplo kernel: [  309.015860] usb 1-1: configuration #1 chosen from 1 choice
Aug 24 19:23:26 multiplo kernel: [  309.021176] usb 1-1: New USB device found, idVendor=046d, idProduct=09a1
Aug 24 19:23:26 multiplo kernel: [  309.021190] usb 1-1: New USB device strings: Mfr=0, Product=0, SerialNumber=2
Aug 24 19:23:26 multiplo kernel: [  309.021198] usb 1-1: SerialNumber: F4290250
Aug 24 19:23:26 multiplo kernel: [  309.595285] Linux video capture interface: v2.00
Aug 24 19:23:27 multiplo kernel: [  309.794329] uvcvideo: Found UVC 1.00 device (046d:09a1)
Aug 24 19:23:27 multiplo kernel: [  309.830874] input: UVC Camera (046d:09a1) as /class/input/input7
Aug 24 19:23:27 multiplo kernel: [  309.840521] usbcore: registered new interface driver uvcvideo
Aug 24 19:23:27 multiplo kernel: [  309.840538] USB Video Class driver (v0.1.0)
Aug 24 19:23:27 multiplo kernel: [  310.121183] usbcore: registered new interface driver snd-usb-audio


Entonces pude constatar que todo iba "de perlas". Me llamó la atención que esta cámara no era tan "básica". De hecho, empleaba el controlador V4L2 y es lo que llaman una cámara UVC además de traer su propio dispositivo de captura de audio.

3. Instalación del programa para tomar las fotografías.

Debido al modelo y controlador de la cámara, no serviría cualquier programa que tomara una foto. El que seleccionara debería ser compatible con cámaras UVC y emplear el controlador.

Decidí emplear entonces el programa "fswebcam" que está disponible en los repositorios de "squeeze".

Para instalarlo, lo descargué directamente de los "archives" de Debian pero antes instalé un par de dependencias:
  • # cd /root
  • # aptitude install libgd2-noxpm libgd2-xpm
  • # wget http://ftp.us.debian.org/debian/pool/main/f/fswebcam/fswebcam_20100622-1_i386.deb
  • # dpkg -i fswebcam_20100622-1_i386.deb
Para verificar el funcionamiento, ejecuté el programa para tomar una foro de prueba:
  • # fswebcam -d /dev/video0 -i 0 -p MJPEG -r 640x480 -S 30 --no-banner --jpeg -1 prueba.jpg
Se creó correctamente el archivo "prueba.jpg" que corresponde a la imagen que tomó la cámara.

En este momento, tenía instalado el programa que utilizaría para tomar las fotos.

4. Cronograma permanente para la creación de la fotografía y actualización del estado en "twitter".

Para realizar la fotografía los días y horas determinadas, me apoyo en el planificador de tareas "cron".

Programé dos bloques: uno para que se tome la fotografía cada cinco minutos de lunes a viernes entre las 04:00 AM y las 11:00PM. El otro bloque es los sábados y domingos en horas "enteras" (3pm, 4pm, 5pm, etc.) también desde las 04:00 AM hasta asl 11:00 PM.

A continuación los comandos que utilicé:
  • # crontab -e

    */5     4-23   *      *    1-5      /usr/local/sbin/snapshot.sh
    0       4-23   *      *    6,0      /usr/local/sbin/snapshot.sh
El script "spanshot.sh" lo creé para no estar editando directamente el planificador "cron" cuando necesitara realizar algún cambio.

Este script fundamentalmente realiza dos funciones: la primera es crear la fotografía y la segunda es actualizar el estado del canal de "twitter" llamado "ruedapoco".

La actualización del canal de "twitter" se realiza a través de la API que este portal ofrece para ejecutar algunas funciones a partir de comandos y no desde la web.

Estas ejecuciones requieren poder invocar comandos a través de "http" desde la cónsola. En este sentido, me decanté por el programa "curl" que está en los repositorios:
  • # aptitude install curl
Al igual que "snapshot.sh", creé un script para actualizar el "estado" en el canal de "twitter".

El script "twitter-update-status.sh" luce así:
  • vim /usr/local/sbin/twitter-update-status.sh

    curl --basic --user MiUsuario:MiClave --data status="Tráfico a las $(date "+%H horas y %M minutos"|sed -e ' s/\"/\\\"/g' ) en el Dist. SantaFé en la Autop. PradosDelEste: http://www.ruedapoco.com/camaras/santafe/camara-01/" http://twitter.com/statuses/update.xml > /dev/null
Cada vez que ejecute este script, se publica un mensaje en el canal de "twitter".

Cabe destacar que esta actualización no puede ser permanente porque "twitter" lleva un control de la cantidad de cambios que se realizan vía API y tienen un límite.

Entonces, agregué la ejecución del script "twitter-update-status.sh" al planificador de tareas "cron":
  • #crontab -e
    ...
    15 7-20 * * 1-5 /usr/local/sbin/twitter-update-status.sh
    5 * 7-20 * 6,0 /usr/local/sbin/twitter-update-status.sh
También consideré dos bloques: uno de lunes a viernes a los 15 minutos de cada hora y otro sábados y domingos luego de 5 minutos de cada hora.

5. Publicación de la fotografía en el servidor www.ruedapoco.com.

Finalmente, lo único que quedaba era copiar la fotografía tomada en el directorio del sitio www.ruedapoco.com.

Para lograr esto, utilicé el cliente ftp pero estableciendo un conjunto de instrucciones que se ejecutarían al invocar el comando "ftp".

Entonces, creé el archivo "/root/.netrc" con el siguiente contenido:
  • # vim /root/.netrc

    machine  ftp.ruedapoco.com
    login    MiUsuarioFTP@ruedapoco.com
    password MiClaveFTP
    macdef init
    prompt
    hash
    binary
    lcd /var/opt/camara-01/
    cd santafe
    cd camara-01
    mput webcam_navegadores.jpg
    quit
A partir de este conjunto de instrucciones, se copia el archivo de imagen "webcam_navegadores.jpg" en el servidor www.ruedapoco.com.

Para concluir, agregué el comando necesario para publicar la fotografía considerando el planificador de tareas "cron":
  • # crontab -e
    ...
    ftp ftp.ruedapoco.com
Con este último paso, queda publicada la fotografía en la página web.

Luego de ver el resultado final, estaba bastante contento :-) ... Sin embargo, me gustaba la idea de modificar la fotografía antes de que fuera publicada para agregarle algún texto relacionado con la ubicación del lugar, fecha y hora y correo.

Para hacer esto, instalé el poderoso programa "imagemagick" para manipulación de imágenes:
  • # aptitude install imagemagick
Luego, agregué el siguiente conjunto de instrucciones en el script "snapshot.sh" justo después de tomar la fotografía con el comando "fswebcam":
  • # vim /usr/local/sbin/snapshot.sh
    ...
    convert /var/opt/camara-01/webcam_navegadores_raw.jpg -gravity South -background Gold -splice 0x18 -annotate +0+2 "Venezuela - Caracas - Distribuidor Santa Fé -  $(date "+%d.%m.%Y-%H:%M:%S - jdiaz@bpiconsultores.com"|sed -e ' s/\"/\\\"/g' )" /var/opt/camara-01/webcam_navegadores_raw_1.jpg

    ln -fs /var/opt//camara-01/webcam_navegadores_raw_1.jpg /var/opt/camara-01/webcam_navegadores.jpg
    ...
Con esta modificación, agregué un rectángulo amarillo en la parte inferior de la fotografía con el lugar, la fecha y hora de la foto y un correo electrónico.

Hasta el momento ha venido funcionando este viejo laptop ofreciendo un servicio de gran utilidad para los que vivimos en las zonas aledañas.

Espero sea de utilidad.

Éxitos!

José Gregorio.

miércoles, 25 de agosto de 2010

Creando imágenes de Debian con JIGDO

La primera tarea para hacer la instalación de un sistema GNU/Linux Debian es obtener o crear un CD de instalación.

En esta publicación, explico en líneas generales cómo crear una imagen ISO para luego "quemar" un CD de instalación con Debian.

En el proceso, la primera decisión que debía tomar era cómo realizaría la descarga del CD de instalación. En este sentido, tenía dos alternativas: descargar un archivo ISO de "http://www.debian.org/CD/" o utilizar el programa "JIGDO".

Me he decidido por utilizar el programa "JIGDO" porque en la web de Debian pronostican que debería ser la forma predeterminada para elaborar CDs de instalación. Además, mencionan que el proceso es más rápido que la descarga de un archivo ISO.

A continuación los pasos que utilicé para crear una imagen ISO de la versión "netinstall" de Debian Lenny.

1. Instalar el programa JIGDO:
  • # aptitude install jigdo
2. Descargar los archivos ".jigdo" y ".template" en mi directorio "home":
  • $ cd
  • $ wget http://cdimage.debian.org/debian-cd/5.0.5/i386/jigdo-cd/debian-505-i386-netinst.jigdo
  • $ wget http://cdimage.debian.org/debian-cd/5.0.5/i386/jigdo-cd/debian-505-i386-netinst.template
3. Iniciamos la creación de la imagen ISO:
  • $ jigdo-lite debian-505-i386-netinst.jigdo
Como es la primera vez que creaba una imagen con este archivo .jigdo, presioné "enter" a la primera pregunta relacionada con el "scan".

En la pregunta acerca del mirror que quiero utilizar, respondí:

http://debian.mirror.iweb.ca/debian/


El proceso de descarga de los archivo inicia y puede demorar dependiendo del tipo de imagen que se esté creando. En mi caso, la imagen que estoy creando es mínima y la descarga es de 130 Mb. a 170 Mb.

Al concluir el proceso, se creó "automágicamente" un archivo llamado:

debian-505-i386-netinst.iso

Este archivo es la imagen que podemos utilizar con algún programa como BRASERO, GNOMEBAKER o DD para crear un CD de instalación de Debian.

Espero sea de utilidad.

José Gregorio.

Fuentes:
  • http://www.debian.org/CD/jigdo-cd/
  • http://cdimage.debian.org/debian-cd/5.0.5/i386/jigdo-cd/
  • http://www.debian.org/mirror/list
  • http://www.tldp.org/HOWTO/Debian-Jigdo/updatingyourimage.html

miércoles, 18 de agosto de 2010

Screencasts para Youtube con Debian.


Los screencasts son una de las formas más útiles de realizar demostraciones basadas en videotutoriales.

En esta publicación, voy a explicar cómo he realizado grabaciones de mi escritorio para luego transformarlas formato MP4 y que sea reproducible en la mayoría de los reproductores multimedia.

Para poder grabar el escritorio y el audio del micrófono, he instalado un programa llamado "recordmydesktop" el cual me ha sorprendido su simplicidad y efectividad.



Realizamos la instalación de los paquetes necesarios:
  • # aptitude install gtk-recordmydesktop recordmydesktop ffmpeg
"recordmydesktop" graba lo que ocurre en el escritorio y el audio del micrófono "encapsulando" tanto el audio y el video en formato ".ogv".

Internamente, esta "cápsula" contiene los flujos con formato "theora" para el video y "vorbis" para el audio.

Desafortunadamente, no todos los fabricantes de software impulsan sus desarrollos por la efectividad y adecuada implementación de los codecs. En este sentido, nos vemos en la necesidad de transformar los videos generados por "recordmydesktop" en formato ".ogv" a otro formato más "comercial" como por ejemplo ".mp4".

El encapsulamiento ".mp4" no funciona mal, lastimosamente le ha quitado terrreno en la penetración al mundo comercial a ".ogv".

Entonces, para transformar de encapsulamiento ".ogv" a ".mp4" me he apoyado en la fabulosa herramienta "ffmpeg".



Nuestro siguiente paso es realizar la instalación del programa "ffmpeg", con las instrucciones de costumbre:
  • # aptitude install ffmpeg
El repositorio que estoy utilizando para descargar "ffmpeg" es el ofrecido por Christian Marillat (www.debian-multimedia.org)

Ahora bien, supongamos que hemos grabado un archivo de un videotutorial con "recordmydesktop" llamado out.ogv.

Para transformarlo a ".mp4" conformado por el flujo de video en formato "mpeg4" y audio "mp3", he utilizado la siguiente instrucción:
  • $ ffmpeg -i out.ogv -vcodec mpeg4 -acodec libmp3lame -scodec copy -s 800x600 -ac 1 out.mp4
El tamaño del archivo resultante "out.mp4" ha sido menos de la mitad del original "out.ogv". Ideal para publicarlo en youtube.

Básicamente lo que he hecho es además de modificar la codificación original del video y audio del archivo original, reduje el tamaño de 1024x768 que era la resolución original que tenía en mi pantalla a 800x600 que se ve bastante bien. Por otra parte, cambié de dos canales de audio (esteéreo) a uno solo.


Esto me ha sido suficiente para obtener videos de excelente calidad en mis videotutoriales para publicarlos en youtube.

Espero sea de utilidad.

José Gregorio


Fuentes:
  1. http://recordmydesktop.sourceforge.net/rug/app_a.php
  2. man ffmpeg