kalman滤波器C++设计仿真实例第三篇

1. 仿真场景

        水面上有条船在做匀速直线航行,航行过程中由于风和浪的影响,会有些随机的干扰,也就是会有些随机的加速度作用在船身上,这个随机加速度的均方差大约是0.1,也就是说方差是0.01。船上搭载GPS设备,能够给出船的位置信息,目前GPS的定位误差为10m,也就它的定位方差是100。船的初始坐标为(-100, 200),水平两个方向的初始速度为(2, 20)。用kalman滤波器对船的航行位置等信息进行滤波估计。

2. 建模

        这是一个平面运动的模型,先看一维情况。

        这个跟上一个例子有些类似,不过就是没有确定的加速度,而只有随机的加速度而已。模型如下:

s(k+1) = s(k)+v(k)T+0.5T^{2}a(k)

v(k+1)=v(k)+Ta(k)

        这里面的那个a就是场景描述中说的那个随机干扰加速度。我们在状态方程里把它当成系统的随机噪声处理。把s和v作为状态量。注意,由于实际场景是平面二维的,所以实际的状态有四个,也就是四维的向量。

        于是状态方程为:

\begin{bmatrix} x(k+1)\\ \dot{x}(k+1)\\ y(k+1)\\ \dot{y}(k+1) \end{bmatrix}= \begin{bmatrix} 1 &T &0 &0 \\ 0& 1 &0 &0 \\ 0& 0 &1 &T \\ 0& 0& 0 &1 \end{bmatrix} \begin{bmatrix} x(k)\\ \dot{x}(k)\\ y(k)\\ \dot{y}(k) \end{bmatrix}+\begin{bmatrix} 0.5T^2w_x(k)\\ Tw_x(k)\\ 0.5T^2w_y(k)\\ Tw_y(k) \end{bmatrix}

        系统量测方程就很好写了,只把GPS测量的位置信息作为量测量。

Z(k)=\begin{bmatrix} 1 &0 &0 &0 \\ 0& 0 &1 &0 \end{bmatrix} \begin{bmatrix} x(k)\\ \dot{x}(k)\\ y(k)\\ \dot{y}(k) \end{bmatrix} +v(k)

        接下来确定Q和R。取GPS数据周期为1s,根据场景描述:

Q=0.01\begin{bmatrix} 0.5 & 0 &0 &0 \\ 0& 1 &0 &0 \\ 0& 0 & 0.5 &0 \\ 0& 0 &0 &1 \end{bmatrix}

R=\begin{bmatrix} 100 &0 \\ 0& 100 \end{bmatrix}

        再看初值。根据场景描述。

X(0)=\begin{bmatrix} -100\\ 2\\ 200\\ 20 \end{bmatrix}

        P(0)不知道。就随便给个单位矩阵好了

P(0)=I_{4*4}

        检查一下,好像都齐了,那么开始仿真!

3. C++仿真程序

程序方面的话,只改Model那个类就好了,模型啥样照着写就行:

//model.cpp
#include "model.h"Model::Model(): Q(Matrix::unit(4)), R(100*Matrix::unit(2))
{double delta_w = 1e-2;Q(0, 0) = 0.5;Q(2, 2) = 0.5;Q = Q*delta_w;
}Matrix Model::StateTrans(Matrix &X)
{double T = 1;Matrix F(Matrix::unit(4));F(0, 1) = T;F(2, 3) = T;return F*X;
}void Model::StateUpdate(Matrix &X)
{X = StateTrans(X);X = X + Sqrtm(Q)*Matrix::randn(4, 1);
}Matrix Model::MeasurPre(const Matrix &X)
{Matrix H(Matrix::zeros(2, 4));H(0, 0) = 1;H(1, 2) = 1;return  H*X;
}Matrix Model::Measur(const Matrix &X)
{return MeasurPre(X) + Sqrtm(R)*Matrix::randn(2, 1);
}Matrix Model::GetF()
{double T = 1;Matrix F(Matrix::unit(4));F(0, 1) = T;F(2, 3) = T;return F;
}Matrix Model::GetH()
{Matrix H(Matrix::zeros(2, 4));H(0, 0) = 1;H(1, 2) = 1;return H;
}

然后是主程序:

//main.cpp
#include "model.h"
#include "kalman.h"
#include <stdio.h>
int main()
{FILE *fp;fp = fopen("F:/data/data3.txt", "w");Model M;Matrix X(4);Matrix Z(2);X(0) = -100;X(1) = 2;X(2) = 200;X(3) = 20;Matrix P0(Matrix::unit(4));Kalman kf(4, 2);kf.Init(X, P0, &M);for(size_t i = 0; i < 120; i++){M.StateUpdate(X);Z = M.Measur(X);kf.SetMeasur(Z);kf.Iterator();fprintf(fp, "%lf,%lf,%lf,%lf,%lf,%lf\n", X(0), X(2), kf.GetX()(0), kf.GetX()(2), Z(0), Z(1));}fclose(fp);cout << "done!";return 0;
}

        只有初始化部分跟上一次的代码不一样。仿真120s,把仿真结果存到文件中。运行!ok!最后,把真实轨迹、测量轨迹和滤波后的轨迹放在一张图上比较一下:

        红线是滤波后的轨迹,深蓝线是真实轨迹,浅蓝线是GPS轨迹。滤波后的轨迹当然与真实轨迹有些偏差,但比GPS输出的轨迹确实好太多了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/69186.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(2025|ICLR,音频 LLM,蒸馏/ALLD,跨模态学习,语音质量评估,MOS)音频 LLM 可作为描述性语音质量评估器

Audio Large Language Models Can Be Descriptive Speech Quality Evaluators 目录 1. 概述 2. 研究背景与动机 3. 方法 3.1 语音质量评估数据集 3.2 ALLD 对齐策略 4. 实验结果分析 4.1 MOS 评分预测&#xff08;数值评估&#xff09; 4.2 迁移能力&#xff08;在不同…

stm32生成hex文件详解

1.产生的map文件干啥的&#xff1f; 2.组成情况&#xff1f;&#xff1f;&#xff1f; 废话少说&#xff0c;直接上代码具体内容况&#xff1a; Component: ARM Compiler 5.06 update 7 (build 960) Tool: armlink [4d3601]Section Cross Referencesstartup_stm32f103xe.o(S…

百度热力图数据获取,原理,处理及论文应用6

目录 0、数据简介0、示例数据1、百度热力图数据日期如何选择1.1、其他实验数据的时间1.2、看日历1.3、看天气 2、百度热力图几天够研究&#xff1f;部分文章统计3、数据原理3.1.1 ** 这个比较重要&#xff0c;后面还会再次出现。核密度的值怎么理解&#xff1f;**3.1.2 Csv->…

汽车自动驾驶AI

汽车自动驾驶AI是当前汽车技术领域的前沿方向&#xff0c;以下是关于汽车自动驾驶AI的详细介绍&#xff1a; 技术原理 感知系统&#xff1a;自动驾驶汽车通过多种传感器&#xff08;如激光雷达、摄像头、雷达、超声波传感器等&#xff09;收集周围环境的信息。AI算法对这些传感…

[转]Java面试近一个月的面试总结

本文是在学习中的总结&#xff0c;欢迎转载但请注明出处&#xff1a;http://blog.csdn.net/pistolove/article/details/46753275 前言 打算换个工作&#xff0c;近一个月面试了不少的公司&#xff0c;下面将一些面试经验和思考分享给大家。另外校招也快要开始了&#xff0c;为…

出租车特殊计费表算法解析与实现

目录 引言算法核心概念 特殊计费规则解析数据类型与输入输出算法数学原理 数字位判断与处理逻辑数值转换与累加计算算法框架图Python 实现 代码展示代码解析Python 实现的优势与局限C 语言实现 代码展示代码解析C 语言实现的性能特点性能分析与优化 性能分析 时间复杂度空间复杂…

学习threejs,tga格式图片文件贴图

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️TGA图片1.2 ☘️THREE.Mesh…

MSPFN 代码复现

1、环境配置 conda create -n MSPFN python3.9 conda activate MSPFN pip install opencv-python pip install tensorflow pip install tqdm pip install matplotlib2、train 2.1 创建数据集 2.1.1 数据集格式 |--rainysamples |--file1&#xff1a; |--file2:|--fi…

【创建模式-单例模式(Singleton Pattern)】

赐萧瑀 实现方案饿汉模式懒汉式&#xff08;非线程安全&#xff09;懒汉模式&#xff08;线程安全&#xff09;双重检查锁定静态内部类 攻击方式序列化攻击反射攻击 枚举(最佳实践)枚举是一种类 唐 李世民 疾风知劲草&#xff0c;板荡识诚臣。 勇夫安识义&#xff0c;智者必怀仁…

2025职业发展规划

2025职业发展规划 我是一名大公司的高级移动应用开发技术专家&#xff0c;目前参与了鸿蒙App开发&#xff0c;对鸿蒙的TS语言也有所了解。现在需要制定2025年的职业发展规划&#xff0c;包括学习内容和方向&#xff0c;并以思维导图的形式呈现。我需要梳理出合适的发展路径。首…

如何查看linux机器有几个cpu

在 Linux 机器上&#xff0c;你可以使用以下几种方法来查看 CPU 的数量&#xff08;物理 CPU 和逻辑 CPU&#xff09;&#xff1a; 方法 1&#xff1a;使用 lscpu 命令 lscpu输出示例&#xff1a; CPU(s): 8 Thread(s) per core: 2 Core(s) per socket: 4 Soc…

fputs的概念和使用案例

fputs 是 C 语言中用于向文件写入字符串的标准库函数。它与 puts 类似&#xff0c;但不会自动添加换行符&#xff0c;且支持向任意文件流&#xff08;如磁盘文件、标准输出等&#xff09;写入数据。 概念解析 函数原型&#xff1a;int fputs(const char *str, FILE *stream); …

宏观经济:信贷紧缩与信贷宽松、通货膨胀与通货紧缩以及经济循环的四个周期

目录 信贷紧缩与信贷宽松信贷紧缩信贷宽松信贷政策对经济影响当前政策环境 通货膨胀与通货紧缩通货膨胀通货紧缩通货膨胀与通货紧缩对比 经济循环的四个周期繁荣阶段衰退阶段萧条阶段复苏阶段经济周期理论解释经济周期类型 信贷紧缩与信贷宽松 信贷紧缩 定义&#xff1a;金融…

20240206 adb 连不上手机解决办法

Step 1: lsusb 确认电脑 usb 端口能识别设备 lsusb不知道设备有没有连上&#xff0c;就插拔一下&#xff0c;对比观察多了/少了哪个设备。 Step 2: 重启 adb server sudo adb kill-serversudo adb start-serveradb devices基本上就可以了&#xff5e; Reference https://b…

《利用原始数据进行深度神经网络闭环 用于光学驻留空间物体检测》论文精读

Deep Neural Network Closed-loop with Raw Data for Optical Resident Space Object Detection 摘要 光学勘测是观测驻留空间物体和空间态势感知的重要手段。随着天文技术和还原方法的应用&#xff0c;宽视场望远镜在发现和识别驻留空间物体方面做出了重大贡献。然而&#x…

2025年前端面试准备html篇

1.对html 语义化标签的理解 html语义化标签简单来说页面有良好的结构&#xff0c;使元素有含义便于理解。 优点可以使页面呈现出清晰的机构&#xff0c;有利于seo和搜索引擎抓取信息&#xff0c;便于团队的开发和管理。 常见的语义化标签有&#xff1a; <header> - 定义页…

【字节青训营-9】:初探字节微服务框架 Hertz 基础使用及进阶(下)

本文目录 一、Hertz中间件Recovery二、Hertz中间件跨资源共享三、Hertz 响应四、Hertz请求五、Hertz中间件Session 一、Hertz中间件Recovery Recovery中间件是Hertz框架预置的中间件&#xff0c;使用server.Default()可以默认注册该中间件&#xff0c;为Hertz框架提供panic回复…

因果推断与机器学习—用机器学习解决因果推断问题

Judea Pearl 将当前备受瞩目的机器学习研究戏谑地称为“仅限于曲线拟合”,然而,曲线拟合的实现绝非易事。机器学习模型在图像识别、语音识别、自然语言处理、蛋白质分子结构预测以及搜索推荐等多个领域均展现出显著的应用效果。 在因果推断任务中,在完成因果效应识别之后,需…

软件设计模式

目录 一.创建型模式 抽象工厂 Abstract Factory 构建器 Builder 工厂方法 Factory Method 原型 Prototype 单例模式 Singleton 二.结构型模式 适配器模式 Adapter 桥接模式 Bridge 组合模式 Composite 装饰者模式 Decorator 外观模式 Facade 享元模式 Flyw…

R 语言植沟文件读取及保存方式

1. 读取CSV文件 data <- read.csv("input.csv", headerT) # headerT 表示第一行是表头检查数据框&#xff1a;print(is.data.frame(data)) # 检查是否为数据框 print(ncol(data)) # 输出列数 print(nrow(data)) # 输出行数筛选数据&#xff1a;ret <- sub…