Releases + Changelogs
Version 16.0.1 - November 20, 2025
Changelog
Fixes
- Setting the motion filter to "disabled" for both camera and lidar will now truly disable motion filtering, rather than still culling what it would consider "redundant still" observations.
Version 16.0.0 - November 19, 2025
Overview
Following close on the heels of v15.0, v16.0.0 makes MetriCal inherently conservative with your credits by introducing Dry Runs for the Calibrate command. Dry Runs allow you to execute your calibration workflows without consuming any credits, giving you the opportunity to validate your setup and data quality before committing to a full calibration run.
Unless you are on a MetriCal Enterprise license, all calibrate runs are dry runs by default. Pass
the --show-results flag to perform a full calibration that consumes credits.
Changelog
Changes
- Object space points are now "frozen", aka prevented from optimizing, until the last adjustment of a calibration. This prevents object space points from drifting during intermediate adjustments, which can lead to better overall calibration results.
Addition
- We've introduced a new "obfuscation level" table to the calibrated plex section. Since calibrations are "dry" by default, we didn't want users confused over the behavior of outputs. We've also bumped the indices of all other CP tables by 1 to accommodate this new addition.
Version 15.0.1 - October 29, 2025
This patch update addresses a few incongruities within CLI arguments and help comments in MetriCal proper, making it 1:1 with the documentation you read here. We've also snuck in a few optimization improvements to speed things up.
Version 15.0.0 - October 23, 2025
Overview
This release represents a significant upgrade to MetriCal's abilities in handling complex production environments, with a focus on improving calibration workflows and handling complicated multi-step calibrations. All in all, this release represents a significant step forward in MetriCal's continued maturation as a production-grade calibration tool.
Migration Guide
Introducing Manifests
If you're wondering where pipeline mode went, well, here's your answer.
Most notably, 15.0.0 introduces the concept of Manifests, which describe a complete calibration procedure from beginning to end. It's our sincere hope that manifests will make it easier for new users to understand how to use MetriCal, while also providing experienced users with a powerful tool to codify and share their calibration processes.
We recommend all users migrate to using manifests for their calibration workflows.
MCAPs as Output
Read more about how to interact with MCAP result files in the Results Output docs.
MetriCal now no longer will output results or detections as schema-based JSON. Instead, MetriCal writes everything out as MCAP to provide better backwards compatibility in future versions. If you'd like to learn more about this change, check out our blog post written about the move here.
NOTE: Old results.json files are not expected to work with this release at all. However, the
plex and object space files within those results files are still valid and can be used as-is.
Results MCAP files incorporate all the data used to generate report information during the execution of MetriCal: inputs (plex, object-space, etc), outputs (plex, object-space), and more. The protobuf-based schemata for message types can be found here.
Results MCAP files are now universally output every calibration run regardless of success status; however, failed calibrations will output an abbreviated results file without any of the pre-cal, residual, or summary metrics from the optimization. Similarly, optimized plex and object-spaces are not attached to the MCAP file in these states. This is meant so that users can directly provide these results files to Tangram for debugging purposes as they contain all the necessary inputs (sans the dataset itself) that can help make reproducing errors easier when debugging.
All modes that took a results.json previously (e.g. Display mode) now take a results MCAP file instead.
Credit-Based Licensing
MetriCal is shifting to a credits-based licensing system in order to lower the barrier to entry for new and curious users. Each calibration run will consume a certain number of credits based on the complexity and resources used.
If you are an existing MetriCal user under an annual contract, we will be converting your current license to the equivalent number of credits per month. Users under monthly subscription will be receiving communication from us on the transition.
Object Space Mutual Construction Groups
Download an example updated object space for multi-modality targets in the Combining Target Modalities documentation.
The adoption of the Consolidate command into the mainline workflow has necessitated a breaking change to how mutual construction groups are specified in object spaces. All mutual construction groups now specify the geometric transform between target origins within their definition:
"mutual_construction_groups": [
{
"24e6df7b-b756-4b9c-a719-660d45d796bf": "parent",
"34e6df7b-b756-4b9c-a719-660d45d796bf": {
"parent_from_object": {
"rotation": [ // As quaternion
0, 0, 0, 1
],
"translation": [
0.30, 0.40, 0 // As (x, y, z) in meters
]
}
}
}
],
All camera-lidar mutual construction groups must be updated to match this new format. Note that
previously, camera-lidar targets held their geometric relation in the
x_offset and y_offset
fields of the Circle target:
"circle":{
"radius": 0.60,
"x_offset": 0.30,
"y_offset": 0.40,
},
Just move this information into the mutual construction group as shown above, and you should be good to go.
No ROS 1 Bag Support
ROS 1 bag support has been removed entirely. If you are using a ROS1 bag, please convert it to MCAP using the mcap CLI tool.
Coordinate Basis Handling Changes
Bases are no longer input into MetriCal via the CLI. Don't worry! We'll bring it back. We're just laying the groundwork for a more robust basis handling system that will be implemented in the future, one that will go hand-in-hand with both the Init and Calibrate commands.
Init Plex References (Seeding Plexes)
Init behavior has changed considerably when it comes to how seed plexes are handled. First off, the terminology within the docs and CLI has changed from "seed plex" to "Plex References", to better reflect the fact that these files may or may not be plexes, and may or may not have components and constraints that are applied to the final initialized plex.
Furthermore, Plex References are now applied in the order that they are provided to the CLI. This means that a series of Plex References that all have overlapping components will have the last one take precedence.
You can read more about this behavior in the Init command docs.
Serialization Changes
We have moved many arguments to kebab-case for consistency across the CLI and Manifest layers. All
intrinsics models now follow this convention, e.g. opencv_radtan is now opencv-radtan. The old
snake_case arguments are still supported as aliases for backwards compatibility.
Covariance is now serialized with more detail as well. Instead of a flat array of values with
indices [0], [1], [2], we now serialize into [data], [nrows], and [ncols] fields for
better clarity.
Argument Modifications
Using manifests also exposed a number of incongruities and rough edges in existing commands, which have all been addressed in this release. This means, in turn, that many commands have changed in small (or not-so-small) ways. Please read through the changelog carefully to ensure that your existing workflows are not disrupted.
Commands:
| Old command | New Command | Description |
|---|---|---|
pipeline | new, run, validate | Replaced pipeline command with manifest commands |
consolidate-object-spaces | consolidate | The old command name is still preserved as alias |
Global Arguments:
| Old argument | New argument | Description |
|---|---|---|
--topic-to-observation-basis | N/A | Removed |
--topic-to-component-basis | N/A | Removed |
Init Command:
| Old argument | New argument | Description |
|---|---|---|
--remap-seed-component | --remap-reference-component | Old argument still preserved as alias |
--overwrite-plex | --overwrite-strategy | Strategy is now explicit |
--seed-cal-path | --reference-source | Old argument still preserved as alias |
| N/A | --uuid-strategy | A UUID strategy must now be specified explicitly |
Calibrate Command:
| Old argument | New argument | Description |
|---|---|---|
--topic-to-component | N/A | Remapping is only performed in the Init command now |
--camera-motion-threshold [value] | --camera-motion-threshold [profile/value] | Camera motion threshold has convenient profiles |
--lidar-motion-threshold [value] | --lidar-motion-threshold [profile/value] | Lidar motion threshold has convenient profiles |
Display Command:
| Old argument | New argument | Description |
|---|---|---|
display [DATA] [PLEX] | display [DATA] -p [PLEX] | The plex is now an optional argument |
Report Command:
| Old argument | New argument | Description |
|---|---|---|
--origin | N/A | Removed; Report mode no longer supports printing specific constraints |
--secondary | N/A | Removed; Report mode no longer supports printing specific constraints |
Changelog
Added
- Format deserialization for JSON and TOML types will now point you to the location in the text where an error was encountered
- Improved error handling due to mis-ordering path-like arguments to the various MetriCal modes. Now MetriCal will not only report format-specific errors but will likewise avoid reading files into memory in cases where users pass in e.g. a large MCAP where a plex JSON file is expected.
- Support for Tangram's protobuf-based IMU sample message type
- Manifests are now available for MetriCal. A manifest describes an entire MetriCal workflow. Manifests feature variable substitution and templating to allow users to easily create multiple similar workflows with minimal effort. Manifests only expose certain modes, namely Init, Calibrate, Shape, and Consolidate. This command is intended to replace the deprecated Pipeline command.
- Validate command to validate manifests and other input files.
- New command to output a manifest template for users to fill in.
- IMU and LNS motion is now analyzed ahead of the calibration. If motion is considered deficient for calibration, a diagnostic is raised and the user is warned.
- All outputs for every command in the manifest now have default output paths. Users may override these paths as needed.
Changed
- IMU preintegration RMSE tables have been removed from extrinsics info section of the report. These have been replaced by an IMU summary table in the summary section.
- Split IO error variants between filesystem related IO errors and format specific errors
- Tables are now printed using UTF-8 borders and ANSI styles
- Object space configurations now require a transform to be specified for each element in a mutual construction group
- Consolidate object space mode will now construct a new object-space with the appropriate mutual construction groups. This will enable calibration optimizations that reduces the overall number of intermediate or nuisance parameters using a pre-surveyed object-space.
- Overwriting the plex is now an explicit act in Init CLI. Users must choose to use the previous plex as a seed.
- Sync group IDs are now set / assigned on measurements, rather than on raw observations.
- Overwrite and UUID update handling in Init CLI has been rewritten for clarity.
Fixed
- Fixed several issues in how the stereo rectification table is generated that would result in poor performance in constructing the stereo rectification histograms.
- Small bug in calculation for component timestamp resolution.
- Local Navigation System init errors are now properly reported.
- Fixed a bug where units were converted for angular SSEs in the Extrinsics Info section and IMU preintegration metrics (now a summary metric) prior to dividing by the trace.
- Fixed inconsistency in how sub-headings in the calibrated plex section were displayed
- Fixed an issue where a data diagnostic for multiple spatial subplexes would never be displayed to the user
- Report mode now faithfully reproduces the exact report info from calibrate mode
- Fixed a false-positive where data diagnostics would not be triggered because the data diagnostic derived from stereo reprojection metrics were counted on a per-point basis instead of a per-image basis
- Fixed a number of false-negative data diagnostic triggers that would occur due to one of:
- Requiring necessary component data across modalities
- Missing data for a given modality
- Camera feature coverage being incorrectly computed
- Required necessary components across modalities existed, but were part of a different spatial subgroup in the plex
- Textplots would crash MetriCal if there were no detections to plot in the timeline, since the minimal height for a chart was not met. The timeline chart has been revised completely for better readability and to avoid this crash.
- Single-topic runs no longer return a sync data diagnostic.
- A bug in the MCAP checks where a small file (less than mcap::MAGIC number of bytes) would panic due to being larger than the mmap'd slice's length.
- Camera and lidar motion filter settings in the Calibrate CLI must be set by the user explicitly
now. The defaults have been removed, in favor of sane defaults for different scenarios. Users may
still set the thresholds manually using the
--camera-motion-thresholdand--lidar-motion-thresholdflags. - Included an import for Google's Cascadia Mono font to our report HTML to ensure consistent font rendering of our table output
- Fixed bugs in the dot-marker / CirUco detector that would prevent boards at ~45° relative to a camera from being detected at certain distances / distortions.
- Bug in the logic for printing the extrinsics info table.
- Final init plex table now correctly prints the final UUIDs of each component.
- Fixed a bug that would report incorrect values for motion / quality filter results in DI-003 when all detections were filtered.
- Motion filtering diagnostics have been corrected. This also means charts and diagnostics that rely on motion filter results have been corrected as well.
- Help messages for many CLI arguments have been fixed for clarity and correctness.
- Covariance propagation for inverted spatial constraints.
- Fixed construction of CRE costs in the case of consolidated objects
Removed
- Removes "unlicensed mode". Errors that would previously result in falling back to unlicensed mode will instead exit with an error. Unlicensed mode was previously added to provide an easy and inexpensive way to try out MetriCal. A pay-as-you-go option will soon provide the easy and inexpensive way to try out MetriCal instead.
- The topic-to-component mapping argument in Calibrate mode has been removed. Users may remap components in Init mode instead.
- ROS 1 bag support has been removed entirely. If you are using a ROS1 bag, please convert it to MCAP using the mcap CLI tool.
- Bases are no longer input into MetriCal via the CLI. This lays the groundwork for a more robust basis handling system that will be implemented in the future.
Version 14.1.2 - July 29, 2025
Changelog
Fixed
- Fixed a bug in H264 decoding that would cause a panic in .deb releases.
Version 14.1.1 - July 28, 2025
Changelog
Changed
- Calibrations no longer fail when/if a camera initialization has stalled.
Version 14.1.0 - July 25, 2025
Overview
Introducing Local Navigation Systems, or LNS, a new calibration modality. This aligns an odometry source with the rest of your sensor stack, making it ideal for sensor-to-chassis calibration. LNS is particularly useful for applications like autonomous vehicles, where precise alignment of sensors to the vehicle's navigation system is crucial. Follow along with an LNS calibration in its calibration guide.
We've also shifted around some terminology: what were "semantic constraints" are now called Formations. Note this change will affect schemas, but plex configurations can use either terminology.
Reports should also be cleaner and more readable, with less visual clutter. If you don't enjoy
pretty colors or progress bars (who does?), you can now disable them with the
--progress-indicators and
--color options.
Oh, one more change to call out here: our AprilGrid detector got way better. We hope you notice the difference!
Changelog
Added
- Local Navigation System (LNS) support in the calibration process
- Added
--progress-indicatorsand--colorflags which can be set toauto/enabled/disabled. Allows users to reduce noise in the console output / when logging to a file.automode will try to intelligently detect when logging to a terminal and only enable these modes when that's the case. - Use robust cost function in cam init process to handle poorly-behaved poses.
- Use
formationsas replacement forsemantic constraintsin the calibration process. This is a breaking change for schemas, so users should update their schemas accordingly. - Adopt updated filtering logic for data intake
- MetriCal now utilizes a more restricted heuristic for determining prior covariance in init mode. This now results in cx and cy having more comparable prior variances, as well as focal length having a much more reasonable (albeit still very large) initial prior variance.
Changed
- Change
NoSharedSyncGroupsdiagnostic from Error to Warning - Streamlined the output format to reduce the amount of visual clutter. Further, color mappings have changed slightly for different message types.
Fixed
- Solver failures on camera init are now reported as errors, rather than just unwrapping the call without checking
- Modify the report output depending on the detection of projective compensation
- Fixed a bug with dot-marker / ellipse object-spaces where detections were not deterministic when
applied to similar images. Users that use dot-marker object-spaces should now expect that running
a dataset with the
-yflag (without cached detections) should get the same behaviour and results every time MetriCal is run. - Fixed a bug that would cause significantly reduced detections in certain scenarios when using an object space with multiple different target types.
- Redundant still observations are once again accepted in the adjustment
- Correct topic filtering behavior when requested topic cannot be read
- Correct counts for quality and motion filtering for non-camera/lidar observations
- Various improvements to the AprilGrid and Dot Marker detectors
Removed
- The data diagnostic for projective compensation via high distortion parameter variance
- LowMutualObservationsCountError has been removed entirely from diagnostics
Version 14.0.1 - May 21st, 2025
Overview
This release fixes a number of bugs that cropped up in 14.0.0.
Changelog
Fixed
- Fixed a bug in our aprilgrid detector to better support interior detections on Camera ←→ LiDAR boards.
- Fixed a bug where extrinsics would not be generated in 1 Camera ←→ 1 LiDAR datasets.
- Fixed a bug where extrinsics would not be generated in 1 Camera ←→ 1 IMU datasets.
Version 14.0.0 - May 12th, 2025
Overview
This release updates licensing to support different subscription tiers (R&D, Growth, Enterprise), introduces unlicensed calibration, and includes significant refactoring of internals. The unlicensed calibration mode allows users to test and refine their data capture process without needing to purchase a license. Several deprecated features have been removed, and various error code mappings have been updated for better clarity and consistency.
Changelog
Added
- Support for Tangram's new subscription tiers and limits.
- Unlicensed calibration mode, allowing users to test and refine their data capture process without purchasing a license. This mode outputs all metrics and diagnostics as usual but hides the final calibration results.
- Association metadata is now written to the
results.jsonfile and required by default on deserialization (breaking change for previous results files).
Changed
- The
no_offsetmodel variant in the Init command has been renamed tolidar. - Mutual observation count between stereo pairs (and the corresponding data diagnostic) now considers all unique observations within a similar sync group, rather than explicit pair-wise overlap of individual targets in the greater object-space.
- Consolidated exit code handling for better error reporting.
Removed
- The IMU
no_intrinsicsmodel has been removed from Init and is no longer supported by MetriCal. - Exit code 11 has been deprecated; MetriCal will now correctly report exit code 1 on IO related errors when using the Consolidate Object Space command.
- Various deprecated features and arguments including evaluate mode,
--topic-to-component, and preset devices have been removed.
Deprecated
Version 1 license keys (prefixed with key/) have been deprecated and will no longer work after
November 1st, 2025. If you use license keys prefixed with key/, please create new license keys
(which will be version 2 keys, prefixed with key2/) and use them instead.
Technical Notes
This version makes several breaking changes to the internal architecture of MetriCal, particularly around the handling of licensing and model variants. The new licensing tier system allows for more flexible deployment options tailored to different user needs.
The removal of the evaluate command represents a significant change to the workflow, but aligns
with our focus on providing more accurate and reliable calibration measurements. Users who
previously relied on this command should contact Tangram support for guidance on alternative
approaches.
The mutual observation count improvement will lead to more accurate stereo pair diagnostics, especially in complex multi-camera systems where object-space observations may not perfectly overlap between cameras but still occur within similar sync groups.
Note that this release introduces a breaking change for results files generated by previous versions, as the new association metadata is now required during deserialization.
Version 13.2.1 - April 9th, 2025
Fixed
- Images measurements that don't have enough data to derive a pose from are now filtered out of the optimization, rather than being assigned a "default" pose.
Version 13.2.0 - April 3rd, 2025
Overview
This release introduces the Power Law camera model, improves camera initialization, and adds new diagnostics to help users identify and fix issues with their calibration data. The Power Law model is particularly effective for cameras with significant distortion, and the new data diagnostics will guide users through common problems during calibration data collection.
Changelog
Added
- New Power Law camera model, effective for cameras with significant distortion.
- Comprehensive data diagnostics to help identify issues in calibration data collection.
- New chart: "Observed Camera Range of Motion" to help visualize and diagnose potential projective compensation effects.
- Ability to consolidate multiple object spaces using object relative extrinsics with the new
consolidate-object-spacesmode.
Changed
- Enhanced camera initialization routine for better handling of heavily distorted images.
- Processed Observation Count table now distinguishes between filtering from quality vs. motion.
- Console output reorganized into a more readable report format.
- Improved error messages for data integrity issues.
- All charts now have clear titles for easier reference.
- Extrinsics tables are now shown in alphabetical order by component name.
Fixed
- Fixed the rectification tables in console output.
- Tuned correction function for OpenCV Fisheye model.
- Modified Double Sphere model jacobians for better accuracy.
- Fixed timestamp casting error in timeline chart.
Removed
- Evaluate mode is no more. A better implementation is planned for a future release of MetriCal.
Technical Notes
This version provides a significant enhancement to diagnostic capabilities, with particular focus on helping users understand why a calibration might be failing. The new data diagnostics system checks for common issues such as:
- Insufficient camera movement range
- Poor feature coverage across camera FOV
- Too many observations filtered by quality or motion
- Missing component dependencies required for calibration
- Insufficient mutual observations between camera pairs
Each diagnostic comes with a detailed explanation and suggestions for improvement, referencing specific charts in the report for additional context.
Version 13.1.0 - February 25th, 2025
Overview
This update changes the way MetriCal reports errors and fixes various bugs with init mode. In addition, we have made the decision to deprecate compatibility with both folder and ROS 1 bag datasets. This decision was made because we want to standardize our data ingestion code around MCAP and remove the need to MetriCal to handle idiosyncrasies with the other two input formats. These data formats are supported in 13.1.0, but will be removed in a future release.
For ROS1 bags, it is very simple to use the mcap CLI tool to convert them to an MCAP. We had recommended this even before the deprecation was announced, because it greatly improves dataset processing performance on our end.
For folder datasets, we will ensure that a suitable conversion tool exists before fully removing support for them in MetriCal.
Changelog
- Added deprecation warnings for folder and ROS 1 bag datasets.
- Changed errors to have better messaging and updated errors docs to match. Some exit codes are no longer returned in practice (although their exit codes are not reused).
- Foxglove CompressedVideo messages have been added to MCAP schema map
- Fix rectification tables in report output
- Fix basis transformations in MetriCal
- Fixed how init mode consumes URDFs. In particular, init mode now has a resolving strategy that prioritizes plexes first (based on their creation timestamp, newest plex first / oldest plex last), followed by URDFs being applied in order to seed extrinsics if a better extrinsic or spatial constraint is not first provided in an earlier plex or URDF.
- Fixed a bug where topic mappings were not applied to seed plexes that were being overwritten (i.e.
when the
--overwriteor-yflags were passed to the CLI). - Fixed a bug in how plex creation timestamps were not being preserved when overwriting topic mappings in init mode.
- Fixed a bug where no logging would occur if a pipeline file failed to parse
Version 13.0.0 - January 14th, 2025
Overview
The major feature of this release is a big speedup (2-3x faster in testing) when processing H.264 datasets.
Additionally, this release introduces some breaking changes to the Markers fiducial type (now
named SquareMarkers) and minor ones to the format of some metrics in results.json. Both of these
changes are fairly niche and we do not expect them to have an impact on the vast majority of users.
Changelog
- (Breaking Change) The
Markersfiducial type has been renamed toSquareMarkers. Please update your object space file if you are using this (uncommon) fiducial type. - (Breaking Change) Added
marker_idsfield toSquareMarkersand removedmarker_length. - (Breaking Change) The
results.jsonfile no longer contains ametrics.optimized_object_spacefield. Instead users should start using theobject_spacefield at the top-level of the results as that now contains the inferred object space. This will not affect users who aren't already doing custom processing of theresults.jsonfile. - Greatly improve performance when ingesting H.264 datasets
Version 12.2.0 - December 13th, 2024
Overview
This release has some nice improvements to camera < - > lidar (especially in multi-target scenarios) as well as greatly improved AprilGrid detection quality. In addition, this release includes some visualization and logging quality of life improvements.
Changelog
Added
- Added an optional
reflective_tape_widthfield to the circle board object space format. This is used as a hint to the detector when identifying retroreflective circles in point clouds.
Changed
- Improved detection quality of multiple circle boards in the same environment.
- Made various improvements to the underlying optimization calculations.
- Upgraded to Rerun v0.19.
- Made various improvements to visualization of lidar and image detections.
Fixed
- Greatly improved detection quality on Kalibr-style AprilGrid targets.
- Fixed an issue with detecting image features with only a single adjacent tag.
- Addressed some small timestamp-related visualization bugs.
Removed
- Evaluate mode has been hidden as a command, due to pending improvements. The mechanism that is currently used to perform the metric generation during evaluate mode runs an optimization, which can lead to some hard-to-interpret results. In particular, errors may projectively compensate into the object-space which at present does not have any user-visible metrics readily available outside of the rerun visualization. For more information on this change, please see the "Evaluate" mode documentation.
Version 12.1.0 - October 23rd, 2024
Overview
This is a small update. The main user-facing change is that MetriCal can now handle markerboards generated by newer versions of OpenCV. OpenCV introduced a silent breaking change to its markerboard generation in version 4.6.0, which can cause problems with MetriCal's detection of certain newer boards under some circumstances. For more information, please reference the initial_corner field in the markerboard docs.
Changelog
Changed
- Update internal OpenCV version from 4.5.4 to 4.10.0
Added
- Add support for both OpenCV "new" style markerboards.
Version 12.0.0
MetriCal Sensor Calibration Utilities repository for v12.0.0: https://gitlab.com/tangram-vision/platform/metrical/-/releases/v12.0.0
Overview
This release is probably one of our largest ever. There are new modes, new mathematics, and more expressivity. And as with every major version bump, we've also made some changes to the CLI arguments. Most old arguments that have changed have been deprecated, not removed, so you can still use your scripts from v11.0 (for the most part). You'll just get loud warnings about switching over before v13 comes around...
Change Your MetriCal Alias!
First and foremost: If you're a current user, we suggest adding the --tty flag to your metrical
bash alias. See an example in the setup docs. This allows
MetriCal to render progress bars in the terminal, which makes it a much nicer experience when
processing large datasets. Otherwise, you'll just see a blank screen for a while.
UI + UX Highlights
Offline Licensing
MetriCal now offers users the option to cache licenses for offline use. If you're running MetriCal "in the field" (aka away from a modem), this is the feature for you! Note that offline licenses are only valid for a week before MetriCal needs to ping a Tangram server.
Visit the licensing docs for setup and details.
Descriptive Error Messages
We've reworked every. single. error case in MetriCal to have a descriptive error message. Instead of getting something generic, you'll now see the error, the error's cause, and a helpful suggestion on how to fix it. Many of these suggestions link directly to the documentation, so you don't have to search around for the "right answer" anymore.
For those of you developing your own Rust programs, we couldn't recommend miette enough.
Cached Detections
Tired of re-running detections when running a new calibration? We've got you covered. MetriCal now caches its detections from the initial dataset processing. This means you can change models and test different configurations in a fraction of the processing time.
There are two ways MetriCal finds detections:
- Passed to the CLI via the $DATA required argument. For instance, instead of passing an MCAP, one could just pass that MCAP's cached detections JSON.
- Automatically found in the same directory as the dataset. Cached detections are written to the
same directory as the dataset, named with a
.detections.jsonextension to the dataset name. For example,/dataset/example.mcapwould have a cached detections file named/dataset/example.detections.json. If MetriCal finds this file, it will use it instead of re-processing the entire dataset.
This also means that datasets with the same name will produce detection caches with the same name. We don't advise naming all of your files the same thing anyway, but... you do you.
If you have cached detections, but really want to re-process them anyway, just pass the
--overwrite/-y flag to Calibrate or Evaluate mode.
Multiple Seed Plex in Init Mode
You can now pass multiple seed plex to Init mode. This is useful in a "big rig" scenario, when it's just not feasible to collect every sensor's data in one run. For example, one might run data from 4 cameras individually, then combine them all into one system to gather extrinsics via Init mode.
When processing multiple seed plex, the newest plex is given priority, being processed for new information from newest to oldest. If there is an existing Init'd plex for the dataset, that plex is also used as a seed. This makes it even easier to compare and contrast different calibrations.
Display Mode
Version 12.0 also introduces Display mode, which allows you to visualize the applied calibration to
any dataset. This takes the place of the --render flag in Calibrate and Evaluate modes, which now
just renders the detections used for calibration. Important: Display mode expects a running instance
of Rerun v0.18.
Changelog
Added
- CLI:
- Change the logging level more easily with verbose flags:
-v(Debug),-vv(Trace),-q(Warn), or-qq(Error). - Multi-progress bar to estimate observation read-in time. Make sure to add
-tto a Docker alias to use this functionality! - Offline licensing. See the licensing docs for setup and details.
- An
OptimizationProfileargument to Calibrate mode that allows users to tune the parameters of the adjustment e.g. relative error threshold, absolute error threshold, and max iterations. - A binned outlier count is now reported in the camera binned reprojection table.
- Display mode to visualize the output of a calibration.
- A new sub-mode,
metrical shape tabularwhich can convert a plex into a simplified, stable, tabular format that holds a set of intrinsics (and direct artefacts of the intrinsics, such as look-up tables) alongside extrinsics. The tabular format from this mode can be exported as either JSON or MsgPack binary (to compress the total filesize, as LUTs can be quite large). - Tables for Component Relative Extrinsics, as well as Preintegrated IMU errors. This should give you a much better idea of extrinsics quality beyond the abstract covariance values for spatial constraints.
- Change the logging level more easily with verbose flags:
- Data I/O:
- Expanded list of encodings for YUYV image types in ROS -
uyvy,UYVY,yuv422,yuyv,YUYV, andyuv422_yuy2are all supported.- That's gotta be all of them, right? Right? Let's all come together to make life easier for your old Tangram pals.
- H264 message types for ROS1 (from this project) and MCAP (from Foxglove's CompressedVideo).
- Added support to
CompressedImagetypes for the alternate spelling for "jpg".
- Expanded list of encodings for YUYV image types in ROS -
- Detection and reweighting of Paired 3D Point outliers.
Changed
- Algorithm Changes:
- Use new M-estimators, and remove all explicit outlier logic. No more outlier flags!
- Paired Plane Normals between lidar-lidar pairs are no longer used
- The motion filter has been rewritten to include both images and lidar detections. Users can
manipulate the motion detector thresholds by using the
--camera-motion-thresholdand--lidar-motion-thresholdflags, or just turn it off with--disable-motion-filter. - The motion filter now runs after all detections have been processed. This means that you can manipulate the motion filter over cached detections, too.
- CLI:
UmbraOutputis nowCalibrationOutput.- All error codes have been changed in favor of simpler error code and more descriptive fixes.
- Look Up Tables generated via the
metrical shape lutcommand are now generated using theimage_lutsmodule from the applications crate. This changes the final schema for look up tables but makes them more directly compatible with OpenCV and other software that expects both row and column remappings to be separated.
- Init command:
- Init mode can now take multiple plex as seeds.
- If a previously generated init plex is found at the same location as the plex-to-be-written, then the previous plex is used as a seed for the new plex.
- Change of basis is respected and applied in Init mode when seeding the plex with an input plex.
- Rendering:
- Observations and detections are rendered in the same entity in the visualization.
- When rendering more than one point cloud in Display mode, each component's point clouds are uniformily colored rather than colored by the point's intensity value. This allows for easier comparison between components.
- Calibrate mode no longer renders the results of a calibration, only the observations and detections. Results are applied in Display mode.
Fixed
- CLI:
- Component names with "/" no longer cause file I/O issues with the
shape focuscommand
- Component names with "/" no longer cause file I/O issues with the
- Detectors:
- The circle detector for point clouds and the feature detector for images are now much more robust to misdetections and noise.
- Init command:
- Init mode now correctly handles all (spec'd) cases in which a seed plex as the basis for a new plex.
- Topics that are not usable by MetriCal for the purposes of calibration are now filtered out.
- If there are no usable topics, Init mode will list the usable topics in a dataset for the user.
- There was a (self-induced) memory pressure build-up during lidar detection that has been remedied.
Removed
- Init command:
- Preset devices have been removed from Init mode.
Version 11.0.0
MetriCal Sensor Calibration Utilities repository for v11.0.0: https://gitlab.com/tangram-vision/platform/metrical/-/releases/v11.0.0
Overview
This version bump is a big one! Data processing improvements, algorithmic improvements, CLI simplification... there's a little something for everyone here. Most of the changes in 11.0.0 were made based on testing from customers in the field. Thanks, everyone!
Note that many CLI arguments have been shifted or removed. Be sure to check the changelog and updated documentation to make sure your settings remain.
Changelog
Added
- Visualization improvements:
- Render navigation states and IMU data by default.
- Render all observations when log level is set to debug.
- Change of Basis tooling:
- Add
--topic-to-observation-basisglobal argument to all modes in order to map a coordinate basis to each component's observations on plex construction (docs). - Add
--topic-to-component-basisglobal argument to all modes in order to map a coordinate basis to each component on plex construction (docs). - Changed-basis plex is now included in MetriCal output (docs).
- Add
Changed
- Init mode only looks through the first 100 observations to create the initial plex; this should greatly speed up Init mode for most datasets.
- All observations are now run through their respective detectors before image motion filtering occurs.
- The motion filter acts on the image detections themselves, not the entire image. This should improve the quality of the motion filter in busy, "noisy" datasets (docs).
- A user-specified root is now required to generate the URDF from a plex in Shape mode (docs).
- Reformulate IMU calibration approach:
- Remove unnecessary IMU initialization.
- Implement improvements to IMU optimization mathematics.
- Only one IMU bias is inferred during calibration instead of a wandering bias.
- Shape mode arguments now follow the order
metrical shape [command] [arguments] [plex] [output](docs). licenseandreport-patharguments are now global arguments, and can be passed to any mode (docs).- Lower the minimum required points to fit a circle detector.
Fixed
- Init mode now properly handles differences in the seeded plex (passed through with
-p) and the created plex. This has been a bug for longer than we care to admit; we're glad it's fixed (docs)! - Observations are no longer held in memory while motion filtering occurs. This greatly reduces memory usage on LiDAR-heavy datasets.
Removed
- Caching of detections and filtered output is no longer supported in Calibrate and Evaluate modes.
Version 10.0.0 (Yanked)
This release was yanked due to a critical bug introduced in Init command that wasn't caught in time. The odds of many users running into this bug were low, but we played it safe and yanked this version entirely.
All relevant changes will be added to the changelog for 11.0.0.
Version 9.0.0
MetriCal Sensor Calibration Utilities repository for v9.0.0: https://gitlab.com/tangram-vision/platform/metrical/-/releases/v9.0.0
Overview
Version 9.0.0 can be considered a refinement of v8.0, with focus on improving the user experience and clarifying outputs. It also introduces a few new intrinsics models across components. Some default behavior has changed as well, so be sure to check the changelog for details.
This release also includes a big update to rendering. Be sure to update your Rerun version to v0.14!
Changelog
Added
- Introduced
LidarSummarysummary statistics to report lidar-specific metrics (docs). - Support for new IMU intrinsics: Scale, Shear, Rotation, and G-Sensitivity (docs).
- Support for the Omnidirectional camera model (docs).
Changed
- MetriCal now uses Rerun v0.14! 🎊 Make sure to update your version of Rerun accordingly.
- The summary statistics table is now three tables, for optimization, cameras, and lidar respectively (docs).
PerComponentRMSEin Summary Statistics is nowCameraSummary(docs).- Circle detector's
detect_interior_pointsoption is now a mandatory variable, and has no default value (docs). - Circle detector now takes an
x_offsetandy_offsetvariable to describe the center of the circle w.r.t. the full board frame (docs). - Object relative extrinsics (OREs) are now generated by default. In turn, the
--enable-ore-inferenceflag has been removed and replaced with--disable-ore-inference(docs). - The camera component initialization process during calibration has been improved to better handle significant distortion.
Fixed
- Rerun rendering code has been completely refactored for user clarity and speed of execution.
- Lidar-lidar datasets are now rendered and registered along with camera-lidar.
- Object relative extrinsics are now rendered when available.
- Images now use lookup tables properly for quick correction.
- Spaces have been reorganized for clarity and ease of use.
- Datasets without cameras no longer print empty camera tables.
Version 8.0.1
MetriCal Sensor Calibration Utilities repository for v8.0.1: https://gitlab.com/tangram-vision/platform/metrical/-/releases/v8.0.1
Overview
This version fixes a small bug found in pipeline license validation.
Changelog
Fixed
nulllicense values in a pipeline configuration are discarded, not interpreted as a provided license key.
Version 8.0.0
MetriCal Sensor Calibration Utilities repository for v8.0.0: https://gitlab.com/tangram-vision/platform/metrical/-/releases/v8.0.0
Overview
This release brings a ton of new features to the MetriCal CLI, most of them focused on improving the user experience. The biggest difference is one you won't see: all of the math done during optimization is now fully sparse, which means it takes a lot less memory to run a calibration. And smart convergence criteria means that calibrations are faster, too!
We've also added a new mode, pipeline, which allows you to run a series of commands in serial.
Find out more about it in the
Pipeline Command section of the
documentation.
Changelog
Added
- Pipeline mode. This executes a series of Commands in serial, as they're written in a pipeline JSON file.
- Render the optimized plex at the end of a calibration.
- The subplex ID for a spatial constraint now shows up in the Extrinsics table.
- Input JSON files with comments are now accepted as valid.
Changed
- All calibrations now undergo outlier detection and reweighting as part of the BA process. Outliers are detected for cameras, lidar, and relative extrinsics.
- Summary table is sorted by component name, not by UUID.
- Summary statistics in console are now computed using a weighted RMSE.
- The bundle adjustment is now a fully sparse operation, relieving memory pressure on larger datasets.
Fixed
- The height of the sync group chart now adjusts with the number of components present in the dataset.
- Bug in Init mode when using a RealSense435Imu preset.
- All stereo pairs are now derived and graphed in console output
Removed
- The
--metrics-with-outliersflag and the--outlier-filterflag have been removed.
Version 7.0.1
MetriCal Sensor Calibration Utilities for v7.0.1: https://gitlab.com/tangram-vision/platform/metrical/-/releases/v7.0.1
Overview
This patch release fixes various errata found in the v7.0.0 release.
Changelog
Fixed
- Rendering the correction at the end of a calibration actually uses the corrected plex (rather than the input plex).
- The extrinsics table now only shows delta values if an input plex is provided.
- Camera-lidar extrinsics rendering in Rerun now takes the spatial constraint with the minimum covariance. This is different from the previous behavior where all spatial constraints were rendered, regardless of quality.
Version 7.0.0
MetriCal Sensor Calibration Utilities for v7.0.0: https://gitlab.com/tangram-vision/platform/metrical/-/releases/v7.0.0
Overview
Welcome, v7.0.0! Yes, merely a week after v6.0.0, we bump major versions. Classic.
Revised Documentation
It's finally here! The revised Tangram Vision documentation site is live: https://docs.tangramvision.com/.
This documentation site holds readmes and tutorials on all of Tangram Vision's products. The MetriCal section is fully-featured, and based on this release. We will be maintaining all documentation for this and newer versions on the official docs site from here on out.
LiDAR-LiDAR Calibration
MetriCal now supports LiDAR-LiDAR calibration, no cameras needed. Users will need a lidar circle target to calibrate LiDAR.
New Modes - pretty-print and evaluate
v7.0.0 introduces two new modes:
- Pretty Print does what it says on the tin: prints the plex or results of a calibration in a human-readable format. This is useful for debugging and for getting a quick overview of the calibration. Docs: https://docs.tangramvision.com/metrical/commands/pretty_print/
- Evaluate can apply a calibration to a given dataset and produce metrics to validate the quality of the calibration. Docs: https://docs.tangramvision.com/metrical/commands/evaluate/.
The Calibrate mode, by extension, no longer has an --evaluate flag. This is just Evaluate mode.
Revamped Rendering options + Deprecated Review mode
Review mode is no longer! Instead, passing the --render flag to either Calibrate or Evaluate mode
will render the corrected calibration at the end of the run. Also, --render and --render-socket
options are no longer global. Instead, they are only applicable for Calibrate and Evaluate modes.
Changelog
Added
- Support for calibrating multi-LiDAR, no-camera datasets. This still leverages MetriCal's circle target, but no longer requires a camera or any image topics to be present in order to calibrate.
- Pretty Print mode for printing out a plex in a human readable format.
- Evaluate mode to evaluate the quality of a calibration on a test dataset. This is a
reinterpretation of the
--evaluateflag that was in the Calibrate mode; it's just been given its own command for ease of use. - A
verboseflag to the shape mode to print the plex that has been created from the command. - Additional descriptions to errors that can be generated by calling the calibrate mode.
Changed
- Calibrate + Evaluate mode now renders its own corrections (rather than punting that capability to review).
- The
--renderflag at the global level has been moved to the Calibrate & Evaluate modes.
Removed
- Review mode and README mode have been removed completely. Review mode's previous functionality is now split between Pretty Print mode and Calibrate mode.
- The
--evaluateflag in Calibrate mode.
Fixed
- Summary statistics tables now have the correct units displayed alongside their quantities.
- Printing the results of a plex with no extrinsics will now print an empty table, rather than nothing at all.
- Nominal extrinsics deltas in tables are now represented by the string "--".
Errata
- The "corrected" rendering at the end of a calibration run mistakenly uses the input plex, not the output plex. Scheduled fix: v7.0.1.
- The output extrinsics table does not correctly calculate the delta between the input and output plex. Scheduled fix: v7.0.1.
- Rendering the corrected camera-lidar registration would take the first spatial constraints available, rather than taking the constraint with the minimum covariance. This often makes calibrations appear wildly incorrect, despite a good calibration. Scheduled fix: v7.0.1.