URDF declared-link graph review
Inspect declared URDF links and joints for unresolved references, multiple parents, roots and cycles, preserving the full source and exact byte positions.
- 1Add input
- 2Adjust settings
- 3Get your result
Tool input and files are processed in this browser without being uploaded.
Before you start
Explain a root-link error before opening a simulator. Review the whole declared parent-child graph, including isolated roots and separate cycles; keep the original XML beside every finding.
How to use this tool
- Select or paste one already-expanded UTF-8 robot XML. Run the declared graph review.
- Inspect unresolved references, root count, separate components and cycle components together. Depth is available only for a valid declared tree.
- Download complete JSON/CSV and check byte locations against the original source before changing the model.
Supported inputs and limits
One already-expanded UTF-8 robot XML up to 5 MiB, with optional UTF-8 BOM; up to 10,000 links, 10,000 joints and XML depth 64. Complete source-containing JSON and CSV together must fit 20 MiB. All limits apply together.
Audits declared link/joint names, parent-child references, unresolved links, multiple incoming joints, roots, strongly connected cycles, weak components and depths of a valid declared tree. A report can complete while genuine graph issues remain; one root alone is insufficient.
Duplicate names, missing or repeated parent/child references and malformed XML reject the whole input. Unresolved declared links, self-loops, cycles and multiple parents appear as structural issues. Names are exact and case-sensitive.
DTD/entity declarations, processing instructions, namespaced elements/xacro and unresolved ${...} or $(...) names are Unsupported. Built-in and numeric XML character references are decoded as inert names. No mesh, package, URL or external file is opened.
Joint types, model versions, visual/collision/inertial/dynamics/mimic and unknown XML content remain unreviewed. Their original source is retained. This is not whole-URDF schema validation, physics, simulation, closed-loop repair or a claim that a robot is safe to run.
Full JSON includes original UTF-8 source, filename/hash, all links/joints and their exact UTF-8 byte spans, each parent/child tag, components and issues. CSV contains every link/joint. Preview shows 200 rows and 2,000 UTF-16 units per cell; large reports copy only the labelled preview. Downloads remain complete.
Worked example
Example input
<robot name="declared-demo"><link name="world"/><link name="a"/><link name="b"/><link name="c"/><joint name="ab" type="fixed"><parent link="a"/><child link="b"/></joint><joint name="bc" type="fixed"><parent link="b"/><child link="c"/></joint><joint name="ca" type="fixed"><parent link="c"/><child link="a"/></joint></robot>
Example options
{"secondary":"","params":{"spreadsheetSafe":true}}Example output
{"source":{"name":"pasted.txt","bytes":323,"sha256":"ea213eef9dd4981b3a51565faeae2ce3d8ba278f70f4e759ff896a0bffb9eb50","encoding":"UTF-8","bomRetained":false},"sourceText":"<robot name=\"declared-demo\"><link name=\"world\"/><link name=\"a\"/><link name=\"b\"/><link name=\"c\"/><joint name=\"ab\" type=\"fixed\"><parent link=\"a\"/><child link=\"b\"/></joint><joint name=\"bc\" type=\"fixed\"><parent link=\"b\"/><child link=\"c\"/></joint><joint name=\"ca\" type=\"fixed\"><parent link=\"c\"/><child link=\"a\"/></joint></robot>","robot":{"name":"declared-demo"},"summary":{"links":4,"joints":3,"roots":1,"issues":1,"cycleComponents":1,"weakComponents":2,"validDeclaredTree":false,"status":"graph-issues-found"},"links":[{"index":0,"name":"world","source":{"utf8Start":28,"utf8Bytes":20},"incomingJointIndexes":[],"childLinkIndexes":[],"depth":null},{"index":1,"name":"a","source":{"utf8Start":48,"utf8Bytes":16},"incomingJointIndexes":[2],"childLinkIndexes":[2],"depth":null},{"index":2,"name":"b","source":{"utf8Start":64,"utf8Bytes":16},"incomingJointIndexes":[0],"childLinkIndexes":[3],"depth":null},{"index":3,"name":"c","source":{"utf8Start":80,"utf8Bytes":16},"incomingJointIndexes":[1],"childLinkIndexes":[1],"depth":null}],"joints":[{"index":0,"name":"ab","type":"fixed","parent":"a","child":"b","source":{"utf8Start":96,"utf8Bytes":73},"parentSource":{"utf8Start":126,"utf8Bytes":18},"childSource":{"utf8Start":144,"utf8Bytes":17},"parentIndex":1,"childIndex":2,"status":"resolved"},{"index":1,"name":"bc","type":"fixed","parent":"b","child":"c","source":{"utf8Start":169,"utf8Bytes":73},"parentSource":{"utf8Start":199,"utf8Bytes":18},"childSource":{"utf8Start":217,"utf8Bytes":17},"parentIndex":2,"childIndex":3,"status":"resolved"},{"index":2,"name":"ca","type":"fixed","parent":"c","child":"a","source":{"utf8Start":242,"utf8Bytes":73},"parentSource":{"utf8Start":272,"utf8Bytes":18},"childSource":{"utf8Start":290,"utf8Bytes":17},"parentIndex":3,"childIndex":1,"status":"resolved"}],"roots":[0],"issues":[{"kind":"cycles","stronglyConnectedLinkComponents":[[1,2,3]]}],"cycleComponents":[[1,2,3]],"weakComponents":[[0],[1,2,3]],"validDeclaredTree":false,"graphProfile":"declared resolved parent-child edges only; no simulator execution","unreviewed":["visual","collision","inertial","dynamics","mimic","mesh-access","joint-type","robot-version","unknown XML content"]}When something does not work
Correct malformed XML, duplicate names or incomplete references; expand template names deliberately. For graph findings, inspect full issues and source spans, then rerun the revised model. Reduce input or complete report size after a limit failure; cancellation publishes no partial graph.
Frequently asked questions
Why can one world root coexist with a cycle?
A world link can be an isolated component while other links form a closed directed cycle. The starter shows one root, two weak components and a three-link cycle; the declared graph is not a tree.
Does an issue-free graph make the robot valid?
It only passes this declared parent-child structure check. Joint types, geometry, inertia, mimic semantics, model versions and simulator constraints remain unreviewed.
Does the tool fetch mesh URLs or expand xacro?
No. URL text remains inert. Expand xacro with your trusted local workflow first; this tool rejects xacro namespaces and unresolved names.
Documentation & further reading
Related tools
JSON formatting workspace
Format or minify strict JSON, sort object keys, and encode or decode strings while preserving raw number tokens.
Regex tester
Try a pattern and see what it matches in your text.
Compare text
See what changed, side by side.
HTML formatter
Format HTML indentation so its structure is easier to read.