Unity

[ML-Agents] VectorSensor - 숫자로 보는 세상

빈형임 2025. 5. 14. 02:01

 

Vector Sensor는 가장 기본적이면서도 강력한 센서입니다. 에이전트가 숫자 데이터를 통해 환경을 인식하도록 해줍니다.


언제 사용하나요?

  • 현재 위치, 속도, 회전 같은 수치 데이터를 관찰할 때
  • 내부 상태(예: 배터리 잔량, 청소 모드 등)를 학습에 반영할 때
  • 시각이나 물리 센서보다 간단한 상태 표현이 필요할 때\

 

어떻게 구현하나요?

Agent 클래스의 CollectObservations(VectorSensor sensor) 함수에서 데이터를 수집합니다.

public override void CollectObservations(VectorSensor sensor)
{
    sensor.AddObservation(transform.position.x);       // x 위치
    sensor.AddObservation(transform.position.z);       // z 위치
    sensor.AddObservation(transform.rotation.eulerAngles.y);  // y축 회전
    sensor.AddObservation(currentBattery / maxBattery);      // 배터리 비율
    sensor.AddOneHotObservation((int)cleaningMode, 3);       // 청소 모드 (Idle, Cleaning, Returning)
}

AddObservation()은 다양한 데이터 타입을 지원합니다:
int, float, Vector3, Quaternion, bool, float[], OneHot

 

반드시 지켜야 할 규칙

  1. 관찰 순서 고정: 매 호출마다 순서가 같아야 합니다.
  2. 총 길이 고정: 관찰 벡터의 길이는 항상 동일해야 합니다.
  3. Space Size 일치: Behavior Parameters에서 지정한 관찰 공간 크기와 일치해야 합니다.
예: 총 6개의 float 값을 관찰 → Space Size = 6

 

시간 정보도 포함하고 싶다면?

Stacked Vectors를 활용하면, 현재 관찰 외에 이전 관찰값들도 함께 제공합니다.
최근 상태를 기억하는 데 유용하며, 시계열 데이터 기반 의사결정에 적합합니다.

예: 최근 3 프레임의 관찰을 사용하려면 → Stacked Vectors = 3

 


실전 예시: 로봇 청소기

관찰 항목 VectorSensor로 표현하기
위치 transform.position.x, transform.position.z
회전 rotation.eulerAngles.y
배터리 잔량 currentBattery / maxBattery
청소 모드 AddOneHotObservation((int)mode, 3)

이렇게 구성하면 로봇이 어디에 있고 어떤 상태인지 정확히 파악하며 움직일 수 있습니다.

 

요약

  • Vector Sensor는 가장 가볍고 범용적인 센서입니다.
  • 수치형 관찰에 적합하며 빠른 학습에 유리합니다.
  • 관찰 길이, 순서, 스태킹 설정은 항상 일관성 있게 관리해야 합니다.