An interactive, user-controllable 3D simulation of a Universal Robots UR10e, built with Three.js and running entirely in the browser. It exists so students can rehearse a programme before booking time on the real arm in the TH OWL robotics lab — same motion limits, same collision behaviour, same protective stop, no risk to the hardware.
The arm renders with the official Universal Robots graphical-documentation mesh, meshopt-compressed to 2.1 MB. A lightweight primitive skin appears instantly and is swapped out once the real mesh loads, so the page is usable before the download finishes.
- Three.jsRendering · scene graph · GLB loading
- three-mesh-bvhExact mesh-distance collision queries
- PyodideClient-side Python for the code lab
- Type
- Individual project
- Context
- TH OWL robotics lab
- Built with
- Three.js, JavaScript, Pyodide, Vite
- Licence
- MIT
- Live demo
- ur10e-simulator
Kinematics — exact, not approximate
The joint chain is built from the official UR10e DH parameters, so forward kinematics match the real controller. A headless smoke test verifies the scene graph against the analytic DH product and the published zero-pose flange position; a second test proves every link of the official mesh registers onto the DH chain within 0.05 mm. Registration is computed rather than hand-tuned.
Kinematics are derived from the scene graph itself and numerically differentiated for the Jacobian, so the maths can never drift from what is on screen. Cartesian jog runs through damped-least-squares IK.
Motion and safety
Per-joint velocity limits and acceleration-limited trapezoidal profiles mean joints ramp up, cruise and decelerate into targets without overshoot. Self-collision, floor and track-rail checks run true distance queries against a simplified copy of the real link meshes with a 5 mm clearance, so the stop fires exactly when the visible surfaces meet. A predicted collision reverts to the last safe pose and latches a protective stop — press Reset to resume, exactly like a real UR.
Code lab
The pendant’s Code tab runs student programmes against the simulated robot. Python scripts written for ur_rtde run unmodified — rtde_control, rtde_receive and dashboard_client are mocked in-browser via Pyodide, so moveJ, moveL, servoJ and state reads all behave. Output and tracebacks stream to a built-in console, and common beginner mistakes get targeted hints: degrees versus radians, millimetres versus metres, desktop-only imports, runaway loops.
Grasshopper definitions can’t execute in a browser, so the code lab instead plays exported target programmes — JSON joint or pose moves, or a plain CSV of joint rows.
Simulated
- Official UR10e DH parameters
- Trapezoidal motion profiles
- Per-joint velocity limits
- Damped-least-squares IK
- Exact mesh collision (BVH)
- Protective stop
- Emergency stop
- Speed override
Catalogue
- OnRobot 2FG7 gripper
- Vacuum gripper
- Welding torch
- Force-torque sensor
- Wrist camera
- ToF proximity sensor
- Graspable bricks
- 2 m linear track (7th axis)