UNLV

[UNLV] - 머신러닝 기초와 IMU 센서 퓨전(3일차)

빡성 2026. 2. 7. 03:40

1. 수업 개요: 머신러닝과 임베디드 시스템

이번 수업은 "머신러닝 알고리즘을 수학으로 끝내는 게 아니라, 센서(IMU)·로봇·드론·임베디드 시스템에서 실제로 어떻게 쓰는지"를 설명하는 수업이었다.

이 수업의 핵심은 머신러닝이 단순히 이론적인 알고리즘이 아니라, 현실의 노이즈를 다루는 도구라는 점이었다. 특히 센서 데이터를 다룰 때 수학 모델의 한계를 머신러닝이 어떻게 보완하는지, 그리고 이를 실제 임베디드 시스템에 어떻게 적용하는지가 이 수업의 핵심이었다.

수업에서는 머신러닝의 기본 개념부터 시작해, IMU 센서 데이터를 활용한 자세 추정 실습까지 진행했다. 이론과 실습을 통해 머신러닝이 임베디드 시스템에서 어떤 역할을 하는지 구체적으로 이해할 수 있었다.

2. 머신러닝이 왜 중요한가: 전력과 환경 문제

수업 초반에 머신러닝의 중요성을 다룰 때, 단순히 기술적인 측면만이 아니라 환경과 전력 소비 문제까지 연결해서 이해했다.

AI와 데이터센터가 전력을 엄청나게 소비하고 있고, 이는 탄소 배출로 이어진다. 현재 컴퓨팅과 AI가 전체 탄소 배출의 약 2~3%를 차지하고 있으며, 앞으로 8~10%까지 증가할 가능성이 있다고 하셨다.

이런 상황에서 전력 자동화(power automation)저전력 시스템이 중요해지고 있다. 센서, MCU, 임베디드 AI가 미래의 핵심 기술이 되는 이유다.

이 수업에서 배우는 내용은 단순히 알고리즘을 아는 것이 아니라, 저전력 환경에서도 동작하는 머신러닝 모델을 설계하는 방법을 배우는 것이다. Decision Tree 같은 알고리즘이 임베디드 시스템에서 각광받는 이유도 여기에 있다.

3. 지도 학습, 비지도 학습, 준지도 학습

머신러닝은 학습 방식에 따라 크게 세 가지로 나뉜다. 각각의 특징과 현실에서의 활용 방식을 이해했다.

지도 학습(Supervised Learning)은 입력 데이터와 정답(레이블)이 쌍으로 존재할 때 사용한다. 회귀(Regression)와 분류(Classification) 두 가지 문제를 해결한다.

하지만 지도 학습의 가장 큰 문제는 라벨링 비용이다. 이 수업의 점은, 10억 개의 데이터가 있어도 그 중 80%는 라벨링이 불가능하다는 것이다. 사람이 직접 정답을 달아줘야 하기 때문에 시간과 비용이 엄청나게 든다.

비지도 학습(Unsupervised Learning)은 라벨 없이 데이터 자체의 패턴을 찾는다. 예시로는 발에 센서를 달고 어떤 표면을 걷는지 모르는 상황이다. 데이터만 보고 패턴을 자동으로 분리하는 것이 비지도 학습이다.

군집화(Clustering)와 차원 축소(Dimensionality Reduction)가 대표적인 기법이다. 예를 들어 IMU 센서 데이터에서 라벨 없이도 유사한 움직임 패턴을 자동으로 그룹화할 수 있다.

준지도 학습(Semi-supervised Learning)현실에서 가장 많이 쓰이는 방식이다. 10%만 사람이 라벨링하고, 나머지 90%는 모델이 처리한다.

방식은 다음과 같다. 먼저 소량의 라벨링된 데이터로 모델을 훈련시킨다. 그 다음 훈련된 모델로 나머지 데이터에 라벨을 예측한다(이를 pseudo-labeling이라고 함). 실패하면 다시 조금 더 훈련시키고, 반복하면서 개선해나간다.

이 방식은 라벨링 비용을 크게 줄이면서도 지도 학습의 정확도를 어느 정도 유지할 수 있어서, 실제 산업 현장에서 널리 사용된다.

4. 회귀와 분류: 알고리즘의 이중성

수업에서 다룬 여러 알고리즘들을 보면, 이 수업의 공통 메시지가 있다. "이 알고리즘들은 분류(classification)도 되고, 많은 경우 회귀(regression)도 된다."

회귀(Regression)는 수치형 결과, 즉 연속적인 값을 예측하는 문제다. 선형 회귀는 입력과 출력 사이의 직선적인 관계를 가정하고, 비선형 회귀는 복잡한 곡선 관계를 학습한다.

분류(Classification)는 범주형 결과, 즉 불연속적인 값을 예측하는 문제다. 이진 분류(스팸/정상), 다중 클래스 분류(색상 분류), 다중 레이블 분류(빨간색이면서 자동차) 등이 있다.

알고리즘들을 정리하면:

  • Linear / Nonlinear Regression: 회귀 전용
  • Logistic Regression: 분류 전용 (이진 분류)
  • Decision Tree: 회귀와 분류 모두 가능
  • Random Forest: 회귀와 분류 모두 가능
  • k-NN: 회귀와 분류 모두 가능
  • SVM: 회귀(SVR)와 분류 모두 가능
  • Neural Network: 회귀와 분류 모두 가능

이런 유연성이 머신러닝 알고리즘의 강점이다. 같은 알고리즘이지만 문제에 따라 회귀나 분류로 활용할 수 있다.

5. IMU 센서와 회귀 모델: 수학 모델의 한계

이 수업의 핵심 실습 주제는 IMU 센서 데이터를 활용한 자세 추정이었다. IMU 센서는 가속도계(Accelerometer)와 자이로스코프(Gyroscope)로 구성되어 있다.

데이터 구조는 다음과 같다:

  • 가속도계: X, Y, Z (3개)
  • 자이로스코프: X, Y, Z (3개)
  • 총 6개 입력값

목표는 Roll, Pitch, Yaw (Orientation)를 추정하는 것이다.

여기서 중요한 전환 포인트가 있다. 이 수업의 것은 "수학 공식(삼각함수, 물리 모델) 대신 회귀 모델로 추정한다"는 점이었다.

수학 모델의 한계는 다음과 같다:

  • 노이즈에 취약: 센서 데이터에 약간의 노이즈만 있어도 결과가 크게 달라진다.
  • 센서 드리프트: 시간이 지나면서 센서 값이 점점 어긋난다.
  • 완벽한 값이 안 나옴: 현실에서는 이론적인 수식대로 정확한 값이 나오지 않는다.

반면 회귀 모델의 장점은:

  • 노이즈 포함 학습: 학습 데이터에 노이즈가 포함되어 있어도, 모델이 평균적으로 올바른 패턴을 학습한다.
  • 일부러 노이즈 주입 가능: 학습 시 의도적으로 노이즈를 추가해서 더 강인한 모델을 만들 수 있다.
  • 센서 드리프트 보정: 평균적으로 드리프트를 보정할 수 있다.

핵심은 "수학은 정확하지만, 노이즈를 못 견딘다. 머신러닝은 틀려도 괜찮다. 대신 버틴다."는 것이다. 현실 시스템에서는 정확함보다 안정성이 더 중요하다.

실제로 IMU 센서에 선형 회귀를 적용하면, 가속도계 데이터(ay, az)를 변수로 사용하여 Roll 각도를 예측하는 수식을 도출할 수 있다.

θ̂roll ≈ -0.44 + 73.55 · ay + 0.60 · az

이 수식은 물리적 모델(θroll = arctan2(ay, az))을 대체하는 것이 아니라, 노이즈가 포함된 실제 센서 데이터에서 더 안정적인 결과를 내는 것이다.

6. 결정 트리: 임베디드 시스템의 친구

결정 트리(Decision Tree)는 임베디드 시스템에서 각광받는 이유를 다룬 알고리즘이다.

결정 트리의 본질은 거대한 if-else 구조다. 데이터를 가장 잘 구분하는 기준(임계값, threshold)을 찾아서 나무 모양의 계층적 규칙을 만든다.

  • Root node: 전체 데이터셋이 시작되는 지점
  • Internal nodes: 특징 값에 따른 조건문 역할 (예: "a_y > 0.5인가?")
  • Leaf nodes: 최종적인 클래스 레이블이나 수치 결과

이 수업의 임베디드 관점은 다음과 같다:

MCU(Microcontroller Unit)에서는 Python을 사용할 수 없고, 복잡한 연산도 하기 어렵다. 대신 결정 트리는:

  • 레지스터에 임계값 저장: 각 노드의 임계값을 메모리에 저장
  • 비교만 수행: 입력값과 임계값을 비교하는 단순 연산
  • 연산 거의 없음: 복잡한 행렬 연산이나 함수 계산이 필요 없다

이런 특징 덕분에 초저전력(µW~nW) 환경에서도 동작할 수 있다. 결정 트리는 배터리로 수년간 동작해야 하는 IoT 센서나 웨어러블 기기에 최적의 알고리즘이다.

물론 결정 트리도 과적합(Overfitting) 문제가 있고, 특징 스케일링에 민감하다는 단점이 있다. 하지만 임베디드 시스템에서는 이런 단점보다도 저전력과 실시간 처리가 더 중요하다.

7. 랜덤 포레스트, k-NN, SVM

랜덤 포레스트(Random Forest)는 여러 개의 결정 트리를 독립적으로 학습시킨 뒤, 그 결과를 취합하는 앙상블 기법이다.

각 트리는 랜덤하게 선택된 데이터와 특징으로 학습되며, 최종 결정은 다수결 투표(분류) 또는 평균(회귀)으로 내린다. 단일 트리보다 정확도가 높고, 노이즈에 강하며, 과적합 방지에 효과적이다.

하지만 임베디드 시스템에서는 여러 트리를 동시에 실행해야 하므로, 결정 트리보다 전력 소비가 크다. 정확도가 중요한 경우에만 사용한다.

k-최근접 이웃(k-NN)은 새로운 데이터가 들어왔을 때, 가장 가까운 k개의 이웃 데이터를 찾아 그들의 다수결로 결과를 정하는 알고리즘이다.

학습 단계가 없는 '게으른 학습(Lazy learning)' 방식이다. 전체 데이터셋을 메모리에 저장해두고, 예측할 때마다 거리 계산을 해야 한다. 따라서 대용량 데이터에는 부적합하지만, 작은 데이터셋에서는 간단하고 효과적이다.

k는 하이퍼파라미터로, 너무 작으면 노이즈에 취약하고, 너무 크면 경계가 모호해진다. 특징 스케일링에 민감하므로, 정규화가 필수다.

지원 벡터 머신(SVM)은 클래스 간의 간격(Margin)을 최대화하는 최적의 경계선(Hyperplane)을 찾는 모델이다.

이 수업의 것은 "맞는 선이 아니라 가장 잘 나누는 선"을 찾는다는 점이다. 경계선에 가장 가까운 데이터 포인트들이 지원 벡터(Support Vector)가 되고, 이들을 기준으로 최적의 경계를 찾는다.

SVM의 핵심은 커널(Kernel) 기법이다. 선형으로 나누기 힘든 데이터를 고차원으로 변환하여 분리한다. RBF, Polynomial 등의 커널 함수가 사용된다.

하이퍼파라미터로는:

  • C 파라미터: 마진의 엄격함을 조절. 값이 클수록 오차를 덜 허용한다.
  • gamma: 비선형 SVM의 유연성을 조절. 개별 훈련 예제의 영향 범위를 결정한다.

워크플로우는 다음과 같다:

  1. Python에서 모델 학습 및 검증
  2. 학습된 모델 파라미터 추출
  3. C++로 이식하여 실제 장치에 배포

이 과정을 통해 알고리즘 비교뿐만 아니라 임베디드 이식 가능성까지 고려할 수 있게 된다.

8. 인공 신경망과 딥러닝

인공 신경망은 생물학적 뉴런의 신호 전달 체계를 수학적으로 모델링한 것이다. 입력값(X)에 가중치(W)를 곱한 뒤 편향(bias)을 더하여 합산하고, 이를 활성 함수(Activation Function)에 통과시켜 출력값을 결정한다.

신경망의 학습 과정은 순전파와 역전파로 구성된다:

  • 순전파(Forward Propagation): 입력 데이터가 계층 구조를 통과하며 최종 예측값(ŷ)을 도출
  • 역전파(Backpropagation): 실제 정답(y)과 예측값 사이의 손실 함수를 계산하고, 연쇄 법칙(Chain Rule)에 따라 각 가중치를 업데이트하여 오차를 최소화

신경망의 성능을 결정하는 핵심은 하이퍼파라미터다:

  • 층의 수(Depth): 표현력을 결정. 깊을수록 복잡한 패턴을 학습할 수 있지만 과적합 위험이 증가
  • 층당 노드 수(Width): 특징 추출 용량을 설정
  • 활성 함수: ReLU, Tanh 등 비선형 함수로 복잡한 함수 근사를 가능하게 함
  • 정규화: L2 정규화나 드롭아웃(Dropout)으로 과적합 방지
  • 학습률(Learning Rate): 파라미터 업데이트의 보폭. 너무 크면 발산, 너무 작으면 수렴이 느려짐
  • 배치 크기(Batch Size)에포크(Epoch): 학습 데이터의 활용 주기

심층 신경망(DNN)은 여러 은닉층을 가진 다층 신경망이다. 각 층이 계층적 특징을 학습하여 복잡한 패턴 인식이 가능하다.

특정 문제에 최적화된 변형 아키텍처들:

  • CNN (Convolutional Neural Network): 이미지나 그리드 형태의 데이터에서 공간적 지역성을 추출. 컨볼루션 필터를 사용하여 컴퓨터 비전 분야에 최적화
  • RNN (Recurrent Neural Network): 시계열이나 텍스트처럼 순차적인 데이터 처리. 은닉 상태를 유지하며 시간적 의존성을 학습. 하지만 장기 의존성을 학습하기 어려움
  • LSTM (Long Short-Term Memory): RNN의 기울기 소실 문제를 해결하기 위해 게이팅 메커니즘(입력/출력/망각 게이트)을 도입하여 장기 의존성을 효과적으로 학습

임베디드 시스템에서는 신경망의 복잡도 때문에 전력 소비가 크다. 따라서 경량화 기법(양자화, 프루닝 등)이나 경량 아키텍처(MobileNet 등)를 사용해야 한다.

9. 가속도계만으로 자세 추정하기

가속도계는 중력 벡터를 분석하여 장치의 기울기를 계산할 수 있다. 정지 상태에서 가속도계는 중력 가속도를 측정하므로, 이를 활용해 Roll과 Pitch 각도를 계산할 수 있다.

수식은 다음과 같다:

Roll(φ) = arctan2(ay, az)

Pitch(θ) = arctan2(-ax, √(ay² + az²))

하지만 가속도계만으로는 한계가 명확하다:

  • Yaw(Z축 회전) 측정 불가: 중력 방향인 Z축 주변의 회전은 감지할 수 없다
  • 진동(노이즈)에 취약: 약간의 흔들림만 있어도 값이 크게 변한다
  • 선형 가속도 영향: 움직임이 있을 때는 가속도계 값에 실제 가속도가 더해져 오차가 발생한다

이런 한계 때문에 단일 센서만으로는 정확한 자세 추정이 어렵고, 여러 센서를 융합해야 한다.

10. 상보 필터: 가속도계와 자이로스코프의 융합

가속도계는 정적 상태에서 정확하지만 노이즈에 취약하고, 자이로스코프는 단기적으로 정확하지만 시간이 지나면서 누적 오차(드리프트)가 발생한다.

상보 필터(Complementary Filter)는 이 두 센서의 장단점을 보완하는 기법이다:

  • 가속도계(저주파 필터): 장기적 안정성 제공
  • 자이로스코프(고주파 필터): 단기적 정밀성 제공

융합 수식은 다음과 같다:

Angle[t] = α × (Angle[t-1] + gyro × Δt) + (1-α) × AccelAngle

여기서:

  • Angle[t]: 현재 융합된 각도 (Roll 또는 Pitch)
  • Angle[t-1]: 이전 추정 각도
  • gyro: 자이로스코프의 각속도 (degrees/sec)
  • Δt: 샘플링 간격 (seconds)
  • AccelAngle: 가속도계로 계산한 각도
  • α: 융합 계수 (일반적으로 0.95~0.98)

α가 0에 가까우면 가속도계에 더 의존하고, 1에 가까우면 자이로스코프에 더 의존한다. 일반적으로 0.95~0.98 사이의 값을 사용하여 자이로스코프의 단기 정밀성을 우선시하면서도, 가속도계로 장기 드리프트를 보정한다.

상보 필터는 계산이 간단하고 실시간 처리에 적합하여, 많은 임베디드 시스템에서 사용된다.

11. 지자기 보정과 9축 센서 퓨전

Yaw(방위각)를 측정하려면 지자기 센서(Magnetometer)가 필요하다. 하지만 지자기 센서는 수평 상태에서만 정확한 방위각을 제공하므로, 기울어진 상태에서는 보정이 필요하다.

기울기 보정(Tilt Compensation)은 가속도계로 구한 Roll(φ)과 Pitch(θ)를 사용하여 지자기 데이터를 수평면으로 회전 투영하는 기법이다.

수평 자기 성분을 계산하는 수식:

XH = mx cos(θ) + my sin(θ) sin(φ) + mz sin(θ) cos(φ)

YH = my cos(φ) - mz sin(φ)

그 다음 Yaw를 계산한다:

Yaw(ψ) = arctan2(YH, XH)

하지만 이 방법은 여전히 지터(jitter)가 발생한다. 더 정확하고 부드러운 자세 추정을 위해서는 9축 필터(Madgwick/Mahony)를 사용한다.

9축 필터는 단순 오일러 각의 한계(짐벌락 문제)를 극복하기 위해 쿼터니언(Quaternion)을 상태 변수로 정의하고, 경사 하강법(Gradient Descent)을 통해 오차를 최소화하며 자세를 실시간으로 업데이트한다.

쿼터니언은 4차원 복소수 기반의 수학 도구로, 3차원 회전을 표현할 때 축 겹침 현상(짐벌락) 없이 부드럽게 계산할 수 있다.

쿼터니언 업데이트 수식(개념):

qnew = qold + (1/2 · qold · GyroRate - β · ∇Error(Accel, Mag)) · Δt

최적화된 쿼터니언을 오일러 각으로 변환:

Roll = arctan2(2(q0q1 + q2q3), 1 - 2(q1² + q2²))

Pitch = arcsin(2(q0q2 - q3q1))

Yaw = arctan2(2(q0q3 + q1q2), 1 - 2(q2² + q3²))

Madgwick 필터는 경사 하강법을 사용하여 센서 융합 오차를 최소화하고, Mahony 필터는 PID 제어기를 사용하여 오차를 보정한다. 두 필터 모두 실시간 임베디드 시스템에서 널리 사용되며, 드론, 로봇, AR/VR 기기 등에서 정확한 자세 추정을 제공한다.

12. Python vs C++: 연구와 실제 제품

수업 전체를 관통하는 메시지로 강조하신 것은 "Python은 연구용, C++은 실제 제품용"이라는 점이었다.

역할별 언어 구분:

역할 언어
모델 학습 Python
검증 Python
실제 장치 C / C++
센서 하드웨어 레지스터

Python의 장점:

  • 풍부한 라이브러리 (scikit-learn, TensorFlow, PyTorch 등)
  • 빠른 프로토타이핑
  • 데이터 분석과 시각화가 용이
  • 하이퍼파라미터 튜닝과 실험에 적합

C++의 장점:

  • 실시간 처리 성능
  • 메모리 효율성
  • 하드웨어 직접 제어 가능
  • 임베디드 시스템 호환성

실제 워크플로우는 다음과 같다:

  1. Python에서 데이터 수집 및 전처리
  2. Python에서 모델 학습 및 하이퍼파라미터 튜닝
  3. Python에서 모델 검증 및 성능 평가
  4. 학습된 모델 파라미터 추출 (가중치, 임계값 등)
  5. C++로 모델 구현 및 최적화
  6. 실제 장치에 배포 및 테스트

이 과정에서 중요한 것은 알고리즘 선택보다도 "어디서 어떻게 쓰느냐"가 더 중요하다는 점이다. 같은 알고리즘이라도 Python에서 학습하고 C++로 이식하는 과정에서 최적화가 필요하다.

13. 실습: Raspberry Pi에서 MPU6050 센서 데이터 로깅

실습에서는 Raspberry Pi Zero 2 W에 MPU6050 센서를 연결하고, Python으로 센서 데이터를 로깅하는 시스템을 구축했다.

MPU6050은 가속도계와 자이로스코프를 포함한 6축 IMU 센서다. I2C 통신을 통해 Raspberry Pi와 연결했다. I2C는 여러 센서를 하나의 버스에 연결할 수 있어서 임베디드 시스템에서 널리 사용된다.

실습 코드의 주요 기능:

  • 센서 데이터 읽기: 100Hz 주기로 가속도와 자이로 데이터를 읽는다
  • 상보 필터 적용: 가속도계와 자이로스코프를 융합하여 Roll, Pitch, Yaw를 계산한다
  • 데이터 로깅: 's' 키를 누르면 CSV 파일로 데이터를 저장한다
  • 실시간 표시: 터미널에 현재 자세 각도를 실시간으로 표시한다

이 실습을 통해 센서 데이터를 수집하고 분석하는 전체 파이프라인을 이해할 수 있었다. 수집한 데이터는 이후 머신러닝 모델 학습에 사용된다.

특히 상보 필터를 직접 구현하면서, 가속도계의 장기적 안정성과 자이로스코프의 단기적 정밀성을 어떻게 결합하는지 구체적으로 이해할 수 있었다.

14. 정리

이번 수업을 통해 머신러닝이 단순히 알고리즘을 배우는 것이 아니라, 현실의 노이즈를 다루는 도구라는 점을 깊이 이해할 수 있었다.

수업의 핵심 메시지를 정리하면:

  • 머신러닝은 수학 대체가 아니다: 수학 모델의 정확함을 대체하는 것이 아니라, 노이즈와 불완전한 데이터에서도 안정적으로 동작하는 도구다.
  • 현실의 노이즈를 다루는 도구: 센서 데이터는 항상 노이즈가 포함되어 있고, 머신러닝은 이런 노이즈를 포함해서 학습할 수 있다.
  • 센서·로봇·드론·웨어러블에서 핵심 기술: 임베디드 시스템에서 머신러닝은 필수 기술이 되고 있다.
  • 임베디드 + 저전력 + ML이 미래: 전력 소비와 환경 문제를 고려할 때, 저전력 머신러닝이 중요하다.
  • 알고리즘 선택보다 "어디서 어떻게 쓰느냐"가 중요: 같은 알고리즘이라도 Python에서 학습하고 C++로 이식하는 과정이 중요하다.

특히 IMU 센서 데이터를 활용한 자세 추정 실습을 통해, 수학 모델의 한계를 머신러닝이 어떻게 보완하는지 직접 경험할 수 있었다. 가속도계만으로는 부족하고, 자이로스코프와 융합하고, 지자기 센서까지 추가하여 9축 필터로 완성하는 과정을 통해, 단일 센서의 한계를 극복하고 정확도를 향상시키는 방법론을 체계적으로 학습할 수 있었다.

이 수업에서 다룬 내용은 앞으로 센서 기반 임베디드 시스템을 개발할 때 매우 유용할 것이다. 특히 Decision Tree 같은 알고리즘이 임베디드 시스템에서 각광받는 이유, 그리고 Python과 C++의 역할 구분을 이해한 것은 실무에서 큰 도움이 될 것 같다.