第1章:传感器基础与数据特性(上)

各位同学好,我是你们这门课的主讲。今天咱们来聊聊多传感器融合里最基础、也最绕不开的两个传感器——激光雷达和IMU。

说实话,我做了这么多年机器人,见过太多项目在传感器选型上栽跟头。要么是激光雷达精度不够,建图建出一堆鬼影;要么是IMU噪声太大,融合算法怎么调都收敛不了。所以这一章,咱们把这两个传感器的底裤扒干净,看看它们到底是怎么工作的,数据长什么样,以及——怎么用好它们。

1.1 激光雷达(LiDAR)工作原理

激光雷达,英文叫LiDAR,全称是Light Detection And Ranging。说白了,就是通过发射激光束,测量目标物体的距离。

工作原理其实不复杂:激光器发射一束脉冲激光,打到目标物体上反射回来,被接收器捕获。通过记录激光往返的时间差,乘以光速再除以2,就能算出距离。这就是最经典的飞行时间法(ToF,Time of Flight)。

核心公式:

距离 = (光速 × 飞行时间) / 2

其中光速 c ≈ 3.0 × 10⁸ m/s

当然,现在也有调频连续波(FMCW)的方案,原理略有不同,但主流还是ToF。我在做园区无人车项目时,用的就是16线机械式激光雷达,ToF方案,效果中规中矩。

个人经验:选型时别只看线数。16线在某些场景下比32线还好用,因为点云密度和视场角要匹配你的应用场景。我见过有人用64线雷达做室内小场景,结果点云太密,计算量爆炸,实时性根本跟不上。

1.2 点云数据格式

激光雷达输出的数据,我们叫它点云(Point Cloud)。每个点包含三维坐标(x, y, z),有时候还带反射强度(intensity)和通道号。

最常见的格式是PCD(Point Cloud Data)和PLY(Polygon File Format)。但在实际工程中,我们更多直接处理二进制流或者ROS的sensor_msgs/PointCloud2消息。

举个例子,一个典型的点云数据包长这样:

# 伪代码示例:点云数据结构
struct PointXYZI {
    float x;      // 米
    float y;      // 米
    float z;      // 米
    float intensity; // 0-255,反射强度
};

struct PointCloud {
    uint32_t width;      // 点云宽度
    uint32_t height;     // 点云高度(1表示无序点云)
    PointXYZI[] points;  // 点数据数组
};

嗯,这里要注意:height为1时,表示这是无序点云,所有点按顺序排列。height大于1时,表示这是有序点云,可以按行和列索引。我早期做项目时没注意这个细节,结果处理有序点云时用了无序的遍历方式,导致索引越界,程序直接崩了。从那以后,我每次拿到点云数据,第一件事就是检查height字段。

1.3 主要特性:精度、视野、更新率

激光雷达有三个核心指标,选型时必须搞清楚:

特性 说明 典型值 我的建议
精度 测距误差,通常为±1~3cm ±2cm @ 100m 室内场景选±3cm以内即可,室外远距离要±1cm
视野(FOV) 水平和垂直的扫描角度范围 水平360°,垂直30°(16线) 机械式雷达水平视野好,固态雷达垂直视野窄
更新率 每秒输出多少帧点云 10~20 Hz 高速移动场景建议20Hz以上,低速场景10Hz够用

避坑指南:我曾经在高速移动的AGV上用了10Hz的雷达,结果每帧之间车辆移动了1米多,点云畸变严重,建图直接糊了。后来加了IMU做运动补偿才解决。所以,如果你做高速场景,更新率一定要高,或者必须做运动畸变校正。

1.4 惯性测量单元(IMU)工作原理

IMU,全称Inertial Measurement Unit,惯性测量单元。它内部集成了加速度计和陀螺仪,用来测量物体的加速度和角速度。

加速度计的原理,说白了就是测量一个质量块在加速度作用下的位移。你想想看,当你坐车急加速时,身体会往后靠,加速度计里的质量块也是这个道理。通过电容或压电效应,把位移转换成电信号,就能算出加速度。

陀螺仪呢,测量的是角速度。常见的是MEMS陀螺仪,利用科里奥利效应——一个振动的质量块在旋转时会产生侧向位移,通过检测这个位移就能算出旋转速度。

核心数据:

  • 三轴加速度:ax, ay, az,单位 m/s²
  • 三轴角速度:wx, wy, wz,单位 rad/s

我习惯把IMU数据想象成一个六维向量:[ax, ay, az, wx, wy, wz]。这个向量每时每刻都在变化,记录着物体的运动状态。

1.5 零偏与噪声特性

IMU有个让人头疼的问题——零偏(Bias)和噪声(Noise)。

零偏是什么意思?就是当IMU静止不动时,理论上加速度计应该输出0,陀螺仪也应该输出0。但实际上,由于制造工艺和温度影响,它们会输出一个非零的小值。这个值就是零偏。

噪声就更烦人了。IMU的输出信号里,总是叠加着随机噪声。你想想看,如果直接对加速度积分求速度,再积分求位置,噪声会像滚雪球一样越滚越大。这就是为什么纯IMU导航几分钟就漂到天边去了。

误差类型 来源 影响 处理方法
零偏(Bias) 制造误差、温度漂移 积分后产生累积误差 静态标定、在线估计
白噪声(White Noise) 电路热噪声、量化噪声 高频抖动 低通滤波、滑动平均
随机游走(Random Walk) 零偏随时间缓慢变化 长期漂移 卡尔曼滤波中建模

个人经验:我建议你在拿到新IMU后,先做一次静态标定。把IMU水平放置,采集5分钟数据,计算均值作为零偏。然后把这个零偏值硬编码到初始化参数里。虽然不完美,但能省掉很多后续调试的麻烦。

另外,IMU的噪声特性通常用Allan方差来分析。这个工具能帮你区分白噪声、零偏不稳定性、随机游走等不同噪声成分。我在做高精度组合导航时,每次换IMU芯片,第一件事就是跑Allan方差,看看它的噪声底限在哪里。

好了,这一章的内容就到这里。激光雷达和IMU,一个提供绝对测量(距离),一个提供相对测量(加速度、角速度)。两者互补,正是多传感器融合的魅力所在。下一章,咱们接着聊相机和编码器,看看它们又有什么脾气和秉性。

公众号:蓝海资料掘金营,微信deep3321