DeepSORT(目标跟踪算法) 卡尔曼滤波 状态向量是如何映射到观测向量(测量向量)的即观测矩阵的构建方式

本文主要是介绍DeepSORT(目标跟踪算法) 卡尔曼滤波 状态向量是如何映射到观测向量(测量向量)的即观测矩阵的构建方式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

DeepSORT(目标跟踪算法) 卡尔曼滤波 状态向量是如何映射到观测向量(测量向量)的即观测矩阵的构建方式

flyfish
测量向量和观测变量在卡尔曼滤波的上下文中通常是同一个意思。它们都指的是从系统中直接获得的数据,这些数据用于更新系统的状态估计。可以是从传感器或测量设备直接获得的数据。这些数据反映了系统在某一时刻的状态或者实际观测到的值,但通常带有噪声。

状态向量映射到观测向量的过程通过观测矩阵 H \mathbf{H} H 实现。观测矩阵 H \mathbf{H} H 描述了系统状态如何映射到观测值。下面通过一个具体的例子来详细说明这一过程。

构造观测矩阵 H \mathbf{H} H 的步骤包括:

  1. 定义状态变量:明确系统的状态变量。
  2. 定义观测变量:明确系统的观测变量。
  3. 写出观测方程:根据观测变量和状态变量之间的关系写出观测方程。
  4. 构造观测矩阵:根据观测方程提取观测矩阵 H \mathbf{H} H

例子:一维位置和速度的观测

假设我们有一个物体在一维直线上运动,我们希望估计其位置和速度,并且我们可以直接观测到位置,但不能直接观测到速度。

定义状态变量

状态向量定义为:
x k = [ x k v k ] \mathbf{x}_k = \begin{bmatrix} x_k \\ v_k \end{bmatrix} xk=[xkvk]
其中, x k x_k xk 是位置, v k v_k vk 是速度。

观测模型

我们可以直接测量位置 x k x_k xk,但不能直接测量速度 v k v_k vk。因此,观测向量定义为:
z k = [ z k ] \mathbf{z}_k = \begin{bmatrix} z_k \end{bmatrix} zk=[zk]
其中, z k z_k zk 是我们观测到的位置。

观测方程

观测方程描述了观测向量如何由状态向量生成。在这个例子中,观测向量只包含位置,因此观测矩阵 H \mathbf{H} H 为:
z k = H x k + v k \mathbf{z}_k = \mathbf{H} \mathbf{x}_k + \mathbf{v}_k zk=Hxk+vk
其中, v k \mathbf{v}_k vk 是观测噪声。

对于这个例子,观测矩阵 H \mathbf{H} H 是:
H = [ 1 0 ] \mathbf{H} = \begin{bmatrix} 1 & 0 \end{bmatrix} H=[10]

这样,观测方程可以写成:
z k = 1 ⋅ x k + 0 ⋅ v k + v k z_k = 1 \cdot x_k + 0 \cdot v_k + v_k zk=1xk+0vk+vk

即:
z k = x k + v k z_k = x_k + v_k zk=xk+vk

构造观测矩阵 H \mathbf{H} H

通过上面的分析,我们得到了观测矩阵 H \mathbf{H} H
H = [ 1 0 ] \mathbf{H} = \begin{bmatrix} 1 & 0 \end{bmatrix} H=[10]

另一个例子:二维位置和速度的观测

假设我们有一个物体在二维平面上运动,我们希望估计其二维位置和速度,并且我们可以直接观测到位置,但不能直接观测到速度。

定义状态变量

状态向量定义为:
x k = [ x k y k v x , k v y , k ] \mathbf{x}_k = \begin{bmatrix} x_k \\ y_k \\ v_{x,k} \\ v_{y,k} \end{bmatrix} xk= xkykvx,kvy,k
其中, x k x_k xk y k y_k yk 是位置, v x , k v_{x,k} vx,k v y , k v_{y,k} vy,k 是速度。

观测模型

我们可以直接测量位置 x k x_k xk y k y_k yk,但不能直接测量速度 v x , k v_{x,k} vx,k v y , k v_{y,k} vy,k。因此,观测向量定义为:
z k = [ z x , k z y , k ] \mathbf{z}_k = \begin{bmatrix} z_{x,k} \\ z_{y,k} \end{bmatrix} zk=[zx,kzy,k]
其中, z x , k z_{x,k} zx,k z y , k z_{y,k} zy,k 是我们观测到的位置。

观测方程

观测方程描述了观测向量如何由状态向量生成。在这个例子中,观测向量只包含位置,因此观测矩阵 H \mathbf{H} H 为:
z k = H x k + v k \mathbf{z}_k = \mathbf{H} \mathbf{x}_k + \mathbf{v}_k zk=Hxk+vk
其中, v k \mathbf{v}_k vk 是观测噪声。

对于这个例子,观测矩阵 H \mathbf{H} H 是:
H = [ 1 0 0 0 0 1 0 0 ] \mathbf{H} = \begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \end{bmatrix} H=[10010000]

这样,观测方程可以写成:
[ z x , k z y , k ] = [ 1 0 0 0 0 1 0 0 ] [ x k y k v x , k v y , k ] + [ v x , k v y , k ] \begin{bmatrix} z_{x,k} \\ z_{y,k} \end{bmatrix} = \begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \end{bmatrix} \begin{bmatrix} x_k \\ y_k \\ v_{x,k} \\ v_{y,k} \end{bmatrix} + \begin{bmatrix} v_{x,k} \\ v_{y,k} \end{bmatrix} [zx,kzy,k]=[10010000] xkykvx,kvy,k +[vx,kvy,k]

即:
[ z x , k z y , k ] = [ x k y k ] + [ v x , k v y , k ] \begin{bmatrix} z_{x,k} \\ z_{y,k} \end{bmatrix} = \begin{bmatrix} x_k \\ y_k \end{bmatrix} + \begin{bmatrix} v_{x,k} \\ v_{y,k} \end{bmatrix} [zx,kzy,k]=[xkyk]+[vx,kvy,k]

构造观测矩阵 H \mathbf{H} H

通过上面的分析,我们得到了观测矩阵 H \mathbf{H} H
H = [ 1 0 0 0 0 1 0 0 ] \mathbf{H} = \begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \end{bmatrix} H=[10010000]

测量向量(Measurement Vector)

测量向量包含实际观测或测量得到的数据。它通常是状态向量的一部分或线性变换。

  • 记作 z k \mathbf{z}_k zk,反映了系统在时间 k k k 的观测数据。

观测矩阵(Observation Matrix)

观测矩阵将状态向量映射到测量向量,表示从状态向量到测量向量的关系。它定义了哪些状态变量是可观测的以及如何被观测。

  • 记作 H k \mathbf{H}_k Hk,用于从状态向量中提取测量向量:
    z k = H k x k + v k \mathbf{z}_k = \mathbf{H}_k \mathbf{x}_k + \mathbf{v}_k zk=Hkxk+vk

关系与应用

  • 测量向量与观测矩阵:观测矩阵 H k \mathbf{H}_k Hk 描述了如何从状态向量 x k \mathbf{x}_k xk 中提取测量向量 z k \mathbf{z}_k zk。例如,如果我们只能测量位置而不能直接测量速度,那么观测矩阵可能是: H k = [ 1 0 ] \mathbf{H}_k = \begin{bmatrix} 1 & 0 \end{bmatrix} Hk=[10]

例子

假设我们要跟踪一个在平面上运动的物体,其状态包括位置和速度:

  • 状态向量 x k \mathbf{x}_k xk: x k = [ x k y k x ˙ k y ˙ k ] \mathbf{x}_k = \begin{bmatrix} x_k \\ y_k \\ \dot{x}_k \\ \dot{y}_k \end{bmatrix} xk= xkykx˙ky˙k 这里 x k x_k xk y k y_k yk 是位置, x ˙ k \dot{x}_k x˙k y ˙ k \dot{y}_k y˙k 是速度。
  • 状态转移矩阵 A k \mathbf{A}_k Ak: A k = [ 1 0 Δ t 0 0 1 0 Δ t 0 0 1 0 0 0 0 1 ] \mathbf{A}_k = \begin{bmatrix} 1 & 0 & \Delta t & 0 \\ 0 & 1 & 0 & \Delta t \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} Ak= 10000100Δt0100Δt01 这表示位置随时间步长 Δ t \Delta t Δt 变化。
  • 测量向量 z k \mathbf{z}_k zk: z k = [ z x k z y k ] \mathbf{z}_k = \begin{bmatrix} z_{x_k} \\ z_{y_k} \end{bmatrix} zk=[zxkzyk]这里 z x k z_{x_k} zxk z y k z_{y_k} zyk 是测量得到的位置。
  • 观测矩阵 H k \mathbf{H}_k Hk: H k = [ 1 0 0 0 0 1 0 0 ] \mathbf{H}_k = \begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \end{bmatrix} Hk=[10010000]这表示我们只测量位置,而速度不可测。

在卡尔曼滤波中,预测步骤利用状态转移矩阵和控制输入预测系统的下一个状态。具体步骤如下:

测量向量通过观测矩阵可以得到预测测量值。这一过程是将状态向量映射到测量空间的关键步骤,用于比较实际测量值和预测测量值,从而更新状态估计。观测矩阵和测量残差一起在卡尔曼滤波器中发挥作用,使得状态估计更加准确和可靠。

观测矩阵的作用

观测矩阵(Observation Matrix)描述了状态向量与测量向量之间的关系。它将状态向量映射到测量空间,使得可以从状态向量中提取出测量向量。

测量向量与预测测量值

假设系统的状态向量为 x k \mathbf{x}_k xk,测量向量为 z k \mathbf{z}_k zk,观测矩阵为 H k \mathbf{H}_k Hk。观测矩阵将状态向量映射到测量空间,得到预测测量值(或估计测量值) z ^ k \hat{\mathbf{z}}_k z^k
z ^ k = H k x k \hat{\mathbf{z}}_k = \mathbf{H}_k \mathbf{x}_k z^k=Hkxk

具体步骤

  1. 预测步骤:利用状态转移矩阵和控制输入预测下一时刻的状态向量 x ^ k ∣ k − 1 \hat{\mathbf{x}}_{k|k-1} x^kk1
  2. 计算预测测量值:利用观测矩阵 H k \mathbf{H}_k Hk 将预测状态向量 x ^ k ∣ k − 1 \hat{\mathbf{x}}_{k|k-1} x^kk1 转换为预测测量值 z ^ k \hat{\mathbf{z}}_k z^k
    z ^ k = H k x ^ k ∣ k − 1 \hat{\mathbf{z}}_k = \mathbf{H}_k \hat{\mathbf{x}}_{k|k-1} z^k=Hkx^kk1
  3. 更新步骤:比较预测测量值 z ^ k \hat{\mathbf{z}}_k z^k 和实际测量值 z k \mathbf{z}_k zk,计算测量残差 y k \mathbf{y}_k yk,并用它来更新状态向量和误差协方差矩阵。

例子

假设我们跟踪一个物体,其状态向量包括位置和速度:
x k = [ x k y k x ˙ k y ˙ k ] \mathbf{x}_k = \begin{bmatrix} x_k \\ y_k \\ \dot{x}_k \\ \dot{y}_k \end{bmatrix} xk= xkykx˙ky˙k
假设我们只能测量位置,而不能直接测量速度,观测矩阵可以表示为:
H k = [ 1 0 0 0 0 1 0 0 ] \mathbf{H}_k = \begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \end{bmatrix} Hk=[10010000]
假设在时间步长 k k k 的预测状态向量为:
x ^ k ∣ k − 1 = [ 10 15 1 − 1 ] \hat{\mathbf{x}}_{k|k-1} = \begin{bmatrix} 10 \\ 15 \\ 1 \\ -1 \end{bmatrix} x^kk1= 101511
观测矩阵将状态向量映射到测量空间,得到预测测量值:
z ^ k = H k x ^ k ∣ k − 1 = [ 1 0 0 0 0 1 0 0 ] [ 10 15 1 − 1 ] = [ 10 15 ] \hat{\mathbf{z}}_k = \mathbf{H}_k \hat{\mathbf{x}}_{k|k-1} = \begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \end{bmatrix} \begin{bmatrix} 10 \\ 15 \\ 1 \\ -1 \end{bmatrix} = \begin{bmatrix} 10 \\ 15 \end{bmatrix} z^k=Hkx^kk1=[10010000] 101511 =[1015]

测量残差和更新

实际测量值可能为:
z k = [ 11 14 ] \mathbf{z}_k = \begin{bmatrix} 11 \\ 14 \end{bmatrix} zk=[1114]
测量残差(或创新)为:
y k = z k − z ^ k = [ 11 14 ] − [ 10 15 ] = [ 1 − 1 ] \mathbf{y}_k = \mathbf{z}_k - \hat{\mathbf{z}}_k = \begin{bmatrix} 11 \\ 14 \end{bmatrix} - \begin{bmatrix} 10 \\ 15 \end{bmatrix} = \begin{bmatrix} 1 \\ -1 \end{bmatrix} yk=zkz^k=[1114][1015]=[11]
测量残差用于更新预测状态,使其更接近实际测量值。更新后的状态向量和误差协方差矩阵通过卡尔曼增益 K k \mathbf{K}_k Kk 进行修正:
x ^ k ∣ k = x ^ k ∣ k − 1 + K k y k \hat{\mathbf{x}}_{k|k} = \hat{\mathbf{x}}_{k|k-1} + \mathbf{K}_k \mathbf{y}_k x^kk=x^kk1+Kkyk
P k ∣ k = ( I − K k H k ) P k ∣ k − 1 \mathbf{P}_{k|k} = (\mathbf{I} - \mathbf{K}_k \mathbf{H}_k) \mathbf{P}_{k|k-1} Pkk=(IKkHk)Pkk1

这篇关于DeepSORT(目标跟踪算法) 卡尔曼滤波 状态向量是如何映射到观测向量(测量向量)的即观测矩阵的构建方式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1058435

相关文章

Java中的雪花算法Snowflake解析与实践技巧

《Java中的雪花算法Snowflake解析与实践技巧》本文解析了雪花算法的原理、Java实现及生产实践,涵盖ID结构、位运算技巧、时钟回拨处理、WorkerId分配等关键点,并探讨了百度UidGen... 目录一、雪花算法核心原理1.1 算法起源1.2 ID结构详解1.3 核心特性二、Java实现解析2.

java实现docker镜像上传到harbor仓库的方式

《java实现docker镜像上传到harbor仓库的方式》:本文主要介绍java实现docker镜像上传到harbor仓库的方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录1. 前 言2. 编写工具类2.1 引入依赖包2.2 使用当前服务器的docker环境推送镜像2.2

springboot项目打jar制作成镜像并指定配置文件位置方式

《springboot项目打jar制作成镜像并指定配置文件位置方式》:本文主要介绍springboot项目打jar制作成镜像并指定配置文件位置方式,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录一、上传jar到服务器二、编写dockerfile三、新建对应配置文件所存放的数据卷目录四、将配置文

Java继承映射的三种使用方法示例

《Java继承映射的三种使用方法示例》继承在Java中扮演着重要的角色,它允许我们创建一个类(子类),该类继承另一个类(父类)的所有属性和方法,:本文主要介绍Java继承映射的三种使用方法示例,需... 目录前言一、单表继承(Single Table Inheritance)1-1、原理1-2、使用方法1-

gitlab安装及邮箱配置和常用使用方式

《gitlab安装及邮箱配置和常用使用方式》:本文主要介绍gitlab安装及邮箱配置和常用使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1.安装GitLab2.配置GitLab邮件服务3.GitLab的账号注册邮箱验证及其分组4.gitlab分支和标签的

C++中零拷贝的多种实现方式

《C++中零拷贝的多种实现方式》本文主要介绍了C++中零拷贝的实现示例,旨在在减少数据在内存中的不必要复制,从而提高程序性能、降低内存使用并减少CPU消耗,零拷贝技术通过多种方式实现,下面就来了解一下... 目录一、C++中零拷贝技术的核心概念二、std::string_view 简介三、std::stri

Linux脚本(shell)的使用方式

《Linux脚本(shell)的使用方式》:本文主要介绍Linux脚本(shell)的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录概述语法详解数学运算表达式Shell变量变量分类环境变量Shell内部变量自定义变量:定义、赋值自定义变量:引用、修改、删

python判断文件是否存在常用的几种方式

《python判断文件是否存在常用的几种方式》在Python中我们在读写文件之前,首先要做的事情就是判断文件是否存在,否则很容易发生错误的情况,:本文主要介绍python判断文件是否存在常用的几种... 目录1. 使用 os.path.exists()2. 使用 os.path.isfile()3. 使用

Mybatis的分页实现方式

《Mybatis的分页实现方式》MyBatis的分页实现方式主要有以下几种,每种方式适用于不同的场景,且在性能、灵活性和代码侵入性上有所差异,对Mybatis的分页实现方式感兴趣的朋友一起看看吧... 目录​1. 原生 SQL 分页(物理分页)​​2. RowBounds 分页(逻辑分页)​​3. Page

Linux链表操作方式

《Linux链表操作方式》:本文主要介绍Linux链表操作方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、链表基础概念与内核链表优势二、内核链表结构与宏解析三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势六、典型应用场景七、调试技巧与