상태: 초안 (2026-10-18), 실측. 숫자는 노트북(Apple M1 Max, macOS 26.5)의 Python 3.9.6·numpy 2.0.2 로 직접 계산한 시뮬레이션 값입니다. 원자료와 코드: 작업 디렉터리
measure/robot-arm-basics/의m07_hit.py,out/m07_hit.json. 라켓 반발은 단순 모델이며 실제 라켓·러버로 잰 값이 아닙니다(하드웨어 미실측). 공 초기 상태는 DeepMind 데이터셋(CC-BY 4.0)입니다. 참고 자료는 2026-10-18 에 열람했습니다. 작성 규칙: 실측 데이터가 기본이고, 못 잰 것은 「미실측」, 확인하지 못한 것은 「미확인」으로 표시합니다.
목차
1. 직관: 거꾸로 생각하기
농구 슛을 생각해 봅니다. 공이 골대에 들어가려면 손을 떠날 때 어떤 속도여야 하는지가 먼저 정해지고, 손목과 팔은 그 속도를 만들도록 움직입니다. 탁구도 같습니다. 다만 공이 이미 날아오고 있어서, 라켓은 공을 「던지는」 것이 아니라 「튕겨 내는」 것입니다.
그래서 타격 결정은 두 단계의 거꾸로 문제입니다.
- 착지점 → 나갈 공 속도 v_out. 상대 탁구대의 목표점에 정해진 시간 안에 떨어지려면 공이 라켓을 떠날 때 속도가 얼마여야 하나. 비행 모델(6편)을 거꾸로 푸는 문제입니다.
- 나갈 속도 → 라켓. 들어오는 공 속도 v_in 을 v_out 으로 바꾸려면 라켓 면의 법선 n 과 라켓 속도 v_r 은 얼마여야 하나. 충돌 모델을 거꾸로 푸는 문제입니다.
1편의 시간 예산에서 이 두 단계가 받는 몫은 수십 ms 입니다. 그리고 이 단계의 출력(라켓 위치·방향·속도·시각)이 4편의 역기구학과 8편의 궤적 생성으로 넘어갑니다.
2. 그림: 라켓 반발의 기하
3. 계산
3.1 나갈 속도: 사격법과 뉴턴법
미지수는 v_out 의 세 성분입니다. 목표점 (x_t, y_t) 에 탁구대 높이(z = 공 반지름)로 도착해야 하므로 식이 셋이 되려면 하나를 더 정해야 합니다. 이 글은 비행 시간 T 를 정합니다. 그러면 「T 초 뒤 위치 = 목표」라는 식 세 개가 됩니다.
F(v_out) = 공을 v_out 으로 T 초 날린 위치 − (x_t, y_t, r) = 0
F 는 6편의 비행 모델을 적분해야 계산되는 함수라 식으로 풀 수 없습니다. 그래서 「쏴 보고 고치는」 사격법(shooting method)을 씁니다. 야코비안은 v_out 의 각 성분을 조금씩 바꿔 쏴 보는 유한 차분으로 구하고, 뉴턴법으로 고칩니다. 시작값은 공기 없는 포물선의 답입니다.
def solve_vout(p, T, goal):
v = (goal - p) / T
v[2] += 0.5 * 9.81 * T # 진공 포물선에서 출발
for it in range(20):
r = flight_to(p, v, T) - goal # 6편의 RK4 적분
if norm(r) < 1e-4: # 0.1 mm
return v
J = np.column_stack([(flight_to(p, v + h*e_i, T) - flight_to(p, v, T)) / h for e_i in I3])
v = v - np.linalg.solve(J, r)
나가는 공의 회전은 0 으로 두었습니다(3.3 절의 한계).
3.2 라켓: 반발 모델의 닫힌 해
공과 라켓이 부딪히는 순간을 라켓 면 기준으로 두 방향으로 나눕니다.
법선 방향: (v_out − v_r)·n = −e_r · (v_in − v_r)·n 반발 계수 e_r
접선 방향: v_out,t = v_in,t 마찰 무시(접선 성분 보존)
접선 성분이 보존되면 v_out − v_in 에는 법선 성분만 남습니다. 그러니 라켓 법선은 v_out − v_in 방향이고, 법선 방향 식을 v_r·n 에 대해 풀면 라켓 속도가 나옵니다.
def racket_for(v_in, v_out, e_r=0.8):
n = (v_out - v_in) / norm(v_out - v_in)
vrn = (v_out @ n + e_r * (v_in @ n)) / (1 + e_r) # 라켓 속도의 법선 성분
return n, vrn # 접선 성분은 자유(0 으로 둠)
라켓 속도의 접선 성분은 이 모델에서 공에 영향을 주지 않으므로 아무 값이나 됩니다. 실제로는 이 자유를 팔이 내기 쉬운 방향을 고르는 데 쓰거나, 마찰이 있는 모델에서 회전을 거는 데 씁니다. 계산 시간은 4.3 µs 였습니다.
라켓 반발 계수 e_r 은 문헌에서 0.78~0.88 범위로 확인했습니다. Koç 외 2018 은 사람 시연 데이터로 0.788 을 추정했고, Nakashima 외 2010 은 러버 반발을 0.81 로 쟀으며, Google 2023 은 실측 0.78 을 적었습니다. Sony AI 2026 은 상수 0.878 에 속도 의존 항과 신경망 잔차를 더한 모델을 씁니다. 이 글은 0.8 을 씁니다.
3.3 왜 마찰을 무시해도 되나, 그리고 언제 안 되나
실제 러버는 끈적이고 탄성이 있어 공의 접선 속도를 바꾸고 회전을 겁니다. Nakashima 외 2010 은 러버가 접선 방향 운동 에너지를 탄성 에너지로 저장해 접점의 접선 속도가 반대로 뒤집힌다고 모델링했습니다. 이 글의 모델은 그 효과를 버리고 돌려보내기만 다룹니다. 탑스핀을 걸어 세게 치는 공격은 이 모델로는 계획할 수 없습니다. 10편에서는 이 모델의 틀린 부분을 데이터로 얼마나 빨리 고칠 수 있는지 잽니다.
4. 실측
4.1 실제 타구 200개를 돌려보내기
1편의 데이터셋에서 로봇 쪽으로 오는 공을 6편 모델로 끝줄 뒤 23 cm 타격면(y = −1.6 m)까지 날리고, 탁구대 위 5 cm 이상 높이로 그 면을 지나는 공 200개를 골랐습니다. 타격면에서 공 속력은 중앙값 2.8 m/s(5% 2.2, 95% 3.9) 였습니다. 목표점은 상대 쪽 (0.3, 0.9) m 입니다.
| 비행 시간 T | 뉴턴 반복 | 풀이 시간 | 나갈 속력 | 라켓 법선 속도 5% / 중앙 / 95% | 라켓 법선과 +y 사이 각 | 네트 위 여유 5% |
|---|---|---|---|---|---|---|
| 0.35 s | 2 | 39 ms | 8.7 m/s | 3.1 / 3.6 / 4.0 m/s | 12° | 3.2 cm |
| 0.45 s | 2 | 50 ms | 6.9 m/s | 2.1 / 2.6 / 2.9 m/s | 17° | 12.6 cm |
| 0.60 s | 2 | 67 ms | 5.7 m/s | 1.5 / 2.0 / 2.2 m/s | 24° | 31 cm |
| 0.80 s | 2 | 90 ms | 5.5 m/s | 1.4 / 1.9 / 2.1 m/s | 35° | 64 cm |
- 뉴턴법은 네 가지 T 모두에서 반복 횟수의 5·50·95백분위가 2번이었고, 착지 오차는 95백분위도 0.01 mm 아래였습니다. 진공 포물선 시작값이 이미 가깝기 때문입니다.
- 풀이 시간의 대부분은 RK4 적분입니다. 6편에서 RK4 5 ms 간격의 위치 오차가 10⁻⁷ mm 수준이었으므로 간격을 5 ms 로 늘려 다시 쟀더니 T = 0.6 s 에서 13.7 ms 로 줄었고, 1 ms 적분으로 검산한 착지 오차는 0.005 mm 였습니다.
- 비행 시간이 짧을수록(빠른 반환) 공을 낮고 빠르게 보내야 해서 네트 위 여유가 줄어듭니다. T = 0.35 s 에서 5% 의 공은 네트 위 3.2 cm 로 지나갑니다. T 를 고르는 일은 「빠르게」와 「안전하게」의 맞바꿈이고, 실제로는 네트 여유·라켓 속도 한계(5편)·관절 가속도(8편)를 제약으로 둔 최적화 문제가 됩니다. 이 글은 T 네 값을 격자로 비교했을 뿐이고 최적화는 하지 않았습니다(미실측).
4.2 라켓이 조금 틀리면
T = 0.6 s 반환 100개에서, 계산한 라켓에 오차를 하나씩 넣고 6편 모델로 실제 착지점을 다시 계산했습니다.
| 오차 | 착지점 오차 중앙 / 90% |
|---|---|
| 라켓 법선 0.5° 기울어짐(무작위 방향) | 3.0 / 3.8 cm |
| 라켓 법선 1° | 6.1 / 7.5 cm |
| 라켓 법선 2° | 11.4 / 15.1 cm |
| 라켓 법선 5° | 30.7 / 37.2 cm |
| 라켓 속도 +0.05 m/s | 5.4 / 6.1 cm |
| 라켓 속도 +0.1 m/s | 10.6 / 11.8 cm |
| 라켓 속도 +0.3 m/s | 31.6 / 35.1 cm |
| 실제 e_r 0.75(모델은 0.8) | 13.4 / 15.5 cm |
| 실제 e_r 0.85 | 13.9 / 16.1 cm |
| 실제 e_r 0.70 | 26.9 / 31.0 cm |
| 라켓 10 ms 늦음(공 속도 변화만) | 2.3 / 4.0 cm |
- 라켓 각 1° 가 6 cm, 라켓 속도 0.1 m/s 가 10 cm 입니다. 3편에서 관절 영점 ±0.1° 가 라켓 법선을 0.1~0.2° 틀어지게 했으니 영점 오차만으로 1 cm 안팎을 잃습니다. 9편에서 PD 제어만 쓰면 타격 순간 관절 속도 오차가 0.2 rad/s 였는데, 팔 길이 0.5 m 를 곱하면 라켓 속도 0.1 m/s 입니다. 착지점 10 cm 에 해당합니다.
- 반발 계수 e_r 이 0.05 틀리면 13 cm 입니다. 러버마다, 공이 맞는 자리마다 다른 값이므로 이 상수는 로봇마다 다시 재야 합니다(10편).
- 타이밍은 생각보다 너그럽습니다. 라켓이 10 ms 늦으면 공은 그사이 조금 더 떨어지고 느려지는데, 그 효과는 착지점 2.3 cm 였습니다. 대신 공은 10 ms 동안 2.9 cm(중앙값) 더 날아오므로 라켓 면 위의 맞는 자리가 그만큼 옮겨집니다. 라켓 면 반지름이 7~8 cm 이므로 10 ms 는 견딜 만하지만, 1편의 지연(수십~100 ms)을 보정하지 않으면 공을 놓칩니다.
5. 한계
- 라켓 마찰과 회전 전달을 무시했습니다. 들어오는 공의 회전은 실제로 반발 방향을 바꾸지만 이 모델에서는 아무 효과가 없습니다.
- 라켓 면을 무한히 넓은 평면으로 보았습니다. 가장자리에 맞는 공, 라켓의 휨과 진동은 다루지 않았습니다(미실측).
- 접촉을 순간으로 보았습니다. 실제 접촉 시간 동안 라켓은 계속 움직이고 돌고 있습니다. 8편이 타격 순간 가속도를 0 으로 두는 이유입니다.
- 비행 시간 T 를 미리 정했습니다. T 와 타격 시각·위치를 함께 최적화하는 방법(Koç 외 2018)은 구현하지 않았습니다.
6. 정리
- 타격 결정은 두 개의 거꾸로 문제입니다. 착지점에서 나갈 속도를 구하는 사격법(뉴턴 2회 반복)과, 나갈 속도에서 라켓을 구하는 닫힌 식(4 µs)입니다.
- 마찰을 무시한 반발 모델에서 라켓 법선은 v_out − v_in 방향이고, 라켓 속도는 그 방향 성분 하나로 정해집니다.
- 돌려보내기에 필요한 라켓 속도는 2~4 m/s 로 작습니다. 어려운 것은 속도의 크기가 아니라 정밀도입니다. 라켓 각 1°, 속도 0.1 m/s, 반발 계수 0.05 가 각각 착지점 6·10·13 cm 입니다.
티티 한마디. 공을 돌려보내는 데 라켓은 생각보다 천천히 움직여도 돼요. 대신 라켓 면이 1° 만 틀어져도 공은 한 뼘 가까이 빗나가니까, 빠르기보다 정확하기가 먼저예요!
참고
모든 자료는 2026-10-18 에 열람했습니다.
- Nakashima 외, Modeling of Rebound Phenomenon of a Rigid Ball with Friction and Elastic Effects, ACC 2010, 기관 저장소.
- Koç, Maeda, Peters, Online optimal trajectory generation for robot table tennis, RAS 105 (2018), 저자 공개본, 표 A.3.
- D'Ambrosio 외, arXiv:2309.03315, 부록 D(라켓 반발 설정값과 실측값).
- Conti 외(Sony AI), arXiv:2606.28805, 표 IV(라켓 모델).
- Google DeepMind, competitive_robot_table_tennis, CC-BY 4.0.