无人驾驶卡尔曼滤波

无人驾驶卡尔曼滤波(行人检测)
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 printing

x = 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.09

R = 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.T

m = 200
vx = 20
vy = 10

mx = 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 * x
    P = F * P * F.T + Q
    S = (H * P * H.T) + R
    K = (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)) * P

    savestates(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()

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

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

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

相关文章

vivado 导入工程、TCL创建工程命令、

导入外部项目 您可以使用导入在Vivado IDE外部创建的现有RTL级项目文件Synopsys Synplify。Vivado IDE检测项目中的源文件并自动添加文件到新项目。设置,如顶部模块、目标设备和VHDL库 分配是从现有项目导入的。 1.按照创建项目中的步骤进行操作。 2.在“项目类…

Linux学习(13)——系统安全及应用

一、账号安全基本措施 1、系统账号清理 将非登录用户的Shell设为/sbin/nologin,及将用户设置为无法登录 锁定长期不使用的账户 删除无用的账户 锁定账户密码 本质锁定 shell——/sbin/nologin却比较特殊,所谓“无法登陆”指的仅是这个用户无法使用bash或其他sh…

忆阻器芯片STELLAR权重更新算法(清华大学吴华强课题组)

参考文献(清华大学吴华强课题组) Zhang, Wenbin, et al. “Edge learning using a fully integrated neuro-inspired memristor chip.” Science 381.6663 (2023): 1205-1211. STELLAR更新算法原理 在权值更新阶段,只需根据输入、输出和误差…

Qt/QML编程学习之心得:一个蓝牙音乐播放器的实现(30)

蓝牙bluetooth作为一种短距离的通信方式应用也是越来越广,比如很多智能家居、蓝牙遥控器、蓝牙音箱、蓝牙耳机、蓝牙手表等,手机的蓝牙功能更是可以和各种设备进行互联,甚至可以连接到车机上去配合wifi提供投屏、音乐等。那么如何在中控IVI上使用Qt来实现一个蓝牙音乐播放器…

山东名岳轩印刷包装携专业包装袋盛装亮相2024济南生物发酵展

山东名岳轩印刷包装有限公司盛装亮相2024第12届国际生物发酵展,3月5-7日山东国际会展中心与您相约! 展位号:1号馆F17 山东名岳轩印刷包装有限公司是一家拥有南北两个生产厂区,设计、制版、印刷,营销策划为一体的专业…

编译原理期末大题步骤——例题

一、预测分析方法步骤 提取左公因子,消除左递归判断文法是否为LL(1)文法若是,构造预测分析表;否则,不能进行分析。根据预测分析表对输入串进行分析 例子: 文法G[E]: …

C#:让不安全代码(unsafe)运行起来

C#:让不安全代码(unsafe)运行起来 当我们VS中编写unsafe代码时,显示不能运行 这时只需要按照这里的提示,修改我们的属性设置即可 这样就可以运行了

AQS应用之BlockingQueue详解

概要 AQS全称是 AbstractQueuedSynchronizer,中文译为抽象队列式同步器。BlockingQueue,是java.util.concurrent 包提供的用于解决并发生产者 - 消费者问题的最有用的类,它的特性是在任意时刻只有一个线程可以进行take或者put操作&#xff0…

近似点梯度法

最优化笔记——Proximal Gradient Method 最优化笔记,主要参考资料为《最优化:建模、算法与理论》 文章目录 最优化笔记——Proximal Gradient Method一、邻近算子(1)定义 二、近似点梯度法(1)迭代格式&…

4.4 媒资管理模块 - 分布式任务处理介绍、视频处理技术方案

媒资管理模块 - 视频处理 文章目录 媒资管理模块 - 视频处理一、视频转码1.1 视频转码介绍1.2 FFmpeg 基本使用1.2.1 下载安装配置1.2.2 转码测试 1.3 工具类1.3.1 VideoUtil1.3.2 Mp4VideoUtil1.3.3 测试工具类 二、分布式任务处理2.1 分布式任务调度2.2 XXL-JOB 配置执行器 中…

Java诊断利器Arthas

https://arthas.aliyun.com/doc/https://arthas.aliyun.com/doc/ 原理 利用java.lang.instrument(容器类) 做动态 Instrumentation(执行容器) 是 JDK5 的新特性。使用 Instrumentation,开发者可以构建一个独立于应用程序的代理程序(Agent)&…

three.js实现电子围栏效果(纹理贴图)

three.js实现电子围栏效果&#xff08;纹理贴图&#xff09; 实现步骤 围栏的坐标坐标转换为几何体顶点&#xff0c;uv顶点坐标加载贴图&#xff0c;移动 图例 代码 <template><div class"app"><div ref"canvesRef" class"canvas-…

自带恒压恒流环路的降压型单片车充专用芯片

一、基本概述 XL2009是一款高效降压型DC-DC转换器&#xff0c;固定180KHz开关频率&#xff0c;可以提供最高2.5A输出电流能力&#xff0c;具有低纹波&#xff0c;出色的线性调整率与负载调整率特点。XL2009内置固定频率振荡器与频率补偿电路&#xff0c;简化了电路设计。 PWM …

基于图像合成和注意力的深度神经网络从计算机断层扫描灌注图像中自动分割缺血性脑卒中病变

Automatic ischemic stroke lesion segmentation from computed tomography perfusion images by image synthesis and attention-based deep neural networks 基于图像合成和注意力的深度神经网络从计算机断层扫描灌注图像中自动分割缺血性脑卒中病变背景贡献实验Comparison o…

EMQX5设置客户端连接认证

文章目录 说明配置客户端连接认证配置1、访问控制-客户端认证-创建2、选择“密码”方式-下一步3、选择“内置数据库”-下一步4、账号类型选择“username”5、密码加密方式选择“plain”6、加盐方式“disable”-创建7、添加客户端连接的账密客户端连接验证 心得 说明 号外&…

旋变检测AD2s1205手册学习笔记

旋变故障检测故障表 信号丢失检测 检测原理&#xff1a;任一旋变输入(正弦或余弦)降至指定的LOS正弦/余弦阈值 以下时&#xff0c;器件会检测到信号丢失(LOS)。AD2S1205通过将 监视信号与固定最小值进行比较检测此点 丢失的效果表现&#xff1a;LOS由DOS和LOT引脚均闩锁为逻辑…

从文本(.txt)文件中读取数据时出现中文乱码

前言 当需要从记事本中读取数据时&#xff0c;发现读取的数据会出现中文乱码&#xff0c;我尝试了C和C读取文件&#xff0c;发现都是这样。 乱码原因 文本文件的保存默认使用UTF-8编码方式&#xff0c;而VS编译器的编码方式是GBK&#xff0c;所以不同的编码方式导致了乱码。…

OCP NVME SSD规范解读-5.命令超时限制-2

Sanitize清除的数据很彻底&#xff0c;对FTL映射表、User Data(包括已经写入NAND和仍在cache里的)、Meta Data、安全密匙、CMB中SQ/CQ相关信息、可能含有用户数据的log等等会全部清除。不过&#xff0c;sanitize操作不会改变RPMB、boot分区、不包含用户数据的cache等内容。 RP…

关于burpsuite对app(移动端)进行抓包的配置

可以使用手机模拟器&#xff0c;我这里以自己手机&#xff08;物理机&#xff09;演示配置过程 如果是使用的模拟器那么肯定和电脑是在同一局域网 如果使用物理机&#xff0c;那么可以通过连接同一WiFi确保在同一局域网环境下 查看电脑内网ip&#xff1a;192.168.1.105 &am…

Android 正圆

<?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"wrap_content"android:layout_height"wrap_content"android:padding&…