4P by GN⁺ | ★ favorite | 댓글 1개
  • 칼만 필터는 잡음이 섞인 센서 측정과 불완전한 동적 모델을 함께 사용해, 현재 상태와 다음 상태의 불확실성까지 추정하는 알고리듬임
  • 튜토리얼은 항공기 레이더 추적 예제로 거리 (r)와 속도 (v)를 상태 벡터로 두고, 예측값과 측정값을 결합하는 과정을 수치로 따라감
  • 초기 측정값 (10,000m), (200m/s)와 샘플링 간격 (5s)를 쓰면 상수 속도 모델에서 다음 위치는 (11,000m)로 예측되며, 측정 잡음 (R)과 공정 잡음 (Q)가 공분산에 반영됨
  • 두 번째 측정값 (11,020m), (202m/s)는 더 불확실하지만, 칼만 이득 (K)가 예측과 측정을 가중 결합해 갱신 상태를 (11,009.37m), (201.43m/s)로 계산함
  • 초기화 뒤에는 예측-갱신 루프가 반복되며, 실제 구현에서는 Joseph form 같은 안정적인 공분산 갱신식과 이상 측정값 처리까지 고려해야 함

칼만 필터가 푸는 추정 문제

  • 칼만 필터는 불확실성이 있는 환경에서 시스템의 상태를 추정하고 예측하는 알고리듬임
    • 측정 잡음이 있는 센서 데이터
    • 알려지지 않은 외부 요인
    • 동적 모델과 실제 움직임 사이의 차이
  • 객체 추적, 내비게이션, 로보틱스, 제어, 금융 시장 분석, 기상 예측 등에 쓰임
  • 컴퓨터 마우스 궤적 추정에 적용하면 잡음을 줄이고 손 떨림을 보정해 더 안정적인 이동 경로를 만들 수 있음
  • 튜토리얼은 복잡한 수학 설명보다 수치 예제와 직관적 설명으로 칼만 필터를 이해하도록 구성됨
  • 잘못 설계된 상황에서 칼만 필터가 물체를 제대로 추적하지 못하는 예와 이를 보정하는 방법도 포함함

학습 경로

  • 이 프로젝트는 칼만 필터를 세 가지 깊이로 학습할 수 있게 구성됨
    • 단일 페이지 개요: 핵심 아이디어와 필수 방정식을 유도 없이 설명하며, 기본적인 통계와 선형대수 지식을 가정함
    • 무료 예제 기반 웹 튜토리얼: 수치 예제로 직관을 만들고 칼만 필터 방정식 유도까지 단계적으로 다루며, 사전 지식이 필요 없다고 안내함
    • Kalman Filter from the Ground Up: 14개의 완전 풀이 수치 예제, 성능 플롯과 표, Extended Kalman Filter, Unscented Kalman Filter, 센서 융합, 구현 가이드라인을 포함함

레이더 추적 예제로 보는 예측 요구

  • 항공기를 추적하는 레이더에서는 항공기가 시스템이고, 추정해야 할 위치가 시스템 상태
  • 레이더는 좁은 빔을 항공기 방향으로 조향하므로, 다음 빔을 어디로 보낼지 정하려면 미래 위치를 예측해야 함
    • 예측에 실패하면 빔이 잘못된 방향을 향해 추적을 잃을 수 있음
    • 시간에 따른 시스템 움직임을 나타내는 동적 모델이 필요함
  • 단순화된 1차원 예제에서는 항공기가 레이더를 향하거나 멀어지는 직선 방향으로 움직인다고 가정함
    • 레이더는 펄스 송수신 시간으로 거리 (r)를 계산함
    • 도플러 효과로 속도 (v)도 측정할 수 있음
  • (t_0)에서 거리 (10,000m), 속도 (200m/s)가 매우 정확하게 측정되고, 샘플링 간격 (\Delta t=5s)이며 속도가 일정하다고 가정하면 다음 위치는 (11,000m)임
    • (\Delta r = v \cdot \Delta t)
    • (r_{t_1}=10,000+200\cdot5=11,000m)

측정 잡음과 공정 잡음

  • 실제 레이더 측정은 완벽히 정밀하지 않아, 같은 순간에 여러 레이더가 측정해도 서로 조금씩 다른 값을 낼 수 있음
    • 이 변동은 측정 잡음으로 표현됨
    • 상태 추정값뿐 아니라 그 추정이 얼마나 신뢰할 만한지도 계산해야 함
  • 동적 모델도 완벽하지 않음
    • 항공기가 일정 속도로 움직인다고 가정해도 바람 같은 외부 요인 때문에 실제 움직임이 달라질 수 있음
    • 이런 예측 불가능한 영향은 공정 잡음
  • 칼만 필터는 현재 상태 추정, 미래 상태 예측, 그리고 각각의 불확실성을 함께 제공함
  • 시스템과 잡음이 모델의 가정을 따른다는 조건에서 상태 추정 불확실성을 최소화하는 최적 알고리듬임

상태 벡터와 초기화

  • 예제의 시스템 상태는 항공기의 거리 (r)와 속도 (v)로 구성됨

[ \boldsymbol{x}= \begin{bmatrix} r\ v \end{bmatrix} ]

  • 첫 번째 측정값은 (t_0)에서 다음과 같음

[ \boldsymbol{z}_0= \begin{bmatrix} 10{,}000\ 200 \end{bmatrix} ]

  • 측정값에는 불확실성이 있으므로 각 측정에는 분산 형태의 측정 불확실성이 붙음
    • 거리 측정 표준편차: (4m)
    • 속도 측정 표준편차: (0.5m/s)
    • 분산은 표준편차의 제곱임

[ \boldsymbol{R}_0= \begin{bmatrix} 16 & 0\ 0 & 0.25 \end{bmatrix} ]

  • 이 예제에서는 거리와 속도 측정 오류가 서로 관련 없다고 가정해 공분산 행렬의 비대각 원소를 0으로 둠
  • 초기화 단계에서는 측정값과 시스템 상태가 같은 물리량 (r), (v)를 나타내므로 첫 측정값을 초기 상태 추정값으로 사용할 수 있음

[ \hat{\boldsymbol{x}}_{0,0}= \boldsymbol{z}_0= \begin{bmatrix} 10{,}000\ 200 \end{bmatrix} ]

  • 이 방식은 초기화 단계에서만 사용할 수 있음

예측 단계: 상태와 공분산 전파

  • 예측은 현재 상태와 상태 전이 행렬 (\boldsymbol{F})를 사용해 다음 시점의 상태를 계산함
  • 상수 속도 모델에서는 다음 식을 사용함

[ v_1=v_0=v ]

[ r_1=r_0+v_0\Delta t ]

  • 행렬 형태의 상태 예측식은 다음과 같음

[ \hat{\boldsymbol{x}}_{n+1,n}

\boldsymbol{F} \hat{\boldsymbol{x}}_{n,n} + \boldsymbol{G}\boldsymbol{u}_n ]

  • (\boldsymbol{u}_n): 입력 변수
  • (\boldsymbol{G}): 입력 전이 행렬
  • 이 단순 예제에서는 입력이 없어서 (\boldsymbol{u}_n=0)
  • (\Delta t=5s)일 때 상태 전이 행렬은 다음과 같고, 예측 결과는 (11,000m), (200m/s)임

[ \boldsymbol{F}= \begin{bmatrix} 1 & 5\ 0 & 1 \end{bmatrix} ]

[ \hat{\boldsymbol{x}}_{1,0}

\begin{bmatrix} 11{,}000\ 200 \end{bmatrix} ]

  • 공분산 예측은 단순히 (\boldsymbol{F}\boldsymbol{P})가 아니라 (\boldsymbol{F}\boldsymbol{P}\boldsymbol{F}^T)를 사용함

[ \boldsymbol{P}_{n+1,n}

\boldsymbol{F} \boldsymbol{P}_{n,n} \boldsymbol{F}^T + \boldsymbol{Q} ]

  • 공정 잡음을 제외하면 예측 공분산은 다음과 같음

[ \boldsymbol{P}_{1,0}

\begin{bmatrix} 22.25 & 1.25\ 1.25 & 0.25 \end{bmatrix} ]

  • 속도 분산은 상수 속도 모델 때문에 (0.25)로 유지됨
  • 거리 분산은 속도 불확실성이 시간에 따라 거리 불확실성을 키우므로 (16)에서 (22.25)로 증가함

공정 잡음 반영

  • 실제 항공기 속도는 바람 같은 예측 불가능한 외부 요인 영향을 받을 수 있으므로 공정 잡음 (\boldsymbol{Q})를 공분산 예측에 더함
  • 예제에서는 랜덤 가속도의 표준편차를 (\sigma_a=0.2m/s^2)로 가정함
    • 분산은 (\sigma_a^2=0.04m^2/s^4)
  • (\Delta t=5s)일 때 공정 잡음 행렬은 다음과 같음

[ \boldsymbol{Q}

\begin{bmatrix} 6.25 & 2.5\ 2.5 & 1 \end{bmatrix} ]

  • 공정 잡음을 더한 예측 공분산은 다음과 같음

[ \boldsymbol{P}_{1,0}

\begin{bmatrix} 28.5 & 3.75\ 3.75 & 1.25 \end{bmatrix} ]

갱신 단계: 예측과 측정의 가중 결합

  • (t_1)에서 두 번째 측정값은 다음과 같음

[ \boldsymbol{z}_1= \begin{bmatrix} 11{,}020\ 202 \end{bmatrix} ]

  • 이 측정은 강한 잡음 스파이크로 신호대잡음비가 낮아져 첫 번째 측정보다 불확실성이 크다고 가정함
    • 거리 표준편차: (6m)
    • 속도 표준편차: (1.5m/s)

[ \boldsymbol{R}_1= \begin{bmatrix} 36 & 0\ 0 & 2.25 \end{bmatrix} ]

  • 예측 공분산 (\boldsymbol{P}_{1,0})의 대각 원소는 측정 공분산 (\boldsymbol{R}_1)보다 작으므로 예측 쪽 불확실성이 더 낮음
  • 칼만 필터는 예측만 쓰거나 측정만 쓰지 않고, 불확실성이 낮은 쪽에 더 큰 가중치를 주어 결합함
  • 1차원 형태의 가중 평균은 다음과 같음

[ \hat{x}_{1,1}

K_1 z_1 + (1-K_1)\hat{x}_{1,0} ]

  • (\boldsymbol{K})는 칼만 이득이며, 갱신된 추정값의 불확실성을 최소화하도록 측정과 예측의 가중치를 정함

혁신, 관측 행렬, 칼만 이득

  • 상태 갱신식은 예측값에 보정항을 더하는 형태로 쓸 수 있음

[ \hat{\boldsymbol{x}}_{1,1}

\hat{\boldsymbol{x}}_{1,0} + \boldsymbol{K}_1 ( \boldsymbol{z}_1

\boldsymbol{H}\hat{\boldsymbol{x}}_{1,0} ) ]

  • (\boldsymbol{z}1-\boldsymbol{H}\hat{\boldsymbol{x}}{1,0})는 혁신(innovation) 또는 잔차(residual)이며, 새 측정이 제공하는 정보를 나타냄
  • (\boldsymbol{H})는 관측 행렬 또는 측정 행렬로, 상태 변수를 실제 측정되는 물리량으로 매핑함
    • 이 예제에서는 상태와 측정이 모두 거리와 속도이므로 (\boldsymbol{H}=\boldsymbol{I})
    • 일반적으로는 디지털 온도계처럼 측정값과 상태가 서로 다른 물리 영역에 있을 수 있음
  • 다변량 칼만 이득은 다음과 같음

[ \boldsymbol{K}_n

\boldsymbol{P}{n,n-1} \boldsymbol{H}^T ( \boldsymbol{H} \boldsymbol{P}{n,n-1} \boldsymbol{H}^T + \boldsymbol{R}_n )^{-1} ]

  • 예제에서 계산된 칼만 이득은 다음과 같음

[ \boldsymbol{K}_1= \begin{bmatrix} 0.4048 & 0.6377\ 0.0399 & 0.3144 \end{bmatrix} ]

  • 행렬 역행렬 계산은 MATLAB의 inv(A) 또는 Python의 numpy.linalg.inv(A)로 가능하지만, 실제 구현에서는 명시적 역행렬보다 A\b 또는 numpy.linalg.solve(A, b)처럼 선형 시스템을 직접 푸는 방식이 일반적으로 더 나음

갱신 결과와 공분산 감소

  • 이 예제의 혁신은 다음과 같음

[ \boldsymbol{z}1-\hat{\boldsymbol{x}}{1,0}

\begin{bmatrix} 20\ 2 \end{bmatrix} ]

  • 칼만 이득으로 보정항을 계산하면 다음과 같음

[ \boldsymbol{K}_1 \begin{bmatrix} 20\ 2 \end{bmatrix}

\begin{bmatrix} 9.37\ 1.43 \end{bmatrix} ]

  • 갱신된 상태 추정값은 다음과 같음

[ \hat{\boldsymbol{x}}_{1,1}

\begin{bmatrix} 11{,}009.37\ 201.43 \end{bmatrix} ]

  • 다변량 공분산 갱신에는 수치적으로 안정적인 Joseph form이 흔히 사용됨

[ \boldsymbol{P}_{n,n}

(\boldsymbol{I}-\boldsymbol{K}n\boldsymbol{H}) \boldsymbol{P}{n,n-1} (\boldsymbol{I}-\boldsymbol{K}_n\boldsymbol{H})^T + \boldsymbol{K}_n \boldsymbol{R}_n \boldsymbol{K}_n^T ]

  • 단순화된 공분산 갱신식도 문헌에서 자주 보임

[ \boldsymbol{P}_{n,n}

(\boldsymbol{I}-\boldsymbol{K}n\boldsymbol{H}) \boldsymbol{P}{n,n-1} ]

  • 정확한 산술에서는 두 형태가 같은 결과를 주지만, 컴퓨터 구현에서는 Joseph form이 일반적으로 더 수치적으로 안정적임
  • 예제에서 단순화된 식으로 계산한 갱신 공분산은 다음과 같음

[ \boldsymbol{P}_{1,1}

\begin{bmatrix} 14.57 & 1.43\ 1.43 & 0.71 \end{bmatrix} ]

  • 갱신 공분산의 대각 원소는 예측 공분산 ((28.5, 1.25))과 측정 공분산 ((36, 2.25))보다 낮음
  • 새 정보는 불확실성이 높더라도 추정 불확실성을 줄이며, 이론적으로 새 측정은 무시하지 않아야 함
  • 실제 구현에서는 신뢰할 수 없는 측정값을 거부해야 하는 경우가 있으며, 이상값 처리 방법은 책의 Outlier Treatment 장에서 다룸

다음 예측과 반복 루프

  • Iteration 1의 예측 단계는 Iteration 0과 같지만, 시작점이 갱신된 (\hat{\boldsymbol{x}}{1,1})과 (\boldsymbol{P}{1,1})로 바뀜
  • 상태 예측 결과는 다음과 같음

[ \hat{\boldsymbol{x}}_{2,1}

\boldsymbol{F} \hat{\boldsymbol{x}}_{1,1}

\begin{bmatrix} 12{,}016.5\ 201.43 \end{bmatrix} ]

  • 공분산 예측 결과는 다음과 같음

[ \boldsymbol{P}_{2,1}

\begin{bmatrix} 52.86 & 7.47\ 7.47 & 1.71 \end{bmatrix} ]

  • 새 측정 없이 시간이 지나면 불확실성이 자연스럽게 커지므로 예측 단계에서 분산이 다시 증가함
    • 속도 불확실성은 거리 불확실성을 추가로 키움
    • 그래서 거리 분산이 속도 분산보다 더 빠르게 증가함
  • 예제는 칼만 필터의 세 단계를 보여줌
    • 초기화: 시작 시 한 번 수행
    • 예측: 동적 모델로 다음 상태와 불확실성을 전파
    • 갱신: 새 측정과 예측을 칼만 이득으로 결합
  • 초기화 이후 칼만 필터는 계속해서 예측-갱신 루프로 동작함

댓글과 토론

Hacker News 의견들
  • 칼만 필터를 따로 떼어 배우면 순서가 거꾸로라서, 주변 이론이 열어주는 큰 깨달음을 놓치기 쉽다고 늘 말하게 됨
    제대로 이해하려면 최소제곱법(선형 회귀), 재귀 최소제곱법, 정보 필터(KF의 다른 정식화)를 차례로 보는 게 좋음
    그러면 KF가 갱신 단계의 효율을 우선하도록 재정식화한 재귀 최소제곱법일 뿐이라는 걸 알게 됨
    이 PDF가 간결한 개요를 줌: http://ais.informatik.uni-freiburg.de/teaching/ws13/mapping/...

    • 더 높은 수준의 개념을 이해하도록 도와주려는 건 고맙지만, 전통적인 수학·물리 배경이 없으면 올려준 PDF의 첫 줄도 이해하기 어렵고 그 맥락을 얻는 절차도 잘 모르겠음
      그래도 지적 호기심은 있어서, 호기심을 유지하면서 조금씩 이해로 나아가는 경로가 필요함
      The Six (Not So) Easy Pieces를 다시 읽어도 이해는 못 하지만 여전히 가치가 있고, Arnold의 고양이를 가지고 놀면서 엄밀한 과학적 절차 없이도 맨몸의 유인원 같은 호기심으로 원래는 맥락이라는 문 뒤에 있던 개념을 체험할 수 있음
      http://gerdbreitenbach.de/arnold_cat/cat.html
    • 가장 쉬운 길은 배경지식에 따라 달라짐. 가우스 분포의 선형성과 가우스의 베이즈 사후분포를 이해하면 칼만 필터는 거의 자명해짐
      1차원에서는 선형 예측 X'1 = X0*a + b에서 사전분포를 얻고, mean(X'1) = mean(X0)*a + b, var(X'1) = var(X0)*a^2가 되며 a와 b가 가정한 동역학을 나타냄
      가우스의 사후분포는 사전분포와 관측값의 정밀도 가중 평균이라서 X1 = (1 - K)X'1 + YK이고, K = (1/var(X'1))/(1/var(X'1) + 1/var(Y))이며 Y는 가우스 관측값임
      이를 반복하면 칼만 필터가 되고, 다차원 가우스의 선형성을 알면 다차원으로 일반화하는 것도 직관적임
      다만 다차원 가우스의 선형성과 가우스 사후분포 자체가 쉬운 내용은 아닐 수 있음
    • 계속 그렇게 말할 수는 있지만, 이런 난해한 수학은 실제로 필터를 구현하는 사람들에게는 과한 경우가 많음
    • 베이즈 관점에서 칼만 필터를 이해하는 데 이 논문이 매우 유용했음: Meinhold, Richard J., and Nozer D. Singpurwalla. 1983. "Understanding the Kalman Filter." American Statistician 37 (May): 123–27
    • 아마 맞는 말이지만, 그 조언을 따르는 많은 사람은 중간에 포기해서 KF까지 도달하지 못할 가능성이 큼
  • 이 주제가 나올 때마다 이 자료도 같이 나오고, 반대로도 마찬가지임: https://github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Pyt...

    • 이건 칼만 필터 자료 중 내가 가장 좋아하는 것 중 하나임. 베이즈 원리에서 유도하니 훨씬 직관적이고, 필터를 조정하거나 변형하는 것도 이해하기 쉬워짐
      Jupyter 노트북을 쓰는 점도 아주 좋음
  • 확률분포를 위한 기호 계산 도구는 아직 없는 것 같음
    예를 들어 다변량 가우스 확률밀도함수 두 개를 곱해서 공분산 행렬을 얻거나, 칼만 필터의 모든 구성요소(예측 모델과 관측 과정)를 정의하면 필요한 공식을 sympy의 lambdify처럼 뽑아주는 도구 말임

  • Q와 R이 상수라면, 보통 그렇듯이 이득은 빠르게 수렴해서 칼만 필터는 예측 단계가 붙은 지수 필터와 거의 같아짐
    많은 사람에게는 이 설명이 훨씬 이해하기 쉽고, 실제 사용 방식과도 잘 맞음
    보통 Q와 R을 수동으로 조정해서 “괜찮아 보일” 때까지 맞춘 뒤 다시 바꾸지 않기 때문임
    게다가 Q와 R 같은 여러 값을 조정하는 대신 이득 하나만 수동으로 조정하면 됨

    • 칼만 필터에서 정말 이해가 안 됐던 부분이 바로 Q와 R을 어떻게 고르느냐
      결과가 그럴듯해 보일 때까지 그냥 조정하는 건가? 그러면 완전히 과적합되지 않은 상황에서도 어떻게 제대로 동작하는지 모르겠음
      예를 들어 영상에서 새를 추적한다면 어떤 Q를 고를 수는 있겠지만, 시간대에 따라 잡음 통계가 바뀔 수 있음. 그럴 때는 어떻게 해야 하나?
  • 관련 글: Kalman filter from the ground up - https://news.ycombinator.com/item?id=37879715 - 2023년 10월, 댓글 150개
    위 제목에 넣기 가장 좋은 연도는 무엇인지도 궁금함

  • 칼만 필터는 더 일반적인 주제인 David G. Luenberger의 Optimization by Vector Space Methods, John Wiley and Sons, Inc., New York, 1969에 들어 있음

  • 문득 이런 생각이 들었음. 목격자 증언만 있는 사건도 어떤 식으로든 벡터로 부호화한 뒤 칼만 필터로 다뤄서 관측의 증거 가치를 강화할 수 있을까?
    거짓말과 부정확성을 모두 “오차”로 취급하는 방식임
    Phoenix lights나 UFO 전반, 유령, 임사체험, 더 일상적으로는 강간 주장 같은 것을 떠올리고 있음

    • 그런 것들에 대한 선형 모델을 만들 수 있을 때만 가능함
  • 최고의 자료는 거의 항상 이거임: https://github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Pyt...
    Python을 쓰지 않는 사람이어도 훌륭하고, 전반을 정말 잘 훑어줌

  • 이 주제를 배울 때 나비넥타이를 맨 Michael van Biezem의 칼만 필터 강의를 본 사람 또 있나?
    https://www.youtube.com/watch?v=CaCcOwJPytQ&list=PLX2gX-ftPV...

    • 그가 산술만으로 정말 다양한 주제와 과목을 가르치는 방식이 좋음. 계산 가능한 모든 수학은 산술로 환원될 수 있음
  • 정말 알아야 할 한 문장은 이것임: “이 필터는 Rudolf E. Kálmán(1930년 5월 19일~2016년 7월 2일)의 이름을 따서 명명됐다. 1960년에 Kálmán은 이산 데이터 선형 필터링 문제의 재귀적 해법을 설명한 유명한 논문을 발표했다”