首页 > 卡尔曼滤波— Constant Velocity Model

卡尔曼滤波— Constant Velocity Model

假设你开车进入隧道,GPS信号丢失,现在我们要确定汽车在隧道内的位置。汽车的绝对速度可以通过车轮转速计算得到,汽车朝向可以通过yaw rate sensor(A yaw-rate sensor is a gyroscopic device that measures a vehicle’s angular velocity around its vertical axis. )得到,因此可以获得X轴和Y轴速度分量Vx,Vy

首先确定状态变量,恒速度模型中取状态变量为汽车位置和速度:

根据运动学定律(The basic idea of any motion models is that a mass cannot move arbitrarily due to inertia):

由于GPS信号丢失,不能直接测量汽车位置,则观测模型为:

卡尔曼滤波步骤如下图所示:

 1 # -*- coding: utf-8 -*-
 2 import numpy as np
 3 import matplotlib.pyplot as plt
 4 
 5 # Initial State x0
 6 x = np.matrix([[0.0, 0.0, 0.0, 0.0]]).T
 7 
 8 # Initial Uncertainty P0
 9 P = np.diag([1000.0, 1000.0, 1000.0, 1000.0])
10 
11 dt = 0.1 # Time Step between Filter Steps
12 
13 # Dynamic Matrix A
14 A = np.matrix([[1.0, 0.0, dt, 0.0],
15               [0.0, 1.0, 0.0, dt],
16               [0.0, 0.0, 1.0, 0.0],
17               [0.0, 0.0, 0.0, 1.0]])
18 
19 # Measurement Matrix
20 # We directly measure the velocity vx and vy
21 H = np.matrix([[0.0, 0.0, 1.0, 0.0],
22               [0.0, 0.0, 0.0, 1.0]])
23 
24 # Measurement Noise Covariance
25 ra = 10.0**2
26 R = np.matrix([[ra, 0.0],
27               [0.0, ra]])
28 
29 # Process Noise Covariance
30 # The Position of the car can be influenced by a force (e.g. wind), which leads
31 # to an acceleration disturbance (noise). This process noise has to be modeled
32 # with the process noise covariance matrix Q.
33 sv = 8.8
34 G = np.matrix([[0.5*dt**2],
35                [0.5*dt**2],
36                [dt],
37                [dt]])
38 Q = G*G.T*sv**2
39 
40 I = np.eye(4)
41 
42 # Measurement
43 m = 200 # 200个测量点
44 vx= 20  # in X
45 vy= 10  # in Y
46 mx = np.array(vx+np.random.randn(m))
47 my = np.array(vy+np.random.randn(m))
48 measurements = np.vstack((mx,my))
49 
50 # Preallocation for Plotting
51 xt = []
52 yt = []
53 
54 
55 # Kalman Filter
56 for n in range(len(measurements[0])):
57     
58     # Time Update (Prediction)
59     # ========================
60     # Project the state ahead
61     x = A*x
62     
63     # Project the error covariance ahead
64     P = A*P*A.T + Q
65 
66     
67     # Measurement Update (Correction)
68     # ===============================
69     # Compute the Kalman Gain
70     S = H*P*H.T + R
71     K = (P*H.T) * np.linalg.pinv(S)
72 
73     # Update the estimate via z
74     Z = measurements[:,n].reshape(2,1)
75     y = Z - (H*x)                            # Innovation or Residual
76     x = x + (K*y)
77     
78     # Update the error covariance
79     P = (I - (K*H))*P
80 
81     
82     # Save states for Plotting
83     xt.append(float(x[0]))
84     yt.append(float(x[1]))
85 
86 
87 # State Estimate: Position (x,y)
88 fig = plt.figure(figsize=(16,16))
89 plt.scatter(xt,yt, s=20, label='State', c='k')
90 plt.scatter(xt[0],yt[0], s=100, label='Start', c='g')
91 plt.scatter(xt[-1],yt[-1], s=100, label='Goal', c='r')
92 
93 plt.xlabel('X')
94 plt.ylabel('Y')
95 plt.title('Position')
96 plt.legend(loc='best')
97 plt.axis('equal')
98 plt.show()

汽车在隧道中的估计位置如下图:

 

 参考

Improving IMU attitude estimates with velocity data

https://zhuanlan.zhihu.com/p/25598462

转载于:https://www.cnblogs.com/21207-iHome/p/5274819.html

更多相关:

  • 上篇笔记中梳理了一把 resolver 和 balancer,这里顺着前面的流程走一遍入口的 ClientConn 对象。ClientConn// ClientConn represents a virtual connection to a conceptual endpoint, to // perform RPCs. // //...

  • 我的实验是基于PSPNet模型实现二维图像的语义分割,下面的代码直接从得到的h5文件开始往下做。。。 也不知道是自己的检索能力出现了问题还是咋回事,搜遍全网都没有可以直接拿来用的语义分割代码,东拼西凑,算是搞成功了。 实验平台:Windows、VS2015、Tensorflow1.8 api、Python3.6 具体的流程为:...

  • Path Tracing 懒得翻译了,相信搞图形学的人都能看得懂,2333 Path Tracing is a rendering algorithm similar to ray tracing in which rays are cast from a virtual camera and traced through a s...

  • configure_file( [COPYONLY] [ESCAPE_QUOTES] [@ONLY][NEWLINE_STYLE [UNIX|DOS|WIN32|LF|CRLF] ]) 我遇到的是 configure_file(config/config.in ${CMAKE_SOURCE_DIR}/...

  •     直接复制以下代码创建一个名为settings.xml的文件,放到C:UsersAdministrator.m2下即可