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.
Đọ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
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ế
- Calibrate extrinsic giữa LiDAR và IMU — sai lệch 1 độ gây drift bản đồ nhanh chóng
- Voxel filter trước khi chạy SLAM — giảm computation cost mà vẫn giữ accuracy
- Loop closure là chìa khóa — bản đồ lớn sẽ drift nếu không detect loop closure
- Ground removal cho outdoor — PCL
SACSegmentationvới modelSACMODEL_PLANE - 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.