Self-hosted service
koide3/direct_visual_lidar_calibration avatar
koide3/direct_visual_lidar_calibration

direct_visual_lidar_calibration for Target-less ROS Calibration

A toolbox for target-less LiDAR-camera calibration [ROS1/ROS2]

1,567 stars239 forksC++License varies

At a glance

What is it?
direct_visual_lidar_calibration is a C++ toolbox for automatic, target-less LiDAR-camera calibration under ROS1 or ROS2. It supports several sensor projection models and can operate from one data pair, but its dependency stack and scene requirements need checking before adoption.
Who is it for?
Adoption fits robotics teams that need an automatic ROS1 or ROS2 calibration path and can supply suitably structured, textured scene data without a calibration target. It is less suitable for teams unable to build the ROS, PCL, OpenCV, GTSAM, Ceres and Iridescence stack, or for sensor-camera combinations whose projection models are not covered.
Can I use it commercially?
Not without permission. GitHub finds no licence file in the repository, and without a licence all rights are reserved by default: you may read the code but not reuse it. Check the README, or ask the authors, before using it.
Is it still maintained?
Yes. The repository last received commits 93 days ago.
What is it written in?
Mainly C++, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on October 23, 2026, and from our analysis. They are not legal advice.

Editorial analysis

Why direct_visual_lidar_calibration Excludes Calibration Targets

direct_visual_lidar_calibration addresses the extrinsic calibration of a LiDAR and camera. In other words, it estimates the spatial relationship between the two sensors rather than teaching an image-processing system to recognize a printed checkerboard or another manufactured target. That distinction matters for mobile and field robots, where carrying a target, positioning it in several known locations, or collecting repeated views of it may be inconvenient.

The intended users are engineers working with ROS1 or ROS2 who need to align LiDAR observations with camera images. The toolbox also targets more than one common sensor geometry. Its README lists spinning and non-repetitive scan LiDARs, plus pinhole, fisheye and omnidirectional projection cameras. That is a broader stated scope than a tool built around one camera projection model, although the documentation does not say whether every listed sensor configuration has the same operational setup.

The minimum input is one paired LiDAR point cloud and camera image. Additional pairs can be supplied when greater accuracy is required. This single-shot mode is the project's most unusual operational choice. It reduces the number of paired captures required, but it also shifts attention to whether the environment contains enough observable structure for the calibration to converge. The README does not define minimum texture, overlap, visibility or motion requirements, so scene suitability cannot be inferred from the one-pair claim alone.

Pixel-level Direct Registration Without an Initial Guess

The README describes a pixel-level direct LiDAR-camera registration algorithm. Rather than presenting calibration as the adjustment of sparse edges detected in both modalities, the stated approach operates at the image-pixel level and uses the relationship between LiDAR geometry and image appearance. The documentation also characterizes the process as automatic and says that no initial guess is required. That removes one common calibration prerequisite: a hand-authored transform used as the optimizer's starting point.

The repository layout indicates a C++ package with source under `src/`, public interfaces under `include/`, package metadata in `package.xml`, and its build definition in `CMakeLists.txt`. This is consistent with a ROS package rather than a standalone command-line utility. It also contains `direct_visual_lidar_calibration/`, `scripts/`, `docker/` and `docs/`, indicating separate package, script, container and documentation content.

The listed computational dependencies are PCL, OpenCV, GTSAM, Ceres and Iridescence. SuperGlue is marked optional. These names establish that calibration combines point-cloud processing, image processing, numerical optimization and supporting graph or geometry components, but the README does not expose parameter names, topic contracts, the optimization formulation or the exact role of each dependency. It would be unsafe to infer particular launch keys or solver controls that the documentation does not state.

Multiple data pairs remain optional rather than mandatory. Their stated purpose is to improve accuracy, but the README does not give a quantitative improvement, convergence criterion or recommendation for selecting pair count. Engineers should therefore treat pair count as an experiment variable constrained by their collection time rather than rely on an undocumented default.

ROS1 and ROS2 Installation Through Source or Docker

The README directs users first to the project's Installation and Docker documentation. It does not include source-build commands, ROS distribution names, apt packages or a complete ROS workspace procedure. It would be misleading to invent commands for `colcon`, `catkin_make` or package installation. The concrete starting points provided by the project are the installation page and the Docker Hub image named `koide3/direct_visual_lidar_calibration`.

The Docker route may reduce the host setup burden, but the README does not state its supported ROS distributions, host architectures, GPU requirements, volume mounts or launch commands. Its presence confirms that a container image is published; it is not enough to reconstruct how the image must be configured for LiDAR and camera inputs.

A first practical setup therefore proceeds through the project's own sequence. First, follow the Installation or Docker page and establish a ROS1 or ROS2 environment compatible with the selected sensor setup. Next, follow the Data collection documentation to obtain time-associated LiDAR and camera data. Finally, use the Calibration example page as the first execution guide. A reader should expect the README itself not to contain a copy-pasteable calibration launch command.

Optional SuperGlue support also requires careful interpretation. The dependency list marks SuperGlue as optional, but the README does not identify the feature guarded by it, the files or packages that must be enabled, or whether the pretrained network is downloaded during configuration. This is a limitation for offline or tightly controlled build environments.

Collecting Paired Scene Data Without a Printed Target

Calibration input consists of LiDAR point clouds paired with camera images. The project's dedicated collection documentation is the authoritative source for that workflow, but its commands and message formats are not reproduced in the README. For that reason, this review cannot confirm whether the tools expect ROS topics, image files, rosbag input or several supported forms.

The target-less method still needs usable scene content. The README explicitly says the method uses environmental structure and texture. That statement defines the evidence the algorithm expects to observe, but it does not quantify what makes a scene good. Repetitive corridors, featureless walls, empty skies or camera regions without corresponding LiDAR returns may present an ambiguous mapping between image and point-cloud geometry. This is an inference from the documented reliance on structure and texture, not a measured failure rate reported by the project.

Temporal association is another collection concern for paired sensors. A LiDAR sweep and camera image need compatible viewpoints for direct registration. The README does not document timestamp tolerance, synchronization method, motion assumptions, exposure configuration or dynamic-scene handling. Those details may be handled by the linked collection and example pages, but they cannot be assumed from the repository summary.

For an initial data policy, start with the example prescribed by the project and preserve its expected topic or file organization. If accuracy is insufficient, collect additional pairs only after confirming that they are correctly associated and contain complementary viewpoints. The README supports additional pairs for improving accuracy, but it does not prescribe selection rules.

SuperGlue Support and the Dependency Boundary

direct_visual_lidar_calibration depends on a broader native software stack than the two sensor drivers alone. ROS1 or ROS2 supplies the robotics environment, PCL handles point-cloud processing, OpenCV supplies image-processing capabilities, and GTSAM and Ceres provide optimization-related components. Iridescence is also a direct dependency. A team adopting the project should account for compilation time, package compatibility and the operating-system versions accepted by those projects.

SuperGlue is the only explicitly optional dependency. Its presence does not prove that every calibration workflow requires learned feature matching, because the README does not say what optional path it enables. It is best understood as an available integration whose activation and behavior must be checked in the Program details documentation. No pretrained model download, GPU runtime or feature toggle is documented in the README.

This dependency boundary also affects offline deployments. An environment that already contains ROS, PCL and OpenCV still needs compatible GTSAM, Ceres and Iridescence installations. A container may simplify that dependency set, but volume mapping and device access remain unspecified by the README. Hardware and image-mount details cannot be responsibly reconstructed from the existence of the Docker repository.

The absence of GitHub releases is also relevant to upgrade planning. Based on the last push date, the repository received an update on 2026-07-22, so it was not archived and had a recent change within the six-month maintenance window. That does not establish release cadence, semantic-version support or API stability. Consumers need to pin a commit or container digest if repeatability matters.

Choosing direct_visual_lidar_calibration Against Target-Based Methods

The practical alternative is a target-based LiDAR-camera calibration procedure using a known board, target or other artificial object. Its approach differs at the data-collection stage. A target-based workflow depends on detecting known geometry in camera images and observing corresponding LiDAR returns, whereas direct_visual_lidar_calibration uses environmental structure and texture and does not require a calibration target.

That trade-off is not automatically favorable. Target-based procedures can provide constrained, recognizable correspondences once the target is visible. direct_visual_lidar_calibration removes the physical target and can accept a single data pair, but it depends on the scene containing information suitable for direct registration. Its single-shot capability is therefore most relevant when field deployment constraints make target collection impractical.

Another difference is calibration state and tooling. This project emphasizes an automatic process without an initial guess and includes ROS-oriented installation, collection and example documentation. A target-based tool may fit a lab workflow built around a board, camera model and known target dimensions, but those characteristics are not attributed to any named competing project. The comparison here is between workflow models rather than a claim about another repository's capabilities.

This toolbox is the wrong choice when a deployment environment cannot supply visible geometric or textural detail, or when the required ROS and native dependency versions cannot coexist. The README is also too concise to support exact quality targets. A prospective user should inspect the Calibration example and Program details pages for observable inputs and failure reporting before replacing an established calibration process.

MIT Terms, Maintenance Evidence and Adoption Boundaries

The README states that the package is released under the MIT license. Repository metadata lists the license as unknown, so the README is the available source for the licensing declaration. Code copied from the project should still be reviewed within the actual repository files and distribution artifacts rather than treating this review as legal advice.

Maintenance evidence is limited but clear. The repository is not archived, and its last push was on 2026-07-22. It also has no GitHub releases. That means recent repository activity exists, but there is no release history to establish a stable upgrade cadence or named distribution versions. Consumers who build from `main` can therefore encounter source changes even when they expected periodic, release-based updates.

The associated publication is Koide et al., "General, Single-shot, Target-less, and Automatic LiDAR-Camera Extrinsic Calibration Toolbox," presented at ICRA 2023. The README links to the paper, which is the appropriate source for algorithmic details beyond its short package description.

The adoption boundary is consequently specific. Teams already using ROS1 or ROS2, able to build the documented C++ dependency stack and able to collect useful scene pairs should evaluate the toolbox. Teams requiring a formal release channel, a documented one-command first run, quantified accuracy thresholds or broad compatibility evidence should confirm those details in the linked documentation and the repository's current files first.

Editorial conclusion

Adoption fits robotics teams that need an automatic ROS1 or ROS2 calibration path and can supply suitably structured, textured scene data without a calibration target. It is less suitable for teams unable to build the ROS, PCL, OpenCV, GTSAM, Ceres and Iridescence stack, or for sensor-camera combinations whose projection models are not covered. Verify sensor-model support, time synchronization, input quality and the documented installation and container workflow first, because the repository publishes no GitHub releases and its README contains no executable launch or parameter example.

Frequently asked questions

Does direct_visual_lidar_calibration require a checkerboard or another calibration target?

No. The project is target-less and uses environmental structure and texture for calibration.

How many LiDAR-camera data pairs are required by direct_visual_lidar_calibration?

At least one paired LiDAR point cloud and camera image is required. Multiple pairs are optional and can be used to improve accuracy.

Which camera and LiDAR models does direct_visual_lidar_calibration support?

The README lists spinning and non-repetitive scan LiDARs, and pinhole, fisheye and omnidirectional projection cameras.

Official sources

  1. Issues
  2. koide3/direct_visual_lidar_calibration on GitHub
  3. Project website
  4. README
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/koide3-direct-visual-lidar-calibration.svg)](https://hysenlabs.com/projects/koide3-direct-visual-lidar-calibration)

Was this useful?