Robot Calibration of iCub v1.3
This page shows how to calibrate the v1.3 CAN based robot.
Preliminary actions
- Set the power supply at 40V, 10A and turn on the robot
- Place the robot in the
zero positionby hand (once calibrated a fine calibration will be done for a better result)
![]() |
![]() |
- On the server run
yarpmanagerand start theicubsrvanpc104clusters:
icub@icubsrv:~$ yarpmanager

- Connect with the
pc104:
icub@icubsrv:~$ ssh -X pc104
Run yarprobotinterface in calibration mode
First turn on the motors. Go to the robot folder:
cd $ROBOT_CODE/robots-configurations/iCubRobotName
Edit the file general.xml and set the first two values as true: skipCalibration and UseRawEncoderData
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE params PUBLIC "-//YARP//DTD yarprobotinterface 3.0//EN" "http://www.yarp.it/DTD/yarprobotinterfaceV3.0.dtd">
<params xmlns:xi="http://www.w3.org/2001/XInclude" portprefix="icub" build="1">
<group name="GENERAL">
<param name="skipCalibration"> true </param>
<param name="useRawEncoderData"> true </param>
<param name="useLimitedPWM"> false </param>
<param name="verbose"> false </param>
</group>
</params>
The file icub_all.xml enables the calibration of all the robot parts (including the skin) - therefore you can comment the parts that you don't want to calibrate. If you are calibrating without the skin, comment the skin part and save in a new file.
Here is how the file icub_all.xml looks like:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE robot PUBLIC "-//YARP//DTD yarprobotinterface 3.0//EN" "http://www.yarp.it/DTD/yarprobotinterfaceV3.0.dtd">
<robot name="iCubLondon01" build="1" portprefix="icub" xmlns:xi="http://www.w3.org/2001/XInclude">
<devices>
<!-- cartesian -->
<xi:include href="cartesian/left_arm_cartesian.xml" />
<xi:include href="cartesian/right_arm_cartesian.xml" />
<!-- motor controllers wrappers -->
<xi:include href="wrappers/motorControl/left_arm_mc_wrapper.xml" />
<xi:include href="wrappers/motorControl/right_arm_mc_wrapper.xml" />
<xi:include href="wrappers/motorControl/left_leg_mc_wrapper.xml" />
<xi:include href="wrappers/motorControl/right_leg_mc_wrapper.xml" />
<xi:include href="wrappers/motorControl/head_mc_wrapper.xml" />
<xi:include href="wrappers/motorControl/torso_mc_wrapper.xml" />
<xi:include href="hardware/motorControl/icub_left_arm.xml" />
<xi:include href="hardware/motorControl/icub_left_hand.xml" />
<xi:include href="hardware/motorControl/icub_right_arm.xml" />
<xi:include href="hardware/motorControl/icub_right_hand.xml" />
<xi:include href="hardware/motorControl/icub_left_leg.xml" />
<xi:include href="hardware/motorControl/icub_right_leg.xml" />
<xi:include href="hardware/motorControl/icub_head.xml" />
<xi:include href="hardware/motorControl/icub_torso.xml" />
<!-- VIRTUAL ANALOG SERVERs -->
<xi:include href="wrappers/VFT/left_arm_VFT_wrapper.xml" />
<xi:include href="wrappers/VFT/left_leg_VFT_wrapper.xml" />
<xi:include href="wrappers/VFT/right_arm_VFT_wrapper.xml" />
<xi:include href="wrappers/VFT/right_leg_VFT_wrapper.xml" />
<xi:include href="wrappers/VFT/torso_VFT_wrapper.xml" />
<xi:include href="hardware/VFT/left_arm_virtual_strain.xml" />
<xi:include href="hardware/VFT/left_leg_virtual_strain.xml" />
<xi:include href="hardware/VFT/right_arm_virtual_strain.xml" />
<xi:include href="hardware/VFT/right_leg_virtual_strain.xml" />
<xi:include href="hardware/VFT/torso_virtual_strain.xml" />
<!-- REAL ANALOG SENSORS -->
<xi:include href="wrappers/FT/left_arm_FT_wrapper.xml" />
<xi:include href="wrappers/FT/left_leg_FT_wrapper.xml" />
<xi:include href="wrappers/FT/right_arm_FT_wrapper.xml" />
<xi:include href="wrappers/FT/right_leg_FT_wrapper.xml" />
<xi:include href="wrappers/MAIS/left_hand_mais_wrapper.xml" />
<xi:include href="wrappers/MAIS/right_hand_mais_wrapper.xml" />
<xi:include href="hardware/FT/left_arm_strain.xml" />
<xi:include href="hardware/FT/left_leg_strain.xml" />
<xi:include href="hardware/FT/right_arm_strain.xml" />
<xi:include href="hardware/FT/right_leg_strain.xml" />
<xi:include href="hardware/MAIS/left_hand_mais.xml" />
<xi:include href="hardware/MAIS/right_hand_mais.xml" />
<!-- SKIN -->
<xi:include href="wrappers/skin/left_arm_skin_wrapper.xml" />
<xi:include href="wrappers/skin/right_arm_skin_wrapper.xml" />
<xi:include href="wrappers/skin/torso_skin_wrapper.xml" />
<xi:include href="hardware/skin/left_arm.xml" />
<xi:include href="hardware/skin/right_arm.xml" />
<xi:include href="hardware/skin/torso.xml" />
<!-- MTX INERTIAL SENSOR & SKIN INERTIAL SENSOR-->
<xi:include href="wrappers/inertials/head-imuFilter_wrapper.xml" />
<xi:include href="wrappers/inertials/head-imuFilter.xml" />
<xi:include href="wrappers/inertials/head-inertials_wrapper.xml" />
<xi:include href="wrappers/inertials/head-inertials_wrapper-deprecated.xml" />
<xi:include href="hardware/inertials/head-inertial.xml" />
<!--
<xi:include href="wrappers/skin/left_hand_inertial_wrapper.xml" />
<xi:include href="wrappers/skin/right_hand_inertial_wrapper.xml" />
<xi:include href="hardware/skin/left_hand_inertial_mtb.xml" />
<xi:include href="hardware/skin/right_hand_inertial_mtb.xml" />
-->
<!-- CALIBRATORS -->
<xi:include href="calibrators/head_calib.xml" />
<xi:include href="calibrators/torso_calib.xml" />
<xi:include href="calibrators/right_leg_calib.xml" />
<xi:include href="calibrators/left_leg_calib.xml" />
<xi:include href="calibrators/left_arm_calib.xml" />
<xi:include href="calibrators/right_arm_calib.xml" />
<xi:include href="calibrators/left_hand_calib.xml" />
<xi:include href="calibrators/right_hand_calib.xml" />
</devices>
</robot>
icub_all.xml is correct you can proceed with the calibration.
Warning
PRESS THE FAULT BUTTON
Run yarprobotinterface and wait for the robot calibration (press Enter multiple times).
✍️ Note: If you want to separately calibrate different parts of the robot (for example for a first check) you can create a new file .xml from icub_all and run it with the command yarprobotinterface --config fileName.xml
Info
After running yarprobotinterface you will see some errors messages related to the fault button pressed.
Calibration
- On the server/laptop run
yarpmotorguiin order to check the joints encoder readings

Warning
Use a Windows pc with Microsoft Office installed to have the correct behaviour of the .xls file macros.
Head calibration (only head V2)
Open the .xls file in your robot folder (i.e. iCub_Calibration_V1_3_1_iCubLondon01.xls), and put the values read from yarpmotorgui in the correspondent value read at zeros column cells.

Warning
Take care that the Delta column has all values set to 0.
Torso
Open the .xls file in your robot folder (i.e. iCub_Calibration_V1_3_1_iCubLondon01.xls), and put the values read from yarpmotorgui in the correspondent value read at zeros column cells.

Warning
Take care that the Delta column has all values set to 0.
Wrist calibration (only for wrist V2)
Place the wrist in the zero position :
![]() |
![]() |
Open the .xls file in your robot folder (i.e. iCub_Calibration_V1_3_1_iCubLondon01.xls), and put the values read from yarpmotorgui in the correspondent value read at zeros column cells.

Hands calibration
Referring to the table below, using a screwdriver read the values Min and Max :
| Part | Joint# | Motor | Min | Max |
|---|---|---|---|---|
| Fingers abduction | 7 | -> | ![]() |
![]() |
| Thumb abduction | 8 | -> | ![]() |
![]() |
| Thumb proximal | 9 | ![]() |
![]() |
![]() |
| Thumb distal | 10 | ![]() |
![]() |
![]() |
| Index proximal | 11 | ![]() |
![]() |
![]() |
| Index distal | 12 | ![]() |
![]() |
![]() |
| Middle proximal | 13 | ![]() |
![]() |
![]() |
| Middle distal | 14 | ![]() |
![]() |
![]() |
| Ring and little | 15 | ![]() |
![]() |
![]() |
Warning
Take care that values read respect the relationship :Min < Max
Otherwise you have to move the magnet until you reach the above situation.
Open the .xls file in your robot folder (i.e. iCub_Calibration_V1_3_1_iCubLondon01.xls), and put the values read from yarpmotorgui in the correspondent value read at zeros column cells.

Warning
Take care that the Delta column has all values set to 0.
Legs calibration
Open the .xls file in your robot folder (i.e. iCub_Calibration_V1_3_1_iCubLondon01.xls), and put the values read from yarpmotorgui in the correspondent value read at zeros column cells.

Warning
Take care that the Delta column has all values set to 0.
Arms Fine Calibration
Here's described how to correct small errors in the calibration of the iCub. It applies mainly to the shoulder and elbow joints (joint0...joint3) but can be applied also for the other joints of the arm.
Info
This procedure has to be done after the calibration of the torso.
Put the iCub in a suitable posture and let's call this configuration theta_desired in accordance to the convention you decided to use. As an example, if you decide to use the convention described in ICubForwardKinematics, you might decide to use the posture in the pictures which corresponds to theta_desired = [-90 15 15 90] [deg] (remember we are just considering the three dof of the shoulder and the elbow, an example is given in the pictures below).
![]() |
![]() |
![]() |
The aim is to insert the calibration deltas in each arm's Delta column cells of the .xls file using the formula: Delta = Theta - Theta_Desired.
Eyes calibration (only head V2)
The eyes mechanism has a total of three degrees of freedom. Both eyes can pan (independently) and tilt (simultaneously).

Thus the three joints to calibrate are: version (left-right movement), vergence (in-out) and tilt (up-down).
While the tilt can be calibrated by directly inserting the delta value in the Delta column cell of the .xls file, the version and vergence need to be calibrated as follows:
Joint 4 (version): delta = |delta_j4| + |delta_j5|
Joint 5 (vergence): delta = |delta_j4| - |delta_j5|
with sign to be chosen accordingly.
Update xml files
Generate the new .xml files - automated
Warning
If you updated the SW (i.e. updated to robotology/robotology-superbuild), avoid to follow this steps and do the manual procedure
In order to get the new .xml files you need to :
- Press
Generate Calibratorsbutton - Press
Generate Allbutton
Generate the new .xml files - manual
Info
Follow this procedure to manual edit the xml files if you updated the SW on your setup since the template inside the xls may contain outaded/missing params
- Manually copy only the highlighted lines below and paste them inside the corresponding
xmlfile insidecalibratorsfolder

- Manually copy only the highlighted lines below and paste them inside the corresponding
xmlfile insidehardware/motorcontrolfolder

Obviously, you have to do the same for each robot part































