共计 1890 个字符,预计需要花费 5 分钟才能阅读完成。
点云聚类:自动驾驶的 ” 环境素描师 ”
当激光雷达每秒产生数十万个数据点时,聚类算法就像一位素描师,将散乱的点云转化为可理解的物体轮廓。在 Autoware 自动驾驶框架中,点云聚类直接决定车辆能否准确识别周围的车辆、行人乃至路缘石。

为什么聚类是感知系统的核心?
- 数据降维:单帧 64 线激光雷达产生约 10 万点,聚类可将这些点合并为几十个物体
- 特征提取:聚类后的物体才有计算长宽高、朝向等属性的意义
- 跟踪基础 :稳定的聚类结果是多目标跟踪(MOT) 的前提条件
算法竞技场:DBSCAN vs 欧式聚类
Autoware 主要采用改进的欧式聚类,但理解不同算法的特性至关重要:
- DBSCAN
- 优点:自动识别噪声点,适应不规则形状
- 缺点:参数敏感,复杂度 O(nlogn)不适合实时系统
-
典型场景:室内机器人导航
-
欧式聚类
- 优点:实现简单,复杂度 O(n)适合实时处理
- 缺点:需要预设距离阈值,对粘连物体分离效果差
- 改进方案:Autoware 采用体素滤波预处理减少点数
Autoware 聚类实战:带注释的 C ++ 核心代码
// 基于 pcl::EuclideanClusterExtraction 的实现
void clusterPoints(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud) {
// 创建 KD 树加速搜索
pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>);
tree->setInputCloud(cloud);
// 聚类参数设置(生产环境推荐值)std::vector<pcl::PointIndices> cluster_indices;
pcl::EuclideanClusterExtraction<pcl::PointXYZ> ec;
ec.setClusterTolerance(0.3); // 30cm 距离阈值(根据雷达精度调整)ec.setMinClusterSize(20); // 最少 20 个点构成物体
ec.setMaxClusterSize(5000); // 防止地面点误聚类
ec.setSearchMethod(tree);
ec.setInputCloud(cloud);
ec.extract(cluster_indices);
// 可视化处理(实际工程中转为 ROS 消息)int j = 0;
for (const auto& indices : cluster_indices) {pcl::PointCloud<pcl::PointXYZ>::Ptr cluster(new pcl::PointCloud<pcl::PointXYZ>);
for (const auto& idx : indices.indices)
cluster->push_back((*cloud)[idx]);
// 此处添加聚类后处理...
}
}
关键参数调优指南:
setClusterTolerance:- 16 线雷达建议 0.2-0.5m
- 64 线雷达建议 0.1-0.3m
-
需考虑车辆速度和算法运行频率
-
setMinClusterSize: - 行人检测需要较小值(10-30)
- 高速场景建议增大值防止误检
性能优化三重奏
- 预处理加速:
- 体素滤波降采样(0.1m 网格)可减少 50% 点数
-
ROI 区域裁剪去除无效点
-
算法层优化:
- 使用 GPU 加速版 PCL
-
多线程处理:将点云分块并行聚类
-
后处理技巧:
- 对相邻帧聚类结果做 IOU 匹配
- 地面点单独处理(如使用 RANSAC)
多传感器适配经验
不同雷达配置需要差异化处理:
- 机械式雷达(如 VLP-16):
- 垂直分辨率低,需增大聚类距离阈值
-
建议配合毫米波雷达补充检测
-
固态雷达(如 Livox):
- 非重复扫描特性需要调整聚类频率
-
由于点云密度分布不均,建议动态调整 MinClusterSize
-
相机融合场景:
- 先用聚类获取疑似目标 ROI
- 将聚类结果投影到图像做二次校验
生产环境踩坑记录
- 鬼影问题:
- 现象:静止物体出现 ” 拖尾 ” 聚类
-
解决方案:增加时序滤波,统计连续 N 帧存在才输出
-
隧道场景:
- 挑战:墙壁和车辆易被聚类为同一物体
-
优化:引入反射强度信息辅助分割
-
雨天性能下降:
- 原因:雨滴产生噪点
- 应对:动态调整 MinClusterSize 并增加点云有效性检测
开放思考:多传感器聚类融合
当激光雷达、毫米波、摄像头同时提供检测结果时:
1. 应该以哪个传感器的聚类结果为基准?
2. 如何处理不同传感器间的聚类尺度差异?
3. 时间对齐和坐标转换带来的误差如何补偿?
这些问题没有标准答案,但正是自动驾驶感知算法工程师的日常工作挑战。建议从简单的前融合(点云级融合)开始尝试,逐步过渡到后融合(目标级融合)方案。
正文完
