FA_融合和滤波(FF)-联邦滤波(FKF)

FA :formulas and algorithm, FF :fusion and fitting, FKF:Federated Kalman Filter‌

二、联邦滤波简述

1. 核心定义与背景

联邦滤波是一种分布式多传感器信息融合滤波算法,由卡尔曼滤波扩展而来,核心思想是:

复制代码
将全局滤波任务分解为多个子滤波器(对应不同传感器 / 子系统),子滤波器独立运行完成局部状态估计,再通过 "信息分配 / 融合" 策略将子滤波器结果合并为全局估计,同时支持子滤波器的 "信息重置" 以保证全局一致性。

区别于集中式融合(所有传感器数据汇总到中心节点统一滤波),联邦滤波兼具分布式的灵活性 (子滤波器独立工作)和全局最优性(融合后接近集中式性能),是多传感器融合领域的经典框架。

2. 依托的基本原理与定理

联邦滤波的数学根基是以下核心理论:

基础理论 核心作用
卡尔曼滤波(KF/UKF/EKF) 子滤波器和主滤波器的基础滤波框架,提供 "预测 - 更新" 的递推估计能力
信息论(信息矩阵 / 信息向量) 联邦滤波的核心融合工具,信息矩阵 Y=P−1(协方差的逆),信息向量 y=P−1x^,融合本质是信息的加权求和
贝叶斯估计定理 多源信息融合的理论基础,全局估计是各子滤波器估计的后验概率加权组合
正交投影原理 卡尔曼滤波的本质是状态在观测空间的正交投影,联邦滤波的信息融合满足正交投影的最优性
信息守恒原理 联邦滤波的 "信息分配 / 重置" 需满足全局信息总量守恒,保证滤波稳定性

3. 核心机器原理与核心公式

复制代码
子滤波器:对应单个传感器 / 子系统,独立完成局部状态估计,输出局部状态 x^i​ 和协方差 Pi​;
主滤波器:负责接收子滤波器结果、融合得到全局估计、向子滤波器分配信息(保证一致性);
信息分配系数:βi​(i=0 为主滤波器,i=1..n 为子滤波器),满足 ∑i=0n​βi​=1,βi​ 决定子滤波器可使用的全局信息比例。

(1)核心公式(基于信息矩阵的融合)

定义:信息矩阵与信息向量

  • 信息矩阵:Y=P−1Y=P^{−1}Y=P−1(协方差的逆,代表 "信息含量",值越大信息越丰富);
  • 信息向量:y=Yx^=P−1x^y=Y\hat{x}=P^{-1}\hat{x}y=Yx^=P−1x^。
步骤 1:信息分配(主→子)

主滤波器将全局信息按分配系数 βiβ_iβi​ 分配给子滤波器 iii:

Yi0=βiYgY_i^0=β_iY_gYi0=βiYg​
yi0=βiygy_i^0=β_iy_gyi0=βiyg

其中:

  • Yg、ygY_g、y_gYg、yg:全局信息矩阵 / 向量;
  • Yi0、yi0Y_i^0、y_i^0Yi0、yi0:分配给子滤波器 i 的先验信息矩阵 / 向量;
  • 子滤波器初始协方差 / 状态:Pi0=(Yi0)−1,x^i0=(Yi0)−1yi0P_i^0=(Y_i^0)^{−1},\hat{x}_i^0=(Y_i^0)^{−1}y_i^0Pi0=(Yi0)−1,x^i0=(Yi0)−1yi0。
步骤 2:子滤波器局部估计

子滤波器 iii 基于本地传感器数据,按卡尔曼滤波完成局部更新:

x^i=Pi((Pi0)−1x^i0+HiTRi−1zi)\hat{x}_i=P_i((P_i^0)^{-1}\hat{x}_i^0+\mathbf{H}_i^TR_i^{-1z_i})x^i=Pi((Pi0)−1x^i0+HiTRi−1zi)
Pi=((Pi0)−1+HiTRi−1Hi)−1P_i=((P_i^0)^{−1}+\mathbf{H}_i^TR_i^{−1}H_i)^{−1}Pi=((Pi0)−1+HiTRi−1Hi)−1

(本质是卡尔曼滤波的更新公式,Pi0P_i^0Pi0​ 为子滤波器先验协方差)

步骤 3:全局信息融合(子→主)

主滤波器将所有子滤波器的信息加权求和,得到全局估计:

Yg=∑i=1nYiY_g=\sum_{i=1}^nY_iYg=∑i=1nYi

​yg=∑i=1nyiy_g=\sum_{i=1}^{n}y_iyg=∑i=1nyi

​x^g=Yg−1yg\hat{x}_g=Y_g^{-1}y_gx^g=Yg−1yg

​Pg=Yg−1P_g=Y_g^{-1}Pg=Yg−1​

步骤 4:信息重置(可选,保证一致性)

将全局信息按 βiβ_iβi​ 反馈给子滤波器,重置子滤波器的先验信息:
Yi0=βiYgY_i^0=β_iY_gYi0=βiYg

​yi0=βiygy_i^0=β_iy_gyi0=βiyg

​x^i0=x^g,Pi0=Pgβi\hat{x}_i^0=\hat{x}_g,P_i^0=\frac{P_g}{β_i}x^i0=x^g,Pi0=βiPg​​

4. 联邦滤波的操作步骤(工程落地流程)

联邦滤波的核心是 "分配 - 局部滤波 - 融合 - 重置" 的闭环,具体操作步骤如下:

步骤 1:系统建模与初始化
  • 定义全局状态向量 xxx(如无人机的位置、速度、姿态);
  • 划分子滤波器:按传感器类型(GPS、IMU、视觉)或子系统(位置、速度、姿态)划分,确定子滤波器数量 nnn;
  • 初始化全局状态 x^g0\hat{x}_g^0x^g0 和协方差 Pg0P_g^0Pg0;
  • 设定信息分配系数 βiβ_iβi(如均等分配:βi=1/(n+1)β_i=1/(n+1)βi=1/(n+1),β0β_0β0 为主滤波器预留)。
步骤 2:信息分配
  • 主滤波器计算全局信息矩阵 Yg=(Pg)−1Yg=(P_g)^{−1}Yg=(Pg)−1、信息向量 yg=Ygx^gy_g=Y_g\hat{x}_gyg=Ygx^g;
  • 按 βiβ_iβi 将信息分配给各子滤波器,得到子滤波器的先验状态 x^i0\hat{x}_i^0x^i0 和协方差 Pi0P_i^0Pi0。
步骤 3:子滤波器局部滤波

每个子滤波器独立执行:

  • 预测:基于本地系统模型完成状态预测(x^i−、Pi−\hat{x}_i^−、P_i^−x^i−、Pi−);
  • 更新:结合本地传感器观测值,完成局部状态更新(x^i、Pi\hat{x}_i、P_ix^i、Pi);
  • 输出:向主滤波器上报局部估计结果(\hat{x}_i、P_i)。
步骤 4:全局信息融合

主滤波器接收所有子滤波器的结果,按信息融合公式计算全局状态 x^g\hat{x}_gx^g​ 和协方差 PgP_gPg​。

步骤 5:信息重置(可选)

将全局信息按 βiβ_iβi​ 反馈给子滤波器,重置子滤波器的先验信息,保证下一时刻子滤波器与全局一致。

步骤 6:迭代执行

重复步骤 2-5,完成多传感器的实时融合滤波。

5. 应用场景

联邦滤波因分布式、容错性、可扩展性 的优势,广泛应用于多传感器融合场景:

表格

应用领域 具体场景 子滤波器划分方式
无人机导航 GPS+IMU + 视觉里程计融合 子滤波器 1(GPS)、子滤波器 2(IMU)、子滤波器 3(视觉)
车辆自动驾驶 激光雷达 + 摄像头 + 毫米波雷达 + 惯导 按传感器类型划分子滤波器
卫星导航 多星座(GPS + 北斗 + GLONASS)融合 按卫星星座划分子滤波器
机器人 SLAM 激光 SLAM + 视觉 SLAM + 里程计 按 SLAM 模块划分子滤波器
船舶导航 惯导 + GPS + 电子海图 按导航设备划分子滤波器

6. 优缺点对比(与集中式 / 分布式融合)

融合方式 优点 缺点
集中式融合 理论最优精度、无信息损失 计算量大、容错性差(单个传感器故障导致全局失效)、扩展性差
分布式融合(非联邦) 计算量小、容错性好 精度低于集中式、无全局信息一致性保证
联邦滤波 1. 分布式架构:子滤波器独立运行,计算量分散;2. 容错性强:单个子滤波器故障不影响全局;3. 扩展性好:新增传感器仅需添加子滤波器;4. 精度接近集中式;5. 信息可重置:保证全局一致性 1. 信息分配系数需手动调参,无统一最优准则;2. 略增加主滤波器的信息融合计算量;3. 对信息矩阵求逆存在数值稳定性风险

7. Python 代码实现(双传感器联邦滤波示例)

以 "二维位置跟踪" 为例,融合 GPS(子滤波器 1)和视觉传感器(子滤波器 2)的观测,实现联邦滤波:

bash 复制代码
import numpy as np
import matplotlib.pyplot as plt

class SubKalmanFilter:
    """子卡尔曼滤波器(单个传感器的局部滤波)"""
    def __init__(self, F, H, Q, R, x0, P0):
        self.F = F  # 状态转移矩阵
        self.H = H  # 观测矩阵
        self.Q = Q  # 过程噪声协方差
        self.R = R  # 观测噪声协方差
        self.x_hat = x0  # 局部状态估计
        self.P = P0      # 局部协方差
    
    def predict(self):
        """预测阶段"""
        self.x_hat = self.F @ self.x_hat
        self.P = self.F @ self.P @ self.F.T + self.Q
    
    def update(self, z):
        """更新阶段"""
        # 卡尔曼增益
        S = self.H @ self.P @ self.H.T + self.R
        K = self.P @ self.H.T @ np.linalg.inv(S)
        # 更新状态和协方差
        self.x_hat += K @ (z - self.H @ self.x_hat)
        I = np.eye(len(self.P))
        self.P = (I - K @ self.H) @ self.P

class FederatedKalmanFilter:
    """联邦卡尔曼滤波器(主滤波器+子滤波器)"""
    def __init__(self, n_sub, F, H_list, Q_list, R_list, x0, P0, beta_list):
        """
        :param n_sub: 子滤波器数量
        :param F: 全局状态转移矩阵
        :param H_list: 各子滤波器观测矩阵列表
        :param Q_list: 各子滤波器过程噪声协方差列表
        :param R_list: 各子滤波器观测噪声协方差列表
        :param x0: 全局初始状态
        :param P0: 全局初始协方差
        :param beta_list: 信息分配系数列表(长度n_sub,和为1)
        """
        self.n_sub = n_sub
        self.beta_list = beta_list  # 信息分配系数
        self.F = F
        
        # 全局状态和协方差
        self.x_g = x0
        self.P_g = P0
        
        # 初始化子滤波器
        self.sub_filters = []
        for i in range(n_sub):
            # 按信息分配系数初始化子滤波器先验协方差和状态
            P_i0 = self.P_g / beta_list[i]  # 子滤波器先验协方差
            x_i0 = x0.copy()                # 子滤波器先验状态
            sub_filter = SubKalmanFilter(F, H_list[i], Q_list[i], R_list[i], x_i0, P_i0)
            self.sub_filters.append(sub_filter)
    
    def information_allocation(self):
        """信息分配:主滤波器向子滤波器分配信息"""
        for i in range(self.n_sub):
            # 重置子滤波器先验状态和协方差
            self.sub_filters[i].x_hat = self.x_g.copy()
            self.sub_filters[i].P = self.P_g / self.beta_list[i]
    
    def sub_filter_update(self, z_list):
        """子滤波器局部滤波"""
        for i in range(self.n_sub):
            self.sub_filters[i].predict()  # 预测
            self.sub_filters[i].update(z_list[i])  # 观测更新
    
    def global_fusion(self):
        """全局信息融合:子滤波器结果融合为全局估计"""
        # 计算全局信息矩阵和信息向量
        Y_g = np.zeros_like(self.P_g)  # 信息矩阵 Y = P^-1
        y_g = np.zeros_like(self.x_g)  # 信息向量 y = Y@x
        
        for i in range(self.n_sub):
            Y_i = np.linalg.inv(self.sub_filters[i].P)
            y_i = Y_i @ self.sub_filters[i].x_hat
            Y_g += Y_i
            y_g += y_i
        
        # 全局状态和协方差
        self.P_g = np.linalg.inv(Y_g)
        self.x_g = self.P_g @ y_g
    
    def step(self, z_list):
        """联邦滤波一步迭代"""
        self.information_allocation()    # 信息分配
        self.sub_filter_update(z_list)   # 子滤波器局部更新
        self.global_fusion()             # 全局融合
        return self.x_g, self.P_g

# ---------------------- 测试联邦滤波 ----------------------
if __name__ == "__main__":
    # 1. 系统参数
    dt = 0.1  # 时间步长
    T = 50    # 总步数
    n_sub = 2 # 子滤波器数量(GPS+视觉)
    
    # 全局状态:[x, y, vx, vy](位置x/y,速度vx/vy)
    F = np.array([
        [1, 0, dt, 0],
        [0, 1, 0, dt],
        [0, 0, 1, 0],
        [0, 0, 0, 1]
    ])
    
    # 子滤波器1(GPS):观测x,y位置
    H1 = np.array([[1, 0, 0, 0], [0, 1, 0, 0]])
    Q1 = np.diag([0.01, 0.01, 0.1, 0.1])  # 过程噪声
    R1 = np.diag([1.0, 1.0])              # 观测噪声(GPS噪声较大)
    
    # 子滤波器2(视觉):观测x,y位置
    H2 = np.array([[1, 0, 0, 0], [0, 1, 0, 0]])
    Q2 = np.diag([0.01, 0.01, 0.1, 0.1])  # 过程噪声
    R2 = np.diag([0.2, 0.2])              # 观测噪声(视觉噪声较小)
    
    H_list = [H1, H2]
    Q_list = [Q1, Q2]
    R_list = [R1, R2]
    
    # 信息分配系数(视觉权重更高,因为噪声小)
    beta1 = 0.3  # GPS子滤波器
    beta2 = 0.7  # 视觉子滤波器
    beta_list = [beta1, beta2]
    
    # 初始状态和协方差
    x0 = np.array([0, 0, 1, 1])  # 初始状态:x=0,y=0,vx=1,vy=1
    P0 = np.diag([1, 1, 1, 1])   # 初始协方差
    
    # 2. 生成真实状态和观测值
    x_true = np.zeros((T, 4))
    x_true[0] = x0
    z1_meas = np.zeros((T, 2))  # GPS观测
    z2_meas = np.zeros((T, 2))  # 视觉观测
    
    for k in range(1, T):
        # 真实状态转移(匀速运动+过程噪声)
        process_noise = np.random.multivariate_normal([0,0,0,0], Q1)
        x_true[k] = F @ x_true[k-1] + process_noise
        # 生成观测值
        z1_meas[k] = H1 @ x_true[k] + np.random.multivariate_normal([0,0], R1)
        z2_meas[k] = H2 @ x_true[k] + np.random.multivariate_normal([0,0], R2)
    
    # 3. 初始化联邦滤波
    ff = FederatedKalmanFilter(n_sub, F, H_list, Q_list, R_list, x0, P0, beta_list)
    
    # 4. 联邦滤波迭代
    x_g_est = np.zeros((T, 4))  # 全局估计结果
    x1_est = np.zeros((T, 4))   # GPS子滤波器估计
    x2_est = np.zeros((T, 4))   # 视觉子滤波器估计
    
    for k in range(T):
        z_list = [z1_meas[k], z2_meas[k]]
        x_g, P_g = ff.step(z_list)
        x_g_est[k] = x_g
        x1_est[k] = ff.sub_filters[0].x_hat
        x2_est[k] = ff.sub_filters[1].x_hat
    
    # 5. 结果可视化
    plt.figure(figsize=(12, 8))
    
    # 位置轨迹对比
    plt.subplot(2, 1, 1)
    plt.plot(x_true[:, 0], x_true[:, 1], label='真实轨迹', linewidth=2)
    plt.plot(x_g_est[:, 0], x_g_est[:, 1], label='联邦滤波全局估计', linestyle='--', linewidth=2)
    plt.plot(x1_est[:, 0], x1_est[:, 1], label='GPS子滤波器', linestyle=':', alpha=0.7)
    plt.plot(x2_est[:, 0], x2_est[:, 1], label='视觉子滤波器', linestyle='-.', alpha=0.7)
    plt.xlabel('X位置')
    plt.ylabel('Y位置')
    plt.legend()
    plt.title('二维位置跟踪轨迹对比')
    
    # X位置随时间变化
    plt.subplot(2, 1, 2)
    plt.plot(range(T), x_true[:, 0], label='真实X位置')
    plt.plot(range(T), x_g_est[:, 0], label='联邦滤波全局估计', linestyle='--')
    plt.plot(range(T), z1_meas[:, 0], label='GPS观测', alpha=0.5)
    plt.plot(range(T), z2_meas[:, 0], label='视觉观测', alpha=0.5)
    plt.xlabel('时间步')
    plt.ylabel('X位置')
    plt.legend()
    plt.title('X位置随时间变化')
    
    plt.tight_layout()
    plt.show()

代码说明

  • 子滤波器类:实现单个传感器的卡尔曼滤波(预测 + 更新),独立处理本地观测;
  • 联邦滤波器类
    • 信息分配:按系数 βi 将全局信息分配给子滤波器,重置子滤波器先验;
    • 局部滤波:各子滤波器独立完成预测和更新;
    • 全局融合:将子滤波器的信息矩阵 / 向量求和,得到全局状态和协方差;
  • 测试案例:模拟 GPS + 视觉双传感器的二维位置跟踪,对比真实轨迹、联邦全局估计、子滤波器估计的效果;
  • 关键细节:视觉传感器噪声更小,因此分配更高的信息系数(β2=0.7),提升全局估计精度。

三、总结

  • 核心原理:联邦滤波是分布式多传感器融合框架,核心是 "信息分配 - 局部滤波 - 全局融合 - 信息重置",依托信息论和卡尔曼滤波实现全局最优估计,信息矩阵(协方差逆)是融合的核心工具;
  • 操作关键:
    • 子滤波器按传感器 / 子系统划分,独立运行;
    • 信息分配系数需根据传感器精度调整(精度越高,系数越大);
    • 全局融合通过信息矩阵求和实现,保证最优性;
  • 核心优势:分布式架构、容错性强、扩展性好、精度接近集中式;
  • 适用场景:多传感器融合的导航、定位、跟踪场景(无人机、自动驾驶、机器人),是工程中平衡精度与工程实用性的优选方案。
相关推荐
紫陌涵光1 小时前
112. 路径总和
java·前端·算法
摘星编程2 小时前
解析CANN ops-transformer的FlashAttention算子:注意力机制的内存优化
人工智能·深度学习·transformer
回敲代码的猴子2 小时前
2月8日上机
开发语言·c++·算法
caoz2 小时前
AI的春节档
大数据·人工智能·深度学习·机器学习·计算机视觉
硅谷秋水2 小时前
用于机器人控制的因果世界建模
深度学习·机器学习·计算机视觉·语言模型·机器人
桂花饼2 小时前
2026大模型新格局:智谱GLM-5发布,DSA+MoE架构如何破解落地痛点?
人工智能·架构·sora2·gemini 3·gpt-5.2·codex-max·glm-5
IT猿手2 小时前
MOEA/D(基于分解的多目标进化算法)求解46个多目标函数及一个工程应用,包含四种评价指标,MATLAB代码
开发语言·算法·matlab·多目标算法
文艺小码农2 小时前
PEFT 库中文本生成LoRA 教程
人工智能·深度学习·语言模型·自然语言处理·集成学习
Benny_Tang2 小时前
AtCoder Beginner Contest 445(ABC445) A-F 题解
c++·算法