칼만필터

허준·2022년 8월 6일

참고:
https://gaussian37.github.io/ad-ose-lkf_basic/
https://namu.wiki/w/%EC%B9%BC%EB%A7%8C%20%ED%95%84%ED%84%B0

칼만필터가 쓰이는 곳은, '오차를 갖는' 관측치에서 '시스템의 상태'를 추정하거나 제어할 때이다.
동적 시스템에 대한 정보가 확실하지 않을 때 다음 수행 작업에 대한 추측이 가능.
노이즈를 제거해 주는 역할을 하며, 연산과정 또한 빠르다.

좋은 예시가 올라와 있으니 따라가 보자.
x=(p,v)가 상태. p는 위치, v는 속도고, p를 측정하는 센서와 v를 측정하는 센서가 하나씩 있다. 문제는 두 센서 모두 오차가 있다는 것.

x=[p v]' 로 나타낼 때, 실제 값을 범위 내로 추측 가능. 칼만 필터에서는 각 변수를 랜덤 정규분포로 가정한다. 두 변수의 상관관계를 파악하는 것이 칼만 필터의 한 가지 목적. 공분산을 통해 정의
Xk=[p v]', Pk=[sigma_pp sigma_pv
sigma_vp sigma_vv] 로 두고 시작한다.

이제 현재의(k-1) '예측' 정보를 토대로 새로운 상태(k)를 추측하는게 목적

물리 식을 통해 일단 기본 식을 알 수 있다.
pk=p_k-1+delta t*v(k-1)
v_k=v_k-1
x_k=[1 delta t
0 1 ] x_k-1 =F_kx_k-1

수학적으로 알아야 되는 사전 식이 있는데, cov(x) = sigma 라할 때, cov(Ax)=AsigmaA' 라는 것이다.
이를 이용하면 P_k=F_kP_k-1F_k-1이 된다.

여기까지가 기본 모델이고, 여기에 추가 외부효과를 넣을 수도 있다. 원래 식에서 추가 벡터와 행렬을 추가하게 된다.

잠깐 추가 내용으로, 고려해 봐야 할 점이 있다. 측정 값과, 추정값에서 단위나 크기의 범위가 다를 수 있으므로 조정이 필요하다는 점이다. 이때 변환행렬을 적용하게 된다. 여기서 문제가 되는 것은 노이즈다. 노이즈를 어떻게 다뤄줄 것인가?

칼만 필터는 기존 추측값을 특정 값이 아닌, 센서값의 범위로 변환해 준다.
이렇게 센서값에 관련된 분포와, 추측값이 변환된 분포 2개의 분포를 갖게 되며, 이때 겹치는 부분의 분포를 이용하는 것이 더 정확해 여기서 분포를 구하게 된다.

수식을 건너고, 두 정규분포의 곱 또한 정규분포가 나온다. 따라서 정규분포 식을 새로 얻게 된다.
이를 통해 kalman gain을 얻게 되며, 이를 통해 추측값을 계속해서 갱신할 수 있게 된다.

profile
퀀트 지망(Quant candidate)

0개의 댓글