Component · Sensor
Raspberry Pi Camera
De camera die via de CSI-ribbon aan de Raspberry Pi gaat in plaats van USB — eigen datalaan, autofocus en de sensor die de meeste robotvisiecode verwacht.
Wat het is
Een klein sensorbord aan een platte ribbonkabel dat aansluit op de CSI-poort van de Raspberry Pi — een aparte camera-interface, geen USB. Dat onderscheid is de hele reden dat de camera bestaat. Een robot-Pi heeft meestal al Wi-Fi, een seriële verbinding met een motorbesturingseenheid en soms opslag op zijn USB-bus; een camera die 1080p over dezelfde bus stuurt, is het punt waarop het misgaat.
Voor een robot is de camera de sensor die verandert wat mogelijk is. Alle andere sensoren op deze site geven één getal — een afstand, een hoek, een reflectie. Een camera geeft een scène, en zo kan een robot herkennen wat iets is, niet alleen dat er iets is.
Hoe het werkt
Licht valt op de sensor en de sensor stuurt ruwe beeldregels via MIPI CSI-2 — een onafgeschermde snelle gegevensverbinding voor korte afstand — naar de beeldpijplijn van de Pi. De Pi zet die ruwe regels om in een bruikbaar beeld: debayering, witbalans, belichting en correctie voor ongelijke belichting door de lens. Op de huidige Raspberry Pi OS regelt libcamera dat, met rpicam-apps op de opdrachtregel en Picamera2 in Python.
Twee gevoligen zijn belangrijk voor robots:
De pijplijn kost tijd. Een beeld is niet beschikbaar op het moment waarop het is belicht. Tegen de tijd dat je code het ziet, zijn er tientallen milliseconden verstreken en heeft een bewegende robot zich verplaatst. Elke regellus die visuele informatie gebruikt, moet rekening houden met die vertraging.
De belichting is automatisch tenzij je die stopt. Automatische belichting verandert graag de helderheid van je scène tussen beelden door, wat prima is voor foto’s maar nadelig is voor een beeldalgoritme dat drempelwaarden op de helderheid toepast. Stel belichting en versterking eenmaal vast wanneer het licht stabiel is.
Wanneer je hem gebruikt
Kies een camera wanneer de robot een vraag moet beantwoorden die een sensor die één scalaire waarde meet niet kan beantwoorden:
- Fiducialmarkers — ArUco-tags geven uit één beeld een volledige 3D-pose, de goedkoopste manier om een robot een echte positiebepaling te geven.
- Lijnvolgen in de echte wereld — een camera ziet de lijn meters vooruit, waar een reflectancesensorarray alleen ziet wat recht eronder ligt.
- Objectherkenning — een stoel van een muur onderscheiden, in plaats van bij beide dezelfde 40 cm af te lezen.
- Visuele SLAM — een kaart uitsluitend uit beelden opbouwen.
Voeg er geen toe voor obstakelvermijding. Een VL53L0X beantwoordt „hoe ver?“ binnen 20 ms met drie regels code; een camera doet dat slechter, langzamer en met honderd keer zoveel werk.
Aansluiting en aandachtspunten
- De ribbon heeft een oriëntatie. De zilveren contacten moeten naar de contacten van de connector op het bord wijzen — op een Pi betekent dat dat de blauwe steun aan de achterkant van de ribbon naar de USB-/Ethernetkant gericht moet zijn. Verkeerd geplaatst wordt de camera simpelweg niet gedetecteerd en er raakt niets beschadigd.
- Til eerst de vergrendeling op. Plaats de ribbon volledig recht en duw dezelfde plastic vergrendeling weer omlaag. Een ribbon die licht schuin zit, wordt soms niet herkend, wat op een defecte camera lijkt.
- De Pi 5 en Zero hebben de 22-pins kabel nodig. Dezelfde camera, smallere connector. Controleer dit voordat je bestelt.
- Houd de ribbon weg van motorbedrading. Het is een onafgeschermde snelle gegevensverbinding naast alles wat je in het chassis hebt gepropt; motorruis die erin koppelt, toont zich als beschadigde beelden.
- Houd rekening met het stroomverbruik. Reken op ongeveer 250 mA bovenop het eigen verbruik van de Pi; een te kleine voeding kan een brown-out veroorzaken en de SD-kaart beschadigen.
- Scherpstelling is een instelling, niet alleen een ring. Bij Module 3 zoekt de autofocus rustigjes als het contrast van de scène laag is. Stel voor een robot die altijd ongeveer dezelfde afstand kijkt een vaste scherpstelpositie in en voorkom dat de autofocus midden in een manoeuvre gaat zoeken.
Module kiezen
| Module | Sensor | Resolutie | Scherpstelling | Opvallend voor een robot |
|---|---|---|---|---|
| Module 2 | IMX219 | 8 MP | Vast (handmatig instelbaar) | Goedkoop, voorspelbaar, geen autofocus die zoekt |
| Module 3 | IMX708 | 11,9 MP | Autofocus | Beste algemene keuze; vergrendel de scherpstelling voor robotica |
| Module 3 Wide | IMX708 | 11,9 MP | Autofocus | Beeldhoek van 102° — veel beter voor navigatie |
| HQ Camera | IMX477 | 12,3 MP | C/CS-lenzen | Wanneer je een specifieke lens of groot bereik nodig hebt |
| Global Shutter | IMX296 | 1,6 MP | C/CS-mount | Het belangrijkste voor een bewegende robot |
De global-shuttermodule verdient uitleg, omdat rolling shutter het meest onderschatte probleem in robotvisie is.
Een sensor met rolling shutter belicht de regels na elkaar in plaats van allemaal tegelijk, waardoor de bovenkant van een beeld enkele milliseconden voor de onderkant wordt vastgelegd. Bij een stilstaande camera is dat onzichtbaar. Bij een robot die met 90°/s draait, zijn de boven- en onderkant van het beeld vanuit verschillende hoeken genomen en komen rechte verticale lijnen scheef uit.
Voor een pijplijn voor het bepalen van de markerpose is dat geen cosmetisch probleem. De hoeken van een ArUco-tag worden gebruikt om de pose te bepalen, en als die hoeken bij vier iets verschillende robotoriëntaties zijn vastgelegd, is de berekende pose fout op een manier die geen enkele kalibratie kan corrigeren. Als je robot visuele informatie gebruikt terwijl hij beweegt, is een global-shuttersensor de oplossing, en de lagere resolutie is dat waard.
Instellen zodat de beelden bruikbaar zijn
Automatische belichting, versterking en witbalans zijn uitstekend voor fotografie en nadelig voor een beeldalgoritme. Ze veranderen tussen beelden de getallen waarvan je dremelwaarden afhangen, om redenen die niets met de scène te maken hebben.
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
De waarde LensPosition staat in dioptrieën — het omgekeerde van de scherpstelafstand in meters. Een robot die naar dingen op ongeveer 50 cm afstand kijkt, wil 2.0; een robot op één meter wil 1.0; oneindig is 0.0. Door de waarde expliciet in te stellen, voorkom je dat de autofocus midden in een manoeuvre gaat zoeken, wat bij een bewegende robot een seconde of twee onscherpe beelden oplevert op precies het verkeerde moment.
Resolutie, beeldfrequentie en latentie
Mensen stellen de resolutie vaak te hoog in, en dat kost meer dan ze verwachten.
| Resolutie | Pixels | Relatieve verwerkingskosten | Geschikt voor |
|---|---|---|---|
| 320×240 | 77 k | 1× | Lijnvolgen, blobtracking |
| 640×480 | 307 k | 4× | ArUco-markers, de meeste robotvisie |
| 1280×720 | 922 k | 12× | Kleine of verre markers |
| 1920×1080 | 2,07 M | 27× | Opnemen, zelden voor real-time besturing |
Een Pi 4 die ArUco-detectie op 640×480 uitvoert, haalt comfortabel 30 fps. Bij 1920×1080 zakt dezelfde pijplijn naar enkele beelden per seconde, en elk beeld is verouderd tegen de tijd dat het verwerkt is. Gebruik de kleinste resolutie die de eigenschap die je zoekt nog kan onderscheiden, en onthoud dat de detectieafstand meegroeit met de resolutie — wordt een marker niet ver genoeg gedetecteerd, dan helpt een hogere resolutie echt, met de bijbehorende kosten.
Het tijdbudget voor de latentie
Dit is wat besturing op basis van beeld lastig maakt; het is de moeite waard om dit expliciet uit te werken:
| Etappe | Typisch |
|---|---|
| Belichting | 10–30 ms |
| Sensoruitlees en CSI-overdracht | 5–15 ms |
| ISP-pijplijn (debayer, witbalans) | 5–10 ms |
| Je eigen verwerking | 10–50 ms |
| Totaal, van beeld naar beslissing | 30–105 ms |
Een robot die met 0,3 m/s rijdt, legt in dat venster 1–3 cm af; bij 90°/s draait hij 3–9°. Elke regellus die visuele informatie gebruikt, reageert op waar de robot was, en als je die afstelt alsof de meting actueel is, zal hij oscilleren.
De praktische antwoorden zijn dezelfde als overal elders in deze situatie: laat de visuele lus langzamer lopen dan de regellus en gebruik hem om een snellere schatting op basis van dood rekenen te corrigeren, of voorspel met de bekende latentie vooruit voordat je de meting gebruikt. Dit is precies de regelstructuur die de padvolging voor GPS gebruikt, en om dezelfde reden.
Op een robot monteren
Stijf. Camerakalibratie levert intrinsieke parameters op — brandpuntsafstand, hoofdpunt, lensvervorming — die eigenschappen zijn van die camera in die montage. Een beugel die meebeweegt wanneer de robot versnelt, maakt de kalibratie voortdurend ongeldig, waardoor de poseschattingen zonder zichtbare reden dwalen.
Uit de buurt van de motorbedrading. De CSI-ribbon is een onafgeschermde snelle differentiële verbinding. Als die naast motorleidingen loopt, koppelt schakelruis erin en zie je beschadigde beelden of een camera die af en toe verdwijnt.
Beveilig de ribbon tegen trek. De connector van de platte kabel is niet ontworpen voor herhaald buigen, en een robot trilt voortdurend. Plak de ribbon bij beide uiteinden vast zodat vibratie de connector niet loswerkt.
Montage licht naar beneden gericht voor een grondrobot. Een camera die op de horizon richt, besteedt de meeste pixels aan het plafond. Tien tot twentig graden naar beneden zet het nuttige deel van de scène — de vloer vooruit en alles wat erop ligt — in het midden van het beeld.
Problemen oplossen
| Klacht | Waarschijnlijke oorzaak | Oplossing |
|---|---|---|
| Camera wordt helemaal niet gedetecteerd | Ribbon achterstevoren | Zilveren contacten naar de contacten van het bord |
| Soms wel, soms niet gedetecteerd | Ribbon niet volledig of recht geplaatst | Til de vergrendeling op, plaats de ribbon volledig opnieuw en druk de vergrendeling omlaag |
No cameras available op een Pi 5 |
Verkeerde kabelbreedte | Pi 5 en Zero hebben de 22-pins kabel nodig |
| Beelden zijn beschadigd of gescheurd | Motorruis op de ribbon | Leg de ribbon weg van motorleidingen en beveilig de ribbon tegen trek |
| Helderheid verandert tussen beelden | Automatische belichting staat nog aan | Vergrendel belichting en versterking na de stabilisatietijd |
| Beeld wordt tijdens een manoeuvre onscherp | Autofocus zoekt | Stel AfMode: 0 en een vaste LensPosition in |
| Verticale lijnen lopen scheef tijdens een draai | Rolling shutter | Draai langzamer of gebruik een global-shuttermodule |
| Beeldfrequentie daalt sterk | Resolutie te hoog | Ga terug naar 640×480; controleer of de processor door warmte wordt afgeremd |
| Poseschattingen dwalen zonder oorzaak | Cameramontage beweegt | Monteer stijf en kalibreer opnieuw |
| Pi herstart wanneer de camera start | Voeding dekt de extra ~250 mA niet | Gebruik een betere voeding; een te kleine voeding kan de SD-kaart beschadigen |
Camera of afstandssensor?
| Camera | VL53L0X / HC-SR04 | |
|---|---|---|
| Beantwoordt | Wat er is, waar het is en hoe het is georiënteerd | Hoe ver het dichtstbijzijnde voorwerp is |
| Latentie | 30–100 ms | 20–60 ms, zonder verwerking |
| Benodigde code | Een beeldverwerkingspijplijn | Drie regels |
| Rekenkracht | Een processor zoals in een Raspberry Pi | Elke microcontroller |
| Faalt bij | Donker, tegenlicht, bewegingsonscherpte | Specifieke oppervlakken (zie de afzonderlijke pagina’s) |
| Kosten | $25–50 plus een Pi | $2–5 |
De eerlijke regel: voeg geen camera toe voor obstakelvermijding. Een afstandssensor beantwoordt die vraag sneller, goedkoper en betrouwbaarder, en elk uur dat je een camera dit laat doen, is een uur die je niet besteedt aan het ding dat alleen een camera kan.
Voeg een camera toe wanneer je moet weten wat iets is, of waar je bent — een object herkennen, een fiducialmarker uitlezen voor een absolute posebepaling, of een lijn volgen die de robot meters vooruit ziet in plaats van alleen onder zichzelf. Dat zijn dingen die met een sensor die één scalaire waarde meet echt onmogelijk zijn, en voor deze mogelijkheden is de extra verwerkingspijplijn de moeite waard.
Verken de graaf
Gebruikt in deze bouwprojecten
Projecten, leerroutes en simulators waarin de Raspberry Pi Camera voorkomt.
Vragen
FAQ over de Raspberry Pi Camera
Is een Pi-camera beter dan een USB-webcam voor robotica?
Voor een robot meestal wel, en de reden is de connector in plaats van het beeld. Een CSI-camera heeft een eigen datalaan rechtstreeks naar de beeldpijplijn van de Pi en concurreert dus niet met een Wi-Fi-dongle of een seriële verbinding om USB-bandbreedte; ook is de timing van de beelden veel voorspelbaarder. Een webcam is alleen de betere keuze wanneer je een lange kabel nodig hebt — CSI-ribbons zijn kort en kwetsbaar — of wanneer de camera zonder wijzigingen ook op een laptop moet werken.
Welke Raspberry Pi-camera moet ik voor een robot kopen?
Voor de meeste robots Camera Module 3 — autofocus, een groothoekoptie en actuele softwareondersteuning. Neem de brede versie (102°) als de robot dingen dicht bij zichzelf moet zien, wat voor navigatie vrijwel altijd geldt. Kies in plaats daarvan de Global Shutter-camera als de robot snel beweegt terwijl hij kijkt, en de HQ-camera als je een specifieke lens nodig hebt. Camera Module 2 is nog steeds prima en goedkoper als een vaste scherpstelling je bevalt.
Waarom loopt mijn camerabeeld scheef wanneer de robot draait?
Rolling shutter. De sensor leest de beeldregels één voor één uit in plaats van het hele beeld tegelijk vast te leggen, waardoor alles wat tijdens de uitlees beweegt op elke regel op een iets andere plek wordt opgenomen — een draaiing maakt rechte lijnen scheef. Dat is belangrijk omdat posebepaling één moment per beeld aanneemt. Gebruik een kortere belichtingstijd, meet langzamer of gebruik de Global Shutter-camera, die elke regel tegelijk vastlegt.
Gebruikt de Pi 5 dezelfde camerakabel?
Nee, en dat betrapt bijna iedereen. De Pi 5 en de Zero-modellen gebruiken een smallere 22-pins connector, terwijl de Pi 4 en oudere modellen de 15-pins connector gebruiken die met de meeste camera's wordt geleverd. De camera zelf is dezelfde; je hebt de juiste ribbon of een adapter nodig. De Pi 5 heeft bovendien twee camera-aansluitingen en kan dus een stereopaar gebruiken.
Gebruik ik de picamera-bibliotheek nog?
Nee — de oorspronkelijke picamera-module was geschreven voor een camerastack die op de huidige Raspberry Pi OS niet meer bestaat. Gebruik Picamera2, dat op libcamera draait, of maak opnames via OpenCV zodra de camera als V4L2-apparaat verschijnt. De meeste handleidingen van meer dan een paar jaar geleden zijn geschreven voor de verouderde API, en dat is meestal de reden dat gekopieerde code op een verse installatie meteen mislukt.
Verder lezen