간단히 설명한 칼만 필터
(thekalmanfilter.com)- 칼만 필터는 잡음이 있거나 부정확한 측정값에서 더 정확한 상태 추정값을 실시간으로 만들어, 센서 기반 예측과 제어에 쓰이는 알고리듬임
- 단순히 측정값을 부드럽게 만드는 것이 아니라, 직접 관측하기 어려운 위치·속도 같은 상태 변수까지 추정할 수 있음
- 레이더 추적 예제는 2D 위치 측정값과 공분산을 입력으로 받아 물체의 위치와 속도를 4×1 상태 벡터로 추정하는 흐름을 보여줌
- 처음 두 측정값으로 상태를 초기화한 뒤, 이후에는 예측, 칼만 이득(Kalman Gain) 계산, 상태와 오차 공분산 갱신을 반복함
- 필터가 유지하는 이력은 현재 상태 추정값 하나뿐이라, 메모리 제약이 있는 장비에서도 구현하기 쉬움
칼만 필터의 큰 그림
- 칼만 필터는 입력과 출력이 있는 블랙박스처럼 볼 수 있음
- 입력은 잡음이 있거나 때로 부정확한 측정값임
- 출력은 잡음이 줄고 더 정확해진 추정값임
- 추정값은 실제로 측정되거나 관측되지 않은 시스템 상태 파라미터일 수 있음
- 관측 가능한 파라미터와 관측 불가능한 파라미터를 실시간으로 높은 정확도로 추정하는 데 쓰임
- 높은 정확도의 추정값은 정밀한 예측과 의사결정에 활용됨
- 그래서 신뢰할 수 있는 정보가 필요한 로보틱스와 실시간 시스템에서 자주 사용됨
칼만 필터가 해결하는 문제
- 부정확하거나 잡음이 있는 측정값을 바탕으로 변수의 상태, 또는 직접 관측하기 어려운 다른 변수를 더 높은 정확도로 추정함
- 대표적인 응용은 다음과 같음
- 객체 추적: 측정된 위치를 사용해 물체의 위치와 속도를 더 정확히 추정함
- 디지털 저울의 체중 추정: 표면에 가해진 압력으로 물체의 무게를 추정함
- 유도·항법·제어: IMU 센서로 위치, 속도, 가속도를 추정하고 다음 움직임 제어에 활용함
- 칼만 필터의 강점은 측정값 평활화 자체보다 측정하기 어려운 시스템 파라미터를 추정하는 능력에 있음
- 실시간 시스템에서는 정확도가 높아진 추정값이 더 나은 제어와 기능으로 이어짐
레이더 추적 예제의 입력과 출력
- 예제는 공항 주변의 비행기와 물체를 추적하는 레이더 추적 상황을 다룸
- 출력된 트랙 상태는 영공을 감시하는 항공 교통 관제 운영자에게 표시되는 데 사용됨
- 레이더는 2D 데카르트 좌표계의 x, y 위치 측정값을 출력함
- 측정값은 2×1 열벡터 z로 표현됨
- 측정값의 분산-공분산 행렬은 R로 표현됨
- 측정 시각 태그는 t로 표현됨
- 아래첨자 m은 측정 파라미터를, k는 측정 순서를 나타냄
- 칼만 필터는 레이더 측정값을 바탕으로 물체의 위치와 속도를 추정함
- 추정값은 4×1 열벡터 x로 표현됨
- 추정값의 분산-공분산 행렬은 4×4 행렬 P로 표현됨
- 상태 추정값의 시각 태그는 T로 표시됨
1단계: 시스템 상태 초기화
- 칼만 필터의 초기화 방식은 애플리케이션마다 달라짐
- 이 레이더 추적 예제에서는 첫 번째 측정값으로 시스템 상태를 초기화함
- 입력 측정값에는 위치 정보만 들어 있지만, 출력 시스템 상태에는 물체의 위치와 속도가 들어감
- 첫 번째 측정값이 들어왔을 때 알 수 있는 정보는 해당 시점의 위치뿐임
- 첫 번째 추정 뒤 시스템 상태 추정값은 입력 위치로 설정됨
- 시스템 상태 오차 공분산은 첫 번째 측정값의 위치 정확도로 설정됨
2단계: 시스템 상태 재초기화
- 속도 추정에는 두 번째 위치 측정값이 필요하므로 시스템 상태 추정값을 재초기화함
- 속도는 선형 근사로 계산됨
- 속도는 이동 거리 / 이동에 걸린 시간으로 계산됨
- 갱신된 시스템 상태 추정값은 두 번째 측정값의 위치와 계산된 속도로 구성됨
- 갱신된 시스템 상태 오차 공분산에는 두 번째 측정값의 위치 정확도와 근사한 속도 정확도가 들어감
- 속도 정확도 근사값은 필터에 데이터를 통과시킨 뒤 튜닝해 조정할 수 있음
- 예제에서는 속도 분산 항을 10⁴로 설정함
- 이 값은 속도 상태값에 대한 큰 불확실성을 나타냄
- 예제의 속도 단위는 m/s임
초기화 이후의 반복 처리
- 처음 두 단계는 몇 개의 측정값으로 시스템 추정값을 초기화하고 재초기화하는 과정임
- 애플리케이션마다 초기화 방식은 다를 수 있음
- 목표는 이후 측정값을 칼만 필터 방정식으로 갱신할 수 있는 시스템 상태 추정값을 갖추는 것임
- 이후 단계에서는 새 측정값을 필터에 반영하고 상태 추정값을 갱신함
3단계: 시스템 상태 추정값 예측
- 세 번째 측정값이 들어오면 시스템 상태 추정값을 앞으로 전파해 측정값과 시간 정렬함
- 이 정렬은 측정값과 상태 추정값을 결합하기 위해 필요함
- 예측에는 시스템 모델이 사용됨
- 예제에서는 일정 속도 선형 운동 모델로 시간 간격 동안 물체의 위치 변화를 근사함
- 일정 속도 모델은 가속도가 0이라고 가정함
- 상태 전이 행렬은 이 운동 방정식을 표현함
- 이 행렬은 상태 추정값과 상태 오차 공분산 행렬을 적절히 전파하는 데 사용됨
- 상태 추정값을 미래 시점으로 전파하면 그 시점의 상태 불확실성이 생기므로 오차 공분산은 커짐
Q 행렬과 H 행렬
- Q 행렬은 시스템 모델의 프로세스 잡음을 나타냄
- 시스템 모델은 근사값임
- 시스템 상태의 생애 동안 모델의 정확도는 변동함
- Q 행렬은 이 불확실성을 나타내며 기존 상태 잡음에 더해짐
- 예제에서는 실제 가속과 감속이 이 오차에 기여함
- H 행렬은 상태-측정 행렬로, 시스템 상태 추정값을 상태 공간에서 측정 공간으로 변환함
- 일부 애플리케이션에서는 0과 1로 구성된 행렬임
- 확장 칼만 필터(Extended Kalman Filter)를 사용하는 애플리케이션에서는 미분 방정식으로 채워짐
- 관련 설명은 Extended Kalman Filters 글로 이어짐
- 이 예제의 H 행렬은 상태 추정값과 오차 공분산을 위치와 속도 전체가 아니라 위치 값만 비교할 수 있게 줄이는 단순 행렬임
4단계: 칼만 이득 계산
- 칼만 필터는 새 측정값마다 칼만 이득을 계산함
- 칼만 이득은 입력 측정값이 시스템 상태 추정값에 얼마나 영향을 줄지 결정함
- 측정값의 잡음이 매우 크면, 칼만 이득은 새롭지만 부정확한 정보보다 현재 상태 추정값을 더 신뢰하게 함
- 현재 추정값과 새 측정 정보를 적절히 가중해 최적 추정값을 만드는 방식이 칼만 필터 알고리듬의 핵심임
5단계: 상태와 오차 공분산 갱신
- 칼만 필터는 칼만 이득을 사용해 입력 측정값 시점의 시스템 상태와 오차 공분산 행렬을 추정함
- 칼만 이득은 두 계산에서 측정값에 적절한 가중치를 주는 데 사용됨
- 새 시스템 상태 추정값 계산
- 시스템 상태 오차 공분산 계산
- 계산된 상태 추정값은 칼만 필터가 유지하는 유일한 상태 이력임
- 이 특성 때문에 칼만 필터는 낮은 메모리 제약이 있는 장비에서도 구현 가능함
정리
- 칼만 필터는 최적 상태 추정을 위한 범용 프로세스임
- 정확한 추정이 필요한 다양한 애플리케이션에서 사용됨
- 작은 단계로 나누면 칼만 필터의 동작을 덜 부담스럽고 이해하기 쉬운 구조로 볼 수 있음
댓글과 토론
Hacker News 의견들
-
Kalman 필터 얘기에서 이 훌륭한 학습 자료 링크가 빠질 수 없음. Jupyter 노트북 모음으로 쓰인 책임: https://github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Pyt...
이 책은 알파-베타 필터를 본격적인 Kalman 필터의 동생쯤으로 다루는데, 최근 업무에서 비슷한 게 필요해 많이 읽다 보니 알파-베타 필터와 Kalman 계열은 가까운 미래 예측에 초점이 강하고, 정작 필요한 건 과거 데이터 평활화였다는 걸 깨달았음
그래서 이중 지수 평활을 읽기 시작했는데, 사용 사례에 딱 맞아 보였고 파고들수록 결국 변수 이름만 다른 알파-베타 필터라는 걸 알게 됨
이 수학 영역 전체가 몇 가지 공통된 기초 이론 위에 있는데, 서로 다른 분야가 다른 접근으로 같은 시스템에 도달하면서 이름과 표기가 달라져 공통성이 가려진다는 느낌이 듦. 거듭제곱급수, 자연상수, 경사 하강법, 필터, 되먹임 시스템, 일반 시스템 이론 같은 것들의 중심에 비교적 작은 직관의 핵이 있을 것 같고, 그걸 잡으면 많은 수학이 멋지게 연결될 것 같음- 수학자들이 한 글자 변수명을 쓰는 데 화내는 건 핵심을 놓치는 경우가 많음. 짧은 이름은 방정식과 관계의 구조에 집중하게 해 주고, “잠깐, 이건 이름만 다를 뿐 내가 아는 X와 구조가 같네”라고 패턴을 맞추기 쉽게 해 줌
종이를 아끼거나 쓰기 쉽게 하려는 게 아님. 영어 키보드로 LaTeX에서 위첨자·아래첨자 붙은 그리스 문자를 쓰는 건 단어를 쓰는 것보다 쉽지 않음. 독자에게 다른 방식으로는 전달하기 어려운 특정 정보를 전달하려는 것임
수학 표기는 글자처럼 보이지만 본질적으로는 꽤 그림적인 표기라서, 긴 단어는 그 그림을 가려버림 - 찾고 있는 건 선형 또는 비선형 동역학 시스템 이론에 가까움. 아쉽게도 일관된 표기법으로 뒷받침되는 하나의 직관 핵심이 아니라, 서로 일관성 없는 여러 관점이 있음
제어와 신호/시스템 강의를 제대로 들으면 그런 직관이 몸에 배고, 특정 표기 관습에 집착하지 않은 채 수학과 용어를 익히게 됨. 진짜 직관은 “모든 것은 필터다”이고, 나머지는 그 아이디어를 분석하고 합성하는 일임 - Dieter Fox, Sebastian Thrun, Wolfram Burgard의 Probabilistic Robotics를 보면 좋을 듯함. Kalman 관련 여러 주제를 일관된 표기와 함께 베이즈식으로 정리해 둔 책임
AI/ML이 커지면서 고전 제어 이론의 아이디어도 강화학습과 합쳐지는 중임 - Q와 R이 상수라면 보통 그렇듯 이득이 빠르게 수렴해서, Kalman 필터는 예측 단계가 붙은 지수 필터가 됨. 많은 사람에게 이쪽이 훨씬 이해하기 쉽고, 실제 사용 방식과도 잘 맞음
보통 Q와 R은 “보기 좋을 때까지” 손으로 조정한 뒤 다시 바꾸지 않기 때문임. 게다가 Q와 R이라는 여러 값을 조정하는 대신 이득 하나만 손으로 맞추면 됨 - 예전에 아주 비슷한 생각을 했음. 요령은 많은 필터가 결국 알파/베타로 귀결되고, Kalman 필터는 선형 모델과 측정 잡음의 분산을 잘 알고 있을 때 그 상수들을 만들어내는 방식이라고 볼 수 있다는 것임
측정값의 잡음이 항상 같다면 시간이 지나며 상수로 수렴하고, 측정 정확도를 잘 알 수 있으면서도 많이 변하는 경우에야 특히 유용해짐
- 수학자들이 한 글자 변수명을 쓰는 데 화내는 건 핵심을 놓치는 경우가 많음. 짧은 이름은 방정식과 관계의 구조에 집중하게 해 주고, “잠깐, 이건 이름만 다를 뿐 내가 아는 X와 구조가 같네”라고 패턴을 맞추기 쉽게 해 줌
-
최근 Kalman 필터 구현을 맡았는데, 개발자인 내가 이해할 수 있는 언어로 설명한 좋은 자료를 찾기가 정말 어려웠음. 한 달 정도 배우고 나서 글 두 편을 썼고, 누군가에게 도움이 될 수도 있음: https://www.splinter.com.au/2023/12/14/the-kalman-filter-for..., https://www.splinter.com.au/2023/12/15/the-kalman-filter-wit...
개발자 입장에서는 아이러니하게도 직접 구현하고 나서야 수학이 이해됐음. 이미 아는 것 위에 쌓아 올리며 배우는 방식인 듯한데, 이런 데 붙는 용어가 있는지 궁금함 -
수학은 설명적인 변수명을 쓰면 훨씬 배우기 쉬울 거라고 늘 생각했음. 적어도 웹 같은 대화형 매체라면 최소한 툴팁이라도 넣을 수 있음. 수학을 공부할 때 시간의 90%를 기호 찾아보는 데 씀
또 여기서 아래첨자가 “측정의 순서를 나타낸다”고 할 때 어떤 순서를 말하는지 헷갈림. 아마 인덱스라는 뜻일 것 같음. Kalman 필터를 만진 지 오래되긴 했음- 사람들이 자주 잊는 건 수학 표기가 대수적 조작을 따라가기 쉽게 하려고 설계됐다는 점임. 표기 자체만 보고 의미가 드러나도록 의도된 건 아니고, E=mc^2 같은 식이 그 자체로 의미가 있어야 한다고 생각하는 쪽은 주로 물리학자들임
수학이 순수해질수록 대부분 변수의 범위는 짧아짐. 보통 변수는 쓰기 직전에 정의되고, 범위도 해당 증명이나 유도 안을 넘지 않음
다만 이 글의 선택 중에는 그냥 이상한 것도 있음. 예를 들어 P를 변수와 인덱스로 동시에 쓰고, 정밀도 행렬이 공분산 행렬의 정확한 역행렬인데도 P를 공분산 행렬에 쓰는 식임 - 논문 읽을 때 이런 게 제일 싫음. 저자들이 추상적이고 학술적으로 들리려다가, 답답할 정도로 모호해질 뿐임. 문장이 말이 되게 하려면 주어와 대상을 넣어야 함
연구 논문에서 가장 짜증나는 부분이 바로 이런 모호성임. 반드시 명확히 해야 함. 상대적 표현이 아니라 절대적 설명을 써야 함. “오른쪽을 보라”고 하지 말아야 함. 나는 왼쪽을 볼 수도 있음
“프리즘을 회전시킨 뒤 빛 원뿔이...”라고 쓰면, 회전이 어느 방향인지가 빠져 있음. 왼쪽인지 오른쪽인지, 수평인지 위아래인지, 빠른지 느린지. 글을 쓰는 사람 머릿속에는 이런 핵심 요소들이 전부 그려져 있지만, 독자는 그 마음을 읽을 수 없음 - 완전히 동의함. 비슷하게 느낀 건, 아직 아무도 쓰지 않은 최고의 수학 책은 표기와 변수의 의미를 잘 정리하고 여러 분야의 정리들을 명확하게 큐레이션한 책일 거라는 점임
- 여기서 말하는 순서는 값이 대응되는 시간상의 인덱스임. 예를 들어 x_3은 세 번째 시간 단계의 상태임
아래첨자 “p”는 아마 prediction, 즉 예측을 뜻하는 것 같음. 시간 3의 x_p는 시간 4에서 기대하는 상태임. 그런데 실제로 시간 4가 오면 새 측정값을 반영해서 x_4를 계산함
명확히 말하면 이 x_4는 시간 3에서 계산한 x_p와 다름. 예측은 항상 조금씩 틀리기 때문임 - 변수명은 이미 설명적이도록 고른 것이라고 봄. 일부러 더 불투명하거나 추적하기 어렵게 고르는 사람은 없음
문제는 막 시작한 사람이 아직 개념이나 각 문제 영역의 표준 표기법을 익히지 못했다는 점이고, 그래서 새 주제에 올라타는 고통이 남음
- 사람들이 자주 잊는 건 수학 표기가 대수적 조작을 따라가기 쉽게 하려고 설계됐다는 점임. 표기 자체만 보고 의미가 드러나도록 의도된 건 아니고, E=mc^2 같은 식이 그 자체로 의미가 있어야 한다고 생각하는 쪽은 주로 물리학자들임
-
Kalman 필터는 수학에서 단순화한 버전이 너무 단순화돼 원래 모습이 거의 안 보이는 특이한 경우 중 하나일 수 있음
실제로 하는 일은 측정값을 하나 얻고, 가능한 미래 상태들을 시뮬레이션한 다음, 이 정보를 다음 측정값과 결합하고 반복하는 것임
예를 들어 테니스공 사진을 여러 장 찍고 첫 사진에서 위치와 속도를 추정한 뒤, 어디로 갈지 시뮬레이션하고 다음 사진과 비교해 어떤 추정이 진실에 더 가까운지 보는 식임. 더 옛 방식으로는 태양의 고도를 측정해 지도 위 가능한 위치의 선을 만들고, 원래 자신이 있다고 생각한 지점과 비교하는 방식도 떠올릴 수 있음
물론 정확한 계산은 현실적으로 불가능에 가까움. 그래서 표본추출로 단순화함. 그래도 어렵기 때문에 분포가 어느 정도 가우스 분포에 가깝다고 가정함. 거기서 더 단순화해 시스템의 변화가 선형 변환이라고 가정하면, 여기서 다루는 Kalman 필터가 됨
선형대수만 보고 실제로 무슨 일이 일어나는지 이해할 수 있다면 놀라울 것 같음- Kalman 필터 설명은 이상하게도 “아주 간단합니다!”로 시작하는 경우가 많음. 원글도 그런 형식임
이 설명이야말로 처음으로 실제로 무슨 일이 일어나는지에 대한 직관을 줬음. 컴퓨터 쪽 사람인 내게는 이름 자체도 꽤 오해를 부름. 스트림 처리나 SQL에서 말하는 필터가 아니기 때문임 - 더 단순하게 말할 수 있음. 선형대수가 오히려 더 쉬움
Kalman 필터는 측정값을 만들어낸 숨은 입력을 추정하려고 함. 이를 위해x에 대해 [실제_측정값 - 기대_측정값(x)]^2/s^2를 최소화하는 문제를 만듦. 여기서s는 잡음의 시그마임
이는x에 대해 실제_측정값을 볼 가능도를 최대화하는 상태 추정 문제에서 나옴. 가능도 함수에서 중요한 항은-([x-expected(x)]/s)^2뿐이기 때문임. 정규분포나 사실상 어떤 지수분포의 지수부를 보면 됨
실제_측정값은 상수이므로,기대_측정값함수가 선형이면 볼록 최적화로 바로 풀림. 미분해서 0과 같게 놓고 풀면 Kalman 필터의 갱신 단계가 나옴
함수가 비선형이면 방정식을 선형화하고 최소화한 뒤, 그 “가짜 선형화”의 해를 반환하는 Newton-Raphson 한 단계를 수행하는 셈임. 학부 수준 미적분과 선형대수인데, 아무도 그렇게 말해주지 않았을 뿐임
하지만 이것은 완전히 틀리기도 함. 1960년대에 나온, 이런 재귀적 단일 단계 선형화로 가능도 함수를 최대화하려는 해킹임. Cramér-Rao 하한을 잘못 읽은 탓에 여러 세대의 엔지니어들이 이것이 최적이라고 믿어 왔지만, 실제로는 그렇지 않음
지금은 계산 자원이 10,000배는 더 많고, 비선형 방정식을 여러 Newton-Raphson 단계로 세워 풀거나, 긴 측정 이력을 유지하고 그 묶음 전체를 여러 Newton-Raphson 단계로 풀거나, 다봉 측정 함수를 수용하기 위해 가우스 혼합 표현을 쓰면 더 나은 성능이 나옴
이런 것들은 1980년대부터 지금까지의 상태 추정 연구에서 잘 다뤄졌지만, 교과서는 여전히 1972년에 돌에 새긴 듯함
Cramér-Rao 하한은 모든 측정 가능도 함수가 참 상태에서 선형화될 때만 정의되는데, 이는 모든 측정값을 보존하는 묶음에서 점근적으로만 가능하고, 무한 시간 전에는 불가능하며 재귀 필터로도 불가능함
- Kalman 필터 설명은 이상하게도 “아주 간단합니다!”로 시작하는 경우가 많음. 원글도 그런 형식임
-
예전 설명 중에서는 이 글이 좋았음: https://www.bzarg.com/p/how-a-kalman-filter-works-in-picture..., https://news.ycombinator.com/item?id=13449229
-
정말 Kalman 필터가 필요하다면 이 글이나 Wikipedia 문서, 혹은 구현 소스(https://github.com/LdDl/kalman-rs/blob/master/src/kalman/kal...)를 읽고 이해할 수는 있을 것 같음
하지만 경험상 전 세계의 거의 모든 사람은 예제로 가장 잘 배우는 시각적 학습자임. 그래서 페이지 중간의 튜토리얼이 공식에 예시 숫자를 넣지 않는 점이 놀라움. 놓쳤을 수도 있지만, 그림도 “Kalman 필터란 무엇인가”라는 텍스트가 한 페이지 나온 뒤에야 시작하고, 그 그림마저 더 많은 공식임- 다른 쪽에서는 변수명 관습이 수학 주제를 배우고 이해하는 데 장애물이라고 했고, 그 관점에도 공감함. 하지만 여기 나온 문제에 더 크게 공감함
이런 일이 너무 흔해서 놀라울 정도임. 더 약한 형태로는 코드 예제를 포함하지 않는 소프트웨어 라이브러리에서도 같은 문제가 나타남
- 다른 쪽에서는 변수명 관습이 수학 주제를 배우고 이해하는 데 장애물이라고 했고, 그 관점에도 공감함. 하지만 여기 나온 문제에 더 크게 공감함
-
내게 와닿았던 건, 불확실한 측정 분포 두 개, 즉 분산이 큰 분포를 합치면 더 확실한 측정, 즉 더 좁은 분포가 된다는 점임
이 더 확실한 측정값을 다음 측정값과 다시 결합하고 반복하면, 그대로 Kalman 필터가 됨 -
KF를 설명하는 영상 묶음 중에서는 이게 정말 좋았음. 원글 자료보다 더 잘 이해됐음: https://www.youtube.com/watch?v=CaCcOwJPytQ
-
돌아가신 아버지는 이 필터가 막 발명되던 시기부터 경력 내내 자주 사용하셨음. 레이더와 미사일 유도 시스템을 다루셨음
-
눈을 감고 잠깐 걸어 다녀 보셈. 자신이 어디 있는지 상상해 본 뒤 눈을 뜨면, 실제 위치가 생각한 위치와 다른가?
그 마지막 단계, 즉 관측을 이용해 상태 변수에 대한 믿음을 갱신하는 것이 Kalman 필터가 하는 일임