Research brief · Compiled October 25–26, 2026 · America/Los_Angeles · For the RobotForge scope lock
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 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
1Describe a wheeled robot — links, joints, wheels, sensors.
2Generate its URDF/SDF model files.
3Spawn it headless in Gazebo — no GUI, no display, CI-friendly.
4Drive fixed maneuvers — straight ~1 m, turn in place ~90°.
5Compare reported odometry against simulator ground truth.
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
Headless is the exception, not the default. Participants preferred headless execution for automation and named its absence a major difficulty. One respondent (P37) had to connect a physical display to a Jenkins CI server to run simulation properly; another (P24): "no obvious test harnesses available for the simulation environments I use."
CI deployment is a named failure point. Respondents reported simulators difficult to deploy in CI/cloud (P62), being unable to set up a CI pipeline on GPU machines (P66), and cloud GPU VMs being expensive (P77). Gazebo's own documentation now concedes that "setting up a Gazebo environment in a Continuous Integration (CI) pipeline can often be a complex and time-consuming task" — and ships a setup-gazebo GitHub Action to mitigate it. Gazebo CI docsVia index
Resets aren't repeatable. P7: "Resetting gazebo simulations was not repeatable enough to get good data." The survey's conclusion about the de facto ROS simulator is blunt: Gazebo "does not adequately support headless execution, lacks reproducibility, and performs poorly" on complex environments.
The GPU-sensor path was historically blocked. Headless runs once required an OpenGL X server; Gazebo's headless-rendering documentation calls the workaround steps "complex and error prone" and documents the EGL-based --headless-rendering path (OGRE2 only). The same doc notes running simulation on a remote computer is "often desirable." Headless rendering docsVia index
ROS QA is inconsistent at the process level. The ROSIN / ROS-Industrial quality-assurance report found QA practices inconsistent across the ROS community, no QA ownership, and roughly 1 in 5 ROS bugs detected at runtime — often by end users — where a CI service was expected to catch many errors earlier. ROSIN D3.1 reportVia index
Reproducibility is still an open research problem. A 2026 paper on deterministic ROS 2 execution (RSLCPP) notes ROS 2's asynchronous multiprocess design complicates reproducibility across hardware, "complicating benchmarking and CI." arXiv 2601.07052Via 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.
"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.
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.
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 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
gz-sim #872 (open since 2021-06-21, labeled bug and help wanted): a robot spawned at (2, 2) reported odometry starting at (0, …). The reporter asked for clearer semantics; the maintainer's clarification above is the distinction the gate productizes — DiffDrive odometry is the device under test, OdometryPublisher is the reference. Read the issue
gz-sim #2862 (open, labeled bug, filed 2025-04-15): odometry found "delayed or stale… usually behind robots actual position" — discovered by a user running an "exhaustive test of the diff drive system" to simulate an EKF filter node. That hand-built test is a ready-made regression scenario for the gate. Read the issue
The maneuvers are classical, not invented. UMBmark (Borenstein & Feng, 1996) — the standard systematic-odometry-error method — uses straight runs and 90° spot turns precisely because they expose the two dominant systematic errors: unequal effective wheel diameters (Ed) and uncertain effective wheelbase (Eb). The gate's two tests are that method, miniaturized. UMBmark paper (PDF)Via index
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 travels
10.00 m
Odometry reports
10.15 m
Distance error
+15.4 cm · +1.54%
Commanded turn
90.0°
Odometry reports turn of
92.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
The winning teams' advice is "test more, earlier, with everything." Of 2nd-place Team Continuum: asked what they wished they had done differently, "the answer was always the same: more field tests with all components of the rover" — advice the chapter notes is "often given by other teams." Field testing forces the team to finish sooner, but it demands the whole team organized and present with the finished rover. Today, that expensive in-person route is the only route to the feedback.
Odometry failing at competition is documented. Team R3 (Ryerson): "As a result of wheel slippage on sand, Team R3 did not use wheel odometry… because our IMU was not working well enough to produce a good fused result, at the competition we did not actually use the ekf localization ROS nodes" — they fell back to visual odometry only. Another surveyed team "had plans to use MoveIt but due to lack of testing time used velocity control… at competition."
Current practice is a human watching a GUI. The University of Michigan MRover team's autonomy starter project instructs new members to open Gazebo and a visualizer, run the navigation node, and "Watch it move to (5.5, 2)… see the tag, and finally reach the tag" — pass/fail is eyeballs, with no automated verdict and no recorded evidence. (Wiki-mirror source; indicative.) MRover starter projectVia index
It is still happening in 2026. Michigan's MRover finished 3rd at CIRC and 5th at URC 2026 after "a summer filled with troubleshooting and continued testing" — and its write-up documents competition features, built for the new Heist mission, where "many of the tasks the rover had to perform had not yet been tested ahead of the competition" and the team "did not have enough time to fully test and get this feature working before the competition." (The same write-up's forfeits were hardware — a Jetson that failed to reboot, traced to a bad PCIe card, and damaged wiring. Relevant to under-testing generally; not model-validation failures.) MRover CIRC 2026 write-upVia index
The robots are real field machines. CIRC's 2026 rules specify a single self-contained rover, a <50 kg target, a 0.8 m door constraint, ≥1 h per task, and operation in rain, mud, snow, and darkness — outdoor robots whose testing today is physical by default. CIRC 2026 rulesVia 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.
Tool
What it does
Headless
Free
Runs the robot
Verdict + evidence
check_urdf
Parses URDF; prints kinematic chain or parse error
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.
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.
[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.
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.
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.
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.
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.
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.
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
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
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.
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
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
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
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.
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
Ground truth from OdometryPublisher / PosePublisher; DiffDrive odometry is the device under test — per the maintainer semantics in #872. Document that OdometryPublisher pose is currently noise-free world pose (#2668), and resolve topics via the model namespace rather than hard-coding (#4104).
The evidence report is half the product. Per test it should carry: commanded maneuver, measured odometry value, ground-truth value, error, tolerance, verdict, and the model/config hashes. No tool in §5 provides this.
Ship the harness as a container / GitHub Action from day one. Gazebo's own CI doc calls setup "complex and time-consuming," and Afzal's respondents failed at exactly this step; the setup-gazebo action is the sanctioned building block.
Open questions, stated plainly. Anything on this list should not appear in a pitch as established fact.
?
"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.
?
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.
?
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.
?
ros2_controllers #2251
Title and date come from a live GitHub search listing only; the issue page was not individually opened.
?
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.
?
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.
?
Formant and The Construct characterizations
Light-touch, from vendor/roundup material at search level; neither was deep-read. Neither affects the §5 conclusion.
?
LinkForge / fieldpilot-urdf
Physics-linting claims seen in search results were not opened and are excluded from this brief entirely.