Kalman Filter를 이해하는 과정
객체 추적을 공부하면서 가장 먼저 부딪힌 문제는 “현재 객체의 위치를 알았을 때, 다음 순간의 위치와 속도를 어떻게 안정적으로 추정할 것인가?”였다. 센서가 주는 위치는 매번 조금씩 흔들리고, 두 프레임의 위치 차이를 시간으로 나누는 단순한 방법은 작은 위치 오차를 큰 속도 오차로 바꿔버린다.
Kalman Filter는 이 문제를 다루는 재귀적 상태 추정기다. 시스템의 상태를 하나의 확정된 숫자로 단정하지 않고, “이 상태일 가능성이 어느 정도인가”라는 Gaussian 확률 분포로 표현한다. 그 뒤 물리 모델을 이용해 다음 상태를 예측하고, 새로 들어온 측정값을 이용해 예측을 보정한다.
아래 글은 이 흐름을 발표 자료로 공부한 내용을 바탕으로 다시 설명한 기록이다. 그림은 설명을 보조하기 위한 참고 자료로 배치했고, 그림을 읽는 데 필요한 내용은 본문에서 이어지는 논리로 풀어 썼다.
왜 위치만으로는 속도를 구하기 어려운가
LiDAR나 카메라로 객체를 검출하면 각 시점의 위치를 얻을 수 있다. 가장 단순한 속도 계산은 다음과 같다.
하지만 위치에 노이즈가 섞여 있으면 문제가 생긴다. 프레임 간격이 0.1초인데 위치 오차가 1m만 생겨도 속도에는 10m/s, 즉 36km/h에 해당하는 오차가 생긴다. 속도를 구하기 위해 위치를 미분하는 순간 센서 노이즈가 증폭되는 것이다.
게다가 두 시점의 검출 결과가 같은 객체인지 먼저 알아야 한다. 과거 프레임의 객체와 현재 프레임의 객체를 올바르게 연결하는 data association이 틀리면, 실제로는 다른 객체의 위치 차이를 속도로 계산하게 된다. 따라서 추적 시스템에서는 객체 매칭, 대표 tracking point 선택, 상태 추정을 하나의 흐름으로 봐야 한다.
Kalman Filter의 핵심은 재귀적 추정이다
Kalman Filter는 재귀 필터의 한 종류다. 재귀적이라는 것은 k번째 변수를 k-1번째 변수에 대한 함수로 표현할 수 있다는 뜻이다. Kalman Filter에서는 k-1번째 추정 상태와 k번째 측정 위치를 입력값으로 사용해 k번째 추정 상태를 출력한다. 따라서 k번째 상태를 계산하기 위해 모든 과거 센서 데이터를 매번 처음부터 다시 읽을 필요가 없다.
k-1번째까지의 정보는 추정 상태와 오차 공분산이라는 요약값으로 보존된다. 새로운 측정값이 들어오면 이 요약값과 측정값을 결합해 현재 상태를 계산하고, 그 결과를 다음 단계의 입력으로 넘긴다. 이것이 Kalman Filter가 시간의 흐름을 따라 상태를 추적하면서도 일정한 형태의 계산을 반복할 수 있는 이유다.
첫 번째 관측에서는 이전 상태가 없으므로 위치를 측정한 뒤 그 측정값을 Kalman Filter의 초기 상태로 사용한다. 첫 번째 관측에서는 비교할 과거 상태가 없기 때문에 아직 본격적인 추정을 수행하지 않는다. 추정은 두 번째 관측부터 시작된다.
두 번째 관측 시점에서는 첫 번째 관측에서 만든 초기 상태가 과거 상태로 바뀐다. 동시에 센서가 새로운 현재 위치를 측정한다. 이제 Kalman Filter는 과거 상태와 새 측정값을 함께 사용할 수 있다.
먼저 예측 시스템 A를 이용해 과거 상태를 현재 시점으로 이동시킨다. 이것이 prediction이다. 이후
prediction으로 얻은 예측 상태와 두 번째 관측에서 얻은 현재 측정 위치를 함께 활용해 현재 상태를 추정한다.
즉, prediction은 “모델에 따르면 지금 어디에 있을까?”를 계산하고, update는 “새로운 센서 측정까지 고려하면 지금
어디에 있다고 보는 것이 가장 합리적일까?”를 계산한다.
k번째 관측에서도 같은 과정이 반복된다. k-1번째 추정 상태를 과거 상태로 넘기고, 예측 시스템으로 k번째 상태를 예측한 다음, k번째 측정 위치로 현재 상태를 보정한다. 이렇게 추정 상태가 재귀적으로 갱신되며, 시스템 모델과 측정 노이즈가 적절히 설정되어 있다면 반복할수록 실제 위치와 추정 위치의 오차가 줄어든다.







Prediction과 Update
Kalman Filter의 알고리즘은 초기화 이후 Prediction과 Update를 반복하는 구조로 정리할 수 있다. Prediction에서는 상태의 평균뿐 아니라 상태가 얼마나 불확실한지도 함께 예측한다. Update에서는 measurement를 입력하고 Kalman gain을 계산한 뒤, 상태와 오차 공분산을 갱신한다.


예측 시스템은 물리 모델에서 출발한다
Kalman Filter가 다음 상태를 예측하려면 상태가 시간에 따라 어떻게 변하는지 설명하는 시스템 모델이 필요하다. 이 모델은 필터가 알아서 발견하는 것이 아니라 문제를 이해한 사람이 설계한다. 차량의 위치와 속도를 추정한다면 위치와 속도의 관계, 시간 간격, 등속도 또는 가속도에 대한 가정을 모델에 넣는다.

이미지의 예시에서는 과거 위치가 \(5\,\mathrm{m}\), 속도가 \(10\,\mathrm{m/s}\), 시간 간격이 \(1\,\mathrm{s}\)다. 등속도 가정에서는 속도에 시간 간격을 곱한 이동 거리를 과거 위치에 더해 현재 위치를 예측한다.

그림의 예측 Gaussian은 단순히 자동차의 위치 하나만 표시한 것이 아니다. 중심은 예측 위치이고 폭은 예측의 불확실성이다. 따라서 시스템 행렬은 평균을 이동시키는 역할과 함께, 이전 공분산을 현재 시점으로 전달하는 역할도 한다.
발표 자료에서는 상태를 Gaussian 분포로 표현하는 것을 다음처럼 적었다. 여기서 \(\mu\)는 평균이고 \(\sigma\)는 표준편차다. 공분산을 사용하는 다변량 상태에서는 \(\sigma^2\) 대신 공분산 행렬 \(\mathbf{P}\)를 사용한다.
다만 모델이 현실을 완벽하게 설명할 수는 없다. 등속도 모델을 사용해도 실제 차량은 가속하거나 감속할 수 있고, 바람, 노면, 타이어 상태, 운전자의 조작처럼 미리 정확하게 알 수 없는 요인이 있다. 이 모델 오차와 외부 요인을 process noise로 다룬다.

상태를 Gaussian 확률 분포로 표현한다
실제 객체의 상태를 완벽하게 알 수 없을 때, 하나의 값만 저장하면 그 값이 얼마나 믿을 만한지 알 수 없다. Kalman Filter는 상태를 Gaussian 분포로 표현한다. 분포의 평균은 가장 가능성이 높은 상태를 뜻하고, 분산 또는 공분산은 그 상태의 불확실성 크기를 뜻한다.

초기 상태의 평균과 공분산을 각각 \(\hat{\mathbf{x}}_0\), \(\mathbf{P}_0\)라고 하자. 예측 시스템 \(\mathbf{A}\)를 적용하면 평균은 예측 위치로 이동하고, 공분산에는 process noise covariance \(\mathbf{Q}\)가 더해진다.
여기서 세 가지를 분리해서 이해해야 한다. 상태 x는 알고 싶은 실제 물리량이고, 추정 상태는 그 상태에
대한 현재의 믿음이다. 추정 상태의 오차 공분산은 P로 표현한다. 반면 Q는 process noise의
공분산이고, R은 measurement noise의 공분산이다. Q와 R은 P와
같은 대상이 아니라, P가 어떻게 변할지를 결정하는 노이즈 모델이다.

일변량 Gaussian 변수 두 개의 합을 생각하면 평균은 더해지고, 서로 독립인 경우 분산도 더해진다.
등속도 모델로 위치와 속도를 함께 예측하기
가장 단순한 상태 벡터를 위치와 속도로 두자.
등속도 모델은 짧은 시간 동안 속도가 유지된다고 가정한다. 그러면 다음 위치는 이전 위치에 속도와 시간 간격의
곱을 더한 값이 된다. 이 관계를 행렬로 쓰면 상태 전이 행렬 A를 통해 이전 상태를 현재 예측 상태로
바꿀 수 있다.
속도는 위치의 변화량으로 정의할 수 있다. 이전 위치를 p_{k-1}, 현재 위치를 p_k,
시간 간격을 \(\Delta t\)라고 하면 다음과 같다.
등속도 모델에서는 과거의 속도와 현재의 속도가 같다고 가정한다.
위치와 속도를 하나의 상태 벡터로 묶으면, 등속도 시스템은 다음과 같은 행렬식으로 표현할 수 있다.
이때 A가 예측 시스템이고, 오른쪽의 상태 벡터가 과거 상태다.
이제 상태를 추정값으로 쓰면, k-1 시점의 추정 상태는 \(\hat{\mathbf{x}}_{k-1} = [p_{k-1}, v_{k-1}]^T\)이고 예측된 현재 상태는 다음과 같다.
상태값은 하나의 확정된 점이 아니라 Gaussian 분포를 따른다고 가정한다. 따라서 상태의 평균은 추정 상태이고, 공분산 행렬은 위치와 속도의 불확실성 및 두 변수 사이의 상관관계를 담는다.
\(\Sigma_{pp}\)는 위치의 분산, \(\Sigma_{vv}\)는 속도의 분산이며,
\(\Sigma_{pv}\)와 \(\Sigma_{vp}\)는 위치와 속도 사이의 공분산이다.
예측 시스템을 상태에 적용하면 공분산은 선형 변환의 성질에 따라 A P A^T로 변환된다.
그러므로 process noise를 아직 추가하지 않은 prediction은 다음 두 식으로 정리된다. 첫 번째 식은 상태 평균을 이동시키고, 두 번째 식은 그 상태의 불확실성을 시스템 행렬에 맞춰 전파한다.
초기 위치에서 prediction을 시작하면 평균은 모델이 예상한 위치로 이동한다. 동시에 예측 분포는 넓어진다. 시스템이 진행되는 동안 모델이 설명하지 못하는 오차가 새로 더해지기 때문이다.


공분산의 예측식은 다음과 같다.
A P A^T는 이전 불확실성이 시스템 모델을 거쳐 전달된 결과이고, Q는 이번 단계에서 새로
추가된 process noise다. Gaussian random variable에 독립적인 Gaussian noise가 더해지면 합도 Gaussian으로
표현할 수 있고, 공분산은 그 오차들의 공분산이 합쳐지는 형태가 된다.

Measurement에도 오차가 있다
Prediction만 계속하면 모델 오차가 누적된다. 그래서 센서 measurement를 사용해 현재 상태를 보정한다. 그러나 measurement 역시 정답은 아니다. LiDAR 검출 위치에도 센서 노이즈가 있고, 가려짐이나 반사 때문에 관측이 틀릴 수도 있다.


측정값의 불확실성은 R로 표현한다. R이 작으면 센서를 더 정확한 정보로 보고,
R이 크면 측정값을 덜 신뢰한다. Prediction의 공분산 P^-와 measurement noise R을
비교하는 것이 update의 핵심이다.
선형 측정 모델은 상태를 measurement 공간으로 옮기는 행렬 \(\mathbf{H}\)와 측정 노이즈 \(\mathbf{v}_k\)로 표현할 수 있다. 측정 노이즈는 평균이 0이고 공분산이 \(\mathbf{R}\)인 Gaussian으로 모델링한다.

두 Gaussian의 곱은 두 정보가 동시에 지지하는 posterior Gaussian이 된다. 일변량 예시에서는 다음 식으로 평균과 분산을 계산할 수 있다.
예를 들어 \(\mu_0=10\), \(\sigma_0^2=8\), \(\mu_1=12\), \(\sigma_1^2=2\)라면 다음과 같다.


Bayes Filter로 이해하는 Update
Update는 Bayes 정리의 관점에서 이해하면 자연스럽다. 상태를 x, 새 measurement를 z라고
하면 다음 관계를 생각할 수 있다.
p(x)는 measurement를 보기 전의 prior다. Kalman Filter에서는 prediction으로 얻은 상태 분포가 prior가
된다. p(z | x)는 상태가 주어졌을 때 해당 measurement가 관측될 가능도(likelihood)이고, 센서의
measurement noise R을 반영한다. 둘을 곱하고 정규화한 p(x | z)가 measurement를 반영한
posterior, 즉 현재의 추정 상태 분포다.


선형 시스템과 Gaussian noise라는 조건에서는 이 posterior도 Gaussian이 된다. 그래서 평균과 공분산만 저장하면서 다음 단계로 넘어갈 수 있다. Kalman Filter는 이 Gaussian Bayesian update를 계산 가능한 재귀식으로 구현한 것으로 이해할 수 있다.





여기서 “posterior 분산이 더 작아진다”는 사실은 두 독립 정보를 결합했기 때문에 생긴다. 그렇다고 실제 시스템의
불확실성이 언제나 줄어든다는 뜻은 아니다. R을 잘못 작게 잡거나 outlier를 정상 측정으로 받아들이면
필터가 실제보다 자신을 과신할 수 있다. 공분산은 확률 분포에 대한 모델의 믿음이지, 현실의 오차를 자동으로
보장하는 측정값은 아니다.
Kalman Gain은 신뢰도의 비율을 계산한다
Gaussian product에서 posterior 평균과 공분산을 정리하면 반복해서 등장하는 공통 항이 있다. 이 항을 Kalman gain
K라고 부른다. 선형 측정 모델 H를 사용하는 경우 대표적인 식은 다음과 같다.
일변량에서 위 식은 두 Gaussian product의 평균식을 Kalman Filter 형태로 다시 쓴 것이다. 예측 공분산이 클수록 measurement를 더 반영하고, 측정 노이즈 공분산이 클수록 prediction을 더 믿게 된다.
상태 update는 다음처럼 쓸 수 있다.
상태 평균뿐 아니라 update 이후의 불확실성도 갱신한다. 선형 측정 모델의 공분산 갱신식은 다음과 같다.
괄호 안의 z_k - H x_k^-는 measurement residual 또는 innovation이다. Kalman gain은 이 잔차를 상태에
얼마나 반영할지 결정한다. 예측 공분산이 크면 “모델을 확신하기 어렵다”는 뜻이므로 측정값의 영향이 커지고,
R이 크면 “센서를 믿기 어렵다”는 뜻이므로 측정값의 영향이 작아진다.



이 점에서 Kalman gain은 1차 저역통과 필터의 alpha와 비슷한 역할을 한다. 하지만 alpha를
고정해 두는 것과 다르게 Kalman gain은 현재의 P^-, R, H로부터 매 단계
계산된다. 따라서 센서와 모델의 불확실성이 바뀌면 가중치도 자동으로 바뀐다.

위치 측정으로 속도까지 추정할 수 있는 이유
마지막으로 가장 궁금했던 속도 추정의 원리를 정리해보자. 센서가 위치만 측정한다고 해서 상태 벡터에 위치만 넣어야 하는 것은 아니다. 위치와 속도를 함께 상태로 두면 다음과 같이 2차원 상태 공간을 만들 수 있다.
2차원 Gaussian에서는 공분산이 위치 오차와 속도 오차의 관계를 나타낸다. 공분산이 0이면 두 오차가 독립적이라 분포 타원의 기울기가 없고, 공분산이 0이 아니면 위치와 속도 사이에 상관관계가 있어 타원이 기울어진다.

measurement가 위치 하나만 관측하더라도 residual은 Kalman gain의 각 성분을 통해 상태 벡터의 여러 성분에
반영된다. 위치 성분에는 K_pos가 곱해지고 속도 성분에는 K_vel이 곱해진다.
즉 속도를 직접 측정한 것이 아니다. motion model이 위치와 속도를 연결하고, 두 상태의 오차 공분산이 남아 있기 때문에 위치 measurement의 오차가 속도 상태에도 전달된다. 위치가 예측보다 크게 벗어났다면, 필터는 그 차이를 현재 속도 추정에도 반영해 다음 위치 예측을 바꾼다.

마무리
Kalman Filter는 noisy한 센서값을 단순히 평균내는 필터가 아니다. 상태를 Gaussian 분포로 표현하고, 물리 모델로 상태와 불확실성을 prediction한 뒤, 새 measurement를 Bayes 관점에서 결합해 posterior를 계산하는 재귀적 상태 추정기다.
이 구조에서 모델링과 튜닝은 중요한 역할을 한다. 어떤 값을 상태로 둘지, 상태가 어떻게 변할지, process noise
covariance Q와 measurement noise covariance R을 어떻게 설정할지를 사람이 결정한다.
필터는 그 설계를 바탕으로 각 시점의 Kalman gain과 상태를 계산한다.
또한 Gaussian product에서 update 후 공분산이 작아지는 것은 두 정보를 결합한 수학적 결과이지, 필터가 항상 현실을 정확히 안다는 뜻은 아니다. 잘못된 모델, outlier, 시간에 따라 달라지는 센서 노이즈까지 고려하려면 이후 adaptive noise, EKF, UKF, IMM, factor graph와 smoothing으로 공부를 확장해야 한다.