Hoe werkt camera navigatie vSLAM? Technologie stap voor stap uitgelegd
Je robotstofzuiger navigeert niet zomaar rondjes. Hij bouwt een digitale plattegrond van je huis en onthoudt waar de bank staat, waar de kabels liggen en waar hij niet mag komen. Dat doet hij met vSLAM: Visual Simultaneous Localisation and Mapping. In deze handleiding leg ik je precies uit hoe dat werkt, wat je nodig hebt en welke fouten je moet vermijden.
Wat je nodig hebt: Materialen en voorwaarden
Voordat je begint, check je of je de juiste hardware en software bij de hand hebt. Zonder goede camera en rekenkracht faalt vSLAM.
- Camera-module: Minimaal 720p met 30 fps, bij voorkeur 1080p. Groothoeklens (120°+) geeft meer herkenningspunten.
- Processor: Quad-core ARM (minimaal 1.5 GHz) of een dedicated AI-chip zoals Rockchip RK3399 of Qualcomm Snapdragon. Een Raspberry Pi 4 werkt voor prototypes, maar is traag.
- Geheugen: Minimaal 2 GB RAM, liever 4 GB. vSLAM is geheugenintensief.
- Accu: 5000 mAh of meer voor minimaal 60 minuten testen.
- Sensoren: IMU (gyroscoop + accelerometer) voor versnellingsdata. Optioneel: odometrie (wielencoders).
- Software: OpenCV, ROS2 (Robot Operating System) en een vSLAM-pakket zoals ORB-SLAM3, VINS-Fusion of OpenVSLAM.
- Verlichting: Voldoende, gelijkmatig licht. Vermijd felle zon of diepe schaduwen.
- Testruimte: Een kamer van minimaal 4x4 meter met voldoende visuele kenmerken (meubels, wanddecoratie, tapijtstructuur).
Pro-tip: Gebruik een Intel RealSense D435 of StereoPi voor diepte-informatie. Diepte maakt vSLAM stabieler en minder gevoelig voor bewegingsonscherpte.
Stap 1: Hardware-calibratie en sensor synchronisatie
Elke stap begint met een goede kalibratie. Anders bouw je een digitale plattegrond die scheef is of niet klopt.
- Camera kalibreren: Gebruik een checkerboard-patroon (8x6 vierkanten, 25 mm groot). Maak 20 foto’s vanuit verschillende hoeken. Draai de
calibrate_camera.pyuit OpenCV. Doel: lensdistorsie onder 0.5% en focal length nauwkeurig tot 1 pixel. - IMU synchroniseren: Zet de IMU op 100 Hz. Meet de bias met een rustende sensor gedurende 10 seconden. Sla de waarden op voor correctie.
- Tijdssynchronisatie: Gebruik NTP of PTP om camera en IMU op < 1 ms synchronisatie te brengen. Onsync betekent drift.
- Odometrie testen: Rijd 1 meter rechtuit. Check of de encoder-ticks kloppen (bijv. 2000 ticks per meter).
Tijdsindicatie: 30-45 minuten.
Veelgemaakte fout: Kalibratie overslaan en direct starten.
Resultaat: je map is vervormd en de robot “ziet” muren die er niet zijn.
Stap 2: Beeldverwerking en kenmerkextractie
De camera levert beelden, maar voor een goede werking van vSLAM zijn specifieke punten nodig om te volgen.
- Frame capture: Haal 30 frames per seconde op. Buffer maximaal 3 frames om latency te beperken.
- Voorbewerking: Converteer naar grijswaarden, pas histogram-equalisatie toe en reduceer ruis met een 3x3 Gaussian blur.
- Kenmerken detecteren: Gebruik ORB (Oriented FAST and Rotated BRIEF) of SIFT. ORB is sneller (ca. 5-10 ms per frame op ARM), SIFT is accurater maar trager (20-40 ms).
- Matchen: Vergelijk kenmerken tussen frame N en N-1 met Brute-Force of FLANN matcher. Bewaar alleen matches met een afstandsverhouding > 0.7.
Die haal je uit beeldkenmerken. Tijdsindicatie: 15-20 minuten coderen, 5 ms per frame draaitijd.
Veelgemaakte fout: Te veel kenmerken matchen in homogene gebieden (witte muren). Filter op hoekdetectie en textuur.
Stap 3: Tracking en pose-estimatie
Nu we weten welke punten bij elkaar horen, berekenen we de positie. Meer weten? Lees de veelgestelde vragen over camera navigatie. Tijdsindicatie: 20-30 minuten testen en tunen.
Veelgemaakte fout: Te weinig Bundle Adjustment, waardoor de pose langzaam afglijdt. Check de residual error: die moet onder 1 pixel blijven.
- Initialiseer: Zet de eerste frame als referentie (wereldcoördinaten (0,0,0)).
- Pose schatten: Gebruik PnP (Perspective-n-Point) of ICP (Iterative Closest Point) om de camera-positie t.o.v. de vorige pose te schatten. Voeg IMU-data toe voor stabiliteit.
- Bundle Adjustment: Optimaliseer de pose en de 3D-punten met niet-lineaire least-squares. Gebruik Ceres Solver of g2o. Loop dit elke 5-10 frames.
- Keyframe selectie: Sla een frame op als keyframe als de beweging > 15 cm of rotatie > 10° is. Te veel keyframes = geheugen vol, te weinig = drift.
Stap 4: Mapping en localisatie
De robot bouwt nu een kaart en kan zich lokaliseren.
- 3D-puntenwolk opbouwen: Zet gematchte punten om naar 3D-coördinaten (X,Y,Z) via triangulatie. Gebruik diepte-indien beschikbaar (RealSense).
- Map filteren: Pas voxel-downsampling toe (grootte 0.05 m) om de puntenwolk compact te houden. Verwijder outliers met statistical outlier removal (k=30, threshold=1.0).
- Globalisatie: Gebruik loop-closing om te detecteren of je al eerder bent geweest. Herkenning via BoW (Bag of Words) op ORB-kenmerken. Sluit de lus en optimaliseer de hele map.
- Lokalisatie: Als de map af is, herken je de positie met PnP op basis van de huidige kenmerken vergeleken met de map.
Tijdsindicatie: 30-45 minuten voor een stabiele map van 4x4 m.
Veelgemaakte fout: Map niet filteren, waardoor je 100k+ punten moet verwerken en de robot traag wordt. Dit geldt zowel voor LiDAR als camera gebaseerde systemen.
Ervaring: In een typisch Nederlands huis met laminaat en een laag tapijt werkt ORB-SLAM3 het best. SIFT voegt weinig toe tenzij je in slecht verlichte gangen werkt.
Stap 5: Foutreductie en optimalisatie
Elk systeem kent fouten. De kunst is ze te minimaliseren.
- Drift-correctie: Gebruik de IMU om snelle bewegingen te compenseren. Pas een Kalman-filter toe (EKF) op de pose-schatting.
- Visuele invariantie: Test met fel licht, schaduw en bewegingsonscherpte. Pas sluitertijd aan (minimaal 1/120s) en verhoog ISO tot max 800 om ruis te beperken.
- Geheugenbeheer: Beperk keyframes tot 200-300 per 100 m². Verouderde keyframes verwijderen na loop-closing.
- Realtime draaien: Zorg dat totale pipeline < 33 ms per frame is (30 fps). Schakel zware berekeningen uit als de robot stilstaat.
Tijdsindicatie: 45-60 minuten testen en tunen.
Veelgemaakte fout: Te veel data willen vasthouden, waardoor de robot stopt met bewegen tijdens berekeningen.
Verificatie-checklist
Check voordat je de robot inzet of alle onderdelen kloppen. Gebruik deze lijst.
- Camera kalibratie: distorsie < 0.5%
- IMU synchronisatie: offset < 1 ms
- Frame rate: minimaal 25 fps
- Feature matches: minimaal 50 per frame
- Residual error Bundle Adjustment: onder 1 pixel
- Map grootte: 100-200 punten per m²
- Loop closing: herkent binnen 2 meter herhaling
- Realtime performance: pipeline < 33 ms
- Batterijduur: minimaal 60 minuten
- Testruimte: 4x4 meter met variatie in textuur
Als je alle items kunt afvinken, is je vSLAM-systeem klaar voor een echte huistest. Succes!