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à.
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