← Quay lại Blog
navigationslamlidarnavigationros2

SLAM từ A đến Z: LiDAR, Visual và cách robot định vị

Tìm hiểu SLAM từ cơ bản đến nâng cao -- EKF-SLAM, particle filter, ORB-SLAM3, Cartographer, LIO-SAM và cách chọn phương pháp phù hợp.

Nguyen Anh Tuan4 tháng 2, 20269 phút đọc
SLAM từ A đến Z: LiDAR, Visual và cách robot định vị

SLAM là gì và tại sao quan trọng?

SLAM (Simultaneous Localization and Mapping) là bài toán cơ bản nhất trong robot navigation: robot vừa xây dựng bản đồ môi trường, vừa xác định vị trí của mình trên bản đồ đó -- đồng thời. Đây là bài toán "con gà và quả trứng" kinh điển: để định vị cần bản đồ, nhưng để xây bản đồ cần biết vị trí.

Mọi AMR (Autonomous Mobile Robot) hoạt động trong nhà máy, kho hàng, hay ngoài trời đều cần giải SLAM. Không có SLAM, robot chỉ là một chiếc xe điều khiển từ xa.

Trong bài này, mình sẽ đi từ lý thuyết cơ bản (EKF-SLAM, particle filter) đến các framework hiện đại (ORB-SLAM3, Cartographer, LIO-SAM), và giúp bạn chọn đúng phương pháp cho từng use case.

Robot sử dụng LiDAR để scan và xây dựng bản đồ môi trường

Nền tảng lý thuyết SLAM

Bài toán SLAM dưới góc nhìn xác suất

SLAM có thể được mô hình hóa như bài toán ước lượng Bayesian. Tại mỗi thời điểm t, robot cần ước lượng:

Mục tiêu: tìm phân phối xác suất P(x_t, m | z_{1:t}, u_{1:t}) -- xác suất của vị trí robot và bản đồ, cho biết toàn bộ quan sát và điều khiển từ đầu đến thời điểm t.

EKF-SLAM -- Extended Kalman Filter

EKF-SLAM là phương pháp kinh điển nhất, sử dụng Extended Kalman Filter để ước lượng đồng thời vị trí robot và vị trí các landmark.

Cách hoạt động:

  1. Predict: sử dụng motion model để dự đoán vị trí mới của robot
  2. Update: khi quan sát được landmark, cập nhật cả vị trí robot và vị trí landmark

State vector chứa vị trí robot (3 giá trị) + vị trí tất cả landmarks (2N giá trị cho N landmarks). Covariance matrix có kích thước (3+2N) x (3+2N).

# EKF-SLAM simplified pseudocode
def ekf_slam_predict(mu, sigma, u):
    # Motion model: predict new robot pose
    mu_bar = motion_model(mu, u)
    G = jacobian_motion(mu, u)
    sigma_bar = G @ sigma @ G.T + R  # R: motion noise
    return mu_bar, sigma_bar

def ekf_slam_update(mu_bar, sigma_bar, z, landmark_id):
    # Observation model: update with landmark measurement
    z_hat = observation_model(mu_bar, landmark_id)
    H = jacobian_observation(mu_bar, landmark_id)
    K = sigma_bar @ H.T @ inv(H @ sigma_bar @ H.T + Q)
    mu = mu_bar + K @ (z - z_hat)
    sigma = (I - K @ H) @ sigma_bar
    return mu, sigma

Ưu điểm: lý thuyết vững chắc, dễ hiểu, convergent với số landmark nhỏ.

Nhược điểm: độ phức tạp O(N^2) với N landmarks -- không scale được cho bản đồ lớn. Giả định Gaussian không phù hợp với môi trường phức tạp.

Particle Filter SLAM (FastSLAM)

FastSLAM (Montemerlo et al., 2002) giải quyết vấn đề scalability bằng cách sử dụng particle filter cho robot pose và EKF riêng biệt cho mỗi landmark trong mỗi particle.

Cách hoạt động:

Độ phức tạp: O(M * N) với M particles và N landmarks -- tốt hơn nhiều so với EKF-SLAM.

FastSLAM 2.0 cải tiến thêm bằng cách sử dụng observation mới nhất để sample particle, giảm số particle cần thiết.

LiDAR SLAM -- Chuẩn công nghiệp

Google Cartographer

Cartographer là hệ thống SLAM 2D/3D do Google phát triển, open-source từ 2016. Đây là một trong những LiDAR SLAM được dùng rộng rãi nhất trong công nghiệp.

Kiến trúc:

Điểm mạnh:

# Chạy Cartographer với ROS 2
ros2 launch cartographer_ros cartographer.launch.py \
  use_sim_time:=true

LIO-SAM -- LiDAR-Inertial Odometry via Smoothing and Mapping

LIO-SAM (Shan et al., 2020) là framework tightly-coupled LiDAR-inertial SLAM sử dụng factor graph optimization. Paper gốc: arXiv:2007.00258.

Kiến trúc:

Tại sao LIO-SAM mạnh:

# LIO-SAM config (params.yaml)
lio_sam:
  pointCloudTopic: "points_raw"
  imuTopic: "imu_correct"
  gpsTopic: "odometry/gps"
  
  # Lidar sensor
  sensor: velodyne  # velodyne, ouster, livox
  N_SCAN: 16
  Horizon_SCAN: 1800
  
  # IMU
  imuAccNoise: 3.9939570888238808e-03
  imuGyrNoise: 1.5636343949698187e-03

Pointcloud 3D từ LiDAR SLAM tạo bản đồ chi tiết của môi trường

Visual SLAM -- Camera là đủ

ORB-SLAM3

ORB-SLAM3 (Campos et al., 2021) là hệ thống Visual-Inertial SLAM toàn diện nhất hiện nay. Paper: arXiv:2007.11898.

Hỗ trợ:

Pipeline:

  1. Tracking: extract ORB features, match với local map, estimate camera pose
  2. Local Mapping: triangulate new map points, local bundle adjustment
  3. Loop Closing: DBoW2 bag-of-words cho place recognition, pose graph optimization
  4. Multi-map: quản lý nhiều bản đồ khi tracking mất, merge khi reconnect

Điểm mạnh: accurate, robust, hỗ trợ nhiều loại camera, multi-map system.

Nhược điểm: cần texture-rich environment (thất bại trong corridor trắng), computational cost cao hơn LiDAR SLAM.

// ORB-SLAM3 basic usage
ORB_SLAM3::System SLAM(
    vocab_path,           // ORB vocabulary
    settings_path,        // Camera + ORB params
    ORB_SLAM3::System::RGBD,  // Sensor type
    true                  // Visualization
);

// Process each frame
cv::Mat Tcw = SLAM.TrackRGBD(imRGB, imD, timestamp);

RTAB-Map -- Real-Time Appearance-Based Mapping

RTAB-Map là Visual SLAM được tích hợp tốt nhất với ROS 2. Hỗ trợ nhiều loại sensor và có memory management thông minh.

Điểm nổi bật:

Bảng so sánh tổng hợp

Phương pháp Sensor Độ chính xác Tốc độ Outdoor Indoor Scale
EKF-SLAM Any Trung bình Nhanh Nhỏ (<100 landmarks)
FastSLAM Any Cao Trung bình Trung bình
Cartographer LiDAR Cao Real-time Hạn chế Tốt nhất Lớn
LIO-SAM LiDAR+IMU Rất cao Real-time Tốt Tốt Rất lớn
ORB-SLAM3 Camera(+IMU) Cao Real-time Tốt Trung bình
RTAB-Map Camera/LiDAR Cao Real-time Tốt Lớn

Khi nào dùng phương pháp nào?

Chọn LiDAR SLAM (Cartographer / LIO-SAM) khi:

Chọn Visual SLAM (ORB-SLAM3 / RTAB-Map) khi:

Chọn Hybrid (Visual-Inertial hoặc LiDAR-Inertial) khi:

Xu hướng mới: Learning-based SLAM

Các phương pháp SLAM truyền thống dựa trên geometric constraints. Nhưng deep learning đang thay đổi cuộc chơi:

Chúng ta sẽ tìm hiểu sâu hơn về learning-based navigation trong Part 3 của series này.

Tiếp theo trong series

Đây là Part 1 của series Navigation hiện đại. Trong các bài tiếp theo:


Bài viết liên quan

Bài viết liên quan

Deep DiveDigital Twins và ROS 2: Simulation trong sản xuất
simulationros2digital-twinPhần 6

Digital Twins và ROS 2: Simulation trong sản xuất

Ứng dụng simulation trong công nghiệp — digital twins, ROS 2 + Gazebo/Isaac integration cho nhà máy thông minh.

3/4/202611 phút đọc
ROS 2 từ A đến Z (Phần 4): ros2_control và Hardware
ros2tutorialrobot-armPhần 4

ROS 2 từ A đến Z (Phần 4): ros2_control và Hardware

Kết nối ROS 2 với phần cứng thực — viết hardware interface cho motor driver và đọc encoder với ros2_control framework.

26/3/202611 phút đọc
TutorialViết Hardware Interface cho ros2_control
ros2roboticstutorial

Viết Hardware Interface cho ros2_control

Hướng dẫn tạo custom hardware interface — kết nối ros2_control với motor driver qua serial/CAN bus.

18/3/202610 phút đọc