← Quay lại Blog
navigationamrai-perceptionlidar

LiDAR và 3D Mapping: Xây dựng bản đồ môi trường cho robot

Tìm hiểu LiDAR và 3D Mapping — sử dụng LiDAR sensor và PCL để xây dựng bản đồ 3D chính xác cho robot tự hành.

Nguyễn Anh Tuấn15 tháng 11, 20255 phút đọc
LiDAR và 3D Mapping: Xây dựng bản đồ môi trường cho robot

LiDAR hoạt động như thế nào?

LiDAR (Light Detection and Ranging) phát ra tia laser và đo thời gian phản hồi để tính khoảng cách đến vật thể. Một LiDAR quay 360 độ tạo ra hàng nghìn điểm đo mỗi giây, hình thành point cloud — đám mây điểm mô tả chính xác hình dạng môi trường xung quanh.

So với camera, LiDAR có ưu điểm vượt trội: hoạt động trong mọi điều kiện ánh sáng, đo khoảng cách chính xác tới centimeter, và không bị ảnh hưởng bởi texture bề mặt.

Các loại LiDAR phổ biến

LiDAR 2D

Quét trên một mặt phẳng, phù hợp cho robot di động trong nhà:

Sensor Tầm đo Tần suất Giá (~)
RPLiDAR A1 12m 8000 pts/s $99
RPLiDAR A2 18m 16000 pts/s $300
SICK TiM561 10m 15000 pts/s $1500
Hokuyo UST-10LX 10m 40000 pts/s $2000

Khuyến nghị: RPLiDAR A2 cho prototype và robot nhỏ, SICK TiM cho công nghiệp.

LiDAR 3D

Quét không gian 3 chiều, cho robot outdoor và xe tự hành:

Sensor Channels Tầm đo Giá (~)
Velodyne VLP-16 16 100m $4000
Ouster OS1-32 32 120m $6000
Livox Mid-360 Non-repetitive 70m $800
Intel RealSense L515 Solid-state 9m $350

Livox Mid-360 đang là lựa chọn phổ biến nhất cho robot AMR nhờ giá rẻ và chất lượng tốt.

Drone và robot sử dụng LiDAR để scan môi trường 3D

Đọc dữ liệu LiDAR với ROS 2

Để bắt đầu, bạn cần cài đặt ROS 2 — nền tảng lập trình robot thế hệ mới.

# RPLiDAR driver
sudo apt install ros-humble-rplidar-ros
ros2 launch rplidar_ros rplidar_a2m8_launch.py

# Velodyne driver
sudo apt install ros-humble-velodyne
ros2 launch velodyne_driver velodyne_driver_node-VLP16-launch.py

Visualize trong RViz2:

ros2 run rviz2 rviz2
# Thêm display: LaserScan (2D) hoặc PointCloud2 (3D)
# Topic: /scan hoặc /velodyne_points

Xử lý Point Cloud với PCL

PCL (Point Cloud Library) là thư viện C++ chuẩn cho xử lý point cloud:

Filtering — Giảm nhiễu và lọc dữ liệu

#include <pcl/filters/voxel_grid.h>
#include <pcl/filters/statistical_outlier_removal.h>

// Voxel Grid — downsampling point cloud
pcl::VoxelGrid<pcl::PointXYZ> voxel;
voxel.setInputCloud(cloud);
voxel.setLeafSize(0.05f, 0.05f, 0.05f);  // 5cm resolution
voxel.filter(*cloud_filtered);

// Statistical Outlier Removal — loại bỏ noise
pcl::StatisticalOutlierRemoval<pcl::PointXYZ> sor;
sor.setInputCloud(cloud_filtered);
sor.setMeanK(50);          // 50 neighbor points
sor.setStddevMulThresh(1.0); // 1 sigma threshold
sor.filter(*cloud_clean);

Registration — Ghép nhiều point cloud

ICP (Iterative Closest Point) ghép các frame point cloud thành bản đồ:

#include <pcl/registration/icp.h>

pcl::IterativeClosestPoint<pcl::PointXYZ, pcl::PointXYZ> icp;
icp.setInputSource(cloud_new);
icp.setInputTarget(cloud_map);
icp.setMaximumIterations(50);
icp.setTransformationEpsilon(1e-8);
icp.setMaxCorrespondenceDistance(0.5);

pcl::PointCloud<pcl::PointXYZ> aligned;
icp.align(aligned);

if (icp.hasConverged()) {
    Eigen::Matrix4f transform = icp.getFinalTransformation();
    // Cập nhật bản đồ với point cloud đã align
}

3D SLAM với LiDAR

FAST-LIO2

Thuật toán 3D LiDAR SLAM hiện đại, real-time trên ARM64:

# Cài đặt
cd ~/ros2_ws/src
git clone https://github.com/hku-mars/FAST_LIO.git
cd .. && colcon build --packages-select fast_lio

# Chạy với Livox Mid-360
ros2 launch fast_lio mapping.launch.py \
  config_path:=config/mid360.yaml

LeGO-LOAM

Tối ưu cho outdoor mapping, phân loại ground/non-ground:

ros2 launch lego_loam lego_loam.launch.py \
  pointCloudTopic:=/velodyne_points

Công nghệ scan và xử lý point cloud cho bản đồ 3D

Lưu và sử dụng bản đồ 3D

# Lưu point cloud map
ros2 run pcl_ros pointcloud_to_pcd input:=/map_cloud

# Chuyển sang octomap (octree 3D map) cho navigation
ros2 launch octomap_server octomap_mapping.launch.py
# OctoMap nén point cloud từ GB xuống MB, phù hợp cho navigation

Pipeline hoàn chỉnh

LiDAR scan → Filter (voxel + outlier removal)
           → SLAM (FAST-LIO2 / LeGO-LOAM)
           → Point cloud map
           → OctoMap (3D occupancy grid)
           → [Nav2](/blog/slam-navigation-robot) (path planning + obstacle avoidance)

Mẹo thực tế

  1. Calibrate extrinsic giữa LiDAR và IMU — sai lệch 1 độ gây drift bản đồ nhanh chóng
  2. Voxel filter trước khi chạy SLAM — giảm computation cost mà vẫn giữ accuracy
  3. Loop closure là chìa khóa — bản đồ lớn sẽ drift nếu không detect loop closure
  4. Ground removal cho outdoor — PCL SACSegmentation với model SACMODEL_PLANE
  5. Save intermediate maps — chạy SLAM lại từ đầu rất tốn thời gian

LiDAR và 3D mapping là nền tảng để robot hiểu môi trường 3 chiều. Kết hợp với SLAM và navigation, bạn có thể xây dựng robot tự hành hoạt động chính xác trong cả môi trường indoor và outdoor. Dữ liệu LiDAR cũng là thành phần quan trọng khi xây dựng Digital Twin cho nhà máy.

Bài viết liên quan

Bài viết liên quan

Sim-to-Real Transfer: Train simulation, chạy thực tế
ai-perceptionresearchrobotics

Sim-to-Real Transfer: Train simulation, chạy thực tế

Kỹ thuật chuyển đổi mô hình từ simulation sang robot thật — domain randomization, system identification và best practices.

1/4/202612 phút đọc
Nghiên cứuEmbodied AI 2026: Toàn cảnh và xu hướng
ai-perceptionresearchrobotics

Embodied AI 2026: Toàn cảnh và xu hướng

Tổng quan embodied AI -- từ foundation models, sim-to-real đến robot learning tại scale với open-source tools.

25/3/202612 phút đọc
TutorialHands-on: Fine-tune OpenVLA với LeRobot
ai-perceptionvlatutorialPhần 7

Hands-on: Fine-tune OpenVLA với LeRobot

Tutorial thực hành — fine-tune OpenVLA trên custom data, LoRA, quantization và deploy trên robot thật.

23/3/202613 phút đọc