Neatbo.

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.

Browser-local processingInputExpanded UTF-8 URDFOutputGraph JSON / CSVUp to 5 MiB per file · File limit: 1
  1. 1Add input
  2. 2Adjust settings
  3. 3Get your result

Tool input and files are processed in this browser without being uploaded.

Your input

Inputs are kept temporarily in this tab when switching tools. Refreshing or closing clears them; large results may need to be regenerated.

⌘ / Ctrl + Enter to run

or drag and drop it here

Files stay on this device. Your originals stay unchanged.

.urdf · .xml · .txt

Up to 5 MiB per file · File limit: 1

    0 characters · 0 bytes
    Options

    Complete the required options first. You can keep the defaults for the rest.

    Preparing the tool…

    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

    1. Select or paste one already-expanded UTF-8 robot XML. Run the declared graph review.
    2. Inspect unresolved references, root count, separate components and cycle components together. Depth is available only for a valid declared tree.
    3. 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