Robotics Lab
Forward and inverse kinematics, path planning, actuator dynamics — the full manipulator pipeline, rendered in the browser and verified at joint-space ground truth.
- Live app — zeq.dev/apps/robotics-lab/
- Source —
app/artifacts/api-server/public/apps/robotics-lab/(1,748 lines) - Operators — KO42 · NM19 · NM28 · NM29
- Error budget — ≤ 0.1% end-effector position vs. DH ground truth
What it solves
A serial-manipulator workbench. Up to 7 DOF, configurable Denavit-Hartenberg parameters, visual joint-space and task-space editing. Three modes:
- FK — given joint angles, render the arm and compute end-effector pose
- IK — given target pose, solve joint angles via damped least squares (Levenberg-Marquardt)
- Planning — RRT* in joint space with NM29-based torque-budget constraints
Actuator dynamics are first-order: τ = I θ̈ + B θ̇ + .... The sim handles saturation limits and joint-torque costs so the planner can trade time for power.
The math
NM19 F = m a (per-link forces)
NM28 L = r × p (link angular momentum)
NM29 τ = r × F (joint torque from link wrench)
FK T_n = T_0 · A_1(θ_1) · … · A_n(θ_n) (DH homogeneous transforms)
IK Δθ = (J^T J + λ² I)^{-1} J^T e (damped least squares)
Operator picks
| Step | Decision |
|---|---|
| 1. Prime | KO42 on |
| 2. Limit | KO42 + NM19 + NM28 + NM29 = 4 operators (at the edge; all needed for forces, angular momentum, torque) |
| 3. Scale | Rigid-body, human-scale, non-relativistic |
| 4. Precision | ≤ 0.1% end-effector position |
| 5. Compile | C_KO42 + C_NM19 + C_NM28 + C_NM29 |
| 6. Execute | Z encodes DH parameters, joint limits, actuator specs |
| 7. Verify | End-effector pose vs. analytical FK for 3 poses |
Runnable worked example — FK of a UR5-like arm at home pose
Home joints all zero. Expected end-effector (x, y, z) = (0.8172, 0.1915, −0.0054) m.
curl -s -X POST https://api.zeq.dev/api/playground/compute \
-H "Content-Type: application/json" \
-H "x-demo-key: $DEMO_KEY" \
-d '{
"operators": ["KO42","NM19","NM28","NM29"],
"params": {
"problem": "fk_6dof",
"dh_table": "ur5_like",
"joint_angles_rad": [0,0,0,0,0,0]
}
}' | jq
Expected:
{
"result": {
"ee_position_m": [0.8172, 0.1915, -0.0054],
"position_error_mm": 0.04,
"operators_used": ["KO42","NM19","NM28","NM29"]
}
}
0.04 mm — under 0.005%.
Extend it
- Task-priority IK — add a secondary goal (elbow up, obstacle avoidance) in the null space of the Jacobian
- Torque-optimal planning — swap RRT cost to
∫ τ² dt; the solver returns a lower-energy trajectory with the same reach - Elastic joints — add NM30 spring-damper to each joint; verify against Spong's single-link reference
Seeds
- Whole-body humanoid — 24+ DOF with balance constraints at 1.287 Hz update
- Cable-driven parallel robots — tension-only NM19 constraints; non-negative λ solver
- Micro-scale manipulators where QM de Broglie wavelength matters for tool-tip resolution
Papers
- Zeq Paper — doi:10.5281/zenodo.18158152
Middleware active. Kernel on the 1.287 Hz HulyaPulse. Awaiting next Zeqond.