卡尔曼滤波对非线性公式建模的详细步骤
一、运动公式
1. 空气阻力
空气阻力公式:
F = (1/2) * ρ * v² * Cd * A
其中:
F
:空气阻力,单位是牛顿(N)。ρ
(读作“rho”):空气密度,单位是千克每立方米(kg/m³)。在海平面、15°C 的标准大气条件下,空气密度约为 1.225 kg/m³。空气密度会随着海拔升高、温度和湿度变化而降低。v
:物体相对于空气的合速度,单位是米每秒(m/s)。注意:速度是平方项,因此速度对阻力的影响非常大。Cd
:阻力系数(Drag Coefficient),是一个无量纲的数,它取决于物体的形状和表面的光滑程度。它通过风洞实验或计算流体动力学(CFD)模拟来确定。- 例如:一个光滑的球体 Cd ≈ 0.47,一个现代轿车 Cd ≈ 0.25-0.35,一个垂直于气流的平板 Cd ≈ 1.17。
A
:物体在运动方向上的参考投影面积(或称迎风面积),单位是平方米(m²)。这是物体在垂直于运动方向的平面上的投影面积。
计算阻力分量:
Fx = -F * (vx / v)
Fy = -F * (vy / v)
Fz = -F * (vz / v)
注意:这里的vvv是合速度,v=√(vx2+vy2+vz2)v = √(vx² + vy² + vz²)v=√(vx2+vy2+vz2)
2. 系统状态向量
我们定义系统的状态向量为:
x(t)=[pxpypzvxvyvz]=[位置 x位置 y位置 z速度 x速度 y速度 z] \mathbf{x}(t) = \begin{bmatrix} p_x \\ p_y \\ p_z \\ v_x \\ v_y \\ v_z \end{bmatrix}= \begin{bmatrix} \text{位置 } x \\ \text{位置 } y \\ \text{位置 } z \\ \text{速度 } x \\ \text{速度 } y \\ \text{速度 } z \end{bmatrix} x(t)=pxpypzvxvyvz=位置 x位置 y位置 z速度 x速度 y速度 z
3. 连续时间动力学方程(非线性)
(1) 基本形式
x˙=f(x)+w(t) \dot{\mathbf{x}} = f(\mathbf{x}) + \mathbf{w}(t) x˙=f(x)+w(t)
其中 w(t)\mathbf{w}(t)w(t) 是过程噪声(连续白噪声)。
(2)具体表达式
p˙x=vxp˙y=vyp˙z=vzv˙x=−αm∣v∣vxv˙y=−αm∣v∣vyv˙z=−αm∣v∣vz−g \begin{aligned} \dot{p}_x &= v_x \\ \dot{p}_y &= v_y \\ \dot{p}_z &= v_z \\ \dot{v}_x &= -\frac{\alpha}{m} |\mathbf{v}| v_x \\ \dot{v}_y &= -\frac{\alpha}{m} |\mathbf{v}| v_y \\ \dot{v}_z &= -\frac{\alpha}{m} |\mathbf{v}| v_z - g \end{aligned} p˙xp˙yp˙zv˙xv˙yv˙z=vx=vy=vz=−mα∣v∣vx=−mα∣v∣vy=−mα∣v∣vz−g
其中:
- v=[vx,vy,vz]T\mathbf{v} = [v_x, v_y, v_z]^Tv=[vx,vy,vz]T:速度向量
- ∣v∣=vx2+vy2+vz2|\mathbf{v}| = \sqrt{v_x^2 + v_y^2 + v_z^2}∣v∣=vx2+vy2+vz2:速度大小
- α\alphaα:空气阻力系数(与形状、密度相关),α=(1/2)ρCdA\alpha = (1/2) ρ C_d Aα=(1/2)ρCdA
- mmm:质量
- ggg:重力加速度(通常 9.81 m/s29.81\,\text{m/s}^29.81m/s2)
(3)向量形式表示
令:
- p=[px,py,pz]T\mathbf{p} = [p_x, p_y, p_z]^Tp=[px,py,pz]T
- v=[vx,vy,vz]T\mathbf{v} = [v_x, v_y, v_z]^Tv=[vx,vy,vz]T
则:
ddt[pv]=[v−αm∣v∣v−g] \frac{d}{dt} \begin{bmatrix} \mathbf{p} \\ \mathbf{v} \end{bmatrix}= \begin{bmatrix} \mathbf{v} \\ -\frac{\alpha}{m} |\mathbf{v}| \mathbf{v} - \mathbf{g} \end{bmatrix} dtd[pv]=[v−mα∣v∣v−g]
其中 g=[0,0,g]T\mathbf{g} = [0, 0, g]^Tg=[0,0,g]T。
4. 离散时间运动学
如果假定Δt\Delta tΔt时间内,加速度恒定,则离散运动学模型为
pk+1=pk+vx,kΔt−Fx2m(Δt)2pk+1=pk+vy,kΔt−Fy2m(Δt)2pk+1=pk+vz,kΔt−(Fzm+g)(Δt)22vx,k+1=vx,k−FxmΔtvy,k+1=vy,k−FymΔtvz,k+1=vz,k−(Fzm+g)Δt \begin{aligned} p_{k+1} &= p_k + v_{x,k} \Delta t - \frac{F_{x}}{2m} (\Delta t)^2 \\ p_{k+1} &= p_k + v_{y,k} \Delta t - \frac{F_{y}}{2m} (\Delta t)^2 \\ p_{k+1} &= p_k + v_{z,k} \Delta t - \left(\frac{F_{z}}{m} + g\right) \frac{(\Delta t)^2}{2} \\ v_{x,k+1} &= v_{x,k} - \frac{F_{x}}{m} \Delta t \\ v_{y,k+1} &= v_{y,k} - \frac{F_{y}}{m} \Delta t \\ v_{z,k+1} &= v_{z,k} - \left(\frac{F_{z}}{m} + g\right) \Delta t \end{aligned} pk+1pk+1pk+1vx,k+1vy,k+1vz,k+1=pk+vx,kΔt−2mFx(Δt)2=pk+vy,kΔt−2mFy(Δt)2=pk+vz,kΔt−(mFz+g)2(Δt)2=vx,k−mFxΔt=vy,k−mFyΔt=vz,k−(mFz+g)Δt
二、卡尔曼滤波
1. 线性卡尔曼滤波
标准的卡尔曼滤波器(Kalman Filter, KF) 是处理线性高斯系统的最优估计算法。它的核心假设是:
-
系统动态模型是线性的:
xk=Fkxk−1+Bkuk+wk \mathbf{x}_{k} = F_k \mathbf{x}_{k-1} + B_k \mathbf{u}_k + \mathbf{w}_k xk=Fkxk−1+Bkuk+wk
-
观测模型是线性的:
zk=Hkxk+vk \mathbf{z}_k = H_k \mathbf{x}_k + \mathbf{v}_k zk=Hkxk+vk
其中 wk\mathbf{w}_kwk 和 vk\mathbf{v}_kvk 是高斯噪声。
初始化
- 初始化状态向量 x0\mathbf{x}_0x0 、状态协方差矩阵 P0\mathbf{P}_0P0、过程噪声协方差 Q\mathbf{Q}Q、观测噪声协方差 R\mathbf{R}R。
预测步骤
- 状态预测:使用状态转移矩阵 A\mathbf{A}A 预测下一时刻的状态。
x^k∣k−1=Ax^k−1∣k−1 \hat{\mathbf{x}}_{k|k-1} = \mathbf{A}\hat{\mathbf{x}}_{k-1|k-1} x^k∣k−1=Ax^k−1∣k−1 - 协方差预测:更新状态协方差矩阵。
Pk∣k−1=APk−1∣k−1AT+Q \mathbf{P}_{k|k-1} = \mathbf{A}\mathbf{P}_{k-1|k-1}\mathbf{A}^T + \mathbf{Q} Pk∣k−1=APk−1∣k−1AT+Q
更新步骤
- 计算卡尔曼增益:
Kk=Pk∣k−1HT(HP_k∣k−1HT+R)−1 \mathbf{K}_k = \mathbf{P}_{k|k-1}\mathbf{H}^T(\mathbf{H}\mathbf{P}\_{k|k-1}\mathbf{H}^T + \mathbf{R})^{-1} Kk=Pk∣k−1HT(HP_k∣k−1HT+R)−1 - 状态更新:利用观测值 (\mathbf{z}_k) 更新状态估计。
x^k∣k=x^k∣k−1+K_k(z_k−Hx^k∣k−1)\hat{\mathbf{x}}_{k|k} = \hat{\mathbf{x}}_{k|k-1} + \mathbf{K}\_k(\mathbf{z}\_k - \mathbf{H}\hat{\mathbf{x}}_{k|k-1}) x^k∣k=x^k∣k−1+K_k(z_k−Hx^k∣k−1) - 协方差更新:更新状态协方差矩阵。
Pk∣k=(I−KkH)Pk∣k−1\mathbf{P}_{k|k} = (I - \mathbf{K}_k\mathbf{H})\mathbf{P}_{k|k-1} Pk∣k=(I−KkH)Pk∣k−1
2. 扩展卡尔曼滤波(非线性)
但在许多实际问题中(如机器人定位、飞行器导航),系统的状态转移或观测过程是非线性的。这时,标准 KF 不再适用,于是我们引入 扩展卡尔曼滤波(EKF) —— 它是对非线性系统的局部线性化近似下的卡尔曼滤波。
其核心思想是在每一步使用泰勒展开对非线性函数进行一阶线性近似(即雅可比矩阵),然后套用标准卡尔曼滤波框架。
1: 非线性系统描述
假设系统满足以下非线性动态和观测模型:
状态方程:xk=f(xk−1,uk)+wk观测方程:zk=h(xk)+vk \begin{aligned} \text{状态方程:} &\quad \mathbf{x}_k = f(\mathbf{x}_{k-1}, \mathbf{u}_k) + \mathbf{w}_k \\ \text{观测方程:} &\quad \mathbf{z}_k = h(\mathbf{x}_k) + \mathbf{v}_k \end{aligned} 状态方程:观测方程:xk=f(xk−1,uk)+wkzk=h(xk)+vk
其中:
- xk\mathbf{x}_kxk:状态向量(如位置、速度、姿态)
- uk\mathbf{u}_kuk:控制输入
- zk\mathbf{z}_kzk:观测值(传感器读数)
- f(⋅)f(\cdot)f(⋅):非线性状态转移函数
- h(⋅)h(\cdot)h(⋅):非线性观测函数
- wk∼N(0,Qk)\mathbf{w}_k \sim \mathcal{N}(0, Q_k)wk∼N(0,Qk):过程噪声
- vk∼N(0,Rk)\mathbf{v}_k \sim \mathcal{N}(0, R_k)vk∼N(0,Rk):观测噪声
注意:这里不再有 FkF_kFk 和 HkH_kHk,而是用函数 fff 和 hhh 表示非线性关系。
2:预测(Prediction)
(1) 状态预测(通过非线性函数传播)
x^k∣k−1=f(x^k−1∣k−1,uk) \hat{\mathbf{x}}_{k|k-1} = f(\hat{\mathbf{x}}_{k-1|k-1}, \mathbf{u}_k) x^k∣k−1=f(x^k−1∣k−1,uk)
这是将上一时刻的最优估计 x^k−1∣k−1\hat{\mathbf{x}}_{k-1|k-1}x^k−1∣k−1 输入到非线性函数 fff 中,得到先验状态估计。
(2) 协方差预测
协方差描述的是状态的分布,因此我们需要知道误差在每一次预测过程中是怎么传递的来改变状态的分布。在线性系统中,转移矩阵既可以用来预测,也可以描述误差的传递。
在当前状态估计 x^k∣k\hat{\mathbf{x}}_{k|k}x^k∣k 附近,对非线性状态转移函数 fff 进行一阶泰勒展开,得到 xk+1\mathbf{x}_{k+1}xk+1 关于 xk\mathbf{x}_kxk 的局部线性近似。:
xk+1≈f(x^k∣k)+Fk(xk−x^k∣k)(1) \mathbf{x}_{k+1} \approx f(\hat{\mathbf{x}}_{k|k}) + \mathbf{F}_k (\mathbf{x}_k - \hat{\mathbf{x}}_{k|k}) \tag{1} xk+1≈f(x^k∣k)+Fk(xk−x^k∣k)(1)
xk\mathbf{x}_kxk:真实状态向量(at time kkk)
- 含义:系统在时刻 kkk 的真实但未知的状态,是一个向量。
- 注意:xk\mathbf{x}_kxk 是真值,在实际中是不可直接观测的,我们只能通过传感器去估计它。
xk+1\mathbf{x}_{k+1}xk+1:下一时刻的真实状态向量
- 含义:系统在时刻 k+1k+1k+1 的真实状态。
- 它由非线性动态方程决定:
xk+1=f(xk)+wk \mathbf{x}_{k+1} = f(\mathbf{x}_k) + \mathbf{w}_k xk+1=f(xk)+wk
其中 wk\mathbf{w}_kwk 是过程噪声(通常假设为高斯白噪声)。
f(⋅)f(\cdot)f(⋅):非线性状态转移函数
- 含义:描述系统如何从 xk\mathbf{x}_kxk 演化到 xk+1\mathbf{x}_{k+1}xk+1 的非线性函数。
x^k∣k\hat{\mathbf{x}}_{k|k}x^k∣k:后验状态估计(Posterior Estimate)
- 含义:在使用了时刻 kkk 及之前的所有观测数据后,对时刻 kkk 状态的最优估计。
- 作用:它是线性化展开的工作点(operating point)。
- 关键点:
- 它是已知的(由滤波器计算得出)
- 我们在这个点附近对 fff 进行泰勒展开
- 所以它是“参考点”或“名义状态”
f(x^k∣k)f(\hat{\mathbf{x}}_{k|k})f(x^k∣k):在估计点处的函数值
- 含义:把当前的最佳状态估计 x^k∣k\hat{\mathbf{x}}_{k|k}x^k∣k 代入非线性函数 fff,得到的预测的下一时刻状态。
- 物理意义:这是 EKF 中对 xk+1\mathbf{x}_{k+1}xk+1 的预测均值(不考虑误差时的“标称”值)。
- 注意:它不是 Fkx^k∣k\mathbf{F}_k \hat{\mathbf{x}}_{k|k}Fkx^k∣k,除非 fff 是线性函数且无常数项。
Fk=∂f∂x∣x^k∣k\mathbf{F}_k = \left. \frac{\partial f}{\partial \mathbf{x}} \right|_{\hat{\mathbf{x}}_{k|k}}Fk=∂x∂fx^k∣k:状态转移雅可比矩阵(Jacobian Matrix)
- 含义:非线性函数 fff 在点 x^k∣k\hat{\mathbf{x}}_{k|k}x^k∣k 处对状态 xk\mathbf{x}_kxk 的偏导数矩阵。
- 维度:如果状态是 nnn 维,则 Fk\mathbf{F}_kFk 是 n×nn \times nn×n 矩阵。
- 作用:它表示状态的微小变化 δxk\delta \mathbf{x}_kδxk 会引起 xk+1\mathbf{x}_{k+1}xk+1 多大变化,即局部线性化斜率。
- 数学定义:
Fk=[∂f1∂x1⋯∂f1∂xn⋮⋱⋮∂fn∂x1⋯∂fn∂xn]at xk=x^k∣k \mathbf{F}_k = \begin{bmatrix} \frac{\partial f_1}{\partial x_1} & \cdots & \frac{\partial f_1}{\partial x_n} \\ \vdots & \ddots & \vdots \\ \frac{\partial f_n}{\partial x_1} & \cdots & \frac{\partial f_n}{\partial x_n} \end{bmatrix}_{\text{at } \mathbf{x}_k = \hat{\mathbf{x}}_{k|k}} Fk=∂x1∂f1⋮∂x1∂fn⋯⋱⋯∂xn∂f1⋮∂xn∂fnat xk=x^k∣k
(xk−x^k∣k)(\mathbf{x}_k - \hat{\mathbf{x}}_{k|k})(xk−x^k∣k):状态误差(偏差)
- 含义:真实状态 xk\mathbf{x}_kxk 与当前估计 x^k∣k\hat{\mathbf{x}}_{k|k}x^k∣k 之间的偏差。
- 记作:δxk=xk−x^k∣k\delta \mathbf{x}_k = \mathbf{x}_k - \hat{\mathbf{x}}_{k|k}δxk=xk−x^k∣k
- 物理意义:这是状态的“不确定性”部分,通常假设它比较小(EKF 的前提)。
Fk(xk−x^k∣k)\mathbf{F}_k (\mathbf{x}_k - \hat{\mathbf{x}}_{k|k})Fk(xk−x^k∣k):误差的线性传播
- 含义:状态误差 δxk\delta \mathbf{x}_kδxk 经过雅可比矩阵 Fk\mathbf{F}_kFk 传播后,对 xk+1\mathbf{x}_{k+1}xk+1 的影响。
- 作用:它表示“如果当前状态有误差,这个误差会如何影响下一时刻的状态”。
整个公式的意义总结:
xk+1≈f(x^k∣k)⏟标称预测+Fk(xk−x^k∣k)⏟误差传播 \mathbf{x}_{k+1} \approx \underbrace{f(\hat{\mathbf{x}}_{k|k})}_{\text{标称预测}} + \underbrace{\mathbf{F}_k (\mathbf{x}_k - \hat{\mathbf{x}}_{k|k})}_{\text{误差传播}} xk+1≈标称预测f(x^k∣k)+误差传播Fk(xk−x^k∣k)
这表示:
下一时刻的真实状态 ≈
(从当前最佳估计预测出的状态) +
(当前状态误差经线性化模型传播后的影响)
可见计算 雅可比矩阵 FkF_kFk,它是 fff 对状态 x\mathbf{x}x 在 x^k−1∣k−1\hat{\mathbf{x}}_{k-1|k-1}x^k−1∣k−1 处的一阶偏导数,描述了误差之间的传递:
Fk=∂f∂x∣x^k−1∣k−1,uk F_k = \left.\frac{\partial f}{\partial \mathbf{x}}\right|_{\hat{\mathbf{x}}_{k-1|k-1}, \mathbf{u}_k} Fk=∂x∂fx^k−1∣k−1,uk
然后协方差预测为:
Pk∣k−1=FkPk−1∣k−1FkT+Qk P_{k|k-1} = F_k P_{k-1|k-1} F_k^T + Q_k Pk∣k−1=FkPk−1∣k−1FkT+Qk
这类似于线性 KF 中的 P=FPFT+QP = FPF^T + QP=FPFT+Q,但这里的 FkF_kFk 是在当前工作点计算的。
补充学习过程中有意思的情况
在线性系统中,如果f(0)=0f(0) = 0f(0)=0(一般运动学都会满足),则xk=Fkxk−1\mathbf{x}_{k} = F_k \mathbf{x}_{k-1}xk=Fkxk−1,根据泰勒公式可知,其中FkF_kFk不仅是转移矩阵,同时也是雅可比矩阵。因此对于非线性系统,我们也可以将非线性系统中的每一项逐步转化为线性项,从而转换成线性系统,并将线性系统写成矩阵形式,也可以得到对应的雅可比矩阵。
3:更新(Update / Correction)
(3) 计算卡尔曼增益
先计算观测函数 hhh 的雅可比矩阵 HkH_kHk:
Hk=∂h∂x∣x^k∣k−1 H_k = \left.\frac{\partial h}{\partial \mathbf{x}}\right|_{\hat{\mathbf{x}}_{k|k-1}} Hk=∂x∂hx^k∣k−1
然后计算创新(残差)协方差:
Sk=HkPk∣k−1HkT+Rk S_k = H_k P_{k|k-1} H_k^T + R_k Sk=HkPk∣k−1HkT+Rk
最后计算卡尔曼增益:
Kk=Pk∣k−1HkTSk−1 K_k = P_{k|k-1} H_k^T S_k^{-1} Kk=Pk∣k−1HkTSk−1
(4) 状态更新
计算新息(测量残差):
y~k=zk−h(x^k∣k−1) \tilde{\mathbf{y}}_k = \mathbf{z}_k - h(\hat{\mathbf{x}}_{k|k-1}) y~k=zk−h(x^k∣k−1)
然后更新状态估计:
x^k∣k=x^k∣k−1+Kky~k \hat{\mathbf{x}}_{k|k} = \hat{\mathbf{x}}_{k|k-1} + K_k \tilde{\mathbf{y}}_k x^k∣k=x^k∣k−1+Kky~k
(5) 协方差更新
Pk∣k=(I−KkHk)Pk∣k−1 P_{k|k} = (I - K_k H_k) P_{k|k-1} Pk∣k=(I−KkHk)Pk∣k−1
三、实例分析
我们在运动公式提到了连续时间运动学和离散时间运动学,各有优劣,其中连续时间运动学是微分方程,难以求解转移矩阵 AAA,需要使用数值解;离散时间运动学这里使用的是加速度恒定模型,位置的二阶导正好是加速度,所以它是二阶精度,但是可以通过泰勒展开求得 AAA 的解析解。对此这里两种方法都使用来举例说明。对于连续运动学,使用四阶 Runge–Kutta 法来计算数值解,精度达到四阶,且可以避免复杂的数学推导;对于离散运动学,则是直接求得一阶解析解。
1. 转移矩阵与预测
1.1.连续运动学模型:数值解
1.1.1 四阶 Runge–Kutta 法
dydt=f(t,y),y(tn)=yn \frac{dy}{dt} = f(t, y), \quad y(t_n) = y_n dtdy=f(t,y),y(tn)=yn
- dydt\frac{dy}{dt}dtdy:函数 yyy 对时间 ttt 的导数,表示变化率
- f(t,y)f(t, y)f(t,y):给定的函数,描述了系统在任意时刻 ttt 和状态 yyy 下的变化率
- y(tn)=yny(t_n) = y_ny(tn)=yn:初始条件,表示在时间点 tnt_ntn 处的函数值为 yny_nyn
目的:
- yny_nyn:在时间点 tnt_ntn 处的已知函数值(数值解)
- yn+1y_{n+1}yn+1:在下一时间点 tn+1=tn+ht_{n+1} = t_n + htn+1=tn+h 处的待求函数值
- hhh:时间步长(step size),即 tn+1−tnt_{n+1} - t_ntn+1−tn
经典四阶龙格-库塔法的公式为:
yn+1=yn+h6(k1+2k2+2k3+k4) y_{n+1} = y_n + \frac{h}{6} (k_1 + 2k_2 + 2k_3 + k_4) yn+1=yn+6h(k1+2k2+2k3+k4)
其中:
k1=f(tn,yn) k_1 = f(t_n, y_n) k1=f(tn,yn)
-
物理意义:在当前点 (tn,yn)(t_n, y_n)(tn,yn) 处的斜率
-
这是欧拉法使用的唯一斜率估计
k2=f(tn+h2,yn+h2k1) k_2 = f\left(t_n + \frac{h}{2}, y_n + \frac{h}{2} k_1\right) k2=f(tn+2h,yn+2hk1) -
物理意义:在区间中点处的斜率估计
-
时间点:tn+h2t_n + \frac{h}{2}tn+2h(区间中点)
-
状态点:使用 k1k_1k1 预测的中点状态 yn+h2k1y_n + \frac{h}{2} k_1yn+2hk1
k3=f(tn+h2,yn+h2k2) k_3 = f\left(t_n + \frac{h}{2}, y_n + \frac{h}{2} k_2\right) k3=f(tn+2h,yn+2hk2) -
物理意义:另一个中点斜率估计,但使用 k2k_2k2 来预测中点状态
-
这是对中点斜率的改进估计
k4=f(tn+h,yn+hk3) k_4 = f\left(t_n + h, y_n + h k_3\right) k4=f(tn+h,yn+hk3)
-
物理意义:在区间终点处的斜率估计
-
时间点:tn+ht_n + htn+h(下一时间点)
-
状态点:使用 k3k_3k3 预测的终点状态 yn+hk3y_n + h k_3yn+hk3
1.1.2 数值预测
连续时间下的运动学模型为:
f(x)=ddt[pv]=[v−αm∣v∣v−g] f(\mathbf{x})= \frac{d}{dt} \begin{bmatrix} \mathbf{p} \\ \mathbf{v} \end{bmatrix}= \begin{bmatrix} \mathbf{v} \\ -\frac{\alpha}{m} |\mathbf{v}| \mathbf{v} - \mathbf{g} \end{bmatrix} f(x)=dtd[pv]=[v−mα∣v∣v−g]
如果已知某一时刻 tnt_ntn 的状态 xn=[x,y,z,vx,vy,vz]T\mathbf{x_n} = [x, y, z, v_x, v_y, v_z]^Txn=[x,y,z,vx,vy,vz]T,则:
使用 RK4 数值积分从时间 ttt 到 t+Δtt + \Delta tt+Δt 进行状态更新:
令 xn\mathbf{x}_nxn 为当前状态,Δt\Delta tΔt 为时间步长,则:
k1=f(xn)k2=f(xn+Δt2k1)k3=f(xn+Δt2k2)k4=f(xn+Δt k3)xn+1=xn+Δt6(k1+2k2+2k3+k4) \begin{aligned} \mathbf{k}_1 &= f(\mathbf{x}_n) \\ \mathbf{k}_2 &= f\left(\mathbf{x}_n + \frac{\Delta t}{2} \mathbf{k}_1\right) \\ \mathbf{k}_3 &= f\left(\mathbf{x}_n + \frac{\Delta t}{2} \mathbf{k}_2\right) \\ \mathbf{k}_4 &= f\left(\mathbf{x}_n + \Delta t \, \mathbf{k}_3\right) \\ \mathbf{x}_{n+1} &= \mathbf{x}_n + \frac{\Delta t}{6} (\mathbf{k}_1 + 2\mathbf{k}_2 + 2\mathbf{k}_3 + \mathbf{k}_4) \end{aligned} k1k2k3k4xn+1=f(xn)=f(xn+2Δtk1)=f(xn+2Δtk2)=f(xn+Δtk3)=xn+6Δt(k1+2k2+2k3+k4)
1.1.3 中心差分法求雅可比矩阵
Fk=[∂f1∂x∂f1∂y∂f1∂z∂f1∂vx∂f1∂vy∂f1∂vz∂f2∂x⋯⋯⋯⋯∂f2∂vz∂f3∂x⋯⋯⋯⋯∂f3∂vz∂f4∂x⋯⋯⋯⋯∂f4∂vz∂f5∂x⋯⋯⋯⋯∂f5∂vz∂f6∂x⋯⋯⋯⋯∂f6∂vz] \mathbf{F}_k = \begin{bmatrix} \frac{\partial f_1}{\partial x} & \frac{\partial f_1}{\partial y} & \frac{\partial f_1}{\partial z} & \frac{\partial f_1}{\partial v_x} & \frac{\partial f_1}{\partial v_y} & \frac{\partial f_1}{\partial v_z} \\ \frac{\partial f_2}{\partial x} & \cdots & \cdots & \cdots & \cdots & \frac{\partial f_2}{\partial v_z} \\ \frac{\partial f_3}{\partial x} & \cdots & \cdots & \cdots & \cdots & \frac{\partial f_3}{\partial v_z} \\ \frac{\partial f_4}{\partial x} & \cdots & \cdots & \cdots & \cdots & \frac{\partial f_4}{\partial v_z} \\ \frac{\partial f_5}{\partial x} & \cdots & \cdots & \cdots & \cdots & \frac{\partial f_5}{\partial v_z} \\ \frac{\partial f_6}{\partial x} & \cdots & \cdots & \cdots & \cdots & \frac{\partial f_6}{\partial v_z} \end{bmatrix} Fk=∂x∂f1∂x∂f2∂x∂f3∂x∂f4∂x∂f5∂x∂f6∂y∂f1⋯⋯⋯⋯⋯∂z∂f1⋯⋯⋯⋯⋯∂vx∂f1⋯⋯⋯⋯⋯∂vy∂f1⋯⋯⋯⋯⋯∂vz∂f1∂vz∂f2∂vz∂f3∂vz∂f4∂vz∂f5∂vz∂f6
需要求解雅可比矩阵 Fk\mathbf{F}_kFk ,观察其第一列,是需要扰动x变量,然后求得对应的f(x)f(x)f(x),即:
令:
- x+=xk+εe1=[xk+ε, yk, zk, x˙k, y˙k, z˙k]⊤\mathbf{x}^+ = \mathbf{x}_k + \varepsilon \mathbf{e}_1 = [x_k + \varepsilon,\; y_k,\; z_k,\; \dot{x}_k,\; \dot{y}_k,\; \dot{z}_k]^\topx+=xk+εe1=[xk+ε,yk,zk,x˙k,y˙k,z˙k]⊤
- x−=xk−εe1=[xk−ε, yk, zk, x˙k, y˙k, z˙k]⊤\mathbf{x}^- = \mathbf{x}_k - \varepsilon \mathbf{e}_1 = [x_k - \varepsilon,\; y_k,\; z_k,\; \dot{x}_k,\; \dot{y}_k,\; \dot{z}_k]^\topx−=xk−εe1=[xk−ε,yk,zk,x˙k,y˙k,z˙k]⊤
- xn+1=rk4_step(xn,Δt)=xn+Δt6(k1+2k2+2k3+k4)\mathbf{x}_{n+1} ={rk4\_step}(\mathbf{x}_n, \Delta t)= \mathbf{x}_n + \frac{\Delta t}{6} (\mathbf{k}_1 + 2\mathbf{k}_2 + 2\mathbf{k}_3 + \mathbf{k}_4)xn+1=rk4_step(xn,Δt)=xn+6Δt(k1+2k2+2k3+k4)
则:
Fk[:,0]=rk4_step(x+,Δt)−rk4_step(x−,Δt)2×ε \mathbf{F}_k[:, 0] = \frac{ \text{rk4\_step}(\mathbf{x}^+, \Delta t)- \text{rk4\_step}(\mathbf{x}^-, \Delta t) }{2 \times \varepsilon} Fk[:,0]=2×εrk4_step(x+,Δt)−rk4_step(x−,Δt)
以此类推,即可求得Fk\mathbf{F}_kFk每一列数据。
1.2 离散运动学模型:解析解
1.2.1 离散公式:预测
我们使用恒定加速度近似(在 Δt\Delta tΔt 内加速度不变),这是最常用的离散化方式:
xk+1=f(x)=[x+vxΔt+12ax(v)(Δt)2y+vyΔt+12ay(v)(Δt)2z+vzΔt+12az(v)(Δt)2vx+ax(v)Δtvy+ay(v)Δtvz+az(v)Δt] x_{k+1}=f(\mathbf{x}) = \begin{bmatrix} x + v_x \Delta t + \frac{1}{2} a_x(\mathbf{v}) (\Delta t)^2 \\ y + v_y \Delta t + \frac{1}{2} a_y(\mathbf{v}) (\Delta t)^2 \\ z + v_z \Delta t + \frac{1}{2} a_z(\mathbf{v}) (\Delta t)^2 \\ v_x + a_x(\mathbf{v}) \Delta t \\ v_y + a_y(\mathbf{v}) \Delta t \\ v_z + a_z(\mathbf{v}) \Delta t \end{bmatrix} xk+1=f(x)=x+vxΔt+21ax(v)(Δt)2y+vyΔt+21ay(v)(Δt)2z+vzΔt+21az(v)(Δt)2vx+ax(v)Δtvy+ay(v)Δtvz+az(v)Δt
其中加速度为(二次空气阻力 + 重力):
ax=−αmvx∣v∣ay=−αmvy∣v∣az=−αmvz∣v∣−g且∣v∣=vx2+vy2+vz2 \begin{aligned} a_x &= -\frac{\alpha}{m} v_x |v| \\ a_y &= -\frac{\alpha}{m} v_y |v| \\ a_z &= -\frac{\alpha}{m} v_z |v| - g \end{aligned} \quad\text{且}\quad |v| = \sqrt{v_x^2 + v_y^2 + v_z^2} axayaz=−mαvx∣v∣=−mαvy∣v∣=−mαvz∣v∣−g且∣v∣=vx2+vy2+vz2
1.2.2 计算雅可比矩阵Fk=∂f∂x\mathbf{F}_k = \frac{\partial f}{\partial \mathbf{x}}Fk=∂x∂f
由于 fff 只显式依赖于 x\mathbf{x}x 中的速度分量(位置只出现在前 3 项的 x,y,zx,y,zx,y,z 上),雅可比是一个 6×66\times66×6 矩阵:
Fk=[∂f1∂x∂f1∂y∂f1∂z∂f1∂vx∂f1∂vy∂f1∂vz∂f2∂x⋯⋯⋯⋯∂f2∂vz∂f3∂x⋯⋯⋯⋯∂f3∂vz∂f4∂x⋯⋯⋯⋯∂f4∂vz∂f5∂x⋯⋯⋯⋯∂f5∂vz∂f6∂x⋯⋯⋯⋯∂f6∂vz] \mathbf{F}_k = \begin{bmatrix} \frac{\partial f_1}{\partial x} & \frac{\partial f_1}{\partial y} & \frac{\partial f_1}{\partial z} & \frac{\partial f_1}{\partial v_x} & \frac{\partial f_1}{\partial v_y} & \frac{\partial f_1}{\partial v_z} \\ \frac{\partial f_2}{\partial x} & \cdots & \cdots & \cdots & \cdots & \frac{\partial f_2}{\partial v_z} \\ \frac{\partial f_3}{\partial x} & \cdots & \cdots & \cdots & \cdots & \frac{\partial f_3}{\partial v_z} \\ \frac{\partial f_4}{\partial x} & \cdots & \cdots & \cdots & \cdots & \frac{\partial f_4}{\partial v_z} \\ \frac{\partial f_5}{\partial x} & \cdots & \cdots & \cdots & \cdots & \frac{\partial f_5}{\partial v_z} \\ \frac{\partial f_6}{\partial x} & \cdots & \cdots & \cdots & \cdots & \frac{\partial f_6}{\partial v_z} \end{bmatrix} Fk=∂x∂f1∂x∂f2∂x∂f3∂x∂f4∂x∂f5∂x∂f6∂y∂f1⋯⋯⋯⋯⋯∂z∂f1⋯⋯⋯⋯⋯∂vx∂f1⋯⋯⋯⋯⋯∂vy∂f1⋯⋯⋯⋯⋯∂vz∂f1∂vz∂f2∂vz∂f3∂vz∂f4∂vz∂f5∂vz∂f6
第 1-3 行:位置更新对状态的偏导
对位置的偏导(∂fi/∂xj\partial f_i / \partial x_j∂fi/∂xj):
- ∂f1∂x=1\frac{\partial f_1}{\partial x} = 1∂x∂f1=1,其余为 0
- 类似地,∂f2∂y=1\frac{\partial f_2}{\partial y} = 1∂y∂f2=1,∂f3∂z=1\frac{\partial f_3}{\partial z} = 1∂z∂f3=1
对速度的偏导(∂fi/∂vj\partial f_i / \partial v_j∂fi/∂vj):
以 f1=x+vxΔt+12ax(Δt)2f_1 = x + v_x \Delta t + \frac{1}{2} a_x (\Delta t)^2f1=x+vxΔt+21ax(Δt)2 为例:
∂f1∂vx=Δt+12(Δt)2∂ax∂vx \frac{\partial f_1}{\partial v_x} = \Delta t + \frac{1}{2} (\Delta t)^2 \frac{\partial a_x}{\partial v_x} ∂vx∂f1=Δt+21(Δt)2∂vx∂ax
需要计算 ∂ax∂vx\frac{\partial a_x}{\partial v_x}∂vx∂ax
计算加速度对速度的偏导
令 ∣v∣=vx2+vy2+vz2|v| = \sqrt{v_x^2 + v_y^2 + v_z^2}∣v∣=vx2+vy2+vz2
对 ax=−αmvx∣v∣a_x = -\frac{\alpha}{m} v_x |v|ax=−mαvx∣v∣ 求偏导:
∂ax∂vx=−αm(∣v∣+vx⋅vx∣v∣)=−αm(∣v∣+vx2∣v∣) \frac{\partial a_x}{\partial v_x} = -\frac{\alpha}{m} \left( |v| + v_x \cdot \frac{v_x}{|v|} \right) = -\frac{\alpha}{m} \left( |v| + \frac{v_x^2}{|v|} \right) ∂vx∂ax=−mα(∣v∣+vx⋅∣v∣vx)=−mα(∣v∣+∣v∣vx2)
∂ax∂vy=−αmvx⋅vy∣v∣,∂ax∂vz=−αmvx⋅vz∣v∣ \frac{\partial a_x}{\partial v_y} = -\frac{\alpha}{m} v_x \cdot \frac{v_y}{|v|}, \quad \frac{\partial a_x}{\partial v_z} = -\frac{\alpha}{m} v_x \cdot \frac{v_z}{|v|} ∂vy∂ax=−mαvx⋅∣v∣vy,∂vz∂ax=−mαvx⋅∣v∣vz
类似可得 ay,aza_y, a_zay,az 的偏导。
最终雅可比矩阵 Fk\mathbf{F}_kFk
令:
- s=∣v∣=vx2+vy2+vz2s = |v| = \sqrt{v_x^2 + v_y^2 + v_z^2}s=∣v∣=vx2+vy2+vz2
- β=αm\beta = \frac{\alpha}{m}β=mα
定义辅助量:
∂ax∂vx=−β(s+vx2s),∂ax∂vy=−βvxvys,∂ax∂vz=−βvxvzs \frac{\partial a_x}{\partial v_x} = -\beta \left(s + \frac{v_x^2}{s}\right), \quad \frac{\partial a_x}{\partial v_y} = -\beta \frac{v_x v_y}{s}, \quad \frac{\partial a_x}{\partial v_z} = -\beta \frac{v_x v_z}{s} ∂vx∂ax=−β(s+svx2),∂vy∂ax=−βsvxvy,∂vz∂ax=−βsvxvz
其他类似。
构造 Fk\mathbf{F}_kFk:
Fk=[100Δt+12(Δt)2∂ax∂vx12(Δt)2∂ax∂vy12(Δt)2∂ax∂vz01012(Δt)2∂ay∂vxΔt+12(Δt)2∂ay∂vy12(Δt)2∂ay∂vz00112(Δt)2∂az∂vx12(Δt)2∂az∂vyΔt+12(Δt)2∂az∂vz0001+Δt∂ax∂vxΔt∂ax∂vyΔt∂ax∂vz000Δt∂ay∂vx1+Δt∂ay∂vyΔt∂ay∂vz000Δt∂az∂vxΔt∂az∂vy1+Δt∂az∂vz] \mathbf{F}_k = \begin{bmatrix} 1 & 0 & 0 & \Delta t + \frac{1}{2} (\Delta t)^2 \frac{\partial a_x}{\partial v_x} & \frac{1}{2} (\Delta t)^2 \frac{\partial a_x}{\partial v_y} & \frac{1}{2} (\Delta t)^2 \frac{\partial a_x}{\partial v_z} \\ 0 & 1 & 0 & \frac{1}{2} (\Delta t)^2 \frac{\partial a_y}{\partial v_x} & \Delta t + \frac{1}{2} (\Delta t)^2 \frac{\partial a_y}{\partial v_y} & \frac{1}{2} (\Delta t)^2 \frac{\partial a_y}{\partial v_z} \\ 0 & 0 & 1 & \frac{1}{2} (\Delta t)^2 \frac{\partial a_z}{\partial v_x} & \frac{1}{2} (\Delta t)^2 \frac{\partial a_z}{\partial v_y} & \Delta t + \frac{1}{2} (\Delta t)^2 \frac{\partial a_z}{\partial v_z} \\ 0 & 0 & 0 & 1 + \Delta t \frac{\partial a_x}{\partial v_x} & \Delta t \frac{\partial a_x}{\partial v_y} & \Delta t \frac{\partial a_x}{\partial v_z} \\ 0 & 0 & 0 & \Delta t \frac{\partial a_y}{\partial v_x} & 1 + \Delta t \frac{\partial a_y}{\partial v_y} & \Delta t \frac{\partial a_y}{\partial v_z} \\ 0 & 0 & 0 & \Delta t \frac{\partial a_z}{\partial v_x} & \Delta t \frac{\partial a_z}{\partial v_y} & 1 + \Delta t \frac{\partial a_z}{\partial v_z} \end{bmatrix} Fk=100000010000001000Δt+21(Δt)2∂vx∂ax21(Δt)2∂vx∂ay21(Δt)2∂vx∂az1+Δt∂vx∂axΔt∂vx∂ayΔt∂vx∂az21(Δt)2∂vy∂axΔt+21(Δt)2∂vy∂ay21(Δt)2∂vy∂azΔt∂vy∂ax1+Δt∂vy∂ayΔt∂vy∂az21(Δt)2∂vz∂ax21(Δt)2∂vz∂ayΔt+21(Δt)2∂vz∂azΔt∂vz∂axΔt∂vz∂ay1+Δt∂vz∂az
这就是“转移矩阵”——它是一个依赖于当前速度的时变雅可比矩阵。
2. 观测矩阵 H
由于系统仅能观测到三维位置信息 (X,Y,Z)(X, Y, Z)(X,Y,Z),而状态向量 xk\mathbf{x}_kxk 包含了位置和速度两个维度的信息,因此需要通过观测矩阵 H\mathbf{H}H 将高维状态空间映射到低维观测空间。
观测向量定义为:
zk=[XkYkZk] \mathbf{z}_k = \begin{bmatrix} X_k \\ Y_k \\ Z_k \end{bmatrix} zk=XkYkZk
对应的观测矩阵为:
H=[100000010000001000] \mathbf{H} = \begin{bmatrix} 1 & 0 & 0 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 & 0 & 0 \\ 0 & 0 & 1 & 0 & 0 & 0 \end{bmatrix} H=100010001000000000
该矩阵的作用是从 6 维状态向量中提取前 3 维位置信息作为观测值。
3. 过程噪声协方差 Q
Q=diag(0,0,0,a1,a2,a3) \mathbf{Q} = \mathrm{diag}(0, 0, 0, a_1, a_2, a_3) Q=diag(0,0,0,a1,a2,a3)
该协方差矩阵体现了物理系统的运动特性:
- 位置维度不引入噪声(假设位置不会发生突变)
- 速度维度存在噪声(反映加速度的不确定性)
物理意义链路:加速度不确定性 → 速度缓慢漂移 → 位置随之变化
参数调节建议:
- 初始值设为较小值(如 0.01)
- 逐步增大直至滤波器稳定收敛
4. 观测噪声协方差 R
静态标定方法
- 将目标物体置于已知静止位置(如 [0,0,1][0,0,1][0,0,1])
- 连续采集 NNN 组观测数据:z1,z2,...,zN\mathbf{z}_1, \mathbf{z}_2, ..., \mathbf{z}_Nz1,z2,...,zN
- 计算各方向的样本方差:
σ^x2=1N−1∑i=1N(zi,x−zˉx)2 \hat{\sigma}_x^2 = \frac{1}{N-1} \sum_{i=1}^N (z_{i,x} - \bar{z}_x)^2 σ^x2=N−11i=1∑N(zi,x−zˉx)2
- 构建观测噪声协方差矩阵:
R=diag(σ^x2,σ^y2,σ^z2) \mathbf{R} = \mathrm{diag}(\hat{\sigma}_x^2, \hat{\sigma}_y^2, \hat{\sigma}_z^2) R=diag(σ^x2,σ^y2,σ^z2)
动态误差处理
当观测误差具有动态特性时,可根据传感器精度指标确定:
- 若精度为 ±2 cm±2\,\text{cm}±2cm,则 σ2=(0.02)2=4×10−4\sigma^2 = (0.02)^2 = 4 \times 10^{-4}σ2=(0.02)2=4×10−4
5. 初始状态量
对于初始状态量 x0\mathbf{x}_0x0 的设定,通常采用以下两种策略:
策略一(推荐):基于观测数据计算
- 位置:使用第一次观测数据 z1\mathbf{z}_1z1 作为初始位置
- 速度:通过前两次观测数据计算得到,v0=z2−z1\mathbf{v}_0 = \mathbf{z}_2 - \mathbf{z}_1v0=z2−z1
这种方法能够提供更接近真实值的初始状态,但需要至少两次观测数据。
策略二:简化设定
- 位置:使用第一次观测数据 z1\mathbf{z}_1z1
- 速度:直接初始化为零向量 0\mathbf{0}0
虽然此方法仅需一次观测,但初始误差较大。不过随着卡尔曼滤波的迭代更新,状态估计会逐渐收敛到真实值。
6. 初始协方差矩阵
基于对初始状态不确定性的估计设置:
- 位置不确定性:若标准差为 1 米,则协方差项设为 12=11^2 = 112=1
- 速度不确定性:若标准差为 0.5 m/s,则协方差项设为 0.52=0.250.5^2 = 0.250.52=0.25
补充说明:连续时间系统处理
可以使用伴随方程法来计算转移矩阵连续时间的转移矩阵,但是这个计算量非常大,所以一般使用离散时间。
理论基础
状态协方差 P(t)\mathbf{P}(t)P(t) 的时间演化遵循以下微分方程:
P˙(t)=A(t)P(t)+P(t)AT(t)+Qc(t) \dot{\mathbf{P}}(t) = \mathbf{A}(t) \mathbf{P}(t) + \mathbf{P}(t) \mathbf{A}^T(t) + \mathbf{Q}_c(t) P˙(t)=A(t)P(t)+P(t)AT(t)+Qc(t)
此即伴随方程(或连续 Riccati 方程),其中:
- A(t)=∂f∂x∣x(t)\mathbf{A}(t) = \frac{\partial f}{\partial \mathbf{x}}\big|_{\mathbf{x}(t)}A(t)=∂x∂fx(t):系统状态转移的连续雅可比矩阵
- Qc(t)\mathbf{Q}_c(t)Qc(t):连续过程噪声协方差(单位:每秒)