칼만 필터를 이용한 첫번째 예제는 '14V의 전압이 일정하게 출력되는 배터리의 노이즈를 제거'하는 것이다. 칼만 필터를 이용하기 위해서 가장 먼저 시스템 모델을 정의한다.
1.1
1.2
1.1
을 먼저 살펴보자. DC배터리의 전압은 일정하게 유지되므로 이전 스텝의 상태변수와 다음 스텝의 상태변수가 같다. 또한 Measurement value인 의 경우 State variable인 와 Measurement noise인 의 합으로 나타낼 수 있다. 이에 따라 칼만필터의 파라미터는 다음과 같이 정의된다.
가장 먼저 의 경우 2.1
의 상태방정식에서 증명할 수 있다.
2.1
2.1
의 상태방정식과 1.1
을 비교해보면 이라는 사실을 알 수 있으며 또한 시스템 잡음인 항이 존재하지 않으므로 이다. 따라서 는 의 공분산 행렬인데 이것이 존재하지 않으므로 0이되는 것을 알 수 있다. 두번째로 의 경우 3.1
의 식에서 확인할 수 있다.
3.1
3.1
과 1.2
를 비교하면 마찬가지로 이라는 것을 알 수 있으며 의 경우 Measurement noise인 의 공분산 행렬인데 의 분포를 가지므로 이에 따라 스칼라 값인 로 결정된다. 최종적으로 이를 확인하기 위해 칼만 필터의 알고리즘에 따라 초깃값을 다음과 같이 선정하였다.
칼만 필터의 블록 다이어그램은 위의 사진과 같다. 이를 토대로 코드를 작성했다.
function [volt, Px, K] = SimpleKalman(z)
%{
System Model
x_(k+1) = x_k (배터리의 전압이 일정하게 유지되므로 이전상태와 현재상태가 동일)
z_k = x_k + v_k (Measurement Value = State Variable + Measurement Noise)
x_0 = 14 (Initial State Value = 14)
v_k ~ N(0, 4) (Normal Distribution, mean = 0, variance = 4)
%}
persistent A H Q R
persistent x_hat P
persistent firstRun
if isempty(firstRun)
A = 1;
H = 1;
Q = 0; % w_k(시스템 잡음)의 공분산 행렬(Diagonal Matrix)
R = 4; % v_k(센서 측정 잡음)의 공분산 행렬(Diagonal Matrix)
x_hat = 14; % x_0(Initial Value)
P = 6; % P_0 (Initial Error Covariance)
firstRun = 1;
end
% Prediction
x_pred = A * x_hat;
P_pred = A*P*A' + Q;
% Calculate Kalman Gain
K = (P_pred*H')/(H*P_pred*H' + R);
% Update
x_hat = x_pred + K*(z - H*x_pred);
P = P_pred - K*H*P_pred;
% return Estimated State Value & Error Covariance
volt = x_hat;
Px = P;
end
시간이 흘러감에 따라 효과적으로 노이즈를 제거하면서, 동시에 오차 공분산값인 와 칼만 이득값인 가 작아지는 것을 확인할 수 있다. 결론적으로 오차 공분산이 줄어든다는 것은 추정값의 오차가 감소하는 것을 의미한다. 또한, 칼만 이득이 작아짐에 따라 새로운 추정값인 는 예측값인 의 영향이 작아지고 이전 예측값 즉, 의 영향이 커지게 된다. 결국 이전 추정값의 영향을 더 받게 된다는 의미이다.
칼만 필터는 어렵지 않아 - 김성필 저, 한빛아카데미