칼만 필터는 센서로부터 얻은 데이터에 포함된 노이즈(불확실성)를 줄여서, 시스템의 상태(예: 로봇의 위치, 속도 등)를 보다 정확하게 추정하는 알고리즘이다.
SLAM 시스템에서는 로봇이 움직이면서 센서(카메라, 라이다, IMU 등)로부터 데이터를 받아오는데, 이 데이터는 항상 오차가 포함되어 있다. 칼만 필터는 이 오차를 보정하여 실시간으로 로봇의 상태를 업데이트한다.
칼만 필터는 세 가지 주요 과정을 반복한다.
추가 설명:
예측은 "미래를 미리 계산"하는 과정이다. 이때 사용되는 모델은 물리 법칙이나 시스템의 동작 특성을 반영하지만, 시간이 지날수록 오차가 누적될 수 있으므로 보정이 필요하다.
추가 설명:
센서의 측정값은 전파 간섭, 기계적 진동, 환경 변화 등 다양한 요인에 의해 왜곡될 수 있다. 이러한 불확실성 때문에, 칼만 필터는 단순히 측정값에 의존하지 않고 예측값과 함께 결합한다.
추가 설명:
- 예측과 추정의 구분:
예측은 모델을 통해 "미리 계산"한 값이고, 추정은 실제 측정값과 비교하여 보정한 값이다.
단순히 측정값을 100% 신뢰하지 않는 이유는 센서 노이즈나 간섭 등으로 인해 측정값이 항상 정확하지 않기 때문이다. 예측값은 모델에 기반하므로 노이즈가 없지만, 오차가 누적될 수 있다. 칼만 필터는 이 두 값을 최적의 방식으로 결합하여 가장 신뢰할 만한 추정 값을 도출한다.- 결국 칼만 필터는 예측과 측정을 결합해 "최종적으로 정확한 상태"를 추정해내는 알고리즘이다.
칼만 필터의 동작은 크게 예측 단계와 추정(갱신) 단계로 나뉜다.
초기화:
예측 단계:
추정 (갱신) 단계:
칼만 이득 계산:
여기서,
상태 추정 (업데이트):
는 예측값과 측정값의 오차 (innovation)이다.
오차 공분산 업데이트:
이를 통해 추정된 상태의 불확실성을 보정한다.
이 과정을 반복하면서, 칼만 필터는 로봇의 상태를 지속적으로 예측하고, 센서로부터 받은 측정값을 반영하여 보다 정확한 추정을 수행한다.
추가 설명:
칼만 이득은 "신뢰도 가중치"라고 생각할 수 있다. 예측값이 오차가 많이 누적된 경우, 즉 불확실성이 클 때는 ( P_{k|k-1} )가 크므로 ( K_k )가 커져 측정값을 더 반영한다. 반대로, 예측이 비교적 정확하다면 ( K_k )가 작아 측정값의 노이즈 영향을 줄인다.
다음은 1차원 시스템에서 칼만 필터를 구현한 예시 코드이다.
import numpy as np
import matplotlib.pyplot as plt
# 시간 간격 설정 (예: 1초)
dt = 1.0
# 선형 시스템 가정을 위한 상태 전이 행렬 A와 측정 행렬 H 정의
A = np.array([[1, dt],
[0, 1]])
H = np.array([[1, 0]])
# 프로세스 노이즈 공분산 Q와 측정 노이즈 공분산 R 설정
# Q가 크면 시스템의 예측이 더 불확실하다고 판단하여 측정값에 민감하게 반응하고,
# Q가 작으면 예측을 더 신뢰하여 측정값의 변화가 추정값에 덜 반영됨
# R이 크면 측정값에 노이즈가 많다고 판단해 예측값에 무게를 두며,
# R이 작으면 측정값을 적극적으로 반영함
Q = np.array([[1, 0],
[0, 3]])
R = np.array([[10]])
# 초기 상태 (위치와 속도) 및 초기 오차 공분산 P 초기화
x = np.array([[0], # 초기 위치
[1]]) # 초기 속도
P = np.eye(2) * 500 # 큰 불확실성을 반영한 초기 오차 공분산
# 예시 측정 데이터 (노이즈가 포함된 실제 위치 측정값)
measurements = [1, 2, 3, 2, 1]
# 칼만 필터 추정 결과를 저장할 리스트
estimates = []
for z in measurements:
# 1) 예측 단계 (Prediction)
# 이전 상태를 기반으로 다음 상태를 예측
x_pred = A @ x
# 예측 단계에서의 오차 공분산 업데이트 (모델에 의한 불확실성 포함)
P_pred = A @ P @ A.T + Q
# 2) 측정 단계 (Measurement)
z_meas = np.array([[z]]) # 센서로부터 받은 실제 측정값 (노이즈 포함)
# 3) 추정 단계 (Update)
# 칼만 이득 계산: 예측값과 측정값 중 신뢰도가 높은 쪽을 결정하는 가중치
K = P_pred @ H.T @ np.linalg.inv(H @ P_pred @ H.T + R)
# 예측값과 측정값의 차이(innovation)를 보정하여 상태 업데이트 (추정)
x = x_pred + K @ (z_meas - H @ x_pred)
# 오차 공분산 업데이트: 추정된 상태의 불확실성을 재계산
P = (np.eye(2) - K @ H) @ P_pred
estimates.append(x[0, 0])
# 결과 시각화
plt.plot(measurements, 'ro-', label='Measurements')
plt.plot(estimates, 'b^-', label='Kalman filter estimations')
plt.xlabel('Time')
plt.ylabel('Position')
plt.title('Position estimation using kalman fiter')
plt.legend()
plt.show()

코드 설명:
칼만 필터는 SLAM 시스템에서 매우 중요한 역할을 하며, 로봇이나 자율 주행 차량이 센서 데이터를 기반으로 예측한 후, 실제 측정값을 반영하여 상태를 추정하는 과정을 반복한다.