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.

4 comentarios:

Thais Gangoo dijo...

Hola! Disculpa mi ignoracia pero cada vez que le doy "click" a cualqueir hora me sale la misma foto!!! Es mi computador?
POr cierto, con todo y todo esta buena la idea.
Saludos

José Gregorio Díaz Unda dijo...

Hola!

Es probable que tengas "cached" la página.

Presiona el botón de actualización en la parte superior del explorador que estás utilizando.

Por si acaso, revisé que todo funcionara correctamente y todo está bien.

Gracias!

José Gregorio.

Thais Gangoo dijo...

Hmmm la verdad tengo mi explorador en alemán y ni idea como quito eso de "cached". =0(
Gracias de todas formas jajjaja! La verdad me parece interesante ver esas fotos y el tráfico en ese tramo de Ccs. Saludos.

Alejandro Sosa dijo...

Excelente trabajo. Un paso siguiente podría ser usar php/gd para comparar dos fotos y definir densidad de tráfico o directamente suponer una velocidad promedio en relación al tráfico