卡尔曼滤波调参指南:3 步把噪声量测变成平滑跟踪
【免费下载链接】Kalman-and-Bayesian-Filters-in-PythonKalman Filter book using Jupyter Notebook. Focuses on building intuition and experience, not formal proofs. Includes Kalman filters,extended Kalman filters, unscented Kalman filters, particle filters, and more. All exercises include solutions.项目地址: https://gitcode.com/gh_mirrors/ka/Kalman-and-Bayesian-Filters-in-Python
传感器数据满屏抖动,直接喂给控制逻辑下游必出幺蛾子。卡尔曼滤波给你一套"先预测、再融合"的递归机制:本 Jupyter 仓库 Kalman and Bayesian Filters in Python 从一维到粒子滤波全实现、全带答案,抄一个模块 5 分钟就能跑出稳定轨迹。
核心概念 30 秒速览:模型与量测之间的裁判
想象你跟一个只报位置、且每次报得都偏几米的朋友保持联系。你的做法是:用他的最后位置加合理步速,先猜他"该在哪",再拿他最新上报的位置往回拉。卡尔曼滤波就是这个动作,只是更诚实——它把"信模型几分、信量测几分"量化成一个权重,自动分配。
图:卡尔曼滤波的信念(高斯分布)随每次预测变宽、随每次量测收窄,中心是估计值,宽度是不确定性。
整个滤波器可以浓缩成一行:x = (1-K)·x̂ + K·z。白话翻译:新估计 = 模型的猜测 + 增益 K 乘以量测带来的修正,K 由两者方差相对大小决定——量测噪声越大,K 越小,滤波越信模型。
最小可行示例:3 行代码从仿真到滤波
仓库的 kf_book 目录里放着 DogSimulation.py,是一个"移动目标 + 带噪传感器"的一维仿真器,对应的滤波循环在同目录的 kf_internal.py,可直接抄着跑:
from kf_book.DogSimulation import DogSimulation dog = DogSimulation(measurement_var=2, process_var=0.3) data = dog.run_simulation(dt=1, count=100)为什么是 measurement_var=2、process_var=0.3?前者回答"这个传感器爱撒多大谎",来自传感器手册或实测数据;后者回答"我的模型爱撒多大谎",为没建模的加速度留的余地。两个数不必精确,但相对大小决定输出性格:R 偏大 → 平滑但滞后,Q 偏大 → 灵敏但毛刺。
验证方式只有一条:画残差曲线(量测 − 预测)。调参调对了,残差应该围绕零波动、不涨不跌。
图:残差 z−x 的构成——它是量测与当前估计之间的"误差棒",更新步的全部信息都来自它。
⚡ 进阶调优与参数选择:按顺序查 3 个维度
先定 R 再定 Q
现象:调参后分不清是"传感器噪声大"还是"模型太死板"。根因:R 与 Q 作用方向相反,同时动两个永远调不平。对策:先从传感器手册或一段离线量测里标定 R 并冻结,只调 Q,直到方差曲线收敛、残差变成无趋势的白噪声。
机动期间临时放大 Q
现象:目标转弯、加速时误差突增,之后恢复缓慢。根因:Q 按匀速巡航段固定,覆盖不了机动时的加速度,滤波器"认为"自己不可能转弯,于是整体滞后。对策:监测新息,连续多个残差同号或超出 3σ 时临时放大 Q,机动结束后收回。kf_book/adaptive_internal.py 就是这类场景的现成 demo:
if abs(z - x_pred) > 3 * sqrt(S): Q *= 2 # 临时放大过程噪声,机动结束后回缩按运动模式选状态向量
现象:目标变速时跟踪线持续超前或拖尾。根因:恒速模型只放位置,速度只能靠相邻量测差分"猜",变速天然慢一拍。对策:把状态扩成 [位置, 速度],让速度直接参与量测融合,kf_book/mkf_internal.py 的多维滤波器就是这个结构。
🚨 高频踩坑速查
- R 偏大导致发散— 轨迹永远追不上目标且方差持续缩小;解法:调小 R 抬高增益 K,让量测有资格纠偏。
- Q 偏大噪声直通— 滤波线和量测线一样毛刺;解法:调小 Q,或先确认抖动是真实运动而非传感器噪声。
- 初值离谱引飞— 前几拍估计值甩飞或卡死;解法:用首个可信量测初始化,初期临时放大协方差等融合拉回。
- 残差有趋势— 残差曲线出现斜坡或周期性;解法:这不是噪声问题而是模型问题,回头核对过程模型与采样周期。
图:带测量矩阵 H 的残差计算——当量测不是状态本身(如雷达距离),要先用 H 把状态投影到量测空间再相减。
📌 边界与适用性
两类场景标准卡尔曼滤波不适用:一是强非线性量测(如方位角、距离,状态藏在平方根里),线性化假设失效;二是多峰、非高斯噪声,高斯表示本身站不住脚。这两类本仓库都有现成升级路径:kf_book/ekf_internal.py 与 ukf_internal.py 分别用雅可比和 sigma 点处理非线性,kf_book/pf_internal.py 的粒子滤波则完全不假设高斯。
先 git clone https://gitcode.com/gh_mirrors/ka/Kalman-and-Bayesian-Filters-in-Python ,然后从 04-One-Dimensional-Kalman-Filters.ipynb 跑起,把仿真数据换成你的传感器数据开始调 Q 和 R。这个仓库覆盖一维、多维、扩展、无迹、粒子滤波和平滑的完整谱系,每个 notebook 都带习题和答案,按目录顺序一路练下去即可。
【免费下载链接】Kalman-and-Bayesian-Filters-in-PythonKalman Filter book using Jupyter Notebook. Focuses on building intuition and experience, not formal proofs. Includes Kalman filters,extended Kalman filters, unscented Kalman filters, particle filters, and more. All exercises include solutions.项目地址: https://gitcode.com/gh_mirrors/ka/Kalman-and-Bayesian-Filters-in-Python
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考