Kalman Playground:用动态过程理解预测、增益和更新
Kalman Playground:用动态过程理解预测、增益和更新
Kalman 滤波最容易卡住的地方,通常不是公式本身,而是“预测值、测量值、Kalman Gain、协方差”之间到底怎么互相拉扯。
我做了一个独立的全屏交互实验台,可以在浏览器里一步一步观察:
- Predict 如何把上一时刻状态推出当前预测状态;
- Innovation 如何表示“测量值和预测值差了多少”;
- Kalman Gain 如何决定这次更新更相信预测还是测量;
- Update 后状态点如何移动;
- 协方差/不确定性圈如何随着参数变化收缩或放大。
在线访问:
- GitHub Pages:https://wwadw.github.io/kalman-playground/
- 自定义域名:https://weiwang.wgists.me/kalman-playground/
如果是在本地预览博客:
1 | |
然后打开:
1 | |
怎么使用
在线页面不是嵌在文章里的小组件,而是单独的实验台界面:中间大画布优先展示动态过程,左侧是控制面板,右上角可以打开 公式 / 数值 抽屉查看矩阵和历史更新。
页面左侧可以切换滤波器模型:
| 模型 | 状态 | 测量输入 | 适合观察 |
|---|---|---|---|
| 1D KF | [x, v] |
position |
最基础的位置/速度 Kalman 更新 |
| 2D CV-KF | [x, y, vx, vy] |
x, y |
常见 2D 目标追踪 |
| EKF | [x, y, vx, vy] |
range, bearing |
非线性观测 + Jacobian |
| UKF | [x, y, vx, vy] |
range, bearing |
Sigma points 非线性更新 |
每次实验可以按这个顺序走:
- 输入一个测量值,或者直接点击中间大坐标画布添加点;
- 点
Predict,观察黄色预测点和黄色不确定性圈; - 点
Innovation / Gain,观察白色测量点、红色 residual 箭头和 Kalman Gain; - 点
Update,观察青色更新点如何从预测点被拉向测量点; - 调整
Q/R/P0/gate/dt,重复观察轨迹变化。
输入格式
不同滤波器需要的测量格式不同:
1 | |
其中 EKF / UKF 的输入是:
1 | |
如果不想手动输入,可以直接点击中间大画布。页面会自动把点击坐标转换成当前滤波器需要的测量格式:
1D KF:点击位置的 x 坐标会作为 position;2D CV-KF:点击点会作为x, y;EKF / UKF:点击点会转换成range, bearing。
图上的圈是什么
图上的圈/椭圆表示协方差,也就是滤波器对当前状态的“不确定性”。
直觉上可以这样看:
- 圈越大:滤波器越不确定;
- 圈越小:滤波器越有把握;
Q越大:预测阶段更容易发散,圈会变大;R越大:测量更不可信,更新时状态点不会被测量拉得太猛;P0越大:初始状态更不确定,前几次测量影响会更明显。
颜色含义:
| 颜色 | 含义 |
|---|---|
| 绿色 | 上一时刻/当前后验状态 |
| 黄色 | Predict 后的预测状态 |
| 白色 | 当前测量值 |
| 青色 | Update 后的新状态 |
| 红色箭头 | Innovation / residual,也就是测量和预测的差 |
为什么这个工具有用
调 Kalman 参数时,很容易陷入“Q、R、P 到底该怎么改”的迷雾里。这个实验台不是为了替代真实 bag/log 验证,而是帮助先建立直觉:
- 目标跟得太慢:通常要看
Q是否太小,或R是否太大; - 轨迹抖动明显:通常要看
R是否太小,或Q是否太大; - 初始几帧跳动大:通常和
P0、首帧测量、初始速度假设有关; - 离群点把轨迹拉飞:需要关注 gate 和异常测量筛选。
先在这里把“预测、测量、更新”的关系看明白,再回到真实追踪系统里调参,会省很多玄学时间。
GitHub Pages 托管方式
这个工具是纯静态页面,只有:
1 | |
在 Hexo 里放在:
1 | |
执行:
1 | |
部署后就可以通过 GitHub Pages 随时访问:
1 | |
如果自定义域名配置正常,也可以访问:
1 | |
Kalman Playground:用动态过程理解预测、增益和更新
http://example.com/2026/07/23/kalman-playground/