--- id: wiki-2026-0508-automated-mapping title: Automated Mapping (SLAM / HD Map) category: 10_Wiki/Topics status: verified canonical_id: self aliases: [자동 매핑, SLAM, HD map, point cloud, bundle adjustment, loop closure, 3D reconstruction, NeRF] duplicate_of: none source_trust_level: A confidence_score: 0.9 verification_status: applied tags: [slam, hd-map, lidar, point-cloud, bundle-adjustment, loop-closure, robotics, autonomous-vehicles, nerf, 3d-reconstruction] raw_sources: [] last_reinforced: 2026-05-10 github_commit: pending tech_stack: language: C++ / Python framework: ROS / Open3D / COLMAP / OpenVSLAM --- # Automated Mapping ## 📌 한 줄 통찰 > **"매 unknown 의 explore + 매 self-localize 의 simultaneous"**. 매 SLAM (Simultaneous Localization and Mapping). 매 sensor (LiDAR, camera, IMU) 의 fusion. 매 robotics / AV / AR / VR 의 spatial intelligence 의 base. 매 modern: 매 NeRF / Gaussian Splatting 의 photoreal map. ## 📖 핵심 ### 매 SLAM 의 4 stage 1. **Sensor data**: LiDAR / camera / IMU / GPS. 2. **Feature extraction**: ORB, SIFT, SuperPoint, LoFTR. 3. **Pose + map estimation**: 매 EKF / particle filter / graph. 4. **Loop closure + global optimization**: 매 bundle adjustment. ### 매 SLAM type #### Visual SLAM - 매 camera only. - 매 ORB-SLAM3 (state-of-the-art classic). - 매 DROID-SLAM (deep learning). #### LiDAR SLAM - 매 point cloud. - 매 LOAM, LeGO-LOAM, FAST-LIO. - 매 sparse + accurate. #### Visual-Inertial (VIO) - 매 camera + IMU. - 매 VINS-Fusion, OpenVINS. - 매 robotics, AR/VR. #### LiDAR-Visual-Inertial - 매 multi-sensor fusion. - 매 LIO-SAM, FAST-LIVO. ### 매 핵심 component #### Front-end - 매 feature extraction. - 매 matching (RANSAC). - 매 motion estimation. #### Back-end - 매 graph optimization. - 매 g2o, Ceres, GTSAM. - 매 nonlinear least squares. #### Loop closure - 매 same place revisit 의 detect. - 매 DBoW2, NetVLAD. - 매 drift 의 correct. #### Mapping - 매 occupancy grid (2D). - 매 OctoMap (3D voxel). - 매 mesh / point cloud. ### Bundle Adjustment (BA) - 매 nonlinear optimization. - 매 reprojection error 의 minimize. - 매 camera pose + 3D point 의 동시 추정. - 매 SLAM 의 backbone. ### Modern / deep learning - **DROID-SLAM**: 매 differentiable. - **NeRF** (Neural Radiance Field): 매 photorealistic 3D. - **Gaussian Splatting** (3DGS, 2023): 매 fast NeRF alternative. - **NICE-SLAM**: 매 dense neural SLAM. - **Gaussian-SLAM**. ### HD Map (autonomous driving) - 매 lane geometry. - 매 traffic sign / signal. - 매 routing graph. - 매 cm-level accuracy. - 매 update mechanism. ### 매 응용 1. **Autonomous vehicle**: HD map. 2. **Drone**: indoor + outdoor. 3. **AR / VR**: room understanding (ARKit, ARCore). 4. **Robot vacuum**: 매 home map. 5. **Indoor robot**: 매 warehouse, 매 hospital. 6. **Surveying**: 매 building, 매 mine. 7. **Underwater**: 매 sonar + visual. 8. **Photogrammetry**: 매 cultural heritage. ### 매 challenge 1. **Dynamic objects**: 매 person, vehicle. 2. **Featureless environment**: 매 white wall. 3. **Lighting**: 매 dark / bright extremes. 4. **Long-term map**: 매 changing environment. 5. **Scale ambiguity** (monocular): 매 metric scale. 6. **Computational cost**: 매 real-time. ## 💻 패턴 ### ORB-SLAM3 (C++) ```bash # 매 build mkdir build && cd build && cmake .. && make -j8 # 매 run with EuRoC dataset (visual-inertial) ./Examples/Stereo-Inertial/stereo_inertial_euroc \ Vocabulary/ORBvoc.txt \ Examples/Stereo-Inertial/EuRoC.yaml \ /path/to/V1_01_easy \ Examples/Stereo-Inertial/EuRoC_TimeStamps/V101.txt ``` ### Python visual SLAM (pyslam-style) ```python import cv2 import numpy as np class SimpleVO: def __init__(self, K): self.K = K # 매 camera intrinsic self.orb = cv2.ORB_create(2000) self.matcher = cv2.BFMatcher(cv2.NORM_HAMMING) self.prev_kp, self.prev_des = None, None self.pose = np.eye(4) def process(self, frame): kp, des = self.orb.detectAndCompute(frame, None) if self.prev_des is None: self.prev_kp, self.prev_des = kp, des return self.pose matches = self.matcher.match(self.prev_des, des) matches = sorted(matches, key=lambda x: x.distance)[:200] pts1 = np.array([self.prev_kp[m.queryIdx].pt for m in matches]) pts2 = np.array([kp[m.trainIdx].pt for m in matches]) E, mask = cv2.findEssentialMat(pts1, pts2, self.K, cv2.RANSAC, 0.999, 1.0) _, R, t, _ = cv2.recoverPose(E, pts1, pts2, self.K, mask=mask) T = np.eye(4) T[:3, :3] = R T[:3, 3:] = t self.pose = self.pose @ T self.prev_kp, self.prev_des = kp, des return self.pose ``` ### Open3D (point cloud) ```python import open3d as o3d # 매 load + visualize pcd = o3d.io.read_point_cloud('scan.ply') o3d.visualization.draw_geometries([pcd]) # 매 ICP registration source = o3d.io.read_point_cloud('scan1.ply') target = o3d.io.read_point_cloud('scan2.ply') result = o3d.pipelines.registration.registration_icp( source, target, max_correspondence_distance=0.5, estimation_method=o3d.pipelines.registration.TransformationEstimationPointToPoint(), ) print(result.transformation) ``` ### COLMAP (photogrammetry) ```bash # 매 image set → 매 3D reconstruction colmap automatic_reconstructor \ --workspace_path /path/to/workspace \ --image_path /path/to/images ``` ### NeRF (instant-NGP) ```python import tinycudann as tcnn import torch # 매 hash grid encoding (instant-NGP) encoder = tcnn.Encoding(n_input_dims=3, encoding_config={ 'otype': 'HashGrid', 'n_levels': 16, 'n_features_per_level': 2, 'log2_hashmap_size': 19, 'base_resolution': 16, 'per_level_scale': 1.5, }) mlp = tcnn.Network(n_input_dims=encoder.n_output_dims, n_output_dims=4, network_config={ 'otype': 'FullyFusedMLP', 'activation': 'ReLU', 'output_activation': 'None', 'n_neurons': 64, 'n_hidden_layers': 2, }) def render(rays_o, rays_d): samples = sample_along_rays(rays_o, rays_d) encoded = encoder(samples) rgb_sigma = mlp(encoded) return volume_render(rgb_sigma, samples) ``` ### Gaussian Splatting (3DGS, 2023) ```bash # 매 SfM 의 result 의 import python train.py -s /path/to/colmap-output -m /path/to/output # 매 view interactive ./SIBR_remoteGaussian_app -m /path/to/output ``` ### Loop closure (DBoW3) ```cpp #include DBoW3::Vocabulary vocab("ORBvoc.bin"); DBoW3::Database db(vocab, false, 0); // 매 keyframe 마다 add DBoW3::BowVector bow; vocab.transform(descriptors, bow); db.add(bow); // 매 query: 매 매 frame 의 lookup DBoW3::QueryResults ret; db.query(bow, ret, 5); if (ret[0].Score > 0.7) { // 매 loop closure detected! } ``` ## 🤔 결정 기준 | 상황 | Approach | |---|---| | Indoor robot | Visual-Inertial (ORB-SLAM3) | | Outdoor AV | LiDAR + camera + IMU + GPS | | AR (mobile) | ARKit / ARCore | | Photoreal 3D | Gaussian Splatting | | Photogrammetry | COLMAP | | Drone outdoor | VIO + GPS | | Robot vacuum | LiDAR 2D SLAM | | Photoreal AR | NeRF / 3DGS | **기본값**: Visual SLAM = ORB-SLAM3. LiDAR = LIO-SAM. Photoreal = Gaussian Splatting. ## 🔗 Graph - 부모: [[Robotics]] · [[Computer Vision|Computer-Vision]] · [[Spatial Computing]] - 응용: [[Autonomous Vehicles]] · [[HD-Map]] - Modern: [[NeRF]] · [[Gaussian-Splatting]] - Adjacent: [[Bundle-Adjustment]] · [[Loop-Closure]] · [[Bayesian-Brain-Hypothesis]] ## 🤖 LLM 활용 **언제**: 매 robot navigation. 매 AR/VR system. 매 3D reconstruction. 매 AV mapping. **언제 X**: 매 2D image processing only. 매 single static image (use SfM). ## ❌ 안티패턴 - **Pure visual outdoor (no IMU)**: 매 fast motion 의 lose. - **No loop closure**: 매 drift 폭발. - **Static map assumption** (urban): 매 dynamic obj 의 noise. - **Featureless environment**: 매 SLAM fail (LiDAR 의 fall back). - **Offline only**: 매 real-time latency 의 ignore. - **No relocalization**: 매 lost 시 의 recovery X. ## 🧪 검증 / 중복 - Verified (ORB-SLAM3, FAST-LIO, NeRF, 3DGS papers). - 신뢰도 A. - Related: [[Autonomous Vehicles]] · [[Computer Vision|Computer-Vision]] · [[Robotics]] · [[NeRF]] · [[Gaussian-Splatting]]. ## 🕓 Changelog | 날짜 | 변경 | |---|---| | 2026-05-08 | Phase 1 | | 2026-05-10 | Manual cleanup — SLAM type + ORB-SLAM3 + Open3D + NeRF + 3DGS code |