08. 도메인 랜덤화
도메인 랜덤화(Domain Randomization)는 학습 데이터의 시각·물리 속성을 매 샘플마다 흔들어 정책이 "평균적인 sim 외형"이 아닌 "분포 전체"에 강건해지도록 만드는 기법이다. Replicator는 이를 그래프 형태로 추상화한다.
이 기능의 강점
- 선언형 그래프 — Python 한 블록으로 수십 가지 랜덤화를 동시 지정
- Uniform / Normal / Choice / Sequence 등 분포 빌트인
- 조명·텍스처·머티리얼·카메라·포즈를 모두 같은 그래프에서 다룸
- DR + RL 결합 시 sim-to-real 격차 크게 감소 (Isaac Lab 워크플로의 표준)
구현 방법
with rep.new_layer(): → rep.trigger.on_frame(num_frames=N) 컨텍스트 → with rep.get.prim_at_path(...): rep.modify.pose(...) / rep.randomizer.color(...). Writer는 평소처럼 attach.
최소 데모
검증 결과
6장 그리드에 색·회전·카메라가 매번 다르게 적용됨이 명확히 보임.
핵심 코드 발췌
with rep.new_layer():
cam = rep.functional.create.camera(...)
rp = rep.create.render_product(cam, (640, 480))
cube = rep.get.prim_at_path("/World/Cube")
with rep.trigger.on_frame(num_frames=6):
with cube:
rep.randomizer.color(colors=rep.distribution.uniform((0,0,0),(1,1,1)))
rep.modify.pose(rotation=rep.distribution.uniform((-30,-30,-30),(30,30,30)))
코드 다운로드 (zip)
실무 예제 — Warehouse 환경 + YCB 박스 + 3축 랜덤화
Simple_Warehouse 배경에 YCB cracker_box를 무작위 (위치·회전·색·돔라이트 강도·카메라 위치)로 9장 캡처. 매 프레임 그래프가 분포 샘플링.
한 번의 trigger.on_frame(num_frames=9) 정의만으로 9장 데이터가 자동 생성. 색·회전·조명·카메라가 매번 다른 분포 샘플로 적용됨이 시각 확인됨.
실무 데모 코드
with rep.new_layer():
cam = rep.functional.create.camera(position=(1.5,-1.5,1.0), look_at=(0,0,0.5))
rp = rep.create.render_product(cam, (640, 480))
tgt = rep.get.prim_at_path("/World/Target")
dom = rep.get.prim_at_path("/World/Dome")
cam_n = rep.get.prim_at_path("/World/DRCam")
with rep.trigger.on_frame(num_frames=9):
with tgt:
rep.modify.pose(
position=rep.distribution.uniform((-0.4,-0.4,0.4),(0.4,0.4,0.6)),
rotation=rep.distribution.uniform((-180,-180,-180),(180,180,180)))
rep.randomizer.color(colors=rep.distribution.uniform((0,0,0),(1,1,1)))
with dom:
rep.modify.attribute("inputs:intensity",
rep.distribution.uniform(400, 2500))
실무 데모 코드 zip