又在折磨自己

news/2025/3/11 3:29:20/文章来源:https://www.cnblogs.com/fideow/p/18692158

过年好,但我最近真的好想死,听说卡尔曼吕波很重要,为了让自己死得快一点来学学卡尔曼吕波,我对我接下来的半个月充满了绝望。

新年第一天就这么丧可不好,振作起来,人活着总要学会开开心心的,然后少管一些不开心的事情,其实别人也并没有很重要对不对,希望今年不要再做这些伤害自己的事情了。

然而我上学期没学线性代数,寄,我把公式扔在这就跑。

简易的理解

假如有一辆小车儿在路上行驶,你想给这个小车儿做定位,现在你有两种选择:

  1. 观测值:直接使用 GPS 定位,然而每次获取的位置都有随机误差。

  2. 估计值:通过之前的观察你发现这个小车儿正在做匀加速直线运动,并且你通过之前的数据推导出了它的速度和加速度,直接用速度和加速度计算出下一时刻的位置。

然而真实情况下小车儿也不一定严格做匀加速直线运动,你发现两种选择都有误差也有一定的可信度,你决定两边都信一点,于是你把 观测值 和 估计值 分别乘上一个(加和为 \(1\) 的)系数得到 最佳估计值,作为对小车儿真实位置的估计。

现在你要解决的问题是,系数怎么取比较优,或者说,每个时刻的系数分别怎么取比较优。

两边都有不确定性,我们可以认为这个不确定性成正态分布,y 表示真实值为 x 的概率(也就是说函数和 x 轴围成的面积为 \(1\))。

大概这样

感性地想,肯定是谁的不确定性小谁的系数就取得更大一些。

设置状态

我们将小车儿在 \(t\) 时刻的状态表示为 \(x_t=\left[\begin{array}{c}p_t \\v_t\end{array}\right]\),其中 \(p_t\) 表示位置,\(v_t\) 表示速度。

那么就有 \(p_t=p_{t-1}+v_{t-1}\times \triangle t + u_{t-1}\times\frac{\triangle t^2} 2\),其中 \(u_t\) 表示 \(t\) 时刻的加速度,我们假设加速度是可以从驾驶员那里直接得到的。

以及 \(v_t=v_{t-1}+u_{t-1}\times\triangle t\)

表示成矩阵:

\[\left[\begin{array}{c}p_t \\v_t\end{array}\right] = \left[\begin{array}{c}1&\triangle t \\0&1\end{array}\right] \left[\begin{array}{c}p_{t-1} \\v_{t-1}\end{array}\right] + \left[\begin{array}{c}\frac{\triangle t^2}2 \\{\triangle t}\end{array}\right] u_{t-1} \]

豪德,那我们设

\[F_t=\left[\begin{array}{c}1&\triangle t \\0&1\end{array}\right],~ B_t=\left[\begin{array}{c}\frac{\triangle t^2}2 \\{\triangle t}\end{array}\right] \]

于是得到了简化版小车儿运动公式:\(x_t=F_t x_{t-1}+B_t u_{t-1}\)

那我们就可以用这个公式来计算估计值了,为了把估计值和真实值区分开,我们用 \(x_t\) 表示真实值,用 \(\hat x_t^-\) 表示估计值,用 \(\hat x_t\) 表示最终估计值(也就是估计值和观测值合成的最佳估计值)。

估计值的计算公式:

\[\hat x_t^- = F_t \hat x_{t-1} + B_tu_{t-1} \]

协方差矩阵

但上面说到,“肯定是谁的不确定性小谁的系数就取得更大一些”,因此要想计算系数肯定也要把不确定性用矩阵表示出来。

那聪明的人就想到了,既然是正态分布,可以用方差!

好的,我们确实用方差描述正态分布。但有一个小问题:如果有两个维度怎么办?

一堆点在两个维度上成正态分布是这样的,那么在每一维上都会成正态分布,似乎两个方差就够了。

但,如果是下图这样的情况,点在每一维上仍然成正态分布,我们发现仅仅两个方差是不够的,还需要一个新的值,大概是表示 x 维度和 y 维度的关系。

就比方说,假设你发现小车儿的不确定性受小石子的影响,而被小石子绊到时速度和路程都会突然增大,有了这个小性质我们的不确定性就不是简单的只跟某一维有关。

因此我们用矩阵记录不确定性 —— 矩阵可以包含每两维之间的关系。

好的,协方差矩阵的大小就是维度的数量,数量和你设的状态的维数相同(在本文的例子中有 \(p\)\(v\) 两维)。每个位置表示的都是其中两维的关系。也就是说,对角线表示的是自己和自己的关系,也就是这一维的方差啦。

协方差矩阵的传递公式:

\[P_t^-=FP_{t-1}F^T+Q \]

其中 \(P_t\) 表示 \(t\) 时刻的协方差矩阵,右上角带个减号还是因为它只是初步估计值,\(F\) 表示上文提到过的状态转移矩阵,\(F^T\) 表示矩阵的转置。\(Q\) 是这些关系转移的时候难免也会产生噪声,因为关系也不会按照完美的公式变化。

观测矩阵

\(z_t\) 为 GPS 在 \(t\) 时刻观测到的小车儿的位置。注意,虽然小车儿的状态有路程和速度两维,但这里速度只是用来辅助计算的,路程才是能够观测的。

既然如此,我们把 “路程才是能够观测的” 这句话也表示成矩阵。设 \(z_t=Hx_t+R\),其中 \(H\) 就是观测矩阵,此处它的值是 \([1~0]\),表示如何把你设计的状态转化为观测到的状态。而 \(x_t=\left[\begin{array}{c}p_t \\v_t\end{array}\right]\)\(R\) 是观测噪声的协方差矩阵,在这里观测值只有一个因此乘起来是一个数字 \(R\) 也是一个数字。

那这个 \(H\) 只有 \([1~0]\) 在这里看起来有点蠢……但其实,假设你实际测量中观测到的路程不是简单的一个 \(z_t\),而是一堆奇奇怪怪的参数,并且这些参数可能又跟你状态里的好几维都有关,你只知道状态 \(x\) 对每个参数的影响,这时候 \(H\) 就是一个比较复杂的矩阵了,卡尔曼滤波器的数据融合功能也是在这里体现出来的。

状态更新

变量认识全了开始更新状态:

\[\hat x_t=\hat x_t^-+K_t(z_t-H\hat x_t^-) \]

理解一下,加号前面是估计值,后面是根据观测值修正的过程,修正完得到最终估计值。

修正过程中乘的这个系数 \(K_t\) 非常重要,它叫卡尔曼系数,当然也就是我们在最开头提出的,系数怎么取最优的问题。

卡尔曼系数的公式:

\[K_t=P_t^-H^T(HP_t^-H^T+R)^{-1} \]

卡尔曼系数由观测值和估计值的协方差矩阵来决定,对应了最开始说的 “肯定是谁的不确定性小谁的系数就取得更大一些”。

然后还差最后一个公式,从 \(P_t^-\)\(P_t\) 的转移:

\[P_t=(I-K_tH)P_t^- \]

完整公式

预测:

\[\hat x_t^- = F_t \hat x_{t-1} + B_tu_{t-1} \]

\[P_t^-=FP_{t-1}F^T+Q \]

修正:

\[K_t=P_t^-H^T(HP_t^-H^T+R)^{-1} \]

\[\hat x_t=\hat x_t^-+K_t(z_t-H\hat x_t^-) \]

\[P_t=(I-K_tH)P_t^- \]

按照这样循环往复就可以写代码了。其中 \(x\)\(P\) 的初始值其实不重要,因为很快就会趋近于真实值。\(Q\)\(R\) 是根据实际情况设的。

应用

除了滤波应该还有很多应用,不知道没用过。

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

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

相关文章

Quid faciam?

「先生、人生相談です。 この先どうなら楽ですか。 そんなの誰もわかりはしないよなんて言われますか。 ほら、苦しさなんて欲しいわけない。 何もしないで生きていたい。 青空だけが見たいのは我儘ですか。 」每到这种时候都感觉要撑不住了。 此时此刻眼眶就不禁为黏糊糊的透明…

【牛客训练记录】牛客2025年除夕娱乐赛

训练情况赛后反思 据说是临时准备的,今年好像没啥乐子题,除了两道猜猜题 A题 构造一个字符串使得 jiaran 子串至少出现 114514 次,直接输出 114514 次 jiaran点击查看代码 #include <bits/stdc++.h> // #define int long long #define endl \nusing namespace std;voi…

互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(三):用.NET IoT库控制舵机并多方法播放表情

前言 前面两篇文章讲了.NET IoT相关的知识点,以及硬件的GPIO的一些概念,还有点亮两个屏幕的方法,这些让大家对.NET的用途有了新的认识,那我们这回继续讲解.NET IoT的知识点,以及介绍一些好玩的东西,例如让视频通过机器人的屏幕播放起来,还有机器人的身体也能通过我们的代…

数据库物理备份:保障数据完整性和业务连续性的关键策略

title: 数据库物理备份:保障数据完整性和业务连续性的关键策略 date: 2025/1/29 updated: 2025/1/29 author: cmdragon excerpt: 在现代企业中,数据被视为最重要的资产之一。因此,确保数据的安全性、完整性和可用性是每个数据库管理员(DBA)的首要任务。在数据管理的过程…

《Operating System Concepts》阅读笔记:p1-p1

《Operating System Concepts》学习第 1 天,p1-p1 总结,总计 1 页。 一、技术总结 无。 二、英语总结(生词:1) 1.intermediary (1)intermediary: inter-("between, among") + medius("middle") c.intermediary originally referred to something or so…

【持续更新中】线段树全集

引入 一个数列,单点修改(加),区间查询(和)。 上述问题有很多种解法,如树状数组、分块、平衡树等,今天的主题是著名的线段树。 正题 (不确保按难度升序排序,自己看着目录调顺序吧) 线段树基本原理 因为需要区间查询,所以我们希望有一些捷径能将部分的数的和提前算好…

读量子霸权18读后总结与感想兼导读

《量子霸权》读书笔记,读薄率约23.48%,涵盖量子宇宙、量子计算机等读厚方向。笔记详细记录了各章节内容,亮点包括量子计算介绍、与传统计算机比较、与AI关系及平行宇宙探讨。1. 基本信息 量子霸权【美】加来道雄 著中信出版集团股份有限公司,2024年4月出版1.1. 读薄率 书籍总…

C# WinForm 自定义类型转换器重新编译后修改属性提示 InstanceDescriptor 错误的解决方案

当我们编写自定义的类型转换器比如从 TypeConverter、ExpandableObjectConverter 等继承,首次编译后,修改属性值是正常的,当再次编译后,再次修改属性则会提示如下错误: 属性“属性名”的代码生成失败。错误是: “类型转换器类名”无法将“属性名”转换为“System.Componen…

简单的javaweb

在这里我们可以看到springboots的基本结构 controller(控制器) 负责处理HTTP请求,调用相应的服务层方法,并返回视图或数据。 DailyReportController、InternalMessageController、PersonInfoController:这些是具体的控制器类,分别处理与日报、内部消息和个人信息相关的请…

AMD核显运行DeepseekR1-7b:使用mlc-llm框架,利用vulkan推理

任何支持vulkan的显卡都能跑! 本文使用的是Radeon890M核显,内存有多大就等于显存有多大。劲啊 1. 安装mlc-llm 官方文档 windows+vulkan: conda activate your-environment pip install --pre -U -f https://mlc.ai/wheels mlc-llm-nightly-cpu mlc-ai-nightly-cpulinux+vulk…