I am trying to do hand eye calibration between the robotic arm end effector and Kinect V1. I am using handeye_calib_camodocal repository for calibration and trying to find $X$ by solving the equation: $$AX=XB$$

I have following 82 transform pairs:

I have following support/holder between Kinect and Robotic arm : enter image description here

But i am getting the following translation in meters which is wrong because camera can not be in such a distance from end effector:

Translation: 0.690257 0.102063 0.459878

I have following launch file:

  <!-- TF names-->
  <arg name="EETF"              default="/tool0_controller" />
  <arg name="baseTF"            default="/base_link" />
  <arg name="ARTagTF"           default="/chess" />
  <arg name="cameraTF"          default="/camera_rgb_frame" />
  <!--<arg name="data_folder"       default="$(find hand_eye_calib)/launch" />-->
  <arg name="data_folder"       default="$(find hand_eye_calib)" />
  <arg name="filename"          default="TransformPairs_HEcalibInput.yml" />
  <arg name="calibrated_filename"          default="CalibratedTransform_HEcalibOutput.yml" />

  <!-- running handeeye_calib_camodocal node-->
  <node pkg="hand_eye_calib" type="hand_eye_calib" name="hand_eye_calib" output="screen">  
  <!-- hand_eye_calib arg pass -->
    <param name="ARTagTF"       type="str" value="$(arg ARTagTF)" />
    <param name="cameraTF"      type="str" value="$(arg cameraTF)" />
    <param name="EETF"          type="str" value="$(arg EETF)" />
    <param name="baseTF"        type="str" value="$(arg baseTF)" />
    <param name="load_transforms_from_file" type="bool" value="false"/>
    <param name="transform_pairs_record_filename" type="str" value="$(arg data_folder)/$(arg filename)" />
    <!-- <param name="transform_pairs_load_filename"  type="str" value="$(arg data_folder)/$(arg filename)" /> -->
    <param name="output_calibrated_transform_filename" type="str" value="$(arg data_folder)/$(arg calibrated_filename)" />

  <!-- running camera_to_ros node-->
  <!-- node pkg="camera_to_ros" type="camera_to_ros" name="camera_to_ros" output="screen"/-->

  <!-- running extrinsic_calibration node-->
  <node pkg="camera_calibration" type="extrinsic_calibration" name="extrinsic_calibration" output="screen"/>

  <!-- running DK node-->


In my case the reason for the wrong result was high amount of noise in extrinsic calibration of the visual sensor. Improving the extrinsic results by increasing image resolution and using better intrinsic parameters decreased the amount of error and noise in my final X matrix.


If the rotation looks right but translation look deviated, noise might be an issue. Usually rotations are more robust to noise than translations when using the calibration equations.

Synthetic data might be a good choice to debug.


Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.