Interactive Robot Trajectory Programming, Rigid-Body Dynamics, and Deterministic Actuator Sizing β in your browser.
π Live demo: https://customrobotics.es No installation required β runs entirely in the browser.
Robodimm is a web-based environment for designing and validating the
mechanical sizing of industrial robots. It provides a real-time 3D
visualiser (Three.js), a client-side kinematic and approximate-dynamic
solver, and an optional Python backend that runs Pinocchio 4 for
high-fidelity inverse dynamics. The actuator-sizer is passive,
deterministic, and reproducible β given a TorqueLog and a catalog, it
returns the same best candidate every time.
The environment supports two robot families only:
- CR6 β 6-DoF serial articulated arm, IRB 4600-class, with decoupling spherical wrist. Standard DH + RNEA solver.
- CR4 β 4-DoF parallel palletizer, IRB 460-class, with a parallelogram linkage. Closed-chain KKT solver on a Pinocchio cut tree.
A short walkthrough of the full workflow β parametric editor, jog, program, signal recording, and deterministic actuator sizing.
The full-length MP4 is available for download at
docs/video_robodimm.mp4.
- Real-time 3D viewer. Z-up world frame, slate-dark background, CAD-aligned axes, COM markers, trajectory path, optional world grid. CAD-authored GLB/GLTF and STL meshes are loaded on demand; primitive geometry is the safe fallback.
-
Two robot families. Switch between CR6 and CR4 with full
geometry, inertia, and limit editors. The CR4 editor enforces the
parallelogram closure
$P = B + C - O$ and$E = D + C - O$ in real time. - Jogging panel. Joint-space sliders and Cartesian XYZ+yaw jog relative to either the World or TCP frame. Continuous mouse-hold jogging.
-
Duty-cycle sequencer.
MoveJ,MoveL, andPauseinstructions with named targets.MoveLis the legacy label for a joint-space quintic path with a TCP endpoint-distance timing floor, not a Cartesian straight line. JSON / YAML program import-export. -
Deterministic actuator sizing. Six hard pass/fail constraints
(continuous output torque, configurable generic peak assumption, max speed,
gearbox continuous, gearbox intermittent, gearbox input speed) and four
ranking objectives (
min_mass,min_power,min_gearbox,max_margin). The output is preliminary design support, not procurement validation. Full audit manifest:robodimm.actuator_sizing_report.v2. - Station objects. Drop GLB environment meshes (tables, fences, fixtures) into the world frame without affecting the kinematic tree; the loader is a cancellable reconciler that prevents WebGL leaks.
-
CR4 closed-chain KKT. A cut tree is built with
pin.JointModelRY/RZbodies for all ten links and threepin.RigidConstraintModel3D contact constraints close the loops. Lagrange multipliers are recovered bylstsqof the passive-joint columns of$J_c^\top$ . -
CR6 NewtonβEuler. A direct call to
pin.rneaon the six-DoF serial chain, with CAD-frame β link-frame inertial conversion when the user spec is provided in CAD coordinates. -
Pinocchio model cache. SHA-256 keyed on the canonical
json.dumps(robot, sort_keys=True). Cold start ~30 s; subsequent calls are sub-millisecond on cached models. -
Viscous friction model. A scalar
$b_i,\dot q_i$ term per joint, configured byfrictionCoeffNmSPerRadon the joint limit. Omitted values default to zero. TheE2E-VM05-v1benchmark uses0.5 N m/(rad/s)on every tested joint; the separateREG-ZD-v1mathematical regression uses exactly zero damping. -
Cross-software verification against Simscape. For the archived
E2E-VM05-v1application regression (0.5 damping), PRO-vs-Simscape total RMSE is 0.244639 Nm for CR4 and approximately 1.15 Γ 10β»ΒΉΒ² Nm for CR6. The complete archived workflow also reports CR6 DEMO-vs-Simscape RMSE of 0.001427 Nm underE2E-VM05-v1. FreshREG-ZD-v1evidence generated from application commitd4736c9(zero damping) reports PRO-vs-Simscape totals of 0.0482381 Nm for CR4 and 1.15198 Γ 10β»ΒΉΒ² Nm for CR6. See the validation document for engine-pair, archive, and geometry qualifications.
| Layer | Technologies |
|---|---|
| Frontend | React 18, TypeScript ~5.6, Vite 8.2, Three.js 0.184, Zustand 5, Tailwind CSS 3 (via PostCSS), Lucide-React, Recharts |
| Frontend tests | Vitest 4.1 |
| Backend | Python 3.9β3.10, FastAPI β₯ 0.100, Uvicorn, Pydantic β₯ 2.0 |
| Dynamics | Pinocchio 4.0.0 (Conda), NumPy β₯ 1.22, SciPy β₯ 1.8 |
| Packaging | Docker / Docker Compose, nginx 1.27 |
| Cross-software reference | MATLAB R2026a, Simulink, Simscape Multibodyβ’ |
| Document | What it covers |
|---|---|
π docs/getting_started.md |
Prerequisites, install, DEMO and PRO modes, Docker, env vars, five-minute walkthrough, how to run the test suite |
π docs/math_foundations.md |
DH convention, CR4 hardpoint invariants, the cut-tree mapping, the KKT matrix system, the closed-loop J4 sign convention, viscous friction model, trajectory blending |
π docs/api_reference.md |
Every FastAPI endpoint, full JSON request/response payloads, the SHA-256 model cache, the trajectory hash, the CORS allowlist |
π¨ docs/frontend_guide.md |
Zustand store slices, Three.js scene factory, the CAD-aligned frame helper, the GLB station-object reconciler, the cancellable loader |
βοΈ docs/sizing_methodology.md |
The six pass/fail constraints (with formulas), per-candidate margin metrics, the four ranking objectives, a worked example |
π§ͺ docs/validation_benchmarks.md |
Simscape comparison methodology, protocol-specific E2E-VM05-v1 and REG-ZD-v1 RMSE tables, and reproduction commands |
npm install
npm run dev # β http://localhost:5173The full feature set works in DEMO mode: parametric editor, jog, program editor, signal recording, and actuator sizing. The approximate CR4 dynamics in the browser are not as accurate as the PRO backend's KKT solver, but they are sufficient for design exploration.
# Backend (one-time setup + launch)
./releases/setup_backend.sh
# Frontend (in another terminal)
npm run devThe header engine switcher lights the PRO (Python API) pill in
green when the backend advertises both CR4.closed_chain_kkt = true
and CR6.serial_rnea = true. The first PRO batch is slow (~30 s cold
start); subsequent calls are sub-millisecond thanks to the
SHA-256-keyed Pinocchio model cache.
ACTUATOR_CATALOG_SHA256=$(sha256sum public/actuators_library.json | cut -d' ' -f1) \
ROBODIMM_SOURCE_COMMIT=$(git rev-parse HEAD) docker compose up --build
docker build --build-arg ROBODIMM_SOURCE_COMMIT=$(git rev-parse HEAD) \
--build-arg ACTUATOR_CATALOG_SHA256=$(sha256sum public/actuators_library.json | cut -d' ' -f1) \
-t robodimm/frontend .
docker build -f Dockerfile.backend -t robodimm/backend-pro .
docker run -e ROBODIMM_SOURCE_COMMIT=$(git rev-parse HEAD) \
-p 127.0.0.1:8001:8001 robodimm/backend-pro# Frontend (Vitest)
npx vitest run
npx vitest run -t "CR4" # name filter
npx vitest run src/math/actuators.test.ts # single file
# Backend (regression vs Simscape)
mamba run -n robodimm-pro-backend python -m unittest \
backend.test_cr4_kkt_diagnostics backend.test_trajectory_semantics -v
mamba run -n robodimm-pro-backend python backend/test_cr4_fd_sensitivity.py
mamba run -n robodimm-pro-backend python backend/test_regression.py \
--protocol E2E-VM05-v1
mamba run -n robodimm-pro-backend python backend/test_regression.py \
--protocol REG-ZD-v1The Python regression script is not collected by pytest β it is
invoked directly because it loads the Simscape CSVs and reproducibility
manifests from the sibling paper repository. E2E-VM05-v1 reads the archived
experiments/archive/submitted-validation-f33a676/E2E-VM05-v1/ tree and
retains 0.5 damping; REG-ZD-v1 reads the fresh
experiments/regression/REG-ZD-v1/ tree and applies zero damping. Missing
inputs fail rather than being reported as a successful skip.
robodimm/
βββ README.md β this file (the portal)
βββ AGENTS.md β agent quick-start (commands, gotchas)
βββ docs/ β SoftwareX-grade technical documentation
β βββ getting_started.md
β βββ math_foundations.md
β βββ api_reference.md
β βββ frontend_guide.md
β βββ sizing_methodology.md
β βββ validation_benchmarks.md
βββ src/ β React + Three.js frontend
β βββ main.tsx, App.tsx
β βββ api/backend.ts β PRO fetch wrappers (800 ms / 120 s timeouts)
β βββ math/ β pure-TS FK/IK/dynamics/sizing
β βββ model/ β Zustand store + schemas
β βββ ui/ β Editor, Jog, Program, Sizing tabs
β βββ viewer/ β Three.js scene, meshLoaders, reconciler
βββ backend/ β FastAPI + Pinocchio PRO backend
β βββ main.py β CORS, PNA preflight, /api/packages/static
β βββ api/ β health, dynamics, packages routers
β βββ dynamics/ β cr4_kkt, cr6_serial, schemas, validation
β βββ test_regression.py β stand-alone Simscape regression
βββ public/
β βββ actuators_library.json β static catalog served by nginx
βββ packages/ β local robot packages (robot.json + meshes)
βββ releases/ β setup_backend.sh / .bat
βββ Dockerfile, Dockerfile.backend, docker-compose.yml
βββ environment.yml β conda env 'robodimm-pro-backend'
βββ nginx.conf β 1 h cache for /actuators_library.json
βββ package.json, vite.config.ts, tsconfig*.json, eslint.config.js
βββ tailwind.config.js, postcss.config.js
Robodimm is released under the MIT License.
MIT License
Copyright (c) 2024β2026 J. L. Torres, M. MuΓ±oz, J. D. Γlvarez, J. L. Blanco, and A. Gimenez
See LICENSE for the full text.
If you use Robodimm in academic work, cite the exact software release using
CITATION.cff and the associated SoftwareX article. Until
the journal assigns its final bibliographic identifiers, the software citation
is:
@software{robodimm_v1_1_0,
author = {Torres, J. L. and MuΓ±oz, M. and Γlvarez, J. D. and
Blanco, J. L. and Gimenez, A.},
title = {{Robodimm}: A web-based framework for trajectory-level dynamics
and deterministic actuator sizing of industrial manipulators},
version = {1.1.0},
year = {2026},
doi = {10.5281/zenodo.21871830},
url = {https://github.com/ual-arm/robodimm/tree/v1.1.0}
}Software and accompanying Simscape reference data are versioned
together; please pin the reviewed release tag (v1.1.0) when
citing, and include fields from the actuator_sizing_report.v2 envelope:
dynamics_source identifies the engine (demo_frontend, pro_cr4_kkt, or
pro_cr6_serial), while source_commit and the provenance hashes identify the
implementation and inputs.
