DeepSORT(目标跟踪算法) 卡尔曼滤波 状态空间模型的理解

DeepSORT(目标跟踪算法) 卡尔曼滤波 状态空间模型的理解

flyfish

卡尔曼滤波器是一种用于估计动态系统状态的递归算法,它基于状态空间模型进行工作。状态空间模型由两个主要方程组成:状态方程和观测方程

状态方程描述系统的状态如何随时间演变,而观测方程描述如何通过测量值观察到系统的状态。

状态空间模型可以表示为:

  1. 状态方程
    x k = F x k − 1 + B u k + w k \mathbf{x}_{k} = \mathbf{F} \mathbf{x}_{k-1} + \mathbf{B} \mathbf{u}_{k} + \mathbf{w}_{k} xk=Fxk1+Buk+wk
  2. 观测方程
    z k = H x k + v k \mathbf{z}_{k} = \mathbf{H} \mathbf{x}_{k} + \mathbf{v}_{k} zk=Hxk+vk
    其中:
  • x k \mathbf{x}_{k} xk 是时刻 k k k 的状态向量。
  • F \mathbf{F} F 是状态转移矩阵,描述状态如何从 k − 1 k-1 k1 时刻转移到 k k k 时刻。
  • B \mathbf{B} B 是控制输入矩阵,描述控制向量 u k \mathbf{u}_{k} uk 对状态的影响。
  • w k \mathbf{w}_{k} wk 是过程噪声,假定为零均值的高斯白噪声。
  • z k \mathbf{z}_{k} zk 是时刻 k k k 的观测向量。
  • H \mathbf{H} H 是观测矩阵,描述状态向量如何映射到观测向量。
  • v k \mathbf{v}_{k} vk 是观测噪声,假定为零均值的高斯白噪声。
    为了说明卡尔曼滤波中的状态空间模型和矩阵乘法之间的关系,下面举两个具体的例子:

例子 1:一维位置和速度估计

假设我们有一个在直线上运动的物体,我们希望估计它的位置信息和速度信息。

状态空间模型
  • 状态向量: 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 是速度。
  • 控制输入:假设没有控制输入,所以 u k = 0 \mathbf{u}_{k} = 0 uk=0
  • 状态转移矩阵: F = [ 1 Δ t 0 1 ] \mathbf{F} = \begin{bmatrix} 1 & \Delta t \\ 0 & 1 \end{bmatrix} F=[10Δt1],其中 Δ t \Delta t Δt 是时间间隔。
  • 观测矩阵:假设我们只能测量位置, H = [ 1 0 ] \mathbf{H} = \begin{bmatrix} 1 & 0 \end{bmatrix} H=[10]
矩阵乘法
  1. 状态预测:
    x k ∣ k − 1 = F x k − 1 ∣ k − 1 = [ 1 Δ t 0 1 ] [ x k − 1 v k − 1 ] = [ x k − 1 + v k − 1 Δ t v k − 1 ] \mathbf{x}_{k|k-1} = \mathbf{F} \mathbf{x}_{k-1|k-1} = \begin{bmatrix} 1 & \Delta t \\ 0 & 1 \end{bmatrix} \begin{bmatrix} x_{k-1} \\ v_{k-1} \end{bmatrix} = \begin{bmatrix} x_{k-1} + v_{k-1} \Delta t \\ v_{k-1} \end{bmatrix} xkk1=Fxk1∣k1=[10Δt1][xk1vk1]=[xk1+vk1Δtvk1]
  2. 观测预测:
    z k ∣ k − 1 = H x k ∣ k − 1 = [ 1 0 ] [ x k − 1 + v k − 1 Δ t v k − 1 ] = x k − 1 + v k − 1 Δ t \mathbf{z}_{k|k-1} = \mathbf{H} \mathbf{x}_{k|k-1} = \begin{bmatrix} 1 & 0 \end{bmatrix} \begin{bmatrix} x_{k-1} + v_{k-1} \Delta t \\ v_{k-1} \end{bmatrix} = x_{k-1} + v_{k-1} \Delta t zkk1=Hxkk1=[10][xk1+vk1Δtvk1]=xk1+vk1Δt

例子 2:二维位置和速度估计

假设我们有一个在平面上运动的物体,我们希望估计它的二维位置和速度。

状态空间模型
  • 状态向量: 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 是速度。
  • 控制输入:假设没有控制输入,所以 u k = 0 \mathbf{u}_{k} = 0 uk=0
  • 状态转移矩阵: F = [ 1 0 Δ t 0 0 1 0 Δ t 0 0 1 0 0 0 0 1 ] \mathbf{F} = \begin{bmatrix} 1 & 0 & \Delta t & 0 \\ 0 & 1 & 0 & \Delta t \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} F= 10000100Δt0100Δt01
  • 观测矩阵:假设我们能测量位置, 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]
矩阵乘法
  1. 状态预测:
    x k ∣ k − 1 = F x k − 1 ∣ k − 1 = [ 1 0 Δ t 0 0 1 0 Δ t 0 0 1 0 0 0 0 1 ] [ x k − 1 y k − 1 v x , k − 1 v y , k − 1 ] = [ x k − 1 + v x , k − 1 Δ t y k − 1 + v y , k − 1 Δ t v x , k − 1 v y , k − 1 ] \mathbf{x}_{k|k-1} = \mathbf{F} \mathbf{x}_{k-1|k-1} = \begin{bmatrix} 1 & 0 & \Delta t & 0 \\ 0 & 1 & 0 & \Delta t \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} x_{k-1} \\ y_{k-1} \\ v_{x,k-1} \\ v_{y,k-1} \end{bmatrix} = \begin{bmatrix} x_{k-1} + v_{x,k-1} \Delta t \\ y_{k-1} + v_{y,k-1} \Delta t \\ v_{x,k-1} \\ v_{y,k-1} \end{bmatrix} xkk1=Fxk1∣k1= 10000100Δt0100Δt01 xk1yk1vx,k1vy,k1 = xk1+vx,k1Δtyk1+vy,k1Δtvx,k1vy,k1
  2. 观测预测:
    z k ∣ k − 1 = H x k ∣ k − 1 = [ 1 0 0 0 0 1 0 0 ] [ x k − 1 + v x , k − 1 Δ t y k − 1 + v y , k − 1 Δ t v x , k − 1 v y , k − 1 ] = [ x k − 1 + v x , k − 1 Δ t y k − 1 + v y , k − 1 Δ t ] \mathbf{z}_{k|k-1} = \mathbf{H} \mathbf{x}_{k|k-1} = \begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \end{bmatrix} \begin{bmatrix} x_{k-1} + v_{x,k-1} \Delta t \\ y_{k-1} + v_{y,k-1} \Delta t \\ v_{x,k-1} \\ v_{y,k-1} \end{bmatrix} = \begin{bmatrix} x_{k-1} + v_{x,k-1} \Delta t \\ y_{k-1} + v_{y,k-1} \Delta t \end{bmatrix} zkk1=Hxkk1=[10010000] xk1+vx,k1Δtyk1+vy,k1Δtvx,k1vy,k1 =[xk1+vx,k1Δtyk1+vy,k1Δt]

物理运动方程转化为状态转移矩阵的形式

物理运动模型

假设我们有一个物体在二维平面上运动。我们希望用状态向量描述其位置和速度。假设物体的运动是匀速直线运动,以下是它的物理运动方程:

  1. 位置更新
  • 在时间 Δ t \Delta t Δt 内,位置更新为:
    x k = x k − 1 + v x , k − 1 Δ t x_{k} = x_{k-1} + v_{x,k-1} \Delta t xk=xk1+vx,k1Δt
    y k = y k − 1 + v y , k − 1 Δ t y_{k} = y_{k-1} + v_{y,k-1} \Delta t yk=yk1+vy,k1Δt
  1. 速度更新
  • 由于匀速直线运动,速度保持不变:
    v x , k = v x , k − 1 v_{x,k} = v_{x,k-1} vx,k=vx,k1
    v y , k = v y , k − 1 v_{y,k} = v_{y,k-1} vy,k=vy,k1

结合运动模型构造状态转移矩阵

状态定义
  • 定义状态向量:
    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 = F x k − 1 + w k \mathbf{x}_{k} = \mathbf{F} \mathbf{x}_{k-1} + \mathbf{w}_{k} xk=Fxk1+wk
    其中 F \mathbf{F} F 是状态转移矩阵, w k \mathbf{w}_{k} wk 是过程噪声。
构造状态转移矩阵
  • 根据上述物理运动模型,位置和速度的更新关系可以写成矩阵形式:
    [ x k y k v x , k v y , k ] = [ 1 0 Δ t 0 0 1 0 Δ t 0 0 1 0 0 0 0 1 ] [ x k − 1 y k − 1 v x , k − 1 v y , k − 1 ] \begin{bmatrix} x_{k} \\ y_{k} \\ v_{x,k} \\ v_{y,k} \end{bmatrix} = \begin{bmatrix} 1 & 0 & \Delta t & 0 \\ 0 & 1 & 0 & \Delta t \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} x_{k-1} \\ y_{k-1} \\ v_{x,k-1} \\ v_{y,k-1} \end{bmatrix} xkykvx,kvy,k = 10000100Δt0100Δt01 xk1yk1vx,k1vy,k1
    这就构成了状态转移矩阵:
    F = [ 1 0 Δ t 0 0 1 0 Δ t 0 0 1 0 0 0 0 1 ] \mathbf{F} = \begin{bmatrix} 1 & 0 & \Delta t & 0 \\ 0 & 1 & 0 & \Delta t \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} F= 10000100Δt0100Δt01

解释状态转移矩阵

这个状态转移矩阵表示以下更新规则:

  • 位置更新 x k = x k − 1 + v x , k − 1 Δ t x_{k} = x_{k-1} + v_{x,k-1} \Delta t xk=xk1+vx,k1Δt y k = y k − 1 + v y , k − 1 Δ t y_{k} = y_{k-1} + v_{y,k-1} \Delta t yk=yk1+vy,k1Δt
  • 速度更新 v x , k = v x , k − 1 v_{x,k} = v_{x,k-1} vx,k=vx,k1 v y , k = v y , k − 1 v_{y,k} = v_{y,k-1} vy,k=vy,k1
    通过这种方式,状态转移矩阵 F \mathbf{F} F 将物理模型中位置和速度的更新关系转化为矩阵运算。这使得卡尔曼滤波器能够系统地处理状态预测和更新。

构造状态转移矩阵的过程

这种转换就是将多个线性方程组合成一个矩阵方程。具体步骤如下:

1. 定义状态向量

首先,我们需要定义系统的状态向量。状态向量包含了系统在每个时间步的所有状态变量。在二维位置和速度估计的例子中,状态向量定义为:
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

2. 写出状态更新的方程组

根据物理模型,写出系统状态变量如何从时间 k − 1 k-1 k1 变化到时间 k k k 的更新方程。对于匀速直线运动模型,我们有:
x k = x k − 1 + v x , k − 1 Δ t x_{k} = x_{k-1} + v_{x,k-1} \Delta t xk=xk1+vx,k1Δt
y k = y k − 1 + v y , k − 1 Δ t y_{k} = y_{k-1} + v_{y,k-1} \Delta t yk=yk1+vy,k1Δt
v x , k = v x , k − 1 v_{x,k} = v_{x,k-1} vx,k=vx,k1
v y , k = v y , k − 1 v_{y,k} = v_{y,k-1} vy,k=vy,k1

3. 将方程组转换为矩阵形式

为了将这些方程组表示为矩阵形式,我们可以使用线性代数中的矩阵乘法,将多个方程合并到一个矩阵方程中。我们希望找到一个矩阵 F \mathbf{F} F,使得下面的矩阵方程表示我们系统的状态更新:
x k = F x k − 1 \mathbf{x}_{k} = \mathbf{F} \mathbf{x}_{k-1} xk=Fxk1

具体过程如下:

首先,写出状态更新方程的分量形式:

  1. 对于位置 x k x_k xk 和速度 v x , k v_{x,k} vx,k
    x k = 1 ⋅ x k − 1 + Δ t ⋅ v x , k − 1 + 0 ⋅ y k − 1 + 0 ⋅ v y , k − 1 x_{k} = 1 \cdot x_{k-1} + \Delta t \cdot v_{x,k-1} + 0 \cdot y_{k-1} + 0 \cdot v_{y,k-1} xk=1xk1+Δtvx,k1+0yk1+0vy,k1
    v x , k = 0 ⋅ x k − 1 + 1 ⋅ v x , k − 1 + 0 ⋅ y k − 1 + 0 ⋅ v y , k − 1 v_{x,k} = 0 \cdot x_{k-1} + 1 \cdot v_{x,k-1} + 0 \cdot y_{k-1} + 0 \cdot v_{y,k-1} vx,k=0xk1+1vx,k1+0yk1+0vy,k1
  2. 对于位置 y k y_k yk 和速度 v y , k v_{y,k} vy,k
    y k = 0 ⋅ x k − 1 + 0 ⋅ v x , k − 1 + 1 ⋅ y k − 1 + Δ t ⋅ v y , k − 1 y_{k} = 0 \cdot x_{k-1} + 0 \cdot v_{x,k-1} + 1 \cdot y_{k-1} + \Delta t \cdot v_{y,k-1} yk=0xk1+0vx,k1+1yk1+Δtvy,k1
    v y , k = 0 ⋅ x k − 1 + 0 ⋅ v x , k − 1 + 0 ⋅ y k − 1 + 1 ⋅ v y , k − 1 v_{y,k} = 0 \cdot x_{k-1} + 0 \cdot v_{x,k-1} + 0 \cdot y_{k-1} + 1 \cdot v_{y,k-1} vy,k=0xk1+0vx,k1+0yk1+1vy,k1
    接下来,我们可以将这些方程组合成矩阵形式:
    [ x k y k v x , k v y , k ] = [ 1 0 Δ t 0 0 1 0 Δ t 0 0 1 0 0 0 0 1 ] [ x k − 1 y k − 1 v x , k − 1 v y , k − 1 ] \begin{bmatrix} x_{k} \\ y_{k} \\ v_{x,k} \\ v_{y,k} \end{bmatrix} = \begin{bmatrix} 1 & 0 & \Delta t & 0 \\ 0 & 1 & 0 & \Delta t \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} x_{k-1} \\ y_{k-1} \\ v_{x,k-1} \\ v_{y,k-1} \end{bmatrix} xkykvx,kvy,k = 10000100Δt0100Δt01 xk1yk1vx,k1vy,k1

4. 构造状态转移矩阵 F \mathbf{F} F

通过上面的矩阵形式,我们得到了状态转移矩阵 F \mathbf{F} F
F = [ 1 0 Δ t 0 0 1 0 Δ t 0 0 1 0 0 0 0 1 ] \mathbf{F} = \begin{bmatrix} 1 & 0 & \Delta t & 0 \\ 0 & 1 & 0 & \Delta t \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} F= 10000100Δt0100Δt01

最近更新

  1. TCP协议是安全的吗?

    2024-06-14 00:56:01       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-14 00:56:01       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-14 00:56:01       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-14 00:56:01       18 阅读

热门阅读

  1. MySQL CHECK约束

    2024-06-14 00:56:01       7 阅读
  2. Android基础-运行时权限

    2024-06-14 00:56:01       4 阅读
  3. 013-Linux交换分区管理

    2024-06-14 00:56:01       6 阅读
  4. ios CCDelete.m

    2024-06-14 00:56:01       5 阅读
  5. 项目经验:别啥事都跟甲方讲

    2024-06-14 00:56:01       5 阅读
  6. 【设计模式之享元模式 -- C++】

    2024-06-14 00:56:01       6 阅读
  7. 文件已经删除但磁盘空间未释放

    2024-06-14 00:56:01       5 阅读
  8. TikTok限流封号要如何处理

    2024-06-14 00:56:01       7 阅读
  9. 关于自学编程的9点忠告

    2024-06-14 00:56:01       6 阅读