Sim-to-Real Transfer란?
강화학습(Reinforcement Learning)은 에이전트가 환경과 상호작용하며 최적의 정책을 학습하는 방법입니다. 그런데 실제 로봇으로 수만 번의 시행착오를 반복하는 것은 시간, 비용, 안전 측면에서 현실적이지 않습니다.
이 문제를 해결하는 접근법이 바로 Sim-to-Real Transfer입니다. 시뮬레이션 환경에서 충분히 훈련한 뒤, 학습된 정책을 실제 로봇에 그대로 이식하는 기술입니다.
핵심 아이디어: 시뮬레이션은 빠르고 저렴하며 안전하다. 여기서 학습한 정책이 현실에서도 작동하게 만드는 것이 Sim-to-Real의 목표다.
왜 Sim-to-Real이 어려운가?
시뮬레이션과 현실 사이에는 Reality Gap이 존재합니다. 주요 차이점은 다음과 같습니다.
| 요소 | 시뮬레이션 | 현실 |
|---|---|---|
| 물리 엔진 | 근사적 계산 (이상적 조건) | 복잡한 접촉, 마찰, 변형 |
| 센서 | 노이즈 없는 깨끗한 데이터 | 노이즈, 지연, 캘리브레이션 오차 |
| 시각 정보 | 렌더링된 이미지 | 조명 변화, 반사, 가림 현상 |
| 액추에이터 | 즉각적이고 정확한 반응 | 지연, 백래시, 토크 한계 |
이 격차를 줄이기 위해 크게 세 가지 핵심 기법이 사용됩니다.
핵심 기법 1: Domain Randomization
Domain Randomization(DR)은 시뮬레이션 환경의 파라미터를 매 에피소드마다 무작위로 변경하는 방법입니다. 에이전트가 다양한 조건에서 훈련되면, 현실 세계도 그 분포 안에 포함될 가능성이 높아집니다.
랜덤화 대상
- 물리 파라미터: 질량, 마찰 계수, 관성 모멘트, 감쇠 계수
- 시각 파라미터: 조명 위치/강도, 텍스처, 카메라 시점, 배경
- 동역학 파라미터: 액추에이터 지연, 제어 주기, 노이즈 수준
import numpy as np
def randomize_physics(env):
"""물리 파라미터를 에피소드마다 랜덤화"""
env.set_friction(np.random.uniform(0.3, 1.2))
env.set_mass_scale(np.random.uniform(0.8, 1.2))
env.set_gravity(np.array([
np.random.uniform(-0.1, 0.1),
np.random.uniform(-0.1, 0.1),
np.random.uniform(-10.0, -9.6)
]))
env.set_actuator_delay(np.random.randint(0, 3)) # 0~2 스텝 지연
return env
실무 팁: 랜덤화 범위를 너무 넓게 잡으면 학습이 수렴하지 않고, 너무 좁으면 전이 성능이 떨어집니다. 현실 파라미터의 ±20~50% 범위에서 시작하여 점진적으로 조절하는 것이 좋습니다.
핵심 기법 2: System Identification
System Identification(SysID)은 DR과 반대 방향의 접근입니다. 현실 시스템의 물리 파라미터를 정밀하게 측정하고 시뮬레이션에 반영하여 격차 자체를 줄이는 방법입니다.
측정 항목과 방법
| 파라미터 | 측정 방법 | 도구 |
|---|---|---|
| 질량/관성 | CAD 모델 또는 직접 측정 | 저울, CAD 소프트웨어 |
| 마찰 계수 | 경사면 실험, 힘 센서 | 6축 Force/Torque 센서 |
| 모터 특성 | 스텝 응답 분석 | 오실로스코프, 데이터 로거 |
| 센서 노이즈 | 정적 상태 데이터 수집 | 통계 분석 (분산, 바이어스) |
DR vs SysID 비교
| 항목 | Domain Randomization | System Identification |
|---|---|---|
| 접근 방식 | 파라미터를 넓게 랜덤화 | 파라미터를 정확히 맞춤 |
| 장점 | 측정 불필요, 강건한 정책 | 높은 전이 성능 |
| 단점 | 보수적 정책, 성능 저하 가능 | 측정 비용, 오차에 취약 |
| 적합한 상황 | 파라미터 측정이 어려울 때 | 정밀 제어가 필요할 때 |
실무에서는 두 방법을 결합하는 것이 일반적입니다. SysID로 대략적인 파라미터를 맞추고, 그 주변에서 DR을 적용하는 방식입니다.
핵심 기법 3: Isaac Gym 실전 예제
NVIDIA Isaac Gym은 GPU 가속 물리 시뮬레이션을 제공하여 수천 개의 환경을 동시에 실행할 수 있는 플랫폼입니다. Sim-to-Real 연구에서 가장 널리 쓰이는 도구 중 하나입니다.
Isaac Gym의 장점
- GPU 병렬화: 수천 개 환경을 하나의 GPU에서 동시 실행
- 텐서 기반 API: PyTorch와 직접 연동하여 데이터 복사 최소화
- 내장 DR: 물리 파라미터 랜덤화 기능 기본 제공
from isaacgym import gymapi, gymtorch
import torch
def create_sim_with_dr(gym, num_envs=4096):
"""Domain Randomization이 적용된 Isaac Gym 환경 생성"""
sim_params = gymapi.SimParams()
sim_params.physx.num_threads = 4
sim_params.physx.solver_type = 1 # TGS solver
sim_params.use_gpu_pipeline = True
sim = gym.create_sim(0, 0, gymapi.SIM_PHYSX, sim_params)
# 환경별 물리 파라미터 랜덤화
friction_coeffs = torch.FloatTensor(num_envs).uniform_(0.4, 1.0).cuda()
mass_scales = torch.FloatTensor(num_envs).uniform_(0.85, 1.15).cuda()
return sim, friction_coeffs, mass_scales
실전 워크플로우
- 환경 구성: URDF/MJCF로 로봇 모델 로드
- 보상 함수 설계: 태스크 목표에 맞는 보상 정의
- DR 설정: 랜덤화할 파라미터와 범위 지정
- 대규모 병렬 학습: PPO 등 on-policy 알고리즘으로 훈련
- 정책 추출: 학습된 신경망을 ONNX/TorchScript로 변환
- 실제 로봇 배포: ROS 등을 통해 실시간 추론
주의: Isaac Gym은 2024년 이후 Isaac Lab(이전 Isaac Orbit)으로 통합되는 추세입니다. 신규 프로젝트는 Isaac Lab 기반으로 시작하는 것을 권장합니다.
성공적인 Sim-to-Real을 위한 체크리스트
- 관측 공간 설계: 시뮬레이션에서만 가능한 정보(ground truth)를 제외하고, 실제 센서로 얻을 수 있는 데이터만 사용
- 행동 공간 설계: 토크 직접 제어보다 위치/속도 제어가 전이 성공률이 높음
- 정책 아키텍처: 과도하게 큰 네트워크보다 적절한 크기의 MLP가 현실에서 더 안정적
- 안전 제약: 관절 한계, 토크 한계, 자기 충돌 방지를 시뮬레이션에서부터 적용
- 점진적 배포: 시뮬레이션 → 느린 속도 테스트 → 정상 속도 순으로 배포
마무리
Sim-to-Real Transfer는 강화학습을 실제 로봇에 적용하기 위한 핵심 기술입니다. 정리하면 다음과 같습니다.
- Domain Randomization: 시뮬레이션 파라미터를 무작위화하여 강건한 정책을 학습하는 방법. 측정 없이 적용 가능하지만 성능이 보수적일 수 있음
- System Identification: 현실 파라미터를 정밀 측정하여 시뮬레이션 격차를 줄이는 방법. 높은 성능을 달성하지만 측정 비용이 발생
- Isaac Gym: GPU 병렬 시뮬레이션으로 대규모 DR 훈련을 가능하게 하는 실전 도구
실무에서는 SysID로 기본 파라미터를 맞추고, 그 위에 DR을 적용하는 하이브리드 접근이 가장 효과적입니다. 시뮬레이션에서 충분히 검증한 뒤 단계적으로 실제 로봇에 배포하는 것이 안전하고 효율적인 전략입니다.
이 글이 도움이 되셨나요?
Buy me a coffee
답글 남기기