URDF describes a robot as a tree of links and joints. A closed kinematic loop - a four-bar linkage, a delta robot, a Stewart platform - does not fit in a tree. These extensions, used by ORIGITECH's RioD, add the two things that are missing: joints without a motor, and the constraints that close the loops.
A file using them is still a URDF file. The new elements live in an XML namespace of their own, so a parser that does not know them - urdfdom, for one - reads the tree and skips the rest.
Declare it on <robot>, with the prefix riod:
<robot name="four_bar" xmlns:riod="https://github.com/Origitech/urdf-extensions">The URI is an identifier, compared character by character and case-sensitively. RioD currently
recognises the elements by their prefix, so use exactly riod.
- Cut every loop once, so that what remains is a tree, and write that tree as ordinary URDF.
- Mark the joints no motor drives with
riod:actuated value="false". - Close every cut with a
riod:loop_closure.
Write the tree so that the loops are closed when all joints are at zero: it tells an importer which way the mechanism is assembled.
Inside a moving <joint> - revolute, continuous or
prismatic.
| Attribute | Value | |
|---|---|---|
value |
true or false |
Required. A joint without the element is actuated. |
A passive joint (false) is not driven: its position follows from the actuated joints through the
loop closures, so at least one closure has to constrain it.
<joint name="rocker" type="revolute">
<origin xyz="0.25 0 0" rpy="0 0 1.5708"/>
<parent link="base_link"/>
<child link="rocker_link"/>
<axis xyz="0 0 1"/>
<limit lower="-3.14" upper="3.14" effort="0" velocity="1"/>
<riod:actuated value="false"/>
</joint>Inside <robot>. Ties the frames of two
links together.
| Attribute | Value | |
|---|---|---|
frameA, frameB |
link names | Required. The two frames to bring together. |
type |
point (default) or rigid |
point: the origins coincide and the orientations stay free - a ball joint, 3 constraints. rigid: the frames coincide entirely - 6 constraints. |
name |
text | Optional name of the closure. |
A link's frame is the frame of the joint that leads to it. To close a loop elsewhere on a link, put
an empty link there on a fixed joint:
<link name="coupler_end"/>
<joint name="coupler_end_frame" type="fixed">
<origin xyz="0.25 0 0"/>
<parent link="coupler_link"/>
<child link="coupler_end"/>
</joint>
<riod:loop_closure name="closure" type="point" frameA="coupler_end" frameB="rocker_end"/>Units and conventions are URDF's own: metres, radians, rpy about the fixed axes.
- URDF XML specification:
robot,link,joint - URDF tutorials (ROS 2)
- urdfdom (The reference parser)
- Namespaces in XML (W3C)