Kalman Filters ⚡ 现代C++17 滤波库

C++17 Eigen3 模板元编程 高性能

一个模块化、高性能的卡尔曼滤波家族实现,涵盖线性、扩展、无迹卡尔曼滤波,支持精确离散化、自适应噪声估计、多传感器融合与性能监控。

📖 概述

Kalman Filters 是基于现代C++17和Eigen3的通用滤波库。设计上强调可扩展性、编译期优化与工业级鲁棒性。所有滤波器均为模板类,通过 KalmanConfig 定义状态/测量维度,支持静态多态与运行时策略。核心组件包括:

📐 线性卡尔曼滤波

标准KF,恒定速度/加速度模型。

🌀 扩展卡尔曼滤波

非线性系统一阶线性化,数值雅可比。

🎯 无迹卡尔曼滤波

Sigma点变换,高精度非线性估计。

⚙️ 精确离散化

矩阵指数/改进欧拉,连续系统精确转换。

🔄 自适应UKF

在线噪声协方差估计 + 参数优化。

🔗 多传感器融合

联邦滤波,传感器可靠性动态评估。

✨ 核心特性

⚡ 快速开始

最简单的线性卡尔曼滤波示例(2D跟踪)

#include "kalman_filters/linear_kalman_filter.hpp"

struct MyConfig : KalmanConfig<4, 2> {};  // 状态4维,测量2维

int main() {
    MyConfig::StateMatrix F; F << 0,0,1,0, 0,0,0,1, 0,0,0,0, 0,0,0,0;
    MyConfig::MeasurementMatrix H; H << 1,0,0,0, 0,1,0,0;
    MyConfig::StateMatrix Q = MyConfig::StateMatrix::Identity() * 0.1;
    Eigen::Matrix2d R = Eigen::Matrix2d::Identity() * 1.0;

    LinearKalmanFilter<MyConfig> kf(F, H, Q, R);
    MyConfig::StateVector x0; x0 << 0,0,1,1;
    kf.init(x0, MyConfig::StateMatrix::Identity() * 10);

    // 预测 + 更新
    kf.predict(1.0);
    MyConfig::MeasurementVector z; z << 1.1, 0.9;
    kf.update(z);
    auto state = kf.getState();
    return 0;
}

📦 编译与依赖

依赖: Eigen3 (≥3.3), CMake (≥3.12), C++17编译器

# Ubuntu 安装依赖
sudo apt install libeigen3-dev cmake build-essential

# 构建
git clone https://github.com/example/kalman_filters.git
cd kalman_filters
mkdir build && cd build
cmake .. -DCMAKE_BUILD_TYPE=Release -DBUILD_EXAMPLES=ON
make -j4
# 运行示例
./linear_example
./optimized_ukf_example

🏗️ 架构设计

所有滤波器继承自 KalmanFilterBase<Config>,统一 predict/update 接口。关键抽象:

📈 线性卡尔曼滤波 (LinearKalmanFilter)

template<typename Config> class LinearKalmanFilter : public KalmanFilterBase<Config>

适用于线性系统 x_{k+1}=F·x_k + B·u + wz_k=H·x_k + v。内部使用欧拉离散化(但可通过精确离散化类提升)。

示例: linear_example.cpp 展示了2D匀速运动目标跟踪。

🌀 扩展卡尔曼滤波 (ExtendedKalmanFilter)

ExtendedKalmanFilter(StateTransitionFunction<Config> f, MeasurementFunction<Config> h, ...)

对非线性系统进行一阶泰勒展开,使用数值雅可比(中心差分)。适用于中等非线性系统。参数 epsilon 控制微分步长。

示例场景:雷达极坐标测量(距离+角度)与笛卡尔状态之间的变换。

auto h = [](const StateVector& x) -> MeasurementVector {
    double r = std::sqrt(x(0)*x(0)+x(1)*x(1));
    double theta = std::atan2(x(1), x(0));
    return {r, theta};
};
ExtendedKalmanFilter<Config> ekf(f, h, Q, R);

🎯 无迹卡尔曼滤波 (UnscentedKalmanFilter)

通过确定性Sigma点传递非线性,避免雅可比计算,精度高达二阶泰勒。支持参数 alpha, beta, kappa 调节Sigma分布。

参考 unscented_example.cpp — 恒定转弯率模型目标跟踪。

⚙️ 精确离散化 LKF (PreciseLinearKalmanFilter)

对于连续时间系统 dx/dt = F_cont·x + w,使用矩阵指数 expm 获得精确离散化,或使用改进欧拉(二阶)。适用于高动态系统。

PreciseLinearKalmanFilter<Config> kf(F_cont, H, Q_cont, R, "exact");
kf.predict(dt);   // 内部精确离散化

discretization.hpp 提供三种方法: exact, improved, euler。

🔄 自适应线性卡尔曼滤波 (AdaptiveLinearKalmanFilter)

基于滑动窗口创新序列在线估计测量噪声协方差R,动态调整滤波增益,适应环境变化。通过 adaptive_factor 衡量。

AdaptiveLinearKalmanFilter(F, H, Q, R, window_size=10)

使用Joseph形式协方差更新增强数值稳定性。

🚀 优化UKF + 自适应噪声 (OptimizedUnscentedKalmanFilter)

继承自标准UKF,增加:

示例 optimized_ukf_example.cpp 展示机器人跟踪及自适应因子输出。

🔗 多传感器融合 (MultiSensorFusionFilter)

继承优化UKF,支持注册多种传感器(GPS/Lidar等),每个传感器有自己的测量函数、噪声协方差和动态可靠性评分。融合采用联邦滤波框架,通过马氏距离更新可靠性。

fusion_filter.registerSensor(0, "GPS", gps_h, gps_cov, 0.9);
fusion_filter.registerSensor(1, "Lidar", lidar_h, lidar_cov, 0.8);
fusion_filter.fusionUpdate(measurements);   // 批量更新

multi_sensor_fusion_example.cpp 展示融合GPS与激光雷达,并保存性能CSV。

📌 示例程序一览

示例文件描述
linear_example.cpp2D匀速运动目标跟踪,恒定速度模型。
extended_example.cpp雷达极坐标测量跟踪圆周运动。
unscented_example.cpp恒定转弯率模型(CTRV)的UKF实现。
precise_discretization_example.cpp弹簧-质量-阻尼器连续系统离散化对比。
optimized_ukf_example.cpp自适应噪声UKF + 性能评估。
multi_sensor_fusion_example.cppGPS+Lidar融合,动态可靠性+CSV记录。
所有示例均位于 examples/ 目录,编译后可直接运行。

⚙️ 配置与类型系统

KalmanConfig 是核心配置模板,定义状态/测量维度以及对应的Eigen类型。

template<int StateDim, int MeasurementDim, int ControlDim = 0>
struct KalmanConfig {
    static constexpr int state_dim = StateDim;
    static constexpr int measurement_dim = MeasurementDim;
    using StateVector = Eigen::Matrix<double, StateDim, 1>;
    using StateMatrix = Eigen::Matrix<double, StateDim, StateDim>;
    // ...
};

所有滤波器均使用该配置,保证类型安全与编译期优化。

📊 性能指标与调试

OptimizedUnscentedKalmanFilter 提供 PerformanceMetrics 结构:

通过 visualization::PerformanceLogger 记录时间序列并导出CSV,方便离线分析。

⚖️ 许可证

MIT License

Copyright (c) 2025 KalmanFilters Contributors

允许自由使用、修改、分发,需保留版权声明。不提供任何担保。

📐 Kalman Filters Library · 文档生成于 2026-03-21 · 基于真实代码库