All projects

UR10e Simulator

A browser-based Universal Robot with a real teach pendant

Fig. The full interface — attachment catalogue, 3D viewport and teach pendant. Jog the joints, mount an attachment, watch it collide. Hosted on GitHub Pages and embedded here. Open it in its own tab ↗

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.

Try the live demo →

  1. Three.jsRendering · scene graph · GLB loading
  2. three-mesh-bvhExact mesh-distance collision queries
  3. 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)
The simulated UR10e with the OnRobot 2FG7 gripper mounted and a graspable brick on the floor
Fig. The 2FG7 gripper mounted from the catalogue — payload, TCP offset and collision capsule all recompute automatically