간단한 레이더 예시로 이해하는 칼만 필터
(kalmanfilter.net)- 칼만 필터는 잡음이 많은 환경에서 시스템의 상태를 추정하고 미래를 예측하는 최적 상태 추정 알고리듬
- 항공기 추적 레이더를 예시로, 거리와 속도 측정값을 이용해 예측과 업데이트 단계를 반복하며 정확도를 높이는 과정을 설명
- 각 단계에서 상태 벡터, 공분산 행렬, 칼만 이득(Kalman Gain) 을 계산해 측정값과 예측값을 가중 결합
- 측정 불확실성과 모델 불확실성을 함께 고려해, 시간이 지날수록 추정 오차(불확실성)가 감소함을 수치로 제시
- 직관적 수치 예제와 단계별 계산을 통해 직접 필터를 설계·구현할 수 있는 이해 기반을 제공
칼만 필터 소개
-
Kalman Filter는 측정 잡음이나 외부 요인 등 불확실성이 존재하는 환경에서 시스템의 상태를 추정하고 예측하는상태 추정 알고리듬
- 물체 추적, 항법, 로보틱스, 제어 등 다양한 분야에서 핵심 도구로 사용
- 예를 들어, 마우스 궤적의 노이즈를 줄여 부드러운 움직임을 얻거나, 금융 데이터의 추세 탐지, 기상 예측 등에 활용
- 많은 교육 자료가 수학적 유도에 치중해 실제 예시가 부족하다는 점을 지적하며, 본 자료는 수치 예제 중심의 직관적 설명을 제공
- 잘못 설계된 경우 필터가 추적에 실패하는 사례도 함께 다루며, 이를 보정하는 방법을 제시
- 목표는 독자가 직접 칼만 필터를 설계하고 구현할 수 있도록 이해를 확립하는 것
학습 경로
- 단일 페이지 개요: 핵심 개념과 주요 수식을 간단히 소개하며, 통계와 선형대수의 기초 지식만 요구
- 무료 웹 튜토리얼: 단계별 수치 예제로 직관을 쌓는 온라인 튜토리얼, 사전 지식 불필요
- Kalman Filter from the Ground Up (서적): 14개의 완전한 수치 예제, 비선형 필터(Extended/Unscented) 및 센서 융합, Python·MATLAB 코드 포함
예측의 필요성
-
항공기 추적 레이더 예시를 통해 상태 추정과 예측의 필요성을 설명
- 시스템 상태는 항공기의 위치(거리 (r))이며, 레이더는 펄스 반사 시간을 측정해 거리 계산
- 속도 (v)는 도플러 효과로 측정 가능
- 일정 시간 간격 (\Delta t) 후의 위치 예측은 동적 모델을 통해 수행
- 예: (r_{t_1} = r_{t_0} + v \cdot \Delta t)
- (\Delta t = 5s), (r_{t_0}=10,000m), (v=200m/s) → (r_{t_1}=11,000m)
- 실제 환경에서는 측정 잡음(Measurement Noise)과 모델 불확실성(Process Noise)이 존재
- 여러 레이더가 동시에 측정해도 결과가 약간씩 다름
- 바람 등 외부 요인으로 속도 일정성 가정이 깨짐
- 칼만 필터는 현재 상태 추정과 미래 상태 예측을 동시에 수행하며, 각 추정의 불확실성(분산) 을 함께 제공
- 상태 추정 불확실성을 최소화하는 최적 알고리듬
칼만 필터 예제
-
1차원 레이더가 항공기의 거리 (r)과 속도 (v)를 측정
- 상태 벡터 (\boldsymbol{x} = [r, v]^T)
- 벡터와 행렬을 사용해 시스템을 표현
-
Iteration 0 — 초기화 및 예측
-
초기화
- 첫 측정값으로 필터를 초기화 (\boldsymbol{z}_0 = [10{,}000, 200]^T)
- 측정 불확실성(표준편차): 거리 4m, 속도 0.5m/s (\boldsymbol{R}_0 = \begin{bmatrix}16 & 0 \ 0 & 0.25\end{bmatrix})
- 초기 상태 추정치 (\hat{\boldsymbol{x}}_{0,0} = \boldsymbol{z}_0)
- 초기 공분산 (\boldsymbol{P}_{0,0} = \boldsymbol{R}_0)
-
예측 단계
- 시간 간격 (\Delta t = 5s)
- 상태 전이 행렬 (\boldsymbol{F} = \begin{bmatrix}1 & 5 \ 0 & 1\end{bmatrix})
- 예측 상태 (\hat{\boldsymbol{x}}{1,0} = \boldsymbol{F}\hat{\boldsymbol{x}}{0,0} = [11{,}000, 200]^T)
- 공분산 예측(프로세스 노이즈 제외): (\boldsymbol{P}{1,0} = \boldsymbol{F}\boldsymbol{P}{0,0}\boldsymbol{F}^T = \begin{bmatrix}22.25 & 1.25 \ 1.25 & 0.25\end{bmatrix})
- 프로세스 노이즈 추가 ((\sigma_a = 0.2m/s^2)): (\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})
-
Iteration 0 요약
- 첫 측정으로 상태 및 공분산 초기화
- 상태 전이 모델을 사용해 다음 상태와 불확실성 예측
- 예측 수식
- 상태 예측: (\hat{\boldsymbol{x}}{n+1,n} = \boldsymbol{F}\hat{\boldsymbol{x}}{n,n} + \boldsymbol{G}\boldsymbol{u}_n)
- 공분산 예측: (\boldsymbol{P}{n+1,n} = \boldsymbol{F}\boldsymbol{P}{n,n}\boldsymbol{F}^T + \boldsymbol{Q})
-
Iteration 1 — 업데이트 및 예측
-
필터 업데이트
- 두 번째 측정: (\boldsymbol{z}_1 = [11{,}020, 202]^T)
- 측정 불확실성 증가 (표준편차: 거리 6m, 속도 1.5m/s) (\boldsymbol{R}_1 = \begin{bmatrix}36 & 0 \ 0 & 2.25\end{bmatrix})
- 예측 공분산 (\boldsymbol{P}_{1,0})과 비교 시, 예측 불확실성이 더 작음
- 칼만 필터는 측정과 예측을 가중 평균으로 결합
- 가중치 (K_1): Kalman Gain
- 상태 갱신식: (\hat{\boldsymbol{x}}{1,1} = \hat{\boldsymbol{x}}{1,0} + \boldsymbol{K}_1(\boldsymbol{z}1 - \boldsymbol{H}\hat{\boldsymbol{x}}{1,0}))
- 관측 행렬 (\boldsymbol{H} = \boldsymbol{I})
- 칼만 이득 계산: (\boldsymbol{K}1 = \boldsymbol{P}{1,0}\boldsymbol{H}^T(\boldsymbol{H}\boldsymbol{P}_{1,0}\boldsymbol{H}^T + \boldsymbol{R}_1)^{-1}) 결과: (\boldsymbol{K}_1 = \begin{bmatrix}0.4048 & 0.6377 \ 0.0399 & 0.3144\end{bmatrix})
- 혁신(innovation): (\boldsymbol{z}1 - \hat{\boldsymbol{x}}{1,0} = [20, 2]^T)
- 보정값: (\boldsymbol{K}_1[20, 2]^T = [9.37, 1.43]^T)
- 갱신 상태: (\hat{\boldsymbol{x}}_{1,1} = [11{,}009.37, 201.43]^T)
-
공분산 갱신
- 단순화된 형태 사용: (\boldsymbol{P}_{1,1} = (\boldsymbol{I} - \boldsymbol{K}1)\boldsymbol{P}{1,0})
- 결과: (\boldsymbol{P}_{1,1} = \begin{bmatrix}14.57 & 1.43 \ 1.43 & 0.71\end{bmatrix})
- 갱신 후 불확실성은 예측 및 측정 불확실성보다 작음 → 측정과 예측을 결합하면 항상 불확실성이 감소
-
예측 단계
- 다음 시간 (t_2) 예측
- 상태 예측: (\hat{\boldsymbol{x}}{2,1} = \boldsymbol{F}\hat{\boldsymbol{x}}{1,1} = [12{,}016.5, 201.43]^T)
- 공분산 예측: (\boldsymbol{P}{2,1} = \boldsymbol{F}\boldsymbol{P}{1,1}\boldsymbol{F}^T + \boldsymbol{Q} = \begin{bmatrix}52.86 & 7.47 \ 7.47 & 1.71\end{bmatrix})
- 시간이 지남에 따라 측정이 없으면 불확실성이 다시 증가
- 다음 시간 (t_2) 예측
-
Iteration 1 요약
- 업데이트 단계: 예측과 측정을 칼만 이득으로 결합
- 예측 단계: 갱신된 상태를 다음 시점으로 전달
- 주요 수식
- 상태 갱신: (\hat{\boldsymbol{x}}{n,n} = \hat{\boldsymbol{x}}{n,n-1} + \boldsymbol{K}_n(\boldsymbol{z}n - \boldsymbol{H}\hat{\boldsymbol{x}}{n,n-1}))
- 공분산 갱신(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{K}n = \boldsymbol{P}{n,n-1}\boldsymbol{H}^T(\boldsymbol{H}\boldsymbol{P}_{n,n-1}\boldsymbol{H}^T + \boldsymbol{R}_n)^{-1})
예제 요약
- 칼만 필터의 세 단계: 초기화 → 예측 → 업데이트
- 이후에는 예측-업데이트 루프를 반복 수행
- 새로운 측정이 추가될 때마다 불확실성이 감소하며, 시스템 상태 추정이 점점 정교해짐
- 추가 학습 자료
- 무료 온라인 튜토리얼: 단계별 수치 예제 제공
- 서적 Kalman Filter from the Ground Up: 선형·비선형 필터, 구현 지침, Python/MATLAB 코드 포함
Hacker News 의견들
-
글쓴이임. 최근 내 Kalman Filter 튜토리얼의 홈페이지를 업데이트했음. 간단한 레이더 추적 예제를 추가해서, 통계와 선형대수 기초만 아는 사람도 이해할 수 있도록 구성했음
수식 유도는 최소화하면서도, 측정의 노이즈·예측 모델·필터 결합 과정을 직관적으로 보여주려 했음. 수학 수준이나 설명의 명확성에 대한 피드백을 듣고 싶음- 잠깐 훑어봤는데, 프로세스 노이즈 행렬 Q가 갑자기 등장한 느낌이었음. 책에서는 설명이 있을 것 같지만, 왜 그런 값이 되는지 간단한 근거가 있으면 좋겠음
- 전반적으로 명확했음. 다만 초반에 시스템 모델과 Kalman 필터 자체의 구분이 조금 모호했음. 상태 행렬을 만드는 부분까지는 모델 설명인 줄 알았는데, 그게 곧 필터 식으로 이어져서 헷갈렸음
- 접근성 메뉴가 정말 마음에 들었음. 페이지 가독성을 조정하기 너무 쉬웠음
- 6개월 전쯤 Kalman 필터를 직접 구현해보려 했는데, 응용 도메인에 따라 구조가 꽤 달라서 중간에 멈췄음. 이번 자료가 완주에 큰 도움이 될 것 같아 기대 중임
- 튜토리얼 초반의 “최적 알고리즘”이라는 표현이 다소 추상적으로 느껴졌음. 수학으로 들어가기 전에 그 의미를 간단히 풀어주면 좋겠음
-
내가 생각하는 직관적 가이드는 다음과 같음
- 가중 최소제곱법을 이해하고, 새로운 측정값과 불확실성을 이용해 기존 추정치를 갱신하는 방법을 익힘
- 실제 평균이 변하지 않는다고 가정했을 때는 이 방식이 잘 작동함
- 하지만 평균이 변한다면, Kalman 필터는 그 변화를 예측하는 모델을 사용함
- 예측 후에는 다시 (1)과 같은 문제로 돌아감
결국 핵심은 최소제곱법이며, 특정 가정하에서는 이것이 최적임을 증명할 수 있음
-
“How a Kalman Filter Works in Pictures” 글이 정말 좋았음
- 나도 그 글의 시각적 설명 방식을 좋아함. 다만 내 튜토리얼은 단계별 레이더 예제를 중심으로 직관과 함정을 함께 다루는 게 목표였음
- 하지만 이런 “간단한 설명”들도 실제로는 너무 복잡하게 느껴질 때가 있음. Kalman 필터는 본질적으로 추정기(estimator) 의 한 종류임.
예를 들어 저역통과 필터도 일종의 추정기인데, Kalman 필터는 여기에 프로세스 모델과 공분산 계산을 더해 동적으로 조정되는 형태임.
위치·속도처럼 상관된 변수 간의 관계를 반영해, 하나의 측정값이 다른 변수의 추정에도 영향을 주게 함.
다만 선형대수 기반이라 가우시안 노이즈를 가정해야 하고, 비선형 문제에는 EKF나 UKF 같은 변형이 필요함
-
Kalman 필터를 이해하려면 다음 네 가지를 알아야 함
- 시스템 모델
- 내부 상태
- 최적 추정의 정의
- 공분산의 개념
필터는 측정값을 기반으로 시스템의 내부 상태와 공분산을 최적 추정하는 수학적 해법임.
Alex Becker의 책이 이 주제의 훌륭한 입문서라고 생각함. 예제가 풍부하고 직관을 잘 쌓게 해줌
- 피드백 고마움. 더 고급 주제를 다루는 2권을 고려 중임. 다만 EKF나 UKF는 근사적이므로 완전한 최적해는 아님을 명확히 하고 싶음
-
Kalman 필터를 배울 때, 서로 다른 노이즈 특성의 입력이 두 개 이상일 때 훨씬 직관적으로 이해됨. 하지만 대부분의 튜토리얼은 단일 입력만 다룸
- 내 책에는 센서 융합(sensor fusion) 개념을 소개하는 장이 있음. 더 깊이 배우고 싶다면 Bar-Shalom이나 Blackman의 책을 추천함
- 사실 Kalman 필터의 본질은 상태 추정(state estimation) 임. 센서 융합은 그 응용 중 하나일 뿐, 둘을 동일시하면 오해가 생김
-
Kalman 필터는 실제로도 많이 쓰임. 예를 들어 Sendspin에서는 스피커 동기화를 위해 사용함
라이브 데모와 구현 문서를 참고할 수 있음 -
Kalman 필터 개념을 사람의 증언에도 적용할 수 있을지 궁금함
- 흥미로운 발상임. 인간의 관찰을 노이즈가 있는 센서로 볼 수도 있음. 다만 표준 Kalman 필터는 편향 없는 가우시안 노이즈를 가정하므로, 인간의 경우 그 가정이 성립할지는 의문임
-
thekalmanfilter.com에서도 간단한 설명을 볼 수 있음
-
이 글이 비싼 책 광고처럼 보였음. 이미 무료 자료가 많은데, 예를 들어 Kalman and Bayesian Filters in Python 같은 것들이 있음. 이 책만의 장점이 있는지 궁금함
- 좋은 질문임. 핵심 Kalman 필터 내용은 무료로 공개되어 있음. 책에서는 튜닝, 설계 고려사항, 추가 예제 등을 더 다룸
- Roger Labbe의 책과 Jupyter 노트북은 정말 훌륭함. Kalman 필터뿐 아니라 일반적인 추정 문제 접근법을 이해하는 데 큰 도움이 됨
- 다른 자료도 많이 봤지만, 이 책은 세부 설명이 매우 충실해서 추천할 만함. 무료 튜토리얼도 여기에서 볼 수 있음
- 링크한 자료는 고전 명작임
- 좋은 자료가 많지 않음. 내가 본 것 중 진짜로 잘 만든 건 손에 꼽음. Kalman 필터를 새롭게 이해하려는 노력이 느껴지는 자료임