扩展卡尔曼线性化近似与仿真

2023-05-16

扩展卡尔曼线性化近似与仿真

  • 关于线性化
  • 直入主题-上例子
    • 小车运动方式:沿着圆心在原点、半径为5的圆进行匀速圆周运动,其角速度为w,即每次更新变化w个角度;
  • 仿真结果
  • 总结
    • Matlab测试代码(EKF-test.m)

关于线性化

线性化即将非线性方程转化为线性方程的过程。主流方法是在给定点对非线性方程进行线性微分逼近;需要注意的是它的逼近条件,即需要在变量很小的情况下才能成立。(第一次写微博,编辑界面还不大会用,公式就直接插入图片了,哈哈…)!在这里插入图片描述

直入主题-上例子

小车运动方式:沿着圆心在原点、半径为5的圆进行匀速圆周运动,其角速度为w,即每次更新变化w个角度;

在这里插入图片描述
令状态变量为:
在这里插入图片描述
对状态变量进行一阶泰勒近似(f(seita_k1)=f(seita_k0)+(seita_k1-seita_k0)f(seita_k0)’,因变量为seita,k时刻到k+1时刻因变量增加了w个角度,即seita_k1-seita_k0=w)得:
在这里插入图片描述
对上式求偏导,得到雅克比矩阵为:
在这里插入图片描述
观测量为x、y,则观测H矩阵为:
在这里插入图片描述
在这里插入图片描述
Q为状态线性化估计噪声,R为观测噪声。(实际很多观测传感器比状态估计误差要大)
每次迭代都会进行线性化处理,同时也带入了误差,就像惯性导航一样误差不断漂移。这样迭代时间长了误差必然越来越大,在没有及时纠正的情况下就出现发散的情况,运动时间越长迭代发散情况就特别明显。所以在每次线性化近似时,都要进行卡尔曼估计以减小因线性近似时而带入的误差累积,实现对线性近似迭代过程的纠正,即每次迭代结束后的卡尔曼估计值作为下一次迭代线性化近似的初始值。

仿真结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

总结

仿真结果显示扩展卡尔曼滤波结果并不理想,和真实轨迹相差较大,这是因为非线性方程线性化过程中已经引入误差(fig.2也说明线性近似只能在某个点进行,而不能应用到整个点,不断迭代近似而没有纠正过程必然导致发散),当观测量误差偏大一些时,单一的扩展卡尔曼并不能取得较好的结果,后续还需要进行拟合、差值、光滑等处理,而这些处理也需要一些工程经验值,有时间再把后处理加上,先就这些吧。(观测误差改的很小的时候也能取得个好的结果,也就是卡尔曼滤波向观测值倾向,但实际观测误差不可能这么小,否则卡尔曼滤波也失去了意义,如下图所示)
在这里插入图片描述

Matlab测试代码(EKF-test.m)

%% =================================================
%% EKF滤波 线性化近似模拟程序
%% 只有在相邻或相近才可以使用线性近似;
%% 迭代使用必然会使误差增大,出现发散;
%% 此时就需要卡尔曼滤波进行迭代预测减小每次线性化的误差
%% Author@xclRobotLife(凌寒画家)2019.1.15 modification
%% =======================模型=======================
%% x=5cos(seita)
%% y=5sin(seita)

clc;clear;
N=100;
w=2*pi/(N);
X=zeros(4,N);
X(:,1)=[5 0 0 w];%初始值
x(1)=5;
y(1)=0;

for t=1:N
seita=w*t;
dx=-5*w*sin(seita);%一阶泰勒近似x=x+wdx  角度每次变化w
ddx=-5*w*cos(seita);%再次泰勒近似,雅克比矩阵计算
dxw=-5*sin(seita);

dy=5*w*cos(seita);
ddy=-5*w*sin(seita);
dyw=5*cos(seita);

F=[1 0 ddx dxw;0 1 ddy dyw;0 0 1 1;0 0 0 1];%雅克比矩阵

if t>1
    X(:,t)=F*X(:,t-1);%迭代线性化结果
    x(t)=5*cos(seita);%真实值
    y(t)=5*sin(seita);
end
end
figure(1)
plot(x(1),y(1),'og'),hold on;
plot(x(N),y(N),'ok'),hold on;
plot(x,y,'-r'),hold on;
title('真实轨迹');
legend('start','end');
figure(2)
plot(X(1,1),X(2,1),'og'),hold on;
plot(X(1,N),X(2,N),'ok'),hold on;
plot(X(1,:),X(2,:),'-b'),hold on;
title('二阶近似轨迹');
legend('start','end');

figure(3)
plot(1:N,abs(x-X(1,:)),'-m',1:N,abs(y-X(2,:)),'-y'),hold on;
title('近似误差');
legend('x-error','y-error');
%% ====================================================
%%  EKF滤波程序
%% ====================================================
Z=[x;y];
Q=diag([0.08,0.06,0.01,0.01]); %一阶状态近似后误差
R=diag([0.5,0.4]);%直接观测x y 观测误差,实际很多观测传感器误差较大,此时误差模拟大于状态
H=[1 0 0 0;0 1 0 0];
randn('seed',0);
%% for t=2:N %对线性化状态加入随机噪声,卡尔曼迭代中并没有直接用,因为每次线性化迭代都进行了KF估计
%% X(:,t)=X(:,t-1)+sqrtm(Q)*randn(4,1); %加入噪声线性化的状态值
%% end
for t=1:N
Z(:,t)=Z(:,t)+sqrtm(R)*randn(2,1);%加入噪声的观测值
end
Xekf=zeros(4,N);
Xekf(:,1)=X(:,1);
Xnn(:,1)=X(:,1);%线性形似状态值
P0=eye(4);
for i=2:N
%%F矩阵计算%%%%%%%%%%%%%%
seita=w*i;
dx=-5*w*sin(seita);%一阶泰勒近似x=x+wdx  角度每次变化w
ddx=-5*w*cos(seita);%再次泰勒近似,雅克比矩阵计算
dxw=-5*sin(seita);

dy=5*w*cos(seita);
ddy=-5*w*sin(seita);
dyw=5*cos(seita);
F=[1 0 ddx dxw;0 1 ddy dyw;0 0 1 1;0 0 0 1];%雅克比矩阵
%%%%%%%%%%%%%%%%%%%%%%%%
Xn=F*Xekf(:,i-1);%状态迭代更新
Xnn(:,i)=Xn;%线性形似状态值
P1=F*P0*F'+Q ;%协方差更新
K=P1*H'*inv(H*P1*H'+R);%4*2%卡尔曼增益
Xekf(:,i)=Xn+K*(Z(:,i)-H*Xn);%滤波结果
P0=(eye(4)-K*H)*P1;%协方差迭代
end

figure(4)
hold on;box on;
plot(x,y,'-k.');%实际真实轨迹不可能知道,画图参考
plot(Z(1,:),Z(2,:),'-ob');
plot(Xnn(1,:),Xnn(2,:),'-g+');
plot(Xekf(1,:),Xekf(2,:),'-r+');
title('仿真轨迹');
legend('真实轨迹','观测轨迹','线性近似迭代状态轨迹','EKF轨迹');

figure(5)
hold on; box on;
plot(1:N,abs(x-Z(1,:)),'-r');
plot(1:N,abs(x-Xekf(1,:)),'-g');
title('仿真误差');
legend('观测 x-error','EKF x-error');
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

扩展卡尔曼线性化近似与仿真 的相关文章

随机推荐

  • linux常用开关机指令

    关机命令 xff1a shutdown h now xff08 立刻进行关机 xff09 halt xff08 立刻进行关机 xff09 poweroff xff08 立刻进行关机 xff09 重启命令 xff1a shutdown r n
  • _vimrc (linux版)

    一般放在 xff1a etc vim span class token string 34 vimrc 34 span span class token function vim span config span class token f
  • 01_Unity事件函数OnMouseDown生效条件

    前言 Unity提供了OnMouseDown xff0c OnMouseEnter xff0c OnMouseExit等方法 xff0c 这些方法可以很方便的帮助我们处理鼠标的时间响应 但是需要注意他的生效条件 xff0c 最近我在制作视频
  • 算法题型:滑动窗口(leetcode 209)

    一 209 长度最小的子数组 难度中等 题目描述 给定一个含有 n 个正整数的数组和一个正整数 s xff0c 找出该数组中满足其和 s 的长度最小的连续子数组 如果不存在符合条件的连续子数组 xff0c 返回 0 示例 输入 s 61 7
  • 前端:bootstrap table表格属性、列属性、事件、方法

    目录 一 使用前提 二 基本属性 列参数 事件 方法 多语言 一 使用前提 1 在html中引用table相应的包 lt link rel 61 34 stylesheet 34 type 61 34 text css 34 href 61
  • 从0开始学SLAM的各种问题

    一 关于更改vscode自带终端文字间隔 xff0c 字体大小 文件 gt 首选项 gt 设置 gt 搜索 终端 gt 找到Terminal gt Integrated Font Family gt 更改为monospace即可 找到Ter
  • python —— 变量后面加个下划线_是啥意思

    前后没有下划线的是公有方法 前边有一个下划线的为私有方法或属性 xff0c 子类无法继承 前边有两个下划线的 一般是为了避免于子类属性或者方法名冲突 xff0c 无法在外部直接访问 前后都有双下划线的为系统方法或属性 后边单个下划线的可以避
  • SD卡烧录镜像后插电脑不显示问题

    起因 起因是给sd卡刷入jetson nano的ROS机器人镜像 xff0c 之后读卡器插入电脑就不显示了 解决方法 xff1a xff08 1 xff09 Ubuntu下 xff1a https blog csdn net yandaqi
  • 【码农本色】用数据解读我的2014

    转眼2014就过去了 xff0c 不禁感叹又老了一岁的同时 xff0c 却发现已经快研究生毕业了 xff0c 趁着这个活动简单总结下2014 1 实习篇 2014年一月份拿到了人生第一个实习offer xff0c 在sony这样的大公司做a
  • Windows下QGroundControl开发问题汇总

    Windows下QGroundControl二次开发问题汇总 前段时间因为项目要求涉及了一下QGC地面站的二次开发 xff0c 开发难度先不提 xff0c 环境搭建遇到了很多问题 xff0c 几乎网上能搜到的问题都遇到了一遍 xff0c 在
  • 初识Git——Git、Github、Gitee的关系

    想要自己做一些有意义的东西 xff0c 甚至去参加一些互联网比赛 xff0c 就必须要学会使用Git 最初了解Git xff0c 同时听到了Git Github Gitee xff08 码云 xff09 xff0c 于是竭力想要弄明白三者之
  • UCOSII原理与应用----基本概念和任务

    1 实时操作系统是什么 实时操作系统 xff1a 能够使计算机系统在一个规定的时间内及时响应外部请求并及时控制设备和实时任务协调运行的操作系统 实时系统有两个基本要求 xff1a 1 实时系统的计算必须产生正确结果 xff0c 称逻辑或功能
  • UCOSII原理与应用----任务调度

    任务调度 xff1a UCOSII任务调度思想 xff1a 近似地每时每刻让优先级最高的就绪任务处于运行状态 具体上 xff0c 采用系统或用户任务调用系统函数及执行中断服务程序结束时来调用调度器 xff0c 以确定应该运行的任务并运行它
  • Docker的使用(docker pull拉取镜像失败问题解决)

    在docker拉取Nginx镜像过程中 xff0c 速度慢 xff0c 或者不成功 报错代码 xff1a Error response from daemon Get https registry 1 docker io v2 net ht
  • Hexo-Next 博客搭建

    lt span style 61 34 color 777777 34 gt title Hexo 搭配 GitHub 建立博客 选用 nexT 主题 date 2021 04 26 19 21 20 categories 兴趣 网站 博客
  • 进阶之路:Prometheus —— 技巧篇

    前言 入门篇 xff1a 从零开始 xff1a Prometheus 理解篇 xff1a 进阶之路 xff1a Prometheus 理解篇 本文记录了一些我在使用Prometheus的过程中的技巧 xff0c 以后还会随着使用的深入不定期
  • Linux系统如何离线安装软件

    Linux系统如何离线安装软件 前言 xff08 一堆废话 xff0c 不看也罢 xff09 功能需求具体操作 前言 xff08 一堆废话 xff0c 不看也罢 xff09 升学足足两个月了 xff0c 但是截至目前 xff0c 还没有认认
  • python中出现变量前后带下划线的是什么意思

    前后没有下划线的是公有方法 xff0c 前边有一个下划线的为私有方法或属性 xff0c 子类无法继承 xff0c 前边有两个下划线的 一般是为了避免于子类属性或者方法名冲突 xff0c 无法在外部直接访问 前后都有双下划线的为系统方法或属性
  • 普通程序员如何入门AI

    毫无疑问 xff0c 人工智能是目前整个互联网领域最火的行业 xff0c 随着AlphaGo战胜世界围棋冠军 xff0c 以及各种无人驾驶 智能家居项目的布道 xff0c 人们已经意识到了AI就是下一个风口 当然 xff0c 程序员是我见过
  • 扩展卡尔曼线性化近似与仿真

    扩展卡尔曼线性化近似与仿真 关于线性化直入主题 上例子小车运动方式 xff1a 沿着圆心在原点 半径为5的圆进行匀速圆周运动 xff0c 其角速度为w 即每次更新变化w个角度 仿真结果总结Matlab测试代码 xff08 EKF test