En raison de son relativement faible coût et de la simplicité de sa commande, Kinect reste populaire en robotique, alors que Microsoft a abandonné cette technologie il y a longtemps.
Depuis quelque temps déjà, pieye propose sous le nom de Nimbus 3D un module de caméra ToF conçu pour transformer un RPi en caméra de profondeur. Je n’ai pas résisté à la tentation de bidouiller avec. Sous [1] on trouvera une comparaison de différents systèmes de capteurs de profondeur basés sur les capteurs Kinect.

Matériel

La caméra est livrée dans un emballage assez compact, qui comprend la carte proprement dite, un câble plat et deux vis, ainsi que l'entretoise imprimée en 3D (fig. 1).

Figure 1. L'impression 3D est passée dans les mœurs.

En raison du volume des données à transmettre par le capteur, la communication entre la carte et l'ordinateur monocarte se fait par le port de la caméra. Il faut s'assurer que le connecteur de la caméra du RPi est connecté au câble plat. Connectez ensuite la carte au port GPIO, installez les vis (un peu de travers) (fig. 2).

Figure 2 : Le scanner de profondeur est maintenant prêt à être utilisé en principe.

Sur mon Raspberry Pi 4, après avoir enfiché les connecteurs GPIO et monté les vis, j’ai constaté un écart d'environ un demi-millimètre. Les entretoises noires (imprimées en 3D) semblent un peu trop longues. Un problème facile à résoudre avec une limite ou une mini-meuleuse.

Mise en service

Pour les utilisateurs, le matériel très rapide a souvent l’inconvénient sur les ordinateurs unixoïdes, de n’être accessible que par les modules du noyau et d'autres éléments difficiles à configurer. Dans le cas de Nimbus 3D, c’est plus facile, car une instance de ownCloud est fournie avec un fichier image prêt à l'emploi. Le fabricant fournit une mise à jour qui prend en charge le Raspberry Pi 4 et un dépôt GitHub. Si vous téléchargez votre image sous [3], le débit de données pourra être élevé alors que le service Nextcloud est parfois un peu lent (fig. 3).

Figure 3 : Si vous téléchargez depuis GitHub, le débit sera plus élevé - l'instance ownCloud est parfois un peu boiteuse.

Un test de l'image nimbus_rpi3_rpi4_v0.1.78_d998e541_shrink.img.gz sur une carte SD dans un RPi 4 semble avoir fonctionné après la mise à jour, mais j’ai continué avec un RPi 3B+. Le système a redémarré une fois, puis j’ai eu le terminal (fig. 4).

Figure 4. Avec l'image fournie, l'accès au bureau est spartiate.

Pour la configuration proprement dite, une connexion internet est requise et il faut un moniteur connecté par HDMI pour vérifier la sortie. Nimbus 3D n'est pas un système autonome. Un RPi est plutôt conçu - comme un Kinect - comme une caméra qui transmet des informations "enregistrées" par elle à un poste de travail. En raison de la fréquence de trame élevée, une connexion Ethernet Gbit entraîne ici une latence moindre. L'alimentation électrique nécessite un bloc d'alimentation extrêmement puissant : l'utilisation du bloc d'alimentation officiel ou d'un véritable équivalent permet d'éviter les problèmes.
La tâche suivante consiste à déterminer l'adresse IP du Raspberry Pi et à ouvrir la page web associée dans le navigateur d'un autre PC. Si vous utilisez Ubuntu, comme je le fais, et que votre Raspberry Pi et votre PC sont sur le même réseau, vous pourrez utiliser NMAP pour le rechercher :

tamhan@TAMHAN18:~$ nmap -sP 192.168.1.0/24

Starting Nmap 7.60 ( https://nmap.org ) at 2020-08-11 06:06 CEST

Nmap scan report for sagemcom (192.168.1.1)

Host is up (0.00055s latency).

Nmap scan report for raspberrypi (192.168.1.66)

Host is up (0.0015s latency).

Nmap scan report for TAMHAN18 (192.168.1.68)

Ça ne marche que si le routeur émet des adresses IP au client du réseau à partir de l'adresse de base 192.168.1.x. Si l'adresse de base est différente, il faut adapter les paramètres. Une fois la connexion établie, la page web apparaît (fig. 5).

Figure 5. Le balayage fonctionne bien.

On voit ma main et un fil au plafond. Ce n'est pas surprenant puisque la fiche technique promet une résolution de 352 × 288 pixels avec un champ de 0,1 à 3 m.
L'expérience montre que les capteurs de profondeur sont moins à l’aise avec le champ rapproché. Comme je venais d'ouvrir un Tektronix 577, en voici deux images ((fig. 6 et 7). Avec les LED d’éclairage, les plans rapprochés sont surexposés.

Figure 6. Un Tektronix 577 ouvert.
Figure 7. Le Tektronix 577 sous un angle différent.

Ne soyez pas surpris que la lumière rouge des LED de la carte paraisse faible, ce sont des LED infrarouges. Pour vérifier qu'elles fonctionnent, l’appareil photo d’un téléphone tactile fait l’affaire. Il faut tenir compte de la relativement forte dissipation de puissance. Ça chauffe ! La température ambiante dans mon bunker tempéré est de 20 °C, mais la température du Raspberry Pi, pourtant complètement ouvert sur la table, atteignait 70 °C. Pas question de priver la Framboise de son radiateur !
 
L'affichage des informations de profondeur dans le navigateur peut être intéressant, mais la question est de savoir si cela justifie le prix de près de 230 €. Il existe heureusement une bibliothèque Python [4] qui permet aux concepteurs d'intégrer les informations de profondeur dans leurs propres applications. Le fournisseur utilise des sockets web pour la communication – une procédure qui requiert Python 3 version 3.6 ou supérieure. J'ai utilisé Ubuntu 18.04 LTS pour les étapes suivantes avec la version 3.6.9 de Python sur mon PC.
Dans l'étape suivante, j’utilise le gestionnaire de paquets PIP, inclus dans Python. Veillez à utiliser PIP3 et non la version PIP incluse dans Python 2.X par erreur.

tamhan@TAMHAN18:~$ pip3 install nimbus-python

. . .

Successfully installed certifi-2020.6.20 chardet-3.0.4 idna-2.10 nimbus-python-0.0.4 numpy-1.19.1 requests-2.24.0 urllib3-1.25.10 websockets-8.1

Voici un programme test pour une première tentative de programmation simple :

from nimbusPython import NimbusClient

cli = NimbusClient.NimbusClient("192.168.1.66")

header, (ampl, radial, x, y, z, conf) = cli.getImage(invalidAsNan=True)

Après l'importation de la bibliothèque Nimbus, un objet client est créé qui encapsule la connexion au Raspberry Pi servant de caméra. Ensuite, on appelle la méthode getImage qui renvoie un groupe de vecteurs avec les données de profondeur que l’on traite ensuite comme on veut. J'utiliserai MatPlotLib pour cela. Ce programme et le reste de la bibliothèque Python ont bien fonctionné lors de mes tests. Parfois, l'établissement de la connexion était impossible, et j'ai donc dû interrompre le processus sans ménagements.
 

Digression : l'environnement

Le manuel a beau recommander fortement l'utilisation du micrologiciel fourni, je tenais à faire mes propres expériences. Pour cela, j'ai décidé d'utiliser un Raspberry Pi 4 équipé du firmware 2020-08-20-raspios-buster-armhf-full.img. Ce qui passe par la mise à jour de l'environnement de travail de bas niveau au moyen des commandes suivantes :

pi@raspberrypi:~ $ sudo apt-get update

pi@raspberrypi:~ $ sudo apt-get upgrade

pi@raspberrypi:~ $ sudo rpi-update

Puis il faut ajouter le dossier source du paquet. Pour cela, j'ai ajouté la commande deb http://apt.pieye.org/debian/ nimbus-stable main au fichier /etc/apt/sources.list avec les droits de super-utilisateur, puis j'ai exécuté la commande suivante pour ajouter une clé SSH :
 

wget -O - -q http://apt.pieye.org/apt.pieye.org.gpg.key | sudo apt-key add -

sudo apt-get update

Après le redémarrage obligatoire, la déclaration DTOverlay suivante est à nouveau ajoutée à la fin du fichier /boot/config.txt avec les droits de super-utilisateur.

[all]

#dtoverlay=vc4-fkms-v3d

dtoverlay=irs1125

Maintenant, j'ai pu installer le serveur responsable de la livraison des images de profondeur - assurez-vous d'activer le bus I2C en raspi-config sur le côté (sudo raspi-config -> 5 Interfacing Options -> P5 I2C) :

pi@raspberrypi:~ $ sudo apt-get install nimbus-server

Ensuite, un redémarrage est nécessaire. Les commandes suivantes permettent de télécharger l'interface web et d'installer les services du serveur Unix nécessaires à son traitement :
 
pi@raspberrypi:~ $ sudo systemctl start nimbusServer.service

pi@raspberrypi:~ $
  sudo apt-get install nginx git

pi@raspberrypi:~ $ git clone https://github.com/pieye/nimbus-web.git

Enfin, j'ai dû éditer le fichier /etc/nginx/sites-available/default et faire pointer la déclaration racine vers les éléments téléchargés depuis GitHub comme suit :
 
root /home/pi/nimbus-web;

Il ne manquait plus que la saisie du service sudo nginx restart pour redémarrer le serveur web et rendre l'interface web accessible à l'adresse IP du Pi. J'ai appelé ce service via mon PC et j'ai été confronté à trois écrans noirs. Une analyse de l'état du service a montré que, peu après l'appel, le service était mort, me laissant avec l'écran en deuil (fig. 8). Cette erreur est due à une incompatibilité entre le noyau et le pilote, elle est connue du fabricant et mainte fois corrigée.

Figure 8 : Le serveur sur le point de faire ses adieux.

Le jeu vaut-il la chandelle ?

Il ne fait aucun doute qu'avec Nimbus 3D, pieye propose un capteur de profondeur abordable (même comparé au Kinect) et que ses résultats sont impressionnants. Si vous avez besoin d'un scanner de profondeur compact, il n'y a guère de choix dans ce domaine. Il existe de meilleurs capteurs pour les applications militaires, mais il faut le budget idoine.
Les qualités du produit que j’ai examiné sont indéniables, mais je lui trouve aussi des aspects qui pourraient être améliorés. Je déplore ainsi l’absence de connexion pour alimenter la carte directement ou par un bloc d'alimentation. Un meilleur logiciel Python serait bienvenu aussi.
J'espère avoir réussi à vous donner par ce banc d’essai une idée approximative de ce à quoi vous pouvez vous attendre avec ce capteur.


► Elektor est réputé pour la qualité de son contenu. En voulez-vous davantage ?

Abonnez-vous maintenant au magazine Elektor et ne manquez plus jamais ni aucun de ces articles précieux ni aucun de ces projets géniaux.