상태: 초안 (2026-10-18), 실측. 화면과 글의 숫자는 모두 시뮬레이터 안의 값이고, 카메라 주기·지연·잡음은 가정값입니다. 이 글의 로봇은 학습하지 않은 고전 계획기로 움직입니다. 평가는 7편과 같은 평가 공 500개(seed 0)와 같은 세 조건(참 상태, 120 Hz·지연 30 ms, 120 Hz·지연 100 ms)으로 했습니다. 괄호 안은 95% 구간의 반폭입니다. 로봇 모델은 MuJoCo Menagerie 의
unitree_g1(Unitree 공식g1_29dof_rev_1_0, BSD-3-Clause) 이고, 원본 파일은 고치지 않았습니다. 관절 속도 한계는 모델에 없어서 Unitree 공식 URDF 값을 썼습니다. 영상은 2026-10-18 에 홈랩 쿠버네티스의 미니 PC 노드 한 대에서 임시 파드로 렌더링했습니다(CPU 만, 최고 메모리 1.55 GiB). 판은 MuJoCo 3.16.0, Python 3.12.15, numpy 2.5.4, Mesa 25.0.7(OSMesa) 이고, 인코딩은 ffmpeg 9.0.2(libx264) 입니다.
목차
- 1. 왜 사람 모양인가
- 2. 영상으로 먼저 보기
- 3. 로봇과 계획기
- 4. 결과: 평가 공 500개
- 5. 좌우 축은 얼마나 빨라야 하나
- 6. 라켓은 얼마나 빨리 휘두를 수 있나
- 7. GPU 에서 빨리 돌리기
- 8. 다음: 학습, 그리고 로봇끼리의 경기
- 미실측과 한계
1. 왜 사람 모양인가
5편부터 9편까지의 로봇은 탁자 끝에 붙은 갠트리 2축과 손목 2축이었습니다. 공을 받는 데는 가장 쉬운 모양입니다. 하지만 이 실험실의 다음 목표는 로봇끼리 경기를 시켜 더 강한 로봇을 만드는 것이고, 그 경기가 사람의 탁구와 비슷해 보이려면 로봇도 사람처럼 생겨야 합니다.
그래서 널리 쓰이는 사람 모양 로봇 Unitree G1 의 상체를 골랐습니다. 다리 대신 좌우로 미끄러지는 축 하나를 달았습니다. 탁구 선수가 옆걸음으로 공 쪽으로 가는 움직임을 대신하는 축입니다.
조건을 하나 더 걸었습니다. 로봇이 사람보다 빠르게 움직이면 안 됩니다. 로봇 관절은 사람보다 몇 배 빠를 수 있지만, 그 속도로 이긴 로봇은 「사람처럼 치는 로봇」이 아닙니다. 관절 각속도, 좌우 이동 속도와 가속도, 라켓 속도에 문헌의 사람 상한을 걸고, 로봇 한계와 사람 한계 중 작은 쪽을 썼습니다.
2. 영상으로 먼저 보기
2.1 공 하나를 옆 뒤에서
상대 쪽 끝선에서 날아온 공을 로봇이 좌우 축으로 0.37 m 옮겨 가 0.789 s 에 맞혔습니다. 맞힌 순간 라켓 속도는 1.27 m/s 입니다. 주황 점은 지나온 공의 경로입니다. 몸통이 공을 따라 돌고, 팔꿈치와 손목이 라켓 면을 세우는 모습이 보입니다.
2.2 같은 공을 위에서
위에서 보면 로봇이 공이 올 자리로 미리 옮겨 가 있는 것이 잘 보입니다. 이 「미리 옮겨 가기」가 이 글에서 가장 큰 차이를 만든 동작입니다(4절).
2.3 서로 다른 공 네 개
좌우 축이 오른쪽(+)으로 크게 움직인 공, 왼쪽(−)으로 0.82 m 움직인 공, 가운데 공, 짧게 튄 공을 차례로 이었습니다. 네 공 모두 반환에 성공했습니다. 공은 처음 80개 가운데 성공한 공에서 좌우 축 이동이 큰 순서로 골랐고, 고른 규칙과 결과는 렌더링 스크립트가 파일로 남깁니다.
3. 로봇과 계획기
| 항목 | 값 |
|---|---|
| 팔 | 7축(어깨 3, 팔꿈치 1, 손목 3) |
| 허리 | 3축(yaw, roll, pitch) |
| 좌우 축 | 이동 범위 ±0.9 m, 속도 1.5 m/s, 가속도 10 m/s² |
| 골반 위치 | 끝선 뒤 48 cm(28–68 cm 를 훑어 고름, 차이는 표본 오차 안) |
| 질량 | 모델 33.3 kg(공식 사양 약 35 kg) |
| 계획기 | 7편 「하이브리드 명목」과 같은 구조: 공 예측 → 칠 시각·위치·면·속도 결정 → 역기구학 → 관절 궤적, 학습 없음 |
계획기는 갠트리와 같은 공 예측과 타격 결정을 쓰고, 마지막 단계만 G1 의 관절 11개(좌우 축 포함)에 대한 역기구학으로 바꿨습니다. 다시 계획할 때는 지난 자세에서 출발하도록 했는데, 학습용 공에서 참 상태 성공률이 88.5% 에서 94.0% 로 올랐습니다.
3.1 사람 한계
| 관절 | 로봇 한계(URDF, rad/s) | 사람 상한(rad/s) |
|---|---|---|
| 허리 yaw | 32 | 10.1 |
| 허리 roll·pitch | 37 | 10.1(몸통 회전값을 대신 씀, 추정) |
| 어깨 pitch / roll / yaw | 37 | 13.8 / 4.8 / 16.7 |
| 팔꿈치 | 37 | 5.7 |
| 손목 roll / pitch / yaw | 37 / 22 / 22 | 18.3 / 9.3 / 3.9 |
- 좌우 이동 상한은 2.2 m/s, 가속도 상한은 10 m/s² 입니다. 비장애인 탁구 선수의 옆걸음 측정값은 찾지 못했습니다. 그래서 속도는 장애인 탁구 국가대표의 무게중심 좌우 속도 범위(양방향 4.35 m/s)의 절반으로 추정했고, 가속도는 테니스 측정값을 빌렸습니다.
- 라켓 속도 상한은 19.6 m/s 입니다. 평가 내내 한 번도 걸리지 않았습니다. 관절 상한만으로도 라켓이 사람 최대 속도 아래에 머뭅니다.
- 상한값과 출처는 설정 파일 하나에 모았습니다. 한계에 걸려 잘린 비율은 학습 로그에 따로 셉니다.
4. 결과: 평가 공 500개
| 구성 | 참 상태 | 120 Hz·30 ms | 120 Hz·100 ms |
|---|---|---|---|
| 팔 7축 · 허리 사용 · 좌우 축(기본) | 91.4% (±2.5) | 72.0% (±3.9) | 27.4% (±3.9) |
| 같은 구성, 사람 한계 없음 | 92.4% | 74.4% | 27.2% |
| 팔 7축 · 허리 잠금 · 좌우 축 | 83.8% | 67.8% | 26.6% |
| 팔 5축 · 허리 사용 · 좌우 축 | 83.4% | 70.2% | 25.6% |
| 팔 7축 · 허리 사용 · 좌우 축 없음 | 66.4% | 60.4% | 26.6% |
| 팔 5축 · 허리 잠금 · 좌우 축 없음 | 40.4% | 31.6% | 12.8% |
| 갠트리 고전 기준선(5편) | 61.6% | 59.2% | 26.6% |
| 갠트리 하이브리드 명목(7편, 계획 구조가 같음) | 83.2% | 80.6% | 53.6% |
| 갠트리 학습한 하이브리드(7편, 3시드) | 84.8% | 83.8% | 58.2% |
세 가지가 보입니다.
- 좌우 축이 가장 큰 차이를 냅니다. 좌우 축을 빼면 참 상태에서 「닿지 않는 공」이 4.6% 에서 23.8% 로 늘고 성공률이 91.4% 에서 66.4% 로 떨어집니다. 팔이 아무리 길어도 탁자 폭 1.525 m 를 제자리에서 다 덮지 못합니다. 사람이 옆걸음을 하는 이유와 같습니다.
- 사람 한계의 비용은 생각보다 작습니다. 같은 공을 한계 전·후로 짝지어 비교하면 기본 구성에서 놓친 공은 2.0–8.2% 입니다. 허리를 잠그면 7.6–14.4% 로 커집니다. 팔만으로 빠르게 휘둘러야 하기 때문입니다.
- 지연이 길면 갠트리보다 약합니다. 지연 100 ms 에서 기본 구성은 27.4% 로, 같은 구조의 갠트리(53.6%)의 절반입니다. 공 500개 가운데 45.4% 가 「타이밍·예측」으로 실패했습니다(실패의 63%). 무거운 몸통과 좌우 축이 늦은 계획 수정을 따라가지 못합니다. 학습으로 가장 먼저 고칠 곳입니다.
4.1 실패를 원인별로 나누면
기본 구성, 사람 한계 적용, 500개 대비 비율입니다. 공 하나에 원인 하나만 셉니다.
| 조건 | 닿지 않음 | 관절 한계(로봇) | 관절 한계(사람) | 자세(면 방향) | 타이밍·예측 | 실패 합계 |
|---|---|---|---|---|---|---|
| 참 상태 | 4.6% | 0.4% | 2.4% | 0.0% | 1.2% | 8.6% |
| 120 Hz·30 ms | 4.0% | 1.2% | 10.6% | 0.0% | 12.2% | 28.0% |
| 120 Hz·100 ms | 10.6% | 1.4% | 15.2% | 0.0% | 45.4% | 72.6% |
카메라 지연 30 ms 에서 생긴 실패의 38% 는 「사람 관절 한계에 걸림」이었습니다. 늦게 알게 된 공을 따라가려면 사람보다 빨리 움직여야 하는 경우입니다. 사람 선수도 이런 공은 놓칩니다.
5. 좌우 축은 얼마나 빨라야 하나
| 좌우 축 속도·가속도 | 참 상태 성공률 |
|---|---|
| 1.0 m/s | 88.6% |
| 1.5–3.0 m/s | 91.4–92.4% |
| 3 m/s · 40 m/s² | 68.4% |
빠를수록 좋지 않았습니다. 가속도가 40 m/s²(약 4 g)가 되면 몸통이 크게 밀리고, 팔 관절의 토크가 그 반작용을 버티지 못합니다(토크 포화가 제어 주기의 35%). 사람의 범위(속도 2.2 m/s 이하, 가속도 10 m/s² 이하)에 있는 1.5–2.0 m/s · 10 m/s² 가 가장 좋은 구간에 들었습니다.
축이 옮기는 질량은 G1 전체와 라켓·운반대(가정 5 kg)를 합친 38.5 kg 입니다. 10 m/s² 로 밀려면 계산상 385 N 이고, 시뮬레이터에서 잰 값은 95% 지점 468 N, 최대 520 N 이었습니다. 다리를 떼고 상체만 올리면 질량이 24.1 kg 이 되어 힘은 약 2/3 로 줄어듭니다.
6. 라켓은 얼마나 빨리 휘두를 수 있나
관절 속도 한계만으로 계산한 최대 라켓 속도(계획한 타격 자세, 면 법선 방향)입니다. 토크로 그 속도까지 가속하는 시간은 넣지 않은 상한입니다.
| 구성 | 로봇 한계 | 사람 한계 |
|---|---|---|
| 기본 구성 | 중앙 38.8 m/s | 중앙 9.6 m/s (5–95%: 5.5–18.9) |
| 팔 5축 · 허리 잠금 | — | 중앙 2.4–3.4 m/s |
공을 넘기는 데 드는 1.5–4 m/s 는 기본 구성이면 거의 모든 자세에서 냅니다. 스매시에 드는 5–7 m/s 는 사람 한계 아래에서는 팔 7축·허리 사용 구성만 대부분의 자세에서 냅니다. 다만 지금 계획기가 맞힌 순간의 라켓 속도는 중앙 1.06 m/s 입니다. 공을 막듯이 대고 넘기는 수준입니다. 세게 치는 것은 학습의 몫입니다.
7. GPU 에서 빨리 돌리기
학습에는 수많은 공을 동시에 돌려야 해서 MuJoCo Warp(GPU)에서도 같은 장면을 돌렸습니다. CPU MuJoCo 와 0.5 s 를 대조하니, 로봇이 크게 움직이는 경우에도 공 위치 차이가 중앙 5 µm, 관절 차이가 최대 1.1×10⁻⁵ rad 였습니다.
| 동시에 돌린 세계 수 | 초당 물리 스텝(RTX 4060) |
|---|---|
| 256 | 63만 |
| 1,024 | 133만 |
| 4,096 | 166만 |
| 8,192 | 167만 |
갠트리(657만)의 약 1/4 입니다. 관절이 많고 몸통이 무거워 접촉 계산이 늘기 때문입니다. 한 번만 잰 값이라 흔들림은 확인하지 않았습니다.
8. 다음: 학습, 그리고 로봇끼리의 경기
- 학습. 7편과 같은 하이브리드 강화학습 환경을 G1 에 맞춰 준비했습니다. 관측 68, 행동 8(갠트리의 6개에 좌우 축 목표 위치와 도착 시각을 더함)입니다. 학습은 쿠버네티스의 학습 작업(Kubeflow TrainJob)으로 돌릴 예정이고, 연기 시험이 GPU 를 기다리고 있습니다.
- 로봇끼리의 경기. 환경에 편(side) 매개변수를 넣어 탁구대 양쪽에 로봇을 세울 수 있게 했습니다. 경기의 점수와 규칙은 TT Lab 의 점수판이 쓰는 심판 엔진을 그대로 쓸 계획입니다. 자기 대전으로 강해진 로봇이 고정 평가 공에서도 강한지 함께 재서, 「대전에서만 강한」 과적합을 가려낼 것입니다.
미실측과 한계
- 학습한 정책의 결과는 아직 없습니다. 이 글의 성공률은 모두 학습 없는 계획기 값입니다.
- 모터의 토크-속도 곡선을 넣지 않았습니다. 6절의 라켓 속도는 상한입니다.
- 사람 관절의 각가속도, 비장애인 탁구 선수의 옆걸음 속도, 탁구 반응 시간은 찾지 못해 넣지 않았거나 다른 종목 값을 빌렸습니다.
- 골반을 공간에 고정했습니다. 서서 균형을 잡는 문제는 다루지 않았습니다.
- 계획기의 벌점 가중치는 평가 공 앞 100개를 보며 정했으므로, 약간의 선택 편향이 있을 수 있습니다.