Sobre este post, veremos como configurar una RaspberryPi 3 con una PiCamera NOIR V2 para realizar un Streaming de vídeo  FullHD en Tiempo Real el cual sera capaz de mostrarse sobre QGroundControl como sistema FPV con el fin de controlar el vuelo de nuestro UAV.

Para plataformas compatibles, QGroundControl implementa un receptor de transmisión de video UDP RTP y RSTP en su pantalla principal de vuelo. Utiliza GStreamer y una versión reducida de QtGstreamer
Si tiene instaladas las bibliotecas de desarrollo de GStreamer adecuadas cuando QGC las busque, el sistema de compilación de QGC las utilizará automáticamente y generará soporte para la transmisión de video.

Herramientas

  • PC de desarrollo con Linux/Debian o Derivados
  • QgroundControl Daily Builds sobre el PC
  • Raspberry Pi 3
  • Adaptador 5v 2A con puerto USB V8
  • Monitor HDMI
  • Mouse y Teclado USB
  • PiCamera NOIR V2
  • Red LAN entre los Equipos

Instalando Raspbian Jessie

En este caso, utilizaremos la versión de Debian 8 para ejecutar correctamente GSTreamer1.0 ya que la versión actual del software compilado a la fecha de hoy para Debian Stretch esta generando dependencias incumplidas sobre sus repositorios, si es posible generar las pruebas con la versión mas actual e indicarnos que son correctas podriamos actualizar el tutorial en su debido momento.

para descargar la ISO del sistema se puede acceder al siguiente directorio WEB donde actualmente residen las ISOS de Raspbian.

http://downloads.raspberrypi.org/raspbian_lite/images/

Y descargar la ultima compilación disponible para Jessie.

http://downloads.raspberrypi.org/raspbian_lite/images/raspbian_lite-2017-07-05/

Omitiremos los pasos de la instalación del sistema Operativo ya que es algo que hemos realizado en anteriores tutoriales, lo único que se debe de hacer es seguir ESTE hilo desde la sesión Instalando Raspbian en Raspberrypi3.

Una vez instalado correctamente, procedemos a conectar la Raspberry vía Ethernet a la red local, a conectar la interfaz HDMI, Camara, mouse y teclado; echo esto procedemos a encender la Raspberry con el adaptador de energía 5V.

Configurando el Acceso a la Raspberrypi.

Configurando la distribución de teclado

Al momento de ingresar al sistema, normalmente la distribución de teclado no es la adecuada, en nuestro caso la distribución que debemos de configurar es español "es".

editamos el archivo de configuración /etc/default/keyboard y agregamos el tipo de teclado

$ sudo nano /etc/default/keyboard

buscamos la linea XKBLAYOUT="gb" y cambiamos lo que esta dentro de "gb" por nuestra distribución de teclado "es", guardamos y reiniciamos el sistema.

Actualizando Raspbian...

una vez realizada la configuración de la red Wi-Fi podremos actualizar la cache de repositorios y confirmar si existen actualizaciones disponibles sobre el dispositivo.

Actualizamos cache de repositorios

$ sudo apt-get update

Actualizamos el Sistema Operativo

$ sudo apt-get upgrade

Habilitando conexiones Remotas Via SSH.

El protocolo SSH, es utilizado para comunicaciones remotas seguras, este software puede instalarse fácilmente con un comando, pero en este caso no lo vamos a instalar, ya que viene instalado por defecto sobre la versión de Raspbian que hemos instalado con anterioridad.

Subimos el servicio ssh al inicio del sistema.

$ sudo systemctl enable ssh.service

Reiniciamos la Raspberry pi, confirmamos que el servicio SSH se haya levantado al inicio del sistema

$ sudo systemctl status ssh.service 


#Salida del sistema
● ssh.service - OpenBSD Secure Shell server
   Loaded: loaded (/lib/systemd/system/ssh.service; enabled)
   Active: active (running) since Wed 2017-04-26 22:35:54 UTC; 1min 42s ago
 Main PID: 696 (sshd)
   CGroup: /system.slice/ssh.service
           ├─696 /usr/sbin/sshd -D
           ├─792 sshd: pi [priv]
           ├─798 sshd: pi@pts/0
           ├─800 -bash
           ├─837 sudo systemctl status ssh.service
           └─841 systemctl status ssh.service

nos conectamos a la IP  de la Raspberry  de manera remota sobre el servicio de ssh desde nuestro computador de desarrollo.

$ ssh pi@192.168.2.103

En esta prueba nuestra IP es Local sobre la red LAN conformada entre la Raspberry y el PC de desarrollo, desde este momento seguiremos llamando el dispositivo en la red con su nombre de host el cual es raspberrypi, desde este instante la forma de conectarse a la Raspberry sera

$ ssh pi@raspberrypi

Este comando, iniciara el menu de configuracion

Habilitando la PiCamera NOIR

Como previamente habíamos conectado la PiCamera a nuestra RaspberryPi por medio de su Flesh sobre el puerto adecuado, procedemos a habilitarla sobre el Sistema Operativo.

En el Shell de la Raspberry Ejecutamos el software de Configuracion predeterminado para ella.

$ sudo raspi-config

Seleccionamos Interfacing Options y damos "Enter"

raspi-config

Sobre la opción Camera damos "Enter" y seleccionamos que la queremos habilitar.

para comprobar que la camara ha quedado configurada y que el sistema la monta correctamente, vamos a proceder con el siguiente comando.

$ raspistill -o foto.jpg

Esto tomara una imagen y la almacenara sobre el directorio actual para el usuario.

$ ls -la
-rw-r--r-- 1 pi   pi   1761365 Aug  6 18:41 foto.jpg

Instalando GSTREAMER1.0

Una vez actualizado el sistema, conectada y configurada la PiCamera, procederemos a instalar la librería que generara un PipeLine desde nuestra Raspberry hacia el PC de desarrollo con QGroundControl.

$ list=$(apt-cache --names-only search ^gstreamer1.0-* | awk '{ print $1 }' | grep -v gstreamer1.0-hybris) && sudo apt-get install $list && sudo apt-get install libgstreamer-plugins-base1.0-dev

Ejecutando el PipeLine Hasta QGroundControl.

Finalizada la instalación, podremos ejecutar el respectivo "Tunel" que empezara con la transmision de video hacia el GCS, para ello utilizamos el Codec de video H264 soportado por la PiCamera.

La variable host=192.168.2.104 hace referencia a la dirección IP del host de desarrollo donde actualmente esta instalado QGroundControl, es necesaria para proceder e inicializar la comunicacion con el GCS.

$ raspivid --nopreview --awb auto -ih -t 0 -w 1920 -h 1080 -fps 30 -b 4000000 -g 30 -pf high -o - | gst-launch-1.0 fdsrc ! h264parse !  rtph264pay !  udpsink host=192.168.2.104 port=5600

Si sobre el PC de desarrollo queremos ver el streaming de video antes de que QGroundControl lo interprete, es necesario instalar GSTreamer con el mismo comando con el que se ha instalado en Raspberry.

Una vez instalado, procedemos a recuperar el video que esta siendo enrutado por el PipeLine.

gst-launch-1.0 udpsrc port=5600 caps='application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264' ! rtph264depay ! avdec_h264 ! autovideosink fps-update-interval=1000 sync=false

Esto, habilitara una ventana sobre nuestro pc y decodificara el video que ha sido previamente recibido por el socket.

Configurando QGroundControl Daily Build...

Ejecutado el pipeline correctamente, podremos iniciar QGroundControl y Capturar el Video que esta siendo transmitido via UDP hacia el host siendo enrutado desde el Router de una interfaz Ethernet hacia una Wireless.

Descargamos sobre algun directorio local la ultima version de compilada de QgroundControl.

$ wget https://s3-us-west-2.amazonaws.com/qgroundcontrol/builds/master/QGroundControl.AppImage

Finalizada la descarga procedemos a poner los respectivos permisos a la herramienta y a ejecutarla.

$ chmod +x QGroundControl.AppImage 
./QGroundControl.AppImage

Sobre la aplicación, en el icono con la letra "Q" vamos a las opciones Generales y seleccionamos Video Source: UDP Video Stream

QGroundControl

Echa la configuración, reiniciamos la aplicación y podremos ver la transmisión que se ha iniciado.

Referencias:
https://dev.px4.io/en/qgc/video_streaming.html
https://dev.px4.io/en/qgc/video_streaming_wifi_broadcast.html
https://github.com/mavlink/qgroundcontrol
https://github.com/mavlink/qgroundcontrol/blob/master/src/VideoStreaming/README.md
https://www.raspberrypi.org/
https://www.raspberrypi.org/products/pi-noir-camera-v2/