Handeye Calibration¶
We provide a hand-eye calibration toolkit designed to determine the spatial transformation between the robot arm and the camera(i.e., camera extrinsics). The tool supports both eye-in-hand and eye-to-hand configurations. By utilizing teleoperation (e.g., ALOHA) or a predefined set of waypoints, the system captures the ArUco marker pose at various poses within the camera’s field of view and the robot arm end-effector pose at the same time. This process yields a series of pose pairs, from which the final calibration matrix is computed.
Sample Data Collection Process¶
Get aruco_ros package and build it
cd ros2_package
git clone https://github.com/pal-robotics/aruco_ros -b humble-devel thirdparty
cd thirdparty
colcon build
source install/setup.bash
Configure the parameters in launch_handeye_calib.sh in the handeye_calib directory to your actual usage:
Arguments |
Explain |
|---|---|
MODE |
‘eye_in_hand’ or ‘eye_to_hand’ |
ARUCO_MARKER_SIZE |
size of aruco marker you used |
ARUCO_MARKER_ID |
ID of aruco marker you used |
CAMERA_FRAME_NAME |
frame name of the camera to be calibrated, which must match the actual frame name published by your camera driver |
ARUCO_MARKER_FRAME_NAME |
The frame name to be assigned to the ArUco marker. You can typically keep the default ‘marker_frame’ |
CAMERA_INFO_TOPIC |
The ROS2 topic name of your camera info |
CAMERA_RAW_TOPIC |
The ROS 2 topic name for your camera info/raw image |
END_EFFECTOR_FRAME_NAME |
frame name of your EEF, which can typically be found in your URDF file |
BASE_FRAME_NAME |
The base frame name of your robot arm (e.g., |
END_EFFECTOR_POSE_TOPIC |
The ROS 2 topic name where the end-effector (EEF) pose is published |
RESULT_FILE |
path to save calibration result json file |
The final output is a json file in the ros tf format, which specifies the parent and child frames, and represents the result with quaternion. You could see a sample output of eye-in-hand calibration result in the following:
Note
Frame is defined in ROS standard
Quaternion is scalar-last, i.e., position: [x, y, z], orientation: [qx, qy, qz, qw]
{
"parent_frame": "left_end_effector",
"child_frame": "left_wrist_camera",
"result": {
"position": [
-0.07111201370909159,
0.005933229997508317,
0.026299147506149152
],
"orientation": [
0.12614812772318,
-0.15849564864236187,
0.704431212421235,
-0.6802517520742759
]
}
}
If your configed the launch_handeye_calib.sh correctly, you will see the following visualization in foxglove studio, if the result is good, the marker_frame will not change much.