|
mola_sm_loop_closure package from mola_sm_loop_closure repomola_sm_loop_closure |
ROS Distro
|
Package Summary
| Version | 1.3.0 |
| License | GPLv3 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/MOLAorg/mola_sm_loop_closure.git |
| VCS Type | git |
| VCS Version | develop |
| Last Updated | 2026-10-01 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Jose-Luis Blanco-Claraco
Authors
- Jose-Luis Blanco-Claraco
mola_sm_loop_closure
Offline loop-closure engine for MOLA CSimpleMap files. Given an input
simplemap produced by any MOLA odometry front-end, the package re-optimises
all keyframe poses by detecting and closing loops, then writes the corrected
simplemap back to disk.
Two algorithms
| Algorithm | Class | Best for |
|---|---|---|
| SimplemapLoopClosure | mola::SimplemapLoopClosure |
Long maps with noticeable drift; groups keyframes into submaps and runs heavy point-cloud ICP between submap pairs |
| FrameToFrameLoopClosure | mola::FrameToFrameLoopClosure |
GNSS-augmented datasets or quick re-optimisation; runs frame-to-frame ICP with a GNC graph optimizer |
CLI usage
# SimplemapLoopClosure (default algorithm):
mola-sm-lc-cli -i in.simplemap -o out.simplemap \
-p pipelines/loop-closure-lidar3d-gicp.yaml
# FrameToFrameLoopClosure:
mola-sm-lc-cli -i in.simplemap -o out.simplemap \
-a mola::FrameToFrameLoopClosure \
-p pipelines/loop-closure-f2f-lidar3d-gicp.yaml
Available pipelines
| YAML file | Sensor type | Algorithm |
|---|---|---|
loop-closure-lidar3d-gicp.yaml |
3-D LiDAR (GICP) | SimplemapLoopClosure |
loop-closure-lidar3d-icp.yaml |
3-D LiDAR (point-to-point ICP) | SimplemapLoopClosure |
loop-closure-lidar2d.yaml |
2-D LiDAR | SimplemapLoopClosure |
loop-closure-f2f-lidar3d-gicp.yaml |
3-D LiDAR (GICP) | FrameToFrameLoopClosure |
Key YAML knobs
SimplemapLoopClosure
-
submap_max_absolute_length/submap_min_absolute_length: controls submap granularity. -
assume_planar_world: trueenables annealed soft planar constraints (z, roll, pitch).-
planar_world_initial_sigma_z,planar_world_initial_sigma_ang,planar_world_annealing_rounds: tune the annealing schedule. -
planar_world_hard_flatten: truerestores the old hard-flattening behaviour.
-
-
use_gnss: true/gnss_add_horizontality: true: GNSS-assisted global alignment.-
gnss_factor_strategy: "submap"(default, scalable) or"per_kf"(sensor-pose-aware, larger graph). -
gnss_max_uncertainty_horiz(default20.0m) : reject GPS readings whose horizontal ENU uncertainty (√(σ_E²+σ_N²)) exceeds this threshold. -
gnss_max_uncertainty_vert(default40.0m) : reject GPS readings whose vertical ENU uncertainty (σ_U) exceeds this threshold. - Stats on accepted/rejected GNSS readings are printed at the INFO log level after processing.
-
-
use_imu_gravity: true/imu_gravity_sigma_deg: IMU-derived gravity-alignment factors added in stage 1.
FrameToFrameLoopClosure
-
lc_candidate_strategy:DISTANCE_STRATIFIED(default),PROXIMITY_ONLY, orMULTI_OBJECTIVE. -
assume_planar_world: true: planar-world annealing (subset of SM options; IMU-gravity options are not exposed byFrameToFrameLoopClosure::Parameters). -
use_gnss: true: per-keyframe GNSS factors (FactorGnssEnu).-
gnss_max_uncertainty_horiz(default20.0m) : reject GPS readings whose horizontal ENU uncertainty exceeds this threshold. -
gnss_max_uncertainty_vert(default40.0m) : reject GPS readings whose vertical ENU uncertainty exceeds this threshold.
-
-
manual_loop_constraints: list of hand-specified loop closure edges (by UNIX timestamp pair). Each entry supports:-
timestamp_i,timestamp_j: UNIX timestamps identifying the two keyframes. -
sigma_xyz: positional uncertainty [m]. -
trust_as_inlier(defaultfalse): iftrue, the constraint is added to the GNC set of known inliers and will not be downweighted by the robust optimizer.
-
-
use_kiss_matcher: true: use KISS-Matcher global registration to seed the ICP initial guess for each loop-closure candidate (default:false; requires thethird_party/kiss-matchersubmodule to be populated).-
kiss_matcher_resolution(default1.0m) : voxel size for KISS-Matcher feature extraction; controlsnormal_radius ≈ 3×andfpfh_radius ≈ 5×. -
kiss_matcher_layer(default"points_to_register_points") : name of themp2p_icp::metric_map_tlayer whose points are fed into KISS-Matcher.
-
See the online tutorial for a step-by-step example.
License
Copyright (C) 2018-2026 Jose Luis Blanco jlblanco@ual.es, University of Almeria
This package is released under the GNU GPL v3 license as open source, with the main intention of being useful for research and evaluation purposes. Commercial licenses available upon request.
Contributions require acceptance of the Contributor License Agreement (CLA).
Changelog for package mola_sm_loop_closure
1.3.0 (2026-10-01)
- ci: make scripts/release.py identical across repos by auto-discovering packages
- ci: add GitHub release workflow on version tags
- Merge pull request #25 from MOLAorg/feat/mrpt3
- Declare mrpt_viz as a direct dependency; clang-format test file
- Merge remote-tracking branch 'origin/develop' into feat/mrpt3
- fix: the loop-closure candidate floor rejects real revisits (#24)
- Port to MRPT 3.x: opengl->viz, TCLAP->CLI11, yaml associativity
- Merge pull request #23 from MOLAorg/feat/deterministic-scan
- CI: fail-fast: false, so one broken distro stops masking the others
- docs: the reproducibility guarantee is conditional on the build, say so
- perf: keep candidate parallelism in deterministic scans (92.7 s -> 40 s)
- feat: a [deterministic]{.title-ref} mode that makes a scan reproducible
- fix: listed mrpt::gui as dependency but could be removed
- chore: silent 3rdparty code warnings
- Merge pull request #22 from MOLAorg/feat/lc-analyze-progress-stats
- perf: keep rejected candidates lock-free in parallel analyze()
- feat: report per-scan progress and stats from analyze()
- Merge pull request #21 from MOLAorg/fix/imu-frames-deprecation-warning
- style: apply clang-format after IMU-frames ifdef edit
- fix: silence mola_georeferencing IMU extraction deprecation warning
- Merge pull request #20 from MOLAorg/feat/lc-parallel-icp
- feat: parallel per-candidate ICP in the F2F loop-closure detector
- Merge pull request #19 from MOLAorg/feat/lc-detection-robustness
- fix: gate KISS-Matcher guesses on the final inlier count
- feat: let analyze() callers exclude already-closed pairs from candidates
- fix: skip a failing loop-closure candidate instead of aborting the scan
- dont throw on empty scan frames
- expose MOLA_DESKEW_IGNORE_NO_TIMESTAMPS
- cmake: silent 3rdparty header warnings
- remove leftover mrpt::gui dependency
- Merge pull request #18 from MOLAorg/feat/f2f-use-imu-align
- feat: f2f algo uses imu acc for alignment
- Merge branch 'feat/lc-detector-analyze-api' into develop
- fix: skip observation unload during read-only analyze()
- Merge pull request #17 from MOLAorg/feat/lc-detector-analyze-api
- fix: keep analyze() read-only and leak-free
- fix: guard build_initial_graph against stale graph state
- feat: streaming, incremental and abortable analyze()
- feat: detector-only analyze() API for loop closure
- Contributors: Jose Luis Blanco Claraco, Jose Luis Blanco-Claraco
1.2.2 (2026-06-17)
- update robin and kiss-matcher submodules
- Contributors: Jose Luis Blanco-Claraco
1.2.1 (2026-06-16)
- fix: pmc FTBFS on Debian builds
- docs: add ROS 2 Lyrical badge row, update Rolling to Ubuntu 26.04 (resolute)
- Merge pull request #16 from MOLAorg/feat/assert-degenerated-gps feat: assert on degenerated GNSS data
- docs: update mrpt docs URI
- Contributors: Jose Luis Blanco-Claraco
1.2.0 (2026-05-11)
-
f2f pipeline: switch to multi-objective as default strategy
-
Merge pull request #15 from MOLAorg/simplify-ci CI: simplify clang-format helpers and use ros: docker images for stable builds
-
fix: wrap find -iname predicates in parentheses to scope them to listed dirs Without grouping, the -o operators apply at top level and -print0 only attaches to the last alternative, so files outside the intended directories can be matched.
-
CI: simplify clang-format helpers and use ros: docker images for
File truncated at 100 lines see the full file
Package Dependencies
System Dependencies
Dependant Packages
Launch files
Messages
Services
Plugins
Recent questions tagged mola_sm_loop_closure at Robotics Stack Exchange
|
mola_sm_loop_closure package from mola_sm_loop_closure repomola_sm_loop_closure |
ROS Distro
|
Package Summary
| Version | 1.3.0 |
| License | GPLv3 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/MOLAorg/mola_sm_loop_closure.git |
| VCS Type | git |
| VCS Version | develop |
| Last Updated | 2026-10-01 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Jose-Luis Blanco-Claraco
Authors
- Jose-Luis Blanco-Claraco
mola_sm_loop_closure
Offline loop-closure engine for MOLA CSimpleMap files. Given an input
simplemap produced by any MOLA odometry front-end, the package re-optimises
all keyframe poses by detecting and closing loops, then writes the corrected
simplemap back to disk.
Two algorithms
| Algorithm | Class | Best for |
|---|---|---|
| SimplemapLoopClosure | mola::SimplemapLoopClosure |
Long maps with noticeable drift; groups keyframes into submaps and runs heavy point-cloud ICP between submap pairs |
| FrameToFrameLoopClosure | mola::FrameToFrameLoopClosure |
GNSS-augmented datasets or quick re-optimisation; runs frame-to-frame ICP with a GNC graph optimizer |
CLI usage
# SimplemapLoopClosure (default algorithm):
mola-sm-lc-cli -i in.simplemap -o out.simplemap \
-p pipelines/loop-closure-lidar3d-gicp.yaml
# FrameToFrameLoopClosure:
mola-sm-lc-cli -i in.simplemap -o out.simplemap \
-a mola::FrameToFrameLoopClosure \
-p pipelines/loop-closure-f2f-lidar3d-gicp.yaml
Available pipelines
| YAML file | Sensor type | Algorithm |
|---|---|---|
loop-closure-lidar3d-gicp.yaml |
3-D LiDAR (GICP) | SimplemapLoopClosure |
loop-closure-lidar3d-icp.yaml |
3-D LiDAR (point-to-point ICP) | SimplemapLoopClosure |
loop-closure-lidar2d.yaml |
2-D LiDAR | SimplemapLoopClosure |
loop-closure-f2f-lidar3d-gicp.yaml |
3-D LiDAR (GICP) | FrameToFrameLoopClosure |
Key YAML knobs
SimplemapLoopClosure
-
submap_max_absolute_length/submap_min_absolute_length: controls submap granularity. -
assume_planar_world: trueenables annealed soft planar constraints (z, roll, pitch).-
planar_world_initial_sigma_z,planar_world_initial_sigma_ang,planar_world_annealing_rounds: tune the annealing schedule. -
planar_world_hard_flatten: truerestores the old hard-flattening behaviour.
-
-
use_gnss: true/gnss_add_horizontality: true: GNSS-assisted global alignment.-
gnss_factor_strategy: "submap"(default, scalable) or"per_kf"(sensor-pose-aware, larger graph). -
gnss_max_uncertainty_horiz(default20.0m) : reject GPS readings whose horizontal ENU uncertainty (√(σ_E²+σ_N²)) exceeds this threshold. -
gnss_max_uncertainty_vert(default40.0m) : reject GPS readings whose vertical ENU uncertainty (σ_U) exceeds this threshold. - Stats on accepted/rejected GNSS readings are printed at the INFO log level after processing.
-
-
use_imu_gravity: true/imu_gravity_sigma_deg: IMU-derived gravity-alignment factors added in stage 1.
FrameToFrameLoopClosure
-
lc_candidate_strategy:DISTANCE_STRATIFIED(default),PROXIMITY_ONLY, orMULTI_OBJECTIVE. -
assume_planar_world: true: planar-world annealing (subset of SM options; IMU-gravity options are not exposed byFrameToFrameLoopClosure::Parameters). -
use_gnss: true: per-keyframe GNSS factors (FactorGnssEnu).-
gnss_max_uncertainty_horiz(default20.0m) : reject GPS readings whose horizontal ENU uncertainty exceeds this threshold. -
gnss_max_uncertainty_vert(default40.0m) : reject GPS readings whose vertical ENU uncertainty exceeds this threshold.
-
-
manual_loop_constraints: list of hand-specified loop closure edges (by UNIX timestamp pair). Each entry supports:-
timestamp_i,timestamp_j: UNIX timestamps identifying the two keyframes. -
sigma_xyz: positional uncertainty [m]. -
trust_as_inlier(defaultfalse): iftrue, the constraint is added to the GNC set of known inliers and will not be downweighted by the robust optimizer.
-
-
use_kiss_matcher: true: use KISS-Matcher global registration to seed the ICP initial guess for each loop-closure candidate (default:false; requires thethird_party/kiss-matchersubmodule to be populated).-
kiss_matcher_resolution(default1.0m) : voxel size for KISS-Matcher feature extraction; controlsnormal_radius ≈ 3×andfpfh_radius ≈ 5×. -
kiss_matcher_layer(default"points_to_register_points") : name of themp2p_icp::metric_map_tlayer whose points are fed into KISS-Matcher.
-
See the online tutorial for a step-by-step example.
License
Copyright (C) 2018-2026 Jose Luis Blanco jlblanco@ual.es, University of Almeria
This package is released under the GNU GPL v3 license as open source, with the main intention of being useful for research and evaluation purposes. Commercial licenses available upon request.
Contributions require acceptance of the Contributor License Agreement (CLA).
Changelog for package mola_sm_loop_closure
1.3.0 (2026-10-01)
- ci: make scripts/release.py identical across repos by auto-discovering packages
- ci: add GitHub release workflow on version tags
- Merge pull request #25 from MOLAorg/feat/mrpt3
- Declare mrpt_viz as a direct dependency; clang-format test file
- Merge remote-tracking branch 'origin/develop' into feat/mrpt3
- fix: the loop-closure candidate floor rejects real revisits (#24)
- Port to MRPT 3.x: opengl->viz, TCLAP->CLI11, yaml associativity
- Merge pull request #23 from MOLAorg/feat/deterministic-scan
- CI: fail-fast: false, so one broken distro stops masking the others
- docs: the reproducibility guarantee is conditional on the build, say so
- perf: keep candidate parallelism in deterministic scans (92.7 s -> 40 s)
- feat: a [deterministic]{.title-ref} mode that makes a scan reproducible
- fix: listed mrpt::gui as dependency but could be removed
- chore: silent 3rdparty code warnings
- Merge pull request #22 from MOLAorg/feat/lc-analyze-progress-stats
- perf: keep rejected candidates lock-free in parallel analyze()
- feat: report per-scan progress and stats from analyze()
- Merge pull request #21 from MOLAorg/fix/imu-frames-deprecation-warning
- style: apply clang-format after IMU-frames ifdef edit
- fix: silence mola_georeferencing IMU extraction deprecation warning
- Merge pull request #20 from MOLAorg/feat/lc-parallel-icp
- feat: parallel per-candidate ICP in the F2F loop-closure detector
- Merge pull request #19 from MOLAorg/feat/lc-detection-robustness
- fix: gate KISS-Matcher guesses on the final inlier count
- feat: let analyze() callers exclude already-closed pairs from candidates
- fix: skip a failing loop-closure candidate instead of aborting the scan
- dont throw on empty scan frames
- expose MOLA_DESKEW_IGNORE_NO_TIMESTAMPS
- cmake: silent 3rdparty header warnings
- remove leftover mrpt::gui dependency
- Merge pull request #18 from MOLAorg/feat/f2f-use-imu-align
- feat: f2f algo uses imu acc for alignment
- Merge branch 'feat/lc-detector-analyze-api' into develop
- fix: skip observation unload during read-only analyze()
- Merge pull request #17 from MOLAorg/feat/lc-detector-analyze-api
- fix: keep analyze() read-only and leak-free
- fix: guard build_initial_graph against stale graph state
- feat: streaming, incremental and abortable analyze()
- feat: detector-only analyze() API for loop closure
- Contributors: Jose Luis Blanco Claraco, Jose Luis Blanco-Claraco
1.2.2 (2026-06-17)
- update robin and kiss-matcher submodules
- Contributors: Jose Luis Blanco-Claraco
1.2.1 (2026-06-16)
- fix: pmc FTBFS on Debian builds
- docs: add ROS 2 Lyrical badge row, update Rolling to Ubuntu 26.04 (resolute)
- Merge pull request #16 from MOLAorg/feat/assert-degenerated-gps feat: assert on degenerated GNSS data
- docs: update mrpt docs URI
- Contributors: Jose Luis Blanco-Claraco
1.2.0 (2026-05-11)
-
f2f pipeline: switch to multi-objective as default strategy
-
Merge pull request #15 from MOLAorg/simplify-ci CI: simplify clang-format helpers and use ros: docker images for stable builds
-
fix: wrap find -iname predicates in parentheses to scope them to listed dirs Without grouping, the -o operators apply at top level and -print0 only attaches to the last alternative, so files outside the intended directories can be matched.
-
CI: simplify clang-format helpers and use ros: docker images for
File truncated at 100 lines see the full file
Package Dependencies
System Dependencies
Dependant Packages
Launch files
Messages
Services
Plugins
Recent questions tagged mola_sm_loop_closure at Robotics Stack Exchange
|
mola_sm_loop_closure package from mola_sm_loop_closure repomola_sm_loop_closure |
ROS Distro
|
Package Summary
| Version | 1.3.0 |
| License | GPLv3 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/MOLAorg/mola_sm_loop_closure.git |
| VCS Type | git |
| VCS Version | develop |
| Last Updated | 2026-10-01 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Jose-Luis Blanco-Claraco
Authors
- Jose-Luis Blanco-Claraco
mola_sm_loop_closure
Offline loop-closure engine for MOLA CSimpleMap files. Given an input
simplemap produced by any MOLA odometry front-end, the package re-optimises
all keyframe poses by detecting and closing loops, then writes the corrected
simplemap back to disk.
Two algorithms
| Algorithm | Class | Best for |
|---|---|---|
| SimplemapLoopClosure | mola::SimplemapLoopClosure |
Long maps with noticeable drift; groups keyframes into submaps and runs heavy point-cloud ICP between submap pairs |
| FrameToFrameLoopClosure | mola::FrameToFrameLoopClosure |
GNSS-augmented datasets or quick re-optimisation; runs frame-to-frame ICP with a GNC graph optimizer |
CLI usage
# SimplemapLoopClosure (default algorithm):
mola-sm-lc-cli -i in.simplemap -o out.simplemap \
-p pipelines/loop-closure-lidar3d-gicp.yaml
# FrameToFrameLoopClosure:
mola-sm-lc-cli -i in.simplemap -o out.simplemap \
-a mola::FrameToFrameLoopClosure \
-p pipelines/loop-closure-f2f-lidar3d-gicp.yaml
Available pipelines
| YAML file | Sensor type | Algorithm |
|---|---|---|
loop-closure-lidar3d-gicp.yaml |
3-D LiDAR (GICP) | SimplemapLoopClosure |
loop-closure-lidar3d-icp.yaml |
3-D LiDAR (point-to-point ICP) | SimplemapLoopClosure |
loop-closure-lidar2d.yaml |
2-D LiDAR | SimplemapLoopClosure |
loop-closure-f2f-lidar3d-gicp.yaml |
3-D LiDAR (GICP) | FrameToFrameLoopClosure |
Key YAML knobs
SimplemapLoopClosure
-
submap_max_absolute_length/submap_min_absolute_length: controls submap granularity. -
assume_planar_world: trueenables annealed soft planar constraints (z, roll, pitch).-
planar_world_initial_sigma_z,planar_world_initial_sigma_ang,planar_world_annealing_rounds: tune the annealing schedule. -
planar_world_hard_flatten: truerestores the old hard-flattening behaviour.
-
-
use_gnss: true/gnss_add_horizontality: true: GNSS-assisted global alignment.-
gnss_factor_strategy: "submap"(default, scalable) or"per_kf"(sensor-pose-aware, larger graph). -
gnss_max_uncertainty_horiz(default20.0m) : reject GPS readings whose horizontal ENU uncertainty (√(σ_E²+σ_N²)) exceeds this threshold. -
gnss_max_uncertainty_vert(default40.0m) : reject GPS readings whose vertical ENU uncertainty (σ_U) exceeds this threshold. - Stats on accepted/rejected GNSS readings are printed at the INFO log level after processing.
-
-
use_imu_gravity: true/imu_gravity_sigma_deg: IMU-derived gravity-alignment factors added in stage 1.
FrameToFrameLoopClosure
-
lc_candidate_strategy:DISTANCE_STRATIFIED(default),PROXIMITY_ONLY, orMULTI_OBJECTIVE. -
assume_planar_world: true: planar-world annealing (subset of SM options; IMU-gravity options are not exposed byFrameToFrameLoopClosure::Parameters). -
use_gnss: true: per-keyframe GNSS factors (FactorGnssEnu).-
gnss_max_uncertainty_horiz(default20.0m) : reject GPS readings whose horizontal ENU uncertainty exceeds this threshold. -
gnss_max_uncertainty_vert(default40.0m) : reject GPS readings whose vertical ENU uncertainty exceeds this threshold.
-
-
manual_loop_constraints: list of hand-specified loop closure edges (by UNIX timestamp pair). Each entry supports:-
timestamp_i,timestamp_j: UNIX timestamps identifying the two keyframes. -
sigma_xyz: positional uncertainty [m]. -
trust_as_inlier(defaultfalse): iftrue, the constraint is added to the GNC set of known inliers and will not be downweighted by the robust optimizer.
-
-
use_kiss_matcher: true: use KISS-Matcher global registration to seed the ICP initial guess for each loop-closure candidate (default:false; requires thethird_party/kiss-matchersubmodule to be populated).-
kiss_matcher_resolution(default1.0m) : voxel size for KISS-Matcher feature extraction; controlsnormal_radius ≈ 3×andfpfh_radius ≈ 5×. -
kiss_matcher_layer(default"points_to_register_points") : name of themp2p_icp::metric_map_tlayer whose points are fed into KISS-Matcher.
-
See the online tutorial for a step-by-step example.
License
Copyright (C) 2018-2026 Jose Luis Blanco jlblanco@ual.es, University of Almeria
This package is released under the GNU GPL v3 license as open source, with the main intention of being useful for research and evaluation purposes. Commercial licenses available upon request.
Contributions require acceptance of the Contributor License Agreement (CLA).
Changelog for package mola_sm_loop_closure
1.3.0 (2026-10-01)
- ci: make scripts/release.py identical across repos by auto-discovering packages
- ci: add GitHub release workflow on version tags
- Merge pull request #25 from MOLAorg/feat/mrpt3
- Declare mrpt_viz as a direct dependency; clang-format test file
- Merge remote-tracking branch 'origin/develop' into feat/mrpt3
- fix: the loop-closure candidate floor rejects real revisits (#24)
- Port to MRPT 3.x: opengl->viz, TCLAP->CLI11, yaml associativity
- Merge pull request #23 from MOLAorg/feat/deterministic-scan
- CI: fail-fast: false, so one broken distro stops masking the others
- docs: the reproducibility guarantee is conditional on the build, say so
- perf: keep candidate parallelism in deterministic scans (92.7 s -> 40 s)
- feat: a [deterministic]{.title-ref} mode that makes a scan reproducible
- fix: listed mrpt::gui as dependency but could be removed
- chore: silent 3rdparty code warnings
- Merge pull request #22 from MOLAorg/feat/lc-analyze-progress-stats
- perf: keep rejected candidates lock-free in parallel analyze()
- feat: report per-scan progress and stats from analyze()
- Merge pull request #21 from MOLAorg/fix/imu-frames-deprecation-warning
- style: apply clang-format after IMU-frames ifdef edit
- fix: silence mola_georeferencing IMU extraction deprecation warning
- Merge pull request #20 from MOLAorg/feat/lc-parallel-icp
- feat: parallel per-candidate ICP in the F2F loop-closure detector
- Merge pull request #19 from MOLAorg/feat/lc-detection-robustness
- fix: gate KISS-Matcher guesses on the final inlier count
- feat: let analyze() callers exclude already-closed pairs from candidates
- fix: skip a failing loop-closure candidate instead of aborting the scan
- dont throw on empty scan frames
- expose MOLA_DESKEW_IGNORE_NO_TIMESTAMPS
- cmake: silent 3rdparty header warnings
- remove leftover mrpt::gui dependency
- Merge pull request #18 from MOLAorg/feat/f2f-use-imu-align
- feat: f2f algo uses imu acc for alignment
- Merge branch 'feat/lc-detector-analyze-api' into develop
- fix: skip observation unload during read-only analyze()
- Merge pull request #17 from MOLAorg/feat/lc-detector-analyze-api
- fix: keep analyze() read-only and leak-free
- fix: guard build_initial_graph against stale graph state
- feat: streaming, incremental and abortable analyze()
- feat: detector-only analyze() API for loop closure
- Contributors: Jose Luis Blanco Claraco, Jose Luis Blanco-Claraco
1.2.2 (2026-06-17)
- update robin and kiss-matcher submodules
- Contributors: Jose Luis Blanco-Claraco
1.2.1 (2026-06-16)
- fix: pmc FTBFS on Debian builds
- docs: add ROS 2 Lyrical badge row, update Rolling to Ubuntu 26.04 (resolute)
- Merge pull request #16 from MOLAorg/feat/assert-degenerated-gps feat: assert on degenerated GNSS data
- docs: update mrpt docs URI
- Contributors: Jose Luis Blanco-Claraco
1.2.0 (2026-05-11)
-
f2f pipeline: switch to multi-objective as default strategy
-
Merge pull request #15 from MOLAorg/simplify-ci CI: simplify clang-format helpers and use ros: docker images for stable builds
-
fix: wrap find -iname predicates in parentheses to scope them to listed dirs Without grouping, the -o operators apply at top level and -print0 only attaches to the last alternative, so files outside the intended directories can be matched.
-
CI: simplify clang-format helpers and use ros: docker images for
File truncated at 100 lines see the full file
Package Dependencies
System Dependencies
Dependant Packages
Launch files
Messages
Services
Plugins
Recent questions tagged mola_sm_loop_closure at Robotics Stack Exchange
|
mola_sm_loop_closure package from mola_sm_loop_closure repomola_sm_loop_closure |
ROS Distro
|
Package Summary
| Version | 1.3.0 |
| License | GPLv3 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/MOLAorg/mola_sm_loop_closure.git |
| VCS Type | git |
| VCS Version | develop |
| Last Updated | 2026-10-01 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Jose-Luis Blanco-Claraco
Authors
- Jose-Luis Blanco-Claraco
mola_sm_loop_closure
Offline loop-closure engine for MOLA CSimpleMap files. Given an input
simplemap produced by any MOLA odometry front-end, the package re-optimises
all keyframe poses by detecting and closing loops, then writes the corrected
simplemap back to disk.
Two algorithms
| Algorithm | Class | Best for |
|---|---|---|
| SimplemapLoopClosure | mola::SimplemapLoopClosure |
Long maps with noticeable drift; groups keyframes into submaps and runs heavy point-cloud ICP between submap pairs |
| FrameToFrameLoopClosure | mola::FrameToFrameLoopClosure |
GNSS-augmented datasets or quick re-optimisation; runs frame-to-frame ICP with a GNC graph optimizer |
CLI usage
# SimplemapLoopClosure (default algorithm):
mola-sm-lc-cli -i in.simplemap -o out.simplemap \
-p pipelines/loop-closure-lidar3d-gicp.yaml
# FrameToFrameLoopClosure:
mola-sm-lc-cli -i in.simplemap -o out.simplemap \
-a mola::FrameToFrameLoopClosure \
-p pipelines/loop-closure-f2f-lidar3d-gicp.yaml
Available pipelines
| YAML file | Sensor type | Algorithm |
|---|---|---|
loop-closure-lidar3d-gicp.yaml |
3-D LiDAR (GICP) | SimplemapLoopClosure |
loop-closure-lidar3d-icp.yaml |
3-D LiDAR (point-to-point ICP) | SimplemapLoopClosure |
loop-closure-lidar2d.yaml |
2-D LiDAR | SimplemapLoopClosure |
loop-closure-f2f-lidar3d-gicp.yaml |
3-D LiDAR (GICP) | FrameToFrameLoopClosure |
Key YAML knobs
SimplemapLoopClosure
-
submap_max_absolute_length/submap_min_absolute_length: controls submap granularity. -
assume_planar_world: trueenables annealed soft planar constraints (z, roll, pitch).-
planar_world_initial_sigma_z,planar_world_initial_sigma_ang,planar_world_annealing_rounds: tune the annealing schedule. -
planar_world_hard_flatten: truerestores the old hard-flattening behaviour.
-
-
use_gnss: true/gnss_add_horizontality: true: GNSS-assisted global alignment.-
gnss_factor_strategy: "submap"(default, scalable) or"per_kf"(sensor-pose-aware, larger graph). -
gnss_max_uncertainty_horiz(default20.0m) : reject GPS readings whose horizontal ENU uncertainty (√(σ_E²+σ_N²)) exceeds this threshold. -
gnss_max_uncertainty_vert(default40.0m) : reject GPS readings whose vertical ENU uncertainty (σ_U) exceeds this threshold. - Stats on accepted/rejected GNSS readings are printed at the INFO log level after processing.
-
-
use_imu_gravity: true/imu_gravity_sigma_deg: IMU-derived gravity-alignment factors added in stage 1.
FrameToFrameLoopClosure
-
lc_candidate_strategy:DISTANCE_STRATIFIED(default),PROXIMITY_ONLY, orMULTI_OBJECTIVE. -
assume_planar_world: true: planar-world annealing (subset of SM options; IMU-gravity options are not exposed byFrameToFrameLoopClosure::Parameters). -
use_gnss: true: per-keyframe GNSS factors (FactorGnssEnu).-
gnss_max_uncertainty_horiz(default20.0m) : reject GPS readings whose horizontal ENU uncertainty exceeds this threshold. -
gnss_max_uncertainty_vert(default40.0m) : reject GPS readings whose vertical ENU uncertainty exceeds this threshold.
-
-
manual_loop_constraints: list of hand-specified loop closure edges (by UNIX timestamp pair). Each entry supports:-
timestamp_i,timestamp_j: UNIX timestamps identifying the two keyframes. -
sigma_xyz: positional uncertainty [m]. -
trust_as_inlier(defaultfalse): iftrue, the constraint is added to the GNC set of known inliers and will not be downweighted by the robust optimizer.
-
-
use_kiss_matcher: true: use KISS-Matcher global registration to seed the ICP initial guess for each loop-closure candidate (default:false; requires thethird_party/kiss-matchersubmodule to be populated).-
kiss_matcher_resolution(default1.0m) : voxel size for KISS-Matcher feature extraction; controlsnormal_radius ≈ 3×andfpfh_radius ≈ 5×. -
kiss_matcher_layer(default"points_to_register_points") : name of themp2p_icp::metric_map_tlayer whose points are fed into KISS-Matcher.
-
See the online tutorial for a step-by-step example.
License
Copyright (C) 2018-2026 Jose Luis Blanco jlblanco@ual.es, University of Almeria
This package is released under the GNU GPL v3 license as open source, with the main intention of being useful for research and evaluation purposes. Commercial licenses available upon request.
Contributions require acceptance of the Contributor License Agreement (CLA).
Changelog for package mola_sm_loop_closure
1.3.0 (2026-10-01)
- ci: make scripts/release.py identical across repos by auto-discovering packages
- ci: add GitHub release workflow on version tags
- Merge pull request #25 from MOLAorg/feat/mrpt3
- Declare mrpt_viz as a direct dependency; clang-format test file
- Merge remote-tracking branch 'origin/develop' into feat/mrpt3
- fix: the loop-closure candidate floor rejects real revisits (#24)
- Port to MRPT 3.x: opengl->viz, TCLAP->CLI11, yaml associativity
- Merge pull request #23 from MOLAorg/feat/deterministic-scan
- CI: fail-fast: false, so one broken distro stops masking the others
- docs: the reproducibility guarantee is conditional on the build, say so
- perf: keep candidate parallelism in deterministic scans (92.7 s -> 40 s)
- feat: a [deterministic]{.title-ref} mode that makes a scan reproducible
- fix: listed mrpt::gui as dependency but could be removed
- chore: silent 3rdparty code warnings
- Merge pull request #22 from MOLAorg/feat/lc-analyze-progress-stats
- perf: keep rejected candidates lock-free in parallel analyze()
- feat: report per-scan progress and stats from analyze()
- Merge pull request #21 from MOLAorg/fix/imu-frames-deprecation-warning
- style: apply clang-format after IMU-frames ifdef edit
- fix: silence mola_georeferencing IMU extraction deprecation warning
- Merge pull request #20 from MOLAorg/feat/lc-parallel-icp
- feat: parallel per-candidate ICP in the F2F loop-closure detector
- Merge pull request #19 from MOLAorg/feat/lc-detection-robustness
- fix: gate KISS-Matcher guesses on the final inlier count
- feat: let analyze() callers exclude already-closed pairs from candidates
- fix: skip a failing loop-closure candidate instead of aborting the scan
- dont throw on empty scan frames
- expose MOLA_DESKEW_IGNORE_NO_TIMESTAMPS
- cmake: silent 3rdparty header warnings
- remove leftover mrpt::gui dependency
- Merge pull request #18 from MOLAorg/feat/f2f-use-imu-align
- feat: f2f algo uses imu acc for alignment
- Merge branch 'feat/lc-detector-analyze-api' into develop
- fix: skip observation unload during read-only analyze()
- Merge pull request #17 from MOLAorg/feat/lc-detector-analyze-api
- fix: keep analyze() read-only and leak-free
- fix: guard build_initial_graph against stale graph state
- feat: streaming, incremental and abortable analyze()
- feat: detector-only analyze() API for loop closure
- Contributors: Jose Luis Blanco Claraco, Jose Luis Blanco-Claraco
1.2.2 (2026-06-17)
- update robin and kiss-matcher submodules
- Contributors: Jose Luis Blanco-Claraco
1.2.1 (2026-06-16)
- fix: pmc FTBFS on Debian builds
- docs: add ROS 2 Lyrical badge row, update Rolling to Ubuntu 26.04 (resolute)
- Merge pull request #16 from MOLAorg/feat/assert-degenerated-gps feat: assert on degenerated GNSS data
- docs: update mrpt docs URI
- Contributors: Jose Luis Blanco-Claraco
1.2.0 (2026-05-11)
-
f2f pipeline: switch to multi-objective as default strategy
-
Merge pull request #15 from MOLAorg/simplify-ci CI: simplify clang-format helpers and use ros: docker images for stable builds
-
fix: wrap find -iname predicates in parentheses to scope them to listed dirs Without grouping, the -o operators apply at top level and -print0 only attaches to the last alternative, so files outside the intended directories can be matched.
-
CI: simplify clang-format helpers and use ros: docker images for
File truncated at 100 lines see the full file
Package Dependencies
System Dependencies
Dependant Packages
Launch files
Messages
Services
Plugins
Recent questions tagged mola_sm_loop_closure at Robotics Stack Exchange
|
mola_sm_loop_closure package from mola_sm_loop_closure repomola_sm_loop_closure |
ROS Distro
|
Package Summary
| Version | 1.3.0 |
| License | GPLv3 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/MOLAorg/mola_sm_loop_closure.git |
| VCS Type | git |
| VCS Version | develop |
| Last Updated | 2026-10-01 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Jose-Luis Blanco-Claraco
Authors
- Jose-Luis Blanco-Claraco
mola_sm_loop_closure
Offline loop-closure engine for MOLA CSimpleMap files. Given an input
simplemap produced by any MOLA odometry front-end, the package re-optimises
all keyframe poses by detecting and closing loops, then writes the corrected
simplemap back to disk.
Two algorithms
| Algorithm | Class | Best for |
|---|---|---|
| SimplemapLoopClosure | mola::SimplemapLoopClosure |
Long maps with noticeable drift; groups keyframes into submaps and runs heavy point-cloud ICP between submap pairs |
| FrameToFrameLoopClosure | mola::FrameToFrameLoopClosure |
GNSS-augmented datasets or quick re-optimisation; runs frame-to-frame ICP with a GNC graph optimizer |
CLI usage
# SimplemapLoopClosure (default algorithm):
mola-sm-lc-cli -i in.simplemap -o out.simplemap \
-p pipelines/loop-closure-lidar3d-gicp.yaml
# FrameToFrameLoopClosure:
mola-sm-lc-cli -i in.simplemap -o out.simplemap \
-a mola::FrameToFrameLoopClosure \
-p pipelines/loop-closure-f2f-lidar3d-gicp.yaml
Available pipelines
| YAML file | Sensor type | Algorithm |
|---|---|---|
loop-closure-lidar3d-gicp.yaml |
3-D LiDAR (GICP) | SimplemapLoopClosure |
loop-closure-lidar3d-icp.yaml |
3-D LiDAR (point-to-point ICP) | SimplemapLoopClosure |
loop-closure-lidar2d.yaml |
2-D LiDAR | SimplemapLoopClosure |
loop-closure-f2f-lidar3d-gicp.yaml |
3-D LiDAR (GICP) | FrameToFrameLoopClosure |
Key YAML knobs
SimplemapLoopClosure
-
submap_max_absolute_length/submap_min_absolute_length: controls submap granularity. -
assume_planar_world: trueenables annealed soft planar constraints (z, roll, pitch).-
planar_world_initial_sigma_z,planar_world_initial_sigma_ang,planar_world_annealing_rounds: tune the annealing schedule. -
planar_world_hard_flatten: truerestores the old hard-flattening behaviour.
-
-
use_gnss: true/gnss_add_horizontality: true: GNSS-assisted global alignment.-
gnss_factor_strategy: "submap"(default, scalable) or"per_kf"(sensor-pose-aware, larger graph). -
gnss_max_uncertainty_horiz(default20.0m) : reject GPS readings whose horizontal ENU uncertainty (√(σ_E²+σ_N²)) exceeds this threshold. -
gnss_max_uncertainty_vert(default40.0m) : reject GPS readings whose vertical ENU uncertainty (σ_U) exceeds this threshold. - Stats on accepted/rejected GNSS readings are printed at the INFO log level after processing.
-
-
use_imu_gravity: true/imu_gravity_sigma_deg: IMU-derived gravity-alignment factors added in stage 1.
FrameToFrameLoopClosure
-
lc_candidate_strategy:DISTANCE_STRATIFIED(default),PROXIMITY_ONLY, orMULTI_OBJECTIVE. -
assume_planar_world: true: planar-world annealing (subset of SM options; IMU-gravity options are not exposed byFrameToFrameLoopClosure::Parameters). -
use_gnss: true: per-keyframe GNSS factors (FactorGnssEnu).-
gnss_max_uncertainty_horiz(default20.0m) : reject GPS readings whose horizontal ENU uncertainty exceeds this threshold. -
gnss_max_uncertainty_vert(default40.0m) : reject GPS readings whose vertical ENU uncertainty exceeds this threshold.
-
-
manual_loop_constraints: list of hand-specified loop closure edges (by UNIX timestamp pair). Each entry supports:-
timestamp_i,timestamp_j: UNIX timestamps identifying the two keyframes. -
sigma_xyz: positional uncertainty [m]. -
trust_as_inlier(defaultfalse): iftrue, the constraint is added to the GNC set of known inliers and will not be downweighted by the robust optimizer.
-
-
use_kiss_matcher: true: use KISS-Matcher global registration to seed the ICP initial guess for each loop-closure candidate (default:false; requires thethird_party/kiss-matchersubmodule to be populated).-
kiss_matcher_resolution(default1.0m) : voxel size for KISS-Matcher feature extraction; controlsnormal_radius ≈ 3×andfpfh_radius ≈ 5×. -
kiss_matcher_layer(default"points_to_register_points") : name of themp2p_icp::metric_map_tlayer whose points are fed into KISS-Matcher.
-
See the online tutorial for a step-by-step example.
License
Copyright (C) 2018-2026 Jose Luis Blanco jlblanco@ual.es, University of Almeria
This package is released under the GNU GPL v3 license as open source, with the main intention of being useful for research and evaluation purposes. Commercial licenses available upon request.
Contributions require acceptance of the Contributor License Agreement (CLA).
Changelog for package mola_sm_loop_closure
1.3.0 (2026-10-01)
- ci: make scripts/release.py identical across repos by auto-discovering packages
- ci: add GitHub release workflow on version tags
- Merge pull request #25 from MOLAorg/feat/mrpt3
- Declare mrpt_viz as a direct dependency; clang-format test file
- Merge remote-tracking branch 'origin/develop' into feat/mrpt3
- fix: the loop-closure candidate floor rejects real revisits (#24)
- Port to MRPT 3.x: opengl->viz, TCLAP->CLI11, yaml associativity
- Merge pull request #23 from MOLAorg/feat/deterministic-scan
- CI: fail-fast: false, so one broken distro stops masking the others
- docs: the reproducibility guarantee is conditional on the build, say so
- perf: keep candidate parallelism in deterministic scans (92.7 s -> 40 s)
- feat: a [deterministic]{.title-ref} mode that makes a scan reproducible
- fix: listed mrpt::gui as dependency but could be removed
- chore: silent 3rdparty code warnings
- Merge pull request #22 from MOLAorg/feat/lc-analyze-progress-stats
- perf: keep rejected candidates lock-free in parallel analyze()
- feat: report per-scan progress and stats from analyze()
- Merge pull request #21 from MOLAorg/fix/imu-frames-deprecation-warning
- style: apply clang-format after IMU-frames ifdef edit
- fix: silence mola_georeferencing IMU extraction deprecation warning
- Merge pull request #20 from MOLAorg/feat/lc-parallel-icp
- feat: parallel per-candidate ICP in the F2F loop-closure detector
- Merge pull request #19 from MOLAorg/feat/lc-detection-robustness
- fix: gate KISS-Matcher guesses on the final inlier count
- feat: let analyze() callers exclude already-closed pairs from candidates
- fix: skip a failing loop-closure candidate instead of aborting the scan
- dont throw on empty scan frames
- expose MOLA_DESKEW_IGNORE_NO_TIMESTAMPS
- cmake: silent 3rdparty header warnings
- remove leftover mrpt::gui dependency
- Merge pull request #18 from MOLAorg/feat/f2f-use-imu-align
- feat: f2f algo uses imu acc for alignment
- Merge branch 'feat/lc-detector-analyze-api' into develop
- fix: skip observation unload during read-only analyze()
- Merge pull request #17 from MOLAorg/feat/lc-detector-analyze-api
- fix: keep analyze() read-only and leak-free
- fix: guard build_initial_graph against stale graph state
- feat: streaming, incremental and abortable analyze()
- feat: detector-only analyze() API for loop closure
- Contributors: Jose Luis Blanco Claraco, Jose Luis Blanco-Claraco
1.2.2 (2026-06-17)
- update robin and kiss-matcher submodules
- Contributors: Jose Luis Blanco-Claraco
1.2.1 (2026-06-16)
- fix: pmc FTBFS on Debian builds
- docs: add ROS 2 Lyrical badge row, update Rolling to Ubuntu 26.04 (resolute)
- Merge pull request #16 from MOLAorg/feat/assert-degenerated-gps feat: assert on degenerated GNSS data
- docs: update mrpt docs URI
- Contributors: Jose Luis Blanco-Claraco
1.2.0 (2026-05-11)
-
f2f pipeline: switch to multi-objective as default strategy
-
Merge pull request #15 from MOLAorg/simplify-ci CI: simplify clang-format helpers and use ros: docker images for stable builds
-
fix: wrap find -iname predicates in parentheses to scope them to listed dirs Without grouping, the -o operators apply at top level and -print0 only attaches to the last alternative, so files outside the intended directories can be matched.
-
CI: simplify clang-format helpers and use ros: docker images for
File truncated at 100 lines see the full file
Package Dependencies
System Dependencies
Dependant Packages
Launch files
Messages
Services
Plugins
Recent questions tagged mola_sm_loop_closure at Robotics Stack Exchange
|
mola_sm_loop_closure package from mola_sm_loop_closure repomola_sm_loop_closure |
ROS Distro
|
Package Summary
| Version | 1.3.0 |
| License | GPLv3 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/MOLAorg/mola_sm_loop_closure.git |
| VCS Type | git |
| VCS Version | develop |
| Last Updated | 2026-10-01 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Jose-Luis Blanco-Claraco
Authors
- Jose-Luis Blanco-Claraco
mola_sm_loop_closure
Offline loop-closure engine for MOLA CSimpleMap files. Given an input
simplemap produced by any MOLA odometry front-end, the package re-optimises
all keyframe poses by detecting and closing loops, then writes the corrected
simplemap back to disk.
Two algorithms
| Algorithm | Class | Best for |
|---|---|---|
| SimplemapLoopClosure | mola::SimplemapLoopClosure |
Long maps with noticeable drift; groups keyframes into submaps and runs heavy point-cloud ICP between submap pairs |
| FrameToFrameLoopClosure | mola::FrameToFrameLoopClosure |
GNSS-augmented datasets or quick re-optimisation; runs frame-to-frame ICP with a GNC graph optimizer |
CLI usage
# SimplemapLoopClosure (default algorithm):
mola-sm-lc-cli -i in.simplemap -o out.simplemap \
-p pipelines/loop-closure-lidar3d-gicp.yaml
# FrameToFrameLoopClosure:
mola-sm-lc-cli -i in.simplemap -o out.simplemap \
-a mola::FrameToFrameLoopClosure \
-p pipelines/loop-closure-f2f-lidar3d-gicp.yaml
Available pipelines
| YAML file | Sensor type | Algorithm |
|---|---|---|
loop-closure-lidar3d-gicp.yaml |
3-D LiDAR (GICP) | SimplemapLoopClosure |
loop-closure-lidar3d-icp.yaml |
3-D LiDAR (point-to-point ICP) | SimplemapLoopClosure |
loop-closure-lidar2d.yaml |
2-D LiDAR | SimplemapLoopClosure |
loop-closure-f2f-lidar3d-gicp.yaml |
3-D LiDAR (GICP) | FrameToFrameLoopClosure |
Key YAML knobs
SimplemapLoopClosure
-
submap_max_absolute_length/submap_min_absolute_length: controls submap granularity. -
assume_planar_world: trueenables annealed soft planar constraints (z, roll, pitch).-
planar_world_initial_sigma_z,planar_world_initial_sigma_ang,planar_world_annealing_rounds: tune the annealing schedule. -
planar_world_hard_flatten: truerestores the old hard-flattening behaviour.
-
-
use_gnss: true/gnss_add_horizontality: true: GNSS-assisted global alignment.-
gnss_factor_strategy: "submap"(default, scalable) or"per_kf"(sensor-pose-aware, larger graph). -
gnss_max_uncertainty_horiz(default20.0m) : reject GPS readings whose horizontal ENU uncertainty (√(σ_E²+σ_N²)) exceeds this threshold. -
gnss_max_uncertainty_vert(default40.0m) : reject GPS readings whose vertical ENU uncertainty (σ_U) exceeds this threshold. - Stats on accepted/rejected GNSS readings are printed at the INFO log level after processing.
-
-
use_imu_gravity: true/imu_gravity_sigma_deg: IMU-derived gravity-alignment factors added in stage 1.
FrameToFrameLoopClosure
-
lc_candidate_strategy:DISTANCE_STRATIFIED(default),PROXIMITY_ONLY, orMULTI_OBJECTIVE. -
assume_planar_world: true: planar-world annealing (subset of SM options; IMU-gravity options are not exposed byFrameToFrameLoopClosure::Parameters). -
use_gnss: true: per-keyframe GNSS factors (FactorGnssEnu).-
gnss_max_uncertainty_horiz(default20.0m) : reject GPS readings whose horizontal ENU uncertainty exceeds this threshold. -
gnss_max_uncertainty_vert(default40.0m) : reject GPS readings whose vertical ENU uncertainty exceeds this threshold.
-
-
manual_loop_constraints: list of hand-specified loop closure edges (by UNIX timestamp pair). Each entry supports:-
timestamp_i,timestamp_j: UNIX timestamps identifying the two keyframes. -
sigma_xyz: positional uncertainty [m]. -
trust_as_inlier(defaultfalse): iftrue, the constraint is added to the GNC set of known inliers and will not be downweighted by the robust optimizer.
-
-
use_kiss_matcher: true: use KISS-Matcher global registration to seed the ICP initial guess for each loop-closure candidate (default:false; requires thethird_party/kiss-matchersubmodule to be populated).-
kiss_matcher_resolution(default1.0m) : voxel size for KISS-Matcher feature extraction; controlsnormal_radius ≈ 3×andfpfh_radius ≈ 5×. -
kiss_matcher_layer(default"points_to_register_points") : name of themp2p_icp::metric_map_tlayer whose points are fed into KISS-Matcher.
-
See the online tutorial for a step-by-step example.
License
Copyright (C) 2018-2026 Jose Luis Blanco jlblanco@ual.es, University of Almeria
This package is released under the GNU GPL v3 license as open source, with the main intention of being useful for research and evaluation purposes. Commercial licenses available upon request.
Contributions require acceptance of the Contributor License Agreement (CLA).
Changelog for package mola_sm_loop_closure
1.3.0 (2026-10-01)
- ci: make scripts/release.py identical across repos by auto-discovering packages
- ci: add GitHub release workflow on version tags
- Merge pull request #25 from MOLAorg/feat/mrpt3
- Declare mrpt_viz as a direct dependency; clang-format test file
- Merge remote-tracking branch 'origin/develop' into feat/mrpt3
- fix: the loop-closure candidate floor rejects real revisits (#24)
- Port to MRPT 3.x: opengl->viz, TCLAP->CLI11, yaml associativity
- Merge pull request #23 from MOLAorg/feat/deterministic-scan
- CI: fail-fast: false, so one broken distro stops masking the others
- docs: the reproducibility guarantee is conditional on the build, say so
- perf: keep candidate parallelism in deterministic scans (92.7 s -> 40 s)
- feat: a [deterministic]{.title-ref} mode that makes a scan reproducible
- fix: listed mrpt::gui as dependency but could be removed
- chore: silent 3rdparty code warnings
- Merge pull request #22 from MOLAorg/feat/lc-analyze-progress-stats
- perf: keep rejected candidates lock-free in parallel analyze()
- feat: report per-scan progress and stats from analyze()
- Merge pull request #21 from MOLAorg/fix/imu-frames-deprecation-warning
- style: apply clang-format after IMU-frames ifdef edit
- fix: silence mola_georeferencing IMU extraction deprecation warning
- Merge pull request #20 from MOLAorg/feat/lc-parallel-icp
- feat: parallel per-candidate ICP in the F2F loop-closure detector
- Merge pull request #19 from MOLAorg/feat/lc-detection-robustness
- fix: gate KISS-Matcher guesses on the final inlier count
- feat: let analyze() callers exclude already-closed pairs from candidates
- fix: skip a failing loop-closure candidate instead of aborting the scan
- dont throw on empty scan frames
- expose MOLA_DESKEW_IGNORE_NO_TIMESTAMPS
- cmake: silent 3rdparty header warnings
- remove leftover mrpt::gui dependency
- Merge pull request #18 from MOLAorg/feat/f2f-use-imu-align
- feat: f2f algo uses imu acc for alignment
- Merge branch 'feat/lc-detector-analyze-api' into develop
- fix: skip observation unload during read-only analyze()
- Merge pull request #17 from MOLAorg/feat/lc-detector-analyze-api
- fix: keep analyze() read-only and leak-free
- fix: guard build_initial_graph against stale graph state
- feat: streaming, incremental and abortable analyze()
- feat: detector-only analyze() API for loop closure
- Contributors: Jose Luis Blanco Claraco, Jose Luis Blanco-Claraco
1.2.2 (2026-06-17)
- update robin and kiss-matcher submodules
- Contributors: Jose Luis Blanco-Claraco
1.2.1 (2026-06-16)
- fix: pmc FTBFS on Debian builds
- docs: add ROS 2 Lyrical badge row, update Rolling to Ubuntu 26.04 (resolute)
- Merge pull request #16 from MOLAorg/feat/assert-degenerated-gps feat: assert on degenerated GNSS data
- docs: update mrpt docs URI
- Contributors: Jose Luis Blanco-Claraco
1.2.0 (2026-05-11)
-
f2f pipeline: switch to multi-objective as default strategy
-
Merge pull request #15 from MOLAorg/simplify-ci CI: simplify clang-format helpers and use ros: docker images for stable builds
-
fix: wrap find -iname predicates in parentheses to scope them to listed dirs Without grouping, the -o operators apply at top level and -print0 only attaches to the last alternative, so files outside the intended directories can be matched.
-
CI: simplify clang-format helpers and use ros: docker images for
File truncated at 100 lines see the full file
Package Dependencies
System Dependencies
Dependant Packages
Launch files
Messages
Services
Plugins
Recent questions tagged mola_sm_loop_closure at Robotics Stack Exchange
|
mola_sm_loop_closure package from mola_sm_loop_closure repomola_sm_loop_closure |
ROS Distro
|
Package Summary
| Version | 1.3.0 |
| License | GPLv3 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/MOLAorg/mola_sm_loop_closure.git |
| VCS Type | git |
| VCS Version | develop |
| Last Updated | 2026-10-01 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Jose-Luis Blanco-Claraco
Authors
- Jose-Luis Blanco-Claraco
mola_sm_loop_closure
Offline loop-closure engine for MOLA CSimpleMap files. Given an input
simplemap produced by any MOLA odometry front-end, the package re-optimises
all keyframe poses by detecting and closing loops, then writes the corrected
simplemap back to disk.
Two algorithms
| Algorithm | Class | Best for |
|---|---|---|
| SimplemapLoopClosure | mola::SimplemapLoopClosure |
Long maps with noticeable drift; groups keyframes into submaps and runs heavy point-cloud ICP between submap pairs |
| FrameToFrameLoopClosure | mola::FrameToFrameLoopClosure |
GNSS-augmented datasets or quick re-optimisation; runs frame-to-frame ICP with a GNC graph optimizer |
CLI usage
# SimplemapLoopClosure (default algorithm):
mola-sm-lc-cli -i in.simplemap -o out.simplemap \
-p pipelines/loop-closure-lidar3d-gicp.yaml
# FrameToFrameLoopClosure:
mola-sm-lc-cli -i in.simplemap -o out.simplemap \
-a mola::FrameToFrameLoopClosure \
-p pipelines/loop-closure-f2f-lidar3d-gicp.yaml
Available pipelines
| YAML file | Sensor type | Algorithm |
|---|---|---|
loop-closure-lidar3d-gicp.yaml |
3-D LiDAR (GICP) | SimplemapLoopClosure |
loop-closure-lidar3d-icp.yaml |
3-D LiDAR (point-to-point ICP) | SimplemapLoopClosure |
loop-closure-lidar2d.yaml |
2-D LiDAR | SimplemapLoopClosure |
loop-closure-f2f-lidar3d-gicp.yaml |
3-D LiDAR (GICP) | FrameToFrameLoopClosure |
Key YAML knobs
SimplemapLoopClosure
-
submap_max_absolute_length/submap_min_absolute_length: controls submap granularity. -
assume_planar_world: trueenables annealed soft planar constraints (z, roll, pitch).-
planar_world_initial_sigma_z,planar_world_initial_sigma_ang,planar_world_annealing_rounds: tune the annealing schedule. -
planar_world_hard_flatten: truerestores the old hard-flattening behaviour.
-
-
use_gnss: true/gnss_add_horizontality: true: GNSS-assisted global alignment.-
gnss_factor_strategy: "submap"(default, scalable) or"per_kf"(sensor-pose-aware, larger graph). -
gnss_max_uncertainty_horiz(default20.0m) : reject GPS readings whose horizontal ENU uncertainty (√(σ_E²+σ_N²)) exceeds this threshold. -
gnss_max_uncertainty_vert(default40.0m) : reject GPS readings whose vertical ENU uncertainty (σ_U) exceeds this threshold. - Stats on accepted/rejected GNSS readings are printed at the INFO log level after processing.
-
-
use_imu_gravity: true/imu_gravity_sigma_deg: IMU-derived gravity-alignment factors added in stage 1.
FrameToFrameLoopClosure
-
lc_candidate_strategy:DISTANCE_STRATIFIED(default),PROXIMITY_ONLY, orMULTI_OBJECTIVE. -
assume_planar_world: true: planar-world annealing (subset of SM options; IMU-gravity options are not exposed byFrameToFrameLoopClosure::Parameters). -
use_gnss: true: per-keyframe GNSS factors (FactorGnssEnu).-
gnss_max_uncertainty_horiz(default20.0m) : reject GPS readings whose horizontal ENU uncertainty exceeds this threshold. -
gnss_max_uncertainty_vert(default40.0m) : reject GPS readings whose vertical ENU uncertainty exceeds this threshold.
-
-
manual_loop_constraints: list of hand-specified loop closure edges (by UNIX timestamp pair). Each entry supports:-
timestamp_i,timestamp_j: UNIX timestamps identifying the two keyframes. -
sigma_xyz: positional uncertainty [m]. -
trust_as_inlier(defaultfalse): iftrue, the constraint is added to the GNC set of known inliers and will not be downweighted by the robust optimizer.
-
-
use_kiss_matcher: true: use KISS-Matcher global registration to seed the ICP initial guess for each loop-closure candidate (default:false; requires thethird_party/kiss-matchersubmodule to be populated).-
kiss_matcher_resolution(default1.0m) : voxel size for KISS-Matcher feature extraction; controlsnormal_radius ≈ 3×andfpfh_radius ≈ 5×. -
kiss_matcher_layer(default"points_to_register_points") : name of themp2p_icp::metric_map_tlayer whose points are fed into KISS-Matcher.
-
See the online tutorial for a step-by-step example.
License
Copyright (C) 2018-2026 Jose Luis Blanco jlblanco@ual.es, University of Almeria
This package is released under the GNU GPL v3 license as open source, with the main intention of being useful for research and evaluation purposes. Commercial licenses available upon request.
Contributions require acceptance of the Contributor License Agreement (CLA).
Changelog for package mola_sm_loop_closure
1.3.0 (2026-10-01)
- ci: make scripts/release.py identical across repos by auto-discovering packages
- ci: add GitHub release workflow on version tags
- Merge pull request #25 from MOLAorg/feat/mrpt3
- Declare mrpt_viz as a direct dependency; clang-format test file
- Merge remote-tracking branch 'origin/develop' into feat/mrpt3
- fix: the loop-closure candidate floor rejects real revisits (#24)
- Port to MRPT 3.x: opengl->viz, TCLAP->CLI11, yaml associativity
- Merge pull request #23 from MOLAorg/feat/deterministic-scan
- CI: fail-fast: false, so one broken distro stops masking the others
- docs: the reproducibility guarantee is conditional on the build, say so
- perf: keep candidate parallelism in deterministic scans (92.7 s -> 40 s)
- feat: a [deterministic]{.title-ref} mode that makes a scan reproducible
- fix: listed mrpt::gui as dependency but could be removed
- chore: silent 3rdparty code warnings
- Merge pull request #22 from MOLAorg/feat/lc-analyze-progress-stats
- perf: keep rejected candidates lock-free in parallel analyze()
- feat: report per-scan progress and stats from analyze()
- Merge pull request #21 from MOLAorg/fix/imu-frames-deprecation-warning
- style: apply clang-format after IMU-frames ifdef edit
- fix: silence mola_georeferencing IMU extraction deprecation warning
- Merge pull request #20 from MOLAorg/feat/lc-parallel-icp
- feat: parallel per-candidate ICP in the F2F loop-closure detector
- Merge pull request #19 from MOLAorg/feat/lc-detection-robustness
- fix: gate KISS-Matcher guesses on the final inlier count
- feat: let analyze() callers exclude already-closed pairs from candidates
- fix: skip a failing loop-closure candidate instead of aborting the scan
- dont throw on empty scan frames
- expose MOLA_DESKEW_IGNORE_NO_TIMESTAMPS
- cmake: silent 3rdparty header warnings
- remove leftover mrpt::gui dependency
- Merge pull request #18 from MOLAorg/feat/f2f-use-imu-align
- feat: f2f algo uses imu acc for alignment
- Merge branch 'feat/lc-detector-analyze-api' into develop
- fix: skip observation unload during read-only analyze()
- Merge pull request #17 from MOLAorg/feat/lc-detector-analyze-api
- fix: keep analyze() read-only and leak-free
- fix: guard build_initial_graph against stale graph state
- feat: streaming, incremental and abortable analyze()
- feat: detector-only analyze() API for loop closure
- Contributors: Jose Luis Blanco Claraco, Jose Luis Blanco-Claraco
1.2.2 (2026-06-17)
- update robin and kiss-matcher submodules
- Contributors: Jose Luis Blanco-Claraco
1.2.1 (2026-06-16)
- fix: pmc FTBFS on Debian builds
- docs: add ROS 2 Lyrical badge row, update Rolling to Ubuntu 26.04 (resolute)
- Merge pull request #16 from MOLAorg/feat/assert-degenerated-gps feat: assert on degenerated GNSS data
- docs: update mrpt docs URI
- Contributors: Jose Luis Blanco-Claraco
1.2.0 (2026-05-11)
-
f2f pipeline: switch to multi-objective as default strategy
-
Merge pull request #15 from MOLAorg/simplify-ci CI: simplify clang-format helpers and use ros: docker images for stable builds
-
fix: wrap find -iname predicates in parentheses to scope them to listed dirs Without grouping, the -o operators apply at top level and -print0 only attaches to the last alternative, so files outside the intended directories can be matched.
-
CI: simplify clang-format helpers and use ros: docker images for
File truncated at 100 lines see the full file
Package Dependencies
System Dependencies
Dependant Packages
Launch files
Messages
Services
Plugins
Recent questions tagged mola_sm_loop_closure at Robotics Stack Exchange
|
mola_sm_loop_closure package from mola_sm_loop_closure repomola_sm_loop_closure |
ROS Distro
|
Package Summary
| Version | 1.3.0 |
| License | GPLv3 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/MOLAorg/mola_sm_loop_closure.git |
| VCS Type | git |
| VCS Version | develop |
| Last Updated | 2026-10-01 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Jose-Luis Blanco-Claraco
Authors
- Jose-Luis Blanco-Claraco
mola_sm_loop_closure
Offline loop-closure engine for MOLA CSimpleMap files. Given an input
simplemap produced by any MOLA odometry front-end, the package re-optimises
all keyframe poses by detecting and closing loops, then writes the corrected
simplemap back to disk.
Two algorithms
| Algorithm | Class | Best for |
|---|---|---|
| SimplemapLoopClosure | mola::SimplemapLoopClosure |
Long maps with noticeable drift; groups keyframes into submaps and runs heavy point-cloud ICP between submap pairs |
| FrameToFrameLoopClosure | mola::FrameToFrameLoopClosure |
GNSS-augmented datasets or quick re-optimisation; runs frame-to-frame ICP with a GNC graph optimizer |
CLI usage
# SimplemapLoopClosure (default algorithm):
mola-sm-lc-cli -i in.simplemap -o out.simplemap \
-p pipelines/loop-closure-lidar3d-gicp.yaml
# FrameToFrameLoopClosure:
mola-sm-lc-cli -i in.simplemap -o out.simplemap \
-a mola::FrameToFrameLoopClosure \
-p pipelines/loop-closure-f2f-lidar3d-gicp.yaml
Available pipelines
| YAML file | Sensor type | Algorithm |
|---|---|---|
loop-closure-lidar3d-gicp.yaml |
3-D LiDAR (GICP) | SimplemapLoopClosure |
loop-closure-lidar3d-icp.yaml |
3-D LiDAR (point-to-point ICP) | SimplemapLoopClosure |
loop-closure-lidar2d.yaml |
2-D LiDAR | SimplemapLoopClosure |
loop-closure-f2f-lidar3d-gicp.yaml |
3-D LiDAR (GICP) | FrameToFrameLoopClosure |
Key YAML knobs
SimplemapLoopClosure
-
submap_max_absolute_length/submap_min_absolute_length: controls submap granularity. -
assume_planar_world: trueenables annealed soft planar constraints (z, roll, pitch).-
planar_world_initial_sigma_z,planar_world_initial_sigma_ang,planar_world_annealing_rounds: tune the annealing schedule. -
planar_world_hard_flatten: truerestores the old hard-flattening behaviour.
-
-
use_gnss: true/gnss_add_horizontality: true: GNSS-assisted global alignment.-
gnss_factor_strategy: "submap"(default, scalable) or"per_kf"(sensor-pose-aware, larger graph). -
gnss_max_uncertainty_horiz(default20.0m) : reject GPS readings whose horizontal ENU uncertainty (√(σ_E²+σ_N²)) exceeds this threshold. -
gnss_max_uncertainty_vert(default40.0m) : reject GPS readings whose vertical ENU uncertainty (σ_U) exceeds this threshold. - Stats on accepted/rejected GNSS readings are printed at the INFO log level after processing.
-
-
use_imu_gravity: true/imu_gravity_sigma_deg: IMU-derived gravity-alignment factors added in stage 1.
FrameToFrameLoopClosure
-
lc_candidate_strategy:DISTANCE_STRATIFIED(default),PROXIMITY_ONLY, orMULTI_OBJECTIVE. -
assume_planar_world: true: planar-world annealing (subset of SM options; IMU-gravity options are not exposed byFrameToFrameLoopClosure::Parameters). -
use_gnss: true: per-keyframe GNSS factors (FactorGnssEnu).-
gnss_max_uncertainty_horiz(default20.0m) : reject GPS readings whose horizontal ENU uncertainty exceeds this threshold. -
gnss_max_uncertainty_vert(default40.0m) : reject GPS readings whose vertical ENU uncertainty exceeds this threshold.
-
-
manual_loop_constraints: list of hand-specified loop closure edges (by UNIX timestamp pair). Each entry supports:-
timestamp_i,timestamp_j: UNIX timestamps identifying the two keyframes. -
sigma_xyz: positional uncertainty [m]. -
trust_as_inlier(defaultfalse): iftrue, the constraint is added to the GNC set of known inliers and will not be downweighted by the robust optimizer.
-
-
use_kiss_matcher: true: use KISS-Matcher global registration to seed the ICP initial guess for each loop-closure candidate (default:false; requires thethird_party/kiss-matchersubmodule to be populated).-
kiss_matcher_resolution(default1.0m) : voxel size for KISS-Matcher feature extraction; controlsnormal_radius ≈ 3×andfpfh_radius ≈ 5×. -
kiss_matcher_layer(default"points_to_register_points") : name of themp2p_icp::metric_map_tlayer whose points are fed into KISS-Matcher.
-
See the online tutorial for a step-by-step example.
License
Copyright (C) 2018-2026 Jose Luis Blanco jlblanco@ual.es, University of Almeria
This package is released under the GNU GPL v3 license as open source, with the main intention of being useful for research and evaluation purposes. Commercial licenses available upon request.
Contributions require acceptance of the Contributor License Agreement (CLA).
Changelog for package mola_sm_loop_closure
1.3.0 (2026-10-01)
- ci: make scripts/release.py identical across repos by auto-discovering packages
- ci: add GitHub release workflow on version tags
- Merge pull request #25 from MOLAorg/feat/mrpt3
- Declare mrpt_viz as a direct dependency; clang-format test file
- Merge remote-tracking branch 'origin/develop' into feat/mrpt3
- fix: the loop-closure candidate floor rejects real revisits (#24)
- Port to MRPT 3.x: opengl->viz, TCLAP->CLI11, yaml associativity
- Merge pull request #23 from MOLAorg/feat/deterministic-scan
- CI: fail-fast: false, so one broken distro stops masking the others
- docs: the reproducibility guarantee is conditional on the build, say so
- perf: keep candidate parallelism in deterministic scans (92.7 s -> 40 s)
- feat: a [deterministic]{.title-ref} mode that makes a scan reproducible
- fix: listed mrpt::gui as dependency but could be removed
- chore: silent 3rdparty code warnings
- Merge pull request #22 from MOLAorg/feat/lc-analyze-progress-stats
- perf: keep rejected candidates lock-free in parallel analyze()
- feat: report per-scan progress and stats from analyze()
- Merge pull request #21 from MOLAorg/fix/imu-frames-deprecation-warning
- style: apply clang-format after IMU-frames ifdef edit
- fix: silence mola_georeferencing IMU extraction deprecation warning
- Merge pull request #20 from MOLAorg/feat/lc-parallel-icp
- feat: parallel per-candidate ICP in the F2F loop-closure detector
- Merge pull request #19 from MOLAorg/feat/lc-detection-robustness
- fix: gate KISS-Matcher guesses on the final inlier count
- feat: let analyze() callers exclude already-closed pairs from candidates
- fix: skip a failing loop-closure candidate instead of aborting the scan
- dont throw on empty scan frames
- expose MOLA_DESKEW_IGNORE_NO_TIMESTAMPS
- cmake: silent 3rdparty header warnings
- remove leftover mrpt::gui dependency
- Merge pull request #18 from MOLAorg/feat/f2f-use-imu-align
- feat: f2f algo uses imu acc for alignment
- Merge branch 'feat/lc-detector-analyze-api' into develop
- fix: skip observation unload during read-only analyze()
- Merge pull request #17 from MOLAorg/feat/lc-detector-analyze-api
- fix: keep analyze() read-only and leak-free
- fix: guard build_initial_graph against stale graph state
- feat: streaming, incremental and abortable analyze()
- feat: detector-only analyze() API for loop closure
- Contributors: Jose Luis Blanco Claraco, Jose Luis Blanco-Claraco
1.2.2 (2026-06-17)
- update robin and kiss-matcher submodules
- Contributors: Jose Luis Blanco-Claraco
1.2.1 (2026-06-16)
- fix: pmc FTBFS on Debian builds
- docs: add ROS 2 Lyrical badge row, update Rolling to Ubuntu 26.04 (resolute)
- Merge pull request #16 from MOLAorg/feat/assert-degenerated-gps feat: assert on degenerated GNSS data
- docs: update mrpt docs URI
- Contributors: Jose Luis Blanco-Claraco
1.2.0 (2026-05-11)
-
f2f pipeline: switch to multi-objective as default strategy
-
Merge pull request #15 from MOLAorg/simplify-ci CI: simplify clang-format helpers and use ros: docker images for stable builds
-
fix: wrap find -iname predicates in parentheses to scope them to listed dirs Without grouping, the -o operators apply at top level and -print0 only attaches to the last alternative, so files outside the intended directories can be matched.
-
CI: simplify clang-format helpers and use ros: docker images for
File truncated at 100 lines see the full file
Package Dependencies
System Dependencies
Dependant Packages
Launch files
Messages
Services
Plugins
Recent questions tagged mola_sm_loop_closure at Robotics Stack Exchange
|
mola_sm_loop_closure package from mola_sm_loop_closure repomola_sm_loop_closure |
ROS Distro
|
Package Summary
| Version | 1.3.0 |
| License | GPLv3 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/MOLAorg/mola_sm_loop_closure.git |
| VCS Type | git |
| VCS Version | develop |
| Last Updated | 2026-10-01 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Jose-Luis Blanco-Claraco
Authors
- Jose-Luis Blanco-Claraco
mola_sm_loop_closure
Offline loop-closure engine for MOLA CSimpleMap files. Given an input
simplemap produced by any MOLA odometry front-end, the package re-optimises
all keyframe poses by detecting and closing loops, then writes the corrected
simplemap back to disk.
Two algorithms
| Algorithm | Class | Best for |
|---|---|---|
| SimplemapLoopClosure | mola::SimplemapLoopClosure |
Long maps with noticeable drift; groups keyframes into submaps and runs heavy point-cloud ICP between submap pairs |
| FrameToFrameLoopClosure | mola::FrameToFrameLoopClosure |
GNSS-augmented datasets or quick re-optimisation; runs frame-to-frame ICP with a GNC graph optimizer |
CLI usage
# SimplemapLoopClosure (default algorithm):
mola-sm-lc-cli -i in.simplemap -o out.simplemap \
-p pipelines/loop-closure-lidar3d-gicp.yaml
# FrameToFrameLoopClosure:
mola-sm-lc-cli -i in.simplemap -o out.simplemap \
-a mola::FrameToFrameLoopClosure \
-p pipelines/loop-closure-f2f-lidar3d-gicp.yaml
Available pipelines
| YAML file | Sensor type | Algorithm |
|---|---|---|
loop-closure-lidar3d-gicp.yaml |
3-D LiDAR (GICP) | SimplemapLoopClosure |
loop-closure-lidar3d-icp.yaml |
3-D LiDAR (point-to-point ICP) | SimplemapLoopClosure |
loop-closure-lidar2d.yaml |
2-D LiDAR | SimplemapLoopClosure |
loop-closure-f2f-lidar3d-gicp.yaml |
3-D LiDAR (GICP) | FrameToFrameLoopClosure |
Key YAML knobs
SimplemapLoopClosure
-
submap_max_absolute_length/submap_min_absolute_length: controls submap granularity. -
assume_planar_world: trueenables annealed soft planar constraints (z, roll, pitch).-
planar_world_initial_sigma_z,planar_world_initial_sigma_ang,planar_world_annealing_rounds: tune the annealing schedule. -
planar_world_hard_flatten: truerestores the old hard-flattening behaviour.
-
-
use_gnss: true/gnss_add_horizontality: true: GNSS-assisted global alignment.-
gnss_factor_strategy: "submap"(default, scalable) or"per_kf"(sensor-pose-aware, larger graph). -
gnss_max_uncertainty_horiz(default20.0m) : reject GPS readings whose horizontal ENU uncertainty (√(σ_E²+σ_N²)) exceeds this threshold. -
gnss_max_uncertainty_vert(default40.0m) : reject GPS readings whose vertical ENU uncertainty (σ_U) exceeds this threshold. - Stats on accepted/rejected GNSS readings are printed at the INFO log level after processing.
-
-
use_imu_gravity: true/imu_gravity_sigma_deg: IMU-derived gravity-alignment factors added in stage 1.
FrameToFrameLoopClosure
-
lc_candidate_strategy:DISTANCE_STRATIFIED(default),PROXIMITY_ONLY, orMULTI_OBJECTIVE. -
assume_planar_world: true: planar-world annealing (subset of SM options; IMU-gravity options are not exposed byFrameToFrameLoopClosure::Parameters). -
use_gnss: true: per-keyframe GNSS factors (FactorGnssEnu).-
gnss_max_uncertainty_horiz(default20.0m) : reject GPS readings whose horizontal ENU uncertainty exceeds this threshold. -
gnss_max_uncertainty_vert(default40.0m) : reject GPS readings whose vertical ENU uncertainty exceeds this threshold.
-
-
manual_loop_constraints: list of hand-specified loop closure edges (by UNIX timestamp pair). Each entry supports:-
timestamp_i,timestamp_j: UNIX timestamps identifying the two keyframes. -
sigma_xyz: positional uncertainty [m]. -
trust_as_inlier(defaultfalse): iftrue, the constraint is added to the GNC set of known inliers and will not be downweighted by the robust optimizer.
-
-
use_kiss_matcher: true: use KISS-Matcher global registration to seed the ICP initial guess for each loop-closure candidate (default:false; requires thethird_party/kiss-matchersubmodule to be populated).-
kiss_matcher_resolution(default1.0m) : voxel size for KISS-Matcher feature extraction; controlsnormal_radius ≈ 3×andfpfh_radius ≈ 5×. -
kiss_matcher_layer(default"points_to_register_points") : name of themp2p_icp::metric_map_tlayer whose points are fed into KISS-Matcher.
-
See the online tutorial for a step-by-step example.
License
Copyright (C) 2018-2026 Jose Luis Blanco jlblanco@ual.es, University of Almeria
This package is released under the GNU GPL v3 license as open source, with the main intention of being useful for research and evaluation purposes. Commercial licenses available upon request.
Contributions require acceptance of the Contributor License Agreement (CLA).
Changelog for package mola_sm_loop_closure
1.3.0 (2026-10-01)
- ci: make scripts/release.py identical across repos by auto-discovering packages
- ci: add GitHub release workflow on version tags
- Merge pull request #25 from MOLAorg/feat/mrpt3
- Declare mrpt_viz as a direct dependency; clang-format test file
- Merge remote-tracking branch 'origin/develop' into feat/mrpt3
- fix: the loop-closure candidate floor rejects real revisits (#24)
- Port to MRPT 3.x: opengl->viz, TCLAP->CLI11, yaml associativity
- Merge pull request #23 from MOLAorg/feat/deterministic-scan
- CI: fail-fast: false, so one broken distro stops masking the others
- docs: the reproducibility guarantee is conditional on the build, say so
- perf: keep candidate parallelism in deterministic scans (92.7 s -> 40 s)
- feat: a [deterministic]{.title-ref} mode that makes a scan reproducible
- fix: listed mrpt::gui as dependency but could be removed
- chore: silent 3rdparty code warnings
- Merge pull request #22 from MOLAorg/feat/lc-analyze-progress-stats
- perf: keep rejected candidates lock-free in parallel analyze()
- feat: report per-scan progress and stats from analyze()
- Merge pull request #21 from MOLAorg/fix/imu-frames-deprecation-warning
- style: apply clang-format after IMU-frames ifdef edit
- fix: silence mola_georeferencing IMU extraction deprecation warning
- Merge pull request #20 from MOLAorg/feat/lc-parallel-icp
- feat: parallel per-candidate ICP in the F2F loop-closure detector
- Merge pull request #19 from MOLAorg/feat/lc-detection-robustness
- fix: gate KISS-Matcher guesses on the final inlier count
- feat: let analyze() callers exclude already-closed pairs from candidates
- fix: skip a failing loop-closure candidate instead of aborting the scan
- dont throw on empty scan frames
- expose MOLA_DESKEW_IGNORE_NO_TIMESTAMPS
- cmake: silent 3rdparty header warnings
- remove leftover mrpt::gui dependency
- Merge pull request #18 from MOLAorg/feat/f2f-use-imu-align
- feat: f2f algo uses imu acc for alignment
- Merge branch 'feat/lc-detector-analyze-api' into develop
- fix: skip observation unload during read-only analyze()
- Merge pull request #17 from MOLAorg/feat/lc-detector-analyze-api
- fix: keep analyze() read-only and leak-free
- fix: guard build_initial_graph against stale graph state
- feat: streaming, incremental and abortable analyze()
- feat: detector-only analyze() API for loop closure
- Contributors: Jose Luis Blanco Claraco, Jose Luis Blanco-Claraco
1.2.2 (2026-06-17)
- update robin and kiss-matcher submodules
- Contributors: Jose Luis Blanco-Claraco
1.2.1 (2026-06-16)
- fix: pmc FTBFS on Debian builds
- docs: add ROS 2 Lyrical badge row, update Rolling to Ubuntu 26.04 (resolute)
- Merge pull request #16 from MOLAorg/feat/assert-degenerated-gps feat: assert on degenerated GNSS data
- docs: update mrpt docs URI
- Contributors: Jose Luis Blanco-Claraco
1.2.0 (2026-05-11)
-
f2f pipeline: switch to multi-objective as default strategy
-
Merge pull request #15 from MOLAorg/simplify-ci CI: simplify clang-format helpers and use ros: docker images for stable builds
-
fix: wrap find -iname predicates in parentheses to scope them to listed dirs Without grouping, the -o operators apply at top level and -print0 only attaches to the last alternative, so files outside the intended directories can be matched.
-
CI: simplify clang-format helpers and use ros: docker images for
File truncated at 100 lines see the full file
Package Dependencies
System Dependencies
Dependant Packages
Launch files
Messages
Services
Plugins
Recent questions tagged mola_sm_loop_closure at Robotics Stack Exchange
|
mola_sm_loop_closure package from mola_sm_loop_closure repomola_sm_loop_closure |
ROS Distro
|
Package Summary
| Version | 1.3.0 |
| License | GPLv3 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/MOLAorg/mola_sm_loop_closure.git |
| VCS Type | git |
| VCS Version | develop |
| Last Updated | 2026-10-01 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Jose-Luis Blanco-Claraco
Authors
- Jose-Luis Blanco-Claraco
mola_sm_loop_closure
Offline loop-closure engine for MOLA CSimpleMap files. Given an input
simplemap produced by any MOLA odometry front-end, the package re-optimises
all keyframe poses by detecting and closing loops, then writes the corrected
simplemap back to disk.
Two algorithms
| Algorithm | Class | Best for |
|---|---|---|
| SimplemapLoopClosure | mola::SimplemapLoopClosure |
Long maps with noticeable drift; groups keyframes into submaps and runs heavy point-cloud ICP between submap pairs |
| FrameToFrameLoopClosure | mola::FrameToFrameLoopClosure |
GNSS-augmented datasets or quick re-optimisation; runs frame-to-frame ICP with a GNC graph optimizer |
CLI usage
# SimplemapLoopClosure (default algorithm):
mola-sm-lc-cli -i in.simplemap -o out.simplemap \
-p pipelines/loop-closure-lidar3d-gicp.yaml
# FrameToFrameLoopClosure:
mola-sm-lc-cli -i in.simplemap -o out.simplemap \
-a mola::FrameToFrameLoopClosure \
-p pipelines/loop-closure-f2f-lidar3d-gicp.yaml
Available pipelines
| YAML file | Sensor type | Algorithm |
|---|---|---|
loop-closure-lidar3d-gicp.yaml |
3-D LiDAR (GICP) | SimplemapLoopClosure |
loop-closure-lidar3d-icp.yaml |
3-D LiDAR (point-to-point ICP) | SimplemapLoopClosure |
loop-closure-lidar2d.yaml |
2-D LiDAR | SimplemapLoopClosure |
loop-closure-f2f-lidar3d-gicp.yaml |
3-D LiDAR (GICP) | FrameToFrameLoopClosure |
Key YAML knobs
SimplemapLoopClosure
-
submap_max_absolute_length/submap_min_absolute_length: controls submap granularity. -
assume_planar_world: trueenables annealed soft planar constraints (z, roll, pitch).-
planar_world_initial_sigma_z,planar_world_initial_sigma_ang,planar_world_annealing_rounds: tune the annealing schedule. -
planar_world_hard_flatten: truerestores the old hard-flattening behaviour.
-
-
use_gnss: true/gnss_add_horizontality: true: GNSS-assisted global alignment.-
gnss_factor_strategy: "submap"(default, scalable) or"per_kf"(sensor-pose-aware, larger graph). -
gnss_max_uncertainty_horiz(default20.0m) : reject GPS readings whose horizontal ENU uncertainty (√(σ_E²+σ_N²)) exceeds this threshold. -
gnss_max_uncertainty_vert(default40.0m) : reject GPS readings whose vertical ENU uncertainty (σ_U) exceeds this threshold. - Stats on accepted/rejected GNSS readings are printed at the INFO log level after processing.
-
-
use_imu_gravity: true/imu_gravity_sigma_deg: IMU-derived gravity-alignment factors added in stage 1.
FrameToFrameLoopClosure
-
lc_candidate_strategy:DISTANCE_STRATIFIED(default),PROXIMITY_ONLY, orMULTI_OBJECTIVE. -
assume_planar_world: true: planar-world annealing (subset of SM options; IMU-gravity options are not exposed byFrameToFrameLoopClosure::Parameters). -
use_gnss: true: per-keyframe GNSS factors (FactorGnssEnu).-
gnss_max_uncertainty_horiz(default20.0m) : reject GPS readings whose horizontal ENU uncertainty exceeds this threshold. -
gnss_max_uncertainty_vert(default40.0m) : reject GPS readings whose vertical ENU uncertainty exceeds this threshold.
-
-
manual_loop_constraints: list of hand-specified loop closure edges (by UNIX timestamp pair). Each entry supports:-
timestamp_i,timestamp_j: UNIX timestamps identifying the two keyframes. -
sigma_xyz: positional uncertainty [m]. -
trust_as_inlier(defaultfalse): iftrue, the constraint is added to the GNC set of known inliers and will not be downweighted by the robust optimizer.
-
-
use_kiss_matcher: true: use KISS-Matcher global registration to seed the ICP initial guess for each loop-closure candidate (default:false; requires thethird_party/kiss-matchersubmodule to be populated).-
kiss_matcher_resolution(default1.0m) : voxel size for KISS-Matcher feature extraction; controlsnormal_radius ≈ 3×andfpfh_radius ≈ 5×. -
kiss_matcher_layer(default"points_to_register_points") : name of themp2p_icp::metric_map_tlayer whose points are fed into KISS-Matcher.
-
See the online tutorial for a step-by-step example.
License
Copyright (C) 2018-2026 Jose Luis Blanco jlblanco@ual.es, University of Almeria
This package is released under the GNU GPL v3 license as open source, with the main intention of being useful for research and evaluation purposes. Commercial licenses available upon request.
Contributions require acceptance of the Contributor License Agreement (CLA).
Changelog for package mola_sm_loop_closure
1.3.0 (2026-10-01)
- ci: make scripts/release.py identical across repos by auto-discovering packages
- ci: add GitHub release workflow on version tags
- Merge pull request #25 from MOLAorg/feat/mrpt3
- Declare mrpt_viz as a direct dependency; clang-format test file
- Merge remote-tracking branch 'origin/develop' into feat/mrpt3
- fix: the loop-closure candidate floor rejects real revisits (#24)
- Port to MRPT 3.x: opengl->viz, TCLAP->CLI11, yaml associativity
- Merge pull request #23 from MOLAorg/feat/deterministic-scan
- CI: fail-fast: false, so one broken distro stops masking the others
- docs: the reproducibility guarantee is conditional on the build, say so
- perf: keep candidate parallelism in deterministic scans (92.7 s -> 40 s)
- feat: a [deterministic]{.title-ref} mode that makes a scan reproducible
- fix: listed mrpt::gui as dependency but could be removed
- chore: silent 3rdparty code warnings
- Merge pull request #22 from MOLAorg/feat/lc-analyze-progress-stats
- perf: keep rejected candidates lock-free in parallel analyze()
- feat: report per-scan progress and stats from analyze()
- Merge pull request #21 from MOLAorg/fix/imu-frames-deprecation-warning
- style: apply clang-format after IMU-frames ifdef edit
- fix: silence mola_georeferencing IMU extraction deprecation warning
- Merge pull request #20 from MOLAorg/feat/lc-parallel-icp
- feat: parallel per-candidate ICP in the F2F loop-closure detector
- Merge pull request #19 from MOLAorg/feat/lc-detection-robustness
- fix: gate KISS-Matcher guesses on the final inlier count
- feat: let analyze() callers exclude already-closed pairs from candidates
- fix: skip a failing loop-closure candidate instead of aborting the scan
- dont throw on empty scan frames
- expose MOLA_DESKEW_IGNORE_NO_TIMESTAMPS
- cmake: silent 3rdparty header warnings
- remove leftover mrpt::gui dependency
- Merge pull request #18 from MOLAorg/feat/f2f-use-imu-align
- feat: f2f algo uses imu acc for alignment
- Merge branch 'feat/lc-detector-analyze-api' into develop
- fix: skip observation unload during read-only analyze()
- Merge pull request #17 from MOLAorg/feat/lc-detector-analyze-api
- fix: keep analyze() read-only and leak-free
- fix: guard build_initial_graph against stale graph state
- feat: streaming, incremental and abortable analyze()
- feat: detector-only analyze() API for loop closure
- Contributors: Jose Luis Blanco Claraco, Jose Luis Blanco-Claraco
1.2.2 (2026-06-17)
- update robin and kiss-matcher submodules
- Contributors: Jose Luis Blanco-Claraco
1.2.1 (2026-06-16)
- fix: pmc FTBFS on Debian builds
- docs: add ROS 2 Lyrical badge row, update Rolling to Ubuntu 26.04 (resolute)
- Merge pull request #16 from MOLAorg/feat/assert-degenerated-gps feat: assert on degenerated GNSS data
- docs: update mrpt docs URI
- Contributors: Jose Luis Blanco-Claraco
1.2.0 (2026-05-11)
-
f2f pipeline: switch to multi-objective as default strategy
-
Merge pull request #15 from MOLAorg/simplify-ci CI: simplify clang-format helpers and use ros: docker images for stable builds
-
fix: wrap find -iname predicates in parentheses to scope them to listed dirs Without grouping, the -o operators apply at top level and -print0 only attaches to the last alternative, so files outside the intended directories can be matched.
-
CI: simplify clang-format helpers and use ros: docker images for
File truncated at 100 lines see the full file
Package Dependencies
System Dependencies
Dependant Packages
Launch files
Messages
Services
Plugins
Recent questions tagged mola_sm_loop_closure at Robotics Stack Exchange
|
mola_sm_loop_closure package from mola_sm_loop_closure repomola_sm_loop_closure |
ROS Distro
|
Package Summary
| Version | 1.3.0 |
| License | GPLv3 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/MOLAorg/mola_sm_loop_closure.git |
| VCS Type | git |
| VCS Version | develop |
| Last Updated | 2026-10-01 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Jose-Luis Blanco-Claraco
Authors
- Jose-Luis Blanco-Claraco
mola_sm_loop_closure
Offline loop-closure engine for MOLA CSimpleMap files. Given an input
simplemap produced by any MOLA odometry front-end, the package re-optimises
all keyframe poses by detecting and closing loops, then writes the corrected
simplemap back to disk.
Two algorithms
| Algorithm | Class | Best for |
|---|---|---|
| SimplemapLoopClosure | mola::SimplemapLoopClosure |
Long maps with noticeable drift; groups keyframes into submaps and runs heavy point-cloud ICP between submap pairs |
| FrameToFrameLoopClosure | mola::FrameToFrameLoopClosure |
GNSS-augmented datasets or quick re-optimisation; runs frame-to-frame ICP with a GNC graph optimizer |
CLI usage
# SimplemapLoopClosure (default algorithm):
mola-sm-lc-cli -i in.simplemap -o out.simplemap \
-p pipelines/loop-closure-lidar3d-gicp.yaml
# FrameToFrameLoopClosure:
mola-sm-lc-cli -i in.simplemap -o out.simplemap \
-a mola::FrameToFrameLoopClosure \
-p pipelines/loop-closure-f2f-lidar3d-gicp.yaml
Available pipelines
| YAML file | Sensor type | Algorithm |
|---|---|---|
loop-closure-lidar3d-gicp.yaml |
3-D LiDAR (GICP) | SimplemapLoopClosure |
loop-closure-lidar3d-icp.yaml |
3-D LiDAR (point-to-point ICP) | SimplemapLoopClosure |
loop-closure-lidar2d.yaml |
2-D LiDAR | SimplemapLoopClosure |
loop-closure-f2f-lidar3d-gicp.yaml |
3-D LiDAR (GICP) | FrameToFrameLoopClosure |
Key YAML knobs
SimplemapLoopClosure
-
submap_max_absolute_length/submap_min_absolute_length: controls submap granularity. -
assume_planar_world: trueenables annealed soft planar constraints (z, roll, pitch).-
planar_world_initial_sigma_z,planar_world_initial_sigma_ang,planar_world_annealing_rounds: tune the annealing schedule. -
planar_world_hard_flatten: truerestores the old hard-flattening behaviour.
-
-
use_gnss: true/gnss_add_horizontality: true: GNSS-assisted global alignment.-
gnss_factor_strategy: "submap"(default, scalable) or"per_kf"(sensor-pose-aware, larger graph). -
gnss_max_uncertainty_horiz(default20.0m) : reject GPS readings whose horizontal ENU uncertainty (√(σ_E²+σ_N²)) exceeds this threshold. -
gnss_max_uncertainty_vert(default40.0m) : reject GPS readings whose vertical ENU uncertainty (σ_U) exceeds this threshold. - Stats on accepted/rejected GNSS readings are printed at the INFO log level after processing.
-
-
use_imu_gravity: true/imu_gravity_sigma_deg: IMU-derived gravity-alignment factors added in stage 1.
FrameToFrameLoopClosure
-
lc_candidate_strategy:DISTANCE_STRATIFIED(default),PROXIMITY_ONLY, orMULTI_OBJECTIVE. -
assume_planar_world: true: planar-world annealing (subset of SM options; IMU-gravity options are not exposed byFrameToFrameLoopClosure::Parameters). -
use_gnss: true: per-keyframe GNSS factors (FactorGnssEnu).-
gnss_max_uncertainty_horiz(default20.0m) : reject GPS readings whose horizontal ENU uncertainty exceeds this threshold. -
gnss_max_uncertainty_vert(default40.0m) : reject GPS readings whose vertical ENU uncertainty exceeds this threshold.
-
-
manual_loop_constraints: list of hand-specified loop closure edges (by UNIX timestamp pair). Each entry supports:-
timestamp_i,timestamp_j: UNIX timestamps identifying the two keyframes. -
sigma_xyz: positional uncertainty [m]. -
trust_as_inlier(defaultfalse): iftrue, the constraint is added to the GNC set of known inliers and will not be downweighted by the robust optimizer.
-
-
use_kiss_matcher: true: use KISS-Matcher global registration to seed the ICP initial guess for each loop-closure candidate (default:false; requires thethird_party/kiss-matchersubmodule to be populated).-
kiss_matcher_resolution(default1.0m) : voxel size for KISS-Matcher feature extraction; controlsnormal_radius ≈ 3×andfpfh_radius ≈ 5×. -
kiss_matcher_layer(default"points_to_register_points") : name of themp2p_icp::metric_map_tlayer whose points are fed into KISS-Matcher.
-
See the online tutorial for a step-by-step example.
License
Copyright (C) 2018-2026 Jose Luis Blanco jlblanco@ual.es, University of Almeria
This package is released under the GNU GPL v3 license as open source, with the main intention of being useful for research and evaluation purposes. Commercial licenses available upon request.
Contributions require acceptance of the Contributor License Agreement (CLA).
Changelog for package mola_sm_loop_closure
1.3.0 (2026-10-01)
- ci: make scripts/release.py identical across repos by auto-discovering packages
- ci: add GitHub release workflow on version tags
- Merge pull request #25 from MOLAorg/feat/mrpt3
- Declare mrpt_viz as a direct dependency; clang-format test file
- Merge remote-tracking branch 'origin/develop' into feat/mrpt3
- fix: the loop-closure candidate floor rejects real revisits (#24)
- Port to MRPT 3.x: opengl->viz, TCLAP->CLI11, yaml associativity
- Merge pull request #23 from MOLAorg/feat/deterministic-scan
- CI: fail-fast: false, so one broken distro stops masking the others
- docs: the reproducibility guarantee is conditional on the build, say so
- perf: keep candidate parallelism in deterministic scans (92.7 s -> 40 s)
- feat: a [deterministic]{.title-ref} mode that makes a scan reproducible
- fix: listed mrpt::gui as dependency but could be removed
- chore: silent 3rdparty code warnings
- Merge pull request #22 from MOLAorg/feat/lc-analyze-progress-stats
- perf: keep rejected candidates lock-free in parallel analyze()
- feat: report per-scan progress and stats from analyze()
- Merge pull request #21 from MOLAorg/fix/imu-frames-deprecation-warning
- style: apply clang-format after IMU-frames ifdef edit
- fix: silence mola_georeferencing IMU extraction deprecation warning
- Merge pull request #20 from MOLAorg/feat/lc-parallel-icp
- feat: parallel per-candidate ICP in the F2F loop-closure detector
- Merge pull request #19 from MOLAorg/feat/lc-detection-robustness
- fix: gate KISS-Matcher guesses on the final inlier count
- feat: let analyze() callers exclude already-closed pairs from candidates
- fix: skip a failing loop-closure candidate instead of aborting the scan
- dont throw on empty scan frames
- expose MOLA_DESKEW_IGNORE_NO_TIMESTAMPS
- cmake: silent 3rdparty header warnings
- remove leftover mrpt::gui dependency
- Merge pull request #18 from MOLAorg/feat/f2f-use-imu-align
- feat: f2f algo uses imu acc for alignment
- Merge branch 'feat/lc-detector-analyze-api' into develop
- fix: skip observation unload during read-only analyze()
- Merge pull request #17 from MOLAorg/feat/lc-detector-analyze-api
- fix: keep analyze() read-only and leak-free
- fix: guard build_initial_graph against stale graph state
- feat: streaming, incremental and abortable analyze()
- feat: detector-only analyze() API for loop closure
- Contributors: Jose Luis Blanco Claraco, Jose Luis Blanco-Claraco
1.2.2 (2026-06-17)
- update robin and kiss-matcher submodules
- Contributors: Jose Luis Blanco-Claraco
1.2.1 (2026-06-16)
- fix: pmc FTBFS on Debian builds
- docs: add ROS 2 Lyrical badge row, update Rolling to Ubuntu 26.04 (resolute)
- Merge pull request #16 from MOLAorg/feat/assert-degenerated-gps feat: assert on degenerated GNSS data
- docs: update mrpt docs URI
- Contributors: Jose Luis Blanco-Claraco
1.2.0 (2026-05-11)
-
f2f pipeline: switch to multi-objective as default strategy
-
Merge pull request #15 from MOLAorg/simplify-ci CI: simplify clang-format helpers and use ros: docker images for stable builds
-
fix: wrap find -iname predicates in parentheses to scope them to listed dirs Without grouping, the -o operators apply at top level and -print0 only attaches to the last alternative, so files outside the intended directories can be matched.
-
CI: simplify clang-format helpers and use ros: docker images for
File truncated at 100 lines see the full file
Package Dependencies
System Dependencies
Dependant Packages
Launch files
Messages
Services
Plugins
Recent questions tagged mola_sm_loop_closure at Robotics Stack Exchange
|
mola_sm_loop_closure package from mola_sm_loop_closure repomola_sm_loop_closure |
ROS Distro
|
Package Summary
| Version | 1.3.0 |
| License | GPLv3 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/MOLAorg/mola_sm_loop_closure.git |
| VCS Type | git |
| VCS Version | develop |
| Last Updated | 2026-10-01 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Jose-Luis Blanco-Claraco
Authors
- Jose-Luis Blanco-Claraco
mola_sm_loop_closure
Offline loop-closure engine for MOLA CSimpleMap files. Given an input
simplemap produced by any MOLA odometry front-end, the package re-optimises
all keyframe poses by detecting and closing loops, then writes the corrected
simplemap back to disk.
Two algorithms
| Algorithm | Class | Best for |
|---|---|---|
| SimplemapLoopClosure | mola::SimplemapLoopClosure |
Long maps with noticeable drift; groups keyframes into submaps and runs heavy point-cloud ICP between submap pairs |
| FrameToFrameLoopClosure | mola::FrameToFrameLoopClosure |
GNSS-augmented datasets or quick re-optimisation; runs frame-to-frame ICP with a GNC graph optimizer |
CLI usage
# SimplemapLoopClosure (default algorithm):
mola-sm-lc-cli -i in.simplemap -o out.simplemap \
-p pipelines/loop-closure-lidar3d-gicp.yaml
# FrameToFrameLoopClosure:
mola-sm-lc-cli -i in.simplemap -o out.simplemap \
-a mola::FrameToFrameLoopClosure \
-p pipelines/loop-closure-f2f-lidar3d-gicp.yaml
Available pipelines
| YAML file | Sensor type | Algorithm |
|---|---|---|
loop-closure-lidar3d-gicp.yaml |
3-D LiDAR (GICP) | SimplemapLoopClosure |
loop-closure-lidar3d-icp.yaml |
3-D LiDAR (point-to-point ICP) | SimplemapLoopClosure |
loop-closure-lidar2d.yaml |
2-D LiDAR | SimplemapLoopClosure |
loop-closure-f2f-lidar3d-gicp.yaml |
3-D LiDAR (GICP) | FrameToFrameLoopClosure |
Key YAML knobs
SimplemapLoopClosure
-
submap_max_absolute_length/submap_min_absolute_length: controls submap granularity. -
assume_planar_world: trueenables annealed soft planar constraints (z, roll, pitch).-
planar_world_initial_sigma_z,planar_world_initial_sigma_ang,planar_world_annealing_rounds: tune the annealing schedule. -
planar_world_hard_flatten: truerestores the old hard-flattening behaviour.
-
-
use_gnss: true/gnss_add_horizontality: true: GNSS-assisted global alignment.-
gnss_factor_strategy: "submap"(default, scalable) or"per_kf"(sensor-pose-aware, larger graph). -
gnss_max_uncertainty_horiz(default20.0m) : reject GPS readings whose horizontal ENU uncertainty (√(σ_E²+σ_N²)) exceeds this threshold. -
gnss_max_uncertainty_vert(default40.0m) : reject GPS readings whose vertical ENU uncertainty (σ_U) exceeds this threshold. - Stats on accepted/rejected GNSS readings are printed at the INFO log level after processing.
-
-
use_imu_gravity: true/imu_gravity_sigma_deg: IMU-derived gravity-alignment factors added in stage 1.
FrameToFrameLoopClosure
-
lc_candidate_strategy:DISTANCE_STRATIFIED(default),PROXIMITY_ONLY, orMULTI_OBJECTIVE. -
assume_planar_world: true: planar-world annealing (subset of SM options; IMU-gravity options are not exposed byFrameToFrameLoopClosure::Parameters). -
use_gnss: true: per-keyframe GNSS factors (FactorGnssEnu).-
gnss_max_uncertainty_horiz(default20.0m) : reject GPS readings whose horizontal ENU uncertainty exceeds this threshold. -
gnss_max_uncertainty_vert(default40.0m) : reject GPS readings whose vertical ENU uncertainty exceeds this threshold.
-
-
manual_loop_constraints: list of hand-specified loop closure edges (by UNIX timestamp pair). Each entry supports:-
timestamp_i,timestamp_j: UNIX timestamps identifying the two keyframes. -
sigma_xyz: positional uncertainty [m]. -
trust_as_inlier(defaultfalse): iftrue, the constraint is added to the GNC set of known inliers and will not be downweighted by the robust optimizer.
-
-
use_kiss_matcher: true: use KISS-Matcher global registration to seed the ICP initial guess for each loop-closure candidate (default:false; requires thethird_party/kiss-matchersubmodule to be populated).-
kiss_matcher_resolution(default1.0m) : voxel size for KISS-Matcher feature extraction; controlsnormal_radius ≈ 3×andfpfh_radius ≈ 5×. -
kiss_matcher_layer(default"points_to_register_points") : name of themp2p_icp::metric_map_tlayer whose points are fed into KISS-Matcher.
-
See the online tutorial for a step-by-step example.
License
Copyright (C) 2018-2026 Jose Luis Blanco jlblanco@ual.es, University of Almeria
This package is released under the GNU GPL v3 license as open source, with the main intention of being useful for research and evaluation purposes. Commercial licenses available upon request.
Contributions require acceptance of the Contributor License Agreement (CLA).
Changelog for package mola_sm_loop_closure
1.3.0 (2026-10-01)
- ci: make scripts/release.py identical across repos by auto-discovering packages
- ci: add GitHub release workflow on version tags
- Merge pull request #25 from MOLAorg/feat/mrpt3
- Declare mrpt_viz as a direct dependency; clang-format test file
- Merge remote-tracking branch 'origin/develop' into feat/mrpt3
- fix: the loop-closure candidate floor rejects real revisits (#24)
- Port to MRPT 3.x: opengl->viz, TCLAP->CLI11, yaml associativity
- Merge pull request #23 from MOLAorg/feat/deterministic-scan
- CI: fail-fast: false, so one broken distro stops masking the others
- docs: the reproducibility guarantee is conditional on the build, say so
- perf: keep candidate parallelism in deterministic scans (92.7 s -> 40 s)
- feat: a [deterministic]{.title-ref} mode that makes a scan reproducible
- fix: listed mrpt::gui as dependency but could be removed
- chore: silent 3rdparty code warnings
- Merge pull request #22 from MOLAorg/feat/lc-analyze-progress-stats
- perf: keep rejected candidates lock-free in parallel analyze()
- feat: report per-scan progress and stats from analyze()
- Merge pull request #21 from MOLAorg/fix/imu-frames-deprecation-warning
- style: apply clang-format after IMU-frames ifdef edit
- fix: silence mola_georeferencing IMU extraction deprecation warning
- Merge pull request #20 from MOLAorg/feat/lc-parallel-icp
- feat: parallel per-candidate ICP in the F2F loop-closure detector
- Merge pull request #19 from MOLAorg/feat/lc-detection-robustness
- fix: gate KISS-Matcher guesses on the final inlier count
- feat: let analyze() callers exclude already-closed pairs from candidates
- fix: skip a failing loop-closure candidate instead of aborting the scan
- dont throw on empty scan frames
- expose MOLA_DESKEW_IGNORE_NO_TIMESTAMPS
- cmake: silent 3rdparty header warnings
- remove leftover mrpt::gui dependency
- Merge pull request #18 from MOLAorg/feat/f2f-use-imu-align
- feat: f2f algo uses imu acc for alignment
- Merge branch 'feat/lc-detector-analyze-api' into develop
- fix: skip observation unload during read-only analyze()
- Merge pull request #17 from MOLAorg/feat/lc-detector-analyze-api
- fix: keep analyze() read-only and leak-free
- fix: guard build_initial_graph against stale graph state
- feat: streaming, incremental and abortable analyze()
- feat: detector-only analyze() API for loop closure
- Contributors: Jose Luis Blanco Claraco, Jose Luis Blanco-Claraco
1.2.2 (2026-06-17)
- update robin and kiss-matcher submodules
- Contributors: Jose Luis Blanco-Claraco
1.2.1 (2026-06-16)
- fix: pmc FTBFS on Debian builds
- docs: add ROS 2 Lyrical badge row, update Rolling to Ubuntu 26.04 (resolute)
- Merge pull request #16 from MOLAorg/feat/assert-degenerated-gps feat: assert on degenerated GNSS data
- docs: update mrpt docs URI
- Contributors: Jose Luis Blanco-Claraco
1.2.0 (2026-05-11)
-
f2f pipeline: switch to multi-objective as default strategy
-
Merge pull request #15 from MOLAorg/simplify-ci CI: simplify clang-format helpers and use ros: docker images for stable builds
-
fix: wrap find -iname predicates in parentheses to scope them to listed dirs Without grouping, the -o operators apply at top level and -print0 only attaches to the last alternative, so files outside the intended directories can be matched.
-
CI: simplify clang-format helpers and use ros: docker images for
File truncated at 100 lines see the full file
Package Dependencies
System Dependencies
Dependant Packages
Launch files
Messages
Services
Plugins
Recent questions tagged mola_sm_loop_closure at Robotics Stack Exchange
|
mola_sm_loop_closure package from mola_sm_loop_closure repomola_sm_loop_closure |
ROS Distro
|
Package Summary
| Version | 1.3.0 |
| License | GPLv3 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/MOLAorg/mola_sm_loop_closure.git |
| VCS Type | git |
| VCS Version | develop |
| Last Updated | 2026-10-01 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Jose-Luis Blanco-Claraco
Authors
- Jose-Luis Blanco-Claraco
mola_sm_loop_closure
Offline loop-closure engine for MOLA CSimpleMap files. Given an input
simplemap produced by any MOLA odometry front-end, the package re-optimises
all keyframe poses by detecting and closing loops, then writes the corrected
simplemap back to disk.
Two algorithms
| Algorithm | Class | Best for |
|---|---|---|
| SimplemapLoopClosure | mola::SimplemapLoopClosure |
Long maps with noticeable drift; groups keyframes into submaps and runs heavy point-cloud ICP between submap pairs |
| FrameToFrameLoopClosure | mola::FrameToFrameLoopClosure |
GNSS-augmented datasets or quick re-optimisation; runs frame-to-frame ICP with a GNC graph optimizer |
CLI usage
# SimplemapLoopClosure (default algorithm):
mola-sm-lc-cli -i in.simplemap -o out.simplemap \
-p pipelines/loop-closure-lidar3d-gicp.yaml
# FrameToFrameLoopClosure:
mola-sm-lc-cli -i in.simplemap -o out.simplemap \
-a mola::FrameToFrameLoopClosure \
-p pipelines/loop-closure-f2f-lidar3d-gicp.yaml
Available pipelines
| YAML file | Sensor type | Algorithm |
|---|---|---|
loop-closure-lidar3d-gicp.yaml |
3-D LiDAR (GICP) | SimplemapLoopClosure |
loop-closure-lidar3d-icp.yaml |
3-D LiDAR (point-to-point ICP) | SimplemapLoopClosure |
loop-closure-lidar2d.yaml |
2-D LiDAR | SimplemapLoopClosure |
loop-closure-f2f-lidar3d-gicp.yaml |
3-D LiDAR (GICP) | FrameToFrameLoopClosure |
Key YAML knobs
SimplemapLoopClosure
-
submap_max_absolute_length/submap_min_absolute_length: controls submap granularity. -
assume_planar_world: trueenables annealed soft planar constraints (z, roll, pitch).-
planar_world_initial_sigma_z,planar_world_initial_sigma_ang,planar_world_annealing_rounds: tune the annealing schedule. -
planar_world_hard_flatten: truerestores the old hard-flattening behaviour.
-
-
use_gnss: true/gnss_add_horizontality: true: GNSS-assisted global alignment.-
gnss_factor_strategy: "submap"(default, scalable) or"per_kf"(sensor-pose-aware, larger graph). -
gnss_max_uncertainty_horiz(default20.0m) : reject GPS readings whose horizontal ENU uncertainty (√(σ_E²+σ_N²)) exceeds this threshold. -
gnss_max_uncertainty_vert(default40.0m) : reject GPS readings whose vertical ENU uncertainty (σ_U) exceeds this threshold. - Stats on accepted/rejected GNSS readings are printed at the INFO log level after processing.
-
-
use_imu_gravity: true/imu_gravity_sigma_deg: IMU-derived gravity-alignment factors added in stage 1.
FrameToFrameLoopClosure
-
lc_candidate_strategy:DISTANCE_STRATIFIED(default),PROXIMITY_ONLY, orMULTI_OBJECTIVE. -
assume_planar_world: true: planar-world annealing (subset of SM options; IMU-gravity options are not exposed byFrameToFrameLoopClosure::Parameters). -
use_gnss: true: per-keyframe GNSS factors (FactorGnssEnu).-
gnss_max_uncertainty_horiz(default20.0m) : reject GPS readings whose horizontal ENU uncertainty exceeds this threshold. -
gnss_max_uncertainty_vert(default40.0m) : reject GPS readings whose vertical ENU uncertainty exceeds this threshold.
-
-
manual_loop_constraints: list of hand-specified loop closure edges (by UNIX timestamp pair). Each entry supports:-
timestamp_i,timestamp_j: UNIX timestamps identifying the two keyframes. -
sigma_xyz: positional uncertainty [m]. -
trust_as_inlier(defaultfalse): iftrue, the constraint is added to the GNC set of known inliers and will not be downweighted by the robust optimizer.
-
-
use_kiss_matcher: true: use KISS-Matcher global registration to seed the ICP initial guess for each loop-closure candidate (default:false; requires thethird_party/kiss-matchersubmodule to be populated).-
kiss_matcher_resolution(default1.0m) : voxel size for KISS-Matcher feature extraction; controlsnormal_radius ≈ 3×andfpfh_radius ≈ 5×. -
kiss_matcher_layer(default"points_to_register_points") : name of themp2p_icp::metric_map_tlayer whose points are fed into KISS-Matcher.
-
See the online tutorial for a step-by-step example.
License
Copyright (C) 2018-2026 Jose Luis Blanco jlblanco@ual.es, University of Almeria
This package is released under the GNU GPL v3 license as open source, with the main intention of being useful for research and evaluation purposes. Commercial licenses available upon request.
Contributions require acceptance of the Contributor License Agreement (CLA).
Changelog for package mola_sm_loop_closure
1.3.0 (2026-10-01)
- ci: make scripts/release.py identical across repos by auto-discovering packages
- ci: add GitHub release workflow on version tags
- Merge pull request #25 from MOLAorg/feat/mrpt3
- Declare mrpt_viz as a direct dependency; clang-format test file
- Merge remote-tracking branch 'origin/develop' into feat/mrpt3
- fix: the loop-closure candidate floor rejects real revisits (#24)
- Port to MRPT 3.x: opengl->viz, TCLAP->CLI11, yaml associativity
- Merge pull request #23 from MOLAorg/feat/deterministic-scan
- CI: fail-fast: false, so one broken distro stops masking the others
- docs: the reproducibility guarantee is conditional on the build, say so
- perf: keep candidate parallelism in deterministic scans (92.7 s -> 40 s)
- feat: a [deterministic]{.title-ref} mode that makes a scan reproducible
- fix: listed mrpt::gui as dependency but could be removed
- chore: silent 3rdparty code warnings
- Merge pull request #22 from MOLAorg/feat/lc-analyze-progress-stats
- perf: keep rejected candidates lock-free in parallel analyze()
- feat: report per-scan progress and stats from analyze()
- Merge pull request #21 from MOLAorg/fix/imu-frames-deprecation-warning
- style: apply clang-format after IMU-frames ifdef edit
- fix: silence mola_georeferencing IMU extraction deprecation warning
- Merge pull request #20 from MOLAorg/feat/lc-parallel-icp
- feat: parallel per-candidate ICP in the F2F loop-closure detector
- Merge pull request #19 from MOLAorg/feat/lc-detection-robustness
- fix: gate KISS-Matcher guesses on the final inlier count
- feat: let analyze() callers exclude already-closed pairs from candidates
- fix: skip a failing loop-closure candidate instead of aborting the scan
- dont throw on empty scan frames
- expose MOLA_DESKEW_IGNORE_NO_TIMESTAMPS
- cmake: silent 3rdparty header warnings
- remove leftover mrpt::gui dependency
- Merge pull request #18 from MOLAorg/feat/f2f-use-imu-align
- feat: f2f algo uses imu acc for alignment
- Merge branch 'feat/lc-detector-analyze-api' into develop
- fix: skip observation unload during read-only analyze()
- Merge pull request #17 from MOLAorg/feat/lc-detector-analyze-api
- fix: keep analyze() read-only and leak-free
- fix: guard build_initial_graph against stale graph state
- feat: streaming, incremental and abortable analyze()
- feat: detector-only analyze() API for loop closure
- Contributors: Jose Luis Blanco Claraco, Jose Luis Blanco-Claraco
1.2.2 (2026-06-17)
- update robin and kiss-matcher submodules
- Contributors: Jose Luis Blanco-Claraco
1.2.1 (2026-06-16)
- fix: pmc FTBFS on Debian builds
- docs: add ROS 2 Lyrical badge row, update Rolling to Ubuntu 26.04 (resolute)
- Merge pull request #16 from MOLAorg/feat/assert-degenerated-gps feat: assert on degenerated GNSS data
- docs: update mrpt docs URI
- Contributors: Jose Luis Blanco-Claraco
1.2.0 (2026-05-11)
-
f2f pipeline: switch to multi-objective as default strategy
-
Merge pull request #15 from MOLAorg/simplify-ci CI: simplify clang-format helpers and use ros: docker images for stable builds
-
fix: wrap find -iname predicates in parentheses to scope them to listed dirs Without grouping, the -o operators apply at top level and -print0 only attaches to the last alternative, so files outside the intended directories can be matched.
-
CI: simplify clang-format helpers and use ros: docker images for
File truncated at 100 lines see the full file
Package Dependencies
System Dependencies
Dependant Packages
Launch files
Messages
Services
Plugins
Recent questions tagged mola_sm_loop_closure at Robotics Stack Exchange
|
mola_sm_loop_closure package from mola_sm_loop_closure repomola_sm_loop_closure |
ROS Distro
|
Package Summary
| Version | 1.3.0 |
| License | GPLv3 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/MOLAorg/mola_sm_loop_closure.git |
| VCS Type | git |
| VCS Version | develop |
| Last Updated | 2026-10-01 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Jose-Luis Blanco-Claraco
Authors
- Jose-Luis Blanco-Claraco
mola_sm_loop_closure
Offline loop-closure engine for MOLA CSimpleMap files. Given an input
simplemap produced by any MOLA odometry front-end, the package re-optimises
all keyframe poses by detecting and closing loops, then writes the corrected
simplemap back to disk.
Two algorithms
| Algorithm | Class | Best for |
|---|---|---|
| SimplemapLoopClosure | mola::SimplemapLoopClosure |
Long maps with noticeable drift; groups keyframes into submaps and runs heavy point-cloud ICP between submap pairs |
| FrameToFrameLoopClosure | mola::FrameToFrameLoopClosure |
GNSS-augmented datasets or quick re-optimisation; runs frame-to-frame ICP with a GNC graph optimizer |
CLI usage
# SimplemapLoopClosure (default algorithm):
mola-sm-lc-cli -i in.simplemap -o out.simplemap \
-p pipelines/loop-closure-lidar3d-gicp.yaml
# FrameToFrameLoopClosure:
mola-sm-lc-cli -i in.simplemap -o out.simplemap \
-a mola::FrameToFrameLoopClosure \
-p pipelines/loop-closure-f2f-lidar3d-gicp.yaml
Available pipelines
| YAML file | Sensor type | Algorithm |
|---|---|---|
loop-closure-lidar3d-gicp.yaml |
3-D LiDAR (GICP) | SimplemapLoopClosure |
loop-closure-lidar3d-icp.yaml |
3-D LiDAR (point-to-point ICP) | SimplemapLoopClosure |
loop-closure-lidar2d.yaml |
2-D LiDAR | SimplemapLoopClosure |
loop-closure-f2f-lidar3d-gicp.yaml |
3-D LiDAR (GICP) | FrameToFrameLoopClosure |
Key YAML knobs
SimplemapLoopClosure
-
submap_max_absolute_length/submap_min_absolute_length: controls submap granularity. -
assume_planar_world: trueenables annealed soft planar constraints (z, roll, pitch).-
planar_world_initial_sigma_z,planar_world_initial_sigma_ang,planar_world_annealing_rounds: tune the annealing schedule. -
planar_world_hard_flatten: truerestores the old hard-flattening behaviour.
-
-
use_gnss: true/gnss_add_horizontality: true: GNSS-assisted global alignment.-
gnss_factor_strategy: "submap"(default, scalable) or"per_kf"(sensor-pose-aware, larger graph). -
gnss_max_uncertainty_horiz(default20.0m) : reject GPS readings whose horizontal ENU uncertainty (√(σ_E²+σ_N²)) exceeds this threshold. -
gnss_max_uncertainty_vert(default40.0m) : reject GPS readings whose vertical ENU uncertainty (σ_U) exceeds this threshold. - Stats on accepted/rejected GNSS readings are printed at the INFO log level after processing.
-
-
use_imu_gravity: true/imu_gravity_sigma_deg: IMU-derived gravity-alignment factors added in stage 1.
FrameToFrameLoopClosure
-
lc_candidate_strategy:DISTANCE_STRATIFIED(default),PROXIMITY_ONLY, orMULTI_OBJECTIVE. -
assume_planar_world: true: planar-world annealing (subset of SM options; IMU-gravity options are not exposed byFrameToFrameLoopClosure::Parameters). -
use_gnss: true: per-keyframe GNSS factors (FactorGnssEnu).-
gnss_max_uncertainty_horiz(default20.0m) : reject GPS readings whose horizontal ENU uncertainty exceeds this threshold. -
gnss_max_uncertainty_vert(default40.0m) : reject GPS readings whose vertical ENU uncertainty exceeds this threshold.
-
-
manual_loop_constraints: list of hand-specified loop closure edges (by UNIX timestamp pair). Each entry supports:-
timestamp_i,timestamp_j: UNIX timestamps identifying the two keyframes. -
sigma_xyz: positional uncertainty [m]. -
trust_as_inlier(defaultfalse): iftrue, the constraint is added to the GNC set of known inliers and will not be downweighted by the robust optimizer.
-
-
use_kiss_matcher: true: use KISS-Matcher global registration to seed the ICP initial guess for each loop-closure candidate (default:false; requires thethird_party/kiss-matchersubmodule to be populated).-
kiss_matcher_resolution(default1.0m) : voxel size for KISS-Matcher feature extraction; controlsnormal_radius ≈ 3×andfpfh_radius ≈ 5×. -
kiss_matcher_layer(default"points_to_register_points") : name of themp2p_icp::metric_map_tlayer whose points are fed into KISS-Matcher.
-
See the online tutorial for a step-by-step example.
License
Copyright (C) 2018-2026 Jose Luis Blanco jlblanco@ual.es, University of Almeria
This package is released under the GNU GPL v3 license as open source, with the main intention of being useful for research and evaluation purposes. Commercial licenses available upon request.
Contributions require acceptance of the Contributor License Agreement (CLA).
Changelog for package mola_sm_loop_closure
1.3.0 (2026-10-01)
- ci: make scripts/release.py identical across repos by auto-discovering packages
- ci: add GitHub release workflow on version tags
- Merge pull request #25 from MOLAorg/feat/mrpt3
- Declare mrpt_viz as a direct dependency; clang-format test file
- Merge remote-tracking branch 'origin/develop' into feat/mrpt3
- fix: the loop-closure candidate floor rejects real revisits (#24)
- Port to MRPT 3.x: opengl->viz, TCLAP->CLI11, yaml associativity
- Merge pull request #23 from MOLAorg/feat/deterministic-scan
- CI: fail-fast: false, so one broken distro stops masking the others
- docs: the reproducibility guarantee is conditional on the build, say so
- perf: keep candidate parallelism in deterministic scans (92.7 s -> 40 s)
- feat: a [deterministic]{.title-ref} mode that makes a scan reproducible
- fix: listed mrpt::gui as dependency but could be removed
- chore: silent 3rdparty code warnings
- Merge pull request #22 from MOLAorg/feat/lc-analyze-progress-stats
- perf: keep rejected candidates lock-free in parallel analyze()
- feat: report per-scan progress and stats from analyze()
- Merge pull request #21 from MOLAorg/fix/imu-frames-deprecation-warning
- style: apply clang-format after IMU-frames ifdef edit
- fix: silence mola_georeferencing IMU extraction deprecation warning
- Merge pull request #20 from MOLAorg/feat/lc-parallel-icp
- feat: parallel per-candidate ICP in the F2F loop-closure detector
- Merge pull request #19 from MOLAorg/feat/lc-detection-robustness
- fix: gate KISS-Matcher guesses on the final inlier count
- feat: let analyze() callers exclude already-closed pairs from candidates
- fix: skip a failing loop-closure candidate instead of aborting the scan
- dont throw on empty scan frames
- expose MOLA_DESKEW_IGNORE_NO_TIMESTAMPS
- cmake: silent 3rdparty header warnings
- remove leftover mrpt::gui dependency
- Merge pull request #18 from MOLAorg/feat/f2f-use-imu-align
- feat: f2f algo uses imu acc for alignment
- Merge branch 'feat/lc-detector-analyze-api' into develop
- fix: skip observation unload during read-only analyze()
- Merge pull request #17 from MOLAorg/feat/lc-detector-analyze-api
- fix: keep analyze() read-only and leak-free
- fix: guard build_initial_graph against stale graph state
- feat: streaming, incremental and abortable analyze()
- feat: detector-only analyze() API for loop closure
- Contributors: Jose Luis Blanco Claraco, Jose Luis Blanco-Claraco
1.2.2 (2026-06-17)
- update robin and kiss-matcher submodules
- Contributors: Jose Luis Blanco-Claraco
1.2.1 (2026-06-16)
- fix: pmc FTBFS on Debian builds
- docs: add ROS 2 Lyrical badge row, update Rolling to Ubuntu 26.04 (resolute)
- Merge pull request #16 from MOLAorg/feat/assert-degenerated-gps feat: assert on degenerated GNSS data
- docs: update mrpt docs URI
- Contributors: Jose Luis Blanco-Claraco
1.2.0 (2026-05-11)
-
f2f pipeline: switch to multi-objective as default strategy
-
Merge pull request #15 from MOLAorg/simplify-ci CI: simplify clang-format helpers and use ros: docker images for stable builds
-
fix: wrap find -iname predicates in parentheses to scope them to listed dirs Without grouping, the -o operators apply at top level and -print0 only attaches to the last alternative, so files outside the intended directories can be matched.
-
CI: simplify clang-format helpers and use ros: docker images for
File truncated at 100 lines see the full file
Package Dependencies
System Dependencies
Dependant Packages
Launch files
Messages
Services
Plugins
Recent questions tagged mola_sm_loop_closure at Robotics Stack Exchange
|
mola_sm_loop_closure package from mola_sm_loop_closure repomola_sm_loop_closure |
ROS Distro
|
Package Summary
| Version | 1.3.0 |
| License | GPLv3 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/MOLAorg/mola_sm_loop_closure.git |
| VCS Type | git |
| VCS Version | develop |
| Last Updated | 2026-10-01 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Jose-Luis Blanco-Claraco
Authors
- Jose-Luis Blanco-Claraco
mola_sm_loop_closure
Offline loop-closure engine for MOLA CSimpleMap files. Given an input
simplemap produced by any MOLA odometry front-end, the package re-optimises
all keyframe poses by detecting and closing loops, then writes the corrected
simplemap back to disk.
Two algorithms
| Algorithm | Class | Best for |
|---|---|---|
| SimplemapLoopClosure | mola::SimplemapLoopClosure |
Long maps with noticeable drift; groups keyframes into submaps and runs heavy point-cloud ICP between submap pairs |
| FrameToFrameLoopClosure | mola::FrameToFrameLoopClosure |
GNSS-augmented datasets or quick re-optimisation; runs frame-to-frame ICP with a GNC graph optimizer |
CLI usage
# SimplemapLoopClosure (default algorithm):
mola-sm-lc-cli -i in.simplemap -o out.simplemap \
-p pipelines/loop-closure-lidar3d-gicp.yaml
# FrameToFrameLoopClosure:
mola-sm-lc-cli -i in.simplemap -o out.simplemap \
-a mola::FrameToFrameLoopClosure \
-p pipelines/loop-closure-f2f-lidar3d-gicp.yaml
Available pipelines
| YAML file | Sensor type | Algorithm |
|---|---|---|
loop-closure-lidar3d-gicp.yaml |
3-D LiDAR (GICP) | SimplemapLoopClosure |
loop-closure-lidar3d-icp.yaml |
3-D LiDAR (point-to-point ICP) | SimplemapLoopClosure |
loop-closure-lidar2d.yaml |
2-D LiDAR | SimplemapLoopClosure |
loop-closure-f2f-lidar3d-gicp.yaml |
3-D LiDAR (GICP) | FrameToFrameLoopClosure |
Key YAML knobs
SimplemapLoopClosure
-
submap_max_absolute_length/submap_min_absolute_length: controls submap granularity. -
assume_planar_world: trueenables annealed soft planar constraints (z, roll, pitch).-
planar_world_initial_sigma_z,planar_world_initial_sigma_ang,planar_world_annealing_rounds: tune the annealing schedule. -
planar_world_hard_flatten: truerestores the old hard-flattening behaviour.
-
-
use_gnss: true/gnss_add_horizontality: true: GNSS-assisted global alignment.-
gnss_factor_strategy: "submap"(default, scalable) or"per_kf"(sensor-pose-aware, larger graph). -
gnss_max_uncertainty_horiz(default20.0m) : reject GPS readings whose horizontal ENU uncertainty (√(σ_E²+σ_N²)) exceeds this threshold. -
gnss_max_uncertainty_vert(default40.0m) : reject GPS readings whose vertical ENU uncertainty (σ_U) exceeds this threshold. - Stats on accepted/rejected GNSS readings are printed at the INFO log level after processing.
-
-
use_imu_gravity: true/imu_gravity_sigma_deg: IMU-derived gravity-alignment factors added in stage 1.
FrameToFrameLoopClosure
-
lc_candidate_strategy:DISTANCE_STRATIFIED(default),PROXIMITY_ONLY, orMULTI_OBJECTIVE. -
assume_planar_world: true: planar-world annealing (subset of SM options; IMU-gravity options are not exposed byFrameToFrameLoopClosure::Parameters). -
use_gnss: true: per-keyframe GNSS factors (FactorGnssEnu).-
gnss_max_uncertainty_horiz(default20.0m) : reject GPS readings whose horizontal ENU uncertainty exceeds this threshold. -
gnss_max_uncertainty_vert(default40.0m) : reject GPS readings whose vertical ENU uncertainty exceeds this threshold.
-
-
manual_loop_constraints: list of hand-specified loop closure edges (by UNIX timestamp pair). Each entry supports:-
timestamp_i,timestamp_j: UNIX timestamps identifying the two keyframes. -
sigma_xyz: positional uncertainty [m]. -
trust_as_inlier(defaultfalse): iftrue, the constraint is added to the GNC set of known inliers and will not be downweighted by the robust optimizer.
-
-
use_kiss_matcher: true: use KISS-Matcher global registration to seed the ICP initial guess for each loop-closure candidate (default:false; requires thethird_party/kiss-matchersubmodule to be populated).-
kiss_matcher_resolution(default1.0m) : voxel size for KISS-Matcher feature extraction; controlsnormal_radius ≈ 3×andfpfh_radius ≈ 5×. -
kiss_matcher_layer(default"points_to_register_points") : name of themp2p_icp::metric_map_tlayer whose points are fed into KISS-Matcher.
-
See the online tutorial for a step-by-step example.
License
Copyright (C) 2018-2026 Jose Luis Blanco jlblanco@ual.es, University of Almeria
This package is released under the GNU GPL v3 license as open source, with the main intention of being useful for research and evaluation purposes. Commercial licenses available upon request.
Contributions require acceptance of the Contributor License Agreement (CLA).
Changelog for package mola_sm_loop_closure
1.3.0 (2026-10-01)
- ci: make scripts/release.py identical across repos by auto-discovering packages
- ci: add GitHub release workflow on version tags
- Merge pull request #25 from MOLAorg/feat/mrpt3
- Declare mrpt_viz as a direct dependency; clang-format test file
- Merge remote-tracking branch 'origin/develop' into feat/mrpt3
- fix: the loop-closure candidate floor rejects real revisits (#24)
- Port to MRPT 3.x: opengl->viz, TCLAP->CLI11, yaml associativity
- Merge pull request #23 from MOLAorg/feat/deterministic-scan
- CI: fail-fast: false, so one broken distro stops masking the others
- docs: the reproducibility guarantee is conditional on the build, say so
- perf: keep candidate parallelism in deterministic scans (92.7 s -> 40 s)
- feat: a [deterministic]{.title-ref} mode that makes a scan reproducible
- fix: listed mrpt::gui as dependency but could be removed
- chore: silent 3rdparty code warnings
- Merge pull request #22 from MOLAorg/feat/lc-analyze-progress-stats
- perf: keep rejected candidates lock-free in parallel analyze()
- feat: report per-scan progress and stats from analyze()
- Merge pull request #21 from MOLAorg/fix/imu-frames-deprecation-warning
- style: apply clang-format after IMU-frames ifdef edit
- fix: silence mola_georeferencing IMU extraction deprecation warning
- Merge pull request #20 from MOLAorg/feat/lc-parallel-icp
- feat: parallel per-candidate ICP in the F2F loop-closure detector
- Merge pull request #19 from MOLAorg/feat/lc-detection-robustness
- fix: gate KISS-Matcher guesses on the final inlier count
- feat: let analyze() callers exclude already-closed pairs from candidates
- fix: skip a failing loop-closure candidate instead of aborting the scan
- dont throw on empty scan frames
- expose MOLA_DESKEW_IGNORE_NO_TIMESTAMPS
- cmake: silent 3rdparty header warnings
- remove leftover mrpt::gui dependency
- Merge pull request #18 from MOLAorg/feat/f2f-use-imu-align
- feat: f2f algo uses imu acc for alignment
- Merge branch 'feat/lc-detector-analyze-api' into develop
- fix: skip observation unload during read-only analyze()
- Merge pull request #17 from MOLAorg/feat/lc-detector-analyze-api
- fix: keep analyze() read-only and leak-free
- fix: guard build_initial_graph against stale graph state
- feat: streaming, incremental and abortable analyze()
- feat: detector-only analyze() API for loop closure
- Contributors: Jose Luis Blanco Claraco, Jose Luis Blanco-Claraco
1.2.2 (2026-06-17)
- update robin and kiss-matcher submodules
- Contributors: Jose Luis Blanco-Claraco
1.2.1 (2026-06-16)
- fix: pmc FTBFS on Debian builds
- docs: add ROS 2 Lyrical badge row, update Rolling to Ubuntu 26.04 (resolute)
- Merge pull request #16 from MOLAorg/feat/assert-degenerated-gps feat: assert on degenerated GNSS data
- docs: update mrpt docs URI
- Contributors: Jose Luis Blanco-Claraco
1.2.0 (2026-05-11)
-
f2f pipeline: switch to multi-objective as default strategy
-
Merge pull request #15 from MOLAorg/simplify-ci CI: simplify clang-format helpers and use ros: docker images for stable builds
-
fix: wrap find -iname predicates in parentheses to scope them to listed dirs Without grouping, the -o operators apply at top level and -print0 only attaches to the last alternative, so files outside the intended directories can be matched.
-
CI: simplify clang-format helpers and use ros: docker images for
File truncated at 100 lines see the full file
Package Dependencies
System Dependencies
Dependant Packages
Launch files
Messages
Services
Plugins
Recent questions tagged mola_sm_loop_closure at Robotics Stack Exchange
|
mola_sm_loop_closure package from mola_sm_loop_closure repomola_sm_loop_closure |
ROS Distro
|
Package Summary
| Version | 1.3.0 |
| License | GPLv3 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/MOLAorg/mola_sm_loop_closure.git |
| VCS Type | git |
| VCS Version | develop |
| Last Updated | 2026-10-01 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Jose-Luis Blanco-Claraco
Authors
- Jose-Luis Blanco-Claraco
mola_sm_loop_closure
Offline loop-closure engine for MOLA CSimpleMap files. Given an input
simplemap produced by any MOLA odometry front-end, the package re-optimises
all keyframe poses by detecting and closing loops, then writes the corrected
simplemap back to disk.
Two algorithms
| Algorithm | Class | Best for |
|---|---|---|
| SimplemapLoopClosure | mola::SimplemapLoopClosure |
Long maps with noticeable drift; groups keyframes into submaps and runs heavy point-cloud ICP between submap pairs |
| FrameToFrameLoopClosure | mola::FrameToFrameLoopClosure |
GNSS-augmented datasets or quick re-optimisation; runs frame-to-frame ICP with a GNC graph optimizer |
CLI usage
# SimplemapLoopClosure (default algorithm):
mola-sm-lc-cli -i in.simplemap -o out.simplemap \
-p pipelines/loop-closure-lidar3d-gicp.yaml
# FrameToFrameLoopClosure:
mola-sm-lc-cli -i in.simplemap -o out.simplemap \
-a mola::FrameToFrameLoopClosure \
-p pipelines/loop-closure-f2f-lidar3d-gicp.yaml
Available pipelines
| YAML file | Sensor type | Algorithm |
|---|---|---|
loop-closure-lidar3d-gicp.yaml |
3-D LiDAR (GICP) | SimplemapLoopClosure |
loop-closure-lidar3d-icp.yaml |
3-D LiDAR (point-to-point ICP) | SimplemapLoopClosure |
loop-closure-lidar2d.yaml |
2-D LiDAR | SimplemapLoopClosure |
loop-closure-f2f-lidar3d-gicp.yaml |
3-D LiDAR (GICP) | FrameToFrameLoopClosure |
Key YAML knobs
SimplemapLoopClosure
-
submap_max_absolute_length/submap_min_absolute_length: controls submap granularity. -
assume_planar_world: trueenables annealed soft planar constraints (z, roll, pitch).-
planar_world_initial_sigma_z,planar_world_initial_sigma_ang,planar_world_annealing_rounds: tune the annealing schedule. -
planar_world_hard_flatten: truerestores the old hard-flattening behaviour.
-
-
use_gnss: true/gnss_add_horizontality: true: GNSS-assisted global alignment.-
gnss_factor_strategy: "submap"(default, scalable) or"per_kf"(sensor-pose-aware, larger graph). -
gnss_max_uncertainty_horiz(default20.0m) : reject GPS readings whose horizontal ENU uncertainty (√(σ_E²+σ_N²)) exceeds this threshold. -
gnss_max_uncertainty_vert(default40.0m) : reject GPS readings whose vertical ENU uncertainty (σ_U) exceeds this threshold. - Stats on accepted/rejected GNSS readings are printed at the INFO log level after processing.
-
-
use_imu_gravity: true/imu_gravity_sigma_deg: IMU-derived gravity-alignment factors added in stage 1.
FrameToFrameLoopClosure
-
lc_candidate_strategy:DISTANCE_STRATIFIED(default),PROXIMITY_ONLY, orMULTI_OBJECTIVE. -
assume_planar_world: true: planar-world annealing (subset of SM options; IMU-gravity options are not exposed byFrameToFrameLoopClosure::Parameters). -
use_gnss: true: per-keyframe GNSS factors (FactorGnssEnu).-
gnss_max_uncertainty_horiz(default20.0m) : reject GPS readings whose horizontal ENU uncertainty exceeds this threshold. -
gnss_max_uncertainty_vert(default40.0m) : reject GPS readings whose vertical ENU uncertainty exceeds this threshold.
-
-
manual_loop_constraints: list of hand-specified loop closure edges (by UNIX timestamp pair). Each entry supports:-
timestamp_i,timestamp_j: UNIX timestamps identifying the two keyframes. -
sigma_xyz: positional uncertainty [m]. -
trust_as_inlier(defaultfalse): iftrue, the constraint is added to the GNC set of known inliers and will not be downweighted by the robust optimizer.
-
-
use_kiss_matcher: true: use KISS-Matcher global registration to seed the ICP initial guess for each loop-closure candidate (default:false; requires thethird_party/kiss-matchersubmodule to be populated).-
kiss_matcher_resolution(default1.0m) : voxel size for KISS-Matcher feature extraction; controlsnormal_radius ≈ 3×andfpfh_radius ≈ 5×. -
kiss_matcher_layer(default"points_to_register_points") : name of themp2p_icp::metric_map_tlayer whose points are fed into KISS-Matcher.
-
See the online tutorial for a step-by-step example.
License
Copyright (C) 2018-2026 Jose Luis Blanco jlblanco@ual.es, University of Almeria
This package is released under the GNU GPL v3 license as open source, with the main intention of being useful for research and evaluation purposes. Commercial licenses available upon request.
Contributions require acceptance of the Contributor License Agreement (CLA).
Changelog for package mola_sm_loop_closure
1.3.0 (2026-10-01)
- ci: make scripts/release.py identical across repos by auto-discovering packages
- ci: add GitHub release workflow on version tags
- Merge pull request #25 from MOLAorg/feat/mrpt3
- Declare mrpt_viz as a direct dependency; clang-format test file
- Merge remote-tracking branch 'origin/develop' into feat/mrpt3
- fix: the loop-closure candidate floor rejects real revisits (#24)
- Port to MRPT 3.x: opengl->viz, TCLAP->CLI11, yaml associativity
- Merge pull request #23 from MOLAorg/feat/deterministic-scan
- CI: fail-fast: false, so one broken distro stops masking the others
- docs: the reproducibility guarantee is conditional on the build, say so
- perf: keep candidate parallelism in deterministic scans (92.7 s -> 40 s)
- feat: a [deterministic]{.title-ref} mode that makes a scan reproducible
- fix: listed mrpt::gui as dependency but could be removed
- chore: silent 3rdparty code warnings
- Merge pull request #22 from MOLAorg/feat/lc-analyze-progress-stats
- perf: keep rejected candidates lock-free in parallel analyze()
- feat: report per-scan progress and stats from analyze()
- Merge pull request #21 from MOLAorg/fix/imu-frames-deprecation-warning
- style: apply clang-format after IMU-frames ifdef edit
- fix: silence mola_georeferencing IMU extraction deprecation warning
- Merge pull request #20 from MOLAorg/feat/lc-parallel-icp
- feat: parallel per-candidate ICP in the F2F loop-closure detector
- Merge pull request #19 from MOLAorg/feat/lc-detection-robustness
- fix: gate KISS-Matcher guesses on the final inlier count
- feat: let analyze() callers exclude already-closed pairs from candidates
- fix: skip a failing loop-closure candidate instead of aborting the scan
- dont throw on empty scan frames
- expose MOLA_DESKEW_IGNORE_NO_TIMESTAMPS
- cmake: silent 3rdparty header warnings
- remove leftover mrpt::gui dependency
- Merge pull request #18 from MOLAorg/feat/f2f-use-imu-align
- feat: f2f algo uses imu acc for alignment
- Merge branch 'feat/lc-detector-analyze-api' into develop
- fix: skip observation unload during read-only analyze()
- Merge pull request #17 from MOLAorg/feat/lc-detector-analyze-api
- fix: keep analyze() read-only and leak-free
- fix: guard build_initial_graph against stale graph state
- feat: streaming, incremental and abortable analyze()
- feat: detector-only analyze() API for loop closure
- Contributors: Jose Luis Blanco Claraco, Jose Luis Blanco-Claraco
1.2.2 (2026-06-17)
- update robin and kiss-matcher submodules
- Contributors: Jose Luis Blanco-Claraco
1.2.1 (2026-06-16)
- fix: pmc FTBFS on Debian builds
- docs: add ROS 2 Lyrical badge row, update Rolling to Ubuntu 26.04 (resolute)
- Merge pull request #16 from MOLAorg/feat/assert-degenerated-gps feat: assert on degenerated GNSS data
- docs: update mrpt docs URI
- Contributors: Jose Luis Blanco-Claraco
1.2.0 (2026-05-11)
-
f2f pipeline: switch to multi-objective as default strategy
-
Merge pull request #15 from MOLAorg/simplify-ci CI: simplify clang-format helpers and use ros: docker images for stable builds
-
fix: wrap find -iname predicates in parentheses to scope them to listed dirs Without grouping, the -o operators apply at top level and -print0 only attaches to the last alternative, so files outside the intended directories can be matched.
-
CI: simplify clang-format helpers and use ros: docker images for
File truncated at 100 lines see the full file
Package Dependencies
System Dependencies
Dependant Packages
Launch files
Messages
Services
Plugins
Recent questions tagged mola_sm_loop_closure at Robotics Stack Exchange
|
mola_sm_loop_closure package from mola_sm_loop_closure repomola_sm_loop_closure |
ROS Distro
|
Package Summary
| Version | 1.3.0 |
| License | GPLv3 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/MOLAorg/mola_sm_loop_closure.git |
| VCS Type | git |
| VCS Version | develop |
| Last Updated | 2026-10-01 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Jose-Luis Blanco-Claraco
Authors
- Jose-Luis Blanco-Claraco
mola_sm_loop_closure
Offline loop-closure engine for MOLA CSimpleMap files. Given an input
simplemap produced by any MOLA odometry front-end, the package re-optimises
all keyframe poses by detecting and closing loops, then writes the corrected
simplemap back to disk.
Two algorithms
| Algorithm | Class | Best for |
|---|---|---|
| SimplemapLoopClosure | mola::SimplemapLoopClosure |
Long maps with noticeable drift; groups keyframes into submaps and runs heavy point-cloud ICP between submap pairs |
| FrameToFrameLoopClosure | mola::FrameToFrameLoopClosure |
GNSS-augmented datasets or quick re-optimisation; runs frame-to-frame ICP with a GNC graph optimizer |
CLI usage
# SimplemapLoopClosure (default algorithm):
mola-sm-lc-cli -i in.simplemap -o out.simplemap \
-p pipelines/loop-closure-lidar3d-gicp.yaml
# FrameToFrameLoopClosure:
mola-sm-lc-cli -i in.simplemap -o out.simplemap \
-a mola::FrameToFrameLoopClosure \
-p pipelines/loop-closure-f2f-lidar3d-gicp.yaml
Available pipelines
| YAML file | Sensor type | Algorithm |
|---|---|---|
loop-closure-lidar3d-gicp.yaml |
3-D LiDAR (GICP) | SimplemapLoopClosure |
loop-closure-lidar3d-icp.yaml |
3-D LiDAR (point-to-point ICP) | SimplemapLoopClosure |
loop-closure-lidar2d.yaml |
2-D LiDAR | SimplemapLoopClosure |
loop-closure-f2f-lidar3d-gicp.yaml |
3-D LiDAR (GICP) | FrameToFrameLoopClosure |
Key YAML knobs
SimplemapLoopClosure
-
submap_max_absolute_length/submap_min_absolute_length: controls submap granularity. -
assume_planar_world: trueenables annealed soft planar constraints (z, roll, pitch).-
planar_world_initial_sigma_z,planar_world_initial_sigma_ang,planar_world_annealing_rounds: tune the annealing schedule. -
planar_world_hard_flatten: truerestores the old hard-flattening behaviour.
-
-
use_gnss: true/gnss_add_horizontality: true: GNSS-assisted global alignment.-
gnss_factor_strategy: "submap"(default, scalable) or"per_kf"(sensor-pose-aware, larger graph). -
gnss_max_uncertainty_horiz(default20.0m) : reject GPS readings whose horizontal ENU uncertainty (√(σ_E²+σ_N²)) exceeds this threshold. -
gnss_max_uncertainty_vert(default40.0m) : reject GPS readings whose vertical ENU uncertainty (σ_U) exceeds this threshold. - Stats on accepted/rejected GNSS readings are printed at the INFO log level after processing.
-
-
use_imu_gravity: true/imu_gravity_sigma_deg: IMU-derived gravity-alignment factors added in stage 1.
FrameToFrameLoopClosure
-
lc_candidate_strategy:DISTANCE_STRATIFIED(default),PROXIMITY_ONLY, orMULTI_OBJECTIVE. -
assume_planar_world: true: planar-world annealing (subset of SM options; IMU-gravity options are not exposed byFrameToFrameLoopClosure::Parameters). -
use_gnss: true: per-keyframe GNSS factors (FactorGnssEnu).-
gnss_max_uncertainty_horiz(default20.0m) : reject GPS readings whose horizontal ENU uncertainty exceeds this threshold. -
gnss_max_uncertainty_vert(default40.0m) : reject GPS readings whose vertical ENU uncertainty exceeds this threshold.
-
-
manual_loop_constraints: list of hand-specified loop closure edges (by UNIX timestamp pair). Each entry supports:-
timestamp_i,timestamp_j: UNIX timestamps identifying the two keyframes. -
sigma_xyz: positional uncertainty [m]. -
trust_as_inlier(defaultfalse): iftrue, the constraint is added to the GNC set of known inliers and will not be downweighted by the robust optimizer.
-
-
use_kiss_matcher: true: use KISS-Matcher global registration to seed the ICP initial guess for each loop-closure candidate (default:false; requires thethird_party/kiss-matchersubmodule to be populated).-
kiss_matcher_resolution(default1.0m) : voxel size for KISS-Matcher feature extraction; controlsnormal_radius ≈ 3×andfpfh_radius ≈ 5×. -
kiss_matcher_layer(default"points_to_register_points") : name of themp2p_icp::metric_map_tlayer whose points are fed into KISS-Matcher.
-
See the online tutorial for a step-by-step example.
License
Copyright (C) 2018-2026 Jose Luis Blanco jlblanco@ual.es, University of Almeria
This package is released under the GNU GPL v3 license as open source, with the main intention of being useful for research and evaluation purposes. Commercial licenses available upon request.
Contributions require acceptance of the Contributor License Agreement (CLA).
Changelog for package mola_sm_loop_closure
1.3.0 (2026-10-01)
- ci: make scripts/release.py identical across repos by auto-discovering packages
- ci: add GitHub release workflow on version tags
- Merge pull request #25 from MOLAorg/feat/mrpt3
- Declare mrpt_viz as a direct dependency; clang-format test file
- Merge remote-tracking branch 'origin/develop' into feat/mrpt3
- fix: the loop-closure candidate floor rejects real revisits (#24)
- Port to MRPT 3.x: opengl->viz, TCLAP->CLI11, yaml associativity
- Merge pull request #23 from MOLAorg/feat/deterministic-scan
- CI: fail-fast: false, so one broken distro stops masking the others
- docs: the reproducibility guarantee is conditional on the build, say so
- perf: keep candidate parallelism in deterministic scans (92.7 s -> 40 s)
- feat: a [deterministic]{.title-ref} mode that makes a scan reproducible
- fix: listed mrpt::gui as dependency but could be removed
- chore: silent 3rdparty code warnings
- Merge pull request #22 from MOLAorg/feat/lc-analyze-progress-stats
- perf: keep rejected candidates lock-free in parallel analyze()
- feat: report per-scan progress and stats from analyze()
- Merge pull request #21 from MOLAorg/fix/imu-frames-deprecation-warning
- style: apply clang-format after IMU-frames ifdef edit
- fix: silence mola_georeferencing IMU extraction deprecation warning
- Merge pull request #20 from MOLAorg/feat/lc-parallel-icp
- feat: parallel per-candidate ICP in the F2F loop-closure detector
- Merge pull request #19 from MOLAorg/feat/lc-detection-robustness
- fix: gate KISS-Matcher guesses on the final inlier count
- feat: let analyze() callers exclude already-closed pairs from candidates
- fix: skip a failing loop-closure candidate instead of aborting the scan
- dont throw on empty scan frames
- expose MOLA_DESKEW_IGNORE_NO_TIMESTAMPS
- cmake: silent 3rdparty header warnings
- remove leftover mrpt::gui dependency
- Merge pull request #18 from MOLAorg/feat/f2f-use-imu-align
- feat: f2f algo uses imu acc for alignment
- Merge branch 'feat/lc-detector-analyze-api' into develop
- fix: skip observation unload during read-only analyze()
- Merge pull request #17 from MOLAorg/feat/lc-detector-analyze-api
- fix: keep analyze() read-only and leak-free
- fix: guard build_initial_graph against stale graph state
- feat: streaming, incremental and abortable analyze()
- feat: detector-only analyze() API for loop closure
- Contributors: Jose Luis Blanco Claraco, Jose Luis Blanco-Claraco
1.2.2 (2026-06-17)
- update robin and kiss-matcher submodules
- Contributors: Jose Luis Blanco-Claraco
1.2.1 (2026-06-16)
- fix: pmc FTBFS on Debian builds
- docs: add ROS 2 Lyrical badge row, update Rolling to Ubuntu 26.04 (resolute)
- Merge pull request #16 from MOLAorg/feat/assert-degenerated-gps feat: assert on degenerated GNSS data
- docs: update mrpt docs URI
- Contributors: Jose Luis Blanco-Claraco
1.2.0 (2026-05-11)
-
f2f pipeline: switch to multi-objective as default strategy
-
Merge pull request #15 from MOLAorg/simplify-ci CI: simplify clang-format helpers and use ros: docker images for stable builds
-
fix: wrap find -iname predicates in parentheses to scope them to listed dirs Without grouping, the -o operators apply at top level and -print0 only attaches to the last alternative, so files outside the intended directories can be matched.
-
CI: simplify clang-format helpers and use ros: docker images for
File truncated at 100 lines see the full file
Package Dependencies
System Dependencies
Dependant Packages
Launch files
Messages
Services
Plugins
Recent questions tagged mola_sm_loop_closure at Robotics Stack Exchange
|
mola_sm_loop_closure package from mola_sm_loop_closure repomola_sm_loop_closure |
ROS Distro
|
Package Summary
| Version | 1.3.0 |
| License | GPLv3 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/MOLAorg/mola_sm_loop_closure.git |
| VCS Type | git |
| VCS Version | develop |
| Last Updated | 2026-10-01 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Jose-Luis Blanco-Claraco
Authors
- Jose-Luis Blanco-Claraco
mola_sm_loop_closure
Offline loop-closure engine for MOLA CSimpleMap files. Given an input
simplemap produced by any MOLA odometry front-end, the package re-optimises
all keyframe poses by detecting and closing loops, then writes the corrected
simplemap back to disk.
Two algorithms
| Algorithm | Class | Best for |
|---|---|---|
| SimplemapLoopClosure | mola::SimplemapLoopClosure |
Long maps with noticeable drift; groups keyframes into submaps and runs heavy point-cloud ICP between submap pairs |
| FrameToFrameLoopClosure | mola::FrameToFrameLoopClosure |
GNSS-augmented datasets or quick re-optimisation; runs frame-to-frame ICP with a GNC graph optimizer |
CLI usage
# SimplemapLoopClosure (default algorithm):
mola-sm-lc-cli -i in.simplemap -o out.simplemap \
-p pipelines/loop-closure-lidar3d-gicp.yaml
# FrameToFrameLoopClosure:
mola-sm-lc-cli -i in.simplemap -o out.simplemap \
-a mola::FrameToFrameLoopClosure \
-p pipelines/loop-closure-f2f-lidar3d-gicp.yaml
Available pipelines
| YAML file | Sensor type | Algorithm |
|---|---|---|
loop-closure-lidar3d-gicp.yaml |
3-D LiDAR (GICP) | SimplemapLoopClosure |
loop-closure-lidar3d-icp.yaml |
3-D LiDAR (point-to-point ICP) | SimplemapLoopClosure |
loop-closure-lidar2d.yaml |
2-D LiDAR | SimplemapLoopClosure |
loop-closure-f2f-lidar3d-gicp.yaml |
3-D LiDAR (GICP) | FrameToFrameLoopClosure |
Key YAML knobs
SimplemapLoopClosure
-
submap_max_absolute_length/submap_min_absolute_length: controls submap granularity. -
assume_planar_world: trueenables annealed soft planar constraints (z, roll, pitch).-
planar_world_initial_sigma_z,planar_world_initial_sigma_ang,planar_world_annealing_rounds: tune the annealing schedule. -
planar_world_hard_flatten: truerestores the old hard-flattening behaviour.
-
-
use_gnss: true/gnss_add_horizontality: true: GNSS-assisted global alignment.-
gnss_factor_strategy: "submap"(default, scalable) or"per_kf"(sensor-pose-aware, larger graph). -
gnss_max_uncertainty_horiz(default20.0m) : reject GPS readings whose horizontal ENU uncertainty (√(σ_E²+σ_N²)) exceeds this threshold. -
gnss_max_uncertainty_vert(default40.0m) : reject GPS readings whose vertical ENU uncertainty (σ_U) exceeds this threshold. - Stats on accepted/rejected GNSS readings are printed at the INFO log level after processing.
-
-
use_imu_gravity: true/imu_gravity_sigma_deg: IMU-derived gravity-alignment factors added in stage 1.
FrameToFrameLoopClosure
-
lc_candidate_strategy:DISTANCE_STRATIFIED(default),PROXIMITY_ONLY, orMULTI_OBJECTIVE. -
assume_planar_world: true: planar-world annealing (subset of SM options; IMU-gravity options are not exposed byFrameToFrameLoopClosure::Parameters). -
use_gnss: true: per-keyframe GNSS factors (FactorGnssEnu).-
gnss_max_uncertainty_horiz(default20.0m) : reject GPS readings whose horizontal ENU uncertainty exceeds this threshold. -
gnss_max_uncertainty_vert(default40.0m) : reject GPS readings whose vertical ENU uncertainty exceeds this threshold.
-
-
manual_loop_constraints: list of hand-specified loop closure edges (by UNIX timestamp pair). Each entry supports:-
timestamp_i,timestamp_j: UNIX timestamps identifying the two keyframes. -
sigma_xyz: positional uncertainty [m]. -
trust_as_inlier(defaultfalse): iftrue, the constraint is added to the GNC set of known inliers and will not be downweighted by the robust optimizer.
-
-
use_kiss_matcher: true: use KISS-Matcher global registration to seed the ICP initial guess for each loop-closure candidate (default:false; requires thethird_party/kiss-matchersubmodule to be populated).-
kiss_matcher_resolution(default1.0m) : voxel size for KISS-Matcher feature extraction; controlsnormal_radius ≈ 3×andfpfh_radius ≈ 5×. -
kiss_matcher_layer(default"points_to_register_points") : name of themp2p_icp::metric_map_tlayer whose points are fed into KISS-Matcher.
-
See the online tutorial for a step-by-step example.
License
Copyright (C) 2018-2026 Jose Luis Blanco jlblanco@ual.es, University of Almeria
This package is released under the GNU GPL v3 license as open source, with the main intention of being useful for research and evaluation purposes. Commercial licenses available upon request.
Contributions require acceptance of the Contributor License Agreement (CLA).
Changelog for package mola_sm_loop_closure
1.3.0 (2026-10-01)
- ci: make scripts/release.py identical across repos by auto-discovering packages
- ci: add GitHub release workflow on version tags
- Merge pull request #25 from MOLAorg/feat/mrpt3
- Declare mrpt_viz as a direct dependency; clang-format test file
- Merge remote-tracking branch 'origin/develop' into feat/mrpt3
- fix: the loop-closure candidate floor rejects real revisits (#24)
- Port to MRPT 3.x: opengl->viz, TCLAP->CLI11, yaml associativity
- Merge pull request #23 from MOLAorg/feat/deterministic-scan
- CI: fail-fast: false, so one broken distro stops masking the others
- docs: the reproducibility guarantee is conditional on the build, say so
- perf: keep candidate parallelism in deterministic scans (92.7 s -> 40 s)
- feat: a [deterministic]{.title-ref} mode that makes a scan reproducible
- fix: listed mrpt::gui as dependency but could be removed
- chore: silent 3rdparty code warnings
- Merge pull request #22 from MOLAorg/feat/lc-analyze-progress-stats
- perf: keep rejected candidates lock-free in parallel analyze()
- feat: report per-scan progress and stats from analyze()
- Merge pull request #21 from MOLAorg/fix/imu-frames-deprecation-warning
- style: apply clang-format after IMU-frames ifdef edit
- fix: silence mola_georeferencing IMU extraction deprecation warning
- Merge pull request #20 from MOLAorg/feat/lc-parallel-icp
- feat: parallel per-candidate ICP in the F2F loop-closure detector
- Merge pull request #19 from MOLAorg/feat/lc-detection-robustness
- fix: gate KISS-Matcher guesses on the final inlier count
- feat: let analyze() callers exclude already-closed pairs from candidates
- fix: skip a failing loop-closure candidate instead of aborting the scan
- dont throw on empty scan frames
- expose MOLA_DESKEW_IGNORE_NO_TIMESTAMPS
- cmake: silent 3rdparty header warnings
- remove leftover mrpt::gui dependency
- Merge pull request #18 from MOLAorg/feat/f2f-use-imu-align
- feat: f2f algo uses imu acc for alignment
- Merge branch 'feat/lc-detector-analyze-api' into develop
- fix: skip observation unload during read-only analyze()
- Merge pull request #17 from MOLAorg/feat/lc-detector-analyze-api
- fix: keep analyze() read-only and leak-free
- fix: guard build_initial_graph against stale graph state
- feat: streaming, incremental and abortable analyze()
- feat: detector-only analyze() API for loop closure
- Contributors: Jose Luis Blanco Claraco, Jose Luis Blanco-Claraco
1.2.2 (2026-06-17)
- update robin and kiss-matcher submodules
- Contributors: Jose Luis Blanco-Claraco
1.2.1 (2026-06-16)
- fix: pmc FTBFS on Debian builds
- docs: add ROS 2 Lyrical badge row, update Rolling to Ubuntu 26.04 (resolute)
- Merge pull request #16 from MOLAorg/feat/assert-degenerated-gps feat: assert on degenerated GNSS data
- docs: update mrpt docs URI
- Contributors: Jose Luis Blanco-Claraco
1.2.0 (2026-05-11)
-
f2f pipeline: switch to multi-objective as default strategy
-
Merge pull request #15 from MOLAorg/simplify-ci CI: simplify clang-format helpers and use ros: docker images for stable builds
-
fix: wrap find -iname predicates in parentheses to scope them to listed dirs Without grouping, the -o operators apply at top level and -print0 only attaches to the last alternative, so files outside the intended directories can be matched.
-
CI: simplify clang-format helpers and use ros: docker images for
File truncated at 100 lines see the full file
Package Dependencies
System Dependencies
Dependant Packages
Launch files
Messages
Services
Plugins
Recent questions tagged mola_sm_loop_closure at Robotics Stack Exchange
|
mola_sm_loop_closure package from mola_sm_loop_closure repomola_sm_loop_closure |
ROS Distro
|
Package Summary
| Version | 1.3.0 |
| License | GPLv3 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/MOLAorg/mola_sm_loop_closure.git |
| VCS Type | git |
| VCS Version | develop |
| Last Updated | 2026-10-01 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Jose-Luis Blanco-Claraco
Authors
- Jose-Luis Blanco-Claraco
mola_sm_loop_closure
Offline loop-closure engine for MOLA CSimpleMap files. Given an input
simplemap produced by any MOLA odometry front-end, the package re-optimises
all keyframe poses by detecting and closing loops, then writes the corrected
simplemap back to disk.
Two algorithms
| Algorithm | Class | Best for |
|---|---|---|
| SimplemapLoopClosure | mola::SimplemapLoopClosure |
Long maps with noticeable drift; groups keyframes into submaps and runs heavy point-cloud ICP between submap pairs |
| FrameToFrameLoopClosure | mola::FrameToFrameLoopClosure |
GNSS-augmented datasets or quick re-optimisation; runs frame-to-frame ICP with a GNC graph optimizer |
CLI usage
# SimplemapLoopClosure (default algorithm):
mola-sm-lc-cli -i in.simplemap -o out.simplemap \
-p pipelines/loop-closure-lidar3d-gicp.yaml
# FrameToFrameLoopClosure:
mola-sm-lc-cli -i in.simplemap -o out.simplemap \
-a mola::FrameToFrameLoopClosure \
-p pipelines/loop-closure-f2f-lidar3d-gicp.yaml
Available pipelines
| YAML file | Sensor type | Algorithm |
|---|---|---|
loop-closure-lidar3d-gicp.yaml |
3-D LiDAR (GICP) | SimplemapLoopClosure |
loop-closure-lidar3d-icp.yaml |
3-D LiDAR (point-to-point ICP) | SimplemapLoopClosure |
loop-closure-lidar2d.yaml |
2-D LiDAR | SimplemapLoopClosure |
loop-closure-f2f-lidar3d-gicp.yaml |
3-D LiDAR (GICP) | FrameToFrameLoopClosure |
Key YAML knobs
SimplemapLoopClosure
-
submap_max_absolute_length/submap_min_absolute_length: controls submap granularity. -
assume_planar_world: trueenables annealed soft planar constraints (z, roll, pitch).-
planar_world_initial_sigma_z,planar_world_initial_sigma_ang,planar_world_annealing_rounds: tune the annealing schedule. -
planar_world_hard_flatten: truerestores the old hard-flattening behaviour.
-
-
use_gnss: true/gnss_add_horizontality: true: GNSS-assisted global alignment.-
gnss_factor_strategy: "submap"(default, scalable) or"per_kf"(sensor-pose-aware, larger graph). -
gnss_max_uncertainty_horiz(default20.0m) : reject GPS readings whose horizontal ENU uncertainty (√(σ_E²+σ_N²)) exceeds this threshold. -
gnss_max_uncertainty_vert(default40.0m) : reject GPS readings whose vertical ENU uncertainty (σ_U) exceeds this threshold. - Stats on accepted/rejected GNSS readings are printed at the INFO log level after processing.
-
-
use_imu_gravity: true/imu_gravity_sigma_deg: IMU-derived gravity-alignment factors added in stage 1.
FrameToFrameLoopClosure
-
lc_candidate_strategy:DISTANCE_STRATIFIED(default),PROXIMITY_ONLY, orMULTI_OBJECTIVE. -
assume_planar_world: true: planar-world annealing (subset of SM options; IMU-gravity options are not exposed byFrameToFrameLoopClosure::Parameters). -
use_gnss: true: per-keyframe GNSS factors (FactorGnssEnu).-
gnss_max_uncertainty_horiz(default20.0m) : reject GPS readings whose horizontal ENU uncertainty exceeds this threshold. -
gnss_max_uncertainty_vert(default40.0m) : reject GPS readings whose vertical ENU uncertainty exceeds this threshold.
-
-
manual_loop_constraints: list of hand-specified loop closure edges (by UNIX timestamp pair). Each entry supports:-
timestamp_i,timestamp_j: UNIX timestamps identifying the two keyframes. -
sigma_xyz: positional uncertainty [m]. -
trust_as_inlier(defaultfalse): iftrue, the constraint is added to the GNC set of known inliers and will not be downweighted by the robust optimizer.
-
-
use_kiss_matcher: true: use KISS-Matcher global registration to seed the ICP initial guess for each loop-closure candidate (default:false; requires thethird_party/kiss-matchersubmodule to be populated).-
kiss_matcher_resolution(default1.0m) : voxel size for KISS-Matcher feature extraction; controlsnormal_radius ≈ 3×andfpfh_radius ≈ 5×. -
kiss_matcher_layer(default"points_to_register_points") : name of themp2p_icp::metric_map_tlayer whose points are fed into KISS-Matcher.
-
See the online tutorial for a step-by-step example.
License
Copyright (C) 2018-2026 Jose Luis Blanco jlblanco@ual.es, University of Almeria
This package is released under the GNU GPL v3 license as open source, with the main intention of being useful for research and evaluation purposes. Commercial licenses available upon request.
Contributions require acceptance of the Contributor License Agreement (CLA).
Changelog for package mola_sm_loop_closure
1.3.0 (2026-10-01)
- ci: make scripts/release.py identical across repos by auto-discovering packages
- ci: add GitHub release workflow on version tags
- Merge pull request #25 from MOLAorg/feat/mrpt3
- Declare mrpt_viz as a direct dependency; clang-format test file
- Merge remote-tracking branch 'origin/develop' into feat/mrpt3
- fix: the loop-closure candidate floor rejects real revisits (#24)
- Port to MRPT 3.x: opengl->viz, TCLAP->CLI11, yaml associativity
- Merge pull request #23 from MOLAorg/feat/deterministic-scan
- CI: fail-fast: false, so one broken distro stops masking the others
- docs: the reproducibility guarantee is conditional on the build, say so
- perf: keep candidate parallelism in deterministic scans (92.7 s -> 40 s)
- feat: a [deterministic]{.title-ref} mode that makes a scan reproducible
- fix: listed mrpt::gui as dependency but could be removed
- chore: silent 3rdparty code warnings
- Merge pull request #22 from MOLAorg/feat/lc-analyze-progress-stats
- perf: keep rejected candidates lock-free in parallel analyze()
- feat: report per-scan progress and stats from analyze()
- Merge pull request #21 from MOLAorg/fix/imu-frames-deprecation-warning
- style: apply clang-format after IMU-frames ifdef edit
- fix: silence mola_georeferencing IMU extraction deprecation warning
- Merge pull request #20 from MOLAorg/feat/lc-parallel-icp
- feat: parallel per-candidate ICP in the F2F loop-closure detector
- Merge pull request #19 from MOLAorg/feat/lc-detection-robustness
- fix: gate KISS-Matcher guesses on the final inlier count
- feat: let analyze() callers exclude already-closed pairs from candidates
- fix: skip a failing loop-closure candidate instead of aborting the scan
- dont throw on empty scan frames
- expose MOLA_DESKEW_IGNORE_NO_TIMESTAMPS
- cmake: silent 3rdparty header warnings
- remove leftover mrpt::gui dependency
- Merge pull request #18 from MOLAorg/feat/f2f-use-imu-align
- feat: f2f algo uses imu acc for alignment
- Merge branch 'feat/lc-detector-analyze-api' into develop
- fix: skip observation unload during read-only analyze()
- Merge pull request #17 from MOLAorg/feat/lc-detector-analyze-api
- fix: keep analyze() read-only and leak-free
- fix: guard build_initial_graph against stale graph state
- feat: streaming, incremental and abortable analyze()
- feat: detector-only analyze() API for loop closure
- Contributors: Jose Luis Blanco Claraco, Jose Luis Blanco-Claraco
1.2.2 (2026-06-17)
- update robin and kiss-matcher submodules
- Contributors: Jose Luis Blanco-Claraco
1.2.1 (2026-06-16)
- fix: pmc FTBFS on Debian builds
- docs: add ROS 2 Lyrical badge row, update Rolling to Ubuntu 26.04 (resolute)
- Merge pull request #16 from MOLAorg/feat/assert-degenerated-gps feat: assert on degenerated GNSS data
- docs: update mrpt docs URI
- Contributors: Jose Luis Blanco-Claraco
1.2.0 (2026-05-11)
-
f2f pipeline: switch to multi-objective as default strategy
-
Merge pull request #15 from MOLAorg/simplify-ci CI: simplify clang-format helpers and use ros: docker images for stable builds
-
fix: wrap find -iname predicates in parentheses to scope them to listed dirs Without grouping, the -o operators apply at top level and -print0 only attaches to the last alternative, so files outside the intended directories can be matched.
-
CI: simplify clang-format helpers and use ros: docker images for
File truncated at 100 lines see the full file
Package Dependencies
System Dependencies
Dependant Packages
Launch files
Messages
Services
Plugins
Recent questions tagged mola_sm_loop_closure at Robotics Stack Exchange
|
mola_sm_loop_closure package from mola_sm_loop_closure repomola_sm_loop_closure |
ROS Distro
|
Package Summary
| Version | 1.3.0 |
| License | GPLv3 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/MOLAorg/mola_sm_loop_closure.git |
| VCS Type | git |
| VCS Version | develop |
| Last Updated | 2026-10-01 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Jose-Luis Blanco-Claraco
Authors
- Jose-Luis Blanco-Claraco
mola_sm_loop_closure
Offline loop-closure engine for MOLA CSimpleMap files. Given an input
simplemap produced by any MOLA odometry front-end, the package re-optimises
all keyframe poses by detecting and closing loops, then writes the corrected
simplemap back to disk.
Two algorithms
| Algorithm | Class | Best for |
|---|---|---|
| SimplemapLoopClosure | mola::SimplemapLoopClosure |
Long maps with noticeable drift; groups keyframes into submaps and runs heavy point-cloud ICP between submap pairs |
| FrameToFrameLoopClosure | mola::FrameToFrameLoopClosure |
GNSS-augmented datasets or quick re-optimisation; runs frame-to-frame ICP with a GNC graph optimizer |
CLI usage
# SimplemapLoopClosure (default algorithm):
mola-sm-lc-cli -i in.simplemap -o out.simplemap \
-p pipelines/loop-closure-lidar3d-gicp.yaml
# FrameToFrameLoopClosure:
mola-sm-lc-cli -i in.simplemap -o out.simplemap \
-a mola::FrameToFrameLoopClosure \
-p pipelines/loop-closure-f2f-lidar3d-gicp.yaml
Available pipelines
| YAML file | Sensor type | Algorithm |
|---|---|---|
loop-closure-lidar3d-gicp.yaml |
3-D LiDAR (GICP) | SimplemapLoopClosure |
loop-closure-lidar3d-icp.yaml |
3-D LiDAR (point-to-point ICP) | SimplemapLoopClosure |
loop-closure-lidar2d.yaml |
2-D LiDAR | SimplemapLoopClosure |
loop-closure-f2f-lidar3d-gicp.yaml |
3-D LiDAR (GICP) | FrameToFrameLoopClosure |
Key YAML knobs
SimplemapLoopClosure
-
submap_max_absolute_length/submap_min_absolute_length: controls submap granularity. -
assume_planar_world: trueenables annealed soft planar constraints (z, roll, pitch).-
planar_world_initial_sigma_z,planar_world_initial_sigma_ang,planar_world_annealing_rounds: tune the annealing schedule. -
planar_world_hard_flatten: truerestores the old hard-flattening behaviour.
-
-
use_gnss: true/gnss_add_horizontality: true: GNSS-assisted global alignment.-
gnss_factor_strategy: "submap"(default, scalable) or"per_kf"(sensor-pose-aware, larger graph). -
gnss_max_uncertainty_horiz(default20.0m) : reject GPS readings whose horizontal ENU uncertainty (√(σ_E²+σ_N²)) exceeds this threshold. -
gnss_max_uncertainty_vert(default40.0m) : reject GPS readings whose vertical ENU uncertainty (σ_U) exceeds this threshold. - Stats on accepted/rejected GNSS readings are printed at the INFO log level after processing.
-
-
use_imu_gravity: true/imu_gravity_sigma_deg: IMU-derived gravity-alignment factors added in stage 1.
FrameToFrameLoopClosure
-
lc_candidate_strategy:DISTANCE_STRATIFIED(default),PROXIMITY_ONLY, orMULTI_OBJECTIVE. -
assume_planar_world: true: planar-world annealing (subset of SM options; IMU-gravity options are not exposed byFrameToFrameLoopClosure::Parameters). -
use_gnss: true: per-keyframe GNSS factors (FactorGnssEnu).-
gnss_max_uncertainty_horiz(default20.0m) : reject GPS readings whose horizontal ENU uncertainty exceeds this threshold. -
gnss_max_uncertainty_vert(default40.0m) : reject GPS readings whose vertical ENU uncertainty exceeds this threshold.
-
-
manual_loop_constraints: list of hand-specified loop closure edges (by UNIX timestamp pair). Each entry supports:-
timestamp_i,timestamp_j: UNIX timestamps identifying the two keyframes. -
sigma_xyz: positional uncertainty [m]. -
trust_as_inlier(defaultfalse): iftrue, the constraint is added to the GNC set of known inliers and will not be downweighted by the robust optimizer.
-
-
use_kiss_matcher: true: use KISS-Matcher global registration to seed the ICP initial guess for each loop-closure candidate (default:false; requires thethird_party/kiss-matchersubmodule to be populated).-
kiss_matcher_resolution(default1.0m) : voxel size for KISS-Matcher feature extraction; controlsnormal_radius ≈ 3×andfpfh_radius ≈ 5×. -
kiss_matcher_layer(default"points_to_register_points") : name of themp2p_icp::metric_map_tlayer whose points are fed into KISS-Matcher.
-
See the online tutorial for a step-by-step example.
License
Copyright (C) 2018-2026 Jose Luis Blanco jlblanco@ual.es, University of Almeria
This package is released under the GNU GPL v3 license as open source, with the main intention of being useful for research and evaluation purposes. Commercial licenses available upon request.
Contributions require acceptance of the Contributor License Agreement (CLA).
Changelog for package mola_sm_loop_closure
1.3.0 (2026-10-01)
- ci: make scripts/release.py identical across repos by auto-discovering packages
- ci: add GitHub release workflow on version tags
- Merge pull request #25 from MOLAorg/feat/mrpt3
- Declare mrpt_viz as a direct dependency; clang-format test file
- Merge remote-tracking branch 'origin/develop' into feat/mrpt3
- fix: the loop-closure candidate floor rejects real revisits (#24)
- Port to MRPT 3.x: opengl->viz, TCLAP->CLI11, yaml associativity
- Merge pull request #23 from MOLAorg/feat/deterministic-scan
- CI: fail-fast: false, so one broken distro stops masking the others
- docs: the reproducibility guarantee is conditional on the build, say so
- perf: keep candidate parallelism in deterministic scans (92.7 s -> 40 s)
- feat: a [deterministic]{.title-ref} mode that makes a scan reproducible
- fix: listed mrpt::gui as dependency but could be removed
- chore: silent 3rdparty code warnings
- Merge pull request #22 from MOLAorg/feat/lc-analyze-progress-stats
- perf: keep rejected candidates lock-free in parallel analyze()
- feat: report per-scan progress and stats from analyze()
- Merge pull request #21 from MOLAorg/fix/imu-frames-deprecation-warning
- style: apply clang-format after IMU-frames ifdef edit
- fix: silence mola_georeferencing IMU extraction deprecation warning
- Merge pull request #20 from MOLAorg/feat/lc-parallel-icp
- feat: parallel per-candidate ICP in the F2F loop-closure detector
- Merge pull request #19 from MOLAorg/feat/lc-detection-robustness
- fix: gate KISS-Matcher guesses on the final inlier count
- feat: let analyze() callers exclude already-closed pairs from candidates
- fix: skip a failing loop-closure candidate instead of aborting the scan
- dont throw on empty scan frames
- expose MOLA_DESKEW_IGNORE_NO_TIMESTAMPS
- cmake: silent 3rdparty header warnings
- remove leftover mrpt::gui dependency
- Merge pull request #18 from MOLAorg/feat/f2f-use-imu-align
- feat: f2f algo uses imu acc for alignment
- Merge branch 'feat/lc-detector-analyze-api' into develop
- fix: skip observation unload during read-only analyze()
- Merge pull request #17 from MOLAorg/feat/lc-detector-analyze-api
- fix: keep analyze() read-only and leak-free
- fix: guard build_initial_graph against stale graph state
- feat: streaming, incremental and abortable analyze()
- feat: detector-only analyze() API for loop closure
- Contributors: Jose Luis Blanco Claraco, Jose Luis Blanco-Claraco
1.2.2 (2026-06-17)
- update robin and kiss-matcher submodules
- Contributors: Jose Luis Blanco-Claraco
1.2.1 (2026-06-16)
- fix: pmc FTBFS on Debian builds
- docs: add ROS 2 Lyrical badge row, update Rolling to Ubuntu 26.04 (resolute)
- Merge pull request #16 from MOLAorg/feat/assert-degenerated-gps feat: assert on degenerated GNSS data
- docs: update mrpt docs URI
- Contributors: Jose Luis Blanco-Claraco
1.2.0 (2026-05-11)
-
f2f pipeline: switch to multi-objective as default strategy
-
Merge pull request #15 from MOLAorg/simplify-ci CI: simplify clang-format helpers and use ros: docker images for stable builds
-
fix: wrap find -iname predicates in parentheses to scope them to listed dirs Without grouping, the -o operators apply at top level and -print0 only attaches to the last alternative, so files outside the intended directories can be matched.
-
CI: simplify clang-format helpers and use ros: docker images for
File truncated at 100 lines see the full file