☰
多传感器目标级融合:信息矩阵与DS证据理论的Matlab仿真实践
2026/10/22 9:00:03 网站建设 项目流程

做自动驾驶感知融合这几年,有个体会越来越深:单传感器的感知能力再强,也扛不住“看不到”“看不清”“看错”三个字。摄像头在逆光下把白色厢式货车当背景,毫米波雷达把静止的铁护栏当成目标,激光雷达在雨雾天点云稀疏到没法聚类。真正到了工程落地,没人指望某一个传感器永远是对的,大家心里都清楚要靠融合把信息捏在一起。可融合做到哪一级,用什么理论框架,不同做法之间的差距相当大。这篇内容我围绕“信息矩阵融合算法 + Dempster-Shafer证据理论 + 目标级融合”这个技术组合展开,结合一套Matlab仿真代码,谈谈整体设计、核心原理、实现细节和调试过程中踩过的坑,适合正在做多传感器融合、算法预研或者毕业设计的开发者参考。

先交代一下这套方案解决的核心问题:在自动驾驶中,摄像头、毫米波雷达、激光雷达各自输出目标列表(位置、速度、类型、置信度),但这些输出来自异构传感器,坐标系不同、精度不同、语义信息也不同。目标级融合要做的,就是把这些“已经形成的目标假设”合并成一份完整、一致、可信的环境目标列表,给后续的决策规划模块用。这里的状态估计层面我用信息矩阵做加权融合,属性识别层面用DS证据理论处理不确定性。

1. 目标级融合的整体思路:为什么把“决策”放在融合之后

1.1 从数据级、特征级到目标级的演进逻辑

多传感器融合按照数据处理层次,通常分成数据级、特征级和目标级三类。数据级融合直接对原始信号做处理,像激光雷达点云直接叠加、多摄像头图像像素级拼接,这种方法信息损失最小,但对通信带宽、时间同步和计算资源的要求极高,而且不同传感器如果分辨率差太多,原始数据根本对不上。特征级融合是从原始数据里提取特征后再融合,比如分别提取边缘、角点、深度特征,再在特征空间里做匹配,灵活性比数据级高一些,但特征对齐本身就是一个难题。

目标级融合是层级最高、也是最贴合自动驾驶工程实践的方案。它的输入是各传感器已经完成目标检测和跟踪后的输出,通常是结构化目标列表,包括目标ID、三维位置、速度、尺寸、类型概率等属性。融合模块不关心这些目标是怎么检测出来的,只关心怎么确认两个传感器报告的是同一个物理目标、怎么把多份有冗余且可能冲突的信息合并成更可信的结果。这种方案的工程优势很明显:传感器之间松耦合,任意一路传感器坏了或暂时掉线,系统整体还能运行;通信量小,适合分布式部署;模块边界清晰,检测、跟踪、融合、决策可以分开开发和测试。

1.2 双通道融合设计:状态通道用信息矩阵,属性通道用DS证据

拿到目标级数据之后,要融合的信息其实是两类东西。一类是连续量,比如目标的横纵向位置、速度、加速度,这些量有明确的物理单位,适合用估计理论处理;另一类是离散量,比如目标是车辆、行人还是自行车,每个传感器会给出类型置信度,还有可能是“未知”,这些量是语义层面的判断,存在重叠、模糊和冲突,不适合用传统的最小二乘去“平均”。

所以我把融合拆成双通道。状态通道走信息矩阵融合:每个传感器上报目标时附带状态估计和协方差矩阵,把协方差求逆得到信息矩阵,按互不相关的原则相加,再还原成融合后的状态估计和协方差。这个通道的理论基础是信息滤波,本质上是把“不确定性越低贡献越大”这件事变成了数学上的加权。属性通道走Dempster-Shafer证据融合:构造辨识框架,把各传感器的类型置信度映射成基本概率分配,再用Dempster组合规则合并多路证据,输出各候选类型的信任度和似然度。

为什么要这样拆分?因为这两类信息在数学结构上完全不同。位置和速度可以用高斯分布近似表达,误差传播和更新有一套成熟的体系;类型判断本质上是分类问题,分类器输出的概率并不总是满足可加性和完备性,直接做贝叶斯融合在“传感器可能互相矛盾”的场景下会给出偏激的结果。DS理论允许把概率质量赋予集合而不是单个元素,天然支持“不确定”和“不知道”的表达,这一点和自动驾驶中“目标类型确实不确定”的现实非常契合。

2. Dempster-Shafer理论的核心细节与BPA构造

2.1 辨识框架、BPA、信任与似然的关系

DS证据理论最关键的概念是辨识框架,也就是所有可能结论组成的完备集合,记作Θ。在自动驾驶目标类型融合里,可以设Θ = {车辆, 行人, 自行车},这就是一个三元素辨识框架,共有2的3次方等于8个子集。基本概率分配函数(BPA)给每个子集分配一个质量值,满足空集的质量为0,所有子集质量之和为1。和概率分布的区别在于,概率必须把质量分给单元素,而BPA允许把质量分给多元素集合,比如m({车辆, 行人}) = 0.3,这条表示“我认为是车或行人,但区分不了”。我对这个特性特别看重,它在传感器被遮挡、目标轮廓模糊时非常实用。

信任函数Bel和似然函数Pl是从BPA推导出来的两个区间端点。Bel(A)是所有A子集的质量之和,表示“对A的完全信任下限”;Pl(A)是所有与A有交集的质量之和,表示“对A的潜在信任上限”。区间[Bel(A), Pl(A)]就是A的不确定区间,区间越大说明证据越拿不准。在目标类型判定时,不能只用Bel大小排序,还要看Pl和Bel的差距,如果差距太大,说明当前证据不足以支撑一个果断的决策,不如输出“未知”。

2.2 从分类器输出到BPA的三种映射方案

在Matlab代码里,把传感器输出的类型概率转换成BPA,是整套算法里最容易出错的一步。我实际用过三种方案,各有适用场景。第一种是直接映射,适用于神经网络分类器输出层带softmax并且训练数据分布比较均衡的情况。如果模型输出车辆0.6、行人0.3、自行车0.1,直接把这三个置信度作为单元素焦元的BPA:m({车辆}) = 0.6,m({行人}) = 0.3,m({自行车}) = 0.1,不分配多元素质量。这种做法的缺陷是模型如果看到未知目标,比如一辆三轮车,softmax还是会强行给出一个分布,哪一类都不高但硬要选一个,直接映射会把这种错误固化进融合结果。

第二种是基于先验概率打折的方案,也是我在项目里最常用的。每种传感器都有一个混淆矩阵,表示它把真实目标判断成各类别的概率。假设通过经验标定,知道某摄像头的目标类型识别可靠性只有70%,我就从总质量1里取出0.3作为全局不确定质量,分配给全集Θ,剩下0.7按模型输出比例分配给单元素。这样即使模型输出带偏差,融合公式里也会保留“我不知道”的空间。第三种是基于似然比或证据距离的构造,用于处理传感器输出不是概率而是边界框置信度加类型的场景,通过归一化把检测置信度转成BPA。

具体到代码实现,我会用一个结构体数组存储BPA,每个元素包含焦元列表focal_elements和对应的质量值mass_values。建议不要把BPA写成一个固定长度的数组,因为不同传感器在不同时刻的有效焦元集合是变的。比如传感器A输出车辆0.8、全集0.2,传感器B输出车辆0.7、行人0.2、全集0.1,焦元集合不同,组合时要动态求交集。Matlab用cellfun和unique配合可以比较优雅地完成这个操作。

2.3 Dempster组合规则的实现与冲突困境

Dempster组合规则是DS融合的核心计算,公式是组合后的质量正比于所有交叠为空集的两两组合质量乘积。规则本身不复杂,但实现时要注意归一化系数K的处理。K是所有空集交叠质量乘积之和,它反映了两路证据的冲突程度。如果K趋近1,说明两路证据几乎完全矛盾,比如传感器A强烈认为是车辆,传感器B强烈认为是行人,此时组合结果对K极其敏感,微小数值误差都会被放大。我建议代码里做一个冲突系数阈值判断,K高于某个上限(比如0.8)时丢弃融合结果,改用单路高置信证据,或者输出未知类型,而不是强行组合出一个没有依据的结论。

实现Dempster组合规则时有几个数值细节值得注意。第一,浮点数累加时K会存在误差,质量极小的焦元可以设置一个截断阈值(比如1e-6),低于阈值的质量直接清零再重新归一化,避免淹没在后续计算里。第二,如果有多路证据,不要一次性把所有BPA塞进组合规则里,而是两两递归组合。组合顺序对结果有影响,但不是理论缺陷,实际工程项目里一般按传感器可信度从高到低组合,这样低可信传感器引入的噪声影响更小。第三,组合后检查是否出现了不正常的全零质量,这通常意味着某路BPA构造错误,尤其是出现了m(空集)不为0的情况,一定要在BPA构造函数入口做断言检查。

3. 信息矩阵融合与目标关联的实现要点

3.1 信息矩阵与协方差的关系,为什么要用信息矩阵

状态融合这一路,我选择用信息矩阵而不是直接加权平均,原因是信息矩阵在“融合多路具备不同不确定性的估计”时,数学形式非常自然。对一个高斯分布估计,信息矩阵定义为协方差矩阵的逆矩阵,信息向量定义为信息矩阵乘以状态向量。两路相互独立的估计做融合时,融合后的信息矩阵等于各路信息矩阵之和,融合后的信息向量等于各路信息向量之和,这个加法操作不需要额外计算权重,信息量大的估计自动占据主导地位,这是卡尔曼滤波和信息滤波的等价性推导出来的结果。

我在Matlab里写这段代码时,会用状态向量x = [px, py, vx, vy],协方差矩阵P。每个传感器上报目标时会附带对应的P,里面包含位置方差、速度方差以及px和vx等状态量之间的协方差项。融合前先判断两路输入是否确实是同一个目标,然后做信息矩阵融合。举个例子,摄像头测位置精度高,协方差较小;雷达测速度精度高,协方差在速度维度上更小。融合后位置维度摄像头贡献大,速度维度雷达贡献大,得到的协方差矩阵每个维度都比单路估计小。这个效果在加权平均方案里很难自然体现,因为固定权重不会随场景变化。

有一点我在实际代码里踩过坑:直接用协方差求逆计算信息矩阵时,如果协方差矩阵病态,比如某个维度方差极小(接近1e-8量级),求逆结果会爆炸,导致融合结果震荡。解决方案是加正则项或者做特征值截断。特征值截断的逻辑是,小于最大特征值1e-6倍的特征值强制设为该阈值,再重构对称正定矩阵。Matlab里用eig分解之后修正再组合,代码量不大,但对数值稳定性提升非常明显。

3.2 时间同步与空间对准

目标级融合有一件绕不开的脏活,时间同步和空间对准。时间不同步直接融合出来的位置全是指向不同时刻的,毫无意义。我用的方案是选择融合主时间基准,一般是精度高、更新率稳定的那路传感器的时间戳,其他传感器通过线性插值或者恒定速度外推,把目标位置和速度对齐到主时间戳上。数据更新率差异大的情况下,比如激光雷达10赫兹、毫米波雷达20赫兹,我会选择缓存最近两帧目标状态,在融合瞬时做线性外推,代码实现不复杂但很有效。

空间对准是坐标系转换问题。每路传感器都有自己的安装位置和朝向角,目标位置要从传感器坐标系转换到统一的车辆坐标系。这个转换包含平移和旋转,安装参数可以通过标定得到。我在代码里建议把坐标系转换封装成一个独立函数sensor_to_vehicle(x_sensor, y_sensor, sensor_pose),其中sensor_pose包含安装位置的x,y偏置和航向角。注意航向角的正方向定义要统一,别一个传感器用度、另一个用弧度,这种低级错误排查起来非常折磨人。统一转换后,再检查目标是否在合理范围内,比如目标在车辆后方30米却在雷达上报里显示为前方目标,这种大概率是坐标转换或传感器安装参数出了问题。

3.3 目标关联:马氏距离与属性联合门限

关联是目标级融合承上启下的关键步骤,关联错了后面一切融合都白费。我先用空间位置做初步关联,两张目标观测的差值除以联合协方差得到马氏距离,公式是d = (z1-z2)^T (P1+P2)^-1 (z1-z2)。这里用联合协方差而不是某个固定阈值,是为了适应不同传感器精度差异。摄像头位置精度高,同样5米的欧式距离在马氏距离里会被放大,雷达相反,这就要求关联门限必须同时考虑位置差和协方差,否则容易把不同目标误关联或把同一目标漏关联。

光靠空间关联还不够。两个距离很近的目标,比如一个行人贴着车站,雷达和摄像头分别检测,如果空间位置相近,马氏距离可能过门,但属性一个是行人(摄像头),一个是车辆(雷达),这种关联值得怀疑。所以在空间关联的基础上,我加了属性一致性检查,把两路目标类型转化成BPA形式,计算它们的证据距离,超过阈值就拒绝这段关联。用证据距离而不是简单地比较概率最高的类别,是因为BPA中“未知”质量的存在会让“车辆vs车辆”和“车辆vs行人的全集”在语义上有微妙差异,证据距离能更合理地量化这种差异。

关联正确性直接影响后续融合效果,我在代码里维护一个关联矩阵,每行代表融合目标ID,每列代表传感器来源,矩阵值标识某路传感器是否关联到对应目标,这样后续实现时逻辑清楚,调试也方便。关联算法建议从最简单的最近邻法开始,确认整体流程正确后再考虑复杂算法,贪心最近邻在目标稀疏、传感器质量好的场景下表现并不差,贸然上多目标指派算法反而增加了调试难度。

4. Matlab代码实现的完整流程与关键节点

4.1 仿真场景与传感器模型设计

Matlab仿真的第一步是定义场景,我设计了一个四车加一个行人的路口场景。在车体坐标系下,目标1是正前方25米以60km/h行驶的轿车,目标2是左侧车道15米处以50km/h行驶的SUV,目标3是前方8米处静止站在人行道旁的行人,目标4是右侧30米处对向行驶的自行车。每路传感器都有各自特性:摄像头位置精度高但速度精度一般,类型识别对行人和车辆较好但晚上容易把自行车误判成行人;毫米波雷达速度精度高但位置横向精度差,对静止目标的检测能力弱;激光雷达位置和尺寸精度高,但远距离点云稀疏时类型判别不敢下结论。这些差异都体现在传感器协方差矩阵和BPA构造参数里,让仿真结果贴近真实。

仿真循环以0.1秒为步长,共20秒,对应200帧。每帧中按一定检测概率决定传感器是否检测到目标,比如激光雷达对行人的检测概率设为0.85,毫米波雷达对行人的检测概率只有0.6,以此模拟漏检。生成传感器观测时,在真值上加协方差对应的随机扰动,再把目标类型置信度输入到混淆矩阵模型里得到分类输出。这样一套流程跑下来,得到了三路带噪、带漏检、偶尔分类错误的目标列表,作为融合算法的输入。

4.2 核心函数拆分与关键代码逻辑

代码拆分遵循“一个函数只做一件事”的原则,main_simulation.m负责场景循环和数据流控制,特殊处理的部分封装成独立函数。BPA构造函数make_bpa_from_classifier接收分类输出向量和混淆矩阵,按2.2中的打折方案生成BPA。比如摄像头分类器输出车辆0.8、行人0.1、自行车0.1,混淆矩阵主对角线表示各类型正确识别率,其他位置表示误判率,函数内部会动态计算质量分配。

可以看下这个函数的核心逻辑:

function bpa = make_bpa_from_classifier(type_prob, confusion, unknown_mass) % 输入type_prob是分类器输出的类型概率向量 % confusion是混淆矩阵,unknown_mass是分配给全集的不确定质量 % 输出bpa结构体,包含焦元集合和质量 n_type = length(type_prob); bpa.focal = {}; bpa.m = []; % 保留部分质量给全集,表达不确定性 bpa.focal{1} = 1:n_type; bpa.m(1) = unknown_mass; % 剩余质量按分类概率分配到单元素焦元 remaining = 1 - unknown_mass; for t = 1:n_type bpa.focal{end+1} = t; bpa.m(end+1) = remaining * type_prob(t); end % 用混淆矩阵进一步打折可靠度 reliability = mean(diag(confusion)); bpa.m(1) = 1 - reliability * (1 - bpa.m(1)); for t = 1:n_type bpa.m(t+1) = reliability * bpa.m(t+1); end % 归一化保证和为1 bpa.m = bpa.m / sum(bpa.m); end

DS组合函数ds_combine是实现Dempster规则的模块,输入是两个bpa结构体,输出组合后的bpa。核心是双层循环遍历所有焦元组合,计算交集和冲突累加。组合后用冲突系数K做一致性判定,K超过阈值时返回一个明确的冲突标记,由上层决定处理策略。这个函数我建议固化后做单元测试,用几个经典手算案例验证输出,比如车辆0.9和质量1.0的证据组合结果应该还是车辆0.9,这种守恒性质能帮你很快排除bug。

信息矩阵融合函数info_matrix_fusion的输入是两个目标状态x1、x2及协方差P1、P2,先对P做特征值截断修正,再求逆得到信息矩阵,按信息形式加权得到融合状态。代码实现时要特别注意矩阵维度一致性,Matlab里四维状态对应的协方差是4x4矩阵,索引错一位很容易出现维度不匹配的报错。

4.3 融合决策输出与可视化评估

融合完成后,需要输出决策结果并评估质量。属性通道,对每个目标计算融合BPA后,依据信任函数和似然函数判定类型:若最大信任度超过0.7且对应不确定区间宽度小于0.3,才输出具体类型;否则输出“未知”。这个保守策略对下游的规划模块非常重要,乱猜一个类型导致的后果比承认不知道严重得多。状态通道输出融合后的目标位置、速度和协方差椭圆。

可视化方面,我用Matlab的figure和plot函数绘制车体坐标系下的目标分布图。用不同颜色标记不同传感器上报的目标,用椭圆画置信区间,融合后目标用另一个颜色加粗绘制。我还叠加一个Confusion/Acceptance面板,显示200帧内每个目标的类型判定结果和关联关系,错误关联和类型误判在这种图上一眼可见。这个可视化面板帮我找到了不少代码问题,强烈建议在实际项目里也做类似的可视化。

另外写一个metrics函数,统计平均位置误差(相对单传感器误差)、类型判定正确率、漏关联率和误关联率。我跑仿真时发现,融合后的平均位置误差一定要明显优于任何单传感器,否则融合就没有工程意义。一般来说,融合误差比最优单传感器提升20%到30%是合理的预期,如果提升不明显,大概率是协方差估计偏大或者融合权重不合理。

5. 常见问题与排查技巧实录

5.1 高冲突场景下组合结果反直觉

调试中最常见的问题就是K值很大时,Dempster规则给出违反直觉的结果。我举一个真实场景:摄像头识别目标A为车辆,置信度0.9,雷达识别同一目标为行人,置信度0.8。经典Dempster组合后算法结果可能倾向于支持一个两者都不是的结论,或者输出不稳定的低置信度结果。这本质是因为组合规则把冲突证据当作“待归一化的噪声”,而冲突大时这个噪声会主导结果。

我采用的处理方法分三步。第一步是关联阶段先做属性一致性校验,证据距离过大的关联对直接拒绝,不进入融合;第二步是给每路传感器的BPA引入基于历史可靠性的折扣系数,历史性能差的传感器贡献自动削弱;第三步是设置冲突阈值,K超过0.8时不对两路证据做Dempster组合,而是执行“选择信任度更高者”或“输出未知”策略。这样处理之后,仿真中即使出现传感器互相台杠的情况,融合输出也不会出现离谱的错误。

5.2 同一目标被重复融合导致过置信

这个问题隐蔽但后果严重。同一个物理目标可能在一帧内被同一传感器输出两个跟踪轨迹,比如摄像头在目标被短暂遮挡时生成了两个ID;融合模块如果没识别出两个关联假设描述的是同一个目标,会把两路“实际上是同一个来源”的证据当独立证据做组合,DS组合规则会把置信度推到接近1的虚高水平。更复杂的情况是历史帧已经融合过一次,当前帧又用同样的传感器测量做融合,累积置信度看上去越来越强,实际上是在重复计算同一个来源。

解决办法是融合模块里维护一个目标生命周期表,记录每个融合目标在最近N帧关联到的传感器ID列表。融合前检查当前证据的来源是否已经存在于目标历史证据源中,如果存在,不重复组合BPA,只更新状态估计,或者对重复证据做信息矩阵层面的一致性处理。这个机制在状态通道同样重要,信息矩阵融合假设各来源独立,如果违反独立性,信息会膨胀,协方差被低估,Matlab里表现为椭圆越画越小但实际上位置还在漂移。

5.3 信息矩阵奇异与数值不稳定

最开始跑代码时,遇到过信息矩阵求逆报错的情况。协方差矩阵在某些场景下会变得接近奇异,比如速度方差极小或位置方差极小,对应信息矩阵元素巨大,融合时状态更新剧烈震荡。这不是算法原理有问题,是数值层面没有做保护。我后来在求逆前统一做一次对称正定修正:先用eig分解得到特征值向量d和特征向量矩阵V,再把小于最大特征值0.000001倍的特征值替换为该值,然后重构矩阵,最后再求逆。这个操作在高维状态空间下也能稳定工作。

还有一个容易忽视的细节是,信息矩阵相加时如果直接对原协方差矩阵求逆再加和,计算量虽小但浮点误差会被放大。折中方案是先对协方差做Cholesky分解,再用分解后的下三角矩阵操作,精度更好,Matlab里chol函数的数值稳定性比inv好很多。如果仿真中目标数量大增导致组合爆炸,提前把循环改成矩阵运算,可以在保证仿真实时性的同时减少数值误差。

5.4 漏检与遮挡情况下的一次实战处理

我印象比较深的一次调试是仿真中设置了行人被前方车辆短暂遮挡的场景。遮挡期间,摄像头漏检,雷达返回一个“未知”类型且位置扰动较大的观测。按照最初的代码逻辑,漏检传感器不参与融合,融合结果退化为单传感器,类型置信度掉得很快,决策模块在几帧内不断变换对目标类型的判断,导致了后续规划动作的犹豫。这个现象在真实系统里同样存在,解决的关键是“记忆与预测”。

我在融合模块中增加了一个泄漏积分机制:如果当前帧某传感器漏检,不立即清零它的贡献,而是把上一帧该传感器对该目标的BPA做时间折扣后保留;如果连续多帧漏检,折扣因子逐渐衰减,最终自动退出。这样在短暂遮挡期间,融合类型置信度不会剧烈跳动,位置估计也可以依靠预测模型维持。这套机制的实际效果是目标类型判定在遮挡期间保持了稳定,明显减少了下游模块的误决策。

再分享一个排查方法和协作建议。如果你跑代码时发现融合结果比单传感器还差,先别急着调算法参数,先可视化传感器各自的输出以及融合输出,逐帧点查关联是否错误。大部分问题出现在关联而不是融合本身,建议写一个关联结果回放的脚本模块,逐帧慢放,盯住跳变和错配的马氏距离。如果发现DS融合的置信度始终过于乐观,检查BPA构造里是不是“未知”质量分配得太少,给全集的质量调大一些,往往能显著改善序贯融合的稳定性。

按我的经验,这套“状态通道信息矩阵 + 属性通道DS证据”的组合框架适合在中等规模的工程原型里落地,代码可控、性能稳定、逻辑清晰,也不会引入过重的计算负担。如果后续需要扩展到相机与激光雷达原始数据的深度融合,可以在这个框架里继续增加特征层分支,但注意保持目标层信号处理与决策模块解耦,避免以后替换底部模型时让上层不兼容。仿真参数建议用随机种子固定之后再逐步调,不同随机数下结果差异往往比参数差异还大,对着充满随机性的输出调参数容易调到“正好适配某个随机种子”的假象,白白浪费时间。

这个内容其实还能继续延伸,比如把分类器输出的软概率用温度系数标定后再进BPA,或者用证据距离做自适应的传感器权重调节,都能明显提升融合质量。我从这套仿真代码里收获的最大经验其实不是某个公式,而是意识到“知道不知道”才是融合算法最难也是最有价值的部分——能够合理表达不确定性,比一味追求高置信度的说服力强得多。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询