autoplay
theme
2026 · active · Robotics · Tool

TD Robot Control

A UFactory 850 (UF850) digital twin inside TouchDesigner. Preview a move against the show's own visuals, then play it on the hardware.

Robot simulation normally lives in its own window, next to the show. This one lives in it, and doubles as the desk the arm is run from.

The UF850 in its vitrine at the US Open, filming visitors as they pose, with their clips tiled on an LED wall
US Open 2026: the arm films each visitor; the wall plays the clips.

The twin

A robot simulator shows the arm on an empty grid. This twin shows the move against the show's own visuals.

The live joint angles come back into TouchDesigner as a 3D rig, in the same scene as the LED content, the particles and the show camera. The arm stops being a separate discipline and becomes another element in a scene the studio already lights, composites and cues.

The show render and the twin, side by side, playing the same clip.

The control center

Moves are authored in Blender, limit-checked on export, and imported as an indexed library. Each one can play two ways: on the twin alone as preview, or on the hardware through the Go worker with the twin tracking it live.

Measured on a real playback, the worker holds an effective send rate of 99.972 Hz against its 100 Hz target.

At the 2026 US Open the library holds four moves cut for different standing heights, and an iPad picks between them between guests.

The arm in its vitrine on the show floor, US Open wall behindThe arm with the camera mounted on its end effector, Cadillac vehicles behind
The operator view during playback. Clip list, booth camera, twin.
TouchDesigner network showing robot agent, animation importer and animation control operators
The TouchDesigner network, live joint angles in the CHOP.
The camera rig under test in the studio.

Timing

TouchDesigner's Python shares the main thread with the rest of the show, so playback drifts under load.

So the clock moved out: a Go worker owns playback timing and the command socket, TouchDesigner keeps previz and cueing. The case that took longest to get right was not a crash. It was a crash with the arm still moving, so the worker holds a 3s lease and stops the arm itself if TouchDesigner goes quiet.

Where it came from

This is the second version of an older tool. The first was Robot Twin, and it exists because a fluid simulation needed the arm's motion: on the Astral Twin fluid editions the paint was driven by where the arm was, so something had to hand the visuals a reliable, live answer to that question.

Robot Twin did it by rigging the arm in TouchDesigner, taking joint rotations live, and solving the tool's XYZ out of the rig rather than asking the controller for it.

TouchDesigner previz of two arms on trusses beside a tall LED wall, a stream of paint running between their tool tips
Robot Twin on Astral Twin: the paint comes off the arm tips.

Implementation

  • Timing — velocity-continuous 100 Hz retime; clips over velocity or acceleration limits are slowed uniformly, never clamped per joint
  • Transport — Modbus TCP, Mode 1 ServoJ; one motion-command owner: TouchDesigner hands its socket to the worker
  • Show control — operator UI, iPad and StreamDeck cueing, Prometheus metrics
Role
Creator and lead engineer
Team
iPad web control and parts of the control stack, Matt Ross
Built with
TouchDesigner · Go · Python · Modbus TCP · Prometheus
Robot
UF850
Status
Active. Running the Cadillac photo booth at the 2026 US Open.
Authoring
xArm Blender Animation, rig setup, limit validation, CSV export · Houdini Robot Toolkit, the curve-driven route to the same CSV
Sibling
Motion-Core, the multi-robot, sim-gated path to the same hardware
Source
Company-owned and private. This page describes architecture and engineering decisions, not implementation.
Tools
Go · TouchDesigner · Python · Modbus TCP · xArm SDK · Prometheus