Hoe werkt camera navigatie vSLAM? Technologie stap voor stap uitgelegd

M
Martijn van Dijk
Redacteur & Smart Home Expert
Navigatie en Mapping Technologie · 2026-02-15 · 5 min leestijd

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.

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.

  1. Camera kalibreren: Gebruik een checkerboard-patroon (8x6 vierkanten, 25 mm groot). Maak 20 foto’s vanuit verschillende hoeken. Draai de calibrate_camera.py uit OpenCV. Doel: lensdistorsie onder 0.5% en focal length nauwkeurig tot 1 pixel.
  2. IMU synchroniseren: Zet de IMU op 100 Hz. Meet de bias met een rustende sensor gedurende 10 seconden. Sla de waarden op voor correctie.
  3. Tijdssynchronisatie: Gebruik NTP of PTP om camera en IMU op < 1 ms synchronisatie te brengen. Onsync betekent drift.
  4. 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.

  1. Frame capture: Haal 30 frames per seconde op. Buffer maximaal 3 frames om latency te beperken.
  2. Voorbewerking: Converteer naar grijswaarden, pas histogram-equalisatie toe en reduceer ruis met een 3x3 Gaussian blur.
  3. 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).
  4. 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.

  1. Initialiseer: Zet de eerste frame als referentie (wereldcoördinaten (0,0,0)).
  2. 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.
  3. 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.
  4. 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.

  1. 3D-puntenwolk opbouwen: Zet gematchte punten om naar 3D-coördinaten (X,Y,Z) via triangulatie. Gebruik diepte-indien beschikbaar (RealSense).
  2. 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).
  3. 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.
  4. 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.

  1. Drift-correctie: Gebruik de IMU om snelle bewegingen te compenseren. Pas een Kalman-filter toe (EKF) op de pose-schatting.
  2. 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.
  3. Geheugenbeheer: Beperk keyframes tot 200-300 per 100 m². Verouderde keyframes verwijderen na loop-closing.
  4. 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.

Als je alle items kunt afvinken, is je vSLAM-systeem klaar voor een echte huistest. Succes!

Volgende stap
Lees het complete overzicht
Navigatie technologie bij robotstofzuigers compleet uitgelegd →
M
Over Martijn van Dijk

Martijn test al 8 jaar robotstofzuigers en smart home producten. Als tech-journalist vergelijkt hij zuigkracht, navigatie en dweiltechnologie om je te helpen de beste robotstofzuiger voor jouw huis te vinden. Van budget tot premium — hij heeft ze allemaal over zijn vloer laten rijden.