"매 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.
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.
매 응용
Autonomous vehicle: HD map.
Drone: indoor + outdoor.
AR / VR: room understanding (ARKit, ARCore).
Robot vacuum: 매 home map.
Indoor robot: 매 warehouse, 매 hospital.
Surveying: 매 building, 매 mine.
Underwater: 매 sonar + visual.
Photogrammetry: 매 cultural heritage.
매 challenge
Dynamic objects: 매 person, vehicle.
Featureless environment: 매 white wall.
Lighting: 매 dark / bright extremes.
Long-term map: 매 changing environment.
Scale ambiguity (monocular): 매 metric scale.
Computational cost: 매 real-time.
💻 패턴
ORB-SLAM3 (C++)
# 매 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)
importcv2importnumpyasnpclassSimpleVO:def__init__(self,K):self.K=K# 매 camera intrinsicself.orb=cv2.ORB_create(2000)self.matcher=cv2.BFMatcher(cv2.NORM_HAMMING)self.prev_kp,self.prev_des=None,Noneself.pose=np.eye(4)defprocess(self,frame):kp,des=self.orb.detectAndCompute(frame,None)ifself.prev_desisNone:self.prev_kp,self.prev_des=kp,desreturnself.posematches=self.matcher.match(self.prev_des,des)matches=sorted(matches,key=lambdax:x.distance)[:200]pts1=np.array([self.prev_kp[m.queryIdx].ptforminmatches])pts2=np.array([kp[m.trainIdx].ptforminmatches])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]=RT[:3,3:]=tself.pose=self.pose@Tself.prev_kp,self.prev_des=kp,desreturnself.pose
Open3D (point cloud)
importopen3daso3d# 매 load + visualizepcd=o3d.io.read_point_cloud('scan.ply')o3d.visualization.draw_geometries([pcd])# 매 ICP registrationsource=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)
# 매 image set → 매 3D reconstruction
colmap automatic_reconstructor \
--workspace_path /path/to/workspace \
--image_path /path/to/images
NeRF (instant-NGP)
importtinycudannastcnnimporttorch# 매 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,})defrender(rays_o,rays_d):samples=sample_along_rays(rays_o,rays_d)encoded=encoder(samples)rgb_sigma=mlp(encoded)returnvolume_render(rgb_sigma,samples)
Gaussian Splatting (3DGS, 2023)
# 매 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)
#include<DBoW3/DBoW3.h>DBoW3::Vocabularyvocab("ORBvoc.bin");DBoW3::Databasedb(vocab,false,0);// 매 keyframe 마다 add
DBoW3::BowVectorbow;vocab.transform(descriptors,bow);db.add(bow);// 매 query: 매 매 frame 의 lookup
DBoW3::QueryResultsret;db.query(bow,ret,5);if(ret[0].Score>0.7){// 매 loop closure detected!
}