A manual LiDAR-Camera calibration tool for ROS 2
Project description
ros2_calib
██████ ██████ ███████ ██████ ██████ █████ ██ ██ ██████
██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██
██████ ██ ██ ███████ █████ ██ ███████ ██ ██ ██████
██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██
██ ██ ██████ ███████ ███████ ██████ ██ ██ ███████ ██ ██████
═══════════════════════════════════════════════════════════
Multi-Sensor Calibration Tool for ROS 2
🎯 Precise • 🚀 Fast • 🔧 Interactive
>>> pip install ros2-calib <<<
═══════════════════════════════════════════════════════════
ros2_calib is a multi-sensor calibration tool for ROS 2 that provides intuitive graphical interfaces for performing precise extrinsic calibration between different sensor types. The tool supports both LiDAR-to-Camera and LiDAR-to-LiDAR calibration workflows. Built with PySide6, it operates on recorded rosbag data without requiring a live ROS 2 environment. It supports reading /tf_static transforms from rosbags and allows users to quickly calibrate and export the resulting transformation directly into URDF format. Although it is a manual calibration tool, we made the expierence that it is faster to use than a target-based calibration method and is more accurate than automatic methods.
Screenshots
Start Window with Calibration Type Selection
Rosbag Loading and Topic Selection
TF Tree Visualization and Initial Transform Selection
LiDAR-to-Camera Calibration Interface
LiDAR-to-LiDAR Calibration Interface (Open3D)
Target Link Selection and URDF Export
Features
LiDAR-to-Camera Calibration
- 🎯 Interactive Calibration: Point-and-click interface for 2D-3D correspondences
- 🔄 Real-time Visualization: Live point cloud projection with adjustable parameters
- 🧠 Smart Algorithms: RANSAC-based PnP solver with Scipy least-squares refinement
- 🧹 Point Cloud Cleaning: Advanced occlusion removal using the RePLAy algorithm
- ⌨️ Keyboard Shortcuts: ESC to cancel, Backspace to delete, Enter to confirm
LiDAR-to-LiDAR Calibration
- 🎮 3D Interactive Interface: Open3D-based point cloud visualization
- 🔧 Manual Adjustment: Precise transformation controls with step-size configuration
- 🤖 Automatic Registration: Point-to-point and point-to-plane ICP algorithms
- 👁️ Dual Visualization: Independent control over source and target point cloud visibility
- 📊 Calibration View: Live transformation matrix updates and registration metrics
General Features
- 🌳 TF Tree Integration: Visual transform chain management and URDF export
- 💾 Offline Processing: Works with .mcap rosbag files - no live ROS 2 required
- 🎨 Easy-to-Use UI: Organized sections with responsive design
- 📱 Multi-Calibration Types: Seamless switching between different calibration workflows
Installation
Prerequisites
- Tested with Python 3.12.3 and Ubuntu 24.04
- Compatible rosbag files in
.mcapformat
Rosbag Requirements
Your rosbag file (.mcap format, tested with Jazzy and Humble) should contain the following topics:
For LiDAR-to-Camera Calibration:
- Camera topics:
/camera/image_rawor/camera/image_rectsensor_msgs/Imagesensor_msgs/CompressedImage
- Camera info:
/camera/camera_info(sensor_msgs/CameraInfo) - LiDAR topics:
/lidar/pointsor similar (sensor_msgs/PointCloud2)
For LiDAR-to-LiDAR Calibration:
- Source LiDAR topic:
/lidar1/points(sensor_msgs/PointCloud2) - Target LiDAR topic:
/lidar2/points(sensor_msgs/PointCloud2)
Optional but Recommended:
- Transform topics:
/tf_static(tf2_msgs/TFMessage)- Contains static transformations between sensor frames
- If not available, you'll need to manually specify initial transforms
Furthermore, the metadata file (metadata.yaml) must be present in the same
directory as the .mcap file (usually automatically created by ROS 2 when recording).
Topics can be named differently; the tool allows you to select the correct topics during setup.
Install from PyPI
pip install ros2-calib
Install from Source
# Clone the repository
git clone https://github.com/ika-rwth-aachen/ros2_calib.git
cd ros2_calib
# Create a virtual environment
python -m venv .venv
source ./venv/bin/activate
# Install in development mode
python -m pip install .
Quick Start
-
Launch the application:
ros2_calib
-
Select calibration type: Choose between LiDAR-to-Camera or LiDAR-to-LiDAR calibration
-
Load your rosbag: Click "Load Rosbag" and select your .mcap file
-
Select topics: Choose your sensor topics based on calibration type
-
Set initial transform: Configure the transformation between sensor frames
-
Perform calibration:
- LiDAR-to-Camera: Select frame, create 2D-3D correspondences, run calibration
- LiDAR-to-LiDAR: Use interactive 3D interface with manual adjustment and/or ICP
-
Export results: View transformation chains and export URDF-ready transforms
Workflow Overview
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ Select Calib │ -> │ Load Rosbag │ -> │ Select Topics │ -> │ Set Initial TF │
│ Type (L2C/L2L) │ │ (.mcap file) │ │ (sensors) │ │ (manual/auto) │
└─────────────────┘ └─────────────────┘ └─────────────────┘ └─────────────────┘
│
┌─────────────────┐ ┌─────────────────┐ │
│ Frame Selection │ -> │ LiDAR2Camera │ <----------┘
│ (L2C only) │ │ Calibration │
└─────────────────┘ └─────────────────┘
│
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │
│ Export URDF │ <- │ Transform Chain │ <- │ View Results & │ <----------┘
│ Transform │ │ Visualization │ │ TF Integration │ │
└─────────────────┘ └─────────────────┘ └─────────────────┘ │
▲ │
┌─────────────────┐ ┌─────────────────┐ │
│ LiDAR2LiDAR │ -> │ │ <----------┘
│ Calibration O3D │ │ │
└─────────────────┘ └─────────────────┘
Core Architecture
- main.py: Application entry point with PySide6 QApplication setup
- main_window.py: Multi-view interface with stacked widget navigation and calibration type selection
- calibration_widget.py: Interactive LiDAR-to-Camera calibration view with 2D/3D visualization
- lidar2lidar_o3d_widget.py: Open3D-based LiDAR-to-LiDAR calibration interface
- frame_selection_widget.py: Frame selection interface for synchronized sensor data
- calibration.py: Core mathematical algorithms using OpenCV and Scipy
- bag_handler.py: Rosbag processing and message extraction utilities
- ros_utils.py: Mock ROS 2 message types for offline operation
- tf_graph_widget.py: Interactive TF tree visualization using NodeGraphQt
- lidar_cleaner.py: Point cloud cleaning based on RePLAy Algorithm (ECCV 2024)
Algorithm Details
LiDAR-to-Camera Calibration
Two-Stage Calibration Process:
- Initial Estimation: OpenCV's
solvePnPRansacfor robust pose estimation - Refinement: Scipy's
least_squaresoptimization minimizing reprojection error - Quality Assessment: Automatic outlier detection and correspondence validation
Point Cloud Processing:
- Occlusion Removal: RePLAy algorithm removes projective artifacts
- Intensity-based Coloring: Configurable colormap visualization
- Real-time Projection: Live updates during manual adjustments
LiDAR-to-LiDAR Calibration
Interactive 3D Calibration:
- Manual Adjustment: Precise translation and rotation controls with configurable step sizes
- Automatic Registration: Point-to-point and point-to-plane ICP algorithms
- Real-time Visualization: Open3D-based 3D rendering with dual point cloud display
- Quality Metrics: Live fitness and RMSE feedback during ICP registration
Configuration
The tool automatically handles:
- Message Format Detection: Supports Image and CompressedImage types
- Coordinate Frame Resolution: TF tree parsing and path finding
- Camera Model Integration: Full camera info and distortion support
Development
Code Quality
# Run linter
ruff check
# Format code
ruff format
Contributing
We welcome contributions! Please see our Contributing Guidelines for details.
- Fork the repository
- Create your feature branch (
git checkout -b feature/AmazingFeature) - Commit your changes (
git commit -m 'Add some AmazingFeature') - Push to the branch (
git push origin feature/AmazingFeature) - Open a Pull Request
Troubleshooting
Common Issues
- "No topics found": Ensure your .mcap file contains the required sensor topics
- "TF tree empty": Check that your rosbag includes transform messages
- Calibration fails: Verify you have at least 4 correspondence points
Getting Help
- Open an issue for bug reports
License
This project is licensed under the MIT License - see the LICENSE file for details.
Citation
If you use this tool in your research, please cite:
@software{ros2_calib,
title={ros2\_calib: A Multi-Sensor Calibration Tool for ROS2},
author={Till Beemelmanns},
year={2025},
url={https://github.com/ika-rwth-aachen/ros2_calib},
publisher={Zenodo},
doi={10.5281/zenodo.17119720},
url={https://doi.org/10.5281/zenodo.17119720},
swhid={swh:1:dir:0ac40351ccecf475772e49b7578fde53d224f6c4
;origin=https://doi.org/10.5281/zenodo.17119720;vi
sit=swh:1:snp:98106a33aaa26f183d05dce909dc2da8c53b
dab7;anchor=swh:1:rel:519b58ff48f20a36f6c36d6b3d06
4bf1e7418432;path=ika-rwth-aachen-
ros2\_calib-6fb095d
},
}
Acknowledgments
Point Cloud Cleaning Algorithm
We integrate the RePLAy algorithm for removing projective LiDAR artifacts:
@inproceedings{zhu2024replay,
title={RePLAy: Remove Projective LiDAR Depthmap Artifacts via Exploiting Epipolar Geometry},
author={Zhu, Shengjie and Ganesan, Girish Chandar and Kumar, Abhinav and Liu, Xiaoming},
booktitle={ECCV},
year={2024},
}
Dependencies
- PySide6 - Cross-platform GUI toolkit
- OpenCV - Computer vision algorithms
- NumPy - Numerical computing
- SciPy - Scientific computing
- Open3D - 3D visualization and point cloud processing
- NodeGraphQt - Node graph visualization
- rosbags - Pure Python rosbag processing
Notice
[!IMPORTANT]
This repository is open-sourced and maintained by the Institute for Automotive Engineering (ika) at RWTH Aachen University.
We cover a wide variety of research topics within our Vehicle Intelligence & Automated Driving domain.
If you would like to learn more about how we can support your automated driving or robotics efforts, feel free to reach out to us!
:email: opensource@ika.rwth-aachen.de
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file ros2_calib-0.1.4.tar.gz.
File metadata
- Download URL: ros2_calib-0.1.4.tar.gz
- Upload date:
- Size: 4.4 MB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.19
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a7f31488f3a17a810102f1ce408c8f7c8cc781445303603d782d47d9d32d830e
|
|
| MD5 |
c4c72b1189b3c12bfce4c52bbbd7536f
|
|
| BLAKE2b-256 |
62920f71c22031af92471ce15bc0bc0ab22fdf2cb751c3776e17f8fb82d0f489
|
File details
Details for the file ros2_calib-0.1.4-py3-none-any.whl.
File metadata
- Download URL: ros2_calib-0.1.4-py3-none-any.whl
- Upload date:
- Size: 75.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.19
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e3de3f1388456905892ee02bc0ec10794613bb6635545c026201096b2c4b5af6
|
|
| MD5 |
bdf32672d87f3393609dcbc64cf789af
|
|
| BLAKE2b-256 |
97d311253e3c1534d9fe643cfd77734b6e23de33617be22c90001ceb1e4370cb
|