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输出的轨迹确实好太多了。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ubuntu20.04+RTX4060Ti大模型环境安装

装显卡驱动 这里是重点&#xff0c;因为我是跑深度学习的&#xff0c;要用CUDA&#xff0c;所以必须得装官方的驱动&#xff0c;Ubuntu的附件驱动可能不太行. 进入官网https://www.nvidia.cn/geforce/drivers/&#xff0c;选择类型&#xff0c;最新版本下载。 挨个运行&#…

[c语言日寄]浮点数在内存中的储存

【作者主页】siy2333 【专栏介绍】⌈c语言日寄⌋&#xff1a;这是一个专注于C语言刷题的专栏&#xff0c;精选题目&#xff0c;搭配详细题解、拓展算法。从基础语法到复杂算法&#xff0c;题目涉及的知识点全面覆盖&#xff0c;助力你系统提升。无论你是初学者&#xff0c;还是…

Yageo国巨的RC系列0402封装1%电阻库来了

工作使用Cadence多年&#xff0c;很多时候麻烦的就是整理BOM&#xff0c;因为设计原理图的时候图省事&#xff0c;可能只修改value值和封装。 但是厂家&#xff0c;规格型号&#xff0c;物料描述等属性需要在最后的时候一行一行的修改&#xff0c;繁琐又容易出错&#xff0c;过…

【文档智能】Qwen2.5-VL在版式分析和表格识别上的实际评测效果

qwen开年开源了Qwen2.5-VL系列权重模型&#xff0c;笔者观察到相较于传统的多模态系列&#xff0c;增加了文档理解功能。笔者以文档智能中两个比较重要的任务版式分析和表格识别&#xff0c;笔者直接测试下Qwen2.5-VL-72B的效果。 版式分析 case1 case2 这个case没有输出bbox…

【计算机组成原理】1_绪论

chap1 绪论 1. 国产芯片现状 MIPS阵营&#xff1a;龙芯X86阵营&#xff08;常见于桌面和服务器&#xff09;&#xff1a;兆芯&#xff08;VIA&#xff09;&#xff0c;海光&#xff08;AMD&#xff09;ARM阵营&#xff08;常见于移动嵌入式、手机平板等&#xff09;&#xff…

解锁反序列化漏洞:从原理到防护的安全指南

目录 前言 一、什么是反序列化 二、反序列化漏洞原理 三、反序列化漏洞的危害 &#xff08;一&#xff09;任意代码执行 &#xff08;二&#xff09;权限提升 &#xff08;三&#xff09;数据泄露与篡改 四、常见的反序列化漏洞场景 &#xff08;一&#xff09;PHP 反…

openGauss 3.0 数据库在线实训课程1:学习数据库状态查看

openGauss数据库状态查看 前提 我正在参加21天养成好习惯| 第二届openGauss每日一练活动 课程详见&#xff1a;openGauss 3.0.0数据库在线实训课程 学习目标 学习从操作系统层面和使用openGauss工具查看数据库的状态、版本和数据文件目录。 课程作业 gs_ctl是openGauss提…

[含文档+PPT+源码等]精品基于Python实现的django个性化健康餐计划订制系统

软件开发环境及开发工具&#xff1a; 开发语言&#xff1a;python 使用框架&#xff1a;Django 前端技术&#xff1a;JavaScript、VUE.js&#xff08;2.X&#xff09;、css3 开发工具&#xff1a;pycharm、Visual Studio Code、HbuildX 数据库&#xff1a;MySQL 5.7.26&am…

单机伪分布Hadoop详细配置

目录 1. 引言2. 配置单机Hadoop2.1 下载并解压JDK1.8、Hadoop3.3.62.2 配置环境变量2.3 验证JDK、Hadoop配置 3. 伪分布Hadoop3.1 配置ssh免密码登录3.2 配置伪分布Hadoop3.2.1 修改hadoop-env.sh3.2.2 修改core-site.xml3.2.3 修改hdfs-site.xml3.2.4 修改yarn-site.xml3.2.5 …

ZooKeeper单节点详细部署流程

ZooKeeper单节点详细部署流程 文章目录 ZooKeeper单节点详细部署流程 一.下载稳定版本**ZooKeeper**二进制安装包二.安装并启动**ZooKeeper**1.安装**ZooKeeper**2.配置并启动**ZooKeeper** ZooKeeper 版本与 JDK 兼容性3.检查启动状态4.配置环境变量 三.可视化工具管理**Zooke…

IMX6ULL环境搭建遇到的问题和解答更新

IMX6ULL环境搭建遇到的问题 开发板&#xff1a;正点原子IMX6ULL 终端软件串口控制&#xff1a;MobaXterm 1、网络环境搭建三方互ping不通 电脑无网口&#xff0c;使用绿联USB转网口&#xff0c;接网线直连开发板&#xff0c;电脑WiFi上网 按文档设置的 IP 地址&#xff0c;以…

Windows Docker笔记-Docker拉取镜像

通过在前面的章节《安装docker》中&#xff0c;了解并安装成功了Docker&#xff0c;本章讲述如何使用Docker拉取镜像。 使用Docker&#xff0c;主要是想要创建并运行Docker容器&#xff0c;而容器又要根据Docker镜像来创建&#xff0c;那么首当其冲&#xff0c;必须要先有一个…

51单片机07 串口通信

串口是一种应用十分广泛的通讯接口&#xff0c;串口成本低、容易使用、通信线路简单&#xff0c;可实现两个设备的互相通信。单片机的串口可以使单片机与单片机、单片机与电脑、单片机与各式各样的模块互相通信。51单片机内部自带UART&#xff08;Universal Asynchronous Recei…

外置互感器导轨式电能表

1 概述 1 Overview ADL系列导轨式多功能电能表&#xff0c;是主要针对于光伏并网系统、微逆系统、储能系统、交流耦合系统等新能源发电系统而设计的一款智能仪表&#xff0c;产品具有精度高、体积小、响应速度快、安装方便等优点。具有对电力参数进行采样计量和监测&#xff…

微软发布基于PostgreSQL的开源文档数据库平台DocumentDB

我们很高兴地宣布正式发布DocumentDB——一个开源文档数据库平台&#xff0c;以及基于 vCore、基于 PostgreSQL 构建的 Azure Cosmos DB for MongoDB 的引擎。 过去&#xff0c;NoSQL 数据库提供云专用解决方案&#xff0c;而没有通用的互操作性标准。这导致对可互操作、可移植…

开放式TCP/IP通信

一、1200和1200之间的开放式TCP/IP通讯 第一步&#xff1a;组态1214CPU&#xff0c;勾选时钟存储器 第二步&#xff1a;防护与安全里面连接机制勾选允许PUT/GET访问 第三步&#xff1a;添加PLC 第四步&#xff1a;点击网络试图&#xff0c;选中网口&#xff0c;把两个PLC连接起…

【漫画机器学习】083.安斯库姆四重奏(Anscombe‘s quartet)

安斯库姆四重奏&#xff08;Anscombes Quartet&#xff09; 1. 什么是安斯库姆四重奏&#xff1f; 安斯库姆四重奏&#xff08;Anscombes Quartet&#xff09;是一组由统计学家弗朗西斯安斯库姆&#xff08;Francis Anscombe&#xff09; 在 1973 年 提出的 四组数据集。它们…

【C语言】指针运算与数组关系:详细分析与实例讲解

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C语言 文章目录 &#x1f4af;前言&#x1f4af;1. 指针的基础运算1.1 指针的加减运算1.2 指针加整数与指针减整数1.3 指针与指针的运算 &#x1f4af;2. 指针的实际应用&#xff1a;模拟 strlen 函数2.1 使用指针模拟…

在线教程丨YOLO系列10年更新11个版本,最新模型在目标检测多项任务中达SOTA

YOLO (You Only Look Once) 是计算机视觉领域中最具影响力的实时目标检测算法之一&#xff0c;以其高精度与高效性深受业界青睐&#xff0c;广泛应用于自动驾驶、安防监控、医疗影像等领域。 该模型最早于 2015 年由华盛顿大学研究生 Joseph Redmon 发布&#xff0c;开创了将目…

面向对象程序设计-实验1

6-1 求两个或三个整数中的最大数&#xff0c;用带默认参数的函数实现 本题要求实现一个带默认参数的函数&#xff0c;求两个或三个整数中的最大数 代码清单&#xff1a; #include <iostream> using namespace std; int main() { int max( int a,int b,int c0); int …