상태: 초안 (2026-10-18), 실측. 숫자는 노트북(Apple M1 Max, macOS 26.5)의 Python 3.9.6·numpy 2.0.2 로 직접 계산한 시뮬레이션 값입니다. 이 글의 「실물」은 물리 상수를 바꾼 또 하나의 시뮬레이터이며 실제 로봇이 아닙니다(하드웨어 미실측). 원자료와 코드: 작업 디렉터리
measure/robot-arm-basics/rl/의ttenv.py,ppo.py,exp_rl.py(그룹sim2real), 결과out/rl/s2r_*_s{0,1,2}.json. 참고 자료는 2026-10-18 에 열람했습니다. 작성 규칙: 실측 데이터가 기본이고, 못 잰 것은 「미실측」, 확인하지 못한 것은 「미확인」으로 표시합니다.
목차
1. 직관: 시뮬레이터의 빈틈을 배운다
강화학습 정책은 보상을 올리는 모든 틈을 찾습니다(13편). 시뮬레이터 안에서 그 틈에는 시뮬레이터가 틀린 부분도 들어 있습니다. 라켓 반발이 실제보다 조금 세다면, 정책은 그 센 반발에 맞춰 살살 치는 법을 배웁니다. 실물에서는 공이 네트에 걸립니다.
1~10편이 보여 준 대로 탁구의 물리 상수는 불확실합니다. 문헌의 Magnus 계수는 7배 넘게 벌어져 있고(6편), 반발 계수 0.05 의 차이가 착지점 13 cm 였으며(7편), 카메라와 제어기의 지연은 수십~100 ms 였습니다(1편). 시뮬레이션에서 실물로 가는 문제(sim-to-real, sim2real)를 다루는 방법은 크게 네 가지입니다.
| 방법 | 생각 | 대가 |
|---|---|---|
| 도메인 랜덤화(domain randomization) | 상수를 에피소드마다 흔들어, 어떤 값에서도 되는 정책을 배운다 | 더 어려운 문제가 되어 더 많이 배워야 한다 |
| 지연·잡음 모델링 | 실제 시스템의 지연과 잡음을 시뮬레이터에 넣는다 | 실제 지연을 재야 한다 |
| 시스템 식별(system identification, real2sim) | 실물에서 상수를 재서 시뮬레이터에 넣는다 | 잴 수 없는 것(회전 효과 등)은 남는다 |
| 대량 병렬 시뮬레이션 | 위 세 가지가 늘리는 학습량을 계산으로 감당한다 | GPU·CPU 자원 |
2. 실제 탁구 로봇이 한 일
- 지연은 재서 넣어야 하고, 틀리면 무너집니다. D'Ambrosio 외 2023 은 시뮬레이션 지연을 하드웨어에서 잰 값으로 두었을 때 실물 전이 점수가 평균 1.83(만점 2.0) 이었고, 50% 로 줄이면 1.33 으로 떨어졌으며, 0%·20%·150% 에서는 매우 나빴다고 보고했습니다(III-A2 절, 그림 4). 실물에서 관측 지연을 일부러 늘리자 150 ms 에서 성능이 급락했습니다(III-B 절).
- 반발 계수를 랜덤화하지 않으면 14% 떨어졌습니다. 같은 논문은 탁구대 반발 계수의 랜덤화를 빼면 성능이 14% 줄고, 공 반발 계수를 2% 올리면 25%, 탁구대 반발을 8% 올리면 36% 줄었다고 적었습니다(III-A5 절). 재미있게도 잰 반발 계수가 튜닝한 값보다 나빴는데, 저자들은 시뮬레이터가 회전을 제대로 모델링하지 못해 튜닝 값이 그것을 메웠을 것으로 봅니다.
- D'Ambrosio 외 2024 는 관측 잡음과 지연을 랜덤화하고, 탁구대·라켓의 감쇠와 마찰을 랜덤화하고, 구동기·관절마다 시스템 식별을 했습니다. 실물에서 탑스핀 공에 약한 문제는 2.8k 파라미터짜리 얇은 FiLM 어댑터를 덧붙여 고쳤고, 랠리를 짧은 구간으로 나눠 매번 로봇 상태를 초기화하는 것이 실물 전이에 결정적이었다고 적었습니다(II-E1·II-E2·II-E4 절). 기본 정책은 병렬 시뮬레이션 워커 6,000개로 약 24억 걸음을 학습했습니다(II-C 절).
- 랜덤화의 원조. Tobin 외 2017 은 렌더링 질감을 무작위로 바꿔 시뮬레이션만으로 학습한 물체 위치 검출기가 실물에서 1.5 cm 정확도를 냈다고 보고했고, Peng 외 2017 은 동역학 상수를 랜덤화해 실물 학습 없이 로봇 팔로 물체를 미는 정책을 옮겼습니다(두 논문 모두 초록).
3. 실측: 진자 라켓의 「실물」
3.1 설정
「실물」은 다음 다섯 가지를 바꾼 시뮬레이터입니다. 각 숫자는 1~10편에서 본 불확실성의 크기에 맞춰 골랐습니다.
| 항목 | 명목 시뮬레이션 | 「실물」 | 근거 |
|---|---|---|---|
| 라켓 반발 e_r | 0.80 | 0.72 | 10편의 모델 오차 실험과 같은 값 |
| 관측 지연 | 0 | 20 ms(2걸음) | 1편: 실제 시스템의 지연은 수십 ms |
| 공 위치 잡음 | 0 | σ 5 mm(속도 잡음은 그에 비례) | 2·6편의 보정·관측 잡음 크기 |
| 항력 | ×1.0 | ×1.1 | 6편: 문헌 C_D 0.37~0.55 |
| Magnus | ×1.0 | ×1.5 | 6편: 문헌값이 7배 넘게 벌어짐 |
학습 분포는 네 가지입니다. 모두 직접 제어, 형태 보상, PPO 기본 설정, 공 19,200개, 시드 3개이고, 평가는 학습에 쓰지 않은 공 1,000개로 명목 시뮬레이션과 「실물」에서 각각 합니다.
| 학습 분포 | 반발 | 지연(걸음) | 잡음 | 항력 배수 | Magnus 배수 |
|---|---|---|---|---|---|
| 랜덤화 없음 | 0.80 | 0 | 0 | 1.0 | 1.0 |
| 좁은 랜덤화 | 0.75~0.85 | 0~1 | 0~3 mm | 0.95~1.05 | 0.8~1.2 |
| 넓은 랜덤화 | 0.65~0.90 | 0~3 | 0~8 mm | 0.9~1.2 | 0.5~2.0 |
| 식별한 값 그대로 | 0.72 | 2 | 5 mm | 1.1 | 1.5 |
좁은 랜덤화는 「실물」을 포함하지 않습니다(반발 0.72 는 범위 밖, 지연 2걸음도 밖). 넓은 랜덤화는 포함합니다. 마지막 줄은 시스템 식별이 완벽하게 성공한 경우입니다.
3.2 결과
| 학습 분포 | 명목 시뮬레이션 | 「실물」 중앙(최소~최대) | 차이(중앙) |
|---|---|---|---|
| 랜덤화 없음 | 82.9% | 72.7% (62.9~80.0) | −10.2%p |
| 좁은 랜덤화 | 91.2% | 79.5% (70.8~85.2) | −11.7%p |
| 넓은 랜덤화 | 57.4% | 54.7% (52.6~75.4) | −2.7%p |
| 식별한 값 그대로 | 79.3% | 74.4% (64.2~80.4) | −4.9%p |
3.3 읽은 것
- 랜덤화 없이 배운 정책은 「실물」에서 10%p 를 잃었습니다. 반발·지연·잡음·공기 효과가 조금씩 다른 것만으로 생긴 차이입니다. 라켓에 맞힌 비율도 76~83% 로 명목 시뮬레이션(88~94%)보다 낮았습니다. 지연 20 ms 동안 공은 6 cm 쯤 움직이므로 타이밍이 어긋납니다.
- 좁은 랜덤화가 「실물」에서 가장 좋았습니다(79.5%). 「실물」을 범위에 넣지도 않았는데 그렇습니다. 상수가 조금씩 흔들리는 세상에서 배우는 것만으로 정책이 특정 값에 과하게 맞추지 않게 되었다고 봅니다. 명목 시뮬레이션 성적(91%)도 랜덤화 없음(83%)보다 높았는데, 시드 3개라 이 차이는 확실하지 않습니다.
- 넓은 랜덤화는 차이를 3%p 로 줄였지만, 같은 학습량에서 덜 배웠습니다. 시뮬레이션과 「실물」 모두 55% 안팎이었고, 학습 곡선이 300번 반복 끝까지 천천히 오르고 있었습니다(한 시드는 82%·75% 까지). 랜덤화가 넓을수록 문제가 어려워져 더 많은 표본이 필요합니다. 대량 병렬 시뮬레이션이 sim2real 과 짝을 이루는 이유입니다.
- 완벽한 시스템 식별(74.4%)이 좁은 랜덤화(79.5%)보다 낮았습니다. 「실물」 값 그대로 학습하면 지연 20 ms 와 잡음 5 mm 가 처음부터 있어 학습이 더 어려웠고, 같은 예산에서 덜 배웠습니다. 식별은 출발점을 맞추고, 랜덤화는 남은 불확실성을 견디게 한다고 나누어 생각하면 됩니다. 실제로는 둘을 함께 씁니다(식별한 값을 가운데 두고 좁게 랜덤화).
3.4 관측을 바꾸는 길
랜덤화는 「모르는 것을 견디는」 방법입니다. 「모르는 것을 알아내는」 방법도 있습니다. 같은 프로젝트에서 따로 진행한 MuJoCo 시뮬레이터 실험은, 고전 계획기가 공 궤적만으로 회전을 맞출 때보다 「탑·백·무회전」의 회전 종류를 미리 알고 그 종류의 평균 회전을 사전 정보로 넣을 때 반환률이 조건에 따라 7~19%p 높았다고 보고합니다(예: 결정 시점이 타격 300 ms 전이고 회전이 데이터셋 그대로일 때 77% → 94%). 회전 종류는 상대의 자세나 타구음처럼 공이 날기 전의 신호로 알아낼 수 있습니다. D'Ambrosio 외 2024 도 강한 회전을 정확히 읽지 못하는 것을 한계로 적고, 상대들이 그 점을 파고들었다고 썼습니다(V 절 5항). 정책이 보는 것을 늘리는 것이 랜덤화를 넓히는 것보다 값싼 경우가 있습니다.
4. 한계
- 「실물」도 같은 방정식의 시뮬레이터입니다. 실제 로봇과의 차이는 상수뿐 아니라 모델의 꼴(러버의 회전 전달, 감속기의 백래시, 카메라의 누락 프레임)에도 있습니다(미실측).
- 학습량을 모든 설정에서 같게(공 19,200개) 두었습니다. 넓은 랜덤화를 더 오래 학습하면 결과가 달라질 수 있습니다(미실측).
- 시드 3개라 설정 사이의 차이 대부분이 범위 안에서 겹칩니다(15편).
- 3.4 절의 회전 종류 실험은 다른 작업의 결과를 옮긴 것이고, 이 글의 진자 라켓 문제로는 재지 않았습니다.
5. 정리
- 시뮬레이터가 틀린 만큼 정책도 틀립니다. 상수 다섯 개를 조금씩 바꾼 「실물」에서 랜덤화 없는 정책은 10%p 를 잃었습니다.
- 좁은 랜덤화가 이 예산에서는 가장 좋았습니다. 넓은 랜덤화는 차이를 줄이지만 더 많은 학습이 필요합니다.
- 시스템 식별은 출발점을 맞추고, 랜덤화는 남은 불확실성을 견디게 합니다. 둘을 함께 씁니다.
- 지연은 반드시 재서 넣습니다. Google 의 실험에서 지연을 절반으로만 잘못 넣어도 점수가 1.83 에서 1.33 으로 떨어졌습니다.
- 다음 단계는 같은 프로젝트에서 진행 중인 MuJoCo 탁구 팔 강화학습입니다. 그 결과가 나오면 이 시리즈에서 「실제 학습 결과」 편으로 이어 쓰겠습니다.
티티 한마디. 시뮬레이터만 믿으면 진짜 탁구대에서 공이 네트에 걸려요. 물리를 조금씩 흔들어 가며 연습하면 처음 보는 탁구대에서도 덜 당황해요!
참고
모든 자료는 2026-10-18 에 열람했습니다.
- D'Ambrosio 외, Robotic Table Tennis: A Case Study into a High Speed Learning System, arXiv:2309.03315, III-A2·III-A5·III-B 절, 그림 4.
- D'Ambrosio 외, Achieving Human Level Competitive Robot Table Tennis, arXiv:2408.03906, II-C·II-E 절, V 절(한계).
- Tobin 외, Domain Randomization for Transferring Deep Neural Networks from Simulation to the Real World, arXiv:1703.06907, 초록.
- Peng, Andrychowicz, Zaremba, Abbeel, Sim-to-Real Transfer of Robotic Control with Dynamics Randomization, arXiv:1710.06537, 초록.
- Rudin 외, arXiv:2109.11978, 초록.