查看: 4863|回复: 14

[其他] Debug连载帖十三:卡尔曼滤波器2

[复制链接]
  • TA的每日心情
    郁闷
    2021-3-10 19:44
  • 签到天数: 7 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    126

    主题

    525

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    2018
    最后登录
    2023-12-25
    发表于 2015-9-15 14:46:43 | 显示全部楼层 |阅读模式
      本节内容需要各位拥有一定的线性代数的计算基础。(最好会用matlab)
      根据前面的描述,我们把房间看成一个系统,然后对这个系统建模。当然,我们见的模型不需要非常地精确。我们所知道的这个房间的温度是跟前一时刻的温度相同的,所以A=1。没有控制量,所以U(k)=0。因此得出:
    X(k|k-1)=X(k-1|k-1) ……….. (6)
    式子(2)可以改成:
    P(k|k-1)=P(k-1|k-1) +Q ……… (7)
      因为测量的值是温度计的,跟温度直接对应,所以H=1。式子3,4,5可以改成以下:
    X(k|k)= X(k|k-1)+Kg(k) (Z(k)-X(k|k-1)) ……… (8)
    Kg(k)= P(k|k-1) / (P(k|k-1) + R) ……… (9)
    P(k|k)=(1-Kg(k))P(k|k-1) ……… (10)

      现在我们模拟一组测量值作为输入。假设房间的真实温度为25度,我模拟了200个测量值,这些测量值的平均值为25度,但是加入了标准偏差为几度的高斯白噪声。

      为了令卡尔曼滤波器开始工作,我们需要告诉卡尔曼两个零时刻的初始值,是X(0|0)和P(0|0)。他们的值不用太在意,随便给一个就可以了,因为随着卡尔曼的工作,X会逐渐的收敛。但是对于P,一般不要取0,因为这样可能会令卡尔曼完全相信你给定的X(0|0)是系统最优的,从而使算法不能收敛。我选了 X(0|0)=1度,P(0|0)=10。

      该系统的真实温度为25度。

      卡尔曼滤波是以最小均方误差为估计的最佳准则,来寻求一套递推估计的算法,其基本思想是:采用信号与噪声的状态空间模型,利用前一时刻地估计值和现时刻的观测值来更新对状态变量的估计,求出现时刻的估计值。
    现设线性时变系统的离散状态防城和观测方程为:
    X(k) = F(k,k-1)·X(k-1)+T(k,k-1)·U(k-1)
    Y(k) = H(k)·X(k)+N(k)
    其中:
    X(k)和Y(k)分别是k时刻的状态矢量和观测矢量
    F(k,k-1)为状态转移矩阵
    U(k)为k时刻动态噪声
    T(k,k-1)为系统控制矩阵
    H(k)为k时刻观测矩阵
    N(k)为k时刻观测噪声

    则卡尔曼滤波的算法流程为:
    预估计X(k)^= F(k,k-1)·X(k-1)

    1. 计算预估计协方差矩阵
    C(k)^=F(k,k-1)×C(k)×F(k,k-1)'+T(k,k-1)×Q(k)×T(k,k-1)'
    Q(k) = U(k)×U(k)'  

    2. 计算卡尔曼增益矩阵
    K(k) = C(k)^×H(k)'×[H(k)×C(k)^×H(k)'+R(k)]^(-1)
    R(k) = N(k)×N(k)'  

    3. 更新估计
    X(k)~=X(k)^+K(k)×[Y(k)-H(k)×X(k)^]  

    4. 计算更新后估计协防差矩阵
    C(k)~ = [I-K(k)×H(k)]×C(k)^×[I-K(k)×H(k)]'+K(k)×R(k)×K(k)'  

    5. X(k+1) = X(k)~
    C(k+1) = C(k)~

    重复以上步骤
    c语言实现代码如下:
    1. #include "stdlib.h"
    2.   #include "rinv.c"
    3.   int lman(n,m,k,f,q,r,h,y,x,p,g)
    4.   int n,m,k;
    5.   double f[],q[],r[],h[],y[],x[],p[],g[];
    6.   {
    7. int i,j,kk,ii,l,jj,js;
    8.     double *e,*a,*b;
    9.     e=malloc(m*m*sizeof(double));
    10.     l=m;
    11.     if (l<n) l=n;
    12.     a=malloc(l*l*sizeof(double));
    13.     b=malloc(l*l*sizeof(double));
    14.     for (i=0; i<=n-1; i++)
    15.       for (j=0; j<=n-1; j++)
    16.         { ii=i*l+j; a[ii]=0.0;
    17.           for (kk=0; kk<=n-1; kk++)
    18.             a[ii]=a[ii]+p[i*n+kk]*f[j*n+kk];
    19.         }
    20.     for (i=0; i<=n-1; i++)
    21.       for (j=0; j<=n-1; j++)
    22.         { ii=i*n+j; p[ii]=q[ii];
    23.           for (kk=0; kk<=n-1; kk++)
    24.             p[ii]=p[ii]+f[i*n+kk]*a[kk*l+j];
    25.         }
    26.     for (ii=2; ii<=k; ii++)
    27.       { for (i=0; i<=n-1; i++)
    28.         for (j=0; j<=m-1; j++)
    29.           { jj=i*l+j; a[jj]=0.0;
    30.             for (kk=0; kk<=n-1; kk++)
    31.               a[jj]=a[jj]+p[i*n+kk]*h[j*n+kk];
    32.           }
    33.         for (i=0; i<=m-1; i++)
    34.         for (j=0; j<=m-1; j++)
    35.           { jj=i*m+j; e[jj]=r[jj];
    36.             for (kk=0; kk<=n-1; kk++)
    37.               e[jj]=e[jj]+h[i*n+kk]*a[kk*l+j];
    38.           }
    39.         js=rinv(e,m);
    40.         if (js==0)
    41.           { free(e); free(a); free(b); return(js);}
    42.         for (i=0; i<=n-1; i++)
    43.         for (j=0; j<=m-1; j++)
    44.           { jj=i*m+j; g[jj]=0.0;
    45.             for (kk=0; kk<=m-1; kk++)
    46.               g[jj]=g[jj]+a[i*l+kk]*e[j*m+kk];
    47.           }
    48.         for (i=0; i<=n-1; i++)
    49.           { jj=(ii-1)*n+i; x[jj]=0.0;
    50.             for (j=0; j<=n-1; j++)
    51.               x[jj]=x[jj]+f[i*n+j]*x[(ii-2)*n+j];
    52.           }
    53.         for (i=0; i<=m-1; i++)
    54.           { jj=i*l; b[jj]=y[(ii-1)*m+i];
    55.             for (j=0; j<=n-1; j++)
    56.               b[jj]=b[jj]-h[i*n+j]*x[(ii-1)*n+j];
    57.           }
    58.         for (i=0; i<=n-1; i++)
    59.           { jj=(ii-1)*n+i;
    60.             for (j=0; j<=m-1; j++)
    61.               x[jj]=x[jj]+g[i*m+j]*b[j*l];
    62.           }
    63.         if (ii<k)
    64.           { for (i=0; i<=n-1; i++)
    65.             for (j=0; j<=n-1; j++)
    66.               { jj=i*l+j; a[jj]=0.0;
    67.                 for (kk=0; kk<=m-1; kk++)
    68.                   a[jj]=a[jj]-g[i*m+kk]*h[kk*n+j];
    69.                 if (i==j) a[jj]=1.0+a[jj];
    70.               }
    71.             for (i=0; i<=n-1; i++)
    72.             for (j=0; j<=n-1; j++)
    73.               { jj=i*l+j; b[jj]=0.0;
    复制代码

    卡尔曼滤波的内容简单介绍到这里,比较困难,对于想搞自动控制和四元数还有姿态控制(包括姿态融合)的同志们一定要弄懂,卡尔曼核心就是观测状态和实际状态的问题。希望各位能看明白。如果写的不好,希望指正。

    如果各位想要真正弄懂卡尔曼滤波,还需要参考其他的书籍和相关论文,因为这种算法可以详细的写成一本书。

    我知道答案 目前已有14人回答
    很开心
    回复

    使用道具 举报

    该用户从未签到

    61

    主题

    965

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    2394
    最后登录
    1970-1-1
    发表于 2015-9-15 16:06:57 | 显示全部楼层
    谢谢分享                 
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2017-1-24 09:50
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]初来乍到

    654

    主题

    3262

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    13267
    最后登录
    2019-1-27
    发表于 2015-9-15 16:25:01 | 显示全部楼层
    必须要支持的!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-8-30 16:02
  • 签到天数: 5 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    36

    主题

    1065

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1851
    最后登录
    2019-11-19
    发表于 2015-9-15 18:22:08 | 显示全部楼层
    之前搞智能小车平衡组自己写过代码,但是好像不太理想。参考一下这里的
    哎...今天够累的,签到来了~
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    7

    主题

    243

    帖子

    0

    高级会员

    Rank: 4

    积分
    856
    最后登录
    2016-6-11
    发表于 2015-9-19 15:01:50 | 显示全部楼层
    感谢总结
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2020-8-12 09:22
  • 签到天数: 3 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    5

    主题

    119

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    250
    最后登录
    2020-8-12
    发表于 2015-9-19 18:03:13 | 显示全部楼层
    感谢分享
    今天天气不错!签到!
    回复

    使用道具 举报

    该用户从未签到

    9

    主题

    642

    帖子

    0

    高级会员

    Rank: 4

    积分
    748
    最后登录
    1970-1-1
    发表于 2015-10-22 13:40:30 | 显示全部楼层
    必须支持楼主
    145558j4gqqxoqrpr44ogc.png
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    2

    主题

    189

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    244
    最后登录
    2020-10-19
    发表于 2015-10-23 09:39:19 | 显示全部楼层
    感觉很难啊,支持楼主
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13

    主题

    65

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    252
    最后登录
    1970-1-1
    发表于 2015-11-13 10:28:29 | 显示全部楼层
    怎么感觉这资料网上都有啊
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2019-5-27 09:45
  • 签到天数: 10 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    5

    主题

    50

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    213
    最后登录
    2021-3-10
    发表于 2015-11-20 00:17:36 | 显示全部楼层
    666666666666666666666666666666
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-9-7 15:16 , Processed in 0.109732 second(s), 31 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表