Composant · Capteur

Raspberry Pi Camera

La caméra qui se branche sur le ruban CSI d'un Raspberry Pi plutôt qu'en USB — voie dédiée, autofocus, et le capteur que le code de vision robotique suppose.

Présentation

Une petite carte capteur sur une nappe plate qui se connecte au port CSI du Raspberry Pi — une interface caméra dédiée, pas USB. Cette distinction est toute la raison de son existence. Le Pi d’un robot porte généralement déjà Wi-Fi, une liaison série vers un contrôleur de moteurs, et peut-être du stockage sur son bus USB ; une caméra poussant du 1080p sur le même bus est là où cela cesse de marcher.

Pour un robot, la caméra est le capteur qui change ce qui est possible. Tout autre capteur de ce site rapporte un nombre — une distance, un angle, une réflectance. Une caméra rapporte une scène, et c’est ce qui permet à un robot de reconnaître ce que quelque chose est plutôt que seulement que quelque chose est là.

Schéma légendé d'un module caméra Raspberry Pi : un petit circuit carré avec un barillet d'objectif noir monté au centre sur le capteur d'image, une nappe flexible plate partant du bord inférieur vers le connecteur CSI du Pi, des trous de montage aux coins, et des légendes pour l'objectif, le ruban CSI-2 et les contacts capteur au dos.
La carte caméra est surtout objectif et capteur : les données image partent sur le ruban CSI-2 par leur propre voie, sans toucher le bus USB qu'utilise le reste du robot. Télécharger le SVG

Fonctionnement

La lumière frappe le capteur, et le capteur diffuse des lignes brutes sur MIPI CSI-2 — une liaison série rapide à courte portée — vers le pipeline image du Pi. Le Pi convertit ces lignes brutes en image utilisable : dématriçage, balance des blancs, exposition, correction d’ombrage d’objectif. Sur Raspberry Pi OS actuel, c’est géré par libcamera, avec rpicam-apps en ligne de commande et Picamera2 en Python.

Deux conséquences comptent pour les robots :

Le pipeline coûte du temps. Une trame n’est pas disponible à l’instant où elle a été exposée. Quand votre code la voit, des dizaines de millisecondes ont passé, et un robot en mouvement a bougé. Toute boucle de commande bouclée sur la vision doit être conçue autour de ce retard.

L’exposition est automatique sauf si vous l’arrêtez. L’exposition auto changera volontiers la luminosité de votre scène entre trames, ce qui convient aux photos et est hostile à un algorithme de vision qui seuille sur la luminosité. Verrouillez exposition et gain une fois l’éclairage stabilisé.

Quand l’utiliser

Prenez une caméra quand le robot doit répondre à une question qu’un capteur scalaire ne peut pas :

  • Marqueurs fiduciaires — les tags ArUco donnent une pose 3D complète depuis une seule image, soit le moyen le moins cher de donner à un robot une vraie position.
  • Suivi de ligne dans le monde réel — une caméra voit la ligne des mètres devant, là où une barrette par réflectance ne voit que juste en dessous.
  • Reconnaissance d’objets — distinguer une chaise d’un mur, plutôt que lire les mêmes 40 cm des deux.
  • SLAM visuel — construire une carte depuis les images seules.

N’en ajoutez pas pour l’évitement d’obstacles. Un VL53L0X répond « à quelle distance ? » en 20 ms avec trois lignes de code ; une caméra y répond moins bien, plus lentement, et avec cent fois l’effort.

Câblage et pièges

  • Le ruban a un sens. Les contacts argentés font face aux contacts du connecteur de la carte — sur un Pi, cela signifie l’onglet bleu vers le côté USB/Ethernet. Insérée à l’envers, la caméra n’est simplement pas détectée, et rien n’est endommagé.
  • Soulevez d’abord le verrou du connecteur. Tirez doucement le collier plastique vers le haut, enfoncez le ruban bien d’équerre à fond, puis repoussez le collier. Un ruban inséré de biais s’énumère par intermittence, ce qui ressemble à une caméra fautive.
  • Le Pi 5 et le Zero veulent le câble 22 broches. Même caméra, connecteur plus étroit. Vérifiez avant de commander.
  • Gardez le ruban loin du câblage moteur. C’est une liaison haute vitesse non blindée courant à côté de tout ce que vous avez entassé dans le châssis ; le bruit moteur couplé dedans apparaît en trames corrompues.
  • Budgétez l’alimentation. Environ 250 mA en plus du tirage propre du Pi, depuis la même alimentation qui décroche et corrompt la carte SD si vous lésinez.
  • La mise au point est un réglage, pas juste une bague. Sur le Module 3, l’autofocus pompera si la scène est peu contrastée. Pour un robot qui regarde toujours à peu près à la même distance, fixez une position de mise au point et empêchez-le de pomper en manœuvre.

Choisir un module

Module Capteur Résolution Mise au point Notable pour un robot
Module 2 IMX219 8 MP Fixe (réglable manuellement) Économique, prévisible, pas de pompage d’autofocus
Module 3 IMX708 11,9 MP Autofocus Meilleur choix général ; verrouillez la mise au point pour la robotique
Module 3 Wide IMX708 11,9 MP Autofocus Champ de 102° — bien meilleur pour naviguer
Caméra HQ IMX477 12,3 MP Montures C/CS Quand il faut un objectif précis ou longue portée
Global Shutter IMX296 1,6 MP Monture C/CS Celle qui compte le plus pour un robot en mouvement

Le module à obturation globale mérite une vraie explication, car l’obturateur déroulant est le problème le plus sous-estimé de la vision robotique.

Un capteur à obturateur déroulant expose les lignes l’une après l’autre plutôt que toutes d’un coup, donc le haut d’une image est capturé quelques millisecondes avant le bas. Sur une caméra fixe, c’est invisible. Sur un robot tournant à 90°/s, le haut et le bas de l’image ont été pris depuis des angles différents, et les lignes verticales droites sortent biaisées.

Pour un pipeline de pose sur marqueurs, ce n’est pas cosmétique. Les coins d’un tag ArUco servent à résoudre sa pose, et si les coins ont été capturés à quatre orientations de robot légèrement différentes, la pose calculée est fausse d’une façon qu’aucun étalonnage ne corrige. Si votre robot fait de la vision en bougeant, un capteur à obturation globale est la correction, et il vaut la résolution moindre.

Le régler pour des images utilisables

Exposition, gain et balance des blancs automatiques sont excellents pour la photo et activement nuisibles pour un algorithme de vision. Ils changent les nombres dont vos seuils dépendent entre trames, pour des raisons sans rapport avec la scène.

from picamera2 import Picamera2
import time

picam = Picamera2()

# Small frames. 640x480 is plenty for markers and lines, and the pipeline
# cost scales with pixel count.
config = picam.create_video_configuration(
    main={"size": (640, 480), "format": "RGB888"},
    controls={"FrameDurationLimits": (33333, 33333)},   # lock to 30 fps
)
picam.configure(config)
picam.start()

# Let auto-exposure settle on the real scene, then freeze it.
time.sleep(2)
metadata = picam.capture_metadata()
picam.set_controls({
    "AeEnable": False,
    "AwbEnable": False,
    "ExposureTime": metadata["ExposureTime"],
    "AnalogueGain": metadata["AnalogueGain"],
    "AfMode": 0,                 # manual focus
    "LensPosition": 2.0,         # dioptres: 1/distance_in_metres
})

while True:
    frame = picam.capture_array()
    # ... your processing here

La valeur LensPosition est en dioptries — l’inverse de la distance de mise au point en mètres. Un robot regardant des choses à environ 50 cm veut 2.0 ; un mètre veut 1.0 ; l’infini vaut 0.0. La fixer explicitement empêche l’autofocus de pomper en manœuvre, ce qui sur un robot en mouvement produit une seconde ou deux d’images floues exactement au mauvais moment.

Résolution, cadence et latence

La résolution est le réglage laissé trop haut, et elle coûte plus que prévu.

Résolution Pixels Coût de traitement relatif Convient pour
320×240 77 k 1× Suivi de ligne, suivi de taches
640×480 307 k 4× Marqueurs ArUco, plupart de la vision robotique
1280×720 922 k 12× Marqueurs petits ou lointains
1920×1080 2,07 M 27× Enregistrement, rarement pour la commande temps réel

Un Pi 4 faisant de la détection ArUco en 640×480 tient un confortable 30 im/s. En 1920×1080, le même pipeline tombe à un chiffre, et chaque trame est périmée quand elle est traitée. Utilisez la plus petite résolution qui résout encore le détail voulu, et rappelez-vous que la distance de détection croît avec la résolution — si un marqueur n’est pas détecté d’assez loin, monter la résolution aide vraiment, à ce prix.

Le budget de latence

C’est ce qui rend la commande basée vision dure, et cela vaut d’être écrit :

Étape Typique
Exposition 10–30 ms
Lecture capteur et transfert CSI 5–15 ms
Pipeline ISP (dématriçage, balance des blancs) 5–10 ms
Votre traitement 10–50 ms
Total, image vers décision 30–105 ms

Un robot allant à 0,3 m/s parcourt 1–3 cm pendant cette fenêtre ; tournant à 90°/s, il pivote de 3–9°. Toute boucle de commande bouclée sur la vision agit sur où le robot était, et si vous la réglez comme si la mesure était actuelle, elle oscillera.

Les réponses pratiques sont les mêmes qu’ailleurs dans ce cas : faites tourner la boucle vision plus lentement que la boucle de commande et servez-vous-en pour corriger une estimation à l’estime plus rapide, ou prédisez en avant de la latence connue avant d’utiliser la mesure. C’est exactement la structure que la voie suivi de trajectoire construit pour le GPS, et pour la même raison.

La monter sur un robot

Rigidement. L’étalonnage caméra produit des paramètres intrinsèques — focale, point principal, distorsion — qui sont des propriétés de cette caméra dans ce montage. Un support qui fléchit quand le robot accélère invalide l’étalonnage en continu, et les estimations de pose errent sans raison visible.

Loin du câblage moteur. Le ruban CSI est une liaison différentielle haute vitesse non blindée. Le passer le long de fils moteur y couple du bruit de commutation, qui apparaît en trames corrompues ou caméra disparaissant par intermittence.

Avec le ruban soulagé en traction. Le connecteur du câble plat n’est pas prévu pour des flexions répétées, et un robot vibre en permanence. Scotchez le ruban près des deux bouts pour que les vibrations ne desserrent pas le connecteur.

Légèrement inclinée vers le bas pour un robot au sol. Une caméra pointée vers l’horizon dépense la plupart de ses pixels au plafond. Dix à vingt degrés vers le bas mettent la partie utile de la scène — le sol devant, et ce qui s’y trouve — au milieu de l’image.

Dépannage

Symptôme Cause probable Solution
Caméra pas détectée du tout Ruban à l’envers Contacts argentés vers les contacts de la carte
Détectée par intermittence Ruban pas enfoncé à fond ou d’équerre Soulevez le verrou, réenfoncez à fond, repoussez
No cameras available sur un Pi 5 Mauvaise largeur de câble Pi 5 et Zero veulent le câble 22 broches
Trames corrompues ou déchirées Bruit moteur sur le ruban Éloignez-le des fils moteur ; soulagez-le
La luminosité change entre trames Exposition auto encore active Verrouillez exposition et gain après stabilisation
L’image ramollit en manœuvre Autofocus qui pompe Mettez AfMode: 0 et une LensPosition fixe
Lignes verticales biaisées en tournant Obturateur déroulant Ralentissez le virage, ou prenez un module à obturation globale
La cadence s’effondre en charge Résolution trop haute Descendez en 640×480 ; vérifiez l’étranglement thermique
Estimations de pose dérivant sans cause Monture caméra fléchissant Montez rigidement ; réétalonnez
Le Pi redémarre au démarrage caméra L’alimentation ne couvre pas les ~250 mA supplémentaires Meilleure alimentation — cela corrompt les cartes SD

Caméra ou capteur de distance ?

Caméra VL53L0X / HC-SR04
Répond Ce qu’il y a, où, et son orientation À quelle distance est la chose la plus proche
Latence 30–100 ms 20–60 ms, sans traitement
Code requis Un pipeline de vision Trois lignes
Calcul Un processeur classe Pi Tout microcontrôleur
Échoue quand Sombre, contre-jour, flou de bougé Surfaces particulières (voir chaque page)
Coût 25–50 $ plus un Pi 2–5 $

La règle honnête : n’ajoutez pas de caméra pour l’évitement d’obstacles. Un capteur de distance répond à cette question plus vite, moins cher et plus sûrement, et chaque heure passée à le faire faire par une caméra est une heure non passée sur ce que seule une caméra peut faire.

Ajoutez une caméra quand il faut savoir ce que quelque chose est, ou où vous êtes — reconnaître un objet, lire un marqueur fiduciaire pour obtenir une position absolue, ou suivre une ligne que le robot voit des mètres devant plutôt que seulement sous lui. C’est vraiment impossible avec un capteur scalaire, et cela vaut tout le pipeline.

Explorer le graphe

Utilisé dans ces réalisations

Projets, parcours d'apprentissage et simulateurs qui intègrent le composant Raspberry Pi Camera.

Questions

FAQ : Raspberry Pi Camera

Une caméra Pi vaut-elle mieux qu'une webcam USB pour la robotique ?

Pour un robot, généralement oui, et la raison est le connecteur plutôt que l'image. Une caméra CSI a sa propre voie de données directe vers le pipeline image du Pi, donc elle ne rivalise pas avec une clé Wi-Fi ou une liaison série pour la bande passante USB, et sa temporisation de trames est bien plus prévisible. Une webcam est le meilleur choix seulement quand il faut un long câble — les rubans CSI sont courts et fragiles — ou quand la caméra doit marcher inchangée sur un portable.

Quelle caméra Raspberry Pi acheter pour un robot ?

Le module caméra 3 pour la plupart des robots — autofocus, option grand-angle, et prise en charge logicielle actuelle. Prenez la version large (102°) si le robot doit voir les choses près de lui, ce qui est presque toujours vrai en navigation. Choisissez plutôt la caméra Global Shutter si le robot bouge vite en regardant, et la caméra HQ s'il faut un objectif précis. Le module caméra 2 reste correct et moins cher si la mise au point fixe vous convient.

Pourquoi mon image se déforme quand le robot tourne ?

Obturateur déroulant. Le capteur lit une ligne à la fois au lieu de capturer toute l'image d'un coup, donc tout ce qui bouge pendant la lecture est enregistré à un endroit légèrement différent sur chaque ligne — un virage cisaille les lignes droites en obliques. Cela compte car l'estimation de pose suppose un instant par image. Raccourcissez l'exposition, ralentissez le robot en mesurant, ou utilisez la caméra Global Shutter, qui capture chaque ligne d'un coup.

Le Pi 5 utilise-t-il le même câble caméra ?

Non, et cela piège presque tout le monde. Le Pi 5 et les modèles Zero utilisent un connecteur plus étroit à 22 broches, tandis que le Pi 4 et antérieurs utilisent celui à 15 broches livré avec la plupart des caméras. La caméra elle-même est la même ; il faut le bon ruban ou un adaptateur. Le Pi 5 a aussi deux connecteurs caméra, donc il peut faire marcher une paire stéréo.

Utilise-t-on encore la bibliothèque picamera ?

Non — le module picamera d'origine visait une pile caméra qui n'existe plus sur Raspberry Pi OS actuel. Utilisez Picamera2, assise sur libcamera, ou capturez via OpenCV une fois la caméra vue comme périphérique V4L2. La plupart des tutoriels de plus de quelques années visent l'API morte, raison habituelle pour laquelle un extrait copié échoue aussitôt sur une installation fraîche.

Pour aller plus loin

Références