Bauteil · Sensor
Raspberry-Pi-Kamera
Die Kamera für das CSI-Flachband eines Raspberry Pi statt USB – eigene Datenspur, Autofokus und der Sensor, den der meiste Roboter-Visionscode voraussetzt.
Was es ist
Ein kleines Sensorboard an einem Flachbandkabel, das an den CSI-Port des Raspberry Pi gehört – eine eigene Kameraschnittstelle, kein USB. Diese Unterscheidung ist der ganze Grund seiner Existenz. Das Pi eines Roboters trägt meist bereits WLAN, eine serielle Verbindung zum Motorcontroller und eventuell Speicher auf seinem USB-Bus; eine Kamera, die 1080p durch denselben Bus drückt, ist der Punkt, wo das aufhört zu funktionieren.
Für einen Roboter ist die Kamera der Sensor, der ändert, was möglich ist. Jeder andere Sensor dieser Seite meldet eine Zahl – eine Entfernung, einen Winkel, eine Reflexion. Eine Kamera meldet eine Szene – und das lässt einen Roboter erkennen, was etwas ist, statt nur dass etwas da ist.
Wie es funktioniert
Licht trifft den Sensor, und der Sensor streamt Rohzeilen über MIPI CSI-2 hinaus – eine schnelle Nahbereichs-Seriellverbindung – in die Bildpipeline des Pi. Das Pi macht aus den Rohzeilen ein brauchbares Bild: Debayering, Weißabgleich, Belichtung, Objektivschattierungskorrektur. Auf aktuellem Raspberry Pi OS erledigt das libcamera, mit rpicam-apps auf der Kommandozeile und Picamera2 in Python.
Zwei Folgen zählen für Roboter:
Die Pipeline kostet Zeit. Ein Bild liegt nicht im belichteten Augenblick vor. Bis dein Code es sieht, sind Dutzende Millisekunden vergangen – und ein fahrender Roboter ist gefahren. Jede auf Vision geschlossene Regelschleife muss um diese Verzögerung herum entworfen sein.
Belichtung ist automatisch, wenn man sie nicht stoppt. Autobelichtung ändert fröhlich die Helligkeit deiner Szene zwischen Bildern – in Ordnung für Fotografien und feindlich für einen Visionsalgorithmus, der auf Helligkeit schwellwertet. Belichtung und Verstärkung einfrieren, sobald das Licht steht.
Wann man sie verwendet
Zur Kamera greifen, wenn der Roboter eine Frage beantworten muss, die kein skalarer Sensor kann:
- Referenzmarker – ArUco-Tags liefern aus einem einzigen Bild eine volle 3D-Pose: der billigste Weg, einem Roboter eine echte Positionsbestimmung zu geben.
- Linienfolge in der echten Welt – eine Kamera sieht die Linie Meter voraus, wo ein Reflexionsarray nur sieht, was direkt darunter ist.
- Objekterkennung – einen Stuhl von einer Wand unterscheiden statt von beiden dieselben 40 cm zu lesen.
- Visuelles SLAM – eine Karte allein aus Bildern aufbauen.
Keine für Hindernisvermeidung hinzufügen. Ein VL53L0X beantwortet „wie weit?“ in 20 ms mit drei Codezeilen; eine Kamera beantwortet es schlechter, langsamer und mit hundertfachem Aufwand.
Verdrahtung und Fallstricke
- Das Band hat eine Orientierung. Die Silberkontakte zeigen zu den Steckerkontakten der Platine – am Pi heißt das: Die blaue Verstärkungslasche zeigt zur USB-/Ethernetseite. Falschherum eingesetzt wird die Kamera schlicht nicht erkannt, und nichts geht kaputt.
- Erst die Steckerverriegelung heben. Den Kunststoffkragen sanft hochziehen, das Band vollflächig gerade einsetzen, dann den Kragen zurückdrücken. Ein leicht schräg sitzendes Band meldet sich intermittierend – was wie eine defekte Kamera aussieht.
- Pi 5 und Zero brauchen das 22-polige Kabel. Dieselbe Kamera, schmalerer Stecker. Vor der Bestellung prüfen.
- Das Band von Motorverdrahtung fernhalten. Es ist eine ungeschirmte Hochgeschwindigkeitsverbindung neben allem anderen, das man ins Chassis gestopft hat; eingekoppeltes Motorrauschen zeigt sich als korrumpierte Bilder.
- Die Leistung budgetieren. Grob 250 mA zusätzlich zum Eigenbedarf des Pi – aus derselben Versorgung, die bei Knausern einbricht und die SD-Karte korrumpiert.
- Fokus ist eine Einstellung, nicht nur ein Ring. Bei Modul 3 jagt der Autofokus bei kontrastarmer Szene. Für einen Roboter, der immer auf etwa dieselbe Entfernung schaut, eine feste Fokusposition setzen und das Jagen mitten im Manöver stoppen.
Ein Modul wählen
| Modul | Sensor | Auflösung | Fokus | Bemerkenswert für einen Roboter |
|---|---|---|---|---|
| Modul 2 | IMX219 | 8 MP | Fest (manuell einstellbar) | Billig, vorhersehbar, kein Autofokus-Jagen |
| Modul 3 | IMX708 | 11,9 MP | Autofokus | Beste allgemeine Wahl; den Fokus für Robotik feststellen |
| Modul 3 Weit | IMX708 | 11,9 MP | Autofokus | 102° Sichtfeld – deutlich besser zur Navigation |
| HQ-Kamera | IMX477 | 12,3 MP | C-/CS-Objektive | Wenn man ein bestimmtes Objektiv oder Reichweite braucht |
| Global Shutter | IMX296 | 1,6 MP | C-/CS-Montierung | Die, die für einen fahrenden Roboter am meisten zählt |
Das Global-Shutter-Modul verdient eine ordentliche Erklärung – denn Rolling Shutter ist das am meisten unterschätzte Einzelproblem in Robotervision.
Ein Rolling-Shutter-Sensor belichtet Zeilen nacheinander statt alle zugleich – die Bildoberkante wird also wenige Millisekunden vor der Unterkante erfasst. An einer stationären Kamera ist das unsichtbar. An einem Roboter, der mit 90°/s dreht, wurden Ober- und Unterkante aus verschiedenen Winkeln aufgenommen – und gerade Vertikallinien kommen verzerrt heraus.
Für eine Markerposen-Pipeline ist das nicht kosmetisch. Die Ecken eines ArUco-Tags dienen dazu, seine Pose zu lösen – und wurden die Ecken bei vier leicht verschiedenen Roboterorientierungen erfasst, ist die berechnete Pose auf eine Art falsch, die keine Kalibrierung korrigiert. Macht dein Roboter Vision während der Fahrt, ist ein Global-Shutter-Sensor die Lösung – und die niedrigere Auflösung wert.
Einrichten, damit die Bilder brauchbar sind
Autobelichtung, Verstärkung und Weißabgleich sind hervorragend für Fotografie und aktiv schädlich für einen Visionsalgorithmus. Sie ändern die Zahlen, von denen deine Schwellen abhängen, zwischen Bildern – aus Gründen ohne Bezug zur Szene.
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
Der LensPosition-Wert steht in Dioptrien – dem Kehrwert der Fokusentfernung in Metern. Ein Roboter, der Dinge etwa 50 cm entfernt anschaut, will 2.0; ein Meter will 1.0; Unendlich ist 0.0. Explizit zu setzen stoppt das Autofokus-Jagen mitten im Manöver – das an einem fahrenden Roboter eine, zwei Sekunden verschwommene Bilder genau im falschen Moment erzeugt.
Auflösung, Bildrate und Latenz
Auflösung ist die Einstellung, die Leute zu hoch lassen – und sie kostet mehr als sie erwarten.
| Auflösung | Pixel | Relative Verarbeitungskosten | Geeignet für |
|---|---|---|---|
| 320×240 | 77 k | 1× | Linienfolge, Blob-Tracking |
| 640×480 | 307 k | 4× | ArUco-Marker, meiste Robotervision |
| 1280×720 | 922 k | 12× | Kleine oder ferne Marker |
| 1920×1080 | 2,07 M | 27× | Aufzeichnung, selten für Echtzeitregelung |
Ein Pi 4 mit ArUco-Erkennung bei 640×480 schafft bequeme 30 fps. Bei 1920×1080 fällt dieselbe Pipeline auf einstellige Werte – und jedes Bild ist bei Verarbeitung bereits alt. Die kleinste Auflösung verwenden, die das interessierende Merkmal noch auflöst – und bedenken, dass Erkennungsdistanz mit Auflösung skaliert: Wird ein Marker nicht weit genug erkannt, hilft höhere Auflösung wirklich, zu diesem Preis.
Das Latenzbudget
Das macht visionsbasierte Regelung schwer – und lohnt Ausschreiben:
| Stufe | Typisch |
|---|---|
| Belichtung | 10–30 ms |
| Sensorauslesung und CSI-Transfer | 5–15 ms |
| ISP-Pipeline (Debayering, Weißabgleich) | 5–10 ms |
| Eigene Verarbeitung | 10–50 ms |
| Gesamt, Bild zu Entscheidung | 30–105 ms |
Ein Roboter bei 0,3 m/s fährt in diesem Fenster 1–3 cm; bei 90°/s Drehung rotiert er 3–9°. Jede auf Vision geschlossene Regelschleife handelt dort, wo der Roboter war – und wer sie abstimmt, als wäre die Messung aktuell, erntet Schwingen.
Die praktischen Antworten sind dieselben wie überall in dieser Lage: Die Visionsschleife langsamer als die Regelschleife fahren und damit eine schnellere Koppelschätzung korrigieren – oder um die bekannte Latenz vorhersagen, bevor man die Messung nutzt. Genau diese Struktur baut der Pfad Pfadfolge für GPS auf, aus demselben Grund.
An einem Roboter montieren
Steif. Kamerakalibrierung erzeugt intrinsische Parameter – Brennweite, Hauptpunkt, Verzeichnung –, Eigenschaften dieser Kamera in dieser Halterung. Eine Halterung, die sich beim Beschleunigen biegt, entwertet die Kalibrierung fortlaufend – und Poseschätzungen wandern ohne sichtbaren Grund.
Weg von der Motorverdrahtung. Das CSI-Band ist eine ungeschirmte Hochgeschwindigkeits-Differenzialverbindung. Es entlang Motorleitungen zu führen koppelt Schaltrauschen ein – was sich als korrumpierte Bilder oder Kamera zeigt, die intermittierend verschwindet.
Mit zugentlastetem Band. Der Flachkabelstecker ist nicht für wiederholtes Biegen gemacht – und ein Roboter vibriert ständig. Das Band nahe beiden Enden festkleben, damit Vibration den Stecker nicht losarbeitet.
Leicht nach unten geneigt für einen Bodenroboter. Eine Kamera zum Horizont vergeudet die meisten Pixel an die Decke. Zehn bis zwanzig Grad nach unten legen den nützlichen Bildteil – den Boden voraus und alles darauf – in die Bildmitte.
Fehlersuche
| Symptom | Wahrscheinliche Ursache | Lösung |
|---|---|---|
| Kamera gar nicht erkannt | Band verkehrt herum | Silberkontakte zu den Platinenkontakten |
| Intermittierend erkannt | Band nicht voll oder gerade eingesetzt | Verriegelung heben, voll einsetzen, herunterdrücken |
No cameras available am Pi 5 |
Falsche Kabelbreite | Pi 5 und Zero brauchen das 22-polige Kabel |
| Bilder korrumpiert oder zerrissen | Motorrauschen auf dem Band | Weg von Motorleitungen führen; zugentlasten |
| Helligkeit ändert sich zwischen Bildern | Autobelichtung noch an | Belichtung und Verstärkung nach Einpendeln feststellen |
| Bild wird mitten im Manöver weich | Autofokus jagt | AfMode: 0 setzen und feste LensPosition |
| Vertikallinien verzerrt bei Drehung | Rolling Shutter | Drehung verlangsamen oder Global-Shutter-Modul |
| Bildrate kollabiert unter Last | Auflösung zu hoch | Auf 640×480 herunter; auf thermische Drosselung prüfen |
| Poseschätzungen driften ohne Ursache | Kamerahalterung biegt sich | Steif montieren; neu kalibrieren |
| Pi startet neu bei Kamerastart | Versorgung schafft ~250 mA extra nicht | Bessere Versorgung – das korrumpiert SD-Karten |
Kamera oder Entfernungssensor?
| Kamera | VL53L0X / HC-SR04 | |
|---|---|---|
| Beantwortet | Was da ist, wo, und seine Orientierung | Wie weit zum Nächsten |
| Latenz | 30–100 ms | 20–60 ms, ohne Verarbeitung |
| Benötigter Code | Eine Visionspipeline | Drei Zeilen |
| Rechenbedarf | Ein Prozessor der Pi-Klasse | Jeder Mikrocontroller |
| Versagt wenn | Dunkel, Gegenlicht, bewegungsverschmiert | Bestimmte Oberflächen (siehe jeweilige Seite) |
| Kosten | 25–50 $ plus Pi | 2–5 $ |
Die ehrliche Regel: Keine Kamera zur Hindernisvermeidung hinzufügen. Ein Entfernungssensor beantwortet diese Frage schneller, billiger und zuverlässiger – und jede Stunde, eine Kamera dazu zu bringen, ist eine Stunde weniger für das, was nur eine Kamera kann.
Eine Kamera hinzufügen, wenn man wissen muss, was etwas ist oder wo man ist – ein Objekt erkennen, einen Referenzmarker lesen für eine absolute Posenbestimmung, oder einer Linie folgen, die der Roboter Meter voraus sieht statt nur unter sich. Das ist mit skalarem Sensor wirklich unmöglich – und die ganze Pipeline wert.
Den Graphen erkunden
Verwendet in diesen Bauprojekten
Projekte, Lernpfade und Simulatoren, die Raspberry-Pi-Kamera verwenden.
Fragen
FAQ zu Raspberry-Pi-Kamera
Ist eine Pi-Kamera besser als eine USB-Webcam für Robotik?
Für einen Roboter meist ja – und der Grund ist der Stecker statt das Bild. Eine CSI-Kamera hat eine eigene Datenspur direkt in die Bildpipeline des Pi – konkurriert also nicht mit WLAN-Stick oder serieller Verbindung um USB-Bandbreite, und ihr Frametiming ist weit vorhersehbarer. Eine Webcam ist nur besser, wenn man ein langes Kabel braucht – CSI-Bänder sind kurz und fragil –, oder wenn die Kamera unverändert am Laptop funktionieren soll.
Welche Raspberry-Pi-Kamera soll ich für einen Roboter kaufen?
Kameramodul 3 für die meisten Roboter – Autofokus, Weitwinkeloption und aktuelle Softwareunterstützung. Die Weitwinkelvariante (102°) nehmen, wenn der Roboter Dinge nahe bei sich sehen muss – was zur Navigation fast immer gilt. Stattdessen die Global-Shutter-Kamera wählen, wenn der Roboter schnell fährt während er schaut, und die HQ-Kamera, wenn man ein bestimmtes Objektiv braucht. Kameramodul 2 ist weiter in Ordnung und billiger, wenn fester Fokus passt.
Warum verzerrt mein Kamerabild, wenn der Roboter dreht?
Rolling Shutter. Der Sensor liest Zeile für Zeile aus statt das ganze Bild auf einmal zu erfassen – was sich während des Auslesens bewegt, wird auf jeder Zeile an leicht anderer Stelle aufgezeichnet: Eine Drehung schert gerade Linien zu schrägen. Es zählt, weil Poseschätzung einen Zeitpunkt pro Bild annimmt. Belichtung verkürzen, den Roboter während der Messung langsamer fahren lassen oder die Global-Shutter-Kamera verwenden, die jede Zeile zugleich erfasst.
Nutzt der Pi 5 dasselbe Kamerakabel?
Nein – und das erwischt fast jeden. Pi 5 und die Zero-Modelle nutzen einen schmaleren 22-poligen Stecker, während Pi 4 und ältere den 15-poligen verwenden, der den meisten Kameras beiliegt. Die Kamera selbst ist dieselbe; man braucht das richtige Band oder einen Adapter. Der Pi 5 hat außerdem zwei Kamerastecker – kann also ein Stereopaar fahren.
Nutzt man noch die picamera-Bibliothek?
Nein – das ursprüngliche picamera-Modul wurde gegen einen Kamerastack geschrieben, der auf aktuellem Raspberry Pi OS nicht mehr existiert. Picamera2 verwenden, das auf libcamera sitzt, oder per OpenCV erfassen, sobald die Kamera als V4L2-Gerät erscheint. Die meisten Tutorials älter als wenige Jahre sind für die tote API geschrieben – der übliche Grund, warum ein kopiertes Snippet auf frischer Installation sofort scheitert.
Weiterführende Literatur