TT Lab
Blog

한국어 English 日本語 中文

Get started
Blog

Blog

Playing Table Tennis with a Humanoid Robot Upper Body: A Baseline Placing the Unitree G1 in a Simulator with Human Speed Limits

Status: Draft (2026-10-18), measured. All numbers in the screens and text are values from inside the simulator, and camera frame rate, latency, and noise are assumed values. The robot in this post moves using a classical, non-learned planner. Evaluation used the same 500 evaluation balls (seed 0) and the same three conditions as in Part 7 (true state, 120 Hz with 30 ms latency, and 120 Hz with 100 ms latency). Values in parentheses are half-widths of the 95% confidence intervals. The robot model is from MuJoCo Menagerie unitree_g1(Unitree official g1_29dof_rev_1_0, BSD-3-Clause), and the original files were not modified. Since joint speed limits were not present in the model, official Unitree URDF values were used. The video was rendered on 2026-10-18 as a temporary pod on a single mini PC node in a home lab Kubernetes cluster (CPU only, peak memory 1.55 GiB). The environment used MuJoCo 3.16.0, Python 3.12.15, numpy 2.5.4, Mesa 25.0.7 (OSMesa), and encoding was done with ffmpeg 9.0.2 (libx264).

Table of Contents

1. Why a Humanoid Shape?

The robots in Parts 5 through 9 featured a 2-DOF gantry and a 2-DOF wrist attached to the edge of the table. This is the easiest shape for receiving balls. However, the next goal of this lab is to create stronger robots by making them play matches against each other, and for those matches to resemble human table tennis, the robots must also look human.

Therefore, we chose the upper body of the widely used humanoid robot Unitree G1. Instead of legs, we attached a single left-right sliding axis. This axis simulates a table tennis player's sidestepping movement toward the ball.

We added one more condition: the robot must not move faster than a human. Robot joints can be several times faster than human joints, but a robot that wins using such speeds is not a "robot playing like a human." We applied literature-based human upper limits to joint angular velocities, left-right travel speed, acceleration, and racket speed, using the smaller of the robot limit and the human limit.

2. Video Preview

2.1 A Single Ball from the Side-Rear

Video: G1 upper body returning evaluation ball #53 (4x slow motion)

Flying from the opponent's baseline, the ball was intercepted at 0.789 s after the robot shifted 0.37 m via the left-right axis. The racket speed at the moment of impact was 1.27 m/s. The orange dots show the trajectory of the ball. The torso turns following the ball, and the elbow and wrist position the racket face.

2.2 The Same Ball from Above

Video: Top-down view of the same ball, clearly showing the movement of the left-right axis (4x slow motion)

From the top view, it is easy to see that the robot moves in advance to the position where the ball will arrive. This "moving in advance" is the behavior that makes the biggest difference in this post (Section 4).

2.3 Four Different Balls

Video: Sequential view of four different evaluation balls being returned, seen from the opponent's perspective (2x slow motion)

We chained together a ball where the left-right axis moved significantly to the right (+), a ball that moved 0.82 m to the left (−), a center ball, and a short bouncing ball. All four balls were successfully returned. The balls were chosen from the first 80 successful ones in descending order of left-right axis movement, and the selection rules and results are saved to files by the rendering script.

3. Robot and Planner

Item Value
Arm 7 DOF (3 shoulders, 1 elbow, 3 wrists)
Waist 3 DOF (yaw, roll, pitch)
Left-Right Axis Travel range ±0.9 m, speed 1.5 m/s, acceleration 10 m/s²
Pelvis Position 48 cm behind the baseline (chosen by scanning 28–68 cm; differences are within sampling error)
Mass Model 33.3 kg (official spec approx. 35 kg)
Planner Same structure as Part 7 "Hybrid Nominal": Ball prediction → determine hit time, position, face, speed → inverse kinematics → joint trajectory, no learning

The planner uses the same ball prediction and hit determination as the gantry, replacing only the final step with inverse kinematics for the 11 joints of the G1 (including the left-right axis). Re-planning was configured to start from the previous posture, which raised the true state success rate from 88.5% to 94.0% on training balls.

3.1 Human Limits

Joint Robot Limit (URDF, rad/s) Human Upper Limit (rad/s)
Waist yaw 32 10.1
Waist roll/pitch 37 10.1 (using trunk rotation value instead, estimated)
Shoulder pitch / roll / yaw 37 13.8 / 4.8 / 16.7
Elbow 37 5.7
Wrist roll / pitch / yaw 37 / 22 / 22 18.3 / 9.3 / 3.9

4. Results: 500 Evaluation Balls

Configuration True State 120 Hz · 30 ms 120 Hz · 100 ms
7-DOF arms · waist used · left-right axis (default) 91.4% (±2.5) 72.0% (±3.9) 27.4% (±3.9)
Same config, no human limits 92.4% 74.4% 27.2%
7-DOF arms · waist locked · left-right axis 83.8% 67.8% 26.6%
5-DOF arms · waist used · left-right axis 83.4% 70.2% 25.6%
7-DOF arms · waist used · No left-right axis 66.4% 60.4% 26.6%
5-DOF arms · waist locked · no left-right axis 40.4% 31.6% 12.8%
Gantry classical baseline (Part 5) 61.6% 59.2% 26.6%
Gantry hybrid nominal (Part 7, identical planning structure) 83.2% 80.6% 53.6%
Gantry learned hybrid (Part 7, 3 seeds) 84.8% 83.8% 58.2%

Three things are apparent.

  1. The left-right axis makes the biggest difference. Removing the left-right axis increases "unreachable balls" from 4.6% to 23.8% in the true state and drops the success rate from 91.4% to 66.4%. No matter how long the arms are, they cannot cover the 1.525 m table width from a stationary position. This is the same reason humans sidestep.
  2. The cost of human limits is smaller than expected. When comparing the same balls paired before and after limits, 2.0–8.2% of balls were missed in the default configuration. Locking the waist increases this to 7.6–14.4%, because the arms alone must swing fast.
  3. High latency makes it weaker than the gantry. At 100 ms latency, the default configuration drops to 27.4%, half that of the same-structured gantry (53.6%). Among the 500 balls, 45.4% failed due to "timing and prediction" (63% of failures). The heavy torso and left-right axis fail to keep up with delayed plan updates. This is the first area to be addressed through learning.

4.1 Failure Breakdown by Cause

Default configuration, human limits applied, ratio out of 500 balls. Only one cause is counted per ball.

Condition Unreachable Joint Limit (Robot) Joint Limit (Human) Posture (Face Orientation) Timing & Prediction Total Failures
True State 4.6% 0.4% 2.4% 0.0% 1.2% 8.6%
120 Hz · 30 ms 4.0% 1.2% 10.6% 0.0% 12.2% 28.0%
120 Hz · 100 ms 10.6% 1.4% 15.2% 0.0% 45.4% 72.6%

38% of failures at 30 ms camera latency were caused by "hitting human joint limits." These are cases where the robot must move faster than a human to catch up to a ball discovered late. Human players miss these balls as well.

5. How Fast Must the Left-Right Axis Be?

Left-Right Axis Speed & Acceleration True State Success Rate
1.0 m/s 88.6%
1.5–3.0 m/s 91.4–92.4%
3 m/s · 40 m/s² 68.4%

Faster was not necessarily better. When acceleration reached 40 m/s² (approx. 4 g), the torso shifted significantly, and arm joint torques could not withstand the reaction force (torque saturation occurred in 35% of control cycles). The human range (speed ≤ 2.2 m/s, acceleration ≤ 10 m/s²) of 1.5–2.0 m/s and 10 m/s² fell into the optimal range.

The mass moved by the axis is 38.5 kg, combining the entire G1, racket, and carriage (assumed 5 kg). Pushing at 10 m/s² theoretically requires 385 N, and measured values in the simulator were 468 N at the 95th percentile with a maximum of 520 N. Removing the legs and mounting only the upper body reduces the mass to 24.1 kg, lowering the required force to about 2/3.

6. How Fast Can the Racket Be Swung?

Maximum racket speed (planned hitting posture, face normal direction) calculated using joint speed limits alone. This upper limit does not account for the time required for torque to accelerate up to that speed.

Configuration Robot Limit Human Limit
Default Configuration Center 38.8 m/s Center 9.6 m/s (5–95%: 5.5–18.9)
5-DOF arms · waist locked — Center 2.4–3.4 m/s

The 1.5–4 m/s required to return the ball is achieved in almost all postures with the default configuration. The 5–7 m/s required for a smash is achieved in most postures only with the 7-DOF arm and waist-used configuration under human limits. However, the current planner's racket speed at the moment of impact is a central 1.06 m/s, which is essentially blocking and returning the ball. Hitting hard is left for learning.

7. Fast Execution on GPU

Training requires running numerous balls simultaneously, so we also ran the same scenario in MuJoCo Warp (GPU). Comparing against CPU MuJoCo for 0.5 s, even during large robot movements, the ball position difference was a median of 5 µm and the joint difference was a maximum of 1.1×10⁻⁵ rad.

Simultaneous Worlds Physics Steps per Second (RTX 4060)
256 630K
1,024 1.33M
4,096 1.66M
8,192 1.67M

This is about 1/4 of the gantry (6.57M), due to increased contact calculations from the many joints and heavy torso. Since this was measured only once, variance has not been verified.

8. Next: Learning and Robot-to-Robot Matches

Video: Two G1 units placed on opposite sides of a table tennis table. First look at the competitive environment

Unmeasured Factors and Limitations

Sign in to like

Comments

No comments yet.

Sign in to leave a comment