RobotForge / Problem-Space Research

A robot model should have to pass before anyone trusts it.

RobotForge is a proposed open-source acceptance gate for robot models: describe a wheeled robot, generate its URDF/SDF, run it headlessly in Gazebo, compare the odometry it reports against the simulator's ground truth on simple maneuvers — drive straight about a meter, turn about 90° — and emit a PASS/FAIL evidence report. This brief documents whether the problem is real, who already solves pieces of it, and what to build first. Short answer: the problem is documented by the field's own research, and the verdict-shaped hole in the tooling is still empty.

A university rover with pink wheels beside a lander prop at the University Rover Challenge field site in desert terrain
A rover at the University Rover Challenge — the Mars Society's Rover Challenge Series field site. Teams like this one, capped at a $15,000 build budget, are the gate's intended users: they test by driving to the field and watching. Photo via the URC 2024 collection (franceszhu.space).

The gate, step by step

  1. 1Describe a wheeled robot — links, joints, wheels, sensors.
  2. 2Generate its URDF/SDF model files.
  3. 3Spawn it headless in Gazebo — no GUI, no display, CI-friendly.
  4. 4Drive fixed maneuvers — straight ~1 m, turn in place ~90°.
  5. 5Compare reported odometry against simulator ground truth.
  6. 6Stamp a verdict — PASS or FAIL, with the measured evidence attached.

Built for university rover teams, ROS 2 hobbyists, and small robotics startups — the teams with no platform group and no test infrastructure budget.

85%

of robotics developers use simulation for testing — yet the tooling fights automation at every step.

Afzal et al. 2020, 82-developer survey
39%

had never even attempted simulation-based test automation (27 of 69 respondents).

Afzal et al. 2020
79%

of those who did try automating sim tests reported difficulties (33 of 42).

Afzal et al. 2020
2025

AWS RoboMaker — the one cloud service offering pass/fail sim metrics at scale — was discontinued on 10 September 2025.

The Robot Report, 2025-09-10
Verdict: build it

No tool found produces a pass/fail verdict with evidence, for a small team, headlessly, for free. Static validators never run the robot. Gazebo ships syntax checks and a GUI inertia viewer, not a verdict. Nav2's system tests serve Nav2's maintainers. Isaac Sim's minimum spec — an RTX 4080 with 16 GB VRAM — excludes most student laptops and free CI runners. The one commercial verdict product, AWS RoboMaker, no longer exists.

One honesty constraint, carried through this whole brief: Gazebo physics is not bit-reproducible, so the claim is never "deterministic." It is pass/fail within stated tolerances over a fixed, seeded scenario — with repeatability reported, not assumed.

Evidence tags used throughout: Read live the source page was opened and read during this research. Via index the claim rests on search-index / search-result text. Anything weaker is flagged in place, and §8 lists everything that could not be verified.

01

The pain is documented — by the field itself

The strongest evidence isn't forum complaints. It's a peer-reviewed-style survey of 82 robotics developers — Afzal, Katz, Le Goues & Timperley, "A Study on the Challenges of Using Robotics Simulators for Testing" (2020) — plus the ROS ecosystem's own quality-assurance reporting. Their findings read like a requirements document for this tool.

"Most simulations are NOT designed to run headless, nor are they easily scriptable for automatic invocation." — Survey respondent P34, in Afzal et al. 2020 Via index

Design consequence, stated up front: because bit-exact determinism isn't on offer, the gate reports spread — run each maneuver k times and publish the distribution — instead of pretending one run is proof. See §7, item 8.

02

Modeling errors are silent, and found late

URDFs are written by hand, checked by tools that only verify the file parses, and converted to SDF by a pipeline that can drop parts of the model without a word. The failures surface later — as a robot that shakes, explodes, or quietly drives wrong.

"Making URDF files is a tremendous pain as the only good way to do it right now is by hand which is faulty and error prone." — Survey respondent P4, in Afzal et al. 2020 Via index

The official checker stops at syntax

check_urdf validates structure, not physics

The official ROS tool parses a URDF and prints the kinematic chain or an error. Tesseract's documentation summarizes that it "catches XML errors and basic structural issues" — while collision-mesh quality, misaligned frames, joint limits, and self-collision still require visual inspection. Gazebo's own command, gz sdf -k, is likewise syntax validation only. Neither executes physics or compares behavior.

Tesseract URDF docs · gz man pageVia index

A physics-aware validator states the gap

"Can still silently fail in any physics-based simulator"

The PyPI package urdf-validator (a vendor claim, but it matches the check_urdf documentation): "A URDF that passes check_urdf can still silently fail in any physics-based simulator — collapsing robots, undersized motors, unstable configurations." Its worked examples are real upstream defects: Fetch gripper-finger links with non-positive-definite inertia (eigenvalue 0.0) and PR2 links missing inertial blocks entirely.

It is the closest static prior art — and it never starts Gazebo, drives the robot, or compares odometry to ground truth. A complement, not a competitor. See §5.Via index

Vendor data, wrong for years

Universal Robots shipped UR5e masses copied from the UR5

The official ROS 2 description for the UR5e carried link masses "copied from UR5 CB3." Nobody's tooling caught it — a user checked by hand and filed an issue; the maintainer agreed the reporter was "absolutely correct." Fixed via PR #187; the issue closed 2024-09-06. Cited here as pain evidence — a closed issue, not an open need.

Universal_Robots_ROS2_Description #186Read live

Conversion drops parts silently

An IMU extension vanished — "without any warning message"

sdformat issue #1372: a <gazebo> IMU extension whose reference string didn't match a real link was "completely ignored, without any warning message or error" during URDF→SDF conversion. The maintainer's reply: "Ouch! That's a tough one to debug. +1 for a warning message if an extension references an unknown link." Still open. The gate's structural tier exists to make exactly this class of drop an explicit failure.

sdformat #1372Read live

Why robots "explode" in Gazebo

Wrong inertia is the classic cause. A ROS Answers thread attributes Gazebo shaking to "bad inertia matrices, bad physics settings, joint problems," with debugging described as a process of elimination, parameter by parameter. A community wiki's list of "exploding robot" causes: PID gains, inertia values too small, collision overlaps, joints starting outside limits, solver instability. A beginner-facing differential-drive tutorial states it plainly: "Robot vibrates or explodes in Gazebo: inertia values are wrong… No value should be 0.0 or below 1e-6" — and warns wheels render sideways if the cylinder joint axis isn't rotated (rpy="${pi/2} 0 0").Via index

A simulation textbook chapter frames the deeper version: "a robot description good enough for visualization is not automatically good enough for contact-rich control" — a missing <inertial> block can yield high simulation success and near-zero hardware success while compiling without any error. Its audit checklist covers units, mesh scale, inertias, joint axes, damping, limits, and collision shapes.Via index

The DiffBot differential-drive robot (REMO) inside the Gazebo GUI — the environment where model checking currently means opening a window and looking
The DiffBot in the Gazebo GUI. This is what "validation" looks like today: Gazebo's official inertia-checking procedure is to spawn the model, open View → Inertia, and compare each link's purple inertia box against its bounding box by eye, with all masses temporarily set to 1.0. The official tutorial also notes a wrongly rotated inertia matrix "happens often." Screenshot from the ros-mobile-robots DiffBot project.Via index

The inertia rules themselves are well specified — the matrix must be symmetric positive-definite and satisfy the triangle inequalities (ixx + iyy ≥ izz, etc.), and every link needs physically plausible mass, center of mass, and inertia. What's missing is any tool that enforces them automatically. Gazebo inertia tutorialVia index

03

Odometry is not ground truth — and users keep rediscovering it

The conceptual core of the gate — comparing what the robot reports against what actually happened — is a live, open source of confusion inside Gazebo itself. Two open gz-sim bugs are users hand-building exactly the comparison RobotForge automates.

DiffDrive odometry "is not ground truth… it simulates how odometry would be calculated from the model's kinematics and joint state." Ground truth comes from a different system: OdometryPublisher. — Gazebo maintainer, in gz-sim #872 Read live

Try the arithmetic the gate automates

From a wheeled-robot odometry guide's worked example: a nominal wheel radius of 33.0 mm against an actual 32.5 mm (tire compression) is a 1.5% distance error — 15 cm over 10 m — and wheel slip is undetectable from encoders alone. Drag the sliders and watch a sub-millimeter modeling error become a failed run.Via index

Model declares 33.0 mm. Tire compression, wear, and manufacturing tolerance move the real value.
The gate's test runs ~1 m; longer runs just scale the same percentage error.
UMBmark's Eb: the turn test's target. Real configs ship empirical corrections — PAL Robotics' PMB-2 uses multiplier parameters; a TurtleBot4 config carries wheel_separation_multiplier: 1.06793648481 (snippet-level evidence).
Ground truth travels10.00 m
Odometry reports10.15 m
Distance error+15.4 cm · +1.54%
Commanded turn90.0°
Odometry reports turn of92.3°
Heading error+2.25°
Gate verdict: FAIL

Illustrative arithmetic, not measured data: odometry integrates wheel rotation using the declared radius, so reported distance scales by 33.0 ÷ actual radius; reported rotation scales by (1 + wheelbase error). Verdict uses an example tolerance of ±2% distance / ±2° heading. The point stands at any tolerance: the error is in the model, it's systematic, and nothing in the current toolchain measures it for you.

The same numbers live in two files that must agree

Wheel radius and separation appear in the URDF geometry, again in the DiffDrive plugin's SDF tags (<wheel_separation>, <wheel_radius>, <left_joint>, <right_joint>), and again in the ros2_control controller YAML. Project documentation warns that URDF-vs-YAML disagreement produces odometry error or controller startup failure — a cross-file consistency hazard no single-file linter catches. Vendors confirm real robots never match CAD: PAL Robotics' PMB-2 calibration docs cite wheel diameter tolerances of ±1–2 mm, tire wear, assembly tolerances, tire pressure, and floor interaction, corrected with empirically determined multipliers.Via index

Scope honesty: a gate comparing odometry to simulator ground truth catches model self-inconsistency — wrong radius, separation, or axes in the description versus what the simulated physics does. It does not close the sim-to-real gap, and the pitch shouldn't claim it does.

04

The audience under-tests — that's the survey's headline

The primary audience source is Snider et al., "University Rover Challenge: Tutorials and Team Survey" — a book chapter surveying URC teams — plus current competition reporting. URC draws hundreds of students across 80+ teams (in 2017: 35 rovers, 500+ students) who spend a year building a rover from scratch under a $15,000 spending cap, which makes ROS's free ecosystem "a natural fit… to cut costs." This is precisely the segment that cannot buy test infrastructure.Via index

"Teams most often expressed difficulty using IMUs or not testing their rover enough." — Snider et al., URC team survey Via index

Claim to keep honest: "the robot is in the lab and the team is remote"

This is the founding story for a headless, run-it-from-home gate — and this research did not find a source that directly documents it. No team write-up or forum thread located states that members cannot test because the robot sits in a lab/shop while they are remote. The demand is supported only indirectly: developers want headless, scriptable, CI-deployable simulation (Afzal et al.); one needed a physical display attached to a CI server; Gazebo's docs call remote/cloud execution "often desirable"; URC teams are budget-capped and under-test.

Until a team states it directly, present the remote-testing story as a hypothesis consistent with the survey data — not as a documented fact. Same discipline for competition failures: none found was traced specifically to an unvalidated URDF or odometry parameter error. See §8.

05

Prior art: every neighbor is one layer away

The headline question — does anything already produce a pass/fail verdict with evidence, for a small team, headlessly, for free? — answers no. Each tool below covers a slice. Static validators sit below the gate (no execution), Nav2's tests beside it (wrong scope), Isaac Sim above it (a platform, GPU-gated), and RoboMaker is gone.

ToolWhat it doesHeadlessFreeRuns the robotVerdict + evidence
check_urdf Parses URDF; prints kinematic chain or parse error Yes Yes No Parse only; no physics checks
gz sdf -k Validates SDF syntax Yes Yes No Syntax only
Gazebo GUI inertia view Visual per-link inertia boxes vs. bounding box No — manual GUI procedure Yes Spawn only No — human eyeballing
urdf-validator Physics-aware static URDF checks: schema, positive-definite inertia, COM, gravity-torque margins, support-polygon stability; CI exit codes; optional MuJoCo cross-check Yes Yes No — static only Static verdicts only — no driving, no odometry-vs-truth
yourdfpy Python URDF load / validate / visualize, forward kinematics Yes Yes No Validation errors; no behavior verdict
launch_testing (ROS 2) Framework: launch nodes (e.g. Gazebo + Nav2), run unittest assertions, XUnit output Yes Yes If you build the test Framework only — no prebuilt model acceptance test; docs warn tests are "more complex both to set up and to run"
Nav2 system tests Gazebo-based navigation system tests used in Nav2 CI Yes Yes Yes Yes, for Nav2 behavior — but Nav2-stack-specific, heavyweight, "primarily for use in Nav2 CI" by its maintainers
NVIDIA Isaac Sim Full GPU simulation platform: PhysX, RTX sensors, synthetic data, ROS 2 bridge, URDF import Yes Free download (license terms apply) Yes No built-in small-team acceptance verdict. Minimum spec: RTX 4080, 16 GB VRAM, 32 GB RAM, 50 GB SSD; "GPUs without RT Cores (A100, H100) are not supported"
AWS RoboMaker Cloud simulation at scale via Gazebo, with pass/fail metrics Yes (cloud) Discontinued 2025-09-10 Yes Was yes — the product no longer exists. Post-mortem: target users needed "just a few" simulations, not thousands — consistent with an unmet small-scale need (that inference is ours, not the article's)
Foxglove "One workspace to debug robot behavior, live or recorded" — time-synchronized multimodal inspection, teleop panels n/a Freemium No No — observability, not execution or verdicts. A plausible evidence-report viewer, not a competitor
Rerun SDK logging + viewer for multimodal robot data n/a Open-source core No No — visualization/logging
InOrbit / Formant RobOps: fleet operations, teleoperation, incident management for deployed robots n/a Commercial No No — operations on real fleets, not pre-deployment model gates
The Construct Cloud ROS learning environment; browser-based sim for courses Browser Freemium / courses Yes, for learning No acceptance-verdict product (characterization from site material at search level — light-touch)

Beyond syntax validation and the GUI inertia procedure, Gazebo itself ships headless server mode with the EGL --headless-rendering option for GPU sensors, and CI packaging via the setup-gazebo GitHub Action — the sanctioned building blocks for the gate's harness. No shipped "run maneuvers and grade the model" tool appears in the documentation reviewed.Via index

06

Open upstream issues the gate speaks to

Every issue below was opened and read live during this research (October 25–26, 2026) and was open at read time, unless flagged. These are not decoration: two of them are users hand-building the gate's core comparison, and three define constraints its harness must be designed around.

gazebosim/gz-sim #2862Read live

DiffDrive produces wrong odometry data

Reporter found odometry "delayed or stale… usually behind robots actual position" while running an "exhaustive test of the diff drive system" to simulate an EKF filter node — a user hand-building exactly the odometry-vs-truth comparison the gate automates.

Gate mappingA ready-made regression scenario: stale/lagging odometry is a measurable verdict, not a vibe.

Opened 2025-04-15Label: buggithub.com/gazebosim/gz-sim#2862

gazebosim/gz-sim #872Read live

DiffDrive odometry values don't match robot pose values in Ignition Gazebo

Maintainer: DiffDrive odometry "is not ground truth… it simulates how odometry would be calculated from the model's kinematics and joint state… If you're looking for ground truth, you can try the OdometryPublisher system instead." The reporter — whose robot spawned at (2,2) while odometry showed (0,…) — requested clearer semantics.

Gate mappingThe gate productizes this exact distinction: odometry is the device under test; OdometryPublisher is the reference.

Opened 2021-06-21Labels: bug · help wantedgithub.com/gazebosim/gz-sim#872

gazebosim/gz-sim #2668Read live

[OdometryPublisher] Include Gaussian noise in pose messages

OdometryPublisher pose is copied directly from world pose (no noise) while its twist is noisy; the requester proposes integrating noisy velocity so pose drifts realistically.

Gate mappingDefines the ground-truth source's current semantics and limitations — the gate must document and handle them: today, the reference pose is noise-free world pose.

Opened 2024-11-07Label: enhancement · assignedgithub.com/gazebosim/gz-sim#2668

gazebosim/gz-sim #4104Read live

Add namespace support to OdometryPublisher

Odom/pose topics don't resolve under model namespaces — multi-robot and namespaced setups will break a naive harness's topic assumptions. (PR #4117 referenced in the issue.)

Gate mappingA design constraint and a possible integration point: resolve topics via the model namespace rather than hard-coding them.

Opened 2026-10-22Labels: enhancement · good first issue · help wantedgithub.com/gazebosim/gz-sim#4104

gazebosim/gz-sim #2803Read live

Allow OdometryPublisher to work with non-fixed link

Ground truth for non-fixed links is unavailable via OdometryPublisher; the discussion notes PosePublisher publishes no velocities, and fixed-joint link lumping (<preserveFixedJoint>) changes what links exist.

Gate mappingGround-truth extraction edge cases the harness has to survive — or fail loudly about.

Opened 2025-02-28Label: enhancementgithub.com/gazebosim/gz-sim#2803

gazebosim/sdformat #1372Read live

URDF to SDF conversion silently ignores <gazebo> tag with non-existing reference

An IMU extension silently vanished on conversion because its reference string matched no real link. Maintainer: "Ouch! That's a tough one to debug. +1 for a warning message if an extension references an unknown link."

Gate mappingThe structural tier should surface silent URDF→SDF drops — missing sensors/plugins after conversion — as explicit failures: the warning this issue asks upstream for.

Opened 2024-02-15Labels: enhancement · help wantedgithub.com/gazebosim/sdformat#1372

ros-controls/ros2_controllers #2251Partially verified

Unify the odometry API across controllers

Seen only in a live GitHub search-results listing; the issue page itself was not opened, so the title and date are treated as partially verified. If it stands as listed, it maps to the gate's need for a uniform odometry interface across the DiffDrive-plugin and ros2_control stacks.

Gate mappingOne odometry interface to test against, whichever stack produced it.

Opened 2026-03-28 (per listing)Tagged: good second issuegithub.com/ros-controls/ros2_controllers#2251

UniversalRobots/Universal_Robots_ROS2_Description #186Read live

Mass of UR5e are incorrect — closed

Vendor masses copied from the wrong model (UR5 CB3), caught by a user checking by hand, maintainer-confirmed, fixed via PR #187; closed 2024-09-06. Not an open need — included as the motivating evidence for the mass/inertia plausibility tier in the build list.

Gate mappingIf an official vendor description ships wrong masses undetected, a plausibility tier isn't optional.

Status: closed 2024-09-06github.com/UniversalRobots#186

07

The build list, ranked by evidence

Eight candidate tests for a 10-day MVP, ranked by strength of documented evidence × cheapness to implement in a headless Gazebo harness × directness of fit to the odometry-vs-ground-truth concept. Each item names the evidence it answers.

  1. 1

    Structural URDF/SDF sanity

    File parses (check_urdf + gz sdf -k); joint/link references resolve; no kinematic loops or duplicate names; mesh files exist; and — the differentiator — every <gazebo> extension reference resolves to a real link, via a post-conversion diff of declared vs. actually-present sensors and plugins.

    Evidence: sdformat #1372 (extension "completely ignored, without any warning") · check_urdf's documented limits · Afzal P4 on hand-authored URDF pain.

  2. 2

    Mass / inertia plausibility

    Every non-fixed link has mass > 0 and an <inertial>; inertia is symmetric positive-definite; triangle inequalities hold; center of mass sits within link geometry / support region; total mass compared against a user-declared expectation.

    Evidence: Gazebo inertia tutorial (rules; rotated inertia "happens often") · UR5e wrong vendor masses (#186) · Fetch/PR2 defects in urdf-validator's examples · shaking/exploding-robot threads.

  3. 3

    Cross-file consistency — wheel parameters

    Wheel radius, wheel separation, wheel joint names, and joint axis direction agree across URDF geometry, DiffDrive plugin / SDF tags, and controller YAML.

    Evidence: URDF-vs-YAML mismatch → odometry error / startup failure · PMB-2 CAD-vs-real divergence and multiplier practice · DiffDrive plugin parameter surface.

  4. 4

    Spawn-stability check

    Spawn headless, step N seconds uncommanded. FAIL if the robot falls through the ground plane, tips, translates or rotates beyond a small threshold, or produces NaN / exploding joint states.

    Evidence: "Robot vibrates or explodes in Gazebo: inertia values are wrong" · exploding-robots cause list (inertia, collision overlap, joint limits, solver) · ROS Answers shaking-by-elimination debugging.

  5. 5

    Straight-line odometry test (~1 m)

    Command a straight drive; compare DiffDrive/controller odometry against OdometryPublisher ground truth: distance error %, lateral drift, heading drift. PASS within tolerance.

    Evidence: gz-sim #872 (odometry ≠ ground truth; maintainer clarification) · gz-sim #2862 (wrong/stale odometry, open bug) · wheel-radius error math (1.5% → 15 cm over 10 m) · UMBmark methodology.

  6. 6

    Turn-in-place heading test (~90°)

    Rotate in place; compare odometry yaw change against ground-truth yaw change; report heading error in degrees and %.

    Evidence: UMBmark — 90° spot turns expose uncertain effective wheelbase (Eb), one of the two dominant systematic errors · PMB-2 / TurtleBot4 separation-multiplier practice.

  7. 7

    Sensor / topic presence checks

    After spawn: odometry, joint_states, and each declared IMU/LiDAR/camera topic actually publishes at an expected rate; TF odom→base_link exists.

    Evidence: sdformat #1372 silent sensor drop · MRover-style manual topic/visual checking today · gz-sim #2668/#2803 ground-truth topic semantics.

  8. 8

    Square-path closure + repeatability reportStretch

    Run 4× (straight + 90° turn); report closure error. Repeat each maneuver k times and report the spread, not just the mean — repeatability reporting is itself the feature, given the field's reproducibility findings.

    Evidence: full UMBmark procedure (4×4 m square, 5 CW + 5 CCW), scaled down · Afzal reproducibility findings ("not repeatable enough to get good data").

Design constraints the evidence imposes

08

What this research could not verify

Open questions, stated plainly. Anything on this list should not appear in a pitch as established fact.

  1. ?

    "Teams can't test because the robot is in a lab while members are remote"

    No direct source found. Supported only indirectly (headless/CI demand in Afzal et al.; Gazebo's remote-execution rationale). Do not present as documented.

  2. ?

    A competition failure traced to an unvalidated URDF / odometry model error

    Not found. Documented competition failures were hardware (MRover PCIe/wiring, CIRC 2026) and real-robot sensing (Team R3 sand slip / IMU, URC survey). Related, but distinct.

  3. ?

    Nav2 system-tests documentation

    The docs page returned "Access Denied" when opened via the index; its characterization in §5 rests on the search-result snippet of that page.

  4. ?

    ros2_controllers #2251

    Title and date come from a live GitHub search listing only; the issue page was not individually opened.

  5. ?

    Isaac Sim requirements

    Read via the search-result text of NVIDIA's official requirements page (5.1.0), not a full page open; version-specific numbers will drift.

  6. ?

    TurtleBot4 wheel_separation_multiplier

    The value 1.06793648481 and its comment come via a DeepWiki summary of the configuration (snippet-level), not the raw config file.

  7. ?

    Formant and The Construct characterizations

    Light-touch, from vendor/roundup material at search level; neither was deep-read. Neither affects the §5 conclusion.

  8. ?

    LinkForge / fieldpilot-urdf

    Physics-linting claims seen in search results were not opened and are excluded from this brief entirely.

§

Sources

Surveys & papers

Official documentation

GitHub issues

Tools & industry

Odometry, modeling errors, audience