Coursera自动驾驶2.1——最小二乘法和线性和非线性卡尔曼滤波

news2024/11/22 22:35:11

文章目录

  • 一、最小二乘法
    • 1.最小二乘法
    • 2.加权最小二乘法
    • 3.递归最小二乘法
    • 4.最小二乘法与极大似然
  • 二、卡尔曼滤波
    • 1.概述
    • 2.线性卡尔曼滤波
    • 3.扩展卡尔曼滤波
      • Error State卡尔曼滤波
    • 4.无迹卡尔曼滤波
      • (1)无迹变换
      • (2)无迹卡尔曼滤波

一、最小二乘法

1.最小二乘法

2.加权最小二乘法

3.递归最小二乘法

4.最小二乘法与极大似然

二、卡尔曼滤波

1.概述

卡尔曼滤波器与线性递归最小二乘滤波器非常相似。递归最小二乘可以更新参数的估计值,但卡尔曼滤波器却能够对状态量进行估计和更新。卡尔曼滤波器的目标是对该状态量进行概率估计,主要是分两步实时更新:预测和修正。
在这里插入图片描述

  • 首先从时间 k − 1 时的初始概率估计开始,我们使用从车轮里程计或惯性传感器测量得出的数据使用运动模型来预测汽车的位置。
  • 然后,我们使用从 GPS或Lidar 测量得出的数据并使用测量模型来修正 k 时刻汽车的位置。这里,我们可以将卡尔曼滤波器视为一种融合来自不同传感器的信息对未知状态进行最终估计的技术,并同时考虑到运动和测量模型中的不确定性。

2.线性卡尔曼滤波

首先定义汽车的运动模型
x k = F k − 1 x k − 1 + G k − 1 u k − 1 + w k − 1 x_{k} = F_{k-1}x_{k-1}+G_{k-1}u_{k-1}+w_{k-1} xk=Fk1xk1+Gk1uk1+wk1
其中   F k − 1 \ F_{k-1}  Fk1是系统状态转移矩阵,   G k − 1 \ G_{k-1}  Gk1是系统控制矩阵,   u k \ u_{k}  uk是系统输入信号,   w k − 1 \ w_{k-1}  wk1是过程噪声

之后定义测量模型
y k = H k x k + v k y_{k} = H_{k}x_{k}+v_{k} yk=Hkxk+vk
其中   H k \ H_{k}  Hk是测量矩阵,   v k \ v_{k}  vk是测量噪声

卡尔曼滤波的过程如下:
在这里插入图片描述

  1. 首先,我们使用运动模型来预测:
    x ˇ k = F k − 1 x k − 1 + G k − 1 u k − 1 P ˇ k = F k − 1 P ^ k − 1 F k − 1 T + Q k − 1 \check{x} _{k} = F_{k-1}x_{k-1}+G_{k-1}u_{k-1}\\ \check{P}_{k}= F_{k-1}\hat{P}_{k-1}F_{k-1}^{T} +Q_{k-1} xˇk=Fk1xk1+Gk1uk1Pˇk=Fk1P^k1Fk1T+Qk1
  2. 然后,我们计算卡尔曼增益:
    K k = P ˇ k H k T ( H k P ˇ k H k T + R k ) − 1 K_{k}=\check{P}_{k}H_{k}^{T}(H_{k}\check{P}_{k}H_{k}^{T}+{R}_{k})^{-1} Kk=PˇkHkT(HkPˇkHkT+Rk)1
  3. 最后,修正系统状态量和协方差矩阵:
    x ^ k = x ˇ k + K k ( y k − H k x ˇ k ) P ^ k = ( I − K k H k ) P ˇ k \hat{x} _{k} = \check{x} _{k}+K_{k}(y_{k}-H_{k}\check{x} _{k})\\ \hat{P} _{k} =(I-{K} _{k}{H} _{k})\check{P} _{k} x^k=xˇk+Kk(ykHkxˇk)P^k=(IKkHk)Pˇk

在噪声期望为零则不相关的情况下,卡尔曼滤波器是无偏且一致的,即满足以下数学关系:
E [ e k ^ ] = 0 E [ e k ^ e ^ k T ] = P k ^ E[\hat{e_{k} } ] = 0 \\ E[\hat{e_{k}}\hat{e}_{k}^{T}] = \hat{P_{k}} E[ek^]=0E[ek^e^kT]=Pk^
通常,如果我们有白色不相关的零期望噪声,则卡尔曼滤波器是最好的(即最低方差)无偏估计滤波器,它以最小的方差进行无偏估计。

3.扩展卡尔曼滤波

为了对非线性系统进行状态估计,我们将使用称作扩展卡尔曼滤波的状态估计算法。扩展卡尔曼滤波的关键是线性化非线性系统,这里需要用到泰勒展开式。泰勒展开后通常只保留一阶部分,略去高阶部分。

对于非线性系统运动模型和测量模型,我们需要对它们进行线性化处理。我们选择状态的最新估计值作为泰勒展开点,得到如下公式
在这里插入图片描述
对于测量模型,线性化处理为:
在这里插入图片描述
在以上公式中,   F k − 1 \ F_{k-1}  Fk1   L k − 1 \ L_{k-1}  Lk1   H k \ H_{k}  Hk   M k \ M_{k}  Mk 被称为系统的Jacobian矩阵。Jacobian矩阵是一个包含所有一阶偏导数的矩阵。如下图所示:
在这里插入图片描述
将它们代入我们的标准卡尔曼滤波器方程中,含有雅可比矩阵的扩展卡尔曼滤波器方程为:
在这里插入图片描述

Error State卡尔曼滤波

在ES-EKF中,我们将使用EKF估计误差状态,误差状态就是在任何给定时间名义状态(汽车估计位置)和真值状态(汽车真实位置)之间的差异,然后使用误差状态估计值修正名义状态。在运动模型和测量模型中误差状态表示如下:
在这里插入图片描述
ES-EKF的处理方法如下:

  1. 首先使用非线性运动模型和当前状态的最佳估计来更新名义状态。
    x k ˇ = f k − 1 ( x k − 1 , u k − 1 , 0 ) \check{x_{k}} =f_{k-1}(x_{k-1}, u_{k-1}, 0) xkˇ=fk1(xk1,uk1,0)
  2. 然后是预测协方差矩阵。
    P k ˇ = F k − 1 P k − 1 F k − 1 T + L k − 1 Q k − 1 L k − 1 T \check{P_{k}} =F_{k-1}P_{k-1}F_{k-1}^{T}+L_{k-1}Q_{k-1}L_{k-1}^{T} Pkˇ=Fk1Pk1Fk1T+Lk1Qk1Lk1T
  3. 当有新的测量值到来时,首先计算卡尔曼增益:
    K k = P k ˇ H k T ( H k P k ˇ H k T + R ) − 1 K_{k}=\check{P_{k}}H_{k}^{T}(H_{k}\check{P_{k}}H_{k}^{T}+R)^{-1} Kk=PkˇHkT(HkPkˇHkT+R)1
  4. 然后是计算误差状态。
    δ x k ^ = K k ( y k − h k ( x k ˇ , 0 ) \delta \hat{x_{k}} =K_{k}(y_{k}-h_{k}(\check{x_{k}}, 0) δxk^=Kk(ykhk(xkˇ,0)
  5. 修正名义状态。
    x k ^ = x k ˇ + δ x k ^ \hat{x_{k}} = \check{x_{k}}+\delta \hat{x_{k}} xk^=xkˇ+δxk^
  6. 最后更新协方差矩阵。
    P k ^ = ( I − K k H k ) P k ˇ \hat{P_{k}} =(I-K_{k}H_{k})\check{P_{k}} Pk^=(IKkHk)Pkˇ

EKF的使用限制:

  • 容易产生线性化误差,特别时当系统运动模型和测量模型高度非线性时;或当传感器采样时间过慢时(与自动驾驶汽车速度相比),也会产生很大的线性化误差。
  • 线性化误差很大时,会产生两个结果:一是估计值可能与真实值相差很大,二是估计协方差可能无法准确捕捉状态的真实不确定性,这会导致整个系统发散,而且通常很难再收敛回来。
  • 在实践中最常见的问题是在计算雅可比矩阵时很容易出错,尤其是在处理复杂的非线性系统时。工程上也有人试图通过使用数值微分或在编译时使用自动微分来解决这个问题。但是这些都有自己的陷阱,有时会表现得不可预测。

4.无迹卡尔曼滤波

(1)无迹变换

无迹变换的背后思想是:近似概率分布比近似任意非线性函数更容易。无迹变换的基本思想分为三个步骤。

  1. 首先,我们从输入分布中选择一组样本点。这些不是随机样本,它们是确定性样本,它们被选择为远离平均值一定数量的标准差。出于这个原因,这些样本被称为 sigma points。
  2. 第二个步骤是将每个 sigma point 通过非线性函数,产生一组属于输出分布的新sigma point。
  3. 最后,我们可以使用一些精心选择的权重来计算输出 sigma points的样本均值和协方差,这将使我们能够很好地近似真实输出分布的均值和协方差。

在这里插入图片描述
这其中有两个重要步骤,分别是

  • 选取sigma point:通常,对于n nn维概率分布,我们需要 2 n + 1 2n+12n+1 个 sigma point,一个为均值,其余关于均值对称分布。选取 sigma point 的第一步是对输入分布的协方差矩阵进行 Cholesky分解,我们就可以选择分布均值作为第一个 sigma point,其余 sigma point 的选择可以用图中的公式来实现。其中 κ参数一般取值为3,N为维度。

在这里插入图片描述

  • 计算均值和方差:首先通过非线性函数得到一组新的sigma point,之后通过这些点计算均值和方差,如下图所示
    在这里插入图片描述

(2)无迹卡尔曼滤波

无迹卡尔曼滤波主要思想是:使用无损变换来直接逼近概率分布函数。

首先是预测步,主要包含三步:选取sigma point;非线性转换;计算新的均值和方差

在这里插入图片描述
之后是修正步,主要包含四步,分别是计算预测测量;计算预测测量的均值和方差;计算卡尔曼增益;计算修正后的均值和方差

在这里插入图片描述
综上所述,三种卡尔曼滤波器的主要区别在于 EKF 依靠局部分析线性化来通过非线性函数传播 PDF,无论是EKF 还是 ES-EKF。相比之下,UKF 依靠无损变换来处理非线性函数。三者对比如下表示所示。
在这里插入图片描述

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

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

相关文章

I.MX6ull 中断 一

一 I.MX6ull 中断介绍 1 中断类型 Cortex-A7内核有8个异常中断,这8个异常中断的中断向量表如下表所示: Cortex-A 内核 CPU 的所有外部中 断都属于这个 IRQ 中断,当任意一个外部中断发生的时候都会触发 IRQ 中断。在 IRQ 中断服 务函数里面就…

linux php8.2安装swoole扩展

下载swoole源码: wget https://wenda-1252906962.file.myqcloud.com/dist/swoole-src-5.0.2.tar.gz tar -zxvf swoole-src-5.0.2.tar.gz cd swoole-src-5.0.2/ 初始化: /www/server/php/82/bin/phpize 配置检查: ./configure --with-…

JDK17在Windows安装以及环境变量配置(超详细的教程)

目录 一、JDK17的安装包下载 二、安装JDK17 第一步:运行JDK的EXE文件 第二步:选择下一步 第三步:选择安装目录 第四步:安装完成 三、配置JDK17的环境变量 第一步:打开系统属性界面 第二步:打开高级…

C#,码海拾贝(31)——约化“对称矩阵“为“对称三对角阵“的“豪斯荷尔德Householder变换法“之C#源代码,《C#数值计算算法编程》源代码升级改进版

using System; namespace Zhou.CSharp.Algorithm { /// <summary> /// 矩阵类 /// 作者&#xff1a;周长发 /// 改进&#xff1a;深度混淆 /// https://blog.csdn.net/beijinghorn /// </summary> public partial class Matrix {…

数据库信息速递 数据库基础设施已经不在青睐 ETL (译)

开头还是介绍一下群&#xff0c;如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请联系 liuaustin3 &#xff0c;在新加的朋友会分到2群&#xff08;共…

RabbitMq的高级特性--RabbitMQ高级特性_消息存活时间

RabbitMQ高级特性_消费端限流 &#xff0c; [解耦&#xff0c; 限流&#xff0c;降低压力&#xff0c;发送消息] 通过消费端限流的 方式限制消息的拉取速度&#xff0c;达到保护消费端的目的。 下面我们新建springboot项目进行测试&#xff1a; 新建项目myproducer 依赖&am…

chatgpt赋能python:Python关联算法:从数据挖掘到推荐系统

Python关联算法&#xff1a;从数据挖掘到推荐系统 Python编程语言已经成为各行各业中数据科学家和工程师的首选语言&#xff0c;其中包括处理数据集合的关联算法。 什么是关联算法&#xff1f; 数学上&#xff0c;关联算法是指在大型和复杂数据集合中&#xff0c; 寻找数据之…

干货 | 携程10个有效降低客户端超时的方法

作者简介 Wen&#xff0c;携程资深后端开发工程师&#xff0c;专注系统性能、稳定性、交易系统等领域。 一、背景 在现今的信息时代&#xff0c;微服务技术已成为一种重要的解决方案&#xff0c;微服务技术可以使系统的规模和功能变的更加灵活&#xff0c;从而获得更高的可扩展…

docker基本命令学习 | Docker网络、Docker镜像发布

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; docker安装、卸载 docker安装使用 卸载旧版本docker或者环境 [rootiZf8zdcobr3fw7vn0p3538Z /]# yum remove docker \ > docker-client \ >…

打破逢节降价桎梏!海尔智家:满足用户,全网第一

又是一年618&#xff0c;每到这个上半年最重要的消费节点&#xff0c;许多品牌卖家纷纷掀起价格战。 他们使出满减、满赠、满返等五花八门的策略&#xff0c;为了压制对手进行冲量&#xff0c;这也一度让“逢节降价”成为主流。 在市场天平偏向卖家的时代&#xff0c;这些策略…

SVN服务端visualsvn5.1.4下载安装(windows环境)(实操)

Apache Subversion 通常被缩写成 SVN&#xff0c;是一个开放源代码的版本控制系统&#xff0c;Subversion 在 2000 年由 CollabNet Inc 开发&#xff0c;现在发展成为 Apache 软件基金会的一个项目&#xff0c;同样是一个丰富的开发者和用户社区的一部分。 SVN相对于的RCS、CVS…

做自己喜欢的事

这两天沸沸扬扬的消息说稚辉君公司拿到了百度投资 稚晖君刚拿了百度投资&#xff0c;估值被曝已超独角兽 然后昨晚上小孩发烧&#xff0c;我陪床不敢死睡&#xff0c;跟大佬聊了下拿到投资的感受。 然后说到搞技术好玩这个事情&#xff0c;我就跟他分享了我前天到经历 我前天到…

Jenkins概念及安装配置教程(二)

如何安装Jenkins&#xff1f; Jenkins 安装程序也可以作为通用 Java 包 (.war) 使用。如果您将 Jenkins 与 Selenium 一起用于执行跨浏览器测试&#xff0c;我们建议使用 .war 文件&#xff0c;因为您可以通过在非无头模式下在浏览器上执行的自动化测试来见证测试场景的执行。…

【C# 10 和 .NET 6】使用MVC模式构建网站(笔记1)

Building Websites Using the Model-View-Controller Pattern 使用模型-视图-控制器模式构建网站 本章介绍使用 Microsoft ASP.NET Core MVC 在服务器端构建具有现代 HTTP 架构的网站&#xff0c;包括构成 ASP.NET Core MVC 项目的启动配置、身份验证、授权、路由、请求和响应管…

如何设计和使用文档模板 | 技术写作什么鬼

今天看到叶伟民老师的一篇文章&#xff0c;瞬间泪目&#xff1a;叶老师&#xff0c;您是懂人性的啊。在我整天鞭策自己“不能再拖了”的关键时刻&#xff0c;及时分享经验&#xff1a; 是的&#xff0c;这篇文章实在是拖了太久&#xff0c;了太久&#xff0c;太久&#xff0c;久…

web前端 --- javascript(03) -- 函数、内置对象

函数&#xff08;function&#xff09; 具有名称的&#xff0c;为了实现特定功能的代码集合体 &#xff08;1&#xff09;javascript如何定义函数&#xff1a;function关键字定义 function 函数名称 &#xff08;[ 参数列表 ]&#xff09;{ // 函数体 // [return 返回值]…

【Springboot】发送QQ邮件

系列文章目录 文章目录 系列文章目录前言添加Maven依赖QQ邮箱开启POP服务配置application.properties文件Controller层编写 vue前端&#xff08;也可以直接省略&#xff09; 前言 这篇博客用于简单实现SpringBoot中使用Controller发送邮件请求&#xff0c;用户可以收到邮件。 …

Python读写access数据库的实战代码

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

chatgpt赋能python:使用Python关闭端口的方法

使用Python关闭端口的方法 在网络安全中&#xff0c;关闭端口是非常重要的一项任务。一旦一个端口被打开并暴露给互联网&#xff0c;恶意用户就可能通过它们的攻击进入您的服务器或计算机系统。Python是一种流行的编程语言&#xff0c;也可以用来关闭端口。下面介绍一些常用的…

JSONSQL:使用SQL过滤JSON类型数据(支持多种数据库常用查询、统计、平均值、最大值、最小值、求和语法)...

1. 简介 在开发中&#xff0c;经常需要根据条件过滤大批量的JSON类型数据。如果仅需要过滤这一种类型&#xff0c;将JSON转为List后过滤即可&#xff1b;如果相同的条件既想过滤数据库表中的数据、也想过滤内存中JSON数据&#xff0c;甚至想过滤Elasticsearch中的数据&#xff…