04-传感器与感知-点云处理入门
作者:姚博文 · 2026-09-15
点云处理入门(Point Cloud Processing:PCL / 降采样 / 地面分割 / ICP)
定位:把 3D 激光/深度相机吐出的原始点云加工成"地面 + 障碍物列表"——点云表示、降采样、去噪、法向量、ICP 配准、RANSAC 平面分割与 ROS2 集成 | 适用:智能小车/移动机器人开发
1\. 概述
1.1 这篇解决什么问题
3D 激光雷达(Livox/禾赛)和深度相机(RealSense/Kinect,见 `深度传感器.md`)输出的是**几十万点的无序集合**——点云(Point Cloud),没有像素网格、没有固定顺序。直接丢给规划器没用,必须经过一条处理流水线:
**降采样 → 去噪 → 地面分割 → 地面去除 → 障碍聚类 → 输出障碍物列表**
输出给下游的东西是"障碍物"(质心/包围盒/体素网格),Nav2 的 costmap 或自研避障逻辑直接消费。本文给这条流水线每个环节的**原理 + 参数含义 + 可运行代码**,并附 ROS2 集成(`point_cloud_to_laserscan` 点云转 2D 激光、pcl\_ros 节点)。
1.2 在自主导航链路中的位置
注意:点云处理 pipeline 与 SLAM 前端**并行**消费同一份原始点云——一个管"障碍在哪",一个管"我在哪",互不依赖。
2\. 基本原理
2.1 点云表示
**PCL 表示**(C++,`pcl::PointCloud<T>`):每点一个固定结构体,常用类型:
| 类型 | 字段 | 说明 |
| --- | --- | --- |
| pcl::PointXYZ | x, y, z(float) | 最基础,3D 激光默认 |
| pcl::PointXYZI | + intensity(uint8) | 强度:回波强度,2D/3D 激光普遍带,可用于区分材质(金属亮/玻璃暗) |
| pcl::PointXYZT | + time(float,μs) | 帧内时间戳:机械旋转激光一圈内点序有时间差,做运动补偿要用 |
| pcl::PointNormal / PointXYZINormal | + 法向量 (normal_x,y,z) + curvature | 法向量估计后的类型(见 2.4) |
**ROS 消息表示** `sensor_msgs::PointCloud2`:点云在 ROS 里**不是**逐点结构体,而是一大块连续内存(binary blob),靠字段表描述布局——这样零拷贝、可跨语言读。关键字段:
💡 两个高频坑:① `is_dense=false` 的点云含 NaN/Inf 无效点,做距离计算前必须剔除,否则一个 NaN 污染整行;② 字段 offset 别想当然——深度