Home Knowledge Base SLAM simultaneously estimates an agent trajectory and a map of an initially unknown or changing environment.

SLAM simultaneously estimates an agent trajectory and a map of an initially unknown or changing environment. SLAM enables robot and drone navigation, AR anchors, autonomous systems, surveying, inspection, warehouses, mines, construction, and mapping where external positioning is unavailable or insufficient. The problem couples localization and mapping: pose is needed to place landmarks, while landmarks are needed to correct pose. Gauge freedom, scale, coordinate frame, observability, data association, calibration, synchronization, and loop closure define the solution. An engineering definition states variables, units, assumptions, domains, initial and boundary conditions, sampling or update rate, uncertainty, stability or error objective, and implementation constraints. Mathematical guarantees apply to the stated model; they do not automatically cover unmodeled dynamics, finite precision, sensor faults, saturation, delay, concurrency, or hostile inputs.

Architecture, representation, and operating mechanism. A front end extracts and tracks visual features or scan geometry, estimates relative motion, and proposes loop candidates. A back end optimizes a pose graph, factor graph, bundle adjustment, or filter. The map may contain sparse landmarks, dense depth, surfels, voxels, meshes, semantics, or neural fields. Each sensor observation is time-aligned and associated with prior features or map elements; odometry predicts motion; optimization/f filtering updates states; keyframes bound compute; place recognition detects revisits; loop constraints correct accumulated drift and propagate changes through the map. Absolute and relative trajectory error, drift per distance/time, loop precision/recall, relocalization, map accuracy/completeness, consistency, initialization time, tracking loss, recovery, latency, update rate, memory, power, and long-run stability matter. Sensors, actuators, sampling clocks, quantizers, communication, memory, processors, power, thermal behavior, software scheduling, safety interlocks, and operators affect the delivered result. End-to-end design allocates error and latency budgets to named components instead of assuming ideal data and unlimited compute. Results report accuracy or error, stability and robustness margins where applicable, convergence, latency, throughput, memory, numerical conditioning, precision, energy, coverage, false alarms, and behavior at operating limits. Reference models, analytic cases, independent implementations, and confidence bounds make numerical or test evidence interpretable.

Implementation, hardware, and failure modes. ORB-SLAM uses visual features and bundle adjustment, VINS-Mono tightly couples monocular camera and IMU, LIO-SAM uses lidar-inertial smoothing and mapping, RTAB-Map emphasizes graph-based real-time appearance mapping, and direct methods optimize image intensity. Cameras, lidars, IMUs, GNSS, timestamp units, ISPs, feature accelerators, CPUs/GPUs, memory, and storage cooperate. Front-end feature/scan processing is high-rate; back-end sparse optimization can spike; embedded systems use keyframe and map pruning. Textureless/repeated scenes, motion blur, dynamic objects, lidar degeneracy, IMU bias, rolling shutter, clock/extrinsic error, loop perceptual aliasing, scale ambiguity, long corridors, weather, sensor dropout, and map changes cause drift or catastrophic correction. Engineering must include data movement, finite precision, resource contention, numerical or physical limits, error propagation, and deterministic behavior when assumptions are violated. Requirements, mathematical model, discretization, algorithm, numerical format, implementation, calibration, verification, deployment, monitoring, update, and incident response form one lifecycle. Versions of coefficients, transforms, test corpora, compiler settings, hardware kernels, tolerances, and assumptions remain linked to measurements.

Evaluation, verification, and deployment. Use sequence-separated datasets and real routes, surveyed ground truth, indoor/outdoor and dynamic scenes, high speed, loops, long duration, sensor failures, calibration/time perturbations, relocalization, map updates, compute overload, and replay determinism. SLAM feeds planning and AR but depends on calibration, sensor health, frame transforms, map version, localization confidence, storage, fleet merging, and safe fallback. A visually attractive map can still have unsafe local metric errors. Maps can reveal homes, facilities, people, security layouts, and locations. Capture permission, redaction, access, encryption, retention, sharing, geofencing, update authority, and deletion apply. Verification uses analytic identities, invariants, dimensional checks, deterministic unit cases, randomized and property tests, Monte Carlo uncertainty, worst-case boundaries, high-precision references, formal reasoning where tractable, extracted or hardware models, fault injection, and closed-loop or production replay. Independent evidence is essential when one model is used to validate itself. Requirements, mathematical model, discretization, algorithm, numerical format, implementation, calibration, verification, deployment, monitoring, update, and incident response form one lifecycle. Versions of coefficients, transforms, test corpora, compiler settings, hardware kernels, tolerances, and assumptions remain linked to measurements. Results report accuracy or error, stability and robustness margins where applicable, convergence, latency, throughput, memory, numerical conditioning, precision, energy, coverage, false alarms, and behavior at operating limits. Reference models, analytic cases, independent implementations, and confidence bounds make numerical or test evidence interpretable.

System/methodPrimary sensorsBack-end styleStrengthLimitation
ORB-SLAM familyMono/stereo/RGB-D cameraFeature bundle/pose graphMature visual accuracyTexture and motion sensitivity
VINS-Mono styleMonocular camera + IMUSliding-window optimizationScale/high-rate motionCalibration and initialization
LIO-SAM styleLidar + IMUFactor graphMetric geometry and robustnessCost/degenerate scenes
RTAB-MapRGB-D/stereo/lidar optionsGraph + appearance loopsLong-term mapping flexibilityMemory/tuning complexity
Filter-based VIOCamera + IMUEKF-like state estimationBounded real-time costLinearization/consistency
<svg viewBox="0 0 760 470" xmlns="http://www.w3.org/2000/svg" font-family="-apple-system,Segoe UI,Roboto,sans-serif">
  <rect width="760" height="470" fill="#0d1117"/>
  <defs>
    <marker id="slBlueArrow" viewBox="0 0 10 10" refX="8" refY="5" markerWidth="6" markerHeight="6" orient="auto">
      <path d="M0 0L10 5L0 10Z" fill="#60a5fa"/>
    </marker>
    <marker id="slGreenArrow" viewBox="0 0 10 10" refX="8" refY="5" markerWidth="6" markerHeight="6" orient="auto">
      <path d="M0 0L10 5L0 10Z" fill="#34d399"/>
    </marker>
    <radialGradient id="slScan">
      <stop offset="0" stop-color="#38bdf8" stop-opacity=".22"/>
      <stop offset="1" stop-color="#38bdf8" stop-opacity="0"/>
    </radialGradient>
    <filter id="slLoopGlow" x="-80%" y="-80%" width="260%" height="260%">
      <feGaussianBlur stdDeviation="4" result="blur"/>
      <feMerge><feMergeNode in="blur"/><feMergeNode in="SourceGraphic"/></feMerge>
    </filter>
  </defs>

  <text x="380" y="31" fill="#e6edf3" font-size="21" font-weight="700" text-anchor="middle">SLAM — Build the Map While Locating the Robot</text>
  <text x="380" y="53" fill="#8b98a5" font-size="12.5" text-anchor="middle">sensor observations connect robot poses to landmarks; loop closure removes accumulated drift</text>

  <!-- Unknown indoor environment becomes a geometric map -->
  <g transform="translate(26 77)">
    <rect width="535" height="330" rx="13" fill="#0a111b" stroke="#233043" stroke-width="1.5"/>
    <text x="17" y="22" fill="#8b98a5" font-size="9.5">2D occupancy map · walls and landmarks emerge from repeated scans</text>

    <!-- Occupied walls -->
    <g fill="#263548" stroke="#52647b" stroke-width="1">
      <rect x="26" y="42" width="216" height="10" rx="2"/>
      <rect x="26" y="42" width="10" height="110" rx="2"/>
      <rect x="26" y="194" width="10" height="94" rx="2"/>
      <rect x="26" y="278" width="178" height="10" rx="2"/>
      <rect x="278" y="42" width="221" height="10" rx="2"/>
      <rect x="489" y="42" width="10" height="106" rx="2"/>
      <rect x="489" y="194" width="10" height="94" rx="2"/>
      <rect x="319" y="278" width="180" height="10" rx="2"/>
      <rect x="201" y="120" width="10" height="93" rx="2"/>
      <rect x="201" y="120" width="118" height="10" rx="2"/>
      <rect x="309" y="120" width="10" height="93" rx="2"/>
      <rect x="114" y="204" width="97" height="9" rx="2"/>
      <rect x="309" y="204" width="103" height="9" rx="2"/>
    </g>

    <!-- Static landmarks -->
    <g stroke-width="2">
      <g transform="translate(84 90)"><path d="M0-8L8 7H-8Z" fill="#2c2045" stroke="#a78bfa"/><text x="12" y="-10" fill="#c4b5fd" font-size="8">L₁</text></g>
      <g transform="translate(154 248)"><path d="M0-8L8 7H-8Z" fill="#2c2045" stroke="#a78bfa"/><text x="12" y="-10" fill="#c4b5fd" font-size="8">L₂</text></g>
      <g transform="translate(375 82)"><path d="M0-8L8 7H-8Z" fill="#2c2045" stroke="#a78bfa"/><text x="12" y="-10" fill="#c4b5fd" font-size="8">L₃</text></g>
      <g transform="translate(448 246)"><path d="M0-8L8 7H-8Z" fill="#2c2045" stroke="#a78bfa"/><text x="12" y="-10" fill="#c4b5fd" font-size="8">L₄</text></g>
    </g>

    <!-- Raw odometry drifts away from consistency -->
    <path d="M73 257C86 218 112 174 155 148S257 77 335 72 457 104 469 164 454 267 374 271 228 269 150 236 90 161 106 112"
          fill="none" stroke="#f87171" stroke-width="2.3" stroke-dasharray="7 5"/>
    <text x="400" y="300" fill="#fca5a5" font-size="8.8">odometry-only drift</text>

    <!-- Optimized trajectory aligns with repeated observations -->
    <path d="M73 257C82 215 107 178 150 150S251 82 329 78 443 109 453 162 435 251 369 258 233 258 158 230 105 163 121 112"
          fill="none" stroke="#34d399" stroke-width="3"/>

    <!-- Pose graph nodes -->
    <g fill="#102d25" stroke="#34d399" stroke-width="2">
      <circle cx="73" cy="257" r="6"/><circle cx="99" cy="187" r="6"/><circle cx="150" cy="150" r="6"/>
      <circle cx="239" cy="98" r="6"/><circle cx="329" cy="78" r="6"/><circle cx="410" cy="101" r="6"/>
      <circle cx="453" cy="162" r="6"/><circle cx="418" cy="235" r="6"/><circle cx="369" cy="258" r="6"/>
      <circle cx="263" cy="258" r="6"/><circle cx="158" cy="230" r="6"/><circle cx="105" cy="163" r="6"/>
      <circle cx="121" cy="112" r="7"/>
    </g>

    <!-- Current robot and its LiDAR field -->
    <circle cx="121" cy="112" r="67" fill="url(#slScan)"/>
    <g stroke="#38bdf8" stroke-width="1.2" stroke-opacity=".58">
      <path d="M121 112L84 90M121 112L36 85M121 112L201 123M121 112L154 52M121 112L154 248M121 112L47 152"/>
    </g>
    <g transform="translate(121 112) rotate(-22)">
      <rect x="-13" y="-10" width="27" height="20" rx="5" fill="#12334a" stroke="#38bdf8" stroke-width="2"/>
      <circle cx="-8" cy="-12" r="3" fill="#64748b"/><circle cx="9" cy="-12" r="3" fill="#64748b"/>
      <circle cx="-8" cy="12" r="3" fill="#64748b"/><circle cx="9" cy="12" r="3" fill="#64748b"/>
      <path d="M14 0h14" stroke="#93c5fd" stroke-width="3" marker-end="url(#slBlueArrow)"/>
    </g>
    <text x="145" y="104" fill="#7dd3fc" font-size="8.5">LiDAR / camera</text>

    <!-- Loop closure connects the current observation to the start vicinity -->
    <path d="M121 112C83 102 57 137 66 205 72 245 74 249 73 257" fill="none" stroke="#fbbf24" stroke-width="2.7" stroke-dasharray="5 3"/>
    <circle cx="121" cy="112" r="12" fill="none" stroke="#fbbf24" stroke-width="2" filter="url(#slLoopGlow)"/>
    <circle cx="73" cy="257" r="11" fill="none" stroke="#fbbf24" stroke-width="2"/>
    <text x="48" y="184" fill="#fbbf24" font-size="9.5" font-weight="700" transform="rotate(-83 48 184)">LOOP CLOSURE</text>

    <!-- Map legend -->
    <g transform="translate(340 308)" font-size="8.2">
      <path d="M0 0h20" stroke="#34d399" stroke-width="3"/><text x="25" y="3" fill="#8b98a5">optimized poses</text>
      <path d="M112 0h20" stroke="#f87171" stroke-width="2" stroke-dasharray="5 3"/><text x="137" y="3" fill="#8b98a5">drifted estimate</text>
    </g>
  </g>

  <!-- How the correction propagates through the pose graph -->
  <g transform="translate(584 89)">
    <text x="75" y="-10" fill="#fbbf24" font-size="10.5" font-weight="700" text-anchor="middle">POSE-GRAPH OPTIMIZATION</text>
    <rect width="150" height="208" rx="12" fill="#121723" stroke="#a78bfa" stroke-width="1.7"/>

    <!-- Before: loop does not meet -->
    <text x="14" y="24" fill="#fca5a5" font-size="8.8" font-weight="700">BEFORE</text>
    <g transform="translate(24 36)">
      <path d="M5 51C9 18 34 2 63 10S111 39 96 66 42 79 18 61" fill="none" stroke="#f87171" stroke-width="2" stroke-dasharray="5 3"/>
      <g fill="#32191e" stroke="#f87171">
        <circle cx="5" cy="51" r="4"/><circle cx="25" cy="16" r="4"/><circle cx="63" cy="10" r="4"/><circle cx="101" cy="35" r="4"/><circle cx="96" cy="66" r="4"/><circle cx="53" cy="78" r="4"/><circle cx="18" cy="61" r="4"/>
      </g>
      <path d="M5 51L18 61" stroke="#fbbf24" stroke-width="1.5" stroke-dasharray="3 2"/>
      <text x="59" y="94" fill="#8b98a5" font-size="8" text-anchor="middle">end ≠ start</text>
    </g>

    <path d="M75 129v19" stroke="#fbbf24" stroke-width="2.3" marker-end="url(#slGreenArrow)"/>

    <!-- After: residual errors distribute globally -->
    <text x="14" y="166" fill="#6ee7b7" font-size="8.8" font-weight="700">AFTER</text>
    <g transform="translate(30 171)">
      <ellipse cx="46" cy="16" rx="39" ry="20" fill="none" stroke="#34d399" stroke-width="2.5"/>
      <g fill="#153127" stroke="#34d399">
        <circle cx="7" cy="16" r="4"/><circle cx="20" cy="2" r="4"/><circle cx="48" cy="-4" r="4"/><circle cx="80" cy="8" r="4"/><circle cx="85" cy="23" r="4"/><circle cx="48" cy="36" r="4"/><circle cx="12" cy="27" r="4"/>
      </g>
      <circle cx="8" cy="18" r="7" fill="none" stroke="#fbbf24"/>
    </g>
  </g>

  <!-- Estimation loop, expressed compactly under the map -->
  <g transform="translate(584 326)">
    <rect width="150" height="81" rx="11" fill="#10233b" stroke="#60a5fa" stroke-width="1.5"/>
    <text x="75" y="19" fill="#93c5fd" font-size="7.8" font-weight="700" text-anchor="middle">ESTIMATE → OBSERVE → CORRECT</text>
    <path d="M22 47H55M93 47h34" stroke="#60a5fa" stroke-width="2" marker-end="url(#slBlueArrow)"/>
    <g fill="#142b44" stroke="#60a5fa">
      <circle cx="18" cy="47" r="11"/><circle cx="74" cy="47" r="11"/><circle cx="132" cy="47" r="11"/>
    </g>
    <g fill="#e6edf3" font-size="8" text-anchor="middle">
      <text x="18" y="50">pose</text><text x="74" y="50">scan</text><text x="132" y="50">map</text>
    </g>
    <text x="75" y="72" fill="#8b98a5" font-size="8.2" text-anchor="middle">uncertainty links every update</text>
  </g>

  <text x="380" y="438" fill="#e6edf3" font-size="10.5" text-anchor="middle">
    <tspan fill="#fbbf24" font-weight="700">LOOP CLOSURE</tspan><tspan fill="#8b98a5"> recognizes a previously seen place and redistributes pose error across the trajectory.</tspan>
  </text>
  <text x="380" y="458" fill="#6b7684" font-size="11" text-anchor="middle">SLAM jointly estimates robot motion and the map; neither is known perfectly in advance.</text>
</svg>

Selection and practical application. Use visual SLAM for low sensor cost and rich appearance, lidar SLAM for robust metric geometry, visual-inertial for high-rate motion and scale, and multi-sensor factor graphs for demanding robustness at greater complexity. ARKit/ARCore-like tracking, robot vacuums, warehouse AMRs, drones, vehicles, underground mapping, construction progress, and inspection use SLAM. Sensors, actuators, sampling clocks, quantizers, communication, memory, processors, power, thermal behavior, software scheduling, safety interlocks, and operators affect the delivered result. End-to-end design allocates error and latency budgets to named components instead of assuming ideal data and unlimited compute. An engineering definition states variables, units, assumptions, domains, initial and boundary conditions, sampling or update rate, uncertainty, stability or error objective, and implementation constraints. Mathematical guarantees apply to the stated model; they do not automatically cover unmodeled dynamics, finite precision, sensor faults, saturation, delay, concurrency, or hostile inputs. CFS connects this topic to semiconductor architecture, implementation, verification, manufacturing, packaging, test, and deployed AI-system tradeoffs across the platform.

slamsimultaneous localization and mappingvisual slamlidar slamvioorb-slamlio-sam

Explore 500+ Semiconductor & AI Topics

From EUV lithography to CUDA optimization — search the full knowledge base or chat with our AI assistant.