使用卡爾曼濾波估計自由落體時的位置和速度

2021-10-03 03:43:24 字數 2322 閱讀 1882

問題:通過感測器可以測量出自由落體時的加速度、速度和位置,通過卡爾曼濾波估計速度和位置。

座標系:向下為正,初始位置和速度都為0

先上卡爾曼濾波公式:

然後上**:

# -*- coding: utf-8 -*

# 向下為正方向

import numpy as np

import matplotlib.pyplot as plt

def main():

# 時間共1s,取樣週期10ms

dt = 0.01

t = [i * dt for i in range(0, 100)]

g = 9.8

# 真實值

x_true_mat = np.mat(0.5 * g * np.multiply(np.array(t), np.array(t)))

v_true_mat = g * np.mat(t)

u_true_mat = np.mat([g for i in range(0, 100)])

# 雜訊

x_noise = np.round(np.random.normal(0, 0.1, 100), 2)

v_noise = np.round(np.random.normal(0, 0.1, 100), 2)

u_noise = np.round(np.random.normal(0, 0.01, 100), 2)

x_noise_mat = np.mat(x_noise)

v_noise_mat = np.mat(v_noise)

u_noise_mat = np.mat(u_noise)

# 測量值

x_z_mat = x_true_mat + x_noise_mat

v_z_mat = v_true_mat + v_noise_mat

u_mat = u_true_mat + u_noise_mat

# 定義x的初始狀態

x_mat = np.mat([[0], [0]])

# 定義初始狀態協方差矩陣

p_mat = np.mat([[1, 0], [0, 1]])

# 狀態轉移矩陣

f_mat = np.mat([[1, dt], [0, 1]])

# 控制矩陣

b_mat = np.mat([[0.5 * dt * dt], [dt]])

# 定義狀態轉移協方差矩陣,這裡我們把協方差設定的很小,因為覺得狀態轉移矩陣準確度高

q_mat = np.mat([[1.0 * 1.0 * dt * dt, 0], [0, 1.0 * 1.0 * dt * dt]])

# 定義觀測矩陣

h_mat = np.mat([[1, 0], [0, 1]])

# 定義觀測雜訊協方差

r_mat = np.mat([[1.0 * 1.0, 0], [0, 2.5 * 2.5]])

for i in range(100):

x_predict = f_mat * x_mat + b_mat * u_mat[0, i]

p_predict = f_mat * p_mat * f_mat.t + q_mat

k = p_predict * h_mat.t * (h_mat * p_predict * h_mat.t + r_mat).i

zt = np.mat([[x_z_mat[0, i]], [v_z_mat[0, i]]])

x_mat = x_predict + k * (zt - h_mat * x_predict)

p_mat = (p_mat - k * h_mat) * p_predict

plt.plot(t[i], x_z_mat[0, i], 'ro', markersize=1)

plt.plot(t[i], v_z_mat[0, i], 'ro', markersize=1)

plt.plot(t[i], x_mat[0, 0], 'bo', markersize=1)

plt.plot(t[i], x_mat[1, 0], 'bo', markersize=1)

plt.show()

if __name__ == '__main__':

main()

結果如下:

圖中的紅色點分別是觀測的位置和速度,藍色點為估計出的位置和速度。

卡爾曼 卡爾曼濾波 1

今天主要介紹一下卡爾曼濾波器,所謂卡爾曼濾波器其實是一種最優化遞迴數字處理演算法 optimal recursive data processing algorithm 卡爾曼濾波器應用 既然我們有了測量儀器,這些測量儀器可以目標給出準確測量值。還需要卡爾曼濾波器進行估計嗎?下面解釋一下為什麼需要卡...

卡爾曼 基礎卡爾曼濾波

卡爾曼濾波器是一種基礎 定位演算法。原理非常簡單易懂。核心過程可以用乙個圖說明 本質上就是這兩個狀態過程的迭代,來逐步的準確定位。更新 更具感測器獲取到比較準確的位置資訊後來更新當前的 問位置,也就是糾正 的錯誤。你可能要問為什麼有感測器的資料了還要進行更新?因為在現實世界中感測器是存在很多雜訊干擾...

卡爾曼濾波

卡爾曼濾波演算法 首先引入乙個離散控制過程的系統,用乙個線性隨機微分方程來描述 x k a x k 1 b u k w k 系統的測量值 z k h x k v k x k 是k時刻的系統狀態,u k 是k時刻對系統的控制量。a和b是系統引數,對於多模型系統,他們為矩陣。z k 是k時刻的測量值,h...