卡尔曼滤波Q和R怎么调

  • 卡尔曼滤波器是一种有效的估计算法,主要用于在存在噪声的环境中估计动态系统的状态。它通过结合预测模型(系统动态)和观测数据(包括噪声)来实现这一点。在卡尔曼滤波中,调整过程噪声协方差矩阵 ( Q ) 和测量噪声协方差矩阵 ( R ) 是非常关键的,因为这两个参数直接影响滤波器的性能。

    过程噪声 ( Q )

    • 意义:( Q ) 表示对系统模型中随机噪声的估计。如果 ( Q ) 设置得较小,表明我们相信系统模型的精度较高,系统状态的预测与实际值差异不大。
    • 调整策略:如果 ( Q ) 过小,滤波器对模型预测的信任度过高,可能会忽略一些实际中的动态变化,导致滤波结果跟不上实际系统的变化(系统易发散)。如果 ( Q ) 过大,滤波器对模型的信任度降低,会更多地依赖观测数据,这可能导致滤波输出过于嘈杂,反映了过多的测量噪声。

    测量噪声 ( R )

    • 意义:( R ) 表示对测量过程中噪声的估计。较大的 ( R ) 表示对测量数据的信任度较低。
    • 调整策略:如果 ( R ) 过大,滤波器对测量数据的依赖减少,响应变慢,可能导致滤波器响应对系统变化不够敏感。如果 ( R ) 过小,滤波器对测量数据的信任度过高,这可能使滤波结果受到测量噪声的较大影响,导致估计值波动较大。

    调试技巧

    • 单变量调整:在调试过程中,通常建议固定一个噪声参数(如先固定 ( R )),调整另一个(如 ( Q )),观察滤波器的性能如何变化。这样可以分别了解每个参数的影响。
    • 逐步调整:开始时可以将 ( Q ) 设置得较小,( R ) 设置得较大,然后逐步增加 ( Q )、减小 ( R ),观察滤波器的稳定性和响应速度。
    • 性能指标:观察滤波器在调整参数后的性能,如估计误差、收敛速度、对系统变化的响应等。

    实际应用中的考量

    • 系统动态:系统的具体特性和动态变化也会影响最佳的 ( Q ) 和 ( R ) 值。例如,对于动态变化剧烈的系统,可能需要较大的 ( Q ) 来适应这种变化。
    • 噪声特性:实际测量过程中噪声的统计特性(如方差、频谱)也应该在调整 ( R ) 时考虑。

    总的来说,调整 ( Q ) 和 ( R ) 是一个迭代过程,需要基于系统性能反馈和实际观测数据来不断优化。在实际应用中,也可以利用一些自适应算法来动态调整这些参数,以达到更好的滤波效果。

    https://yunyang1994.github.io/2021/07/10/%E5%8D%A1%E5%B0%94%E6%9B%BC%E6%BB%A4%E6%B3%A2%E7%AE%97%E6%B3%95-%E6%B0%B8%E8%BF%9C%E6%BB%B4%E7%A5%9E/

    鲁道夫 • 卡尔曼在一次访问 NASA 埃姆斯研究中心时,发现他的卡尔曼滤波算法能帮助解决阿波罗计划的轨道预测问题,最终,飞船正确驶向月球,完成了人类历史上的第一次登月。卡尔曼因而一举成名,后来还被美国总统奥巴马授予了国家科学勋章。

    S-G 滤波器(Savitzky–Golay filter),它的核心思想是对一定长度窗口内的数据点进行 k 阶多项式拟合,其加权系数是通过在滑动窗口内对给定高阶多项式的最小二乘拟合得出。

    import numpy as np
    import matplotlib.pyplot as plt
    from scipy.signal import savgol_filterN = 100  # 数据点的数量
    X = np.arange(N)  # 创建一个0到N-1的数组# 模拟100帧带有噪声的原始数据,使用正弦波和高斯噪声
    Y1 = np.sin(np.linspace(0, np.pi*2, num=N)) + np.random.normal(0, 0.1, size=N)window_length = 5      # 滑动窗口长度,该值需为正奇整数
    poly_order = 1         # 窗口内的数据点进行k阶多项式拟合,其值需要小于 window_lengthY2 = []                # 用于存储平滑后的数据
    cache_data = []        # 缓存队列,用于存储当前滑动窗口内的数据for i in range(N):                       # 实时地遍历每帧噪声数据origin_data = Y1[i]                  # 获取当前帧的数据cache_data.append(origin_data)       # 将当前帧数据添加到缓存队列if i < window_length:                # 如果当前帧数小于滑动窗口长度smooth_data = origin_data        # 直接使用原始数据作为平滑数据else:window_data = np.array(cache_data)  # 将缓存队列转换为numpy数组window_data = savgol_filter(window_data, window_length, poly_order)  # 对滑动窗口数据进行Savitzky-Golay滤波平滑smooth_data = window_data[window_length//2]  # 取滑动窗口中间位置的数据作为平滑结果cache_data.pop(0)                            # 将缓存队列的最早数据移除,保持窗口大小不变Y2.append(smooth_data)  # 将平滑结果添加到结果列表中

观察这个过程,发现有个非常严重的 bug:被平滑的数据需要依赖前几帧,也就是说 S-G 滤波具有一定的滞后性,比如说如果 window_size = 5,那么就会滞后 2 帧。而卡尔曼滤波可以较好地解决这个问题的痛点,它只要获知上一时刻状态的估计值以及当前状态的观测值就可以计算出当前状态的估计值,因此不需要记录观测或者估计的历史信息

image-20240704110528803 image-20240704110439425

上述方程是卡尔曼滤波五个方程之一,名为状态更新 State Update Equation。其含义为:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

因此,状态更新方程为:

img

image-20240704112229327

两种方法都有一定的可信度。那能否将两种答案相融合呢,卡尔曼滤波就是做了这样的事情。**如下图所示,假设两种方法的误差都满足正态分布,如下图所示。如果正态分布越尖锐陡峭,则说明这种方法的预测结果越可信;如果越缓和平坦,则说明越不可信。**为了融合这两种方法的预测结果,我们给这两种分布分别赋予一个权重,该权重代表了这个分布对融合结果的重要性。经过融合后的分布变得比之前两种分布更加尖锐,这表明结果更加可信了。

img

方差是权重,融合结果更接近方差小的

那么如何给出一个合理的权重分布呢,这就是卡尔曼滤波要做的事情。

卡尔曼滤波模型

Kalman 滤波分为 2 个步骤**,预测(predict)和校正(correct)。**

预测是基于上一时刻状态估计当前时刻状态,

校正则是综合当前时刻的估计状态与观测状态,估计出最优的状态。

image-20240704154002242 image-20240704154031466

**预测阶段负责根据前一时刻的状态估计值来推算当前时刻的状态变量先验估计值和误差协方差先验估计值;校正阶段负责将先验估计和新的测量变量相融合改进的后验估计。**卡尔曼滤波算法是一个递归的预测—校正方法,即只要获知上一时刻状态的估计值以及当前状态的观测值就可以计算出当前状态的估计值,因此不需要记录观测或者估计的历史信息。

从上面的五个公式中,我们发现:其实卡尔曼滤波的每次迭代更新就是为了求出卡尔曼增益 K,因为它代表了融合估计值和测量值之间的权重。下面这个视频很好地讲解如何通过最小化误差协方差矩阵求出 K:、

https://www.bilibili.com/video/BV1hC4y1b7K7/?t=565.857338&spm_id_from=333.1350.jump_directly&vd_source=8272bd48fee17396a4a1746c256ab0ae

Python 代码实现

在上面过程中,只有 PQRK 四个矩阵还尚未确定。显然增益矩阵 K 是不需要初始化的,P 是误差矩阵,初始化可以是一个随机的矩阵或者 0,只要经过几次的处理基本上就能调整到正常的水平,因此也就只会影响前面几次的滤波结果。

  • Q:预测状态协方差,越小系统越容易收敛,我们对模型预测的值信任度越高;但是太小则容易发散,如果 Q 为零,那么我们只相信预测值;Q 值越大我们对于预测的信任度就越低,而对测量值的信任度就变高;如果 Q 值无穷大,那么我们只信任测量值;
  • R:观测状态协方差,如果 R 太大,则表现它对新测量值的信任度降低而更愿意相信预测值,从而使得 kalman 的滤波结果会表现得比较规整和平滑,但是其响应速度会变慢而出现滞后;
  • P:误差协方差初始值,表示我们对当前预测状态的信任度。它越小说明我们越相信当前预测状态;它的值决定了初始收敛速度,一般开始设一个较小的值以便于获取较快的收敛速度。随着卡尔曼滤波的迭代,P的值会不断的改变,当系统进入稳态之后P值会收敛成一个最小的估计方差矩阵,这个时候的卡尔曼增益也是最优的,所以这个值只是影响初始收敛速度。

假设系统的真实状态是一条正弦曲线,我们在测量过程中伴随一定正态分布的随机噪声,使用 python 模拟该过程如下:

import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['figure.figsize'] = (10, 8)  # 设置图形的显示大小# 初始化参数
n_iter = 500  # 迭代次数
sz = (n_iter,)  # 数组的大小x = np.sin(np.linspace(0, np.pi*2, num=n_iter)) # 测量值,使用正弦函数生成
z = np.sin(np.linspace(0, np.pi*2, num=n_iter)) + np.random.normal(0, 0.1, size=n_iter) # 真实值,正弦值加上噪声plt.figure()  # 创建一个图形
plt.plot(z,'k+',label='noisy measurements')  # 绘制噪声测量数据
plt.plot(x,color='g',label='truth value')  # 绘制真实值
plt.legend()  # 显示图例
plt.show()  # 显示图形

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

接下来我们使用卡尔曼滤波对这段噪声进行实时去燥和平滑处理:

# 为数组分配空间
xhat=np.zeros(sz)      # 后验估计值
P=np.zeros(sz)         # 后验误差估计
xhatminus=np.zeros(sz) # 先验估计值
Pminus=np.zeros(sz)    # 先验误差估计
K=np.zeros(sz)         # 增益或融合因子# 超参数设定,实测调整
R = 0.1**2              # 观测噪声的方差
Q = 1e-4                # 过程噪声的方差# 初始猜测
xhat[0] = 0.0
P[0] = 1.0for k in range(1, n_iter):# 预测阶段xhatminus[k] = xhat[k-1] # 根据前一个后验估计值预测当前值Pminus[k] = P[k-1] + Q   # 更新预测误差的协方差# 更新阶段K[k] = Pminus[k] / (Pminus[k] + R)  # 计算卡尔曼增益xhat[k] = xhatminus[k] + K[k] * (z[k] - xhatminus[k]) # 根据观测更新当前估计P[k] = (1 - K[k]) * Pminus[k]        # 更新误差协方差plt.plot(z, 'k+', label='noisy measurements')         # 绘制噪声测量值
plt.plot(x, color='g', label='truth value')           # 绘制真实值
plt.plot(xhat, 'b-', label='a posteri estimate')      # 绘制后验估计值
plt.legend()                                          # 显示图例
plt.show()                                            # 显示图形

image-20240704160643407

贝叶斯定理(原理)

https://www.liaoxuefeng.com/article/1565255725482019

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

贝叶斯定理的核心思想就是不断根据新的证据,将先验概率调整为后验概率,使之更接近客观事实。

在贝叶斯公式中,各个部分的定义如下:

贝叶斯公式通常写作:
[
P ( A ∣ B ) = P ( B ∣ A ) × P ( A ) P ( B ) P(A|B) = \frac{P(B|A) \times P(A)}{P(B)} P(AB)=P(B)P(BA)×P(A)
]

其中:

  • ( P(A|B) )后验概率(Posterior Probability):在观察到事件 ( B ) 之后,事件 ( A ) 发生的概率。
  • ( P(B|A) )似然概率(Likelihood):已知事件 ( A ) 发生时,观察到事件 ( B ) 的概率。
  • ( P(A) )先验概率(Prior Probability):在观察到事件 ( B ) 之前,事件 ( A ) 发生的概率。
  • ( P(B) )边际概率(Marginal Probability)标准化常数(Normalizing Constant):事件 ( B ) 发生的总概率,无论事件 ( A ) 是否发生。

在贝叶斯理论中,后验概率 ( P ( A ∣ B ) P(A|B) P(AB) ) 是我们最关心的,因为它提供了考虑了新证据后事件 ( A A A ) 的更新概率。先验概率 ( P ( A ) P(A) P(A) ) 表示在获得新的数据或证据之前对事件 ( A A A ) 发生概率的假设或估计。

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

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

相关文章

Kubernetes运维工程师必备:K8s 基础面试题精编(一)

Kubernetes运维工程师必备:K8s 基础面试题精编(一) 1. 什么是Kubernetes?2. Kubernetes如何实现容器编排?3. 说出k8s的常见资源对象?4. 什么是pod?5. Deployment介绍及使用?6. statefulesets介绍及使用?7. statefulesets和deployment区别?8. 什么是调度器(Scheduler…

The First项目报告:NvirWorld与区块链游戏的未来

根据官方公告&#xff0c;The Fisrt现货区将于2024年7月2日16:00上架NVIR/USDT交易对&#xff0c;NVIR是NvirWorld平台的原生代币。作为一个去中心化解决方案&#xff0c;NvirWorld为开发者提供了一个简化且适应性强的环境&#xff0c;旨在通过优化的扩展解决方案来降低交易成本…

docker 本地部署大模型(ollama)

docker 安装 ollama docker search ollama docker pull ollama/ollama###docker下载ollama部署 docker run -d -v ollama:/root/.ollama -p 11434:11434 --name ollama ollama/ollama### 下载模型 docker exec -it ollama ollama pull llama3### 交互式运行模型docker exec -i…

算法 —— 二分查找

目录 二分查找 在排序数组中查找元素的第一个和最后一个位置 搜索插入位置 x的平方根 山峰数组的峰顶索引 寻找峰值 搜索旋转排序数组中的最⼩值 点名 二分查找模板分为三种&#xff1a;1、朴素的二分模板 2、查找左边界的二分模板 3、查找右边界的二分模板&#xf…

【基于R语言群体遗传学】-12-超显性与次显性

欢迎先看前面的博客&#xff0c;再继续进行后面的内容&#xff1a; 群体遗传学_tRNA做科研的博客-CSDN博客 当杂合子的适应度超出纯合子的范围时&#xff0c;二倍体能够展现出更多令人着迷的选择实例。这种形式的一种是杂合子优势&#xff0c;或称为“超显性”&#xff0c;其…

【包邮送书】AIGC时代程序员的跃迁——编程高手的密码武器

欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和技术。关…

无线麦克风哪个品牌音质最好,揭秘手机收音麦克风哪个牌子好!

随着全球直播和短视频行业的蓬勃发展&#xff0c;领夹麦克风因其便携性和出色的录音质量而备受青睐。用户在各种场合下追求清晰、真实的录音效果&#xff0c;领夹麦克风无疑是一个理想的选择。 然而&#xff0c;面对市场上琳琅满目的品牌和型号&#xff0c;想要挑选一款性能优…

C++和Python蚂蚁搬食和蚊虫趋光性和浮标机群行为算法神经网络

&#x1f3af;要点 &#x1f3af;机器人群行为配置和C行为实现&#xff1a;&#x1f58a;脚底机器人狭隘空间导航避让障碍物行为 | &#x1f58a;脚底机器人使用摄像头耦合共振&#xff0c;实现同步动作 | &#x1f58a;脚底机器群使用相机&#xff0c;计算彼此间“分子间势能…

WAIC2024 上海 | Gooxi 全面展示智算新成果,加速人工智能落地应用

浦江之畔&#xff0c;大咖云集&#xff1b;智能浪潮&#xff0c;奔涌不息。7月4日&#xff0c;被誉为人工智能界风向标的世界人工智能大会暨人工智能全球治理高级别会议在上海盛大召开&#xff0c;Gooxi此次携最新AI服务器以及解决方案参与&#xff0c;以算为擎赋能新质生产力&…

如何对待信息技术课上学生玩游戏现象

对待信息技术课上学生玩游戏的现象&#xff0c;需要采取一系列综合措施&#xff0c;既要防止学生分心&#xff0c;又要确保课堂的教学质量和学生的积极参与。以下是一些建议&#xff1a; 1. 明确课堂规则&#xff1a;在课程开始之初&#xff0c;明确告知学生课堂上不允许玩游戏…

【UE Lua】 快速入门(基础语法、与UE引擎的交互)

目录 0 引言1 基础语法1.1 变量和数据类型1.2 注释1.3 控制结构1.4 函数1.5 表&#xff08;Table&#xff09;1.6 元表&#xff08;Metatable&#xff09;1.7 字符串操作1.8 模块和包1.9 错误处理 2 数据结构 - 表2.1 表&#xff08;Table&#xff09;2.2 元表&#xff08;Meta…

「数据结构详解·十四」对顶堆

「数据结构详解一」树的初步「数据结构详解二」二叉树的初步「数据结构详解三」栈「数据结构详解四」队列「数据结构详解五」链表「数据结构详解六」哈希表「数据结构详解七」并查集的初步「数据结构详解八」带权并查集 & 扩展域并查集「数据结构详解九」图的初步「数据结构…

【计算机毕业设计】017基于微信小程序的学生公寓电费信息管理系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

多线程网络实战之仿qq群聊的服务器和客户端

目录 一、前言 二、设计需求 1.服务器需求 2.客户端需求 三、服务端设计 1.项目准备 2.初始化网络库 3.SOCKET创建服务器套接字 4. bind 绑定套接字 5. listen监听套接字 6. accept接受客户端连接 7.建立套接字数组 8. 建立多线程与客户端通信 9. 处理线程函数&…

【3GPP核心网】【5G】精讲5G核心网系统架构主要特征

目录 前言 1. 5G核心网系统架构主要特征 1.1 5G核心网与4G核心网EPC区别 1.2 5G核心网系统架构主要特征 2. 5G网络逻辑架构 2.1 新型基础设施平台 2.2 逻辑架构 前言 首先需要理解核心网的角色定位&#xff0c;作为移动通信网络的核心部分&#xff0c;核心网起着承上启下的作用…

【收藏】欧盟CE、美国FDA法规及标准查询常用网站

01 CE法规&标准查询网站 医疗器械主管部门的网站 网址: https://www.camd-europe.eu/ 简介: CAMD的全称是Competent authorities for medical devices&#xff0c;翻译成中文叫做医疗器械监管机构&#xff0c;实际上它指的是欧盟成员国医疗器械监管机构的联盟&#xff…

程序人生【追光的日子】今天我们不谈技术,谈一谈:人工智能的意义到底是什么?来看看今天分享的故事...我想我们都愿意相信,也许AI真的会有温度,这一天不远了~!

有志者,事竟成,破釜沉舟,百二秦关终属楚;苦心人,天不负,卧薪尝胆,三千越甲可吞吴。 🎯作者主页: 追光者♂🔥 🌸个人简介: 💖[1] 计算机专业硕士研究生💖 🌿[2] 2023年城市之星领跑者TOP1(哈尔滨)🌿 🌟[3] 2022年度博客之星人工智能领域…

Java SpringBoot MongoPlus 使用MyBatisPlus的方式,优雅的操作MongoDB

Java SpringBoot MongoPlus 使用MyBatisPlus的方式&#xff0c;优雅的操作MongoDB 介绍特性安装新建SpringBoot工程引入依赖配置文件 使用新建实体类创建Service测试类进行测试新增方法查询方法 官方网站获取本项目案例代码 介绍 Mongo-Plus&#xff08;简称 MP&#xff09;是一…

网络服务器配置与管理

网络服务器配置与管理是一个涉及多个方面的领域&#xff0c;它涵盖了从物理硬件的设置到操作系统、网络服务和应用的配置&#xff0c;再到日常维护和安全策略的实施。以下是网络服务器配置与管理的一些核心概念和步骤&#xff1a; 硬件配置&#xff1a; 选择合适的服务器硬件&a…

基于docker上安装elasticSearch7.12.1

部署elasticsearch 首先&#xff0c;先创建网络 # 创建网络 docker network create es-net拉取elasticSearch的镜像 #拉取镜像 docker pull elasticsearch:7.12.1创建挂载点目录 # 创建挂载点目录 mkdir -p /usr/local/es/data /usr/local/es/config /usr/local/es/plugin…