首先你需要知道卡尔曼滤波,卡尔曼滤波适用于线性系统,针对于非线性系统很好推广应用。EKF利用线性化的方式,让状态和协方差在线性化方程中传播,但是面对强非线性,这种方式误差较大,因为高斯分布的噪声经过非线性系统的分布并不是高斯分布。UKF利用5个采样点(无迹变换)在非线性系统中传播,降低了随机变量经过非线性系统传播的误差,效果强于EKF。针对P矩阵出现非正定的情况,其实有很多处理方式的。
### 无迹卡尔曼滤波(UKF)详解与MATLAB实现
#### 一、卡尔曼滤波基础知识
卡尔曼滤波是一种递归算法,用于估计动态系统的状态,特别是当这些状态不能直接测量时。传统的卡尔曼滤波适用于线性系统,并假设过程噪声和测量噪声都是高斯分布。然而,在许多实际应用中,系统是非线性的,这就需要对卡尔曼滤波进行扩展以适应非线性系统。
#### 二、扩展卡尔曼滤波(EKF)
EKF通过将非线性模型线性化来解决非线性问题。具体来说,它利用雅可比矩阵来近似状态转移方程和观测方程中的非线性部分。尽管EKF在一定程度上解决了非线性问题,但它仍然存在一些局限性:对于高度非线性的系统,这种线性化方法可能会引入较大的误差,尤其是在高斯分布经过非线性变换后不再是高斯分布的情况下。
#### 三、无迹卡尔曼滤波(UKF)
为了克服EKF在处理高度非线性系统时的局限性,无迹卡尔曼滤波(UKF)被提出。UKF的核心思想是使用一组精心选择的样本点(称为sigma点)来近似系统的概率分布,而不是像EKF那样直接线性化非线性函数。这些sigma点是基于当前的状态估计及其协方差矩阵生成的,它们经过非线性函数的变换后,可以更准确地逼近非线性系统中的概率分布。
##### UKF的工作原理:
1. **Sigma点的生成**:
- 对于具有\( L \)个状态变量的系统,UKF通常生成\( 2L + 1 \)个sigma点。
- 这些点围绕均值\( x \)分布,其中包含一个均值点以及\( L \)个与其对应的正负方向的点。
- 每个点都有相应的权重,用于计算后续步骤中的均值和协方差。
2. **预测步骤**:
- 将每个sigma点通过非线性状态转移方程\( f \)进行变换,得到预测后的sigma点集。
- 使用预测sigma点集重新估计预测状态\( x_{k|k-1} \)及其协方差矩阵\( P_{k|k-1} \)。
3. **更新步骤**:
- 同样地,将预测sigma点通过观测方程\( h \)进行变换,得到预测观测值。
- 计算残差(测量值与预测观测值之间的差异),并使用残差更新状态估计及其协方差矩阵。
4. **参数调整**:
- \( \alpha \)控制了sigma点离均值的距离,其值越大意味着sigma点越远离均值。
- \( \beta \)影响了分布形状的权重,默认为2,适用于高斯分布。
- \( k_i \)是用于进一步调整sigma点分布的次要参数。
#### 四、MATLAB代码解析
根据给定的DEMO.m文件,我们可以看到一个具体的UKF实现示例。该示例中定义了一个三维的非线性系统,其状态转移方程由\( f \)表示,而观测方程由\( h \)表示。代码中的关键步骤包括:
1. **初始化**:
- 定义了系统的基本参数如\( n \)(状态维度)、\( q \)(过程噪声标准差)、\( r \)(测量噪声标准差)等。
- 设置了初始状态\( s \),并添加了噪声来模拟实际情况。
2. **主循环**:
- 在每一步中,首先生成了一个测量值\( z \),然后调用UKF函数来更新状态估计。
- 更新了真实状态\( s \),以模拟系统的真实演变过程。
- 绘制了估计状态与真实状态的变化曲线。
#### 五、总结
通过上述分析,我们了解到UKF作为一种强大的非线性估计技术,在处理高度非线性问题时具有明显优势。相比于EKF,UKF通过使用sigma点更准确地捕捉非线性变换下的概率分布,从而提高了估计精度。此外,通过MATLAB代码的具体实现,我们也能更好地理解UKF算法的实际应用过程。在未来的研究和发展中,UKF将继续在各种领域发挥重要作用,特别是在那些需要精确估计非线性动态系统状态的应用场景中。