A complete GUI application for hand-eye calibration of the Franka robot using a RealSense camera and Charuco board.
The robot control runs on a real-time machine. We recommend using ServoBox to deploy the franky-remote server.
Install and run the package for your robot generation:
# For Franka Emika Panda (Gen1)
servobox pkg-install franky-remote-gen1
servobox run franky-remote-gen1
# OR for Franka Research 3 (FR3)
servobox pkg-install franky-remote-fr3
servobox run franky-remote-fr3Clone and install dependencies:
git clone https://github.com/kvasios/franka-handeye.git
cd franka-handeye
# Create environment (optional but recommended)
micromamba create -n franka-handeye python=3.10
micromamba activate franka-handeye
# Install
pip install -r requirements.txt
pip install -e .- Print Board: The Charuco board file is located at
config/charuco_board_5x7.png. Print this file on A4 or Letter paper. - Measure: After printing, you MUST measure the physical dimensions of the squares and markers on your paper.
- Update Config: Edit
config/calibration_board_parameters.yamlwith your measured values:square_length: Side length of a checkerboard square (in meters).marker_length: Side length of an ArUco marker (in meters).
Failure to update these values will result in incorrect calibration!
config/joint_poses.yaml: Contains the 12 poses used for Auto Capture.
Run the GUI application:
python franka-handeye-app.py --host <ROBOT_IP>Default host is 172.16.0.2
- Capture:
- Auto Run: Uses 12 recommended preset poses to automatically capture the dataset.
- Manual: Alternatively, use Jog Controls to move to your own poses and click Capture.
- Ensure ChArUco board is detected (green status) for each pose.
- Calibrate:
- Click Run Calibration.
- Check the result and 3D plot.
- Verify:
- Check Frames: Visualizes the computed frame alignment.
- Visit Corners: Robot physically traces the board corners to verify accuracy.
Individual scripts are available in scripts/ for CI or headless operation:
scripts/capture_data.py: Capture dataset.scripts/compute_calibration.py: Compute from existing data.scripts/verify_calibration.py: Run physical verification.

