【卡尔曼滤波】数据融合Fusion的应用 C语言、Python实现(Kalman Filter)

【卡尔曼滤波】数据融合Fusion的应用 C语言、Python实现(Kalman Filter)

更新以gitee为准:
gitee地址

文章目录

  • 卡尔曼滤波数据融合
  • Python实现
  • C语言实现
  • 多个数据如何融合
  • 附录:压缩字符串、大小端格式转换
    • 压缩字符串
      • 浮点数
      • 压缩Packed-ASCII字符串

卡尔曼滤波数据融合

与上一章节类似
当你在测量一个静态目标时 难免会有误差(也有可能是一个偏大 一个偏小)
测量误差通常满足正态分布 且标准差就是sigma
加入有两把尺子 测量出来一个偏大 一个偏小 且两个标准差都不同的情况下 如何计算呢?
那就要进行数据融合
譬如一个测出来85 sigma是1 另一个测出来是90 sigma是10
那么肯定就能想到真实值在85-90之间 且靠近85(因为后者误差更大)
同样 带人到卡尔曼滤波中就可以得到公式:
其中 z1是第一种方式测量结果 z2是第二种方式测量结果
K就是卡尔曼增益
在这里插入图片描述
可以看到 当K比较小时 估计值就是z1
当K接近1时 估计值就是z2

对应的 也有 σ1和σ2
同时 融合生成以后 会有新的σ 要保证这个值最小 才是最优解

那么最终的方差与之关系就为:
在这里插入图片描述

又因为z1和z2相互独立 所以:
在这里插入图片描述

对其求导可得:
在这里插入图片描述

当导数为0时 方差最小
求得此时K值为:
在这里插入图片描述

然后再求出估计值与估计方差即可

此时:
当σ1特别大时 K接近1 估计值就是z2 选择相信z2的数据
当σ1特别小时 K接近0 估计值就是z1 选择相信z1的数据

在这里插入图片描述

Python实现

a=[]
b=[]
c=[]
d=[]x = [85.6,84.3,84.0,86.5,85.5,85.0,84.8,84.5,84.5,85.1,85.2,84.4,85.0,86.1,85.2,85.5,84.9,84.8,84.5,85.3];y = [84.6,83.6,83.2,85.1,84.3,84.2,83.7,83.5,83.0,84.5,84.3,83.4,84.2,85.3,84.7,84.1,83.6,83.5,83.6,84.5];m = [84.6,85.3,83.0,87.5,84.5,86.0,83.8,85.5,83.5,86.1,85.2,85.4,84.0,85.1,84.2,86.5,85.9,83.8,83.5,86.3];plt.figure(2)
plt.plot(x,color="g")     
plt.plot(y,color="b")  def Data_Fusion(z1,z2,s1,s2):kg = s1/(s1+s2)kg_2=kg*kgkg_3=(1-kg)*(1-kg)z=z1+kg*(z2-z1)s=kg_3*s1+kg_2*s2return z,sfor i in range(len(x)):z,s = Data_Fusion(x[i],y[i],2,1.5)a.append(z)
plt.plot(a,color="r")  

在这里插入图片描述
如果改变标准差大小 那么就会让红线靠近两边的线
比如改成特别大 表示不信任2号数据
在这里插入图片描述
反之亦然
那么Python的函数打包可以是:

def Data_Fusion(z1,z2,s1,s2):kg = s1/(s1+s2)z=z1+kg*(z2-z1)s=(1-kg)*(1-kg)*s1+kg*kg*s2return z,s

这里的s就是方差
如果要传入标准差 则需要计算后再传入

C语言实现

同样 C语言比较简单:

typedef struct
{double Measure_1;double Measure_2;double Var_1;double Var_2;double Fusion;double Var;
}Kalman_Filter_Fusion_Struct;Kalman_Filter_Fusion_Struct Kalman_Filter_Fusion(Kalman_Filter_Fusion_Struct Stu);Kalman_Filter_Fusion_Struct Kalman_Filter_Fusion(Kalman_Filter_Fusion_Struct Stu)
{double kg =  Stu.Var_1/(Stu.Var_1+Stu.Var_2);    Stu.Var = (1-kg)*(1-kg)*Stu.Var_1+kg*kg*Stu.Var_2;    Stu.Fusion = Stu.Measure_1+kg*(Stu.Measure_2-Stu.Measure_1);return Stu;
}

调用:

void Fusion(void)
{double x[20]= {85.6,84.3,84.0,86.5,85.5,85.0,84.8,84.5,84.5,85.1,85.2,84.4,85.0,86.1,85.2,85.5,84.9,84.8,84.5,85.3};double y[20]= {84.6,83.6,83.2,85.1,84.3,84.2,83.7,83.5,83.0,84.5,84.3,83.4,84.2,85.3,84.7,84.1,83.6,83.5,83.6,84.5};Kalman_Filter_Fusion_Struct Stu;uint8_t i=0;Stu.Var_1=2;Stu.Var_2=1.5;    double buf_2[20];for(i=0;i<20;i++){Stu.Measure_1=x[i];Stu.Measure_2=y[i];Stu = Kalman_Filter_Fusion(Stu);buf_2[i]=Stu.Fusion;printf("%f \n",buf_2[i]);}
}

输出结果:

85.028571 
83.900000 
83.542857 
85.700000 
84.814286 
84.542857 
84.171429 
83.928571 
83.642857 
84.757143 
84.685714 
83.828571 
84.542857 
85.642857 
84.914286 
84.700000 
84.157143 
84.057143 
83.985714 
84.842857 

多个数据如何融合

对于三个数据的融合 只需要将前两次融合后的结果算出 然后得到标准差 再以同样的方式融合第三个数据即可
譬如上面的m数组与a数组融合:

for i in range(len(a)):z,s = Data_Fusion(a[i],m[i],0.85,3)b.append(z)
plt.figure(3)
plt.plot(a,color="g")     
plt.plot(m,color="b")  
plt.plot(b,color="r") 

在这里插入图片描述

附录:压缩字符串、大小端格式转换

压缩字符串

首先HART数据格式如下:
在这里插入图片描述
在这里插入图片描述
重点就是浮点数和字符串类型
Latin-1就不说了 基本用不到

浮点数

浮点数里面 如 0x40 80 00 00表示4.0f

在HART协议里面 浮点数是按大端格式发送的 就是高位先发送 低位后发送

发送出来的数组为:40,80,00,00

但在C语言对浮点数的存储中 是按小端格式来存储的 也就是40在高位 00在低位
浮点数:4.0f
地址0x1000对应00
地址0x1001对应00
地址0x1002对应80
地址0x1003对应40

若直接使用memcpy函数 则需要进行大小端转换 否则会存储为:
地址0x1000对应40
地址0x1001对应80
地址0x1002对应00
地址0x1003对应00

大小端转换:

void swap32(void * p)
{uint32_t *ptr=p;uint32_t x = *ptr;x = (x << 16) | (x >> 16);x = ((x & 0x00FF00FF) << 8) | ((x >> 8) & 0x00FF00FF);*ptr=x;
}

压缩Packed-ASCII字符串

本质上是将原本的ASCII的最高2位去掉 然后拼接起来 比如空格(0x20)
四个空格拼接后就成了
1000 0010 0000 1000 0010 0000
十六进制:82 08 20
对了一下表 0x20之前的识别不了
也就是只能识别0x20-0x5F的ASCII表
在这里插入图片描述

压缩/解压函数后面再写:

//传入的字符串和数字必须提前声明 且字符串大小至少为str_len 数组大小至少为str_len%4*3 str_len必须为4的倍数
uint8_t Trans_ASCII_to_Pack(uint8_t * str,uint8_t * buf,const uint8_t str_len)
{if(str_len%4){return 0;}uint8_t i=0;memset(buf,0,str_len/4*3);	  for(i=0;i<str_len;i++){if(str[i]==0x00){str[i]=0x20;}}for(i=0;i<str_len/4;i++){buf[3*i]=(str[4*i]<<2)|((str[4*i+1]>>4)&0x03);buf[3*i+1]=(str[4*i+1]<<4)|((str[4*i+2]>>2)&0x0F);buf[3*i+2]=(str[4*i+2]<<6)|(str[4*i+3]&0x3F);}return 1;
}//传入的字符串和数字必须提前声明 且字符串大小至少为str_len 数组大小至少为str_len%4*3 str_len必须为4的倍数
uint8_t Trans_Pack_to_ASCII(uint8_t * str,uint8_t * buf,const uint8_t str_len)
{if(str_len%4){return 0;}uint8_t i=0;memset(str,0,str_len);for(i=0;i<str_len/4;i++){str[4*i]=(buf[3*i]>>2)&0x3F;str[4*i+1]=((buf[3*i]<<4)&0x30)|(buf[3*i+1]>>4);str[4*i+2]=((buf[3*i+1]<<2)&0x3C)|(buf[3*i+2]>>6);str[4*i+3]=buf[3*i+2]&0x3F;}return 1;
}

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

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

相关文章

网络原理-网络层和数据链路层

一、网络层 1、IP协议完成的工作 地址管理&#xff1a;使用一套地址体系来描述所没备的位置 路由选择&#xff1a;一个数据包如何从网络的某个地址传到另一个地址 2、IP报头 4 位版本号&#xff1a;取值为4或6 (IPv4/IPv6) 4 位首部长度&#xff1a;IP报头&#xff0c;单位…

【Three.js基础学习】22.New project structure

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 前言 这里将使用全新的项目结构&#xff0c;将不同工具分层&#xff0c;区分开使用。 一、结构目录 二、对应文件 1.script.js 获取画布&#xff0c;引入样式和功能。 /* 课…

AI风向标|算力与通信的完美融合,SRM6690解锁端侧AI的智能密码

当前&#xff0c;5G技术已经成为推动数字经济和实体经济深度融合的关键驱动力&#xff0c;进入5G发展的下半场&#xff0c;5G与AI的融合正推动诸多行业的数字化转型和创新发展&#xff0c;终端侧AI和端云混合式AI将广泛应用于各类消费终端和各行各业。 在推动5G和AI与各行业场…

【WPF】Prism学习(二)

Prism Commands 1.命令&#xff08;Commanding&#xff09; 1.1. ViewModel的作用&#xff1a; ViewModel不仅提供在视图中显示或编辑的数据&#xff0c;还可能定义一个或多个用户可以执行的动作或操作。这些用户可以通过用户界面&#xff08;UI&#xff09;执行的动作或操作…

智慧建造-运用Trimble技术将梦幻水族馆变为现实【上海沪敖3D】

项目概述 西雅图水族馆耗资1.6亿美元对海洋馆进行扩建。该项目包括建造三个大型栖息地&#xff0c;每个建筑物几乎都没有直边&#xff0c;其中一个主栖息地由520立方米混凝土和355吨钢筋组成。特纳建筑公司的混凝土团队通过强大的贸易合作伙伴和创新的数字制造技术&#xff0c;…

kubesphere环境-本地Harbor仓库+k8s集群(单master 多master)+Prometheus监控平台部署

前言&#xff1a;半月前在公司生产环境上离线部署了k8s集群Victoria Metrics(二开版)自研版夜莺 监控平台的搭建&#xff0c;下面我租用3台华为云服务器演示部署kubesphere环境-本地Harbor仓库k8s集群&#xff08;单master节点 & 单master节点&#xff09;Prometheus监控部…

java 随机生成验证码

1.需求 实现随机生成验证码&#xff0c;验证码可能是大小写字母和数字 2.实现 写一个getCode方法实现 public static String getCode(int n){//1. 定义一个字符串&#xff0c;字符串中包含大小写字母和数字String str "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrs…

Unity图形学之Blend指令

1.渲染流程&#xff1a;Blend 决定了要渲染的像素和Gbuffer里像素到底怎么取舍 2.Blend 公式&#xff1a; 3.factor可以取值的内容有&#xff1a; One 1 Zero :0 SrcColor : 要渲染的像素 SrcAlpha : 要渲染像素的 a 通道。 DstColor &#xff1a; 已经渲染在gbuffer…

林曦词典|养生

“林曦词典”是在水墨画家林曦的课堂与访谈里&#xff0c;频频邂逅的话语&#xff0c;总能生发出无尽的思考。那些悠然轻快的、微妙纷繁的&#xff0c;亦或耳熟能详的词&#xff0c;经由林曦老师的独到解析&#xff0c;意蕴无穷&#xff0c;让人受益。于是&#xff0c;我们将诸…

生成自签名证书并配置 HTTPS 使用自签名证书

生成自签名证书 1. 运行 OpenSSL 命令生成证书和私钥 在终端中输入以下命令&#xff0c;生成自签名证书和私钥文件&#xff1a; sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout self_signed.key -out self_signed.pem-x509&#xff1a;生成自签名证书。…

物料数据对接:轻易云助力聚水潭与金蝶云星空集成方案

聚水潭数据集成到金蝶云星空&#xff1a;物料对接方案 在企业信息化系统中&#xff0c;数据的高效流动和准确对接是业务运营的关键。本文将聚焦于一个具体的技术案例——如何通过轻易云数据集成平台实现聚水潭与金蝶云星空之间的物料数据对接。 本次集成任务主要涉及两个核心…

阅读2020-2023年《国外军用无人机装备技术发展综述》笔记_作战无人机和察打无人机图鉴

文献基本信息 题名作者来源发表时间2020年国外先进军用无人机技术发展综述 袁成;董晓琳;朱超磊 飞航导弹 2021-01-14 2021年国外军用无人机装备技术发展综述 朱超磊 ;袁成;杨佳会;飞航导弹 战术导弹技术2022-02-112022年国外军用无人机装备技术发展综述 朱超磊;金钰;王靖…

【C#设计模式(11)——外观模式(Facade Pattern)】

前言 外观模式隐藏了子系统的复杂性&#xff0c;简化了客户端与子系统之间的交互。 代码 public class Facade{private CommunicationModel communicationModel;private AcquisitionModel acquisitionModel;private ToolModel toolModel;public Facade(){communicationModel n…

学习日记_20241115_聚类方法(层次聚类)

前言 提醒&#xff1a; 文章内容为方便作者自己后日复习与查阅而进行的书写与发布&#xff0c;其中引用内容都会使用链接表明出处&#xff08;如有侵权问题&#xff0c;请及时联系&#xff09;。 其中内容多为一次书写&#xff0c;缺少检查与订正&#xff0c;如有问题或其他拓展…

力扣 LeetCode 239. 滑动窗口最大值(Day5:栈与队列)

解题思路&#xff1a; 始终维护deque的头元素为最大值&#xff0c;后面来的值更大就会逐一清除前面比它小的值 可以把 peek() 改为 peekFirst() &#xff0c;虽然是一个意思&#xff0c;但看起来更加清楚&#xff0c;对于双端队列能更清晰地表述具体操作 class Solution {pu…

基于GPU器件行为的创新分布式功能安全机制为智能驾驶保驾护航

作者&#xff1a;商瑞 陈娇 随着汽车智能化程度的快速提高&#xff0c;大量新的处理器和系统级芯片&#xff08;SoC&#xff09;被广泛引入到车辆中&#xff0c;无论是在驾驶还是座舱等场景&#xff0c;无论采用域控制器模式还是新兴的中央控制单元模式&#xff0c;都无一例外…

高美GULMAY高压发生器维修X射线源维修CF160

GULMAY高压发生器维修规格系列包括&#xff1a;CF,FC,CP等系列 维修类别&#xff1a;仪器仪表/无损检测仪器/其他无损检测仪器 GULMAY公司作为世界上X的工业X射线高压系统制造厂家之一,GULMAY公司拥有30多年的研发和制造经验,不但为XX射线探伤X域的用户提供种类繁多的标准型号…

动态规划-背包问题——[模版]完全背包问题

1.题目解析 题目来源 [模版]完全背包_牛客题霸_牛客 测试用例 2.算法原理 1.状态表示 与01背包相同&#xff0c;这里的完全背包也是需要一个二维dp表来表示最大价值&#xff0c;具体如下 求最大价值dp[i][j]:在[1,i]区间选择物品&#xff0c;此时总体积不大于j时的最大价值 求…

Android音视频直播低延迟探究之:WLAN低延迟模式

Android WLAN低延迟模式 Android WLAN低延迟模式是 Android 10 引入的一种功能&#xff0c;允许对延迟敏感的应用将 Wi-Fi 配置为低延迟模式&#xff0c;以减少网络延迟&#xff0c;启动条件如下&#xff1a; Wi-Fi 已启用且设备可以访问互联网。应用已创建并获得 Wi-Fi 锁&a…