TT Lab
Blog

한국어 English 日本語 中文

Get started
Blog

Blog

Can a Table Tennis Robot Be Made as Open Hardware: Rails, Swing Axis, Camera, and Licenses

Status: Draft (2026-10-18), calculations and research. Hardware has neither been purchased nor built yet. The figures in this post fall into three categories. Calculationsare values directly generated by our script (flight_window.py, axis_budget.py), taking the initial ball states from DeepMind's public dataset as input. The physics model uses a simplified model (drag, Magnus effect, impact bounds) rather than MuJoCo, and was run with two sets of coefficients (A: with Magnus, B: without) to express ranges. Researchvalues were confirmed by checking official vendors, papers, and repositories on 2026-10-18, and prices reflect what was listed on official vendors on that day. Estimatesare values that have a basis but could not be verified, and are labeled as such. Raw data can be found in the working directories tt-robot/hardware.md and tt-robot/hw/ .

Table of Contents

1. Intuition: The Waiting Axis and the Hitting Axis Have Different Jobs

If we divide a table tennis player's body into two parts, it looks like this: the feet go early and waitat the spot where the ball will arrive, while the arm swings short and fast when the ball arrives. Even if the feet are slightly slow, leaving early ensures they aren't late. The arm needs high instantaneous speed, but the moving distance is short.

The same applies to robots. The positional axis, which covers the width of the table, needs to start early, while the swing axis, which generates racket speed, requires instantaneous acceleration. If a single arm tries to do both jobs, it becomes expensive and heavy. This post calculates in numbers how much cheaper and simpler it becomes when the two jobs are separated.

2. Time Provided by the Ball: Events within 1 Second After the Opponent's Shot

Out of the initial ball states in the DeepMind dataset (13,088 rallies and 2,704 serves), 14,703 balls heading toward the robot side were simulated using simplified physics. Balls bouncing once on the robot's side of the table numbered 11,723 for coefficient A and 10,431 for coefficient B (serves mostly move fast because their first bounce is on the opponent's side).

상대가 친 뒤 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
Figure: First bounce after opponent's shot, arrival time at hitting surface, and camera buffer latency
Metric (5th / 50th / 95th Percentile) Coefficient A Coefficient B
From opponent hit to first bounce on my side 0.317 / 0.450 / 0.621 s 0.323 / 0.462 / 0.629 s
Peak height (above table) 0.214 / 0.309 / 0.457 m 0.234 / 0.337 / 0.498 m
Arrival at hitting surface (23 cm behind endline, y = −1.6 m) 0.537 / 0.726 / 1.003 s 0.528 / 0.721 / 1.011 s
Ball speed at hitting surface 2.15 / 2.86 / 3.83 m/s 2.09 / 2.84 / 3.93 m/s

Balls arrive slower than expected because bounces and air resistance reduce their speed. On the other hand, since there are many short balls, moving the hitting surface further back reduces the number of balls that can be hit before the second bounce.

Hitting Surface Hittable Balls (Coefficient A) (Coefficient B)
Endline 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. The Positional Axis Can Be Slower Than Expected

For each ball, it was assumed that the robot starts from the home position (x = 0, height 0.25 m), moves only after the "decision time," and follows a trapezoidal velocity profile per axis. It was assumed that a hit is successful even if it misses slightly by the 7.5 cm radius of the racket. The decision time is the combined value of camera latency and prediction stabilization time.

Axis Specs (Max Speed / Acceleration) Decision 0.1 s Decision 0.2 s Decision 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%

(Ranges represent values for coefficients B and A. Based on 9,025 balls for A and 8,930 balls for B reaching the hitting surface at y = −1.6 m, counting a success only when both horizontal and height axes reach on time.)

결정이 늦을수록 가로 축이 빨라야 합니다 제때 닿는 공의 비율(%), 계수 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 이하입니다.
Figure: Reachable ratio according to decision time and axis specifications

Every time the decision is delayed by 0.1 s, the axis specifications required to maintain the same success rate increase significantly. At a 0.2 s decision time, half of the balls require the horizontal axis to produce only 3.7 m/s², whereas covering 95% required 14.4 m/s², with a corresponding maximum speed of 2.92 m/s (Coefficient A). Spending money to reduce camera latency is cheaper than upgrading the motors.

The figure below illustrates the same calculation run with 5 balls. Clicking the figure shows the carriages of both specifications departing at 0.2 s to reach the hitting point while the balls are in flight.

레일 위 캐리지가 공을 기다리러 가는 시간 위에서 본 탁자. 공 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)를 간이 물리로 날린 계산입니다. × 는 첫 바운드. 가로 축만 그렸고 높이 축은 생략했습니다.
Figure: Movement of carriages under two specifications on rails going to wait for 5 balls

The 5 balls in the figure were selected from 600 sampled with seed 0 and simulated using the same simplified physics to ensure an even distribution of horizontal positions. For the two edge balls (horizontal positions −0.74 m and +0.90 m), the 1.5 m/s · 10 m/s² carriage arrived at 0.79 s and 0.90 s, lagging behind the balls (0.74 s and 0.81 s), whereas the 3 m/s · 40 m/s² carriage arrived at 0.50 s and 0.55 s. For visualization purposes, the calculation was ported to a standard library, and the arrival rates for the 600 samples (82.7%, 95.2%, and 99.2% at 0.2 s decision time) matched the original calculation within 1 percentage point. The figure plots the horizontal axis only.

4. The Hitting Axis: Why Low-Cost Open-Source Arms Are Slow

Viewed as a 1D collision along the racket normal direction, the exit velocity of the ball is v_out = e·v_in + (1+e)·v_r . Assuming an incoming ball median speed of 2.8 m/s and a racket restitution coefficient e of 0.6–0.85 (estimated), the required racket speed is as follows:

Target Ball Speed e = 0.85 e = 0.6
5 m/s (typical return for research pneumatic arms) 1.4 m/s 2.1 m/s
8 m/s 3.0 m/s 3.9 m/s
12 m/s (smash with the same arm) 5.2 m/s 6.4 m/s

We targeted 1.5–4 m/s for returns and 5–7 m/s for smashes. Translating this into arm tip speeds reveals that low-cost arms fall short.

Conversely, if a single swing axis is built with a 0.30 m long arm, a racket speed of 1.5–7 m/s corresponds to an angular velocity of 5–23 rad/s (48–220 rpm). This is easily achievable by direct-driving a brushless motor or using a 1:4 reduction gear.

5. Structure: Belt Rails + Swing Axis

Axis Stage Motion Motor / Controller Target
X Horizontal Rail 1 Linear, stroke 1.7–1.8 m (rail 2.2–2.4 m) ODrive D6374 150KV / moteus-n1, HTD5M steel-core belt 3 m/s, 30–40 m/s², moving mass under 2 kg
S Swing 1 Arm 0.25–0.30 m draws an arc rotating on an axis parallel to the horizontal axis mjbots mj5208 / moteus r4.11, 1:4 belt Racket tip 1.5–7 m/s, ±120°
Y Depth (or Z Height) 2 Linear, stroke 0.4–0.6 m D6374 / moteus-n1 2–3 m/s, 20–30 m/s²
Two Wrist Axes 3 Racket face orientation mj5208 / moteus-c1 ±45–60°

Since the phase-one swing arm traces an arc, timing alone allows it to simultaneously cover height (0.03–0.53 m above the table) and depth, while this axis also generates the racket speed. This is essentially leaving only "a single shoulder" from the DeepMind robot (6-axis industrial arm + 2-axis rail). The reason depth is prioritized with a secondary axis is due to the table in Section 2. Even just moving the hitting surface back by 23 cm reduced hittable balls by 7–13 percentage points.

Axis dimensions were also calculated (rotor inertia is estimated).

6. Why We Unified on moteus

Controller Continuous / Peak Current Communication Hardware / Firmware License Price
moteus r4.11 12 A uncooled, 32 A cooled / 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 Closed / Closed $149 / $229
SimpleFOC Mini Up to 8 A None MIT / MIT €12, out of stock

7. Eyes: Camera FPS and Latency

The camera currently used for the table tennis scoreboard feature runs at 30 fps. This is not enough for a robot's eyes.

Camera Sensor Max FPS Interface Price
Basler dart daA720-520uc IMX287 523(720×540) USB3 $245
FLIR BFS-U3-04S2M-CS IMX287 522 USB3 $541.50
OAK-D S2 (Integrated Stereo) OV9282 255 (400p) USB $329
Raspberry Pi Global Shutter IMX296 60 CSI $50

After phase 1, we recommend using two Basler dart cameras at 200–250 fps. We have not yet verified whether the two cameras can be synchronized via hardware trigger (unverified). The target total latency (from image capture to motor command) is set to 50 ms or less, with a hit time error of about ±10 ms (ball 3 m/s × 10 ms = 3 cm, smaller than the racket radius, estimated).

8. Cost (Including Estimates)

Category Details Amount
Actuation (Official Prices) D6374 $119, moteus-n1 $149, mj5208 $74, moteus r4.11 $94, CAN-FD adapter $39 $475
Cameras (Official Prices) 2x Basler dart $490
Mechanics (Estimated) Linear rail, frame, belts/pulleys, carriage/swing arm, racket $410–1,150
Power & Safety (Estimated) 36–44 V power supply and regeneration countermeasures, emergency stop/contactors/limit switches, protective mesh $300–750
Lenses, Cables, Tripods (Estimated) $130–300
Ball Launcher & Balls (Estimated) 1 open-design AIMY, 100 practice balls $530–960
Phase 1 Total Approx. $2,300–4,100
Phases 2 & 3 Additions (Including Estimates) Depth axis, two wrist axes $900–1,600
Total Approx. $3,200–5,800

Switching to two low-cost USB2 cameras reduces costs by $350–450, and having a human throw by hand instead of using a launcher saves $500–900. For comparison, just the OpenArm dual arms cost $6,500.

9. Phase 1 Prototype Specifications

10. Licensing: Why We Do Not Use NC

Although TT Lab is a non-profit project, we do not attach non-commercial (NC) conditions to our published outputs. The Open Source Hardware Association (OSHWA) Definition 1.0 prohibits discrimination against fields of endeavor (Clause 8), stating that commercial use must not be blocked. Attaching NC disqualifies a project from being recognized as open hardware. The fact that "we are non-profit" simply means we are allowed to use other people's NC materials; it does not mean we should lock our own outputs behind NC.

Output License Reason
Mechanical CAD (editable sources), schematics, PCBs CERN-OHL-S-2.0 Strong copyleft ensures modified versions are also published. OpenArm makes the same choice.
Firmware, control, and vision code Apache-2.0 Matches moteus and DeepMind public code, making integration easy.
Documentation, photos, measurement data CC BY-SA 4.0 Aligns with the hardware's S (Share-Alike).

We also comply with the obligations of materials we incorporate. The AIMY launcher's CAD and code are BSD-3 (retain copyright notices), AIMY rotational trajectory data is DL-DE-BY-2.0 (attribution), and DeepMind ball states are CC BY 4.0 (attribution). For public repositories without a license, we reference only the ideas without copying files.

Attribution of data used in this article. Calculations in Sections 2–3 used initial ball states (rallies.json, serves.json, © 2025 Google LLC) published in Google DeepMind's competitive_robot_table_tennis repository as inputs. This data is under CC BY 4.0, and the code in the same repository is under Apache-2.0. We filtered for balls coming toward the robot (vel_y < 0) and simulated them using simplified physics; the data itself is not redistributed, and only calculation results are included.

11. Limitations

12. Moving to the Next Part

The next step is to build this configuration inside MuJoCo first. By attaching the rail and swing axis to the ball model, arm length, rotation axis height, and secondary axes (depth vs. height) will be determined via simulation. Basics such as robot arm coordinate systems and inverse kinematics are covered together in the "Table Tennis Robot Arm Basics" series (table of contents). The next article in the series, Part 4, temporarily leaves table tennis behind to discuss experiments flying a PX4 drone from a pod using the same approach.

TT Nibble: If your feet start early, they don't need to be fast, and if your arm swings shortly and quickly, that works too. If you divide the work among the robot parts like that, you can build it cheaper than a single expensive arm. But your eyes have to be fast!

References

All links were verified as accessible on 2026-10-18. One vendor page blocked automated access and could not be re-opened this time, so its price is the value from the research document of that same date.

Sign in to like

Comments

No comments yet.

Sign in to leave a comment