3、传感器原理与数据处理:激光雷达(LiDAR)工作原理与点云数据、深度相机(RGB-D)与视觉数据、IMU与里程计数据融合、传感器标定基础

各位同学,欢迎来到传感器原理这一节。说实话,这部分内容是我在飞控算法里最常被问到,也是我自己踩坑最多的领域。你想想看,无人机要避障,首先得「看见」障碍物。但怎么看见?靠什么看见?看见之后数据长什么样?这些问题搞不清楚,后面写再多控制算法也是白搭。

今天我们就来聊聊四种核心传感器:激光雷达、深度相机、IMU,以及它们之间的数据融合。嗯,还有标定——这个我当年吃了不少亏。

3.1 激光雷达(LiDAR)工作原理与点云数据

激光雷达,说白了就是「用激光测距」。它发射一束激光,打到物体上反射回来,通过计算时间差或者相位差,就能知道距离。再配合旋转机构或者固态扫描,就能得到一圈一圈的距离数据。

工作原理核心:

  • ToF(飞行时间法):发射脉冲,计算往返时间。精度高,抗干扰强。我项目中用的基本都是这种。
  • 三角测距法:利用激光发射点和接收点的几何关系。成本低,但远距离精度差。室内小机器人用得多。

点云数据长什么样?其实就是一堆三维坐标点 (x, y, z),外加一个反射强度值。每一帧点云可能有几万到几十万个点。处理起来,CPU 压力不小。

重要概念:点云的稀疏性与密度。16线激光雷达和128线,数据量差8倍。选型时一定要算好算力余量。

个人经验:我在做园区物流无人机时,一开始用了32线雷达,结果点云太密,嵌入式平台跑不动。后来降采样到每帧保留5000个关键点,效果反而更好。有时候不是数据越多越好。

点云处理的基本流程:

  1. 滤波:去除离群点、地面点。常用算法:体素滤波、统计滤波。
  2. 分割:把点云分成不同物体。比如用欧几里得聚类。
  3. 特征提取:提取平面、边缘、角点等。用于后续匹配。
// 伪代码:点云体素滤波
VoxelGrid filter;
filter.setLeafSize(0.1f, 0.1f, 0.1f); // 10cm体素
filter.setInputCloud(raw_cloud);
filter.filter(filtered_cloud);
// 输出:降采样后的点云,数据量减少约70%

3.2 深度相机(RGB-D)与视觉数据

深度相机,就是能同时输出彩色图像和深度图像的相机。常见的原理有三种:

  • 结构光:投射红外点阵,通过变形计算深度。代表:Kinect v1、Intel RealSense。
  • ToF:和激光雷达类似,但用面阵接收。代表:Kinect v2、Azure Kinect。
  • 双目立体视觉:两个摄像头,通过视差计算深度。代表:ZED、Mynt Eye。

深度数据怎么用?我一般把它转成伪点云,然后和激光雷达点云做融合。但要注意,深度相机的有效距离通常只有3-10米,远不如激光雷达。好处是能提供颜色信息,方便做语义识别。

避坑指南:我曾经在户外强光下用结构光深度相机,结果深度图全是黑洞。后来才明白,结构光在阳光下会被淹没。户外场景,老老实实用ToF或者双目。

视觉数据处理的关键步骤:

  1. 畸变校正:去除镜头畸变。标定板拍几张就能搞定。
  2. 深度图滤波:中值滤波、双边滤波,去除噪点。
  3. 对齐:把深度图和彩色图对齐到同一个坐标系。

3.3 IMU与里程计数据融合

IMU(惯性测量单元)包含加速度计和陀螺仪。它能提供高频的角速度和加速度数据。但有个致命问题——漂移。积分几分钟,位置误差就能到几十米。

里程计(Odometry)通常来自轮式编码器或者视觉/激光里程计。它提供相对位姿估计,但低频且有累积误差。

为什么要把它们融合?说白了就是取长补短:

  • IMU:高频(200-1000Hz),短期精度高,但长期漂移。
  • 里程计:低频(10-30Hz),长期稳定,但短期有延迟和噪声。

融合的经典方法就是卡尔曼滤波(EKF)或者因子图优化。我个人习惯用EKF,简单够用。

// EKF融合伪代码(简化版)
// 预测步骤(IMU驱动)
x_pred = x_prev + v * dt + 0.5 * a * dt^2
P_pred = F * P_prev * F^T + Q

// 更新步骤(里程计观测)
z = odom_pose
y = z - H * x_pred   // 残差
S = H * P_pred * H^T + R
K = P_pred * H^T * inv(S)  // 卡尔曼增益
x_updated = x_pred + K * y
P_updated = (I - K * H) * P_pred

我的习惯:IMU的噪声协方差矩阵Q,我一般先跑一段静态数据,算一下Allan方差来定。别拍脑袋设,不然融合效果会很奇怪。

3.4 传感器标定基础

标定,就是把不同传感器的坐标系对齐。比如激光雷达的坐标系和IMU的坐标系之间,有一个旋转和平移关系。这个关系不准,融合出来的数据就是错的。

标定分两种:

  • 内参标定:传感器自身的参数。比如相机焦距、畸变系数;IMU的零偏、尺度因子。
  • 外参标定:传感器之间的相对位姿。比如LiDAR到IMU的旋转矩阵R和平移向量t。

外参标定的常用方法:

  1. 手动标定:找特征点,手动测量。精度低,但快。
  2. 自动标定:用优化算法,比如手眼标定法(AX=XB)。我推荐用Kalibr或者lidar_align这类开源工具。

曾经踩过的坑:有一次我偷懒,外参标定只做了平移没做旋转,结果点云投影到图像上总是歪的。查了两天才发现是旋转矩阵差了0.5度。嗯,标定这事,真不能省。

标定流程大致如下:

  1. 固定传感器,采集多组数据(比如棋盘格、标定板)。
  2. 提取特征点(角点、平面等)。
  3. 构建优化问题,最小化重投影误差或点面距离。
  4. 验证标定结果:看投影误差是否小于1像素,或者点云对齐误差是否小于2cm。

核心总结:传感器是无人机的「眼睛」和「耳朵」。激光雷达给距离,深度相机给颜色和深度,IMU给高频姿态,里程计给低频位置。标定是把它们「对齐」的关键一步。这一步做不好,后面所有算法都是空中楼阁。

传感器数据处理与融合知识体系 激光雷达 (LiDAR) ToF / 三角测距 点云 (x,y,z,intensity) 深度相机 (RGB-D) 结构光 / ToF / 双目 彩色图 + 深度图 IMU 加速度计 + 陀螺仪 高频 (200-1000Hz) 里程计 (Odometry) 视觉 / 激光 / 轮式 低频 (10-30Hz) 数据处理层 滤波 → 特征提取 → 坐标对齐 → 时间同步 数据融合层 EKF / 因子图优化 / 松耦合 / 紧耦合 传感器标定基础(内参 + 外参)

好了,这一节的内容就到这里。传感器原理是基础中的基础,但也是最容易出问题的地方。我建议你动手之前,先把每个传感器的数据格式、坐标系、时间戳搞清楚。不然调试的时候,你会发现自己像个无头苍蝇。

专注资料整理