卡尔曼滤波实例分析(三)——待续

文章探讨了在飞行器模型中遇到的非线性问题,如圆形运动的建模,模型包含速度、位置和角速度的动态变化。由于现实中的噪声影响,模型预测与实际运行轨迹产生偏差。为解决这一问题,文章提到了扩展卡尔曼滤波,它是对线性卡尔曼滤波的扩展,适用于处理非线性系统。通过构建雅克比矩阵,实现对飞行器状态的估计和校正,以减小噪声带来的误差。仿真结果显示,扩展卡尔曼滤波对于非线性模型的滤波效果显著。

1 问题

之前的案例都是线线性的,但实际情况常面临很多非线性问题,比如:
假设平面上有一飞行器,初始坐标为(x0,y0)(x_0,y_0)(x0,y0),需要该飞行器基于该平面完成一个圆形运动,模型如下;
(1)建模
xt+1=xt+vx∗dt∗cos(w)x_{t+1} = x_t+v_x*dt*cos(w)xt+1=xt+vxdtcos(w)
yt+1=yt+vy∗dt∗sin(w)y_{t+1} = y_t+v_y*dt*sin(w)yt+1=yt+vydtsin(w)
wt+1=wt+Δ(w)∗dtw_{t+1} = w_t+\Delta(w)*dtwt+1=wt+Δ(w)dt


import numpy as np
import matplotlib.pyplot as plt
"""
速度:X = X0 + V_X * t * cos(w)
位置:Y = Y0 + V_Y * t * sin(w)
角速度:W = W0 + Dw * t

"""
DT = 0.1
SIM_TIME = 500.0  

H = np.array([[1.0, 0.0],
              [0.0, 1.0]])



def calc_input():
    v = 1.0  # [m/s]
    yawrate = 0.1  # [rad/s]
    u = np.array([[v], [yawrate]])
    return u

def motion_model(x,u):
    
    A = np.array([[1.0, 0.0,0.0],
                  [0.0, 1.0,0.0],
                  [0.0, 0.0,1.0]])
    
    B = np.array([[DT * np.cos(x[2, 0]), 0],
                  [DT * np.sin(x[2, 0]), 0],
                  [0.0, DT]])
    
    x = A @ x +B @ u
    return x
   
def observation_model(x):
    H = np.array([
        [1, 0, 0],
        [0, 1, 0]])

    z = H @ x
    return z
    
time=0

x_array = []    
y_array = []

xTrue = np.zeros((3, 1))
u = np.array([[1. ],
       [0.01]])
    
while SIM_TIME >= time:
   
    xTrue = motion_model(xTrue,u)
    x_array.append(xTrue[0,0])
    y_array.append(xTrue[1,0])
    time += DT
    
plt.figure(0)     
plt.plot(x_array,y_array,'g')
plt.show() 

然而现实总存在各种噪声,以至于模型并不会像设计那样得到想要的结构,在上述模型的输入和观测加入噪声。可以得到观测模型

def observation(x, xd, u):
    x = motion_model(x, u)

    z = observation_model(xTrue) + NOISE_OP @ np.random.randn(2, 1)

    ud = u + NOISE_INPUT @ np.random.randn(2, 1)

    xd = motion_model(xd, ud)

    return x, z, xd, ud

运行后能的到如下结果:
在这里插入图片描述
可见失之毫厘谬以千里,如果不加以滤波和修正,该飞行器将不会按理想的运行轨迹运行。
由于所构建的模型引入了三角函数,该模型将不是一个线性模型,卡尔曼滤波将不再适用,因此引入了扩展卡尔曼滤波。
首先需要构建雅克比矩阵:
有模型函数可得:

(2)状态空间方程

2 算法实现

3仿真结果

### 回答1: 卡尔曼滤波是一种用于实时估计动态系统状态的算法。它在许多领域中被广泛应用,如航空航天、导航、机器人等。卡尔曼滤波算法通过结合系统的测量数据和模型预测值,来动态地更新系统的状态估计。它的核心思想是将已有的信息与新的观测结果进行加权平均,从而得到对系统真实状态更准确的估计。 在Matlab中,我们可以通过编写卡尔曼滤波的仿真程序来实现对系统状态的估计。首先,我们需要定义系统的状态方程和观测方程,以及系统的初始状态和噪声模型。然后,使用kalman函数来进行滤波处理,将观测数据输入到滤波器中,得到对状态的估计值。 具体而言,我们可以按照以下步骤来编写卡尔曼滤波的Matlab仿真程序: 1. 定义系统的状态方程和观测方程,并初始化系统状态和滤波器的状态估计。 2. 定义系统的噪声模型,包括过程噪声和观测噪声的协方差矩阵。 3. 生成系统的真实状态序列和对应的观测数据。 4. 使用kalman函数进行滤波处理,将观测数据输入到滤波器中,得到对状态的估计值。 5. 计算滤波器的误差协方差矩阵,评估滤波器性能。 6. 绘制真实状态序列、观测数据和滤波器估计值的曲线图,以及滤波器误差的方差曲线图。 在编写程序时,我们还可以尝试不同的参数设置和噪声模型,以及对结果进行分析和优化。 总之,通过在Matlab中编写卡尔曼滤波的仿真程序,我们可以更好地理解卡尔曼滤波的原理和应用,并对其进行调试和优化,从而实现更准确的状态估计。 ### 回答2: 卡尔曼滤波是一种用于估计状态变量的方法,它通过将测量观测值与先验估计进行加权平均,来获得更准确的状态估计值。这种滤波方法常用于控制系统中,尤其是在传感器测量带有噪声的情况下。 卡尔曼滤波的原理主要包含两个步骤:预测和更新。在预测步骤中,使用系统的状态转移方程预测下一时刻的状态变量;而在更新步骤中,根据已有的观测值和预测值之间的误差,计算卡尔曼增益,从而对预测值进行修正,得到更准确的状态估计。 Matlab是一种广泛使用的科学计算与数据分析工具,提供了丰富的数学函数和工具箱,可以方便地进行卡尔曼滤波的仿真。在Matlab中,可以使用kalman函数来实现卡尔曼滤波。具体步骤如下: 1. 定义系统的状态转移方程、观测方程和噪声协方差矩阵。 2. 初始化系统的状态向量和协方差矩阵。 3. 通过循环迭代,对每个时刻进行滤波。 4. 在预测步骤中,使用状态转移方程进行状态的预测。 5. 在更新步骤中,计算观测值与预测值之间的误差,并计算卡尔曼增益。 6. 根据卡尔曼增益修正预测值,得到更准确的状态估计。 7. 更新协方差矩阵,并记录滤波结果。 Matlab还提供了一些用于可视化和分析滤波结果的函数,如plot函数和mean函数等。 通过使用Matlab进行卡尔曼滤波的仿真,我们可以观察到滤波结果与真实值的接近程度,评估滤波算法的性能并进行参数调整,以获得更准确的状态估计。这对于控制系统的设计和实际应用具有重要意义。 ### 回答3: 卡尔曼滤波是一种最优化的滤波方法,用于估计系统的状态。它通过融合系统的测量值和预测值,提供对未知状态的最优估计。卡尔曼滤波的原理是基于贝叶斯定理,它假设系统的状态满足线性动力学方程,并且状态的噪声满足高斯分布。在卡尔曼滤波中,有两个主要的步骤:预测步骤和更新步骤。 预测步骤是根据上一个时刻的状态估计值,预测当前时刻的状态估计值和协方差矩阵。更新步骤是通过测量值,根据预测的状态估计值和当前测量值之间的差异,进行状态的修正和协方差矩阵的更新。 Matlab中提供了卡尔曼滤波的仿真工具箱,可以通过设置系统模型、测量模型、协方差矩阵以及初始状态值等参数,实现对状态的估计。 随书程序是指在教科书中附带的示例程序。卡尔曼滤波的随书程序是指通过Matlab编写的卡尔曼滤波的代码示例。这些示例程序可以帮助读者理解卡尔曼滤波的原理和应用,并且可以通过修改参数和增加噪声等操作,进行仿真实验,观察估计结果的变化。 通过使用Matlab编写随书程序,读者可以更好地理解卡尔曼滤波算法,掌握卡尔曼滤波的实现方法,并且可以在实际应用中进行调试和参数优化。 总之,卡尔曼滤波原理和应用的随书程序是一种辅助学习和实验的工具,通过使用Matlab编写,可以更好地理解卡尔曼滤波算法,并且可以进行仿真实验,优化参数,提高对系统状态的估计精度。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值