无人驾驶卡尔曼滤波

无人驾驶卡尔曼滤波(行人检测)
x k = a x k − 1 + w k x_k = ax_{k-1} + w_k xk=axk1+wk
w k w_k wk:过程噪声

状态估计

估计飞行器状态(高度)
x k = z k − v k x_k = z_k - v_k xk=zkvk
卡尔曼滤波通过同时考虑上一状态值和当前的测量值来获得对当前状态值的估计,对状态 x x x的估计: x ^ \hat{x} x^
x ^ k = x ^ k − 1 + g k ( z k − x ^ k − 1 ) \hat{x}_k = \hat{x}_{k-1} + g_k(z_k - \hat{x}_{k-1}) x^k=x^k1+gk(zkx^k1)
g k g_k gk:卡尔曼增益:指之前的估计和当前测量对当前估计的影响的分配权重,如果为0,说明非常不信任当前的测量,直接保留了上一次的估计作为当前状态的估计;增益为 1,认为当前的测量非常可信,彻底接受它作为我当前状态的估计

计算卡尔曼增益

那么如何计算卡尔曼增益呢?我们使用一种间接的方法,我们虽然不知道测量噪声 v k v_k vk的值,但是我们知道它的均值,前面我们提到,测量噪声来自传感器本身,并且符合高斯分布,所以我们能够从传感器厂商那里获得测量噪声的均值 r r r,那么 g k g_k gk可以表示为:

g k = p k − 1 ( p k − 1 + r ) g_k = \frac{p_{k-1}}{(p_{k-1} + r)} gk=(pk1+r)pk1

p k p_k pk:预测误差

p k = ( 1 − g k ) p k − 1 p_k = \frac{(1 - g_k)}{p_{k-1}} pk=pk1(1gk)

那么假设前一次的预测误差 $ p_{k-1} = 0$,那么根据公式,当前的增益 g k = 0 g_k = 0 gk=0,一维着舍弃掉当前的测量而完全采用上一个时刻的估计,如果 p k − 1 = 1 p_{k-1} = 1 pk1=1 那么增益变成 1 / ( 1 + r r r ) 通常$ r $ 是个很小的数值,所以增益为1,所以完全接受这一次的测量作为我们的估计(因为上一次的的预测误差太大了,为1,所以一旦拿到了新的测量,如获至宝,就干脆把不准确的上次的估计舍弃掉了)
对于下面的公式的分析是一样的,我们考虑极端的例子,当增益为 0, p k = p k − 1 p_k = p_{k-1} pk=pk1 ,因为我们彻底舍弃掉了本次的测量,所以本次的预测误差只能接受上一次的。

预测和更新

得到两个公式:

x k = a x k − 1 x_k = ax_{k-1} xk=axk1

x ^ k = x ^ k − 1 + g k ( z k − x ^ k − 1 ) \hat{x}_k = \hat{x}_{k-1} + g_k(z_k - \hat{x}_{k-1}) x^k=x^k1+gk(zkx^k1)

第一个公式我们称之为预测,是基于一些先验的知识(比如说运动模型,牛顿力学等等)觉得我们的状态应该是这样的,而第二个公式呢,就是我们基于我们“不完美的”的传感器的测量数据来更新我们对状态的估计。另为,预测,理论上只考虑了一个固定的过程模型和过程噪声,但是由于我们现在是对机械的状态进行估计,在预测过程中需要对机械本身的控制建模, 我们在预测部分再新增一个控制信号,我们用 b u k bu_k buk表示。实际的传感器测量除了会有测量噪声 v k v_k vk 以外,还会存在一定的关于真实状态的缩放,因此我们使用 x k x_k xk 表示测量时通常还会在其前面加一个缩放系数 c c c 。 结合这写我们就可以得到卡尔曼滤波预测和更新过程了:

预测

x ^ k = a x ^ k − 1 + b u k \hat{x}_k = a\hat{x}_{k-1} + bu_k x^k=ax^k1+buk

p k = a p k − 1 a p_k = ap_{k-1}a pk=apk1a

卡尔曼滤波更新的过程为:

g k = p k c c p k c + r g_k = \frac{p_kc}{cp_kc + r} gk=cpkc+rpkc

x ^ k ← x ^ k + g k ( z k − c x ^ k ) \hat{x}_k←\hat{x}_k + g_k(z_k - c\hat{x}_k) x^kx^k+gk(zkcx^k)

p k ← ( 1 − g k c ) p k p_k←(1 - g_kc)p_k pk(1gkc)pk

线性代数方法

预测

x ^ k = A x ^ k − 1 + B u k \hat{x}_k = A\hat{x}_{k-1} + Bu_k x^k=Ax^k1+Buk

P k = A P k − 1 A P_k = AP_{k-1}A Pk=APk1A

卡尔曼滤波更新的过程为:

G k = P k C c P k C + R G_k = \frac{P_kC}{cP_kC + R} Gk=cPkC+RPkC

x ^ k ← x ^ k + G k ( z k − C x ^ k ) \hat{x}_k←\hat{x}_k + G_k(z_k - C\hat{x}_k) x^kx^k+Gk(zkCx^k)

P k ← ( 1 − G k C ) P k P_k←(1 - G_kC)P_k Pk(1GkC)Pk

import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm
from sympy import Symbol, Matrix
from sympy.interactive import printingx = np.mat([[0.0, 0.0, 0.0, 0.0]]).T
print(x, x.shape)
P = np.diag([1000.0, 1000.0, 1000.0, 1000.0])
print(P, P.shape)dt = 0.1
F = np.mat([[1.0, 0.0, dt, 0.0],  # 预测矩阵[0.0, 1.0, 0.0, dt],[0.0, 0.0, 1.0, 0.0],[0.0, 0.0, 0.0, 1.0]])print(F, F.shape)H = np.mat([[0.0, 0.0, 1.0, 0.0],  # 测量矩阵[0.0, 0.0, 0.0, 1.0]])
print(H, H.shape)ra = 0.09R = np.mat([[ra, 0.0],[0.0, ra]])
print(R, R.shape)I = np.eye(4)
print(I, I.shape)sv = 0.5
G = np.mat([[0.5*dt**2],  # 卡尔曼增益[0.5*dt**2],[dt],[dt]])
Q = G*G.T*sv**2   # 过程噪声的协方差矩阵
print(G, G.shape)
print(Q, Q.shape)printing.init_printing()
dts = Symbol('dt')
Qs = Matrix([[0.5*dts**2], [0.5*dts**2], [dts], [dts]])
Qs*Qs.Tm = 200
vx = 20
vy = 10mx = np.array(vx + np.random.randn(m))
my = np.array(vy + np.random.randn(m))
measurements = np.vstack((mx, my))print(measurements.shape)
print('Standard Deviation of Acceleration Measurements=%.2f' % np.std(mx))
print('You assumed %.2f in R.' % R[0, 0])# fig = plt.figure(figsize=(16, 5))
# plt.step(range(m), mx, label='$\dot x$')
# plt.step(range(m), my, label='$\dot y$')
# plt.ylabel('Velocity $m/s$')
# plt.title('Measurements')
# plt.legend(loc='best', prop={'size': 18})xt = []
yt = []
dxt = []
dyt = []
Zx = []
Zy = []
Px = []
Py = []
Pdx = []
Pdy = []
Rdx = []
Rdy = []
Kx = []
Ky = []
Kdx = []
Kdy = []def savestates(x, Z, P, R, K):xt.append(float(x[0]))yt.append(float(x[1]))dxt.append(float(x[2]))dyt.append(float(x[3]))Zx.append(float(Z[0]))Zy.append(float(Z[1]))Px.append(float(P[0, 0]))Py.append(float(P[1, 1]))Pdx.append(float(P[2, 2]))Pdy.append(float(P[3, 3]))Rdx.append(float(R[0, 0]))Rdy.append(float(R[1, 1]))Kx.append(float(K[0, 0]))Ky.append(float(K[1, 0]))Kdx.append(float(K[2, 0]))Kdy.append(float(K[3, 0]))for n in range(len(measurements[0])):x = F * xP = F * P * F.T + QS = (H * P * H.T) + RK = (P * H.T) * np.linalg.pinv(S)Z = measurements[:, n].reshape(2, 1)y = Z - (H * x)x = x + (K * y)P = (I - (K * H)) * Psavestates(x, Z, P, R, K)def plot_x():fig = plt.figure(figsize=(16, 9))plt.step(range(len(measurements[0])), dxt, label='$estimateVx$')plt.step(range(len(measurements[0])), dyt, label='$estimateVy$')plt.step(range(len(measurements[0])), measurements[0], label='$measurementVx$')plt.step(range(len(measurements[0])), measurements[1], label='$measurementVy$')plt.axhline(vx, color='#999999', label='$trueVx$')plt.axhline(vy, color='#999999', label='$trueVy$')plt.xlabel('Filter Step')plt.title('Estimate (Elements from State Vector $X$)')plt.legend(loc='best', prop={'size': 11})plt.ylim([0, 30])plt.ylabel('Velocity')plt.show()def plot_xy():fig = plt.figure(figsize=(16, 16))plt.scatter(xt, yt, s=20, label='State', c='k')plt.scatter(xt[0], yt[0], s=100, label='Start', c='g')plt.scatter(xt[-1], yt[-1], s=100, label='Goal', c='r')plt.xlabel('x')plt.ylabel('y')plt.title('Position')plt.legend(loc='best')plt.axis('equal')plt.show()if __name__ == '__main__':plot_xy()

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

了解什么是UV纹理?

在线工具推荐: 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 什么是UV? UV 是与几何图形的顶点信息相对应的二维纹理坐…

CentOS找回root密码

很悲伤,你忘记了root密码。。。 那就来重置它吧~ 1、在启动时选择操作系统:在引导过程中,选择CentOS操作系统并按下键盘上的任意键来停止引导。 2、 进入编辑模式:在启动菜单中,找到并选择要编辑的CentOS条目&…

Prometheus实战篇:Prometheus监控mongodb

Prometheus实战篇:Prometheus监控mongodb 准备环境 docker-compose安装mongodb docker-compose.yaml version: 3 services:mongo:image: mongo:4.2.5container_name: mongorestart: alwaysvolumes:- /data/mongo/db: /data/dbport:- 27017:27017command: [--auth]enviromen…

VMware复制粘贴共享文件夹

win和虚拟机之间,无法复制粘贴,共享文件夹的解决方案。 安装VMware tools 1,先检查虚拟机设置部分。共享文件夹已启用。复制粘贴已启用。 2,安装tools.选择重新安装VMware tools. (此图片为安装过的截图) 成功后会显示如图。…

【2024最新-python3小白零基础入门】No1.python简介以及环境搭建

文章目录 一 python3 简介二 python语言的特点三 python安装四 安装开发工具-pycharm五 新建一个python项目1.新建项目2 配置虚拟环境3 运行项目 一 python3 简介 Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。 Python 的设计具有很强的可读性&a…

批量置入视频封面:一分钟教程,简单易学

在视频制作过程中,为视频添加引人注目的封面是吸引观众的关键。而当我们需要批量处理多个视频时,如何快速、准确地置入封面就显得尤为重要。本文将为您揭示这一高效技巧,让您在一分钟内学会批量置入视频封面,提升视频的吸引力与观…

vite 如何设置 pwa,让网页类似 app 那样运行,使用插件 vite-plugin-pwa

vite 如何设置 pwa,让网页类似 app 那样运行,使用插件 vite-plugin-pwa 一、概述 情况还是那么个情况,还是原来的项目 vue2 改为 vitetsvue3 遇到的问题,今天这个问题是如何 在 Vite 环境下设置 PWA。 PWA 就是网页应用可以像 a…

java是值传递还是引用传递

1.前言 java是值传递;值传递是指在调用方法时将实际参数拷贝一份传递到方法中,这样在方法中如果对参数进行修改,将不会影响到实际参数;当传的是基本类型时,传的是值的拷贝,对拷贝变量的修改不影响原变量&a…

krpano官网文档翻译-------krpano Action脚本参考文档【krpano Actions / Scripting Reference】

🧑‍🎓 个人主页:《爱蹦跶的大A阿》 🔥当前正在更新专栏:《VUE》 、《JavaScript保姆级教程》、《krpano》 ​ ​ ✨ 前言 摘要:本文通过大量代码案例,手把手教你如何使用krpano的Action脚本实现各种交互控制和酷炫…

OpenAI ChatGPT-4开发笔记2024-01:开发环境

ChatGPT发展一日千里。工具、函数少则数日,多则数月就加入了Deprecated行列不再如预期般工作。元旦闲来无事,用最新的ChatGPT重写一下各种开发场景,全部实测通过。 开发环境: 电脑:两台笔记本:HP和MacBoo…

服务端性能测试——性能测试体系

目录: 1.性能测试介绍 性能测试介绍性能体系:性能测试与分析优化:行业流行性能压测工具介绍行业流行性能监控工具介绍行业流行性能剖析工具介绍性能测试流程与方法性能测试计划 计划:DAU,PV(perday),订单量…

HTTP 3xx状态码:重定向的场景与区别

HTTP 状态码是服务器响应请求时传递给客户端的重要信息。3xx 系列的状态码主要与重定向有关,用于指示请求的资源已被移动到不同的位置,需要采取不同的操作来访问。 一、301 Moved Permanently 定义: 服务器表明请求的资源已永久移动到一个新…

Fluids —— Volume VOP

P,当前体素位置;density,此场的值;ix, iy, iz,体素索引(0 ~ res-1);resx, resy, resz,当前volume的精度;center,当前volume的中心点;o…

STM32入门教程-2023版【3-3】gpio输入

关注 星标公众号 不错过精彩内容 大家好,我是硬核王同学,最近在做免费的嵌入式知识分享,帮助对嵌入式感兴趣的同学学习嵌入式、做项目、找工作! 上两小节我们已经把GPIO的结构和8种输入输出模式都讲完了,到这里还不懂的可以回…

记录汇川:ITP与Autoshop进行仿真连接

1、定义如下程序: 2、ITP新建工程: 3、依次选择,最后修改IP 4、定义两个变量 5、拖一个按钮和一个圈出来,地址绑定:M1 6、地址绑定:Y1 7、PLC启动仿真 8、ITP启动在线模拟器 9、即可实现模拟仿真

力扣——C语言:合并两个有序数组

88. 合并两个有序数组 - 力扣(LeetCode) 这道题有多种方法可以解决 一、暴力求解 这种方法最简单,我们只需要把两个数组合在一起然后在冒泡排序就可以了 代码如下: void merge(int* nums1, int nums1Size, int m, int* nums2…

Redis 过期删除策略

常见的三种过期删除策略: 定期删除;惰性删除;定时删除; 定期删除策略 每隔一段时间「随机」从数据库中取出一定数量的 key 进行检查,并删除其中的过期key。 定期删除的实现在 expire.c 文件下的 activeExpireCycle …

c++在结构(Struct)中使用栈(Stack)

栈实现 1.入栈 2.出栈 3.空栈 4.满栈 5.栈顶 完整栈实现源码: // // myStack.hpp // algo_demo // // Created by Hacker X on 2024/1/9. //#ifndef myStack_hpp #define myStack_

【驱动序列】C#获取电脑硬件之CPU信息,以及它都有那些品牌

欢迎来到《小5讲堂》,大家好,我是全栈小5。 这是是《驱动序列》文章,每篇文章将以博主理解的角度展开讲解, 特别是针对知识点的概念进行叙说,大部分文章将会对这些概念进行实际例子验证,以此达到加深对知识…

DAY2-English Learning

一、积累 1.trunk 案例: i put my luggage in the trunk of the car. 翻译:我把行李放在汽车的后备箱里。 2. solvent 例句:The sovlent is uesd to dissolve the paint. 翻译:溶剂是用来溶解油漆的。 3. 受伤的表达 1.cramp …