Hi everyone,
in our lab we developed a small educational kit to build a wide variety of parallel robots, it is called PARA-ENGINEER. These robots serve as compact examples for teaching and demonstrations. Some of them can be seen in the image below. Until now, the entire software stack was implemented as a single Python script handling user input, applications, motion and trajectory planning, kinematics, and stepper control. We are currently migrating this system to a modular, ROS-based architecture.
Using ROS with parallel robots presents several challenges, especially when the goal is to support arbitrary kinematic structures. One of the first major issues we encountered was the description of closed kinematic loops in URDF. There are existing approaches to address this limitation, such as using SDFormat, but they did not meet our requirement of a simple, structure-only description without assuming prior knowledge of a specific configuration .
In common parallel robot modelling, closed loops are typically converted into tree structures by “cutting” the loops and introducing additional loop-closure equations. URDF is well suited to describe the resulting tree structure. However, it lacks a way to explicitly describe the cuts themselves .
To address this, we introduced a new constraint element in our URDF version. This element is derived from the standard joint description and contains origins and axes for both parent and child frames. It allows us to define the two cut frames and reconnect them using different joint types. A second axis is included where necessary, e.g. to describe universal joints.
<constraint name=“Name” type=“Type”>
<parent link=“Parent_Name”/>
<parent_origin xyz=“Offset_Child” rpy=“RPY_Parent”/>
<parent_axis xyz=“Joint_Axis_Parent”/>
<child link=“Child_Name”/>
<child_origin xyz=“Offset_Child” rpy=“RPY_Child”/>
<child_axis xyz=“Joint_Axis_Child”/>
</constraint>
By adding new elements rather than modifying existing ones, all standard ROS tools remain fully compatible: they simply ignore the additional constraint elements. Constraint solving is handled in a separate package. We use a Newton–Raphson algorithm to solve the loop-closure equations and compute a valid robot state based on the current configura tion.
We are currently validating this approach using Rviz, while working on implementing our solution into the ROS framework. We are preparing a pull request for URDFDOM and URDFDOM-Headers with our proposed extensions. In future projects, we want to add the constraints and solver to the robot-state-publisher and implement an additional kinematics solver for MoveIt to consider the passive structures of the robot. Additionally, we want to validate the results with our industrial grade parallel robots and use it for further projects and research.
Best regards
Fabian Finkbeiner

