本文参考了Matlab对卡尔曼滤波器的官方教程及帮助文档(Kalman Filter)。官方教程的B站链接如下,在此对分享资源的Up主表示感谢。(如不能正常播放或需要看中文字幕,请点击 此处B站链接 )

【官方教程】卡尔曼滤波器教程与MATLAB仿真(全)(中英字幕)

另外提供友情链接如下:

  1. 卡尔曼滤波算法(知乎,多维情形)
  2. Matlab关于传感器融合知识的介绍
  3. 扩展卡尔曼滤波算法(CSDN,适合入门)
  4. 扩展卡尔曼滤波算法(知乎,适合入门)
  5. 扩展卡尔曼滤波算法(知乎,适合进阶)
\begin{cases} \dot{x}=\begin{bmatrix} 0 &1\\0 & 0 \end{bmatrix}x+\begin{bmatrix} 0 \\ 1 \end{bmatrix}u\\[2ex] y=\begin{bmatrix} 0 & 1 \end{bmatrix}x \end{cases} x ˙ = [ 0 0 1 0 ] x + [ 0 1 ] u y = [ 0 1 ] x
选取采用间隔 \begin{cases} x(n)=\begin{bmatrix} 1 &dt \\ 0 & 1 \end{bmatrix}x(n-1)+\begin{bmatrix} 0 \\ dt \end{bmatrix}u(n-1)\\[2ex] y(n)=\begin{bmatrix} 0 & 1 \end{bmatrix}x(n) \end{cases}
x ( n ) = [ 1 0 d t 1 ] x ( n 1 ) + [ 0 d t ] u ( n 1 ) y ( n ) = [ 0 1 ] x ( n )
按照惯例定义
A=\begin{bmatrix} 1 &dt \\ 0 & 1 \end{bmatrix},B=\begin{bmatrix} 0 \\ dt \end{bmatrix},C=\begin{bmatrix} 0 & 1 \end{bmatrix}, I=\begin{bmatrix} 1 &0 \\ 0 & 1 \end{bmatrix} A = [ 1 0 d t 1 ] , B = [ 0 d t ] , C = [ 0 1 ] , I = [ 1 0 0 1 ]
由于系统具有一定的过程噪声 K_k=\frac{P_k^-C^T}{CP_k^-C^T+R}\\[2ex] \hat{x}_k=\hat{x}^-_k+K_k(y_v-C\hat{x}^-_k)\\[2ex] P_k=(I-K_kC)P_k^- K k = C P k C T + R P k C T x ^ k = x ^ k + K k ( y v C x ^ k ) P k = ( I K k C ) P k
  • 根据 xh0 = [ 0 ; 0 ] ; % x0的估计 u = ones ( 1 , N ) ; % 加速度恒定 w = sqrt ( Q ) * randn ( 2 , N ) ; % 控制变量的误差2*N v = sqrt ( R ) * randn ( 1 , N ) ; % 测量误差1*N ye_list = zeros ( size ( u ) ) ; % 估计值 yv_list = zeros ( size ( u ) ) ; % 测量值 y_list = zeros ( size ( u ) ) ; % 实际值 cov_list = zeros ( size ( u ) ) ; % 测量方差 for i = 1 : numel ( u ) xreal = A * x0 + B * u ( i ) ; % 真实的状态变量 yreal = C * x0 ; % 真实的测量 x1 = xreal + w ( : , i ) ; % 含噪声的状态变量 yv = yreal + v ( i ) ; % 含噪声的测量 xfe = A * xh0 + B * u ( i ) ; % 先验的状态变量 Pfe = A * P * A ' + Q ; % 先验的状态变量协方差 K = Pfe * C ' / ( C * Pfe * C ' + R ) ; % 卡尔曼最优增益 xh1 = xfe + K * ( yv - C * xfe ) ; % 当前的状态估计 ye = C * xh1 ; P = ( I - K * C ) * Pfe ; x0 = x1 ; xh0 = xh1 ; y_list ( i ) = yreal ; yv_list ( i ) = yv ; ye_list ( i ) = ye ; cov_list ( i ) = C * P * C ' ; ax = ( 1 : N ) .* dt ; figure ( 1 ) ; subplot ( 2 , 2 , 1 ) plot ( ax , y_list , ax , yv_list , ax , ye_list ) legend ( '实际' , '测量' , '估计' , 'Location' , 'best' ) title ( '汽车的位移' ) ylabel ( '位移/m' ) xlabel ( '时间/s' ) subplot ( 2 , 2 , 2 ) plot ( ax , yv_list - y_list , ax , ye_list - y_list ) legend ( '测量' , '估计' , 'Location' , 'best' ) title ( '汽车的位移误差' ) ylabel ( '位移/m' ) xlabel ( '时间/s' ) subplot ( 2 , 2 , [ 3 , 4 ] ) plot ( ax , cov_list ) legend ( '测量方差' , 'Location' , 'best' ) title ( '测量方差' ) ylabel ( '方差/m^2' ) xlabel ( '时间/s' )

    本文设定的采样间隔

    引言:在进行一些信号处理的过程中,我们通常会采集到一些数据,但是实际测量到的数据是受到噪声干扰了之后的,故与真实的数据有一些偏差。因此我们把 [ 通过测量数据进行一系列处理得到近似于真实数据 ] 的过程(或利用测量数据估计得到近似于真实数据的过程)称为 [ 估计 ] 。 其中 [ 波形估计 ] 是很重要的一种工具,在目标跟踪,轨迹跟踪等方面具有很重要的 应用 。一般波形估计是通过一组数据得到另一组数据,就像是一组数据通过了一个滤波器,得到另一组数据。故经常会听到 [维纳滤波器]、[ 卡尔曼滤波器 ] 等词汇。 plot(x,y,'color_style_marker') color_style_marker 包含一至四个字符(包括在单引号中),这些字符根据颜色、线型和标记类型构造而成。例如, plot(x,y,'r:+') 使用红色点线绘制数据,并在每个数据点处放置一个 + 标记。 color_style_marker 由下列元素的组合形式构成。
    卡尔曼滤波器 是一种经典的状态估计器,可用于推断系统状态并估计相应的误差。它基于贝叶斯推断和线性系统模型,可以处理线性或非线性、动态或静态系统。 卡尔曼滤波器 的主要思想是通过当前测量值和先前估计的状态值来计算新的最优状态估计,同时在该过程中尽可能减小滤波器的偏差和方差。 在 matlab 中,可以使用kf函数来实现 卡尔曼滤波器 。该函数需要指定系统的状态转移矩阵和观测矩阵,即描述系统动态和测量过程的方程组。另外,还需要指定系统的初始状态和协方差矩阵,以及噪声方差和测量噪声方差。 应用 方面, 卡尔曼滤波器 在信号处理、控制系统、机器人导航、图像处理等领域都有广泛的 应用 。例如,可以用 卡尔曼滤波器 对传感器数据进行滤波和校正,提高信号的精度和稳定性。在自主导航系统中, 卡尔曼滤波器 可用于推测机器人的位置、姿态和速度等状态,从而实现精确的导航和路径规划。此外, 卡尔曼滤波器 在图像处理中也具有重要的作用,如在图像去噪、匹配、跟踪和估计等方面均有 应用
    cb12138.: 谢谢您的回复,我重新理清楚了大致的逻辑,但是没有找到PID_n_access.m文件中的parameters_list参数是在哪里赋值的呢,同时我运行起来一直报错: 无法执行赋值,因为左侧和右侧的元素数目不同。 出错 PID_n_access (第 10 行) y(sim_i)=log(ts_n./ts_n0+1)+log(n_sigma./n_sigma0+1)+exp(n_err*10); 不清楚是什么原因,我更改了您的部分代码,因为我只需要两个参数的寻优,期待回复 表情包 Ubuntu安装NVIDIA显卡驱动(新手教程) 感谢,方法1亲测有效。比其他指南里的编译内核啥的方法简单多了。 表情包 【Simulink】粒子群算法(PSO)整定PID参数(附代码和讲解) 非线性光学元件: pso.m调用的函数PID_access那个函数,那个函数里面有评价函数
  •