第1章:传感器与感知基础

大家好,我是你们这门课的主讲。今天咱们聊聊避障场景里最基础、也最绕不开的一环——传感器与感知。

说实话,我见过不少做机器人规划的同学,一上来就猛搞路径搜索算法,结果一跑起来,要么撞墙,要么原地打转。为什么?因为感知层就没做好。你想想看,规划算法再牛,给它的数据是错的,那不就是「垃圾进,垃圾出」吗?

所以这一章,咱们把传感器和感知这件事彻底捋清楚。

1.1 常用传感器:各有各的脾气

先说说最常见的三种传感器:激光雷达、相机、超声波。它们各有各的脾气,用错了地方,坑你没商量。

1.1.1 激光雷达(LiDAR)

激光雷达,说白了就是「用激光测距」。它发射激光束,打到障碍物上反射回来,算一下时间差,就知道距离了。

优点:

  • 精度高,毫米级
  • 不受光照影响,晚上也能用
  • 直接输出3D点云,方便建图

缺点:

  • 贵。好的机械式LiDAR动辄几万块
  • 怕雨雾。激光在雨雾里衰减严重
  • 固态LiDAR视场角有限
我的经验: 我在做AGV项目时,一开始用了16线激光雷达,结果在仓库里跑得好好的,一到室外有阳光直射的地方,点云就开始「飘」。后来换了抗干扰能力更强的型号,才稳定下来。选型时一定要看「抗环境光干扰」这个参数。

1.1.2 相机

相机大家最熟悉了。但用在机器人上,它和手机拍照完全是两码事。

分类:

  • 单目相机: 便宜,但缺深度信息。想测距?得靠算法猜。
  • 双目相机: 像人的两只眼,通过视差算深度。精度还行,但计算量大。
  • 深度相机(RGB-D): 直接输出深度图,比如Kinect、Intel RealSense。室内好用,室外见光死。

优点:

  • 信息丰富,能识别物体(比如「这是椅子,那是人」)
  • 便宜,几十到几百块搞定

缺点:

  • 光照敏感。太暗看不清,太亮过曝
  • 纹理依赖。白墙面前,双目直接「瞎」了
避坑指南: 我曾经在室内走廊用RGB-D相机做避障,结果走到阳光照进来的窗边,深度图直接全黑。后来加了遮光罩,并且融合了超声波数据,才解决。记住:单一传感器永远有盲区。

1.1.3 超声波传感器

超声波传感器,原理和蝙蝠一样,发射声波,听回声。

优点:

  • 便宜,几块钱一个
  • 不受光照、颜色影响
  • 能检测透明物体(比如玻璃门)——激光雷达和相机都做不到

缺点:

  • 精度低,有盲区(太近测不到)
  • 容易串扰(多个超声波同时工作会互相干扰)
  • 响应慢,不适合高速场景

我个人习惯把超声波当作「最后一道防线」。激光雷达和相机没检测到的玻璃门,超声波能补上。

1.2 障碍物检测与表示

传感器拿到原始数据后,怎么变成机器人能理解的「障碍物」?

1.2.1 点云处理

激光雷达输出的是点云——一堆三维坐标点。我们需要从中提取出障碍物。

基本流程:

  1. 滤波: 去掉噪声点。比如用体素滤波降采样,减少计算量。
  2. 地面分割: 把地面点去掉,只保留障碍物点。常用RANSAC算法。
  3. 聚类: 把属于同一个障碍物的点聚在一起。比如欧几里得聚类。
  4. 包围盒: 给每个聚类生成一个最小包围盒,作为障碍物的表示。
// 伪代码示例:点云聚类
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. 数据级融合: 直接把原始数据拼在一起。比如把点云和图像对齐。计算量大,但信息损失少。
  2. 特征级融合: 先提取特征(比如障碍物位置、速度),再融合。效率高,是工程中最常用的。
  3. 决策级融合: 每个传感器独立做决策,最后投票。比如「激光雷达说有障碍,相机也说有,那肯定有」。
核心原则: 融合不是简单的「1+1=2」。要考虑传感器的置信度、时间同步、空间对齐。我见过有人直接把激光雷达和相机的数据叠加,结果因为坐标系没对齐,障碍物位置差了半米——这比不用融合还糟糕。

1.4 感知不确定性处理

这是很多初学者容易忽略的点。传感器数据永远有噪声,永远有误差。如果你把感知结果当作「绝对真理」,规划算法一定会出问题。

不确定性的来源:

  • 传感器本身的噪声(比如激光雷达的测距误差)
  • 环境干扰(比如阳光、雨雾)
  • 算法误差(比如聚类时把两个障碍物当成一个)

怎么处理?

我的做法是:给每个障碍物加一个「不确定性椭圆」。椭圆的大小表示位置的不确定度。规划算法看到这个椭圆,就知道「障碍物大概在这个区域,但具体在哪不确定」,于是会留出更大的安全余量。

// 不确定性建模示例
struct Obstacle {
    Vector3d position;      // 障碍物中心位置
    Matrix3d covariance;    // 协方差矩阵,表示不确定性
    double confidence;      // 置信度,0~1
};

嗯,这里要注意:置信度不能拍脑袋设。我一般会根据传感器的历史表现来动态调整。比如激光雷达在雨天的置信度自动降低,相机的置信度在暗光下降低。

一个小技巧: 如果你用卡尔曼滤波做跟踪,它的协方差矩阵天然就是不确定性的度量。直接用就行,不用自己再算一遍。

本章知识体系

下面这张图,是我自己画的,把本章的核心逻辑串起来了。你可以把它当作一个「思维导图」来看。

传感器与感知基础 · 知识体系 常用传感器 激光雷达 · 相机 · 超声波 障碍物检测与表示 点云 → 聚类 → 包围盒 传感器融合 数据级 · 特征级 · 决策级 不确定性处理 协方差 · 置信度 · 安全余量 核心思想:没有完美的传感器,只有好的融合策略 感知不是「测量」,而是「估计」——永远带着不确定性去思考

好了,这一章就到这里。传感器是机器人的「眼睛」,但眼睛也会骗人。下一章我们会深入聊聊,怎么用这些感知数据做实时轨迹规划。到时候见。


可可精品资料库