Servidor de cámara
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.
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.
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
-
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
.
- Introducción
- Qué es Charlie
- Objetivos
- Alcance
- Proyectos similares
- Cómo controlar el robot
- Aspectos generales
- Modo de conducción libre
- Modo de programación gráfica 1. Ejemplos 2. Referencia de instrucciones
- Depuración
- Instalación
- Hardware
- Software
- Configuración de red
- Funcionamiento
- Comunicaciones
- Blockly
- Motores
- Cámara
- Comandos
- Explicación del código fuente
- Código de Arduino
- Aplicación Android
- Página web
- Servidor de comandos
- Script de arranque
- Resultados
- Evolución del proyecto
- Trabajo descartado
- Futuras ampliaciones
- Resultado final
- Agradecimientos
- Referencias
- Fuentes consultadas
- Datasheets