매직코드
article thumbnail

목표 : 진동센서로부터 기록되는 진동데이터를 통해 정상인 상태와 비정상 상태를 예측

방법 : 진동센서 데이터를 이용해 시간 영역 특징 추출과 주파수 변환을 이용해 고장 분류 모델 생성

 

1. 진동 센서 데이터 확인

진동이란 힘에 의해 어느 물체가 같은 모양으로 반복하여 흔들리는 움직임이다.

본 프로젝트에서는 회전기기에서 측정되는 진동 데이터를 이용하는데, 회전기기가 진동하는 원인은 원심력이다.

원심력을 구하는 공식은 다음과 같다.

원심력 공식

이러한 진동 센서 데이터는 1초에 4096번 측정되었다.

4096번의 측정이 진행된 데이터를 1개 세트라고 했을 때, 본 프로젝트에서는 train 데이터로 2065세트, test 데이터로 200세트를 다루었다.

 

 

2. 진동 센서 데이터를 이용한 시간 영역 특징 추출

kinetic energy related (운동 에너지 관련) 특징 : abs_max, abs_mean, rms

data statistics related (데이터 통계 관련) 특징 : skewness(왜도), kurtosis(첨도)

waveform related (파형 관련) 특징 : crest, impulse, shape

 

- 시간 영역 특징을 추출하는 이유

특징 추출과 관련하여 많은 연구가 진행되었는데, 데이터의 평균(mean), 분산(variance), 왜도(skewness) 및 첨도(kurtosis) 등의 통계적 특징들을 비롯하여 신호의 실효치를 나타내는 RMS(root mean square)와 신호의 Peak를 표현하는 Peak to Peak 등의 물리적 특징들은 고장을 대표하는 특징에 해당된다.

 

김승일, "진동 데이터의 시간영역 특징 추출에 기반한 고장 분류 모델", 한국전산구조공학회 논문집 제34권 제1호(2021.2), p.25

absolute mean : 평균에 절대값을 취한것

variance : 분산

peak to peak : 가장 큰 값 - 가장 작은 값

rms (root mean square) : 실효 출력 >> 지속적인 시그널의 출력이 가능한 평균 출력의 기준

skewness : 왜도 >> 분포의 비대칭 정도를 나타내는 척도

kurtosis : 첨도 >> 도수분포의 뽀족한 정도

impulse factor : 일반적으로 베어링 고장진단에서 결함을 나타내는 지표로 사용됨, 충돌과 관련된 고장을 나타내는 특징

shape factor : 회전기계에서 불균형, 정렬불량을 대표하는 특징

 

 

3. 진동 센서 데이터를 이용한 주파수 영역 특징 추출

푸리에 변환을 이용한 진동센서 신호의 시간표현(파형)을 주파수(스펙트럼)으로 변환

푸리에 변환 중에서 FFT(고속 푸리에 변환) 사용

 

푸리에 변환(FT)은 시간이나 공간에 대한 함수를 시간 또는 공간 주파수 성분으로 분해하는 변환을 말한다.

진동센서는 1초당 기록되는 데이터로 시간에 대한 함수라고 볼 수 있고, 이를 푸리에 변환하면 복소수로 값이 나온다.

푸리에 변환 함수

이렇게 나온 값은 a + bi 형태로 나뉘는데 복소수 값의 크기(a)는 주파수 성분의 진폭을 뜻하고, 각도(bi)는 주파수 성분의 위상을 뜻한다.

 

기존 신호 데이터

 

 

# data는 기존 진동센서 값을 가지고 있는 변수명
sample_rate = 4096 # 본 프로젝트에서는 1초에 4096번 측정했기 때문
duration = 2 # 총 데이터갯수가 4096이면 1초, 8192면 2초 이렇게 볼 수 있다.
n = sample_rate * duration # 총 데이터 개수

# x축
x = np.fft.fftfreq(n, 1/sample_rate)

# y축
y = np.fft.fft(data) / len(data)

기존 데이터를 가지고 fft 변환을 시도했다.

 

예전에는 x축 값을 뽑고자 직접 계산을 했던 것 같은데 요즘에는 fftfreq() 명령어를 통해 한번에 x축 값을 뽑아낸다.

y축을 계상할 때는 fft.fft(데이터) / len(데이터) 를 통해 푸리에 변환을 한 데이터를 그 크기로 나누어 주었다.

 

푸리에 변환이 된 이후 값은 hz단위로 작성한다. 우리가 아는 그 hz가 맞다.

0hz 값이 너무 크게 나와서 나머지 값들이 잘 보이지 않는다.

그 이유를 열심히 찾아봤지만 명확하게 원인은 모르겠고 어떤 외국인이 시도해보라고 한 것을 시도해봤다.

( 참고 : https://kr.mathworks.com/matlabcentral/answers/124471-fft-significant-peak-in-0-hz-component )

 

또한 나는 음의 데이터가 없기 때문에 변환한 이후 음수값은 필요가 없어서 fft 대신 rfft를 사용했다.

sample_rate = 4096
duration = 2
n = sample_rate * duration

data = data - data.mean()

x = np.fft.rfftfreq(n, 1/sample_rate)
y = np.fft.rfft(data) / len(data)

변환 데이터가 원하는대로 예쁘게 잘 나왔다.

 

 

4. 모델 생성

 정상0, 고장1 로 표현 가능한 분류모델로는 Logistic Regression, SVM, KNN, Decision Tree, Random Forest, XGB Classifier, LGBM Classifier를 사용했다.

 

위에서 하나의 진동센서 데이터를 시간영역과 주파수 영역 이렇게 2가지로 구분했기 때문에 모델도 따로 만들었다.

시간영역 데이터를 가지고 모델 성능 비교 결과 Logistic Regression, Decision Tree, LGBM 모델이 우수한 성능을 보였다.

 

주파수 영역 데이터를 가지고 모델을 만들어 성능을 비교한 결과 Logistic Regression, KNN의 성능이 좋았다.

 

두가지 경우 모두 모델의 성능이 90퍼는 넘지 못했지만 푸리에 변환을 잘 시도했다는 것에 의의를 두었다.

 

 

 

 

profile

매직코드

@개발법사

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!