当前位置: 首页 > news >正文

卡尔曼_扩展卡尔曼滤波算法实例解析

本文将以车辆三自由度模型为基础,利用扩展卡尔曼滤波,通过车辆的侧向加速度来估计横摆角速度、质心侧偏角、纵向速度等三个参数,通过一个实际的仿真案例来进行具体介绍扩展卡尔曼滤波的使用。

一般地,卡尔曼滤波会选择比较容易获取的参数,来估计不易测量的参数。

在这里,脚主把卡尔曼参数估计仿真分为四个步骤:

1)车辆模型搭建;

2)扩展卡尔曼滤波算法搭建;

3)模型整合及仿真工况设置;

4)仿真及结果分析。

车辆模型搭建

本例中,利用车辆三自由度模型(如下图)进行参数估计,需要知道车辆的输入信号(车轮转角、纵向加速度)和输出信号(侧向加速度),所以需要自己搭建一个车辆模型来创造这些数据。即对车辆模型输入一个方向盘转角和纵向加车速,得到侧向加速度。

b382de3846e540e54f76a8332d6a6087.png

在实车上,这一步是可以忽略的,因为我们可以通过传感器直接测量卡尔曼滤波所需的信号。

脚主暂时选择比较简便的方法,借助carsim中的车辆模型来完成这项工作,仅需要设置好我们关注的车辆基本参数及信号接口即可。

质心到前后轴距离、沿Z轴转动惯量、质量设置位置如下图。

6a9db0e7b70354e56e7656c68a485595.png

前后轮侧偏刚度设置位置如下图。

b6bf2c9b32f78f15c2b1d690205c25a4.png

方向盘转角到车轮转角的传动比设置位置如下图。

95f70b8328dea7970fbbae1325362e55.png

输出接口选择输出横摆角速度、质心侧偏角、纵向车速、方向盘转角、纵向加速度、侧向加速度。前三个是待估计的参数,用于与仿真结果对比;后三个是车辆的输入输出信号,会作为卡尔曼滤波算法的输入。

7d8cb8ebf2b72a7bd5775e6777e98793.png

一直用别人的车辆模型也不合适,后面脚主会自己动手搭建车辆模型,这样就可以避免联合仿真的麻烦,仿真可以全部在simulink中实现了。更重要的是自己搭建车辆模型更加能加深对车辆的理解,这个是商业软件所无法替代的。

扩展卡尔曼滤波算法搭建

扩展卡尔曼滤波算法就是把上文提到的5个核心公式表达出来。再次强调一下:需要使用非线性函数f、h来表示状态方程和输出方程;系统矩阵A、输出矩阵H需要用f、h函数求偏导后的雅克比矩阵表示。

e18ff369e3d7ad812cb9e93a2d353640.png

脚主这里借助以前搭建的卡尔曼滤波算法,稍微改动一下,得到如下图的扩展卡尔曼滤波算法。

b66a953188ba0ff7af298925b6a2209f.png

用5个function表达卡尔曼滤波算法其实比较繁琐,但是可以更好地表达5个公式之间的时序关系,便于初学者理解。

模型整合及仿真工况设置

把上述两部分内容组合起来就是整个基于扩展卡尔曼滤波的参数估计仿真模型,如下图。基本思路就是,carsim模型输出滤波算法所需的信号,然后进行参数估计,输出估计的结果,最后将估计结果与车辆实际信号对比,来验证算法的有效性。

7eb066e0f84875dc12d1d466ea93ef30.png

为了验证算法,还需要在carsim中设置一下仿真工况。

1)初始车速为30km/h进行滑行。

10262959d8f338435258c97e760df575.png

2)方向盘转角按下图的曲线执行。

81fc60179367b4fc51162b642845eeb7.png

仿真及结果分析

运行模型,得到估计的横摆角速度、质心侧偏角、纵向车速,与车辆实际的状态对比如下图。

横摆角速度估计结果:

3fda297b1e44c406612ed89476e005ae.png

质心侧偏角估计结果:

b06f2b837a7c3eb3c7ac32c2b662e5d0.png

纵向车速估计结果:

653aeee68ac9d13f5622ba6c593af21f.png

从图中可以看出,横摆角速度、质心侧偏角、纵向车速的估计值与实际值基本一致,算法可靠有效。

以上,介绍了扩展卡尔曼滤波算法进行参数估计的一个实例,仅供大家参考。

相关文章:

  • 【洛谷八连测R6】yanQval-透明的星尘
  • qt5 传输 图片压缩_Qt 显示图片 放大 缩小 移动(都是QT直接提供的功能)
  • linux中exp命令详解_linux 中 find 命令详解
  • 设计模式-单例模式
  • 5张表连接查询的优化_MySQL性能优化方案
  • ( 10 )MySQL中的外键
  • mysql 16384_MySQL性能优化
  • Hibernate的注解和检索
  • mysql tables()_Mysql中对table的操作问题
  • Java中各种集合(字符串类)的线程安全性!!!
  • linx 卸载mysql_Linux下卸载MySQL
  • mysql简单分表_mysql分表场景分析与简单分表操作
  • vue 条件渲染与列表渲染
  • vue select清空_Vue+Webpack开发可复用的单页面富应用教程(技巧篇)
  • 两个同级div等高布局
  • Angularjs之国际化
  • Create React App 使用
  • maven工程打包jar以及java jar命令的classpath使用
  • SQLServer插入数据
  • 对象引论
  • 分布式任务队列Celery
  • 分类模型——Logistics Regression
  • 回顾2016
  • 前端之Sass/Scss实战笔记
  • 前端自动化解决方案
  • 使用 Xcode 的 Target 区分开发和生产环境
  • 与 ConTeXt MkIV 官方文档的接驳
  • # Java NIO(一)FileChannel
  • # Pytorch 中可以直接调用的Loss Functions总结:
  • #Linux(Source Insight安装及工程建立)
  • $GOPATH/go.mod exists but should not goland
  • ( 用例图)定义了系统的功能需求,它是从系统的外部看系统功能,并不描述系统内部对功能的具体实现
  • (1)(1.13) SiK无线电高级配置(六)
  • (6)添加vue-cookie
  • (floyd+补集) poj 3275
  • (初研) Sentence-embedding fine-tune notebook
  • (分布式缓存)Redis分片集群
  • (使用vite搭建vue3项目(vite + vue3 + vue router + pinia + element plus))
  • (原)本想说脏话,奈何已放下
  • ... fatal error LINK1120:1个无法解析的外部命令 的解决办法
  • .L0CK3D来袭:如何保护您的数据免受致命攻击
  • .NET 程序如何获取图片的宽高(框架自带多种方法的不同性能)
  • .NET 依赖注入和配置系统
  • .NET 中各种混淆(Obfuscation)的含义、原理、实际效果和不同级别的差异(使用 SmartAssembly)
  • .NET/C# 将一个命令行参数字符串转换为命令行参数数组 args
  • .NET开发不可不知、不可不用的辅助类(三)(报表导出---终结版)
  • .Net小白的大学四年,内含面经
  • [AIGC] Redis基础命令集详细介绍
  • [Bada开发]初步入口函数介绍
  • [Bugku]密码???[writeup]
  • [BZOJ] 2427: [HAOI2010]软件安装
  • [C++]命名空间等——喵喵要吃C嘎嘎
  • [IMX6DL] CPU频率调节模式以及降频方法
  • [Java] 图说 注解
  • [java刷算法]牛客—剑指offer链表有环的入口、反转链表、合并排序链表