LiDAR Camera Calibrator
A PySide6 desktop application for manual refinement of static LiDAR-to-camera calibration over synchronized sequences.
It is built for teams that need to inspect and tighten a calibration after a vehicle rig is assembled: for high-quality labeling, sensor validation, map/vehicle experiments, or testing a new calibration hypothesis. Most rigs do not change frequently, so a careful manual refinement pass can be a practical way to get the alignment needed for a specific dataset or workflow.
Use the data you already have. Normalize raw files, Python/NumPy arrays, custom lazy loaders, or standard Foxglove MCAP into the generic sensor contract. KITTI is included as an optional, tested example pipeline.
Features
- manual extrinsic and optional intrinsic refinement for arbitrary named cameras;
- synchronized LiDAR, camera, and interpolated ego-pose timeline;
- navigable CPU-rendered 3D point-cloud view and camera overlays;
- direction-explicit transforms using
P_target = T_target_from_source @ P_source; - undo/redo, numerical editing, resets, comparison view, and JSON export/reload;
- strict, versioned
lidar-camera-scene/1MCAP boundary; - staged 10-frame startup and continuously replenished 40-frame rolling cache;
- package-embeddable Python API with no required application-specific CLI.
Installation
Published releases can be installed with uv:
uv add lidar-camera-calibrator
For development from a checkout:
uv sync --locked
uv run python examples/numpy_scene.py --frames 100 --launch
Manual calibration workflow
Convert application-owned data to the canonical scene profile, then launch the viewer:
from lidar_camera_calibrator import CalibrationConfig, launch_calibrator, write_profile_mcap
source_config = build_source_config_from_your_data()
write_profile_mcap(source_config, "scene.mcap")
result = launch_calibrator(
"scene.mcap",
CalibrationConfig(initial_override="calibration.json"),
)
SourceAdapterConfig accepts ordinary Python sequences and NumPy arrays. Your integration decides how proprietary logs, folders, databases, ROS exports, or other formats are read. The package validates and synchronizes the resulting sensor values before atomically writing canonical MCAP.
For standard Foxglove JSON/base64 MCAP:
from lidar_camera_calibrator import foxglove_source_config, write_profile_mcap
source = foxglove_source_config("recording.mcap")
write_profile_mcap(source, "scene.mcap")
The viewer itself deliberately accepts only canonical scene MCAP:
python -m lidar_camera_calibrator scene.mcap
Documentation
- Getting started
- Integrating your data
- Python API
- Canonical MCAP profile
- Platform support
- Contributing
Build the GitHub Pages site locally with:
uv sync --only-group docs
uv run --no-sync mkdocs serve
Platform status
| Platform | Status |
|---|---|
| Linux | Validated development platform |
| Windows | Supported CPU path; synchronous preparation is retained for safety, with full release workflow validation pending |
| macOS | Expected to work with the CPU/PySide6 stack, but currently experimental until CI and real GUI smoke testing are complete |
No native GPU renderer is currently shipped. The complete CPU workspace is the default on every platform.
Development data
KITTI-specific helpers exist to exercise a known public dataset and regression-test transforms, synchronization, conversion, and rendering. They are optional:
from lidar_camera_calibrator import kitti_source_config
New integrations should normally use SourceAdapterConfig directly or add a focused source adapter that produces it.
License
Licensed under the Apache License 2.0.
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 lidar_camera_calibrator-0.1.0.tar.gz.
File metadata
- Download URL: lidar_camera_calibrator-0.1.0.tar.gz
- Upload date:
- Size: 1.6 MB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
uv/0.12.7 {"installer":{"name":"uv","version":"0.12.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Omarchy","version":"4.0.1","id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3914c0ba68e7fb836b7fa921b5a17a2f22bd76b7174c40ae702c103416667d7d
|
|
| MD5 |
4e6e185d146e289a46f65a3892b0a5ac
|
|
| BLAKE2b-256 |
a6a53cef52100608d6e6ed23797d52ec90d67f34165576c19e31b4f72463b255
|
File details
Details for the file lidar_camera_calibrator-0.1.0-py3-none-any.whl.
File metadata
- Download URL: lidar_camera_calibrator-0.1.0-py3-none-any.whl
- Upload date:
- Size: 125.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
uv/0.12.7 {"installer":{"name":"uv","version":"0.12.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Omarchy","version":"4.0.1","id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
278deb45b7b8d8df8b4d2112b0ffa9679304a04d933a0b24286f7fba4e2bf001
|
|
| MD5 |
c3918b2e56373415bc8cc7c715326e45
|
|
| BLAKE2b-256 |
18432de74061f300de3c2cf8f9543da27a635d777319a6c7e93dfdd959436d76
|