Skip to content

Servidor de cámara

monkeyserna edited this page May 10, 2014 · 9 revisions

Charlie está dotado con una cámara Raspberry Pi conectada directamente a la GPU, lo que permite procesar las imágenes a mayor velocidad haciendo uso del procesador gráfico, en lugar de la unidad principal (CPU). Esto permite comprimir las imagenes a alta velocidad, incluso obtener una calidad de imagen en full HD 1080p. Aun así, la configuración empleada para la emisión de la camara es bastante más reducida, concretamente de 320x240p a 15 imágenes por segundo.

El driver empleado para crear una interfaz que permita emitir la señal en streaming es uv4l-raspicam. Este servicio se encarga de iniciar el funcionamiento de la cámara a la resolución y tasa de refresco deseada.

Una vez iniciado el servicio uv4l, la cámara comienza a funcionar. En este momento, se crea un servidor de video en JPG a través de HTTP (sobre TCP/IP).

Para comenzar el servidor, el script general de arranque del robot delega en cam.sh (situado en la carpeta raíz del servidor) la tarea de iniciar tanto el driver como el servidor JPG.

uv4l-raspicam

En primer lugar, activa la cámara mediante uv4l:

uv4l --driver raspicam --auto-video_nr --width 320 --height 240 --framerate 15 --sched-rr

Los parametros indicados realizan lo siguiente

  • --driver raspicam Indica la driver a emplear. En este caso el controlador necesario es el de la Raspberry Pi camera module
  • --auto-video_nr Busca automáticamente el punto de montaje de la cámara, desde /dev/video0 hasta /dev/videoN
  • --width 320 --height 240 Establece la resolución de la cámara
  • --framerate 15 Indica la tasa de refresco, 15 imágenes por segundo
  • ``--sched-rr` Utiliza la API 'Video4Linux2 Streaming I/O', para realizar un streaming más eficiente concediendo mayor prioridad a la planificación en tiempo de ejecución al servidor.

mjpg-streamer

Una vez activada la cámara, se inicia el servidor mjpg-streamer, una aplicación en linea de comandos que permite crear un servidor, para retransmitir imágenes JPG sobre una red basada en IP, desde la cámara hasta un navegador convencional. Soporta la compresión por hardware (GPU) de la cámara, lo que permite reducir drásticamente el uso de la CPU de este servidor, haciendo está aplicación un servicio ligero.

El puerto que emplea es el 8080, y la IP del robot por defecto es 192.168.0.123,por lo que para visualizar la cámara se accede a http://192.168.0.123:8080.

LD_LIBRARY_PATH=/home/pi/server/mjpg-streamer/
LD_PRELOAD=/usr/lib/uv4l/uv4lext/armv6l/libuv4lext.so ./mjpg_streamer -i "input_uvc.so -d /dev/video0 -r 320x240 -f 15" -o "output_http.so -w ./www"

Los parámetros de inicialización del servidor puede parecer algo confusos, ya que se emplea la técnica de PRELOAD para iniciar la librería de configuración de la cámara libuv4lext.so antes de comenzar la ejecución del servidor ./mjpg_streamer. Los parámetros que se indican al servidor son:

  • -i Configuraciones de entrada (input)
    • input_uvc.so Librería de configuración de la interfaz uv4l-raspicam
    • -d /dev/video0 Punto de montaje de la cámara
    • -r 320x240 Resolución
    • -f 15 Framerate
  • `-o Configuraciones de salida (output)
    • output_http.so Librería de configuración de salida para crear un servidor http
    • -w ./www Indica la dirección donde se encuentra la página web que se emitirá. Se encuentra en /home/pi/server/mjpg-streamer/www

API mjpg-streamer.

La web a la que se accede a través de http://192.168.0.123:8080 es la siguiente:

<html>
  <head>
    <title>CAM</title>
    <style>...</style>
  </head>
  <body>
      <img id="cam" src="/?action=stream" />
  </body>
</html>

Como se puede observar, para obtener la señal de la cámara se hace uso de la API del servidor. Concretamente se obtiene la señal de la URL /?action=stream.

Otra funcionalidad interesante puede ser la de capturar una instantánea (una fotograría). Para ello, se realizaría escribiendo la url http://192.168.0.123:8080/?action=snapshot.