제9부 로보틱스
9.14 Isaac Lab II — 도메인 랜덤화·학습
9.14.1 이 장에서 배우는 것 / 선수 지식
9.13에서 Isaac Lab의 대규모 병렬 RL 구조(수천 환경을 한 GPU에서, 전부 GPU 텐서)를 봤다. 이 장은 그 구조 위에서 실제로 정책을 학습하고 — 그리고 가장 중요한 — 학습한 정책이 실로봇으로 전이되게(Sim2Real) 하는 핵심 기법 도메인 랜덤화(domain randomization) 를 실습으로 익힌다. 9.13가 "어떻게 빨리 학습하나(구조)"였다면, 이 장은 "어떻게 학습하고, 어떻게 실세계로 넘기나"다. 제9부 로보틱스의 마무리.
핵심 통찰: 시뮬에서 잘 걷는 정책이 실로봇에서 넘어지는 이유는 "정책이 시뮬의 특정 물리에 과적합"하기 때문이고, 도메인 랜덤화가 이를 푼다. 시뮬의 마찰·질량·게인·지연은 단일한 근사값이라, 그 값에 맞춰 학습한 정책은 실로봇의 (다른) 물리에서 무너진다(Sim2Real 갭). 해법은 물리를 환경마다 무작위로 크게 흔드는 것 — 수천 환경이 각각 다른 마찰·질량·게인을 가지면, 정책은 특정 물리가 아니라 물리의 분포 전체에 강건한 행동을 배운다. 그러면 실로봇도 "또 하나의 무작위 변형"처럼 보여 전이된다. 병렬(9.13)과 랜덤화는 한 쌍이다 — 수천 환경이 동시에 다른 물리를 겪으니 랜덤화가 추가 비용 없이 대규모로 된다. 단 "얼마나 흔드나"는 기술이다(과적합↔학습 불가).
배우는 것:
- 학습 워크플로우 — 환경 설정 → RL 라이브러리·PPO → 학습 실행(headless) → 곡선 모니터 → 평가(play).
- 곡선 읽기 — 보상·에피소드 길이·손실로 학습 진단(plateau·collapse·reward hacking).
- 도메인 랜덤화 I·II — 무엇을(물리·센서·외란·지형) 흔드나, 얼마나(과적합↔학습 불가)·자동 랜덤화(ADR).
- Sim2Real 기법 더 — 관측 설계·teacher-student(특권 학습)(심화 10.7 예고).
- 엣지 배포 — 정책 → ONNX → TensorRT(5.2) → Jetson(9.1) 제어 루프, 관측 정합.
선수 지식: 9.13(병렬 RL 구조·벡터화 환경·PPO·보상)·9.11(PhysX 물리·게인·도메인 랜덤화 토대)·9.12(랜덤화 개요·SIL)·5.2(TensorRT — 정책 배포)·9.1(Jetson). RL 학습 루프(롤아웃·업데이트·하이퍼파라미터)의 기초는 가정. Sim2Real의 심화(이전·system identification·미세조정)는 10.7, 휴머노이드 파운데이션 모델은 10.10·10.11.
정직: Isaac Lab의 학습 스크립트·RL 라이브러리 통합·도메인 랜덤화 API·설정 방식은 릴리스 의존이 크다. 이 장은 "어떻게 학습하고 곡선을 읽고 랜덤화로 전이를 만드는가의 절차·원리"를 가르치고, 구체 명령·config·클래스는 "그 릴리스 문서로 확인". 학습 곡선·하이퍼파라미터·랜덤화 범위는 태스크·로봇·GPU 의존 개략값이며, 정답이 아니라 출발점이다. 도메인 랜덤화는 Sim2Real을 좁히되 보장하지 않는다 — 실로봇 검증·미세조정(10.7)이 필요함을 정직하게 둔다. 코드는 개념 골격.
9.14.2 학습 워크플로우 — 환경 설정에서 정책까지
RL 정책 학습의 전체 흐름을 큰 그림으로 잡자(9.13의 구조를 실행으로).
Isaac Lab 학습 워크플로우(개념):
# 학습 실행(개념 — 스크립트·인자는 릴리스 의존, 반드시 확인)
python train.py --task=Isaac-Velocity-Anymal-v0 \
--num_envs=4096 --headless \
--max_iterations=1500 # PPO 반복 수
# --num_envs=4096: 수천 환경 GPU 병렬(9.13) · --headless: GUI 없이
# 모니터:
tensorboard --logdir logs/ # 보상·에피소드·손실 곡선
# 평가(학습된 정책 관찰):
python play.py --task=Isaac-Velocity-Anymal-v0 --checkpoint=logs/.../model.pt
- headless가 기본: 상태 기반 RL은 렌더가 불필요하니(9.11)
--headless로 렌더를 끄고 물리만 최대 처리량(9.13). 비전 기반 RL만 렌더 필요. - 핵심 하이퍼파라미터: 환경 수 N(처리량), rollout/horizon 길이(한 업데이트당 환경별 스텝), minibatch·epoch(업데이트 강도), 학습률, 할인 γ·GAE λ, 엔트로피 계수(탐험), 보상 스케일. 대부분 태스크별 스윕으로 찾는다(9.14.9).
- 체크포인트·재개: 긴 학습은 주기적 체크포인트로 저장·재개(중단·튜닝). 최고 성능 모델 보존.
- 평가(play) 필수: 곡선이 좋아도 실제 행동을 눈으로 봐야 한다 — reward hacking(9.13)·기행을 곡선만으론 검출하지 못한다. play 모드로 정책을 렌더하며 관찰.
핵심: 학습 워크플로우는 환경 설정 → PPO·랜덤화 설정 → headless 병렬 학습 → 곡선 모니터 → play로 관찰 → 반복 → 배포다. 상태 RL은 렌더 끄고 N 최대(9.13). 하이퍼는 태스크별 스윕. 곡선이 좋아도 play로 행동을 눈으로 확인(reward hacking 검증). 마지막은 정책을 엣지에 배포(TensorRT 5.2).
9.14.3 학습 곡선 읽기 — 보상·에피소드·디버깅
학습 모니터링의 핵심은 곡선을 읽어 무엇이 잘못됐나를 아는 것이다.
주요 곡선과 해석:
| 곡선 | 해석 |
|---|---|
| 에피소드 보상(reward) | 우상향이 정상. 학습이 되고 있나의 1차 지표 — 안 오름→보상 신호 약함·탐험 부족·물리 불안정·LR 문제 / 오르다 정체→국소 최적·랜덤화 과함·태스크 한계·하이퍼 / 올랐다 붕괴→불안정(LR 큼·보상 스케일·발산)·정책 무너짐 |
| 에피소드 길이(length) | 생존 시간. 보행이면 길수록 안 넘어짐(보상과 함께) |
| 정책·가치 손실 | PPO 손실·KL·엔트로피 — 발산·과/소 탐험 진단 |
| 엔트로피 | 높으면 탐험 중, 너무 빨리 떨어지면 조기 수렴(국소) |
- 보상 곡선이 1순위: 우상향하면 학습 중. 안 오르면 보상이 행동을 못 유도하거나(셰이핑 9.13), 탐험이 부족하거나(엔트로피↑), 물리가 불안정(9.11)하거나, LR이 부적절. 정체면 랜덤화가 너무 세거나(9.14.5) 태스크 한계. 붕괴면 불안정(LR↓·보상 정규화).
- 에피소드 길이와 함께: 보행은 보상이 높아도 금방 넘어지면(짧은 에피소드) 의미 없다 — 둘을 함께 본다. 길이가 늘며 보상이 오르면 건강.
- 곡선↔play 교차 검증: 곡선이 좋아도 play로 보면 기행(미끄러지기·진동으로 점수 따기, reward hacking 9.13)일 수 있다 → 곡선과 실제 행동을 항상 교차. "곡선만 믿지 마라"가 RL 디버깅의 철칙.
- 랜덤화의 곡선 효과(정직): 도메인 랜덤화를 켜면 학습이 느려지고 최종 보상이 낮아 보인다(어려운 분포라) — 이것은 정상이고, 실로봇 전이를 위한 대가다(9.14.5). 랜덤화 없는 학습이 곡선은 좋아도 실로봇서 무너진다.
견해: 곡선 읽기의 핵심은 보상(우상향?)·에피소드 길이(생존?)·엔트로피(탐험?) 를 함께 보고, 안 오름/정체/붕괴를 원인(보상·탐험·물리·LR·랜덤화)으로 진단하는 것. 그러나 곡선이 좋아도 play로 행동을 눈으로 봐야 reward hacking을 검출한다. 그리고 랜덤화를 켜면 곡선이 나빠 보여도 정상 — 보기 좋은 곡선이 아니라 전이되는 정책이 목표.
9.14.4 도메인 랜덤화 I — 무엇을 흔드나
도메인 랜덤화(DR) 는 Sim2Real의 핵심 수단이다(9.12 개요의 심화). 환경마다 물리·센서를 무작위로 바꿔, 정책이 특정 시뮬이 아니라 분포에 강건하게 만든다.
무엇을 흔드나(로봇 제어/RL — 동역학 중심):
| 범주 | 항목 | 무작위(예) | 대상 |
|---|---|---|---|
| 물리·동역학(dynamics) | 마찰계수 | friction × uniform(0.5, 1.5) | 지면·발 접촉 |
| 질량·관성 | mass × (1 ± 0.15) | 적재·제작 편차 | |
| 드라이브 게인 | stiffness/damping ± % | 액추에이터(9.11) | |
| 모터 강도·지연 | torque scale, action delay 스텝 | 실액추에이터 비이상 | |
| 센서·관측(observation) | 관측 노이즈 | obs += gaussian(0, σ) | 실센서 노이즈 |
| 관측 지연·드롭 | latency, dropout | 통신·처리 지연 | |
| 외란(perturbation) | 랜덤 푸시 | 매 N스텝 무작위 힘 | 외부 충격·균형 |
| 지형·씬(scene) | 지면 거칠기·경사·계단·장애물 | — | 다양한 환경 |
(비전 기반이면 시각도: 조명·텍스처·카메라, 9.12.)
- 왜 이것들인가: 실로봇과 시뮬이 다른 지점이 갭의 원천이다 — 마찰(지면마다 다름)·질량(적재·제작)·게인(액추에이터 비이상)·지연(통신)·센서 노이즈·외란. 이 갭의 원천을 무작위로 흔들면 정책이 그 변동을 견디게 배운다.
- 병렬과 한 쌍(9.13): 수천 환경이 각각 다른 물리(env 0은 마찰 0.6·질량 큼, env 1은 마찰 1.4·질량 작음…)를 가지면, 정책은 한 배치에 분포 전체를 본다 — 병렬 덕에 랜덤화가 대규모에서도 추가 비용이 들지 않는다. CPU 단일 환경이면 시간순으로 겪어야 하지만, 병렬은 동시에.
- 물리 vs 시각 랜덤화: 제어/RL(이 장)은 동역학(마찰·질량·게인·외란)이 핵심 — 동역학 갭을 좁힌다. 비전 인지(9.7~9.9·9.12)는 시각(조명·텍스처)이 핵심. 용도가 무엇을 흔들지 정한다.
- 관측 설계와 함께: 관측에 실로봇에서 못 얻는 정보(특권 정보) 를 넣으면 배포 때 무너진다 — 관측은 실로봇에서 얻을 수 있는 것으로(9.14.6). 랜덤화 + 관측 노이즈가 강건성.
핵심: 도메인 랜덤화는 갭의 원천(마찰·질량·게인·지연·센서 노이즈·외란·지형)을 환경마다 무작위로 흔들어 정책을 분포에 강건하게 만든다. 제어/RL은 동역학 중심(비전은 시각). 병렬(9.13)과 한 쌍 — 수천 환경이 각각 다른 물리를 동시에 겪어 랜덤화가 대규모에서도 추가 비용이 들지 않는다. 관측은 실로봇에서 얻을 수 있는 것으로(특권 정보 금지).
9.14.5 도메인 랜덤화 II — 얼마나·자동 랜덤화
DR의 어려운 부분은 "무엇을"이 아니라 "얼마나" 다. 범위가 너무 좁으면 갭이 안 닫히고, 너무 넓으면 학습이 안 된다.
랜덤화 범위의 딜레마:
- 과적합 ↔ 학습 불가: 약한 DR은 시뮬 곡선이 예쁘지만 실로봇서 실패(갭). 강한 DR은 학습이 안 되거나(너무 어려움) 지나치게 보수적(모든 경우에 안전하려다 느리고 소극적 = 차선 정책). 둘 사이 적정점.
- 범위를 어떻게 잡나: 이상적으론 실로봇의 실제 파라미터 분포를 덮도록 — 실로봇의 마찰·질량·게인을 측정(system identification, 10.7)해 그 불확실성 범위로. 측정 없이는 보수적으로 넓게 잡되 학습 가능 한도에서.
- 자동 도메인 랜덤화(ADR): 범위를 고정하지 않고 점진 확대 — 처음엔 좁게(쉬움) 시작해 정책이 잘하면 범위를 넓힌다(어려움 커리큘럼). 정책 성능에 맞춰 랜덤화 난이도를 자동 조절 → 과한 범위로 학습 실패를 피하면서 점점 강건하게(OpenAI Dactyl류 발표 사례). 커리큘럼 학습의 랜덤화판.
- 커리큘럼 일반: 지형도 쉬운→어려운(평지→계단), 명령도 느린→빠른으로 점진. 처음부터 최난도면 학습이 안 된다.
- 정직(10.7): DR은 갭을 좁히되 없애지 못한다 — 너무 넓히면 보수적, 너무 좁히면 갭. system identification(실측)·실로봇 미세조정과 함께 써야 한다(10.7). "DR만 키우면 다 된다"는 환상.
견해: DR의 기술은 "얼마나" 다 — 약하면 과적합(갭), 강하면 학습 불가/과보수. 적정 범위는 실로봇 파라미터 분포를 덮되 학습 가능한 균형이고, ADR(점진 확대)로 자동 조절한다(커리큘럼). 범위는 system identification(실측, 10.7) 으로 안내하는 것이 이상적. DR만으로는 충분하지 않고 실측·미세조정과 한 팀(10.7) — 갭을 좁히되 없애진 못한다.
9.14.6 Sim2Real 기법 더 — 관측 설계·teacher-student
DR 외에도 전이를 돕는 기법들이 있다(심화·이론은 10.7, 여기선 RL 학습에 직접 쓰는 둘).
- 관측 설계가 먼저: 아무리 DR을 해도 관측에 특권 정보(실로봇서 못 얻는 정확한 마찰·전역 위치·미래)가 있으면 배포 때 그 입력이 없어 정책이 무너진다. 관측은 실로봇 센서로 얻을 수 있는 것(엔코더·IMU·명령)으로 한정 — 이것이 전이의 전제.
- Teacher-Student(특권 학습): 그런데 특권 정보가 있으면 학습이 훨씬 쉽다. 그래서: ① Teacher — 시뮬의 특권 정보(지형 높이맵·정확한 물리)까지 보고 쉽게 잘하는 정책을 학습 ② Student — 배포 가능한 관측만 보고 Teacher의 행동을 모방(증류). 배포는 Student(특권 정보 불필요). 사족 보행에서 거친 지형을 이렇게 정복한 유명한 사례(발표 기준). asymmetric actor-critic(critic만 특권 정보, actor는 배포 관측)도 같은 정신.
- 그 외(10.7): action smoothing(부드러운 출력), 저수준 컨트롤러 정합(시뮬 게인=실로봇), system identification(실측), 실로봇 미세조정 — 심화는 10.7.
- 조합: DR(분포 강건) + 관측 설계(배포 가능) + Teacher-Student(어려운 태스크) + sysID/미세조정(10.7)이 함께 Sim2Real을 좁힌다 — 단일 기법이 아니라 묶음.
견해: 전이의 전제는 관측을 실로봇에서 얻을 수 있는 것으로 한정하는 것(특권 정보 금지) — 안 그러면 DR이 무의미. 특권 정보의 학습 이점은 Teacher-Student(특권 Teacher → 배포 가능 Student 증류)로 살린다(거친 지형 보행의 표준). DR·관측 설계·Teacher-Student·sysID(10.7)는 한 묶음 — Sim2Real은 단일 기법이 아니라 전략의 조합이다.
9.14.7 워크스루 — 보행 정책 학습→DR→엣지 배포
전체를 한 흐름으로: 학습 → 랜덤화 → 배포.
# ① 도메인 랜덤화 설정(개념 — config·API는 릴리스 의존, 반드시 확인)
domain_randomization = {
"friction": {"range": (0.5, 1.5), "op": "scale"}, # 마찰 무작위
"mass": {"range": (0.85, 1.15), "op": "scale"}, # 질량 ±15%
"stiffness": {"range": (0.8, 1.2), "op": "scale"}, # 게인(9.11)
"obs_noise": {"std": 0.02}, # 관측 노이즈
"push": {"interval_s": 5, "max_vel": 1.0}, # 랜덤 외란
# ADR: 처음 좁게 → 정책 성능 따라 범위 확대(9.14.5)
}
# ② 학습(수천 환경 병렬 + DR, headless GPU, 9.13)
python train.py --task=Isaac-Velocity-Anymal-v0 --num_envs=4096 --headless \
--max_iterations=1500 # DR은 환경 config에 포함
tensorboard --logdir logs/ # 보상·길이 곡선(랜덤화로 느리지만 전이됨, 9.14.3·9.14.5)
# ③ 평가(play로 행동 확인 — 기행·강건성)
python play.py --task=... --checkpoint=logs/.../model.pt
# 다양한 마찰·외란에도 안 넘어지나(강건성)·기행 없나(reward hacking)
# ④ 배포: 정책 NN → ONNX → TensorRT(5.2) → Jetson(9.1)
python export.py --checkpoint=model.pt --output=policy.onnx # 정책만 export(작은 MLP)
trtexec --onnx=policy.onnx --saveEngine=policy.plan --fp16 # TensorRT 엔진(5.2)
⑤ 엣지 제어 루프(Jetson, 개념):
while running:
obs = read_robot_state() # 엔코더·IMU·명령 → 학습 때와 "같은" 관측 구성 ★
obs = normalize(obs) # 학습 때 정규화와 동일하게
action = policy_trt(obs) # TensorRT 추론(수십 µs~, 작은 NN)
apply_to_motors(action) # 관절 목표(시뮬과 같은 드라이브·게인 9.11)
제어 주파수(예: 50~1000Hz)·게인·관측 구성이 시뮬과 일치해야 전이.
- 관측 정합이 생명: 배포 시 관측을 학습 때와 정확히 같은 방식(같은 양·순서·정규화·단위)으로 구성해야 한다 — 틀리면 정책이 잘못된 입력을 받아 무너진다. "특권 정보 없는 관측(9.14.6)"이라야 실로봇에서 구성 가능.
- 추론은 경량이다(9.13): 정책은 작은 MLP라 TensorRT(5.2)로 수십 µs~ 추론 → 고주파 제어 루프에서 실시간(Jetson 9.1). 학습은 거대(데이터센터), 추론은 경량(엣지) — 0.1.
- 저수준 정합: 시뮬의 드라이브 게인·제어 주파수·액추에이터 모델을 실로봇과 맞춰야 전이된다(9.11·10.7). DR이 이 불확실성을 덮지만, 기본 정합도 중요.
- 반복(플라이휠): 실로봇서 실패하면 → 그 조건을 DR 범위·sysID(10.7)에 반영 → 재학습. 9.12의 데이터 플라이휠이 RL에도.
견해: 전체 흐름은 DR 설정 → 병렬 학습(곡선은 느려도 전이) → play 검증 → 정책 export → TensorRT(5.2) → Jetson 제어 루프다. 배포의 생명은 관측 정합(학습과 같은 양·정규화, 특권 정보 없이)과 저수준 정합(게인·주파수). 추론은 작은 MLP라 경량이다(0.1). 실패는 DR·sysID(10.7)로 환류해 반복 — Sim2Real은 한 번이 아니라 루프.
9.14.8 중간 점검 (체크포인트)
- [ ] 학습 워크플로우(환경·PPO·DR 설정 → headless 병렬 학습 → 곡선 모니터 → play 검증 → 배포)를 안다.
- [ ] 곡선(보상·에피소드 길이·엔트로피)을 읽고 안 오름/정체/붕괴를 진단하며, 곡선↔play 교차(reward hacking)를 안다.
- [ ] 도메인 랜덤화가 갭의 원천(마찰·질량·게인·지연·노이즈·외란·지형)을 흔들어 분포에 강건하게 하고, 병렬(9.13)과 한 쌍임을 안다.
- [ ] DR의 "얼마나"(과적합↔학습 불가)와 ADR(점진 확대)·system identification(10.7) 안내를 안다.
- [ ] 관측 설계(특권 정보 금지) 와 Teacher-Student(특권 학습 증류) 가 전이를 돕는 법을 안다.
- [ ] 정책을 ONNX→TensorRT(5.2)→Jetson 배포하며 관측·저수준 정합이 전이의 전제임을 안다.
증상→의심: 시뮬은 잘되는데 실로봇 실패 → DR 부족(과적합)·관측 불일치(특권 정보/정규화)·저수준 게인 차이 → DR↑·관측 정합·sysID(10.7). 학습이 안 됨(보상 정체) → DR 너무 강함·보상 셰이핑·탐험 부족·물리 불안정 → DR 좁히기·ADR·엔트로피·물리 안정(9.11). 곡선 좋은데 기행 → reward hacking → play 검증·보상 재설계(9.13·6.5). 배포 후 정책이 떪/이상 → 관측 양·순서·정규화 불일치·제어 주파수·게인 → 학습과 정확히 정합. 정책이 너무 보수적·느림 → DR 과하거나 보상 과보수 → 범위·보상 균형. 추론이 느림(엣지) → TensorRT 미적용·NN 큼 → trtexec·작은 MLP(5.2·9.13).
9.14.9 트레이드오프·대안
| 결정 | 트레이드오프 |
|---|---|
| 강한 DR vs 약한 DR | 강건·전이 vs 학습 용이·고성능(과적합 위험) |
| 고정 DR vs ADR(자동) | 단순 vs 점진 커리큘럼(학습 안정·강건) |
| 특권 관측 직접 학습 vs Teacher-Student | 단순 vs 어려운 태스크 정복(배포 가능) |
| 시뮬만(DR) vs 시뮬+실로봇 미세조정 | 안전·규모 vs 갭 보정(10.7) |
| 상태 기반 vs 비전 기반 정책 | 빠름·전이 쉬움(상태) vs 풍부·시각 갭(렌더·랜덤화) |
| PPO 큰 배치 vs 작은 | 안정·처리량 vs 샘플 효율·세밀 |
견해: 로봇 RL의 실전 성패는 "얼마나·무엇을 랜덤화하나" 에 달렸다 — 약하면 갭, 강하면 학습 실패/과보수. ADR(점진 확대) + system identification(실측, 10.7) 으로 범위를 안내하는 것이 최선이고, 어려운 태스크(거친 지형 보행)는 Teacher-Student가 거의 필수. 시뮬만으로 완벽 전이는 드물다 — DR로 좁히고 실로봇 미세조정(10.7)으로 닫는다. 상태 기반은 전이가 쉽고 비전 기반은 시각 갭이 더해져 어렵다(시각 DR·렌더 비용). 핵심: DR·관측 설계·Teacher-Student·sysID·미세조정은 한 팀, 단일 기법 환상 금물.
비엔비디아 정직: 도메인 랜덤화·Teacher-Student·ADR은 학계·업계 공통 기법이다 — OpenAI(Dactyl·ADR), ETH(거친 지형 보행 Teacher-Student), UC Berkeley·CMU(RMA), 다양한 sim2real 연구가 원천. RL 라이브러리도 rl_games·RSL-RL·SKRL·Stable-Baselines3 등 오픈소스. Isaac Lab의 강점은 이 기법들을 대규모 GPU 병렬(9.13)·PhysX·RTX·USD·Isaac 스택에 통합한 것 — 알고리즘 자체는 NVIDIA 고유가 아니다. MuJoCo·Brax 등 다른 시뮬로도 같은 기법을 쓴다. Sim2Real 전이 성공은 로봇·태스크·튜닝·실측 의존이라 보장이 없고, 실로봇 검증이 필수(발표 사례를 자기 로봇으로 단정 금지). 심화 전략은 10.7.
9.14.10 흔한 함정
- DR 없이 학습. 시뮬 한 물리에 과적합 → 실로봇 무너짐 → 동역학 DR(마찰·질량·게인·외란·노이즈) 필수.
- DR 너무 강함. 학습 실패 또는 과보수(느린 정책) → ADR로 점진·범위 조정(9.14.5).
- 관측에 특권 정보. 실로봇서 못 얻는 정확한 마찰·전역 위치·미래로 학습 → 배포 때 무너짐 → 배포 가능 관측·Teacher-Student(9.14.6).
- 배포 관측 불일치. 학습과 다른 양·순서·정규화·단위 → 정책 오작동 → 정확히 정합(9.14.7).
- 저수준 정합 무시. 시뮬 게인·제어 주파수·액추에이터가 실로봇과 다름 → 전이 실패 → 정합·DR로 덮기.
- 곡선만 믿음. reward hacking·기행을 곡선이 못 보여줌 → play로 행동 검증(9.13·6.5).
- 랜덤화로 곡선 나빠짐을 버그로 오해. DR은 학습을 어렵게 함(정상) → 곡선이 아니라 전이가 목표.
- 시뮬 성공을 실로봇으로 단정. Sim2Real 갭 → 실로봇 검증·미세조정(10.7).
- 거대 정책 NN. 엣지 추론 고부하 → 작은 MLP·TensorRT(5.2·9.13).
- system identification 생략. DR 범위를 감으로 → 실측으로 안내가 이상(10.7).
9.14.11 연습문제
연습 1 (학습·곡선). 보행 정책 학습의 워크플로우를 단계로 설명하고, 학습 곡선(보상·에피소드 길이·엔트로피)을 어떻게 읽어 "안 오름·정체·붕괴"를 진단하는지, 왜 곡선만으로 부족한지 답하라.
정답
워크플로우: ① 태스크/환경 정의(씬·관측·행동·보상·종료, 9.13) + 환경 수 N. ② RL 라이브러리(rl_games/RSL-RL) + PPO config(LR·rollout·minibatch·γ·λ·엔트로피). ③ 도메인 랜덤화 설정(9.14.4). ④ headless GPU 병렬 학습(수천 환경, 수천만~수억 스텝). ⑤ TensorBoard로 곡선 모니터·체크포인트. ⑥ play로 행동 관찰. ⑦ 조정·반복. ⑧ 배포(TensorRT 5.2). 곡선 읽기: 보상(1순위) — 우상향=학습 중. 안 오름 → 보상 신호 약함(셰이핑)·탐험 부족(엔트로피↑)·물리 불안정(9.11)·LR 부적절. 정체 → 국소 최적·DR 과함·태스크 한계·하이퍼. 붕괴(올랐다 떨어짐) → 불안정(LR 큼·보상 스케일·발산)·정책 무너짐 → LR↓·보상 정규화. 에피소드 길이 — 생존(보행이면 안 넘어짐). 보상 높아도 짧으면(금방 넘어짐) 문제 → 길이+보상 함께. 엔트로피 — 탐험 정도. 너무 빨리 떨어지면 조기 수렴(국소). 곡선만으론 부족한 이유: 곡선(보상↑)이 좋아도 정책이 reward hacking(9.13·6.5) — 보상의 빈틈을 악용한 기행(미끄러지며 전진 점수·관절 진동)일 수 있다. 곡선은 "보상이 오르는지"만 보여주지 그 행동이 의도대로인지는 못 보여준다 → play 모드로 렌더하며 실제 행동을 눈으로 확인해야 한다. 또 DR을 켜면 곡선이 나빠 보여도(어려운 분포) 정상이며 전이엔 더 낫다 → 보기 좋은 곡선이 아니라 전이되는 정책이 목표. 철칙: 곡선↔play 교차 검증.
연습 2 (DR의 무엇·병렬). 도메인 랜덤화로 무엇을 흔드는지(제어 RL 기준) 범주별로 들고, 각 항목이 어떤 Sim2Real 갭을 좁히는지, 그리고 대규모 병렬(9.13)이 왜 랜덤화와 한 쌍인지 설명하라.
정답
무엇을(제어/RL — 동역학 중심): ① 물리·동역학 — 마찰계수(지면·발 접촉 갭), 질량·관성(적재·제작 편차), 드라이브 게인 stiffness/damping(액추에이터 비이상 9.11), 모터 강도·action delay(실액추에이터 지연). ② 센서·관측 — 관측 가우시안 노이즈(실센서 노이즈), 관측 지연·dropout(통신·처리 지연). ③ 외란 — 매 N스텝 랜덤 푸시/힘(외부 충격·균형 회복). ④ 지형·씬 — 지면 거칠기·경사·계단·장애물(환경 다양성). (비전 기반이면 시각: 조명·텍스처·카메라 — 9.12.) 각 항목이 좁히는 갭: 마찰/질량/게인 = 동역학 갭(시뮬 물리 ≠ 실물리)을 정책이 견디게. 노이즈/지연 = 센서·제어 갭. 외란 = 모델 안 한 교란에 강건. 지형 = 환경 일반화. 공통: 실로봇과 시뮬이 다른 지점(갭의 원천)을 무작위로 흔들어 정책이 그 변동을 견디게 → 실로봇도 "또 하나의 변형"처럼. 병렬과 한 쌍인 이유: 도메인 랜덤화는 정책이 분포 전체를 봐야 효과가 있다. 대규모 병렬(9.13)은 수천 환경이 각각 다른 물리(env 0: 마찰 0.6·질량 큼, env 1: 마찰 1.4·질량 작음…)를 동시에 시뮬하므로, 정책이 한 배치에 분포 전체를 한꺼번에 본다 — 랜덤화가 대규모에서도 거의 추가 비용이 들지 않는다. CPU 단일 환경이면 다른 물리를 시간순으로 하나씩 겪어야 해 비효율. 즉 병렬은 처리량(9.13)만이 아니라 랜덤화의 효율도 준다 — 수천 변형을 동시에 경험. 그래서 "GPU 병렬 + DR"이 Isaac Lab Sim2Real의 한 쌍. 정직: DR은 갭을 좁히되 없애진 못함(10.7).
연습 3 (얼마나·ADR). DR 범위가 너무 좁을 때와 너무 넓을 때 각각 무엇이 문제인지 설명하고, 적정 범위를 어떻게 정하며 ADR(자동 도메인 랜덤화)이 어떻게 돕는지 답하라.
정답
너무 좁게(약한 DR): 정책이 특정 시뮬 물리에 과적합 → 시뮬 보상은 높지만(곡선 예쁨) 실로봇의 (다른) 물리에서 무너짐(갭 안 닫힘). 약한 DR은 DR 없는 것과 비슷한 위험. 너무 넓게(강한 DR): ① 정책이 분포를 못 배움 — 너무 다양해 일관된 행동을 학습 못 함(수렴 실패·보상 정체) ② 배워도 지나치게 보수적 — 모든 극단적 경우에 안전하려다 느리고 소극적인 차선 정책 ③ 비현실적 물리(실제로 없는 마찰/질량)까지 포함해 쓸데없이 어려움. 적정 범위 정하기: 이상적으론 실로봇의 실제 파라미터 분포를 덮도록 — 실로봇의 마찰·질량·게인을 측정(system identification, 10.7) 해 그 불확실성 범위 + 여유. 측정 없이는 보수적으로 넓게 잡되 학습 가능한 한도에서. 즉 "현실의 불확실성은 덮되 학습 가능하고 과보수 아닌" 균형. ADR(자동 도메인 랜덤화): 범위를 고정하지 않고 점진 확대 — 처음엔 좁게(쉬움) 시작해 정책이 그 범위에서 잘하면 범위를 넓힌다(어려움). 정책 성능에 맞춰 랜덤화 난이도를 자동 조절(커리큘럼의 랜덤화판). 효과: ① 처음부터 넓은 범위로 학습 실패하는 것을 피함(쉬운 데서 시작) ② 정책이 강해질수록 점점 강건하게(범위 확대) ③ 수동 범위 튜닝 부담↓. OpenAI Dactyl(손 조작)이 ADR로 강건성을 얻은 발표 사례. 지형·명령도 쉬운→어려운 커리큘럼과 같은 정신. 정직: ADR·적정 범위도 Sim2Real을 좁히되 보장 못 함 — system identification(실측)·실로봇 미세조정(10.7)과 함께. "DR만 키우면 다 된다"는 환상이고, 과한 DR은 과보수 정책을 낳는다.
연습 4 (관측 설계·Teacher-Student). "관측에 특권 정보를 넣으면 안 된다"는 말의 의미와 이유를 설명하고, 그럼에도 특권 정보의 학습 이점을 살리는 Teacher-Student(특권 학습)가 어떻게 동작하는지 답하라.
정답
특권 정보 금지의 의미·이유: 특권 정보(privileged information)는 시뮬에선 알지만 실로봇에선 못 얻는 것 — 정확한 지면 마찰계수, 실제 질량, 지형 높이맵, 전역 위치, 미래 상태 등. 정책의 관측에 이를 넣어 학습하면, 정책이 그 입력에 의존해 행동을 정한다. 그런데 배포(실로봇) 때는 그 입력을 구성할 수 없으므로(센서로 못 얻음) 정책이 잘못된/없는 입력을 받아 무너진다. 그래서 학습 관측은 실로봇 센서로 실제 얻을 수 있는 것(관절각·속도=엔코더, IMU, 명령, 이전 행동)으로 한정해야 전이된다 — 이것이 DR보다 먼저인 전제(특권 정보가 있으면 DR도 무의미). Teacher-Student(특권 학습)의 동작: 문제는 특권 정보가 있으면 학습이 훨씬 쉽다(예: 지형 높이맵을 알면 거친 지형 보행을 쉽게 배움). 이 이점을 버리지 않으려고 두 단계: ① Teacher — 시뮬에서 특권 정보까지 보고(지형·정확한 물리) 잘하는 정책을 학습. 특권 정보 덕에 어려운 태스크도 학습 성공. ② Student — 배포 가능한 관측(엔코더·IMU만)으로 Teacher의 행동을 모방(증류, distillation). Student는 특권 정보 없이, 관측 이력(과거 몇 스텝)으로 숨은 상태(지형·물리)를 암묵 추정하며 Teacher를 따라함. 배포는 Student(특권 정보 불필요). 변형: asymmetric actor-critic — critic(가치 함수, 학습 때만 씀)은 특권 정보를 보고 actor(정책, 배포됨)는 배포 관측만 → 학습은 특권 정보로 안정적, 배포는 관측만. ETH의 거친 지형 사족 보행이 이 기법의 유명 사례(발표 기준). 요지: 관측 설계(특권 정보 금지)는 전이의 전제이고, Teacher-Student는 특권 정보의 학습 이점과 배포 제약을 둘 다 만족시키는 다리 — 어려운 로코모션·매니퓰레이션의 표준. DR과 함께 쓴다.
연습 5 (배포·전체 루프). 학습된 정책을 Jetson에 배포하는 흐름을 단계로 설명하고, "관측 정합"과 "저수준 정합"이 왜 전이의 생명인지, 실로봇 실패가 어떻게 학습으로 환류되는지(플라이휠) 답하라.
정답
배포 흐름: ① 정책 export — 학습된 정책 NN(작은 MLP)을 ONNX로 export(정책만, 가치 함수·학습 코드 제외). ② TensorRT 엔진 — trtexec로 ONNX→.plan(FP16 등, 5.2), Jetson 타깃에서 빌드(9.2). ③ 엣지 제어 루프(Jetson 9.1): 반복 — 로봇 상태 읽기(엔코더·IMU·명령) → 학습 때와 같은 관측 구성·정규화 → TensorRT 추론(action) → 모터에 적용(관절 목표). 작은 MLP라 추론 수십 µs~ → 고주파 제어(50~1000Hz) 실시간. 관측 정합이 생명: 정책은 학습 때 본 특정 관측 형식(양·순서·정규화·단위·이전 행동 포함 여부)에 맞춰 행동을 배웠다. 배포 시 관측을 정확히 같은 방식으로 구성·정규화해야 정책이 의미 있는 입력을 받는다 — 하나라도 다르면(순서 바뀜·정규화 누락·단위 차이) 정책이 잘못된 입력에 잘못된 출력 → 무너짐. 그리고 관측은 특권 정보 없이(9.14.6) 실로봇에서 구성 가능해야. 저수준 정합이 생명: 시뮬의 드라이브 게인·제어 주파수·액추에이터 모델(9.11)이 실로봇과 다르면, 같은 action이 다른 움직임을 내 전이 실패. DR이 이 불확실성을 덮지만, 기본 정합(게인·주파수 맞추기)도 필요. 플라이휠(9.12·8.14): 실로봇서 실패하면(특정 지형·속도서 넘어짐) → ① 그 실패 조건을 DR 범위에 추가하거나 ② system identification(10.7) 으로 실로봇 파라미터를 측정해 시뮬을 보정하거나 ③ 실로봇 데이터로 미세조정(10.7) → 재학습 → 재배포 → 재검증. 즉 "학습→배포→실패→환류→재학습"의 루프. 시뮬이 학습·검증을 모두 담당하니 빠른 반복. 정직: 한 번에 완벽 전이는 드물다 — DR·관측/저수준 정합·플라이휠·실로봇 검증이 함께여야(10.7). 추론은 경량이지만(작은 NN, 9.13) 전이는 별개 문제. 핵심: 학습은 거대 병렬(데이터센터), 추론은 경량(엣지, 0.1), 전이는 정합+DR+반복.
9.14.12 요약 · 다음 장
- 학습 워크플로우: 환경·PPO·DR 설정 → headless 병렬 학습(9.13) → 곡선 모니터 → play로 행동 검증(reward hacking) → 배포. 상태 RL은 렌더 끄고 N 최대.
- 곡선 읽기: 보상(우상향?)·에피소드 길이(생존?)·엔트로피(탐험?)로 진단. 곡선↔play 교차 필수(곡선만 믿지 마라). DR로 곡선 나빠짐은 정상(전이가 목표).
- 도메인 랜덤화: 갭의 원천(마찰·질량·게인·지연·노이즈·외란·지형)을 흔들어 분포에 강건. 병렬과 한 쌍(수천 환경이 다른 물리 동시). "얼마나" 가 기술 — 과적합↔학습 불가, ADR(점진)·sysID(실측 10.7)로 안내.
- 전이 기법 더: 관측 설계(특권 정보 금지 = 전이 전제)·Teacher-Student(특권 Teacher→배포 Student 증류, 거친 지형 보행 표준). DR·관측·Teacher-Student·sysID는 한 팀.
- 배포: 정책 → ONNX → TensorRT(5.2) → Jetson(9.1). 관측·저수준 정합이 전이의 생명. 추론은 작은 MLP(0.1 학습=거대/추론=경량). 정직: DR은 갭을 좁히되 보장 못 함 — 실로봇 검증·미세조정(10.7), 기법은 학계 공통.
제9부 로보틱스(9.1~9.14) 완료 — Jetson(9.1~9.4)·DeepStream/VPI(9.5·9.6)·Isaac ROS(9.7·9.8)·인지/매니퓰레이션(9.9·9.10)·Isaac Sim(9.11·9.12)·Isaac Lab(9.13·9.14).
다음 장: 10.1 Omniverse I — Kit·확장·앱. Isaac Sim·Lab이 무엇 위에 서 있나(9.11.3)를 미뤄뒀다 — 이제 그 토대인 Omniverse 플랫폼으로 간다. 앱 프레임워크 Kit와 확장(extension) 구조, Omniverse가 어떻게 USD·RTX·PhysX를 묶어 Isaac Sim 같은 앱과 디지털트윈(10.8)을 만드는지. 로보틱스에서 플랫폼·시뮬레이션 기반으로.