최근 회사에서 이상탐지를 위해 센서로부터 데이터를 불러와 DB에 저장하고 시각화하는 단계를 진행 중이다.
하지만 실제 공장 환경에서 다양한 noise가 발생할 수 있기 대문에 이 데이터를 그대로 사용하는 것은 정확하지 않다. 따라서 이를 filtering 해줄 수 있는 칼만필터(Kalman Filter)에 대해 알아보고자 한다.
1. 칼만 필터란?
칼만 필터(Kalman Filter)는 잡음이 포함되어 있는 측정치를 바탕으로 선형 역학계의 상태를 추정하는 재귀 필터로, 루돌프 칼만이 개발하였다. 이는 시간에 따라 변화하는 시스템의 상태를 추정하며, 잡음이 있는 데이터로부터 유용한 정보를 추출하여 가능한 정확하게 상태를 예측하는 역할을 한다.
2. 칼만 필터의 기본 원리
칼만 필터는 주로 두 가지 단계로 작동한다.
- 예측(Prediction) 단계: 이전 상태를 바탕으로 다음 상태를 예측한다.
- 업데이트(Update) 단계: 실제 관측된 데이터를 기반으로 예측된 상태를 수정한다.
이 두 단계를 반복적으로 수행하여 시스템의 상태를 점점 더 정확하게 추정할 수 있다.
3. 칼만 필터의 구성 요소
칼만 필터는 다음과 같은 구성 요소로 이루어져 있다:
- 상태 변수 (State Variable): 시스템의 현재 상태를 나타내는 값이다. 예를 들어, 로봇의 위치나 속도 등이다.
- 상태 전이 모델 (State Transition Model): 시스템의 상태가 시간에 따라 어떻게 변화하는지를 설명하는 모델이다.
- 관측 모델 (Observation Model): 실제로 관측된 데이터를 바탕으로 시스템의 상태를 추정하는 모델이다.
- 노이즈 (Noise): 관측된 데이터의 불확실성을 나타내는 요소로, 보통 가우시안 분포를 따른다.
4. 칼만 필터의 단계별 작동 과정
4.1 예측 단계
이 단계에서는 다음 상태를 예측한다. 예를 들어, 로봇의 현재 위치와 속도를 바탕으로 다음 위치를 예측하는 것이다. 사용되는 수식은 다음과 같다:
오차 공분산을 예측하는 수식은 다음과 같다:
4.2 업데이트 단계
이 단계에서는 실제 관측된 데이터를 바탕으로 예측한 상태를 수정한다. 사용되는 수식은 다음과 같다:
칼만 이득을 계산하는 수식은 다음과 같다:
상태 업데이트 수식은 다음과 같다:
오차 공분산 업데이트는 다음과 같다:
5. 파이썬을 이용한 칼만 필터 구현 (예제코드)
아래는 간단한 칼만 필터를 구현한 파이썬 코드 예시이다. 이 코드는 1차원 위치 추적 문제를 해결을 위해 구현되었다.
import numpy as np
import matplotlib.pyplot as plt
# 초기 상태
x = np.array([[0], # 위치
[0]]) # 속도
# 상태 전이 행렬
F = np.array([[1, 1], # 위치 업데이트
[0, 1]]) # 속도 업데이트
# 관측 모델 행렬
H = np.array([[1, 0]]) # 위치 관측
# 오차 공분산 행렬
P = np.eye(2)
# 프로세스 노이즈 공분산
Q = np.array([[1, 0],
[0, 1]])
# 관측 노이즈 공분산
R = np.array([[10]])
# 측정값 (임의의 잡음 포함)
measurements = [i + np.random.normal(0, 3) for i in range(50)]
# 칼만 필터 적용
predicted_positions = []
for z in measurements:
# 예측 단계
x = F @ x
P = F @ P @ F.T + Q
# 업데이트 단계
y = z - (H @ x)[0, 0] # 잔차
y = np.array([[y]]) # 잔차를 2차원 배열로 변환
S = H @ P @ H.T + R # 잔차 공분산
K = P @ H.T @ np.linalg.inv(S) # 칼만 이득
x = x + K @ y # 상태 업데이트
P = (np.eye(2) - K @ H) @ P # 오차 공분산 업데이트
predicted_positions.append(x[0, 0])
# 결과 시각화
plt.plot(measurements, label='Measurements', color='red')
plt.plot(predicted_positions, label='Kalman Filter Prediction', color='blue')
plt.xlabel('Time')
plt.ylabel('Position')
plt.title('Kalman Filter Example')
plt.legend()
plt.show()
위의 코드를 실행시키면 아래와 같은 결과 그래프가 나온다.
빨간 색이 실제 측정값이고, 파란색이 칼만 필터를 적용하여 불필요한 노이즈를 제거한 값이다.
'Smart Factory' 카테고리의 다른 글
[Smart Factory] 스마트 팩토리 / SCADA / PLC / HMI 알아보기 (0) | 2024.08.20 |
---|---|
[Smart Factory] Intouch 기본 개념 / Tag, Script 예제 (0) | 2024.08.19 |