두 개의 서로 다른 센서로 측정 한 물체의 위치를 나타내는 데이터가 있습니다. 그래서 저는 센서 융합을 할 필요가 있습니다. 더 어려운 문제는 각 센서의 데이터가 본질적으로 임의의 시간에 도착한다는 것입니다. 나는 pykalman을 사용하여 데이터를 융합시키고 부드럽게하고 싶습니다. 파이칼 만은 어떻게 가변 타임 스탬프 데이터를 처리 할 수 있습니까?다양한 타임 스텝을 가진 칼만 필터
import pandas as pd
data={'time':\
['10:00:00.0','10:00:01.0','10:00:05.2','10:00:07.5','10:00:07.5','10:00:12.0','10:00:12.5']\
,'X':[10,10.1,20.2,25.0,25.1,35.1,35.0],'Y':[20,20.2,41,45,47,75.0,77.2],\
'Sensor':[1,2,1,1,2,1,2]}
df=pd.DataFrame(data,columns=['time','X','Y','Sensor'])
df.time=pd.to_datetime(df.time)
df=df.set_index('time')
을 그리고이 :
데이터의 단순화 된 샘플은 다음과 같이 표시됩니다 센서 융합 문제에 대한
df
Out[130]:
X Y Sensor
time
2017-12-01 10:00:00.000 10.0 20.0 1
2017-12-01 10:00:01.000 10.1 20.2 2
2017-12-01 10:00:05.200 20.2 41.0 1
2017-12-01 10:00:07.500 25.0 45.0 1
2017-12-01 10:00:07.500 25.1 47.0 2
2017-12-01 10:00:12.000 35.1 75.0 1
2017-12-01 10:00:12.500 35.0 77.2 2
, 난 그냥 데이터를 바꿀 수 있다고 생각하는 그래서 위치 X1, Y1, X2, Y2가 X, Y가 아닌 값이 누락 된 위치에 있어야합니다. (이것은 관련이 : http://stackoverflow.com.mevn.net/questions/47386426/2-sensor-readings-fusion-yaw-pitch를)
그래서 다음 내 데이터는 다음과 같이 할 수 있습니다 pykalman에 대한
df['X1']=df.X[df.Sensor==1]
df['Y1']=df.Y[df.Sensor==1]
df['X2']=df.X[df.Sensor==2]
df['Y2']=df.Y[df.Sensor==2]
df
Out[132]:
X Y Sensor X1 Y1 X2 Y2
time
2017-12-01 10:00:00.000 10.0 20.0 1 10.0 20.0 NaN NaN
2017-12-01 10:00:01.000 10.1 20.2 2 NaN NaN 10.1 20.2
2017-12-01 10:00:05.200 20.2 41.0 1 20.2 41.0 NaN NaN
2017-12-01 10:00:07.500 25.0 45.0 1 25.0 45.0 25.1 47.0
2017-12-01 10:00:07.500 25.1 47.0 2 25.0 45.0 25.1 47.0
2017-12-01 10:00:12.000 35.1 75.0 1 35.1 75.0 NaN NaN
2017-12-01 10:00:12.500 35.0 77.2 2 NaN NaN 35.0 77.2
워드 프로세서는이 누락 된 데이터를 처리 할 수 있음을 나타냅니다 있지만,이 정확한지?
그러나 pykalman에 대한 문서는 가변 시간 문제에 대해 명확하지 않습니다. 다큐먼트는 말한다 :
이"칼만 필터와 칼만 원활한 모두가 시간에 따라 변화 매개 변수를 사용할 수 있습니다 이것을 사용하기 위해, 하나는 최초의 축을 따라 길이 배열 n_timesteps에 전달할 필요가 :."
>>> transition_offsets = [[-1], [0], [1], [2]]
>>> kf = KalmanFilter(transition_offsets=transition_offsets, n_dim_obs=1)
가변적 인 시간 간격으로 pykalman Smoother를 사용하는 예는 찾을 수 없었습니다. 따라서 위의 데이터를 사용하는 모든 지침, 예 또는 예가 매우 유용합니다. 나는 pykalman을 사용할 필요가 없지만이 데이터를 원활하게하는 데 유용한 도구 인 것 같습니다.
***** 아래 추가 코드 @Anton 부드러운 기능을 사용하는 유용한 코드 버전을 만들었습니다. 이상한 것은 모든 관측치를 동일한 무게로 처리하는 것으로 보이며 모든 궤도가 모든 관측치를 통과한다는 것입니다. 심지어, 센서 분산 값 사이에 큰 차이가 있다면. 5.4.5.0 지점에서 필터링 된 궤적은 센서 1 지점에 더 가까이 가야합니다. 대신 궤도가 각 지점으로 정확히 이동하고 거기에 도달하는 데 큰 변화가 있습니다.
from pykalman import KalmanFilter
import numpy as np
import matplotlib.pyplot as plt
# reading data (quick and dirty)
Time=[]
RefX=[]
RefY=[]
Sensor=[]
X=[]
Y=[]
for line in open('data/dataset_01.csv'):
f1, f2, f3, f4, f5, f6 = line.split(';')
Time.append(float(f1))
RefX.append(float(f2))
RefY.append(float(f3))
Sensor.append(float(f4))
X.append(float(f5))
Y.append(float(f6))
# Sensor 1 has a higher precision (max error = 0.1 m)
# Sensor 2 has a lower precision (max error = 0.3 m)
# Variance definition through 3-Sigma rule
Sensor_1_Variance = (0.1/3)**2;
Sensor_2_Variance = (0.3/3)**2;
# Filter Configuration
# time step
dt = Time[2] - Time[1]
# transition_matrix
F = [[1, 0, dt, 0],
[0, 1, 0, dt],
[0, 0, 1, 0],
[0, 0, 0, 1]]
# observation_matrix
H = [[1, 0, 0, 0],
[0, 1, 0, 0]]
# transition_covariance
Q = [[1e-4, 0, 0, 0],
[ 0, 1e-4, 0, 0],
[ 0, 0, 1e-4, 0],
[ 0, 0, 0, 1e-4]]
# observation_covariance
R_1 = [[Sensor_1_Variance, 0],
[0, Sensor_1_Variance]]
R_2 = [[Sensor_2_Variance, 0],
[0, Sensor_2_Variance]]
# initial_state_mean
X0 = [0,
0,
0,
0]
# initial_state_covariance - assumed a bigger uncertainty in initial velocity
P0 = [[ 0, 0, 0, 0],
[ 0, 0, 0, 0],
[ 0, 0, 1, 0],
[ 0, 0, 0, 1]]
n_timesteps = len(Time)
n_dim_state = 4
filtered_state_means = np.zeros((n_timesteps, n_dim_state))
filtered_state_covariances = np.zeros((n_timesteps, n_dim_state, n_dim_state))
import numpy.ma as ma
obs_cov=np.zeros([n_timesteps,2,2])
obs=np.zeros([n_timesteps,2])
for t in range(n_timesteps):
if Sensor[t] == 0:
obs[t]=None
else:
obs[t] = [X[t], Y[t]]
if Sensor[t] == 1:
obs_cov[t] = np.asarray(R_1)
else:
obs_cov[t] = np.asarray(R_2)
ma_obs=ma.masked_invalid(obs)
ma_obs_cov=ma.masked_invalid(obs_cov)
# Kalman-Filter initialization
kf = KalmanFilter(transition_matrices = F,
observation_matrices = H,
transition_covariance = Q,
observation_covariance = ma_obs_cov, # the covariance will be adapted depending on Sensor_ID
initial_state_mean = X0,
initial_state_covariance = P0)
filtered_state_means, filtered_state_covariances=kf.smooth(ma_obs)
# extracting the Sensor update points for the plot
Sensor_1_update_index = [i for i, x in enumerate(Sensor) if x == 1]
Sensor_2_update_index = [i for i, x in enumerate(Sensor) if x == 2]
Sensor_1_update_X = [ X[i] for i in Sensor_1_update_index ]
Sensor_1_update_Y = [ Y[i] for i in Sensor_1_update_index ]
Sensor_2_update_X = [ X[i] for i in Sensor_2_update_index ]
Sensor_2_update_Y = [ Y[i] for i in Sensor_2_update_index ]
# plot of the resulted trajectory
plt.plot(RefX, RefY, "k-", label="Real Trajectory")
plt.plot(Sensor_1_update_X, Sensor_1_update_Y, "ro", label="Sensor 1")
plt.plot(Sensor_2_update_X, Sensor_2_update_Y, "bo", label="Sensor 2")
plt.plot(filtered_state_means[:, 0], filtered_state_means[:, 1], "g.", label="Filtered Trajectory", markersize=1)
plt.grid()
plt.legend(loc="upper left")
plt.show()
임의의 시간 문제는 발생하지 않습니다. 예상 상태를 수정하기 위해 상태와 측정을 예측할 수있는 모델을 가지고 있습니다. 측정치가 때때로 누락되면 여전히 예측할 수 있습니다. 모델에 더 많은 데이터를 제공 할 수있어서 문제를 해결할 수 있습니까? – Anton
두 개의 센서가 동기화되지 않으면 대부분의 관측치에서 하나 또는 다른 측정 값이 누락됩니다. 한 열이 누락 된 값이있을 때 pykalman은 전체 관측 값을 떨어 뜨리는 것으로 보입니다. 그래서, 위의 예에서 그것은 단지 하나의 overation이있는 것처럼 행동합니다. 그게 도움이된다면 좀 더 자세히 설명해 드리겠습니다. – Adam
센서의 정밀도에 대한 정보가 있습니까? 너는 분산을 정의해야하지, 그렇지? 그리고 파이 칼만을 사용해야합니까? 파이썬으로 자신의 필터를 설계하는 것은 어렵지 않습니다. 그래서 당신이 충분한 정보를 제공한다면 나는 그것을 할 수 있습니다. 나는이 화제를 좋아한다. – Anton