激光雷达(Lidar)是自动驾驶中感知环境的核心传感器之一,它输出的是一帧帧点云数据(point cloud),表示空间中障碍物的位置和形状。
1. 什么是点云?
点云是由一系列点(x, y, z, intensity)组成的数据集,每个点表示空间中某个反射物的坐标和强度信息。
2. 点云数据结构
字段 | 描述 |
---|---|
x, y, z | 三维坐标 |
intensity | 激光反射强度 |
ring | 激光束编号(多线雷达) |
timestamp | 每个点的时间戳 |
reflectivity / ambient | 可选,反映表面材质或亮度 |
3. 常见处理流程
3.1 点云预处理
- 体素滤波(VoxelGrid):降低点云密度,加快处理速度
- 裁剪(CropBox):去除远处或地面点,聚焦感兴趣区域
- 时间同步:与IMU/GNSS同步,统一坐标系
3.2 点云配准与融合
- ICP算法(Iterative Closest Point):配准不同帧点云,构建地图
- NDT算法:用于鲁棒配准,适应点云局部稀疏问题
- 多帧融合:提升障碍检测的完整性
3.3 点云感知
- 地面分割(Ground Segmentation):识别并移除地面点
- 聚类(Euclidean Clustering):提取独立目标(车辆、行人)
- 目标跟踪与识别:结合深度学习模型进行物体分类
4. 使用工具与库
工具/库 | 说明 |
---|---|
PCL (Point Cloud Library) | 最主流的C++点云处理库 |
Open3D | Python友好,支持可视化与处理 |
ROS + sensor_msgs/PointCloud2 | ROS中点云标准消息格式 |
rviz | 可视化点云、障碍物、车辆模型 |
Autoware/Apollo | 提供全套点云感知模块 |
5. 示例:PCL聚类伪代码
pcl::EuclideanClusterExtraction<pcl::PointXYZ> ec;
ec.setClusterTolerance(0.5); // 50cm内为一类
ec.setMinClusterSize(30);
ec.setMaxClusterSize(2500);
ec.setSearchMethod(tree);
ec.setInputCloud(cloud_filtered);
ec.extract(cluster_indices);