TT Lab
요금제

한국어

시작하기
블로그

블로그

탁구 로봇을 오픈하드웨어로 만들 수 있을까: 레일, 스윙 축, 카메라, 그리고 라이선스

상태: 초안 (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초 안의 일

DeepMind 데이터의 초기 공 상태(랠리 13,088개, 서브 2,704개) 가운데 로봇 쪽으로 오는 공 14,703개를 간이 물리로 날렸습니다. 로봇 쪽 탁자에 한 번 튀는 공은 계수 A 에서 11,723개, 계수 B 에서 10,431개였습니다(서브는 첫 바운드가 상대 쪽이라 대부분 빠집니다).

상대가 친 뒤 1초 안에 일어나는 일 막대는 공의 5–95% 범위, 굵은 눈금은 중앙값(계수 A, 간이 물리). 내 쪽 첫 바운드: 0.32–0.62 s, 중앙 0.45 s 타격면(y = −1.6 m) 도착: 0.54–1.00 s, 중앙 0.73 s 결정 시각 0.2 s 카메라 버퍼 3–4 프레임이 만드는 지연 30 fps: 100–133 ms 200 fps: 15–20 ms 0.0 0.2 0.4 0.6 0.8 1.0
그림: 상대가 친 뒤의 첫 바운드, 타격면 도착 시각과 카메라 버퍼 지연
항목(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개 기준이고, 가로와 높이 두 축이 모두 제때 닿아야 성공으로 셉니다.)

결정이 늦을수록 가로 축이 빨라야 합니다 제때 닿는 공의 비율(%), 계수 A(마그누스 있음) 기준 60 70 80 90 100 0.1 s 0.2 s 0.3 s 결정 시각(상대가 친 뒤) 1.5 m/s·10 m/s² 2 m/s·20 m/s² 3 m/s·20 m/s² 3 m/s·40 m/s² 5 m/s·40 m/s² 3 m/s·40 m/s², 0.2 s: 99.7% 계수 B(마그누스 없음)와의 차이는 모든 칸에서 1.6%p 이하입니다.
그림: 결정 시각과 축 사양에 따른 도달 비율

결정이 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개를 차례로 보냅니다(3배 느리게). ▶ 누르면 재생 네트 타격면 y = −1.6 m 의 가로 레일 상대 쪽 1 2 3 4 5 공을 기다리는 가로 축 3 m/s·40 m/s² 1.5 m/s·10 m/s² 라켓 반지름 7.5 cm 두 축 모두 상대가 친 뒤 0.2 s(결정 시각)에 출발합니다. 공 1/5타격면 도착 0.89 s가로 위치 +0.13 m3 m/s: 0.27 s 제때1.5 m/s: 0.34 s 제때 공 2/5타격면 도착 0.70 s가로 위치 -0.38 m3 m/s: 0.38 s 제때1.5 m/s: 0.55 s 제때 공 3/5타격면 도착 0.96 s가로 위치 +0.58 m3 m/s: 0.44 s 제때1.5 m/s: 0.68 s 제때 공 4/5타격면 도착 0.74 s가로 위치 -0.74 m3 m/s: 0.50 s 제때1.5 m/s: 0.79 s 늦음 공 5/5타격면 도착 0.81 s가로 위치 +0.90 m3 m/s: 0.55 s 제때1.5 m/s: 0.90 s 늦음 공의 길은 DeepMind 공개 초기 상태(CC BY 4.0)를 간이 물리로 날린 계산입니다. × 는 첫 바운드. 가로 축만 그렸고 높이 축은 생략했습니다.
그림: 레일 위 두 사양의 캐리지가 공 5개를 기다리러 가는 움직임

그림의 공 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 를 잡았습니다. 이것을 팔 끝 속도로 내 보면 저가 팔은 모자랍니다.

반대로 스윙 축 하나를 길이 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 줄었습니다.

축 크기도 계산했습니다(회전자 관성은 추정).

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 유로, 품절

7. 눈: 카메라 fps 와 지연

지금 탁구 점수판 기능이 쓰는 카메라는 30 fps 입니다. 로봇의 눈으로는 부족합니다.

카메라 센서 최대 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단계 시제품 사양

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. 한계

12. 다음 편으로

다음 단계는 이 구성을 MuJoCo 안에 먼저 만드는 것입니다. 레일과 스윙 축을 공 모델에 붙여 팔 길이, 회전축 높이, 2단계 축(깊이 대 높이)을 시뮬레이터로 정합니다. 로봇 팔의 좌표계와 역기구학 같은 기초는 「탁구 로봇 팔의 기초」 시리즈(목차)에서 함께 다룹니다. 시리즈의 다음 글인 4편은 잠시 탁구를 떠나, 같은 방식으로 PX4 드론을 파드에서 날린 실험을 다룹니다.

티티 한마디. 발은 일찍 출발하면 느려도 되고, 팔은 짧게 빨리 휘두르면 돼요. 로봇도 그렇게 나눠 주면 비싼 팔 하나보다 싸게 만들 수 있어요. 대신 눈이 빨라야 해요!

참고

모든 링크는 2026-10-18 에 열람해 열리는 것을 확인했습니다. 판매처 페이지 하나는 자동 접속을 막아 이번에 다시 열지 못했고, 그 가격은 같은 날 조사 문서의 값입니다.

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

댓글

아직 댓글이 없습니다.

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