๋ฐ์ดํฐ ์ ๋ก๋
์ํ ๋ฐ์ดํฐ๋ฅผ ์์คํ ์ ์ ๋ก๋ํ๊ณ ๋ถ์ ๊ฐ๋ฅํ ํํ๋ก ์ ์ฒ๋ฆฌํ๋ ๊ณผ์ ์ ์ค๋ช ํฉ๋๋ค.
์ง์ ํ์ผ ํ์
| ํ์ | ํ์ฅ์ | ๋น๊ณ |
|---|---|---|
| CSV | .csv | UTF-8 ์ธ์ฝ๋ฉ, ์ผํ ๊ตฌ๋ถ์ |
| Excel | .xlsx | ์ฒซ ๋ฒ์งธ ์ํธ๋ง ์ธ์ |
CSV ํ์ผ์ ์ฒซ ํ์ ์ปฌ๋ผ ํค๋๋ฅผ ํฌํจํด์ผ ํฉ๋๋ค. Excel ํ์ผ์ ์ ๋ณํฉ์ด ์๋ ๋จ์ผ ํ ์ด๋ธ ํํ์ฌ์ผ ํฉ๋๋ค.
๋ฐ์ดํฐ ๊ตฌ์กฐ
์ํ ๋ฐ์ดํฐ๋ ์๊ณ์ด ํํ๋ก ์๋ ์ปฌ๋ผ์ ํฌํจํฉ๋๋ค.
| ์ปฌ๋ผ๋ช | ๋จ์ | ์ค๋ช | ํ์ ์ฌ๋ถ |
|---|---|---|---|
timestamp | s | ์ธก์ ์๊ฐ (0๋ถํฐ ์์ํ๋ ๊ฒฝ๊ณผ ์๊ฐ) | ํ์ |
speed | rad/s | ํ์ ์ ๊ฐ์๋ | ํ์ |
current_d | A | d์ถ ์ ๋ฅ | ํ์ |
current_q | A | q์ถ ์ ๋ฅ | ํ์ |
voltage_d | V | d์ถ ์ ์ | ์ ํ |
voltage_q | V | q์ถ ์ ์ | ์ ํ |
torque | Nยทm | ์ถ ํ ํฌ | ํ์ |
temp_winding | degC | ๊ถ์ ์จ๋ | ํ์ |
temp_bearing | degC | ๋ฒ ์ด๋ง ์จ๋ | ์ ํ |
temp_inverter | degC | ์ธ๋ฒํฐ IGBT ์ ํฉ ์จ๋ | ์ ํ |
์์ CSV
timestamp,speed,current_d,current_q,torque,temp_winding
0.000,0.0,0.0,0.0,0.0,25.3
0.001,10.5,0.12,1.85,0.42,25.3
0.002,21.0,0.11,3.70,0.84,25.4
0.003,31.4,0.10,5.55,1.26,25.4SI ๋จ์ ๊ท์น
๋ชจ๋ ๋ฐ์ดํฐ๋ SI ๋จ์๊ณ๋ฅผ ๋ฐ๋ฆ ๋๋ค.
- ์๋: rad/s (RPM์ด ์๋ rad/s๋ก ๋ณํ ํ์. 1 RPM = 2ฯ/60 rad/s)
- ์ ๋ฅ/์ ์: A, V (ํผํฌ๊ฐ ๊ธฐ์ค)
- ํ ํฌ: Nยทm (kgfยทcm ๋ฑ ๋นSI ๋จ์ ์ฌ์ฉ ๊ธ์ง)
- ์จ๋: degC (์ ๋์จ๋ K๊ฐ ์๋ ์ญ์จ)
RPM ๋จ์๋ก ๊ธฐ๋ก๋ ์๋ ๋ฐ์ดํฐ๊ฐ ์๋ค๋ฉด ์ ๋ก๋ ์ ๋ณํํ๊ฑฐ๋, ์ ์ฒ๋ฆฌ ๋จ๊ณ์์ ์๋ ๋ณํ์ ์ ์ฉํ ์ ์์ต๋๋ค.
import numpy as np
RPM_TO_RADS = 2 * np.pi / 60
speed_rads = speed_rpm * RPM_TO_RADS์ ๋ก๋ ์ ์ฐจ
์น ๋์๋ณด๋์์ ์ ๋ก๋
- ๋์๋ณด๋ ์ข์ธก ๋ฉ๋ด์์ ๋ฐ์ดํฐ ๊ด๋ฆฌ ํญ์ ์ ํํฉ๋๋ค
- ์ ๋ฐ์ดํฐ ์ ๋ก๋ ๋ฒํผ์ ํด๋ฆญํฉ๋๋ค
- ํ์ผ์ ๋๋๊ทธ ์ค ๋๋กญํ๊ฑฐ๋ ํ์ผ ์ ํ ๋ํ์์์์ ์ ํํฉ๋๋ค
- ์ ๋ก๋ ํ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ํ๋ฉด์์ ์ปฌ๋ผ ๋งคํ์ ํ์ธํฉ๋๋ค
- ํ์ธ ๋ฒํผ์ ๋๋ฅด๋ฉด ์ ์ฒ๋ฆฌ๊ฐ ์์๋ฉ๋๋ค
CLI์์ ์ ๋ก๋
simulation/runner.py๋ฅผ ํตํด ์ง์ ๋ฐ์ดํฐ๋ฅผ ๋ก๋ํ ์ ์์ต๋๋ค.
cd ev-motor-reliability
source venv/bin/activate
python -m simulation.runner --input data/test_001.csv --validate--validate ์ต์
์ ์
๋ก๋ ์ ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ์ ๊ฒ์ฌํฉ๋๋ค. ์ปฌ๋ผ ๋๋ฝ, ๋จ์ ๋ฒ์ ์ด๊ณผ, NaN ๊ฐ ๋ฑ์ ํ์ธํฉ๋๋ค.
์๋ฆฌ์ผ ํฌํธ์์ ์ค์๊ฐ ์์ง
SMC300 ๋ชจํฐ์ ์ด ํจํค์ง์ ์๋ฆฌ์ผ ํต์ ์ผ๋ก ์ค์๊ฐ ๋ฐ์ดํฐ๋ฅผ ์์งํ๋ ๊ฒฝ์ฐ:
python -m automation.pipeline --mode acquire --port /dev/ttyUSB0 --baudrate 115200์์ง๋ ๋ฐ์ดํฐ๋ data/raw/ ๋๋ ํ ๋ฆฌ์ ํ์์คํฌํ ๊ธฐ๋ฐ ํ์ผ๋ช
์ผ๋ก ์๋ ์ ์ฅ๋ฉ๋๋ค.
๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ
์ ๋ก๋๋ ๋ฐ์ดํฐ๋ ๋ถ์ ์ ์๋ ์ ์ฒ๋ฆฌ๋ฅผ ๊ฑฐ์นฉ๋๋ค.
์ด์์น ์ ๊ฑฐ
3ฯ (ํ์คํธ์ฐจ 3๋ฐฐ) ๋ฒ์๋ฅผ ๋ฒ์ด๋๋ ๋ฐ์ดํฐ ํฌ์ธํธ๋ฅผ ์ด์์น๋ก ํ์ ํฉ๋๋ค. ๋ฌผ๋ฆฌ์ ํ๊ณ๊ฐ๋ ํจ๊ป ์ ์ฉ๋ฉ๋๋ค.
| ๋ฌผ๋ฆฌ๋ | ์ ํจ ๋ฒ์ | ๊ทผ๊ฑฐ |
|---|---|---|
| ์๋ | 0 ~ 2,094 rad/s | PMSM ์ต๋ 20,000 RPM ๊ธฐ์ค |
| ์ ๋ฅ | -500 ~ 500 A | ์ธ๋ฒํฐ ์ ๊ฒฉ ๊ธฐ์ค |
| ํ ํฌ | -200 ~ 200 Nยทm | ๋ค์ด๋๋ชจ ์ต๋ ํ ํฌ ๊ธฐ์ค |
| ์จ๋ | -40 ~ 200 degC | ์ ์ฐ ๋ฑ๊ธ H์ข ๊ธฐ์ค |
์ด์์น๊ฐ ์ ์ฒด ๋ฐ์ดํฐ์ 5% ์ด์์ด๋ฉด ๊ฒฝ๊ณ ๊ฐ ํ์๋ฉ๋๋ค. ์ผ์ ๊ณ ์ฅ์ด๋ ํต์ ์ค๋ฅ ๊ฐ๋ฅ์ฑ์ ์ ๊ฒํด์ผ ํฉ๋๋ค.
๊ฒฐ์ธก๊ฐ ๋ณด๊ฐ
๊ฒฐ์ธก๊ฐ(NaN)์ ์ ํ ๋ณด๊ฐ(Linear Interpolation)์ผ๋ก ์ฑ์๋๋ค. ์ฐ์ ๊ฒฐ์ธก์ด 10๊ฐ ์ด์์ด๋ฉด ํด๋น ๊ตฌ๊ฐ์ ์ ์ธํ๊ณ ๋ถ์ํฉ๋๋ค.
import pandas as pd
df = pd.read_csv("data/test_001.csv")
df = df.interpolate(method="linear", limit=10)
df = df.dropna() # ๋ณด๊ฐ ๋ถ๊ฐ ๊ตฌ๊ฐ ์ ๊ฑฐ๋ฆฌ์ํ๋ง
์ธก์ ๊ฐ๊ฒฉ์ด ๋ถ๊ท ์ผํ ๊ฒฝ์ฐ, ์ง์ ๋ ์ํ๋ง ์ฃผ๊ธฐ(๊ธฐ๋ณธ๊ฐ: 1 ms)๋ก ๋ฆฌ์ํ๋งํฉ๋๋ค. scipy์ interp1d๋ฅผ ์ฌ์ฉํ์ฌ ์๊ฐ์ถ์ ์ ๊ทํํฉ๋๋ค.
์ ์ฒ๋ฆฌ ๊ฒฐ๊ณผ ํ์ธ
์ ์ฒ๋ฆฌ ์๋ฃ ํ ์์ฝ ๋ฆฌํฌํธ๊ฐ ์์ฑ๋ฉ๋๋ค.
- ์๋ณธ ๋ฐ์ดํฐ ํฌ์ธํธ ์ / ์ ์ฒ๋ฆฌ ํ ๋ฐ์ดํฐ ํฌ์ธํธ ์
- ์ ๊ฑฐ๋ ์ด์์น ์ ๋ฐ ๋น์จ
- ๋ณด๊ฐ๋ ๊ฒฐ์ธก๊ฐ ์
- ๊ฐ ์ปฌ๋ผ์ ์ต์/์ต๋/ํ๊ท /ํ์คํธ์ฐจ
๋ค์ ๋จ๊ณ
๋ฐ์ดํฐ ์ ๋ก๋์ ์ ์ฒ๋ฆฌ๊ฐ ์๋ฃ๋๋ฉด ๋ถ์ ์คํ์ผ๋ก ์งํํฉ๋๋ค.