Un robot mobile autonome peut servir à explorer un endroit où on ne se trouve pas. Pour l’acquisition d’images comme pour la transmission à distance, des solutions à bas-coût sont possibles grâce à une simple webcam de chat (15€) et une carte Raspberry Pi (35€ + câbles et carte mémoire).
C’est la solution qu’a choisi Greg pour la mise à jour 1.1 de son robot Baba.
Configuration requise
La manip’ présentée ici est effectuée avec une Raspberry Pi type B seconde version avec 256 Mo de mémoire vive.
La distribution GNU/Linux que nous avons choisie est une Occidentalis v1.1 basée sur Raspbian, elle-même basée sur Debian.
Ce n’est pas la première fois que nous utilisons une webcam sous Linux : en 2005, une webcam Philips Toucam II était utilisée avec les drivers video4l et le pilote optimisé grâce à un NDA [1] avec Philips qui a fait couler beaucoup d’encre.
Bien débuter
Nous préférons procéder pas à pas plutôt que de donner une liste d’instructions à saisir. Vous trouverez pléthore de tutoriels prêt à l’emploi sur Internet. Généralement les plus simples sont ceux qui fonctionnent le moins :(
Ainsi nous avons retenu la solution mjpg-streamer plutôt que la plus fréquente ffserver. Non seulement les explications que nous avons trouvées étaient plus précises, en admettant des limitations et des difficultés d’installation.
Concernant les performances, la page officielle sur Sourceforge annonce une consommation de 10% seulement pour un CPU tournant à 200 MHz pour une vidéo de 960x720 pixels.
Préparation
La première étape est de contrôler l’insertion de la webcam dans le port USB. En effet, pas la peine de perdre du temps à installer des logiciels si au bout de deux heures vous vous apercevez qu’il faut aller chercher une nouvelle caméra..
pi@raspberrypi ~ $ lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 002: ID 0424:9512 Standard Microsystems Corp.
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp.
Bus 001 Device 004: ID 041e:406b Creative Technology, Ltd
C’est fait, nous voyons bien la Creative Technology. A noter que la webcam va ensuite créer des périphériques vidéos (et audio s’il y a un microphone), généralement sur /dev/videoX où X est un nombre à partir de 0.
Il est préférable d’allumer votre Raspberry Pi une fois que la webcam est branchée. Même si "lsusb" vous montre vos nouvelles webcams, la création des périphériques ne se fait pas à chaud ou "hot-plug" (avec les modèles que j’ai utilisé, ce n’est peut être pas une généralité).
Avant d’installer de nouveaux logiciels, il faut procéder à la mise à jour de la carte :
sudo apt-get update
sudo apt-get upgrade
Cette mise à jour peut prendre 160 Mo et durer plus de vingt minutes.
On va ensuite vérifier les capacités de la caméra. Si vous en avez plusieurs (on fait beaucoup de récupération au club Pobot), vous pourrez ainsi vérifier laquelle convient le mieux à vos besoins.
Pour ce faire, on utilisera les outils de Vidéo4Linux (v4l), que l’on doit installer :
pi@raspberrypi ~ $ apt-get install v4l-utils v4l-conf
Une fois fait, on peut lancer différents outils, dont v4l2-ctl et v4l-info :
pi@raspberrypi ~ $ v4l2-ctl --list-devices
Philips 730 webcam (usb-bcm2708_usb-1.2):
/dev/video1
VF0530 Live! Cam Chat IM (usb-bcm2708_usb-1.3):
/dev/video0
pi@raspberrypi ~/webcams $ v4l-info /dev/video1
### v4l2 device info [/dev/video1] ###
general info
VIDIOC_QUERYCAP
driver : "pwc"
card : "Philips 730 webcam"
bus_info : "usb-bcm2708_usb-1.2"
version : 3.2.27
capabilities : 0x5000001 [VIDEO_CAPTURE,READWRITE,STREAMING]
pi@raspberrypi ~ $ v4l-info /dev/video0
### v4l2 device info [/dev/video0] ###
general info
VIDIOC_QUERYCAP
driver : "uvcvideo"
card : "VF0530 Live! Cam Chat IM"
bus_info : "usb-bcm2708_usb-1.3"
version : 3.2.27
capabilities : 0x4000001 [VIDEO_CAPTURE,STREAMING]
On note au passage le bus "BCM2708" : on est bien sur la Raspberry Pi, car la puce SoC Broadcom BCM2708 est le support de la puce CPU Broadcom BCM2835 qui équipe la carte.
Bon, pour la Philips, qui a déjà près de 10 ans, on reconnait le driver "pwc" spécialiste à ce constructeur.
Oh oh, ça sonne par contre plutôt bien pour la Creative, puisque la driver est "uvcvideo", c’est l’un des plus récents et des plus complets pour Linux. la capture vidéo et le streaming sont des capacités reconnues de ce modèle.
Il faut encore déterminer le type de format vidéo supporté. L’idéal serait le MJPEG (motion JPEG) à ne pas confondre avec le Mpeg des DVD et des DivX.
C’est de nouveau v4l2-ctl et ses nombreuses options qui nous renseigne :
pi@raspberrypi ~/webcams $ v4l2-ctl -d /dev/video0 --list-formats
ioctl: VIDIOC_ENUM_FMT
Index : 0
Type : Video Capture
Pixel Format: 'YUYV'
Name : YUV 4:2:2 (YUYV)
pi@raspberrypi ~/webcams $ v4l2-ctl -d /dev/video1 --list-formats
ioctl: VIDIOC_ENUM_FMT
Index : 0
Type : Video Capture
Pixel Format: 'PWC2' (compressed)
Name : Raw Philips Webcam
Index : 1
Type : Video Capture
Pixel Format: 'YU12'
Name : 4:2:0, planar, Y-Cb-Cr
Pas de MJPEG mais du YUYV sur la première et du PWC2 (Philips propriétaire) et du YU12.
On installe encore deux autres outils pour s’assurer de la qualité d’image :
– luvcview qui permet de regarder le flux vidéo (connectez-vous avec un serveur X si vous n’avez pas d’écran connecté à la Rpi).
– uvccapture qui permet de prendre une photo
Ils ne fonctionnent qu’avec les formats MJPEG, YUYV et UYV... donc la Philips n’a pas fonctionné !
Installation
Si vous avez passé les étapes ci-dessus, vous pourrez y revenir si votre caméra ne fonctionne pas à la fin de l’installation suivante.
Tout d’abord on récupère les sources. Si vous êtes un développeur régulier sur Raspberry (ou que vous souhaitez le devenir) vous pouvez installer Subversion, le logiciel de partage de sources puis récupérer le logiciel mjpg-streamer (révision 167 à l’heure d’écrire ces lignes) :
pi@raspberrypi ~ $ sudo apt-get install subversion
pi@raspberrypi ~ $ mkdir webcams
pi@raspberrypi ~ $ cd webcams
pi@raspberrypi ~/webcams $ svn co https://mjpg-streamer.svn.sourceforge.net/svnroot/mjpg-streamer mjpg-streamer
On vous la fait courte : mjpg-streamer a des dépendances nécessaires pour la compilation. Wolf Paulus a bien expliqué toutes ces étapes dans cet article de manière claire, bravo et merci à lui !
pi@raspberrypi ~/webcams $ sudo apt-get install libjpeg8-dev
pi@raspberrypi ~/webcams $ sudo apt-get install imagemagick
En observant la liste de tous les paquets installés, on se rend compte de l’énorme travail effectué par la communauté pour porter chaque projet sur les derniers matériels et les dernières distributions (ici, armhf).
Une fois la minute d’émotion passée (et après avoir envoyé un don de soutien à une association méritante dans la culture informatique...), on peut reprendre le cours de l’installation :
pi@raspberrypi ~/webcams $ cd mjpg-streamer/mjpg-streamer
pi@raspberrypi ~/webcams/mjpg-streamer/mjpg-streamer $ make
...
Une fois la compilation terminée, on lance le programme en lui passant diverses options, sur l’entrée (input) ou la sortie (output). En entrée, il faut dire qu’on ne peut utiliser que 320x240 sur cette caméra (testé avec luvcview) et qu’il faut le format YUYV. En sortie, on peut indiquer un port spécifique pour la liaison Internet, et préciser un login/mot de passe.
./mjpg_streamer -i "./input_uvc.so -y -r 320x240" -o "./output_http.so -w ./www"
C’est très très faible, mais ça vient de la webcam.
Pour tester, on se connecte depuis un navigateur du même réseau ou sur Internet une fois qu’on a configuré son boîtier ADSL pour que le port - 8080 par défaut - aille sur l’IP de sa Raspberry Pi.
Par exemple : http://192.168.0.15:8080/stream.html ce qui donne :
Et bien sûr on peut facilement modifier le contenu de la page, ou bien appeler le flux vidéo depuis une autre page d’un autre site.