Python版本卡尔曼滤波算法

import json
import numpy as np
from numpy.linalg import inv
import matplotlib.pyplot as plt


data = open("./position_list.json", encoding='utf-8')
position_list = json.load(data)

def get_lat(position):
    return float(position["latitude"])
    
def get_long(position):
    return float(position["longitude"])

def get_time(position):
    return int(position["time"])

def wrap_position(lat, long, time):
    position = {}
    position["latitude"] = lat
    position["longitude"] = long
    position["time"] = time
    return position


# Q
def covariance4d(interval):
    sigma = 0.0625
    part1 = sigma * ((interval ** 4) / 4.0)
    part2 = sigma * ((interval ** 3) / 2.0)
    part3 = sigma * (interval ** 2)
    
    cov_matrix = np.array([[part1, part2, 0, 0],
                           [part2, part3, 0, 0],
                           [0, 0, part1, part2],
                           [0, 0, part1, part2]])
    return cov_matrix


# Initial Estimation Covariance Matrix
P = covariance4d(0)


# Initial State Matrix
pre_lat = get_lat(position_list[0])
pre_long = get_long(position_list[0])
pre_time = get_time(position_list[0])

X = np.array([[pre_lat],
              [0],
              [pre_long],
              [0]])
n = 4
raw_position_list = [wrap_position(pre_lat, pre_long, pre_time)]
kalman_position_list = [wrap_position(pre_lat, pre_long, pre_time)]
for position in position_list[1:10]:
    
    t_interval = (get_time(position) - pre_time) / 1000.0
    A = np.array([[1, t_interval, 0, 0],
                  [0, 1, 0, 0],
                  [0, 0, 1, t_interval],
                  [0, 0, 0, 1]])
    print("A State Matrix:\n", A)
    print("X State Matrix:\n", X)
    X = A.dot(X)
    print("X State Matrix:\n", X)
    P = A.dot(P).dot(A.T) + covariance4d(t_interval)
    print("P State Matrix:\n", P)
    
    R = np.diag([29, 29, 29, 29])
    S = P + R
    print("S State Matrix:\n", S)
    K = P.dot(inv(S))
    print("K State Matrix:\n", K)

    # Reshape the new data into the measurement space.
    curr_lat = get_lat(position)
    v_y = (curr_lat - pre_lat) / t_interval
    curr_long = get_long(position)
    v_x = (curr_long - pre_long) / t_interval
    Y = np.array([[curr_lat],[v_y],[curr_long],[v_x]])
    print("Y State Matrix:\n", Y)
    # Update the State Matrix
    # Combination of the predicted state, measured values, covariance matrix and Kalman Gain
    print("X State Matrix:\n", X)
    print("fix:\n", K.dot(Y - X))
    X = X + K.dot(Y - X)
    print("Kalman Filter State Matrix:\n", X)

    # Update Process Covariance Matrix
    P = (np.identity(len(K)) - K).dot(P)
    
    pre_lat = curr_lat
    pre_long = curr_long
    pre_time = get_time(position)
    
    raw_position_list.append(wrap_position(pre_lat, pre_long, pre_time))
    kalman_position_list.append(wrap_position(X[0][0], X[2][0], pre_time))
    

print("Raw Matrix:\n", raw_position_list)
print("Kalman Filter State Matrix:\n", kalman_position_list)
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 依旧是Python课程 _(:з」∠)_ 期末需要完成小组作业,选题内容主要是用卡尔曼滤波来实现交通参数的...
    火羽白panda阅读 12,831评论 1 3
  • 姓名:周小蓬 16019110037 转载自:http://blog.csdn.net/MangZuo/artic...
    aeytifiw阅读 8,354评论 1 13
  • 一:前言 滤波算法 用于过滤掉连续的数据中出现偏差较大的数据 二:卡尔曼滤波算法 <0>卡尔曼滤波的原理请自行百度...
    学_iOS阅读 5,189评论 2 1
  • 我们曾一起约定一起生活,一起看电影一起散步,一起看孩子走路后来,因为生活我们分开你说心意永不变我说爱你永远看着斑斓...
    米柒阅读 1,943评论 0 1
  • 照片总是拍出来那么淡, 真希望自己有个单反哈, 不过为了给自己的画拍照, 入个单反是不是有点傻。 已经画了三个女孩...
    嘉蓓水彩慢生活阅读 3,414评论 3 13