三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

传感器数据融合基础——为什么要融合、融合什么

传感器数据融合基础——为什么要融合、融合什么

上篇讲了多传感器时间同步——硬件触发、PTP、软件时间戳三种方案,以及不同采样率传感器的对齐方法。时间同步是融合的前提,今天正式进入传感器数据融合的基础——为什么要融合、融合什么、有哪些融合架构。

面试时候被问"为什么要做多传感器融合",很多人会说"一个传感器不够用"。但面试官想听的是更系统化的回答:融合的数学本质是什么?有哪些融合层次(数据级、特征级、决策级)?卡尔曼滤波和因子图优化分别在融合中扮演什么角色?在ROS2中怎么搭建融合框架?

为什么单个传感器不够

每个传感器都有自己的优势和局限。激光雷达精度高但看不到颜色和纹理,相机能看到纹理但测距不准,IMU短期精确但长期漂移,GPS提供绝对位置但会丢失信号,编码器连续但会累积误差。

这些局限不是"改进硬件"就能解决的——它们是由传感器的物理原理决定的。激光雷达的波长决定了它无法分辨颜色,IMU的积分特性决定了它必然漂移,GPS的信号特性决定了它无法在室内工作。

所以我们需要融合。融合的核心思想是:用多个传感器的互补信息来弥补单个传感器的不足。融合后的估计结果应该比任何一个单独传感器的结果都更准确、更可靠。

import numpy as np def demonstrate_fusion_benefit(): """演示融合比单传感器更准确""" np.random.seed(42) true_position = 10.0 # 真实位置 n_samples = 100 # 传感器A:精度高但有偏差 sensor_a = true_position + 0.5 + np.random.normal(0, 0.3, n_samples) # 传感器B:无偏差但精度低 sensor_b = true_position + np.random.normal(0, 1.5, n_samples) # 融合:加权平均(按精度加权) w_a = 1.0 / 0.3**2 # 精度高的权重大 w_b = 1.0 / 1.5**2 fused = (w_a * sensor_a + w_b * sensor_b) / (w_a + w_b) print(f"传感器A误差(RMSE): {np.sqrt(np.mean((sensor_a - true_position)**2)):.3f}") print(f"传感器B误差(RMSE): {np.sqrt(np.mean((sensor_b - true_position)**2)):.3f}") print(f"融合后误差(RMSE): {np.sqrt(np.mean((fused - true_position)**2)):.3f}") demonstrate_fusion_benefit()

运行这段代码你会发现,融合后的误差比任何一个单独传感器都小。这就是融合的价值——不是简单地"取平均",而是根据每个传感器的可靠性分配权重,得到最优估计。

融合的三个层次

传感器融合按融合信息的抽象程度,分为三个层次。

数据级融合(Data-level):直接融合传感器的原始数据。比如把激光雷达的点云和深度相机的点云拼在一起,或者把IMU的原始加速度和角速度直接输入到状态估计器中。数据级融合保留了最多的信息,理论精度最高,但对传感器之间的标定精度要求也最高,而且计算量大。

特征级融合(Feature-level):先从各传感器的原始数据中提取特征,再融合特征。比如从图像中提取边缘和角点,从点云中提取平面和线段,然后把这些几何特征融合到一个统一的地图中。大多数SLAM系统(包括ORB-SLAM、LOAM)都属于这一类。特征级融合的计算量适中,是目前最主流的方案。

决策级融合(Decision-level):每个传感器先独立做出决策(比如"前方有障碍物"),再融合各传感器的决策结果。比如视觉检测到障碍物、激光雷达也检测到障碍物,两个"有障碍物"的结论投票融合。决策级融合最简单,但信息损失也最大——你丢失了"障碍物具体在哪个位置、多大"这些细节。

在实际机器人系统中,这三个层次经常混合使用。比如自动驾驶中,激光雷达和相机可能先各自做目标检测(决策级),然后把检测结果和雷达点云做关联融合(特征级),最后把融合后的目标列表送入规划模块。

融合架构:集中式与分布式

融合系统的架构也分两种。

集中式融合:所有传感器的数据都送到一个中央处理器,统一做融合。优点是信息完整、最优估计;缺点是计算瓶颈——传感器越多,中央处理器的负担越重。

分布式融合:每个传感器先在本地做预处理甚至初步估计,然后把中间结果送到融合节点。比如每个激光雷达先本地做聚类,把聚类结果(而不是原始点云)送给中央节点做关联。计算负担分散了,但信息有损失。

在ROS2中搭建融合框架,通常的做法是:用一个状态估计节点(如robot_localization包的EKF/UKF节点),订阅多个传感器的话题,集中做融合。对于更复杂的系统,可以用因子图优化框架(如GTSAM、iSAM2)来做增量式融合。

面试中怎么聊

面试官问传感器融合基础,按这个顺序回答:先说为什么需要融合(单个传感器的物理局限),再说融合的三个层次(数据级、特征级、决策级),然后说融合的数学本质(贝叶斯估计),最后说融合架构(集中式vs分布式)。

如果面试官追问"数据级融合和特征级融合怎么选",你可以说:取决于应用场景和计算资源。如果计算资源充足(比如有GPU),而且传感器之间的标定精度高,优先用数据级融合——信息保留最多,理论精度最高。如果计算资源有限(嵌入式平台),或者传感器标定精度不够高,用特征级融合更实际。在SLAM中,纯激光SLAM通常用特征级(提取点线面特征),视觉SLAM也用特征级(提取角点、ORB特征),但视觉-惯性SLAM中IMU数据通常是数据级融合(直接融合原始加速度和角速度)。

如果面试官追问"融合的鲁棒性怎么保证",你可以说:关键是异常值检测。如果某个传感器出了故障(比如GPS信号被欺骗、激光雷达被遮挡),它的测量值会严重偏离真实值。如果不做异常值检测就直接融合,一个坏传感器会把整个融合结果带偏。常用的异常值检测方法有:新息检验(测量值和预测值的差异超过阈值就拒绝)、卡方检验(检验测量值是否在统计合理范围内)。在鲁棒融合中,还可以用Huber损失函数代替平方损失,降低异常值的影响。

如果面试官追问"融合系统的可观测性怎么分析",你可以说:可观测性是指能否从传感器的观测数据中唯一确定系统的状态。以移动机器人为例,如果只有编码器,位置和朝向都是可观测的(通过积分)。如果只有单目相机,尺度因子是不可观测的——你无法从图像中判断物体是远还是近(这就是为什么单目视觉SLAM有尺度漂移)。如果相机+IMU,在机器人做加速运动时尺度因子变得可观测(加速度计提供了尺度信息)。可观测性分析在融合系统设计中很重要——如果你选择的传感器组合存在不可观测量,融合结果必然会在某些维度上发散。

分享一个我在项目中做传感器融合的经验。当时给一台室外巡检机器人做定位融合,用的传感器有编码器、IMU、GPS和2D激光雷达。一开始用简单的EKF做融合,效果不太理想——机器人在开阔地带GPS好的时候定位很准,但经过建筑物遮挡GPS信号后,定位会突然跳变。排查后发现是GPS的协方差设置有问题:我们一直用固定的协方差值,没有根据GPS信号质量动态调整。后来我们读取了GPS模块输出的HDOP(水平精度因子)值,HDOP大说明精度差,就把GPS的观测噪声协方差相应增大。这样在GPS信号被遮挡时,融合器会自动降低GPS的权重,更多依赖编码器和IMU的积分结果,定位就不会跳变了。改完之后定位的平滑性和可靠性都提升了很多。面试时候能讲出这种根据信号质量动态调整权重的经验,比只说"我用了EKF"有说服力得多。

下一篇讲卡尔曼滤波详解——预测-更新循环的直觉理解。从融合基础到具体算法,卡尔曼滤波是传感器融合中最核心的工具。


如果这篇文章对你有帮助,欢迎点赞、在看、转发三连。 你的支持是我持续更新的最大动力。

「机器人软件开发面试·从入门到精通」连载系列上一篇:第164篇 多传感器时间同步——硬件触发/PTP/软件时间戳的工程实践 下一篇预告:第166篇 卡尔曼滤波详解——预测-更新循环的直觉理解

有任何问题欢迎评论区留言,我会尽量回复。

← 返回列表