상태: 초안 (2026-10-18), 계산과 조사. 하드웨어는 아직 사지도 만들지도 않았습니다. 이 글의 숫자는 세 종류입니다. 계산은 우리 스크립트(
flight_window.py,axis_budget.py)로 직접 낸 값이고, 입력은 DeepMind 공개 데이터의 초기 공 상태입니다. 물리는 MuJoCo 가 아니라 간이 모델(항력, 마그누스, 충격량 바운드)이며 계수를 두 벌(A: 마그누스 있음, B: 없음)로 돌려 범위로 적었습니다. 조사는 2026-10-18 에 공식 판매처와 논문·저장소를 열어 확인한 값이고, 가격은 그날 공식 판매처에 표시된 값입니다. 추정은 근거는 있으나 확인하지 못한 값이며 그렇게 표시했습니다. 원자료는 작업 디렉터리tt-robot/hardware.md와tt-robot/hw/에 있습니다.
목차
- 1. 직관: 기다리는 축과 치는 축은 하는 일이 다르다
- 2. 공이 주는 시간: 상대가 친 뒤 1초 안의 일
- 3. 위치 축은 생각보다 느려도 된다
- 4. 치는 축: 저가 오픈소스 팔은 왜 느린가
- 5. 구조: 벨트 레일 + 스윙 축
- 6. moteus 로 통일한 이유
- 7. 눈: 카메라 fps 와 지연
- 8. 비용(추정 포함)
- 9. 1단계 시제품 사양
- 10. 라이선스: NC 를 붙이지 않는 이유
- 11. 한계
- 12. 다음 편으로
- 참고
1. 직관: 기다리는 축과 치는 축은 하는 일이 다르다
탁구 선수의 몸을 둘로 나눠 보면 이렇습니다. 발은 공이 올 자리로 미리 가서 기다리고, 팔은 공이 왔을 때 짧고 빠르게 휘두릅니다. 발이 조금 느려도 일찍 출발하면 늦지 않습니다. 팔은 순간 속도가 빨라야 하지만 움직이는 거리는 짧습니다.
로봇도 같습니다. 탁자 폭을 덮는 위치 축은 일찍 출발하는 것이 중요하고, 라켓 속도를 내는 스윙 축은 순간 가속이 중요합니다. 한 팔이 두 일을 다 하려 하면 비싸고 무거워집니다. 이 글은 두 일을 나누면 얼마나 싸고 단순해지는지를 숫자로 따집니다.
2. 공이 주는 시간: 상대가 친 뒤 1초 안의 일
DeepMind 데이터의 초기 공 상태(랠리 13,088개, 서브 2,704개) 가운데 로봇 쪽으로 오는 공 14,703개를 간이 물리로 날렸습니다. 로봇 쪽 탁자에 한 번 튀는 공은 계수 A 에서 11,723개, 계수 B 에서 10,431개였습니다(서브는 첫 바운드가 상대 쪽이라 대부분 빠집니다).
| 항목(5 / 50 / 95 백분위) | 계수 A | 계수 B |
|---|---|---|
| 상대 타격에서 내 쪽 첫 바운드까지 | 0.317 / 0.450 / 0.621 s | 0.323 / 0.462 / 0.629 s |
| 정점 높이(탁자 위) | 0.214 / 0.309 / 0.457 m | 0.234 / 0.337 / 0.498 m |
| 타격면(끝선 23 cm 뒤, y = −1.6 m) 도착 | 0.537 / 0.726 / 1.003 s | 0.528 / 0.721 / 1.011 s |
| 타격면에서 공 속력 | 2.15 / 2.86 / 3.83 m/s | 2.09 / 2.84 / 3.93 m/s |
공은 생각보다 느리게 도착합니다. 바운드와 공기저항이 속도를 깎기 때문입니다. 반면 짧은 공이 많아서, 타격면을 뒤로 물릴수록 두 번째 바운드 전에 칠 수 있는 공이 줄어듭니다.
| 타격면 | 칠 수 있는 공(계수 A) | (계수 B) |
|---|---|---|
| 끝선 y = −1.37 m | 89.7% | 93.0% |
| y = −1.6 m | 76.8% | 85.6% |
| y = −1.9 m | 49.1% | 68.6% |
3. 위치 축은 생각보다 느려도 된다
각 공마다 로봇이 홈 위치(x = 0, 높이 0.25 m)에서 출발하고, 「결정 시각」 이후에만 움직이며, 축마다 사다리꼴 속도 프로파일로 간다고 두었습니다. 라켓 반지름 7.5 cm 만큼은 덜 가도 맞는다고 보았습니다. 결정 시각은 카메라 지연과 예측이 굳는 시간을 합친 값입니다.
| 축 사양(최고 속도·가속) | 결정 0.1 s | 결정 0.2 s | 결정 0.3 s |
|---|---|---|---|
| 1.5 m/s·10 m/s² | 92.0–92.5% | 81.0–82.3% | 65.4–67.0% |
| 2 m/s·20 m/s² | 99.0–99.2% | 95.3–95.6% | 85.0–86.0% |
| 3 m/s·20 m/s² | 99.8–99.9% | 97.7–98.3% | 89.3–89.9% |
| 3 m/s·40 m/s² | 100% | 99.5–99.7% | 96.2–96.9% |
| 5 m/s·40 m/s² | 100% | 99.8% | 97.7–98.3% |
(범위는 계수 B 와 A 의 값입니다. 타격면 y = −1.6 m 에 닿는 공 A 9,025개, B 8,930개 기준이고, 가로와 높이 두 축이 모두 제때 닿아야 성공으로 셉니다.)
결정이 0.1 s 늦어질 때마다 같은 비율을 지키는 데 필요한 축 사양이 크게 올라갑니다. 결정 0.2 s 에서 공의 절반은 가로 축이 3.7 m/s² 만 내도 되지만, 95% 를 덮으려면 14.4 m/s², 그때 최고 속도 2.92 m/s 가 필요했습니다(계수 A). 카메라 지연을 줄이는 데 돈을 쓰는 편이 모터를 키우는 것보다 쌉니다.
아래 그림은 같은 계산을 공 5개로 움직여 본 것입니다. 그림을 누르면 공이 날아오는 동안 두 사양의 캐리지가 0.2 s 에 출발해 타격 지점으로 갑니다.
그림의 공 5개는 seed 0 으로 뽑은 600개를 같은 간이 물리로 날려 가로 위치가 고르게 퍼지도록 고른 것입니다. 가장자리 두 공(가로 −0.74 m, +0.90 m)에서 1.5 m/s·10 m/s² 캐리지는 0.79 s, 0.90 s 에 도착해 공(0.74 s, 0.81 s)보다 늦었고, 3 m/s·40 m/s² 캐리지는 0.50 s, 0.55 s 에 도착했습니다. 그림용으로 계산을 표준 라이브러리로 옮겼는데, 600개 표본의 도달 비율(결정 0.2 s 에서 82.7%, 95.2%, 99.2%)이 원래 계산과 1%p 안에서 맞았습니다. 그림은 가로 축만 그렸습니다.
4. 치는 축: 저가 오픈소스 팔은 왜 느린가
라켓 법선 방향의 1차원 충돌로 보면 공의 출구 속도는 v_out = e·v_in + (1+e)·v_r 입니다. 들어오는 공을 중앙값 2.8 m/s 로 두고
라켓 반발 계수 e 를 0.6–0.85 로 가정하면(추정), 필요한 라켓 속도는 다음과 같습니다.
| 목표 공 속도 | e = 0.85 | e = 0.6 |
|---|---|---|
| 5 m/s(연구용 공압 팔의 보통 반환) | 1.4 m/s | 2.1 m/s |
| 8 m/s | 3.0 m/s | 3.9 m/s |
| 12 m/s(같은 팔의 스매시) | 5.2 m/s | 6.4 m/s |
반환에는 라켓 1.5–4 m/s, 스매시에는 5–7 m/s 를 잡았습니다. 이것을 팔 끝 속도로 내 보면 저가 팔은 모자랍니다.
- SO-101: 서보 STS3215 의 무부하 속도는 12 V 판 45 rpm, 7.4 V 판 52 rpm 입니다. 도달 거리와 라켓을 합쳐 환산하면 라켓 끝 상한이 2.6–3.0 m/s, 부하가 걸리면 약 1.7 m/s 입니다(추정).
- PAROL6, AR4(스테퍼 팔): 1 m/s 미만입니다(추정). AR4 는 재판매를 막는 고유 라이선스이기도 합니다.
- OpenArm 2.0: 사양상 충분하지만(정격 속도로 약 7.9 m/s, 추정) 양팔 6,500 달러이고, 탁자 폭을 덮으려면 어차피 레일이 따로 필요합니다.
반대로 스윙 축 하나를 길이 0.30 m 의 팔로 만들면, 라켓 1.5–7 m/s 는 각속도 5–23 rad/s(48–220 rpm)입니다. 브러시리스 모터를 직구동하거나 1:4 로 감속하면 쉽게 나옵니다.
5. 구조: 벨트 레일 + 스윙 축
| 축 | 단계 | 움직임 | 모터 / 제어기 | 목표 |
|---|---|---|---|---|
| X 가로 레일 | 1 | 직선, 행정 1.7–1.8 m(레일 2.2–2.4 m) | ODrive D6374 150KV / moteus-n1, HTD5M 강선 벨트 | 3 m/s, 30–40 m/s², 이동 질량 2 kg 이하 |
| S 스윙 | 1 | 가로축에 평행한 축을 돌며 팔 0.25–0.30 m 가 원호를 그림 | mjbots mj5208 / moteus r4.11, 1:4 벨트 | 라켓 끝 1.5–7 m/s, ±120° |
| Y 깊이(또는 Z 높이) | 2 | 직선, 행정 0.4–0.6 m | D6374 / moteus-n1 | 2–3 m/s, 20–30 m/s² |
| 손목 두 축 | 3 | 라켓 면의 방향 | mj5208 / moteus-c1 | ±45–60° |
1단계의 스윙 팔은 원호를 그리므로 타이밍만 맞추면 높이(탁자 위 0.03–0.53 m)와 깊이를 한꺼번에 덮고, 라켓 속도도 이 축이 냅니다. DeepMind 로봇(6축 산업용 팔 + 2축 레일)에서 「어깨 하나」만 남긴 셈입니다. 2단계 축으로 깊이를 먼저 보는 이유는 2절의 표입니다. 타격면을 23 cm 뒤로 물리기만 해도 칠 수 있는 공이 7–13%p 줄었습니다.
축 크기도 계산했습니다(회전자 관성은 추정).
- 가로 축: 이동 질량 2 kg, 가속 40 m/s², 마찰 20 N 이면 필요한 힘은 100 N, 회전자 관성을 더해 약 110 N 입니다. 20T 풀리(반지름 15.9 mm)와 D6374 로 토크 1.75 Nm, 전류 약 32 A 가 필요해 피크 4.96 Nm 의 35% 입니다. 같은 일에 mj5208(피크 1.7 Nm)은 모자랍니다.
- 스윙 축: 라켓과 팔의 관성을 약 0.02 kg·m² 로 보면(추정), 0.1 s 안에 20 rad/s 에 닿는 데 4 Nm 가 필요합니다. mj5208 에 1:4 감속을 붙이면 피크 6.8 Nm 입니다.
6. moteus 로 통일한 이유
| 제어기 | 연속 / 피크 전류 | 통신 | 하드웨어 / 펌웨어 라이선스 | 가격 |
|---|---|---|---|---|
| moteus r4.11 | 무냉각 12 A, 냉각 32 A / 100 A | CAN-FD | Apache-2.0 / Apache-2.0 | 94 달러 |
| moteus-n1 | 9 A, 26 A / 100 A | CAN-FD, RS422 | Apache-2.0 / Apache-2.0 | 149 달러 |
| moteus-c1 | 5 A, 14 A / 20 A | CAN-FD | Apache-2.0 / Apache-2.0 | 69 달러 |
| ODrive S1 / Pro | 20–40 A / 80–100 A | CAN 2.0B | 비공개 / 비공개 | 149 / 229 달러 |
| SimpleFOC Mini | 최대 8 A | 없음 | MIT / MIT | 12 유로, 품절 |
- 하드웨어와 펌웨어가 모두 열려 있고 지금도 갱신됩니다. 조사 시점에 moteus 저장소의 마지막 push 는 2026-09-27 이었습니다. ODrive 는 v3.6 부터, Tinymovr 는 v3.1 부터 설계가 닫혔습니다. 같은 일이 생기면 우리 설계를 남이 재현할 수 없게 됩니다.
- CAN-FD 버스 하나로 모든 축을 묶습니다. 위치 제한, 전류 제한, 워치독 같은 안전 설정이 한 체계로 맞춰집니다.
- SimpleFOC 는 저전류 손목과 교육용으로는 좋지만, 가로 축 전류(30–50 A)에는 맞지 않습니다.
7. 눈: 카메라 fps 와 지연
지금 탁구 점수판 기능이 쓰는 카메라는 30 fps 입니다. 로봇의 눈으로는 부족합니다.
- 3 m/s 공은 한 프레임에 10 cm, 8 m/s 공은 27 cm 를 움직입니다.
- USB3 카메라가 프레임 3–4장을 버퍼에 쥐고 있으면 30 fps 에서 100–133 ms 가 늦어집니다(카메라 제조사 FAQ 기준). 이것만으로 0.2 s 결정 예산의 절반이 넘습니다. 같은 3–4장이 200 fps 라면 15–20 ms 입니다(계산).
- 타격점의 3차원 위치와 회전을 보려면 동기화된 카메라 두 대 이상(스테레오)이 필요합니다. DeepMind 는 125 Hz 카메라 두 대를 썼습니다.
| 카메라 | 센서 | 최대 fps | 인터페이스 | 가격 |
|---|---|---|---|---|
| Basler dart daA720-520uc | IMX287 | 523(720×540) | USB3 | 245 달러 |
| FLIR BFS-U3-04S2M-CS | IMX287 | 522 | USB3 | 541.50 달러 |
| OAK-D S2(스테레오 일체형) | OV9282 | 255(400p) | USB | 329 달러 |
| Raspberry Pi Global Shutter | IMX296 | 60 | CSI | 50 달러 |
1단계 이후에는 Basler dart 두 대를 200–250 fps 로 쓰는 것을 추천합니다. 두 대를 하드웨어 트리거로 맞출 수 있는지는 아직 확인하지 못했습니다(미확인). 전체 지연(사진에서 모터 명령까지)의 목표는 50 ms 이하이고, 타격 시각 오차는 ±10 ms 정도로 잡았습니다(공 3 m/s × 10 ms = 3 cm, 라켓 반지름보다 작음, 추정).
8. 비용(추정 포함)
| 묶음 | 내용 | 금액 |
|---|---|---|
| 구동(공식가) | D6374 119, moteus-n1 149, mj5208 74, moteus r4.11 94, CAN-FD 어댑터 39 달러 | 475 달러 |
| 카메라(공식가) | Basler dart 2대 | 490 달러 |
| 기구(추정) | 리니어 레일, 프레임, 벨트·풀리, 캐리지·스윙 팔, 라켓 | 410–1,150 달러 |
| 전원·안전(추정) | 36–44 V 전원과 회생 대책, 비상 정지·접촉기·리밋 스위치, 보호망 | 300–750 달러 |
| 렌즈·케이블·삼각대(추정) | 130–300 달러 | |
| 공 발사기와 공(추정) | 공개 설계 AIMY 한 대, 연습구 100개 | 530–960 달러 |
| 1단계 합계 | 약 2,300–4,100 달러 | |
| 2·3단계 추가(추정 포함) | 깊이 축, 손목 두 축 | 900–1,600 달러 |
| 전체 | 약 3,200–5,800 달러 |
카메라를 저가 USB2 카메라 두 대로 바꾸면 350–450 달러, 발사기 대신 사람이 손으로 던지면 500–900 달러가 줄어듭니다. 비교하면 OpenArm 양팔만 6,500 달러입니다.
9. 1단계 시제품 사양
- 가로 레일 1축: 행정 1.7–1.8 m, 3 m/s, 30–40 m/s², 이동 질량 2 kg 이하
- 스윙 1축: 팔 0.25–0.30 m, 라켓 끝 최대 5 m/s, 회전축은 탁자 위 약 0.25–0.30 m, 끝선 위
- 눈: 글로벌 셔터 200 fps 이상 스테레오, 결정 시각 0.2 s 이하
- 공: 공개 설계 발사기(AIMY)로 속도 3–8 m/s, 약한 회전부터
- 합격 기준: 발사기 설정마다 100구를 쳐서 접촉 80% 이상, 상대 쪽 반환 50% 이상. 이 목표값에는 아직 근거가 없습니다. 결과는 연구용 공압 팔의 반환률(75–77%)과 나란히 적습니다.
- 안전: 2 kg 캐리지가 3 m/s 로 움직이면 운동에너지가 9 J 입니다. 조사한 제어기 가운데 공인 STO(Safe Torque Off)를 내세운 제품은 없었으므로, 비상 정지는 외부 회로(버섯형 버튼 → DC 접촉기)로 두고 제어기의 위치·전류·속도 제한과 워치독을 겹으로 겁니다. 사람은 보호망 뒤에 있습니다.
10. 라이선스: NC 를 붙이지 않는 이유
TT Lab 은 영리 목적이 없는 프로젝트이지만, 우리가 공개하는 결과물에는 비영리 조건(NC)을 붙이지 않습니다. 오픈소스 하드웨어 협회(OSHWA)의 정의 1.0 은 쓰임새에 따른 차별을 금지하고(8항), 그 예로 사업에 쓰는 것을 막지 말라고 적습니다. NC 를 붙이면 오픈하드웨어로 인정받지 못합니다. 「우리가 비영리」라는 사실은 남의 NC 재료를 써도 된다는 뜻일 뿐, 우리 결과물을 NC 로 잠그자는 뜻이 아닙니다.
| 산출물 | 라이선스 | 이유 |
|---|---|---|
| 기계 CAD(편집 가능한 원본), 배선도, PCB | CERN-OHL-S-2.0 | 강한 상호주의로 개량판도 공개되게 합니다. OpenArm 도 같은 선택입니다. |
| 펌웨어, 제어, 비전 코드 | Apache-2.0 | moteus, DeepMind 공개 코드와 같아 섞기 쉽습니다. |
| 문서, 사진, 측정 데이터 | CC BY-SA 4.0 | 하드웨어의 S(상호주의)와 맞춥니다. |
가져다 쓸 재료의 의무도 함께 지킵니다. 발사기 AIMY 의 CAD 와 코드는 BSD-3(저작권 표시 유지), AIMY 회전 궤적 데이터는 DL-DE-BY-2.0(출처 표시), DeepMind 공 상태는 CC BY 4.0(출처 표시)입니다. 라이선스가 없는 공개 저장소는 파일을 복사하지 않고 아이디어만 참고합니다.
이 글에 쓴 데이터의 출처 표시. 2–3절의 계산은 Google DeepMind 의 competitive_robot_table_tennis 저장소에 공개된 초기 공 상태(rallies.json, serves.json, © 2025 Google LLC)를 입력으로 썼습니다. 이 데이터는 CC BY 4.0, 같은 저장소의 코드는 Apache-2.0 입니다. 우리는 로봇 쪽으로 오는 공(vel_y < 0)만 골라 간이 물리로 날렸고, 데이터 자체는 다시 배포하지 않으며 계산 결과만 실었습니다.
11. 한계
- 2–3절은 간이 물리입니다. 항력, 마그누스, 탁자 반발과 마찰이 모두 가정이고, 그래서 계수를 두 벌로 돌려 범위로 적었습니다. 2편의 MuJoCo 측정으로 다시 확인할 차례입니다.
- 결과는 서브를 뺀 랠리 공 위주이고, DeepMind 데이터는 초보부터 상급까지의 사람이 친 공입니다. 프로 선수의 스매시 분포는 들어 있지 않습니다.
- 라켓 반발 계수, 모터의 회전자 관성, 레일·프레임·전원의 가격은 추정입니다. 카메라 두 대의 동기, CAN-FD 다축 루프의 실제 주기, 카메라에서 모터까지의 실제 지연은 확인하지 못했습니다.
12. 다음 편으로
다음 단계는 이 구성을 MuJoCo 안에 먼저 만드는 것입니다. 레일과 스윙 축을 공 모델에 붙여 팔 길이, 회전축 높이, 2단계 축(깊이 대 높이)을 시뮬레이터로 정합니다. 로봇 팔의 좌표계와 역기구학 같은 기초는 「탁구 로봇 팔의 기초」 시리즈(목차)에서 함께 다룹니다. 시리즈의 다음 글인 4편은 잠시 탁구를 떠나, 같은 방식으로 PX4 드론을 파드에서 날린 실험을 다룹니다.
티티 한마디. 발은 일찍 출발하면 느려도 되고, 팔은 짧게 빨리 휘두르면 돼요. 로봇도 그렇게 나눠 주면 비싼 팔 하나보다 싸게 만들 수 있어요. 대신 눈이 빨라야 해요!
참고
모든 링크는 2026-10-18 에 열람해 열리는 것을 확인했습니다. 판매처 페이지 하나는 자동 접속을 막아 이번에 다시 열지 못했고, 그 가격은 같은 날 조사 문서의 값입니다.
- DeepMind 공개 데이터: https://github.com/google-deepmind/competitive_robot_table_tennis(초기 공 상태 CC BY 4.0, 코드 Apache-2.0), 논문: https://arxiv.org/abs/2408.03906, https://arxiv.org/abs/2309.03315
- 공압 근육 팔(반환률·스매시 속도): https://arxiv.org/abs/2006.05935, PAMY2 설계: https://github.com/intelligent-soft-robots/pamy2
- 경량 5자유도 팔: https://arxiv.org/abs/2505.01617
- 공 발사기 AIMY: https://arxiv.org/abs/2210.06048, CAD: https://github.com/intelligent-soft-robots/ball_launcher_hardware
- moteus: https://github.com/mjbots/moteus, https://mjbots.com/products/moteus-r4-11, https://mjbots.com/products/mj5208
- SO-101: https://github.com/TheRobotStudio/SO-ARM100, OpenArm 2.0 모터: https://docs.openarm.dev/hardware/openarm-2.0/motor
- 카메라: Basler daA720-520uc https://www.baslerweb.com/en-us/shop/daa720-520uc-cs-mount/(이번 확인 때 자동 접속 차단), 카메라 지연 FAQ https://support.stereolabs.com/hc/en-us/articles/206918319-What-is-the-latency-of-the-ZED-camera
- 라이선스: OSHWA 오픈소스 하드웨어 정의 1.0 https://www.oshwa.org/definition/, CERN-OHL v2 https://cern-ohl.web.cern.ch/, CC BY 4.0 https://creativecommons.org/licenses/by/4.0/