TT Lab
요금제

한국어

시작하기
블로그

블로그

공을 치기까지: 인지에서 모터 전류까지 일곱 단계와 시간 예산

상태: 초안 (2026-10-18), 실측. 이 글의 숫자는 노트북 한 대(Apple M1 Max, macOS 26.5)에서 Python 3.9.6·numpy 2.0.2 로 직접 계산한 값입니다. 시간은 7회 반복의 중앙값이고 첫 회는 예열로 버렸습니다. 원자료와 코드는 작업 디렉터리 measure/robot-arm-basics/(m01_budget.py, m01b_fast.py, out/m01_budget.json)에 있습니다. 실제 로봇 하드웨어에서 잰 값은 하나도 없습니다(하드웨어 미실측). 공 초기 상태는 DeepMind 의 공개 데이터셋(CC-BY 4.0)을 썼고, 탁구 규격은 ITTF Statutes 2026 원문으로 확인했습니다. 근거 자료는 모두 2026-10-18 에 열람했습니다. 작성 규칙: 실측 데이터가 기본이고, 못 잰 것은 「미실측」, 확인하지 못한 것은 「미확인」으로 표시합니다.

목차

1. 직관: 0.6초 안에 끝내야 하는 일곱 가지

사람은 상대 라켓에서 공이 떠나는 순간 이미 몸을 돌립니다. 눈으로 공을 따라가고, 어디로 튈지 짐작하고, 팔을 뒤로 뺐다가 휘두릅니다. 이 모든 일이 1초가 안 되는 시간 안에 일어나고, 대부분은 의식하지 못한 채 지나갑니다.

로봇은 이 과정을 하나하나 계산으로 풀어야 합니다. 이 시리즈는 그 계산을 일곱 단계로 나눕니다.

단계 하는 일 다루는 편
1 인지(perception) 카메라 영상에서 공을 찾아 3차원 위치를 얻는다 2편(좌표 변환)
2 상태 추정(state estimation) 잡음 섞인 위치 열에서 위치·속도를 추정한다 6편(칼만 필터)
3 비행 예측 중력·항력·Magnus 힘과 바운스로 공의 앞날을 계산한다 6편
4 타격 결정 언제·어디서 칠지, 라켓 속도와 면의 방향을 정한다 7편
5 역기구학(inverse kinematics) 라켓 자세를 관절 각으로 바꾼다 3·4·5편
6 관절 궤적(trajectory) 지금 자세에서 타격 자세·속도까지 가는 시간 함수를 만든다 8편
7 저수준 제어(low-level control) 모터 전류로 그 궤적을 실제로 따라간다 9편

10편은 이 단계 가운데 무엇을 방정식으로 풀고 무엇을 학습에 맡길지를 탁구 로봇 논문들과 함께 비교합니다.

이 시리즈는 탁구 로봇을 오픈하드웨어로 만들려는 준비 과정입니다. 그래서 숫자 하나하나를 「어떤 부품을 사야 하나」로 이어지게 씁니다. 관절 속도 한계가 몇이면 라켓이 몇 m/s 를 내는지(5편), 라켓 각이 1° 틀리면 공이 몇 cm 빗나가는지(7편), 제어 주기가 200 Hz 면 무엇이 무너지는지(9편) 같은 것들입니다.

2. 그림: 일곱 단계와 우리 코드의 계산 시간

공 하나를 치기까지: 일곱 단계와 우리 코드의 계산 시간 1 인지 카메라 → 공 픽셀 → 3차원 위치 125 fps 면 8 ms 마다 한 점 2 상태 추정 칼만 필터로 위치·속도 프레임당 125 µs 3 비행 예측 중력·항력·Magnus + 바운스 타격면까지 11 ms 4 타격 결정 나갈 속도 → 라켓 법선·속도 뉴턴법 14 ms, 닫힌 해 4 µs 5 역기구학 라켓 자세 → 관절각 해석해 58 µs 6 관절 궤적 지금 자세 → 타격 자세·속도 5차 계수 7 µs 7 저수준 제어 위치 루프 → 전류 루프 1 kHz / 30 kHz 시간: 파이썬 3.9·numpy, 노트북 CPU, 7회 반복 중앙값(첫 회 버림).
그림: 일곱 단계와 각 단계를 이 시리즈의 파이썬 코드로 계산했을 때 걸린 시간

3. 계산: 공은 얼마 만에 오는가

시간 예산의 출발점은 공의 비행 시간입니다. 직접 재기 위해 두 가지를 준비했습니다.

공의 출발 상태. Google DeepMind 가 공개한 competitive_robot_table_tennis 데이터셋에는 사람이나 로봇이 친 직후의 공 위치·속도·각속도가 15,792개 들어 있습니다(랠리 13,088개, 서브 2,704개). 이 데이터는 D'Ambrosio 외 2024 논문(arXiv:2408.03906)의 학습에 쓰였고 CC-BY 4.0 으로 배포됩니다. 좌표계는 탁구대 윗면 가운데가 원점이고 x 가 폭, y 가 길이, z 가 위입니다. 이 시리즈 전체가 같은 좌표계를 씁니다. 로봇은 y < 0 쪽에 섭니다.

비행 모델. 6편에서 자세히 다룰 운동 방정식을 RK4 로 1 ms 간격으로 적분합니다.

m · dv/dt = m·g  −  ½ ρ C_D A |v| v  +  ½ ρ A r C_M (ω × v)
            중력     항력(drag)          Magnus 힘
탁구대에 닿으면: 법선 속도에 반발 계수 e, 접선 방향은 쿨롱 마찰 μ

코드는 짧습니다. 데이터셋에서 로봇 쪽으로 오는 공만 골라 날리고, 로봇 쪽 탁구대에 한 번 튄 뒤 여러 「타격면」을 지나는 시각을 기록합니다.

incoming = [s for s in rallies + serves if s["vel_y"] < 0]      # 로봇(y<0) 쪽으로 오는 공 14,703개
for s in incoming:
    rec = fly(p, v, w, dt=1e-3, stop=lambda t, p, v, nb: p[1] < -2.2 or nb >= 2)
    # 첫 바운스가 로봇 쪽 탁구대 안이면 유효. 이후 y = -1.37, -1.6, -1.9 를 지나는 시각·높이·속력을 기록

결과는 다음과 같습니다. 14,703개 가운데 로봇 쪽 탁구대에 제대로 떨어진 공이 11,590개였고(나머지는 네트·아웃), 그중 끝줄(y = −1.37 m)까지 날아온 공이 10,618개였습니다.

상대가 친 뒤 공이 로봇 끝줄을 지나기까지 0.30 0.45 0.60 0.75 0.90 1.05 1.20 0.02 0.04 0.06 0.08 상대 타구 뒤 시간(초) 비율 바운스 중앙 0.45s 끝줄 통과 중앙 0.65s 공 10,618개(DeepMind 초기 상태, CC-BY 4.0)를 우리 비행 모델로 날림. 5·95백분위: 0.47–0.95초. 막대는 0.025초 칸.
그림: 상대가 친 뒤 공이 로봇 쪽 끝줄을 지나기까지 걸린 시간의 분포
사건 5백분위 중앙값 95백분위
친 직후 공 속력(m/s) 3.89 5.46 7.62
친 직후 회전(rad/s) 9 49 100
로봇 쪽 바운스까지(초) 0.317 0.449 0.621
바운스 뒤 정점까지(초) 0.511 0.678 0.904
정점 높이(탁구대 위, m) 0.20 0.30 0.45
끝줄 y = −1.37 통과(초) 0.474 0.654 0.951
끝줄 뒤 23 cm, y = −1.6 통과(초) 0.538 0.745 1.082
끝줄 통과 때 공 속력(m/s) 2.07 2.88 4.15
끝줄 통과 때 높이(탁구대 위, m) 0.06 0.24 0.38

계산 시간은 공 14,703개를 모두 날리는 데 130초, 공 하나에 약 9 ms 였습니다.

더 빠른 공이면

이 데이터셋의 공은 빠르지 않습니다. 같은 논문의 부록은 7 m/s 넘는 공을 「빠름」으로 분류하는데, 위 표의 95백분위가 7.6 m/s 입니다. 경기 수준이 올라가면 공이 빨라지므로 따로 계산했습니다. 상대 끝줄 위 45 cm 에서 −y 방향으로 속력 v 로 치고 탑스핀 50 rad/s 를 준 뒤, 로봇 쪽 y = −0.7 m 에 떨어지도록 위아래 속도를 이분법으로 맞췄습니다(m01b_fast.py). 다섯 경우 모두 네트를 넘습니다.

친 속력(m/s) 바운스까지(초) 끝줄 통과(초)
6 0.452 0.682
8 0.338 0.496
12 0.226 0.321
16 0.170 0.238
20 0.136 0.190

Büchler 외(2022) 의 공압 근육 로봇은 스매시 과제에서 평균 약 12 m/s 의 공을 쳤다고 보고합니다(arXiv:2006.05935 v1). 그 속도의 공을 받으려면 예산이 0.32초입니다. 데이터셋 중앙값의 절반입니다.

4. 시간을 단계별로 나누면

0.65초를 단계에 나눠 봅니다. 순서대로 일어나는 일이 아니라 겹쳐서 일어나는 일이라는 점이 중요합니다. 공을 보는 동안 팔은 이미 준비 자세로 움직이고, 예측은 새 프레임이 들어올 때마다 고쳐집니다.

구간 걸리는 시간 근거
공을 보는 시간 0.1~0.3초 6편 실측: 처음 0.1초만 보고 예측하면 타격면 위치 오차 중앙값 7.0 cm(항력 모델), 0.3초를 보면 4.8 cm
카메라 한 프레임 8 ms(125 fps) D'Ambrosio 외 2023 의 카메라 설정(arXiv:2309.03315)
시스템 지연 공 관측 40 ms, 팔 행동 71 ms 같은 논문 표 I(평균). 2024 논문은 「시스템 지연 약 100 ms」로 요약
우리 계산(예측 + 타격 결정 + IK + 궤적) 약 25 ms 각 편 실측의 합: 11 + 14 + 0.06 + 0.007 ms
팔이 타격 자세까지 가는 시간 0.05~0.10초 8편 실측: 0.6 rad 를 지나며 10 rad/s 에 닿는 5차 궤적, 가속도 한계 300~600 rad/s² 에서 0.062~0.082초
남는 여유 나머지 데이터셋 중앙값 0.65초 기준 약 0.2초, 12 m/s 공(0.32초)이면 거의 없음

표에서 두 가지가 보입니다.

  1. 계산 시간은 병목이 아닙니다. 교육용 파이썬으로도 25 ms 입니다. 병목은 공을 충분히 오래 봐야 예측이 정확해진다는 점과, 카메라·통신·제어기에 쌓이는 지연입니다. Google 의 시스템은 관측 지연만 40 ms 였습니다.
  2. 보는 시간과 움직이는 시간은 서로 빼앗습니다. 오래 볼수록 예측이 좋아지지만 팔이 움직일 시간이 줄어듭니다. 그래서 실제 시스템은 예측이 거칠 때부터 팔을 대략적인 준비 자세로 보내고, 예측이 다듬어지는 대로 목표를 고칩니다(8편의 궤적 재계획).

5. 이 시리즈의 공통 모델과 상수

모든 편이 같은 상수를 씁니다. 원문을 열어 확인한 값과 가정을 구분해 적습니다.

양 값 출처와 조건
공 질량·지름 2.7 g, 40 mm ITTF Statutes 2026, 2.3.1·2.3.2
탁구대 2.74 × 1.525 m, 높이 76 cm 같은 문서 2.1.1
네트 높이 15.25 cm 같은 문서 2.2.3
탁구대 반발 e = 0.876 2.1.3 의 「30 cm 에서 떨어뜨리면 약 23 cm」를 공기 저항 없이 환산한 값. 6편에서 다시 다룸
탁구대 마찰 μ = 0.25 Nakashima 외 2010 의 동마찰 측정값
항력 계수 C_D = 0.47 같은 프로젝트의 MuJoCo 시뮬레이터에서 잰 실효값 0.471 에 맞춤. 문헌 범위 0.37~0.55(Sony AI 2026 표 I)
Magnus 계수 C_M = 0.6(질량당 3.4×10⁻³) 시뮬레이터 쪽 노트가 Tebbe 외 2020 에서 옮긴 값(원문 미확인). 문헌마다 3배 넘게 다름(6편)
라켓 반발 e_r = 0.8 문헌값 0.788(Koç 외 2018), 0.81(Nakashima 외 2010) 사이

좌표계와 질량·지름·탁구대 규격은 같은 프로젝트에서 만들고 있는 MuJoCo 탁구 시뮬레이터와 같습니다. 시뮬레이터가 DeepMind 데이터셋 노트북의 MJCF 를 출발점으로 삼았기 때문에, 이 글의 공 상태를 그대로 넣어 결과를 대조할 수 있습니다.

6. 한계

7. 정리

티티 한마디. 공이 오는 0.6초 동안 로봇은 일곱 가지 일을 해요. 계산은 금방 끝나는데, 공을 오래 볼수록 팔을 움직일 시간이 줄어드는 게 진짜 고민이에요!

참고

모든 자료는 2026-10-18 에 열람했습니다.

로그인하면 좋아요를 누를 수 있습니다

댓글

아직 댓글이 없습니다.

로그인하면 댓글을 쓸 수 있습니다