상태: 초안 (2026-10-18), 실측. 화면과 글의 숫자는 모두 시뮬레이터 안의 값이고, 카메라 주기·지연·잡음은 가정값입니다. 녹화와 렌더링은 2026-10-18 에 홈랩 쿠버네티스의 미니 PC 노드 한 대에서 임시 파드로 했습니다. 파드 상한은 CPU 6코어·메모리 3 GiB 이고(최고 사용 1.5 GiB), GPU 는 쓰지 않았습니다. 판은 MuJoCo 3.16.0, Python 3.11, numpy 2.3.4, Mesa 23.2.1(llvmpipe, OSMesa), ffmpeg 4.4.2(libx264) 입니다. 물리와 제어는 7편과 같습니다(시간 간격 0.5 ms, 제어 1 kHz, 학습한 하이브리드 정책 시드 0). 평가 공 201번 하나를 네 가지로 돌렸습니다(학습한 하이브리드 지연 30 ms·100 ms, 고전 기준선 30 ms, 학습 없는 명목 계획기 30 ms). 결정적 실행이라 한 번씩 돌렸고, 네 결과 모두 7편 평가 파일의 같은 공·같은 조건 결과(결과 종류와 착지점)와 일치했습니다. 원자료(녹화
out/rec/ball201.json, 글의 숫자out/facts.json, 녹화·렌더링·그림 스크립트)는 작업 디렉터리measure/sim-tt-video/에 있습니다.
목차
- 1. 직관: 1.3초 동안 일어나는 일곱 가지 계산
- 2. 영상과 그림을 만든 방법
- 3. 1단계 관측: 찍은 점이 늦게 도착한다
- 4. 2단계 예측: 2차식 맞춤과 RK4·바운드 모델
- 5. 3단계 타격 결정: 착지점에서 거꾸로
- 6. 4단계 역기구학: 닫힌 식 네 줄
- 7. 5단계 궤적과 스윙: 39 ms 에 다시 그은 길
- 8. 6단계 접촉: 1 ms 안의 일
- 9. 7단계 착지: 목표에서 3.7 cm
- 10. 비교: 같은 공, 다른 방법과 다른 지연
- 11. 만들면서 겪은 일
- 12. 한계와 미실측
- 13. 다음 편으로
- 참고
1. 직관: 1.3초 동안 일어나는 일곱 가지 계산
5편과 7편은 공 500개의 성공률로 이야기했습니다. 숫자는 정확하지만, 로봇이 공 하나를 받는 동안 무엇을 언제 계산하는지는 잘 보이지 않습니다. 이번에는 공 하나를 처음부터 끝까지 따라가며, 매 순간 로봇의 머릿속에 있는 값을 화면에 꺼내 놓았습니다.
공개 데이터의 처음 상태(상대 쪽 끝선 위, 우리 쪽으로 날아오는 공)에서 우리 로봇을 거쳐 상대 코트에 떨어지기까지 1.307 s 입니다. 그 사이에 일곱 단계가 있습니다.
- 관측. 카메라가 공의 위치를 찍고, 그 점이 늦게 도착합니다.
- 예측. 도착한 점으로 공의 상태를 맞추고 앞으로의 경로를 굴립니다.
- 타격 결정. 노리는 착지점에서 거꾸로, 언제 어디서 어떤 면으로 얼마나 세게 칠지 정합니다.
- 역기구학. 그 라켓 자세를 관절 네 개의 값으로 바꿉니다.
- 궤적과 스윙. 지금 자세에서 그 자세까지 관절마다 5차 다항식을 잇고 따라갑니다.
- 접촉. 공이 라켓에 닿고 속도와 회전이 바뀝니다.
- 착지. 공이 상대 코트에 떨어집니다.
로봇은 5편과 같은 실제 크기의 갠트리 2축(x 옆, z 위) + 손목 2축(yaw, pitch)이고, 제어는 7편의 학습한 하이브리드입니다. 정책은 타격 파라미터 6개만 보정하고, 나머지는 모두 아래에 나오는 고전 계산이 합니다.
2. 영상과 그림을 만든 방법
2.1 전체 과정
| 단계 | 시뮬레이터 시각 | 영상에서 보이는 것 | 재생 속도 |
|---|---|---|---|
| 1 관측 | 0–0.200 s | 찍은 점(회색)과 도착한 점(하늘색) | 1/20 |
| 2 예측 | 0.200 s 에 멈춤 | 2차식 맞춤, 예측 경로, 추정 회전 대 참 회전 | 정지 |
| 3 타격 결정 | 0.200 s 에 멈춤 | 칠 위치, 라켓 목표, 면 법선, 노린 경로와 착지점 | 정지 |
| 4 역기구학 | 0.200 s 에 멈춤 | 지금 자세와 목표 자세, 관절 네 값 | 정지 |
| 5 궤적과 스윙 | 0.200–0.539 s | 계획한 라켓 경로 대 실제, 관절 기준 대 실제 그래프, 0.497 s 의 다시 계획 | 1/10 |
| 6 접촉 | 0.513–0.583 s | 들어온 속도·나간 속도 화살표, 속력과 회전 | 1/10 |
| 7 착지 | 0.543–1.307 s | 실제 경로 대 계획한 경로, 착지 오차 | 1/4 |
| 비교 | 0–0.700 s | 같은 공의 기준선 대 하이브리드, 지연 30 ms 대 100 ms | 1/4 |
영상은 1280×720, 30 fps, 65.6 s(1,967프레임), H.264 2.6 MB 입니다. 블로그가 영상을 받으면 단계별 클립(4.7–8.1 s)을 이 글의 각 절에 넣습니다. 지금은 같은 내용을 정지 그림과 누르면 재생하는 그림으로 싣습니다.
2.2 녹화: 계산을 바꾸지 않고 꺼내기
7편의 녹화 궤적(rec_*.json)에는 5 ms 간격의 공·라켓 위치만 있습니다. 단계별 계산을 보이려면 관측점, 맞춘 2차식, 예측 경로, 결정마다의 계획, 관절 기준값이 필요해서 같은 환경을 같은 씨앗(공마다 777000 + 공 번호)으로 다시 돌렸습니다.
환경 코드는 고치지 않고 하위 클래스에서 읽기만 했습니다. 1 ms 제어 주기마다 상태를 옮겨 적고, 결정마다 추정값과 계획을 옮겨 적습니다.
class RecEnv(ttenv.TTEnv):
def _tick(self, qr, vr, ar):
done = super()._tick(qr, vr, ar) # 물리·제어는 원래 코드 그대로
d = self.d
v, w = ball_world(self) # 세계 좌표 속도·각속도
self.ticks.append([round(self.t, 6), *d.qpos[:11].tolist(), *d.qvel[6:10].tolist(),
*np.asarray(qr).tolist(), *v.tolist(), *w.tolist(), ...])
return done
출처: TT Lab 실험 코드 sim-tt-video/src/vid_record.py(접촉 표시 열은 줄임).
녹화 결과(결과 종류, 착지점)는 7편 평가 파일의 같은 공·같은 조건 값과 대조해 네 경우 모두 같았습니다. 같은 계산이 다시 돌았다는 확인입니다.
2.3 렌더링: 숫자는 녹화에서, 그림은 보여 주기 전용 모델로
물리 모델의 로봇에는 라켓 말고 도형이 없어서 그대로 그리면 라켓만 공중에 뜹니다. 그래서 관절 배치(qpos 순서, 위치, 축, 라켓 크기)가 같은 보여 주기 전용 모델을 따로 만들어 레일·캐리지·손목·손잡이를 붙이고, 녹화한 qpos 를 그대로 넣어 MuJoCo 의 오프스크린 렌더러로 그렸습니다. 이 모델은 접촉을 계산하지 않습니다. 관측점·예측 경로·타격점 같은 표시는 MuJoCo 장면에 도형으로 넣었고, 자막과 숫자는 그린 프레임 위에 나눔고딕으로 썼습니다. 화면의 숫자는 모두 녹화 파일에서 읽고, 속력(벡터 크기), 각도, cm 환산처럼 그대로 바꾸는 계산만 했습니다. 1 ms 기록 사이의 프레임(1/20 배속에서는 1.67 ms 간격)은 공과 관절 위치를 선형 보간해 그렸습니다.
3. 1단계 관측: 찍은 점이 늦게 도착한다
- 카메라는 120 Hz(약 8.3 ms 간격)로 찍고, 위치에 σ 3 mm 의 잡음이 붙습니다. 시뮬레이터에서는 1 ms 제어 주기에 맞춰 찍으므로 실제 간격은 8–9 ms 입니다.
- 찍은 점은 30 ms 뒤에야 로봇에 도착합니다. 0.2 s 에 첫 결정을 할 때 찍은 점은 24개, 도착한 점은 21개였습니다. 마지막 30 ms 의 공은 로봇에게 아직 보이지 않습니다.
- 상대가 친 공의 처음 속력은 7.78 m/s, 진행 방향 기준 탑스핀 53.8 rad/s 입니다(DeepMind 공개 데이터의 처음 상태).
공의 상태를 관측에서 추정하는 일반론(칼만 필터 등)은 「탁구 로봇 팔의 기초」 6편 공 비행 방정식에 있습니다.
4. 2단계 예측: 2차식 맞춤과 RK4·바운드 모델
계산. 도착한 점(최근 36개까지)에 시간에 대한 위치 2차식을 최소제곱으로 맞춰, 마지막 관측 시각의 위치·속도·가속도를 얻습니다. 0.2 s 의 맞춤은 관측 21개, 가속도 (1.56, 6.90, −13.49) m/s² 였습니다. 가속도에서 중력과 항력을 빼고 남은 몫을 마그누스 힘 (k_M/m) ω×v 로 보고 ω 를 풉니다. 회전은 가속도의 작은 차이로만 보이므로 0 쪽으로 당기는 사전 항(표준편차 300 rad/s)을 둡니다. 그 상태로 플래너의 물리(항력 계수 0.471, 마그누스 계수, 탁자 반발 0.975·마찰 0.10)를 4 ms 간격 RK4 로 굴리고, 탁자에 닿으면 충격량 모델로 튀깁니다.
| 0.2 s 의 값 | 로봇의 추정 | 참값(시뮬레이터) |
|---|---|---|
| 속도 (m/s) | (−1.23, −6.29, −0.39) | (−1.14, −6.20, −0.74) |
| 회전 ω (rad/s) | (82, −16, 4) | (55, 3, 15) |
| 바운드 시각 | 0.415 s | 0.429 s |
| 바운드 위치 (x, y) m | (−0.47, −1.16) | (−0.47, −1.26) |
예측 바운드는 실제보다 14 ms 빠르고 10.3 cm 앞이었습니다. 회전 추정이 가장 크게 어긋납니다(6편에서 본 대로 위치만으로는 회전이 약하게만 보입니다).
바운드 뒤 다시 맞추기. 로봇은 도착한 점의 높이가 가장 낮았다가 1 cm 넘게 다시 올라오면 바운드로 봅니다. 이 공은 0.425 s 를 바운드로 보았고, 그 뒤 관측 4개가 도착한 0.497 s 에 두 번째 결정을 했습니다. 관측이 6개 미만이면 가속도는 중력으로 두고 직선만 맞추며, 회전은 첫 추정을 바운드 모델에 통과시킨 값 (131, −25, 4) rad/s 를 그대로 씁니다(참값 (98, −7, 15)). 이 계산의 식은 「탁구 로봇 팔의 기초」 6편의 중력·항력·마그누스와 바운스 모델 절에 있습니다.
5. 3단계 타격 결정: 착지점에서 거꾸로
계산. 세 가지를 차례로 풉니다.
- 나가는 속도. 노리는 착지점은 상대 코트 가운데 (0, 0.75) m 입니다. 수평 속력을 4.5 m/s 로 두고 비행 시간 T = 거리/4.5 를 정한 뒤, 중력만 있는 포물선이 탁자 높이에 닿도록 v_z 를 고릅니다.
- 면 법선과 면 속도. 나가는 속도와 들어오는 속도의 차이 방향을 법선 n 으로 잡고, 반발 계수 e 로 법선 방향 면 속도 v_pn = v_in·n + (Δv·n)/(1+e) 를 정합니다. 마찰을 넣은 충격량 모델로 예상 결과를 다시 계산해 세 번 고칩니다.
- 칠 시각. 갠트리에는 깊이(y) 축이 없어서 라켓이 닿을 수 있는 y 는 손목 각도로만 정해집니다. 예측 경로가 그 y 를 지나는 시각이 칠 시각입니다.
def _v_des(self, b):
dx, dy = TARGET[0] - b[0], TARGET[1] - b[1]
dist = math.hypot(dx, dy)
vh = 4.5
Tf = dist / vh
vz = (T.BALL_R - b[2] + 0.5 * G * Tf * Tf) / Tf
return np.array([dx / dist * vh, dy / dist * vh, vz])
출처: TT Lab 실험 코드 rl/src/ttenv.py(7편과 같은 파일).
학습한 정책은 이 명목값에 보정 6개를 더합니다(면 yaw·pitch 각 ±20°, 면 속도 ±1.5 m/s, 칠 시각 ±20 ms, 라켓 중심 x·z 각 ±6 cm 범위).
| 0.2 s 의 1차 결정 | 명목(학습 없음) | 정책 보정 후 |
|---|---|---|
| 칠 시각 | 0.552 s | 0.556 s(결정에서 356 ms 뒤) |
| 칠 위치 b (m) | (−0.58, −1.74, 0.32) | (−0.59, −1.75, 0.32) |
| 면 yaw / pitch | −12.3° / 4.7° | −7.7° / 0.4° |
| 면 속도(법선 방향) | 0.48 m/s | 1.10 m/s |
| 원하는 나가는 속도 | (1.03, 4.38, 2.26) m/s | (1.02, 4.38, 2.27) m/s, 5.04 m/s |
정책 출력을 단위로 바꾸면 yaw +4.7°, pitch −4.0°, 면 속도 +0.63 m/s, 칠 시각 +7.0 ms, 중심 x −0.6 cm, z −2.7 cm 입니다. 원하는 착지점에서 라켓 속도와 법선을 거꾸로 구하는 방정식은 「탁구 로봇 팔의 기초」 7편 타격 방정식에 있습니다.
6. 4단계 역기구학: 닫힌 식 네 줄
갠트리가 직교 좌표라 역기구학은 반복 계산 없이 끝납니다. 손목 두 각은 원하는 법선에서 바로 나오고, 갠트리 두 축은 라켓 중심에서 손목 오프셋을 빼면 됩니다.
def ik(c, n, rb: Robot):
n = np.asarray(n, float) / np.linalg.norm(n)
th = math.asin(max(-1.0, min(1.0, n[2])))
psi = math.atan2(-n[0], n[1])
x = c[0] - rb.L * math.sin(th) * math.sin(psi)
z = c[2] - rb.L * math.cos(th)
y_res = c[1] - (rb.y_g - rb.L * math.sin(th) * math.cos(psi))
q = np.array([x, z, psi, th])
ok = bool(np.all(q >= np.array(rb.lo)) and np.all(q <= np.array(rb.hi)))
return q, y_res, ok
출처: TT Lab 실험 코드 sim/ttsim.py(설명 주석은 줄임).
| 관절 | 지금(0.2 s) | 1차 목표 | 한계 |
|---|---|---|---|
| 갠트리 x | 0.000 m | −0.595 m | ±0.9 m |
| 갠트리 z | 0.150 m | 0.144 m | −0.15–0.7 m |
| 손목 yaw | 0.0° | −7.7° | ±80° |
| 손목 pitch | 0.0° | 0.4° | ±80° |
라켓 중심은 c = b − n·(공 반지름 + 라켓 두께/2) 에 정책의 중심 보정을 더한 값입니다. 네 값 모두 한계 안이라 잘라 낸 값이 없었습니다. y_res 는 갠트리가 맞출 수 없는 깊이 방향의 차이인데, 명목 계획에서는 0 이었고 정책 보정이 들어간 1차 목표에서는 −2.9 cm 였습니다. 두 해, 특이점, 해가 없을 때 같은 일반적인 팔의 이야기는 「탁구 로봇 팔의 기초」 4편 역기구학에 있습니다.
7. 5단계 궤적과 스윙: 39 ms 에 다시 그은 길
계산. 결정할 때마다 지금 관절의 위치·속도·가속도에서 타격 순간의 목표(위치 q, 속도 (0, 0, 0, −v_pn/L), 가속도 0)까지 관절마다 5차 다항식을 잇습니다. 휘두른 뒤 pitch 는 0.12 s 에 걸쳐 멈춥니다. 1 kHz 의 계산 토크 제어(PD + 피드포워드, 고유 진동 50 rad/s)가 이 기준을 따라가고, 가속도와 속도는 축 한계에서 자릅니다.
- 1차 계획(0.200 s, 356 ms). 요구한 최고 가속도는 가로 축 27 m/s²(한계 40), pitch 82 rad/s²(한계 600) 로 여유가 있었습니다. 가로 축 최고 속도는 3.13 m/s 로 한계 3 m/s 를 조금 넘었습니다. 0.497 s 까지 실제와 기준의 차이는 x 0.27 cm, pitch 0.20° 이하였습니다.
- 2차 계획(0.497 s, 남은 39 ms). 바운드 뒤 다시 맞춘 칠 위치는 x 가 +4.2 cm, z 가 −5.2 cm 옮겨졌고, 정책은 pitch 를 +6.1°, 중심 x 를 +3.0 cm 보정했습니다. 그 결과 면 pitch 는 0.4° → 8.8°, 면 속도는 1.10 → 0.33 m/s 로 바뀌었습니다. 남은 39 ms 에 새 5차 다항식을 이으니 가로 축이 323 m/s²(한계 40), 높이 축이 98 m/s²(한계 30) 를 요구했습니다. 실제는 한계에서 잘려 접촉 순간 가로 축이 기준과 6.6 cm 어긋났습니다.
- 그래도 맞았습니다. 공과 라켓 중심의 가장 가까운 거리는 5.0 cm 였고, 라켓 판이 15×16 cm 라 그 안에 들어왔습니다. 접촉은 계획한 0.536 s 보다 7 ms 늦은 0.543 s 였습니다.
5차 다항식이 양 끝의 위치·속도·가속도를 맞추는 원리와 한계 안의 최소 시간 궤적은 「탁구 로봇 팔의 기초」 8편 궤적 생성, 계산 토크 제어는 9편 제어에 있습니다.
8. 6단계 접촉: 1 ms 안의 일
영상은 이 장면을 1/10 배속으로 보입니다. 공이 라켓에 닿았다고 기록된 것은 1 ms 기록 한 칸(물리 스텝 두 번)입니다.
| 속력 | 회전 크기 | 진행 방향 기준 | |
|---|---|---|---|
| 들어온 공(0.542 s) | 4.51 m/s | 98.9 rad/s | 탑스핀 97.6 rad/s |
| 나간 공(0.544 s) | 4.89 m/s | 98.7 rad/s | 백스핀 95.8 rad/s |
- 계획이 원한 나가는 속력은 5.06 m/s(중력만 둔 계산), 실제는 4.89 m/s 였습니다.
- 접촉 직전 pitch 관절 속도는 −2.11 rad/s 로, 라켓 면을 미는 속도는 L·|θ̇| = 0.32 m/s 입니다. 2차 계획의 면 속도 0.33 m/s 와 거의 같습니다. 라켓 면 중심의 속력은 갠트리의 움직임까지 더해 0.69 m/s 였습니다.
- 회전 벡터는 1.5 rad/s 만 바뀌었습니다. 공의 방향이 뒤집혀서, 들어올 때의 탑스핀이 나갈 때는 백스핀이 되었습니다. 라켓 고무의 반발·마찰은 가정값(마찰 0.5)이라 실제 라켓에서도 회전이 이만큼 그대로 남을지는 모릅니다.
9. 7단계 착지: 목표에서 3.7 cm
| 값 | 학습한 하이브리드 | 명목(학습 없음) |
|---|---|---|
| 착지점 (x, y) m | (−0.004, 0.713) | (−0.007, 0.529) |
| 목표 (0, 0.75) 에서 | 3.7 cm | 22.1 cm |
| 꼭대기 높이 | 0.68 m | 0.47 m |
| 결과 | 반환 성공 | 반환 성공 |
- 학습한 하이브리드의 공은 네트 위 36.7 cm 로 넘어가 접촉 0.764 s 뒤에 떨어졌습니다.
- 계획은 중력만 둔 포물선으로 꼭대기를 0.54 m 로 보았는데, 실제 공은 0.68 m 까지 올라갔습니다. 백스핀의 마그누스 힘이 공을 띄운 몫입니다. 계획식의 오차를 정책의 보정이 메웠다고 볼 수 있습니다. 같은 공에서 학습 없는 명목 계획기는 22.1 cm 짧게 떨어졌습니다.
- 다만 이것은 공 하나입니다. 평가 공 500개(120 Hz·30 ms)에서 학습이 보탠 순이득은 명목 80.6% → 이 정책 83.8% 였습니다(7편).
10. 비교: 같은 공, 다른 방법과 다른 지연
고전 기준선(지연 30 ms): 못 맞힘, 가장 가까울 때 28.2 cm. 기준선은 0.2 s 에 관측 21개로 위치·속도·회전을 한꺼번에 최소제곱으로 맞췄는데, 회전을 (111, 279, −27) rad/s 로 읽었습니다(참값 (55, 3, 15)). 그 예측으로 칠 위치를 x −0.83 m 로 잡았고, 그 시각 실제 공은 x −0.54 m 에 있었습니다. 기준선은 예측 바운드 80 ms 뒤부터 칠 시각 80 ms 전까지만 다시 계획합니다. 예측 바운드가 0.440 s, 칠 시각이 0.545 s 라 그 창이 비어 계획은 0.2 s 의 하나뿐이었습니다. 하이브리드는 바운드를 관측에서 찾고 관측 4개가 모이면 바로 다시 계획해 고쳤습니다.
학습한 하이브리드(지연 100 ms): 못 맞힘, 가장 가까울 때 32.4 cm. 같은 정책, 같은 공입니다. 0.2 s 에 도착한 관측이 13개뿐이라(30 ms 는 21개) 회전을 (67, −5, 87) rad/s 로 읽었고, 세로축(z) 둘레의 옆돌기 성분이 커서 칠 위치를 x −0.19 m 로 잡았습니다(그 시각 실제 공 x −0.55 m). 바운드 뒤 관측 4개는 0.567 s 에야 도착했고, 그때 나온 계획의 칠 시각 0.545 s 는 이미 지나 있어 쓰지 못했습니다. 지연 100 ms 에서 이 정책의 반환 성공률은 500개 기준 58.2%, 기준선은 26.6% 입니다(7편).
11. 만들면서 겪은 일
- GPU 가 비어 있지 않았습니다. GPU 노드의 카드 한 장은 다른 학습이 쓰고 있었습니다. 그 학습을 방해하지 않으려고 CPU 노드에서 Mesa 의 소프트웨어 렌더러(OSMesa, llvmpipe)로 그렸습니다. 1280×720 의 간단한 장면이 32 ms, 표시와 자막까지 그린 최종 프레임이 평균 79 ms 였습니다(1,967프레임에 2분 36초).
- 화면 투영이 0으로 나뉘었습니다. 자막의 지시선을 3차원 점에 붙이려고 카메라의 시야각(frustum)을 읽었는데, 장면 갱신 직후의 frustum 너비가 0 이었습니다. 렌더 단계에서 화면 비율로 채우는 값이라, 같은 식(높이 × 가로/세로 비율)으로 계산했습니다.
- 원기둥 크기의 순서가 달랐습니다. 착지 목표 표시를 납작한 원기둥으로 넣었는데 4 cm 높이의 통이 나왔습니다. 장면에 직접 넣는 원기둥의 크기는 (반지름, 반지름, 높이)가 아니라 (반지름, 반높이) 순서였습니다.
- 관측 개수가 하나 많았습니다. 0.2 s 화면에 「찍은 관측 25개」 가 나왔는데 녹화의 결정 기록은 24개였습니다. 환경은 1 ms 주기가 시작할 때 찍고, 결정은 그 주기 앞에서 하므로 0.200 s 에 찍힌 점은 결정 순간에 아직 없습니다. 화면도 같은 규칙으로 고치고 결정 기록과 맞는지 시험(assert)으로 묶었습니다.
- 글꼴에 빼기 기호가 없었습니다. 수학 빼기(U+2212)가 나눔고딕에서 네모로 나왔습니다. 화면 글자는 하이픈으로 바꿨습니다.
- 갠트리 틀이 장면을 가렸습니다. 처음에는 위아래 레일과 기둥이 있는 틀을 그렸는데, 로봇 뒤에서 보는 장면마다 위 레일이 공의 경로를 가로질렀습니다. 보여 주기 전용 모델에서 위 레일을 빼고 아래 레일과 움직이는 기둥만 남겼습니다. 물리에는 영향이 없습니다(물리 모델의 로봇에는 원래 라켓 말고 도형이 없습니다).
- 영상의 메타데이터. ffmpeg 는 기본으로 인코더 이름을 상자에, x264 는 인코더 설정 문자열을 영상 안에 적습니다. 블로그의 영상 검사가 둘 다 거절하므로
-map_metadata -1 -map_chapters -1 -fflags +bitexact -flags:v +bitexact와-bsf:v filter_units=remove_types=6로 지웠고, 클립 9개는 검사 함수를 통과했습니다. 65.6 s 의 전체 영상은 글 하나에 넣는 한도 30 s 를 넘어 글에는 단계별 클립으로 나눠 넣습니다.
12. 한계와 미실측
- 공 하나입니다. 이 글의 숫자는 평가 공 201번 한 개의 값입니다. 다른 공에서는 다시 계획의 시점, 축 한계에 걸리는 정도가 다릅니다. 분포는 5·7편의 500개 평가를 보십시오.
- 실기 전이, 실제 카메라 지연, 회전 추정 정확도, 라켓 고무의 반발·마찰, 축 한계는 7편과 같이 모두 가정값이고 미실측입니다.
- 보간. 영상의 느린 장면은 1 ms 기록 사이를 선형 보간해 그렸습니다. 1 ms 보다 짧은 접촉 안의 변화(물리 스텝 0.5 ms 단위)는 영상에 보이지 않습니다.
- 보여 주기 전용 도형. 레일·캐리지·손목·손잡이의 모양은 그림용이고 하드웨어 설계(3편)의 치수가 아닙니다. 라켓 판(15×16 cm, 두께 14 mm)과 관절 배치만 물리 모델과 같습니다.
13. 다음 편으로
다음은 낮은 공과 작업 공간을 넓히는 깊이 축을 로봇 모델에 넣어 같은 평가를 다시 돌리는 것입니다(7편에서 예고). 이번 녹화·렌더링 도구를 그대로 써서, 깊이 축이 생기면 「칠 시각」 의 정의가 어떻게 바뀌는지도 같은 일곱 단계로 보이려 합니다.
티티 한마디. 성공률 표로만 보던 로봇을 공 하나로 따라가 보니, 마지막 39 ms 에 계획을 다시 그어 한계의 8배를 요구받고도 라켓 안에 공을 넣는 장면이 있었어요. 숫자 하나 뒤에 이렇게 아슬아슬한 순간이 숨어 있었네요!
참고
바깥 링크는 7편과 같은 주소입니다(7편에서 2026-10-18 에 열리는 것을 확인했습니다).
- MuJoCo: https://github.com/google-deepmind/mujoco
- 공개 초기 공 상태: https://github.com/google-deepmind/competitive_robot_table_tennis(© 2025 Google LLC, CC BY 4.0. 데이터는 다시 배포하지 않고 시뮬레이션 결과만 실었습니다.)
- 자막 글꼴: 나눔고딕(SIL Open Font License 1.1, 우분투 fonts-nanum 패키지)
- 함께 읽기: 5편 고전 제어 기준선, 6편 DeepMind 탁구 로봇 개선 방향, 7편 탁구 팔 강화학습
- 「탁구 로봇 팔의 기초」: 4편 역기구학, 6편 공 비행 방정식, 7편 타격 방정식, 8편 궤적 생성, 9편 제어
- 인용 코드와 그림·영상의 궤적은 TT Lab 실험 코드의 출력입니다.