Unity
[ML-Agents] Buffer Sensor – 동적으로 변하는 객체를 추적하는 센서
빈형임
2025. 5. 14. 02:29
Buffer Sensor는 에이전트가 가변적인 수의 객체를 관찰할 수 있도록 해주는 센서입니다.
관찰할 대상이 매번 바뀌거나, 수가 일정하지 않은 상황에서 유용하게 사용됩니다.
예: 주변에 쓰레기가 몇 개 있을지 모를 때, 그 수에 따라 관찰을 자동으로 조정할 수 있다면?
언제 사용하나요?
- 주변에 존재하는 객체(유출물, 적, 아이템 등)의 수와 위치가 매번 다를 때
- 다수의 객체를 동적으로 추적해야 할 때
- 레이, 그리드 센서로는 표현이 어렵거나 비효율적인 경우
예: 로봇 청소기 주변에 쓰레기나 장애물이 불규칙하게 생성/삭제되는 상황
주요 설정 항목
설정 항목 | 설명 |
MaxNumObservables | 한 번에 추적할 수 있는 최대 객체 수 |
ObservableSize | 각 객체를 표현하는 float 값의 개수 |
예: ObservableSize = 4 → 각 객체: (x, z, 크기, 타입)
MaxNumObservables = 10 → 최대 10개의 객체까지 관찰 가능
코드 구현 예시
public class TrashObserver : MonoBehaviour
{
public BufferSensorComponent bufferSensor;
void Update()
{
var buffer = bufferSensor.GetObservationBuffer();
foreach (var trash in FindNearbyTrash())
{
float[] data = new float[4] {
trash.transform.position.x,
trash.transform.position.z,
trash.size,
trash.typeIndex
};
buffer.AppendObservation(data);
}
}
}
AppendObservation(float[])을 통해 하나씩 수동으로 버퍼에 추가
추가한 데이터의 길이는 ObservableSize와 정확히 일치해야 함
실전 예시: 유출물 동적 감지 로봇
목표 | Buffer Sensor 활용 |
근처에 쓰레기가 몇 개 있는지 파악 | MaxNumObservables = 20 설정 |
쓰레기 위치 + 크기 + 타입 기록 | ObservableSize = 4 로 설정 후 스택에 추가 |
너무 멀리 있는 쓰레기는 제외 | 거리 필터링 후 AppendObservation |
에이전트는 매 스텝마다 주변 환경을 새롭게 감지하고, 동적으로 행동 전략을 조정할 수 있습니다.
주의사항
- 추가할 수 있는 개수 제한 있음 (MaxNumObservables 초과 시 무시됨)
- 각 엔티티의 데이터 길이는 반드시 동일해야 함 (ObservableSize 고정)
- 서로 다른 유형의 객체를 다루려면 여러 BufferSensor 사용 고려
- Vector/Camera/Ray 센서와 병행하여 사용하면 학습 안정성 향상
훈련 최적화를 위한 전략
전략 | 설명 |
가까운 객체만 필터링 | 불필요한 데이터 제거 → 효율 향상 |
객체 유형을 구분하려면 | 마지막 인덱스에 type index 추가 |
크기 또는 상태 포함 | 스케일, 체력, 위험도 등 커스텀 벡터 구성 가능 |
실시간 스캔 최적화 | Update 대신 FixedUpdate에서 호출하여 안정적 관찰 유지 |
요약
- Buffer Sensor는 객체 수가 유동적인 환경에서 탁월한 선택입니다.
- 주변 동적 객체를 유연하게 추적하고, 다양한 정보로 행동을 조정할 수 있습니다.
- 사용 시 ObservableSize, MaxNumObservables를 일관되게 관리하는 것이 핵심입니다.