3、传感器原理与数据处理:激光雷达(LiDAR)工作原理与点云数据、深度相机(RGB-D)与视觉数据、IMU与里程计数据融合、传感器标定基础
各位同学,欢迎来到传感器原理这一节。说实话,这部分内容是我在飞控算法里最常被问到,也是我自己踩坑最多的领域。你想想看,无人机要避障,首先得「看见」障碍物。但怎么看见?靠什么看见?看见之后数据长什么样?这些问题搞不清楚,后面写再多控制算法也是白搭。
今天我们就来聊聊四种核心传感器:激光雷达、深度相机、IMU,以及它们之间的数据融合。嗯,还有标定——这个我当年吃了不少亏。
3.1 激光雷达(LiDAR)工作原理与点云数据
激光雷达,说白了就是「用激光测距」。它发射一束激光,打到物体上反射回来,通过计算时间差或者相位差,就能知道距离。再配合旋转机构或者固态扫描,就能得到一圈一圈的距离数据。
工作原理核心:
- ToF(飞行时间法):发射脉冲,计算往返时间。精度高,抗干扰强。我项目中用的基本都是这种。
- 三角测距法:利用激光发射点和接收点的几何关系。成本低,但远距离精度差。室内小机器人用得多。
点云数据长什么样?其实就是一堆三维坐标点 (x, y, z),外加一个反射强度值。每一帧点云可能有几万到几十万个点。处理起来,CPU 压力不小。
重要概念:点云的稀疏性与密度。16线激光雷达和128线,数据量差8倍。选型时一定要算好算力余量。
个人经验:我在做园区物流无人机时,一开始用了32线雷达,结果点云太密,嵌入式平台跑不动。后来降采样到每帧保留5000个关键点,效果反而更好。有时候不是数据越多越好。
点云处理的基本流程:
- 滤波:去除离群点、地面点。常用算法:体素滤波、统计滤波。
- 分割:把点云分成不同物体。比如用欧几里得聚类。
- 特征提取:提取平面、边缘、角点等。用于后续匹配。
// 伪代码:点云体素滤波
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或者双目。
视觉数据处理的关键步骤:
- 畸变校正:去除镜头畸变。标定板拍几张就能搞定。
- 深度图滤波:中值滤波、双边滤波,去除噪点。
- 对齐:把深度图和彩色图对齐到同一个坐标系。
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。
外参标定的常用方法:
- 手动标定:找特征点,手动测量。精度低,但快。
- 自动标定:用优化算法,比如手眼标定法(AX=XB)。我推荐用Kalibr或者lidar_align这类开源工具。
曾经踩过的坑:有一次我偷懒,外参标定只做了平移没做旋转,结果点云投影到图像上总是歪的。查了两天才发现是旋转矩阵差了0.5度。嗯,标定这事,真不能省。
标定流程大致如下:
- 固定传感器,采集多组数据(比如棋盘格、标定板)。
- 提取特征点(角点、平面等)。
- 构建优化问题,最小化重投影误差或点面距离。
- 验证标定结果:看投影误差是否小于1像素,或者点云对齐误差是否小于2cm。
核心总结:传感器是无人机的「眼睛」和「耳朵」。激光雷达给距离,深度相机给颜色和深度,IMU给高频姿态,里程计给低频位置。标定是把它们「对齐」的关键一步。这一步做不好,后面所有算法都是空中楼阁。
好了,这一节的内容就到这里。传感器原理是基础中的基础,但也是最容易出问题的地方。我建议你动手之前,先把每个传感器的数据格式、坐标系、时间戳搞清楚。不然调试的时候,你会发现自己像个无头苍蝇。