
SkateArm is an open browser cockpit and ROS 2 / MuJoCo toolkit for the R.Botic Skate — a 3D digital twin you actually drive, over the same wire the real robot speaks.
No robot required to try it. Everything here runs in simulation today; one switch is wired for the real Skate when the hardware lands.
Every command goes through the same safe bridge the real robot will use — joint limits, a collision guard and a deadman E-STOP — whether you're jogging a slider or replaying a program.
Grab a wrist in 3D and server-side damped-least-squares IK glides the seven arm joints (the eighth is the gripper), resolving the redundant freedom toward a natural pose. Turn on mirror mode and one slider drives both arms symmetrically; dual-arm carry holds one object with both wrists and moves them together.
When a straight move would clip a self-collision, RRT-Connect routes the arms around it. Risky moves — Home, waypoints and smart-pick — preview as a translucent ghost robot with a route trail, gated behind Approve / Cancel before they run.
Foxglove-style telemetry strip charts (angle / velocity / temperature / TCP) at 20 Hz, an RViz-style live TF frame tree, a diagnostics panel and joint-limit meters — the whole robot state, readable at a glance.

An Isaac-Sim-style workstation — menu bar, tool rail, a 3D MuJoCo twin, a Stage / Property dock and a timeline — running entirely in your browser over a WebSocket. No ROS, no Gazebo, no Linux to install just to look.

The cockpit and your ROS 2 stack both speak the Skate's native UDP wire. Develop against the MuJoCo twin today; swap 127.0.0.1 for r.local when the robot arrives.
Open the cockpit (it runs on recorded telemetry) and read the source behind each capability. Grab a joint slider, jog, or press Home to drive the twin yourself.


RRT-Connect routes around self-collisions; ghost-preview gates the move.



Depth back-projected to a cloud; top-down grasp synthesis. (sim-validated)

Four open layers, each shipped as a standalone tool. Build the whole thing in simulation, then deploy over the same protocol.
Control-ready MuJoCo model + a capsule collision layer; kinematics validated against MuJoCo link positions.
A ROS 2 driver over the native UDP protocol + a protocol-true MuJoCo sim endpoint, with a deadman watchdog.
The browser cockpit: server-side IK + collision guard, RRT routing, planning previews, live telemetry, a TF tree.
A GRAFCET-sequenced two-handed assembly cycle with camera quality inspection and a SCADA dashboard.
One arm fixtures a base part in the air; the other aligns a peg by relative servoing and inserts it with a force-guarded descent. A GRAFCET sequencer runs the cycle on sensor transitions; two fixed cameras deliver the accept / reject verdict, logged to a Flask + SQLite dashboard. Numbers below are from logged sim cycles.
Phase 1 guarded contact with an actuator-torque watchdog — push until a number trips. The manipulation core replaces that with a real wrist wrench and closed-loop force control: an insertion that searches for the bore, an arm that yields at a commanded stiffness, and a gripper that holds by friction instead of a weld. All four milestones are shipped, and each one is exercised by CI.
actuatorfrc proxy — you cannot regulate a force you cannot read.
Each sweep writes its trials to a committed JSON file, and a test re-derives every published figure from those files — the misalignment curve, the stiffness sweep, the slip curve, the cycle time. It runs in the hardware-free CI job with no MuJoCo and no GPU, so prose and data cannot drift apart silently: change a number in the text without changing the measurement and the build goes red.
Taking the weld off the second hand is not a re-skin of the same cycle. A weld holds the base in mid-air for free while the peg goes in; jaws have to pick it off the table, set it down, let go, and pick the finished unit back up — four real grip/release operations on the left hand and two on the right, each one reported by a pad force sensor, with both weld constraints sampled three times across the cycle and never once engaged. That is where the extra 33 s goes: the takt bound moves 60 s → 85 s, and the test writes down which step spent each second of it rather than letting the bound absorb it unexplained. In simulation, and on an opt-in scene: the default cell keeps its welds, and the only thing the station lens added to it is one <camera> line — no size changes, and the model steps bit-identically — so every other demo, log and benchmark on this page still reproduces exactly as it did before.
With jaws on both wrists the left tool must approach top-down — the pocket faces up and the part is longer than the jaws open, so the orientation is forced — which parks the wrist between the overhead camera and the unit at exactly the pose inspection looks at. In the same 300 px window, unchanged pipeline: the weld path sees 1116 peg pixels and ACCEPTs; the weld-free path sees zero, with 89 % of the pocket rim gone, and REJECTs. Same probe on both, so the cell changed and not the measurement — and the two cells settle the part 7.7 mm apart, 16 px of that 300 px window, published next to the counts so you can rule that out yourself instead of taking “same probe” on trust. The pose oracle accepts the unit on both paths: what the conversion cost is the sight of the part, not the assembly. The published fixture-camera numbers stay on the weld path where they were earned — and the repair this page named, in-situ optics aimed at the assembly station rather than a re-calibration, has since shipped. S5 hands the unit over in an instant when the right wrist has already retracted and the left has not yet re-gripped: the part stands free on the station with both hands off it, an instant a cell with a weld in it cannot have, because it lets go of the part only onto the weld. Read there through the same unchanged pipeline, the station pair sees 956 peg pixels and ACCEPTs, the pose oracle agrees on that same frame, and the weld-free cycle is camera-gated on its own cell.
The same twin you drive also generates training data. A scripted expert demonstrates bimanual reaches; an ACT policy is behaviour-cloned from them and drives both arms from pixels alone — end to end on a single 4 GB laptop GPU.
skate_ros2 is a standard ROS 2 package speaking the documented UDP protocol, with a MuJoCo sim endpoint on the same wire. Models are plain URDF / MJCF. The wire, kinematics and command sandbox ship with unit tests that run without ROS or a robot, exercised by CI on every push.skt_v3 model belongs to R.Botic and is not redistributed.No install — the cockpit runs against baked telemetry, and you can jog the joints yourself. The source, the wire and the work-cell are all open.