실시간 물류창고 시뮬레이션에서 AMR(Autonomous Mobile Robot)의 경로 최적화·충돌 회피를 학습/운영하는 유니티 프로젝트입니다.
Unity + ML‑Agents(PPO) 기반의 강화학습 모드와, WMS 연동을 위한 시뮬레이션 모드(작업 큐·대기 위치 복귀·상태 머신)를 제공합니다.
주요 스크립트:
AMR_Agent.cs,WarehouseEnvironment.cs,TaskManager.cs,TaskBridge.cs,AMRMonitorUI.cs
맵 구성: 텍스트 맵 →MapReader.cs/MapGenerator.cs로 레이아웃 생성
- 학습 모드: PPO로 단일→다중 AMR 커리큘럼 학습 (Easy→Medium→Hard, 임시 장애물/다중 AMR 점증).
- 시뮬레이션 모드: WMS 지시(입·출고)를 받아 픽업→적재→드롭→하역→대기 위치 복귀까지 상태 기계로 수행.
- Engine: Unity (URP 권장), C#
- RL: Unity ML‑Agents (PPO)
- Frontend 연동: WebGL 빌드 시 JS ↔ Unity 메시지 브리지(JavaScript interop, 문자열 JSON 교환) — WebSocket/HTTP 미사용
- 데이터/맵: 텍스트 맵 파일(occupancy grid) →
MapReader/MapGenerator로 동적 레이아웃 생성
/Assets
/ML-Agents # 학습 설정 YAML (예: RemodelingAMR.yaml, GoodAMR.yaml)
/Scenes # 유니티 씬 (예: AMRScene)
/Scripts
MapReader.cs
MapGenerator.cs
/ML-Agents
AMR_Agent.cs
WarehouseEnvironment.cs
TaskManager.cs
TaskBridge.cs
AMRMonitorUI.cs
/StreamingAssets
assign_task.csv # 시뮬레이션 입력(입/출고 작업 큐)
- 난이도 파라미터(0~1) 로 활성 AMR 수, 임시 장애물, 스폰 지점 등을 제어
- 랙 통로 좌표계(라인/폭), 입·출고 Transform, 통로 오프셋 정의
- 유틸: 랜덤/최근접 랙 타깃 계산, 안전 스폰, 주변 AMR 탐색
- 이산 행동 5종(정지/좌회전/직진/우회전/후진) + Heuristic
- 관측: 자기 상태, 활성 목표(중간/최종), 통로 인덱스/일치 여부, 레이캐스트, 주변 AMR 정보(슬롯 고정)
- 보상(개선형): 시간 패널티, 진행 보상(LoS 고려), 지터/왕복 억제, 목표 근접 회전 억제, 차선 활용/전환, 교착 처리, 효율 보너스
- 시뮬레이션 모드 상태기계: Idle→Pickup→Loading→Dropoff→Unloading→Completed→Wait
- CSV 또는 웹 입력 작업을 AMR별 큐로 분배(작업량/최근 타입 고려)
- 중간→최종 목표 좌표 계산(랙 전면 오프셋), 완료 통계(평균/최대/최소 처리시간)
- 상태:
pending / queued / assigned / in_progress / completed
- 프런트엔드 ↔ 유니티 양방향 브리지
- 수신:
AssignTaskFromJson(string)(type: INBOUND/OUTBOUND, rackId) - 발신:
TaskRegistered / TaskStarted / TaskCompleted / TaskError / SystemStatus이벤트(JSON 문자열)
- 수신:
- 구현은 JavaScript interop 기반(HTTP/WebSocket 사용 안 함)
- AMR 버튼/정보 패널, 작업 큐 카운트, 진행중 작업 표시
- 선택 AMR 화살표 및 목적지 마커 시각화
- Unity 2022 LTS 이상 권장
- Python 3.8+ (ML‑Agents 학습용)
mlagents,torch
# 가상환경 권장
pip install mlagents torch- Unity로 저장소 오픈 →
Scenes/AMRScene실행 - 하이어라키에서 환경 루트(
WarehouseMap등) 선택 → Difficulty(difficulty) 파라미터 확인
TaskManager시뮬레이션 모드 활성 →StreamingAssets/assign_task.csv로드- 재생(▶) →
AMRMonitorUI에서 AMR 버튼 선택 후 상태/목적지 확인
TaskManager시뮬레이션 모드 비활성(학습 간섭 방지)- 학습 설정 YAML 선택(예:
Settings/RemodelingAMR.yaml) - 아래 명령으로 학습 시작:
mlagents-learn Settings/RemodelingAMR.yaml --run-id=RemodelingAMR_$(date +%Y%m%d_%H%M) --time-scale=20커리큘럼은 환경 파라미터
difficulty로 제어되며, 난이도 상승 시 AMR 수/임시 장애물이 점증합니다.
map/의 텍스트 기반 레이아웃(occupancy grid)을MapReader/MapGenerator가 파싱/생성하여 동일 규칙의 창고 배치를 재현합니다.- CBS(Conflict‑Based Search) 비교 실험과 동일 격자 환경을 유지하기 위한 용도입니다.
- 브라우저(JS) → Unity:
AssignTaskFromJson(json)호출 (예:{"type":"INBOUND","rackId":"B03"}) - Unity → 브라우저(JS): 이벤트(JSON 문자열) 전달 —
TaskRegistered/Started/Completed/Error/SystemStatus - 네트워크 스택 없이 WebGL JS interop로만 동작합니다.
- 성공률, 충돌률, SPL, 평균 완료시간, 데드락률, Optimality Gap(CBS 최단경로 대비)
- 고정 시드/스트레스/일반화 세트로 A/B(이전
GoodAMRvs 개선RemodelingAMR) 비교 권장
- 주요 태그:
Rack,Table,Wall,AMR,TempObstacle,Reprocessing - Physics Layer Collision Matrix를 이용해 AMR↔AMR 충돌을 단계적으로 허용/억제(커리큘럼 안정화)
RayPerceptionSensor3D를 사용할 경우 Detectable Tags/길이·각도를 장면 규모에 맞게 조정
- 8대 AMR 혼잡 구간 Deadlock 해소 정책 보강
- 온·오프 정책 전환(학습/운영) 자동화
- 성능 대시보드(프런트)와
TaskBridge이벤트 시각화 확장
본 프로젝트는 다음 오픈소스/패키지를 사용합니다.
-
Unity ML-Agents (com.unity.ml-agents) — Apache License 2.0
ML-Agents C# 패키지 및 Python 툴킷(mlagents, mlagents-envs)을 포함 -
Unity Sentis (com.unity.sentis) — Unity Companion License (UCL)
런타임 추론 백엔드 -
PyTorch — BSD 3-Clause License
(학습 프레임워크) -
TensorBoard — Apache License 2.0
(로그 시각화) -
(Python deps) numpy, protobuf, grpcio 등 — 각 라이선스는 아래 별도 파일 참조
- 시뮬레이션/작업 큐:
TaskManager - Web 연동:
TaskBridge - RL/에이전트:
AMR_Agent,WarehouseEnvironment