check-robot-relationships#
Code |
DJ.010 |
|---|---|
Validator |
CheckStage |
Compatibility |
|
Tags |
Summary#
Robot joint and link relationships must be validated for proper kinematic tree structure.
Description#
The relationships between joints and links must form a valid kinematic tree without cycles or orphaned components. All joints must properly connect two links (or one link fixed to the world position), and the resulting structure must be a valid robot model for Isaac Sim.
Why is it required?#
To ensure the robot forms a valid kinematic tree structure
To prevent simulation issues from malformed robot hierarchies
To validate robot model integrity for Isaac Sim compatibility
Examples#
# Valid: Proper kinematic tree structure
def "Robot" (
prepend apiSchemas = ["IsaacRobotAPI"]
)
{
# Base link (root of kinematic tree)
def Xform "base_link" (
prepend apiSchemas = ["IsaacLinkAPI"]
)
{
string isaac:linkName = "base_link"
}
# Connected through joint
def Xform "link1" (
prepend apiSchemas = ["IsaacLinkAPI"]
)
{
string isaac:linkName = "link1"
}
# Another link connected to link1
def Xform "link2" (
prepend apiSchemas = ["IsaacLinkAPI"]
)
{
string isaac:linkName = "link2"
}
# Valid joint connecting base to link1
def PhysicsRevoluteJoint "joint1"
{
rel physics:body0 = </Robot/base_link> # Parent
rel physics:body1 = </Robot/link1> # Child
}
# Valid joint connecting link1 to link2
def PhysicsRevoluteJoint "joint2"
{
rel physics:body0 = </Robot/link1> # Parent
rel physics:body1 = </Robot/link2> # Child
}
}
# Invalid: Proper kinematic tree structure
def "Robot" (
prepend apiSchemas = ["IsaacRobotAPI"]
)
{
# Base link (root of kinematic tree)
def Xform "base_link" (
prepend apiSchemas = ["PhysicsRigidBodyAPI"]
)
{
}
# Connected through joint
def Xform "link1" (
prepend apiSchemas = ["PhysicsRigidBodyAPI"]
)
{
}
# Valid joint connecting base to link1
def PhysicsRevoluteJoint "joint1"
{
rel physics:body0 = </Robot/base_link> # Parent
rel physics:body1 = </Robot/link1> # Child
}
# Invalid joint connecting link1 to base_link (circular dependency)
def PhysicsRevoluteJoint "joint2"
{
rel physics:body0 = </Robot/link1> # Parent
rel physics:body1 = </Robot/base_link> # Child
}
}
# Invalid: Circular dependency
# joint1: base -> link1
# joint2: link1 -> base (creates cycle)
## How to comply
* Ensure all joints connect exactly two links (or one link to world)
* Validate the kinematic structure forms a tree (no cycles)
* Check that all links are reachable from the root link
* Verify no orphaned links or joints exist
## Related requirements
- [robot-schema-joint-exist](robot-schema-joint-exist.md)
- [robot-schema-links-exist](robot-schema-links-exist.md)
## For More Information
* [Isaac Sim Robot Validation](https://docs.omniverse.nvidia.com/app_isaacsim/app_isaacsim/tutorial_advanced_import_urdf.html)
* [Kinematic Tree Structure](https://docs.omniverse.nvidia.com/app_isaacsim/app_isaacsim/tutorial_core_hello_world.html)