[Documentation] [TitleIndex] [WordIndex



This package provides a toolkit to optimize an arbitrary kinematic chain with the help of a set of calibration data.


This package calculates the best approximation for a kinematic chain's parameters using rosenbrock optimization. For calculation, a layout of the kinematic chain must be provided, as well as a set of transformations between two frames of the chain that has been acquired during calibration. It can be used for defining new kinematic chains as well as optimizing existing. With the calculated Transformation, it is easy to define static_transformation_publisher or an urdf-file.


This package is a standalone tool for optimizing a kinematic chain. Therefore an pseudo tf-link is added to an existing kinematic chain to close it and to get a circular topology. Furthermore, offset-links are added to the kinematic chain to get some TFs to vary. A lot of training n-tuples are recorded with n=(number of non-fix joints in kinematic chain). The algorithm tries to find a kinematic chain which satisfy the configuration with all n-tuples best. An overview about the frame-file in xml-format is given now:


To specify an input-file use the <Data>-tag. This surrounds the whole file.

To specify the structure of your kinematic chain use the <Frames>-tag. In this area the tf-frames are defined. There are some different types of frames:

A simple parent-child relation is defined as <Frame name="Frame2" base="Frame1"/>, with Frame1 is the parent node of Frame 2.

A fixed transformation between parent and child is defined as follows

<Frame name="Frame2" base="Frame1" x="0.1" y="0.1" z="0.1" qx="1" qy="0" qz="0" qw="0"/>.

To tell the algorithm which frame can be used for optimization, boundaries are set:

<Frame name="Frame2" base="Frame1" max_x="0.3" min_y="-0.3" max_y="0.3" min_z="-0.3" max_z="0.3" min_ry="-3.0" max_ry="3.0" min_rx="-3.0" max_rx="3.0" min_rz="-3.0" max_rz="3.0"/>

Non-fixed frames are defined with parameters. These parameters are given to the optimizer within an extra file. To define a parameter, simply use square-brackets and count upwards starting at 1. Add data="true":

<Frame name="Frame2" base="Frame1" qx="([1])" qy="([2])" qz="([3])" qw="([4])" x="([5])" y="([6])" z="([7])" data="true"/>

This is all need to specify a kinematic chain.

To specify the goal function (for closing you kinematic chain) use the <Goal>-tag. The goal can be ether the position, orientation or both.

The position use the <Position first="Frame1" second="Frame2" />-Tag. With this goal, the algorithm tries to set the position of Frame1 equal to the one of Frame2. Same for <Orientation first="Frame1" second="Frame2" /> with the frames orientations.

A sample frame-file is given in the tutorial section.


The data-file contains just the n-tuple datasets. One n-tuple is in one line. The single values are separated with a semicolon and a space. The program maps the data in column one to the first parameter (e. g. "[1]") and so on. calibration_data.png


The optimizer outputs the calculated values for the kinematic chain parameters directly to the console. optimization_result.png

The line "Result" shows the optimized frames which were specified in the kinematic chain.

Needed packages

No additional packages are needed.

Needed software

Needed hardware

No hardware is needed. But it is recommended to have a real robot or construction to get some real training-data.

Start system

roslaunch asr_kinematic_chain_optimizer optimizer.launch

Don't forget to set args!

ROS Nodes


The following args can be passed to the program:






Tutorial Slides





2024-07-20 12:40