第1章:传感器与感知基础
大家好,我是你们这门课的主讲。今天咱们聊聊避障场景里最基础、也最绕不开的一环——传感器与感知。
说实话,我见过不少做机器人规划的同学,一上来就猛搞路径搜索算法,结果一跑起来,要么撞墙,要么原地打转。为什么?因为感知层就没做好。你想想看,规划算法再牛,给它的数据是错的,那不就是「垃圾进,垃圾出」吗?
所以这一章,咱们把传感器和感知这件事彻底捋清楚。
1.1 常用传感器:各有各的脾气
先说说最常见的三种传感器:激光雷达、相机、超声波。它们各有各的脾气,用错了地方,坑你没商量。
1.1.1 激光雷达(LiDAR)
激光雷达,说白了就是「用激光测距」。它发射激光束,打到障碍物上反射回来,算一下时间差,就知道距离了。
优点:
- 精度高,毫米级
- 不受光照影响,晚上也能用
- 直接输出3D点云,方便建图
缺点:
- 贵。好的机械式LiDAR动辄几万块
- 怕雨雾。激光在雨雾里衰减严重
- 固态LiDAR视场角有限
1.1.2 相机
相机大家最熟悉了。但用在机器人上,它和手机拍照完全是两码事。
分类:
- 单目相机: 便宜,但缺深度信息。想测距?得靠算法猜。
- 双目相机: 像人的两只眼,通过视差算深度。精度还行,但计算量大。
- 深度相机(RGB-D): 直接输出深度图,比如Kinect、Intel RealSense。室内好用,室外见光死。
优点:
- 信息丰富,能识别物体(比如「这是椅子,那是人」)
- 便宜,几十到几百块搞定
缺点:
- 光照敏感。太暗看不清,太亮过曝
- 纹理依赖。白墙面前,双目直接「瞎」了
1.1.3 超声波传感器
超声波传感器,原理和蝙蝠一样,发射声波,听回声。
优点:
- 便宜,几块钱一个
- 不受光照、颜色影响
- 能检测透明物体(比如玻璃门)——激光雷达和相机都做不到
缺点:
- 精度低,有盲区(太近测不到)
- 容易串扰(多个超声波同时工作会互相干扰)
- 响应慢,不适合高速场景
我个人习惯把超声波当作「最后一道防线」。激光雷达和相机没检测到的玻璃门,超声波能补上。
1.2 障碍物检测与表示
传感器拿到原始数据后,怎么变成机器人能理解的「障碍物」?
1.2.1 点云处理
激光雷达输出的是点云——一堆三维坐标点。我们需要从中提取出障碍物。
基本流程:
- 滤波: 去掉噪声点。比如用体素滤波降采样,减少计算量。
- 地面分割: 把地面点去掉,只保留障碍物点。常用RANSAC算法。
- 聚类: 把属于同一个障碍物的点聚在一起。比如欧几里得聚类。
- 包围盒: 给每个聚类生成一个最小包围盒,作为障碍物的表示。
// 伪代码示例:点云聚类
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
// 加载点云...
pcl::EuclideanClusterExtraction<pcl::PointXYZ> ec;
ec.setClusterTolerance(0.2); // 20cm内的点算一个障碍物
ec.setMinClusterSize(100);
ec.setMaxClusterSize(25000);
ec.extract(clusters); // 输出聚类列表
1.2.2 障碍物表示方式
障碍物在规划层怎么表示?常见的有三种:
| 表示方式 | 说明 | 适用场景 |
|---|---|---|
| 栅格地图 | 把空间分成小格子,每个格子标记为「占用」或「空闲」 | 2D平面避障,如扫地机器人 |
| 代价地图 | 在栅格地图基础上,给每个格子一个代价值(越靠近障碍物代价越高) | 路径规划中的A*、DWA算法 |
| 凸多边形 | 用多个凸多边形近似障碍物形状 | 3D空间避障,如机械臂运动规划 |
我个人最常用的是代价地图。为什么呢?因为它把「安全距离」这个概念直接量化了。规划算法看到高代价区域,自然就会绕开。
1.3 传感器融合简介
单一传感器总有短板。融合,就是取长补短。
举个我实际做过的例子:
- 激光雷达:提供精确的距离信息,但无法识别物体类别
- 相机:能识别「这是人」,但深度不准
- 融合结果:知道「前方3米有一个人」,比单一传感器靠谱得多
融合的层次:
- 数据级融合: 直接把原始数据拼在一起。比如把点云和图像对齐。计算量大,但信息损失少。
- 特征级融合: 先提取特征(比如障碍物位置、速度),再融合。效率高,是工程中最常用的。
- 决策级融合: 每个传感器独立做决策,最后投票。比如「激光雷达说有障碍,相机也说有,那肯定有」。
1.4 感知不确定性处理
这是很多初学者容易忽略的点。传感器数据永远有噪声,永远有误差。如果你把感知结果当作「绝对真理」,规划算法一定会出问题。
不确定性的来源:
- 传感器本身的噪声(比如激光雷达的测距误差)
- 环境干扰(比如阳光、雨雾)
- 算法误差(比如聚类时把两个障碍物当成一个)
怎么处理?
我的做法是:给每个障碍物加一个「不确定性椭圆」。椭圆的大小表示位置的不确定度。规划算法看到这个椭圆,就知道「障碍物大概在这个区域,但具体在哪不确定」,于是会留出更大的安全余量。
// 不确定性建模示例
struct Obstacle {
Vector3d position; // 障碍物中心位置
Matrix3d covariance; // 协方差矩阵,表示不确定性
double confidence; // 置信度,0~1
};
嗯,这里要注意:置信度不能拍脑袋设。我一般会根据传感器的历史表现来动态调整。比如激光雷达在雨天的置信度自动降低,相机的置信度在暗光下降低。
本章知识体系
下面这张图,是我自己画的,把本章的核心逻辑串起来了。你可以把它当作一个「思维导图」来看。
好了,这一章就到这里。传感器是机器人的「眼睛」,但眼睛也会骗人。下一章我们会深入聊聊,怎么用这些感知数据做实时轨迹规划。到时候见。
可可精品资料库