Universal Robots+

Return calibrated pose


I have attached a camera to the wrist2-link (moving wrist2 and wrist3 does not change it’s pose). For the hand-eye calibration, I used the published joint values and an urdf from ROS to get the pose of this joint. The calibration works ok, but still has an error of some millimetres. I think this could be related to the factory calibration that is integrated in the tool pose that is published by the robot. Is there a way to get the pose all links relative to the robot base?


1 Like

You can use the script code get_actual_joint_positions() to read out the actual reading of the joint positions.
The get_actual_tcp_pose() will naturally give you the Cartesian offset from Base to active TCP, but as your camera is mounted on Wrist 2, this would not yield correct values.

You can however use our Denavit Hartenberg parameters, to calculate the Cartesian offset to the Wrist 2 link.
Note these are generic values. As all robots are kinematically (absolute) calibrated before leaving the factory, there is a correction matrix to these parameters. It is stored in the calibration files under the .urcontrol folder in the filesystem.
Using this will yield the actual Denavit Hartenberg parameters of your specific robot.


So get_actual_tcp_pose uses the calibrated DH-parameters to compute the tool pose?
I’ve never worked with the filesystem directly before, could you tell me how I can access it?

Thanks for the fast and perfect response!

Yes, it does.

You can access the file system over FTP.
User: root
Password: easybot
Port: 22

Please note that nothing is write-protected, hence don’t tamper with anything you do not know what is. You might break it :slight_smile:


Thanks! I found the values in the calibration.conf. Is this the right file?

For my robot, the files contains these offsets:
delta_a = [ 0.000196786273340118317, 0.0177632568490212472, 0.00178028688358344844, 4.26880888505028712e-05, 0.000106416277077938209, 0]
delta_d = [ 0.000186177018316968645, 29.3169125879465362, -26.1274858768782146, -3.18805832842520465, 0.000221615658902718504, 0.000123518832232813458]
delta_alpha = [ -0.000338894122350330562, -0.00414472108920117734, 0.0106628339645100205, -0.00103098291553127552, 0.000301239160684696472, 0]
delta_theta = [ -2.38411743536260574e-05, -0.289992420813053098, 0.376819256488460819, -0.086920699986470229, 2.23893379858431079e-05, 1.10894351629716242e-05]

In which unit are these values given? Especially the delta_d with values around 30 looks strange.

Could someone tell me how to interpret these values?


This Youtube-video explains DH parameters very nicely.

All units are in meters and radians. They are additional corrections to the generic values.

When you check out the generic DH parameters, you notice d for the 2nd and 3rd entry are 0.
This is where the rotational axes generically are parallel for respectively Shoulder to Elbow, and Elbow to Wrist 1.
As they are parallel you can select any common normal towards the next axis. We chose 0.
However this is only in theory, in reality they are not really parallel, and the d is hence the place where the two axes are closest together - the actual common normal. In this case around 30 meters away from the actual joint. Hence, the higher value, actually the more parallel.


Thanks for the explanation that sound reasonable.

In my calculation to get the DH, I need to use the calibrated value. Theses values are correct i.e - close to the theoretical value- excepts delta_d for axis 2, 3 and 4. (Same as the example above)
I can use 0 for delta_d for axis 2 and 3, because the theoretical value is 0. But what is the value I have to use for the axis 4, because d4 is not 0 ?
And if the delta_d2 and delta_d3 are absurds, why the value of d2 and d3 in .urp are not forced to 0 ?