---
# System prepended metadata

title: ESKF(中文版)

---

# Error-state Kalman Filter (誤差狀態濾波器)
**English version:** https://hackmd.io/@2eDHc86oQa-I55HsX-Kmww/SJ-etBJYA
**Author:** Teng-Hu Cheng(程登湖)  
**email:** tenghu@nycu.edu.tw
**Date:** July 2024
**Website:** https://ncrl.lab.nycu.edu.tw/member/
**Slides:** https://sites.google.com/nycu.edu.tw/robotics-aerial-robots2024/course-materials

## Block Diagram(系統方塊圖)
假設我們要融合IMU與GPS，並考量IMU的訊號雜訊與飄移，我們必須使用“誤差狀態濾波器”進行更精準的濾波。整體的“誤差狀態濾波器”可用以下的方塊圖表達。
![block diagram](https://hackmd.io/_uploads/HyMU9PC_C.png)

## The error-state Kalman filter explained

在誤差狀態濾波器的設計中，我們談到真實狀態(true state)、名義狀態(nominal state)和誤差狀態值(error state)，其中真實狀態表達為名義狀態和誤差狀態的合適組合（線性和、四元數乘積或矩陣乘積）。這個概念是將名義狀態視為大信號（以非線性方式可積分)，而誤差狀態則視為小信號（因此可以線性積分並適用於線性高斯濾波)。

可以如下解釋誤差狀態濾波器。一方面，高頻率的 IMU 數據 $\mathbf{u}_m$ 被整合到名義狀態 $\mathbf{x}$ 中。這個名義狀態沒有考慮噪聲項 $\mathbf{w}$ 和其他可能的模型缺陷。因此，它將累積誤差。這些誤差被收集在誤差狀態 $\delta \mathbf{x}$ 中，並使用誤差狀態卡爾曼濾波器 (ESKF) 進行估計，此時包含所有的噪聲和干擾。誤差狀態由小信號幅度組成，其演變函數由（時變的）線性動態系統正確定義，其動態、控制和測量矩陣從名義狀態值計算得出。在名義狀態積分的同時，ESKF 預測誤差狀態的高斯估計。它僅進行預測，因為目前沒有其他測量可用來校正這些估計。濾波器校正在 IMU 之外的其他信息到達時進行（例如 GPS、視覺等），這些信息能夠使誤差可觀測，並且這種情況通常發生在積分階段的速度更低。這種校正提供了誤差狀態的後驗高斯估計。在此之後，誤差狀態的均值被注入到名義狀態中，然後重置為零。誤差狀態的協方差矩陣也被方便地更新以反映這一重置。系統就這樣永遠運行下去。


### Definition of Variables (變數定義)
先定義相關變數如下：
![Screenshot 2024-07-24 at 20.34.58](https://hackmd.io/_uploads/HymbBu0u0.png)
其中誤差狀態信號 $\delta \mathbf{q}$ 和 $\delta \mathbf{R}$ 可以近似為：

$$
\delta \mathbf{q} \approx \begin{bmatrix} 1 \\ \frac{\delta \boldsymbol{\theta}}{2} \end{bmatrix}
\]
\[
\delta \mathbf{R} \approx \mathbf{I} + [\delta \boldsymbol{\theta}]_\times
$$
### True State Dynamics (理想狀態動態)
True state為理想的狀態，因他不含雜訊與飄移(noise、bias)，但實際上無法達成，因此我們退而求其次，只尋找nominal state來使用。
$$\begin{align*}
\dot{\mathbf{p}}_t &= \mathbf{v}_t \\
\dot{\mathbf{v}}_t &= \mathbf{a}_t \\
\dot{\mathbf{q}}_t &= \frac{1}{2} \mathbf{q}_t \otimes \boldsymbol{\omega}_t \\
\dot{\mathbf{a}}_{bt} &= \mathbf{a}_w \\
\dot{\boldsymbol{\omega}}_{bt} &= \boldsymbol{\omega}_w \\
\dot{\mathbf{g}}_t &= 0
\end{align*}$$


在上式中，真實的加速度 $\mathbf{a}_t$ 和角速度 $\boldsymbol{\omega}_t$ 是從具有雜訊傳感器讀數的 IMU 中獲得的，這些讀數是在體座標系的加速度 $\mathbf{a}_m$ 和角速度 $\boldsymbol{\omega}_m$：
$$
\mathbf{a}_m = \mathbf{R}_t^\top (\mathbf{a}_t - \mathbf{g}_t) + \mathbf{a}_{bt} + \mathbf{a}_n
\]
\[
\boldsymbol{\omega}_m = \boldsymbol{\omega}_t + \boldsymbol{\omega}_{bt} + \boldsymbol{\omega}_n$$


其中 $\mathbf{R}_t$ $\triangleq \mathbf{R}(\mathbf{q}_t)$。透過這個，可以分離出真實值（這意味著我們對測量方程進行了轉換），
$$\mathbf{a}_t = \mathbf{R}_t (\mathbf{a}_m - \mathbf{a}_{bt} - \mathbf{a}_n) + \mathbf{g}_t
\]
\[
\boldsymbol{\omega}_t = \boldsymbol{\omega}_m - \boldsymbol{\omega}_{bt} - \boldsymbol{\omega}_n$$

將上述方程代入得到運動學系統：
$$
\dot{\mathbf{p}}_t = \mathbf{v}_t \quad 
\]
\[
\dot{\mathbf{v}}_t = \mathbf{R}_t (\mathbf{a}_m - \mathbf{a}_{bt} - \mathbf{a}_n) + \mathbf{g}_t \quad 
\]
\[
\dot{\mathbf{q}}_t = \frac{1}{2} \mathbf{q}_t \otimes (\boldsymbol{\omega}_m - \boldsymbol{\omega}_{bt} - \boldsymbol{\omega}_n) \quad 
\]
\[
\dot{\mathbf{a}}_{bt} = \mathbf{a}_w \quad 
\]
\[
\dot{\boldsymbol{\omega}}_{bt} = \boldsymbol{\omega}_w \quad 
\]
\[
\dot{\mathbf{g}}_t = 0 \quad $$
如此一來，我們便將等式右邊的 true state 換成 nominal state。我們可以將其命名為 $$\dot{\mathbf{x}}_t = \mathbf{f}_t(\mathbf{x}_t, \mathbf{u}, \mathbf{w})$$這個系統的狀態為 $\mathbf{x}_t$，由 IMU 讀數 $\mathbf{u}_m$ 控制，並受白高斯雜訊$\mathbf{w}$ 擾動，所有變量的定義如下：

$$
\mathbf{x}_t = \begin{bmatrix}
\mathbf{p}_t \\
\mathbf{v}_t \\
\mathbf{q}_t \\
\mathbf{a}_{bt} \\
\boldsymbol{\omega}_{bt} \\
\mathbf{g}_t
\end{bmatrix}, \quad
\mathbf{u} = \begin{bmatrix}
\mathbf{a}_m - \mathbf{a}_n \\
\boldsymbol{\omega}_m - \boldsymbol{\omega}_n
\end{bmatrix}, \quad
\mathbf{w} = \begin{bmatrix}
\mathbf{a}_w \\
\boldsymbol{\omega}_w
\end{bmatrix}.
$$


## Error-state Kalman Filter (ESKF) Iteration Steps (迭代過程)

以下是誤差狀態卡爾曼濾波器 (ESKF) 迭代過程的詳細步驟：

### 初始化

- **狀態初始化：**
  - 定義初始名義狀態 $\mathbf{x}_0$。
  - 初始化誤差狀態 $\delta \mathbf{x}_0$（通常為零）。
  - 定義初始協方差矩陣 $\mathbf{P}_0$

- **過程和測量噪聲協方差：**
  - 定義過程噪聲協方差矩陣 $\mathbf{Q}$
  - 定義測量噪聲協方差矩陣 $\mathbf{R}$

### 時間更新（預測）

- **預測名義狀態（不包括測量噪聲）：**
  $$
  \mathbf{x}_{k|k-1} = f(\mathbf{x}_{k-1})
  $$
  將動態模型$f$展開後的離散形式定義如下：
  $$\begin{align*}
  \mathbf{p} & \gets \mathbf{p} + \mathbf{v} \Delta t + \frac{1}{2} (\mathbf{R} (\mathbf{a}_m - \mathbf{a}_b) + \mathbf{g}) \Delta t^2 \\
  \mathbf{v} & \gets \mathbf{v} + (\mathbf{R} (\mathbf{a}_m - \mathbf{a}_b) + \mathbf{g}) \Delta t \\
  \mathbf{q} & \gets \mathbf{q} \otimes \mathbf{q} \{ (\boldsymbol{\omega}_m - \boldsymbol{\omega}_b) \Delta t \} \\
  \mathbf{a}_b & \gets \mathbf{a}_b \\
  \boldsymbol{\omega}_b & \gets \boldsymbol{\omega}_b \\
  \mathbf{g} & \gets \mathbf{g}
  \end{align*}
$$
- **預測誤差狀態協方差：**
  誤差狀態動態的離散形式如下：
  $$\begin{align*}
  \delta \mathbf{p} & \gets \delta \mathbf{p} + \delta \mathbf{v} \Delta t \\
  \delta \mathbf{v} & \gets \delta \mathbf{v} + (-\mathbf{R} [\mathbf{a}_m - \mathbf{a}_b]_\times \delta \boldsymbol{\theta} - \mathbf{R} \delta \mathbf{a}_b + \delta \mathbf{g}) \Delta t + \mathbf{v}_i \\
  \delta \boldsymbol{\theta} & \gets \mathbf{R}^\top \{ (\boldsymbol{\omega}_m - \boldsymbol{\omega}_b) \Delta t \} \delta \boldsymbol{\theta} - \delta \boldsymbol{\omega}_b \Delta t + \boldsymbol{\theta}_i \\
  \delta \mathbf{a}_b & \gets \delta \mathbf{a}_b + \mathbf{a}_i \\
  \delta \boldsymbol{\omega}_b & \gets \delta \boldsymbol{\omega}_b + \boldsymbol{\omega}_i \\
  \delta \mathbf{g} & \gets \delta \mathbf{g}
  \end{align*}$$

  其中，$\mathbf{v}_i$、$\boldsymbol{\theta}_i$、$\mathbf{a}_i$ 和 $\boldsymbol{\omega}_i$ 是應用於速度、方向和偏差估計的隨機脈衝，由白高斯過程建模。它們的均值為零，協方差矩陣通過對$\mathbf{a}_n$、$\boldsymbol{\omega}_n$、$\mathbf{a}_w$ 和 $\boldsymbol{\omega}_w$ 的協方差在步長時間$\Delta t$ 上進行積分得到。

  $$
  \mathbf{V}_i = \sigma_{\mathbf{a}_n}^2 \Delta t^2 \mathbf{I} \quad [m^2/s^2]
  \]
  \[
  \boldsymbol{\Theta}_i = \sigma_{\boldsymbol{\omega}_n}^2 \Delta t \mathbf{I} \quad [\text{rad}^2]
  \]
  \[
  \mathbf{A}_i = \sigma_{\mathbf{a}_w}^2 \Delta t \mathbf{I} \quad [m^2/s^4]
  \]
  \[
  \boldsymbol{\Omega}_i = \sigma_{\boldsymbol{\omega}_w}^2 \Delta t \mathbf{I} \quad [\text{rad}^2/s^2]
  $$

  其中，$\sigma_{\mathbf{a}_n} [m/s^2] \)、\( \sigma_{\boldsymbol{\omega}_n} [\text{rad}/s] \)、\( \sigma_{\mathbf{a}_w} [m/s^2\sqrt{s}] \) 和 \( \sigma_{\boldsymbol{\omega}_w} [\text{rad}/s\sqrt{s}]$ 需從 IMU 資料表中獲得或通過實驗測量得到。

### 誤差狀Jacobian和擾動矩陣

雅可比(Jacobian)矩陣通過簡單觀察上一節中的誤差狀態差分方程得到。

為了將這些方程簡化，我們考慮名義狀態向量 $\mathbf{x} \)、誤差狀態向量 \( \delta \mathbf{x} \)、輸入向量 \( \mathbf{u}_m \) 和擾動脈衝向量 \( \mathbf{i}$，如下所示：

$$\mathbf{x} = \begin{bmatrix}
\mathbf{p} \\
\mathbf{v} \\
\mathbf{q} \\
\mathbf{a}_b \\
\boldsymbol{\omega}_b \\
\mathbf{g}
\end{bmatrix}, \quad 
\delta \mathbf{x} = \begin{bmatrix}
\delta \mathbf{p} \\
\delta \mathbf{v} \\
\delta \boldsymbol{\theta} \\
\delta \mathbf{a}_b \\
\delta \boldsymbol{\omega}_b \\
\delta \mathbf{g}
\end{bmatrix}, \quad 
\mathbf{u}_m = \begin{bmatrix}
\mathbf{a}_m \\
\boldsymbol{\omega}_m
\end{bmatrix}, \quad 
\mathbf{i} = \begin{bmatrix}
\mathbf{v}_i \\
\boldsymbol{\theta}_i \\
\mathbf{a}_i \\
\boldsymbol{\omega}_i
\end{bmatrix}$$

線性化的誤差狀態系統表示為：

$$\delta \mathbf{x} \leftarrow f( \mathbf{x}, \delta \mathbf{x}, \mathbf{u}_m, \mathbf{i} ) = \mathbf{F}_{\mathbf{x}} ( \mathbf{x}, \mathbf{u}_m ) \cdot \delta \mathbf{x} + \mathbf{F}_{\mathbf{i}} \cdot \mathbf{i}$$

ESKF 預測方程表示為：

$$\mathbf{P} \leftarrow \mathbf{F}_{\mathbf{x}} \mathbf{P} \mathbf{F}_{\mathbf{x}}^\top + \mathbf{F}_{\mathbf{i}} \mathbf{Q}_{\mathbf{i}} \mathbf{F}_{\mathbf{i}}^\top
$$

其中，$\delta \mathbf{x} \sim \mathcal{N}\{\delta \hat{\mathbf{x}}, \mathbf{P}\}\)，\(\mathbf{F}_{\mathbf{x}}\) 和 \(\mathbf{F}_{\mathbf{i}}\) 是函數 \(f()\) 對誤差和擾動向量的雅可比矩陣；\(\mathbf{Q}_{\mathbf{i}}$ 是擾動脈衝的協方差矩陣。

上述雅可比矩陣$\mathbf{F}_{\mathbf{x}}$、$\mathbf{F}_{\mathbf{i}}$和協方差矩陣$\mathbf{Q}_{\mathbf{i}}$的表達式如下。所有與狀態相關的值均直接從名義狀態中提取。


$$\mathbf{F}_{\mathbf{x}} = \frac{\partial f}{\partial \delta \mathbf{x}} \bigg|_{\mathbf{x}, \mathbf{u}_m} = 
\begin{bmatrix}
\mathbf{I} & \mathbf{I} \Delta t & 0 & 0 & 0 & 0 \\
0 & \mathbf{I} & -\mathbf{R}[\mathbf{a}_m - \mathbf{a}_b]_\times \Delta t & -\mathbf{R} \Delta t & 0 & \mathbf{I} \Delta t \\
0 & 0 & \mathbf{R}^\top \{(\boldsymbol{\omega}_m - \boldsymbol{\omega}_b) \Delta t\} & 0 & -\mathbf{I} \Delta t & 0 \\
0 & 0 & 0 & \mathbf{I} & 0 & 0 \\
0 & 0 & 0 & 0 & \mathbf{I} & 0 \\
0 & 0 & 0 & 0 & 0 & \mathbf{I}
\end{bmatrix} \quad 
\]
\[
\mathbf{F}_{\mathbf{i}} = \frac{\partial f}{\partial \mathbf{i}} \bigg|_{\mathbf{x}, \mathbf{u}_m} = 
\begin{bmatrix}
0 & 0 & 0 & 0 \\
\mathbf{I} & 0 & 0 & 0 \\
0 & \mathbf{I} & 0 & 0 \\
0 & 0 & \mathbf{I} & 0 \\
0 & 0 & 0 & \mathbf{I} \\
0 & 0 & 0 & 0
\end{bmatrix}, \quad 
\mathbf{Q}_{\mathbf{i}} = 
\begin{bmatrix}
\mathbf{V}_i & 0 & 0 & 0 \\
0 & \boldsymbol{\Theta}_i & 0 & 0 \\
0 & 0 & \mathbf{A}_i & 0 \\
0 & 0 & 0 & \boldsymbol{\Omega}_i
\end{bmatrix} \quad 
$$

### 演算法實作概要流程

1. **計算量測誤差:**

    - 獲取測量值 $\mathbf{z}_k$
    - 根據名義狀態預測測量值
        $$
        \mathbf{z}_{k|k-1} = h(\mathbf{x}_{k|k-1})
        $$
    - 計算測量殘差
        $$
        \mathbf{y}_k = \mathbf{z}_k - \mathbf{z}_{k|k-1}$$
2. **計算卡爾曼增益:**
    - 在名義狀態周圍線性化測量模型以獲得雅可比矩陣$\mathbf{H}_k$
        $$
        \mathbf{H}_k = \left. \frac{\partial h(\mathbf{x})}{\partial \delta \mathbf{x}_k} \right|_{\mathbf{x}=\mathbf{x}_{k|k-1}}
        $$
    - 計算協方差
        $$
        \mathbf{S}_k = \mathbf{H}_k \mathbf{P}_{k|k-1} \mathbf{H}_k^\top + \mathbf{R}
        $$
    - 計算卡爾曼增益
        $$
        \mathbf{K}_k = \mathbf{P}_{k|k-1} \mathbf{H}_k^\top \mathbf{S}_k^{-1}
        $$

3. **更新名義狀態(nominal state):**
    - 使用卡爾曼增益和創新量更新誤差狀態
        $$
        \delta \mathbf{x}_k = \mathbf{K}_k \mathbf{y}_k
        $$
    - 校正名義狀態
        $$
        \mathbf{x}_k = \mathbf{x}_{k|k-1} \oplus \delta \mathbf{x}_k
        $$
    其中，$\oplus$ 表示將名義狀態和誤差狀態組合的適當操作，對於線性系統可能是加法，對於非線性系統則可能是更複雜的操作。

4. **更新誤差狀態協方差:**
    - 更新誤差狀態協方差矩陣
        $$
        \mathbf{P}_k = (\mathbf{I} - \mathbf{K}_k \mathbf{H}_k) \mathbf{P}_{k|k-1}
        $$
    - 在使用誤差狀態更新名義狀態後，將誤差狀態設為零
        $$
        \delta \mathbf{x}_k \leftarrow \mathbf{0}
        $$

5. **重複:**
    - 對每個時間步 $k$ 重複時間更新和測量更新步驟。