Package symbol

mola_sm_loop_closure package from mola_sm_loop_closure repo

mola_sm_loop_closure

ROS Distro
humble

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

Simplemap loop-closure postprocessing library and CLI tool

Additional Links

Maintainers

  • Jose-Luis Blanco-Claraco

Authors

  • Jose-Luis Blanco-Claraco

CI ROS CI Check clang-format Docs codecov

Distro Build dev Build releases Stable version
ROS 2 Humble (u22.04) Build Status amd64 Build Status
arm64 Build Status
Version
ROS 2 Jazzy @ u24.04 Build Status amd64 Build Status
arm64 Build Status
Version
ROS 2 Kilted @ u24.04 Build Status amd64 Build Status
arm64 Build Status
Version
ROS 2 Lyrical (u26.04) Build Status amd64 Build Status
arm64 Build Status
Version
ROS 2 Rolling (u26.04) Build Status amd64 Build Status
arm64 Build Status
Version

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: true enables 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: true restores 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 (default 20.0 m) : reject GPS readings whose horizontal ENU uncertainty (√(σ_E²+σ_N²)) exceeds this threshold.
    • gnss_max_uncertainty_vert (default 40.0 m) : 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, or MULTI_OBJECTIVE.
  • assume_planar_world: true : planar-world annealing (subset of SM options; IMU-gravity options are not exposed by FrameToFrameLoopClosure::Parameters).
  • use_gnss: true : per-keyframe GNSS factors (FactorGnssEnu).
    • gnss_max_uncertainty_horiz (default 20.0 m) : reject GPS readings whose horizontal ENU uncertainty exceeds this threshold.
    • gnss_max_uncertainty_vert (default 40.0 m) : 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 (default false): if true, 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 the third_party/kiss-matcher submodule to be populated).
    • kiss_matcher_resolution (default 1.0 m) : voxel size for KISS-Matcher feature extraction; controls normal_radius ≈ 3× and fpfh_radius ≈ 5×.
    • kiss_matcher_layer (default "points_to_register_points") : name of the mp2p_icp::metric_map_t layer 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

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

Launch files

No launch files found

Messages

No message files found.

Services

No service files found

Plugins

No plugins found.

Recent questions tagged mola_sm_loop_closure at Robotics Stack Exchange

Package symbol

mola_sm_loop_closure package from mola_sm_loop_closure repo

mola_sm_loop_closure

ROS Distro
jazzy

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

Simplemap loop-closure postprocessing library and CLI tool

Additional Links

Maintainers

  • Jose-Luis Blanco-Claraco

Authors

  • Jose-Luis Blanco-Claraco

CI ROS CI Check clang-format Docs codecov

Distro Build dev Build releases Stable version
ROS 2 Humble (u22.04) Build Status amd64 Build Status
arm64 Build Status
Version
ROS 2 Jazzy @ u24.04 Build Status amd64 Build Status
arm64 Build Status
Version
ROS 2 Kilted @ u24.04 Build Status amd64 Build Status
arm64 Build Status
Version
ROS 2 Lyrical (u26.04) Build Status amd64 Build Status
arm64 Build Status
Version
ROS 2 Rolling (u26.04) Build Status amd64 Build Status
arm64 Build Status
Version

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: true enables 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: true restores 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 (default 20.0 m) : reject GPS readings whose horizontal ENU uncertainty (√(σ_E²+σ_N²)) exceeds this threshold.
    • gnss_max_uncertainty_vert (default 40.0 m) : 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, or MULTI_OBJECTIVE.
  • assume_planar_world: true : planar-world annealing (subset of SM options; IMU-gravity options are not exposed by FrameToFrameLoopClosure::Parameters).
  • use_gnss: true : per-keyframe GNSS factors (FactorGnssEnu).
    • gnss_max_uncertainty_horiz (default 20.0 m) : reject GPS readings whose horizontal ENU uncertainty exceeds this threshold.
    • gnss_max_uncertainty_vert (default 40.0 m) : 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 (default false): if true, 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 the third_party/kiss-matcher submodule to be populated).
    • kiss_matcher_resolution (default 1.0 m) : voxel size for KISS-Matcher feature extraction; controls normal_radius ≈ 3× and fpfh_radius ≈ 5×.
    • kiss_matcher_layer (default "points_to_register_points") : name of the mp2p_icp::metric_map_t layer 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

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

Launch files

No launch files found

Messages

No message files found.

Services

No service files found

Plugins

No plugins found.

Recent questions tagged mola_sm_loop_closure at Robotics Stack Exchange

Package symbol

mola_sm_loop_closure package from mola_sm_loop_closure repo

mola_sm_loop_closure

ROS Distro
kilted

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

Simplemap loop-closure postprocessing library and CLI tool

Additional Links

Maintainers

  • Jose-Luis Blanco-Claraco

Authors

  • Jose-Luis Blanco-Claraco

CI ROS CI Check clang-format Docs codecov

Distro Build dev Build releases Stable version
ROS 2 Humble (u22.04) Build Status amd64 Build Status
arm64 Build Status
Version
ROS 2 Jazzy @ u24.04 Build Status amd64 Build Status
arm64 Build Status
Version
ROS 2 Kilted @ u24.04 Build Status amd64 Build Status
arm64 Build Status
Version
ROS 2 Lyrical (u26.04) Build Status amd64 Build Status
arm64 Build Status
Version
ROS 2 Rolling (u26.04) Build Status amd64 Build Status
arm64 Build Status
Version

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: true enables 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: true restores 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 (default 20.0 m) : reject GPS readings whose horizontal ENU uncertainty (√(σ_E²+σ_N²)) exceeds this threshold.
    • gnss_max_uncertainty_vert (default 40.0 m) : 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, or MULTI_OBJECTIVE.
  • assume_planar_world: true : planar-world annealing (subset of SM options; IMU-gravity options are not exposed by FrameToFrameLoopClosure::Parameters).
  • use_gnss: true : per-keyframe GNSS factors (FactorGnssEnu).
    • gnss_max_uncertainty_horiz (default 20.0 m) : reject GPS readings whose horizontal ENU uncertainty exceeds this threshold.
    • gnss_max_uncertainty_vert (default 40.0 m) : 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 (default false): if true, 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 the third_party/kiss-matcher submodule to be populated).
    • kiss_matcher_resolution (default 1.0 m) : voxel size for KISS-Matcher feature extraction; controls normal_radius ≈ 3× and fpfh_radius ≈ 5×.
    • kiss_matcher_layer (default "points_to_register_points") : name of the mp2p_icp::metric_map_t layer 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

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

Launch files

No launch files found

Messages

No message files found.

Services

No service files found

Plugins

No plugins found.

Recent questions tagged mola_sm_loop_closure at Robotics Stack Exchange

Package symbol

mola_sm_loop_closure package from mola_sm_loop_closure repo

mola_sm_loop_closure

ROS Distro
lyrical

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

Simplemap loop-closure postprocessing library and CLI tool

Additional Links

Maintainers

  • Jose-Luis Blanco-Claraco

Authors

  • Jose-Luis Blanco-Claraco

CI ROS CI Check clang-format Docs codecov

Distro Build dev Build releases Stable version
ROS 2 Humble (u22.04) Build Status amd64 Build Status
arm64 Build Status
Version
ROS 2 Jazzy @ u24.04 Build Status amd64 Build Status
arm64 Build Status
Version
ROS 2 Kilted @ u24.04 Build Status amd64 Build Status
arm64 Build Status
Version
ROS 2 Lyrical (u26.04) Build Status amd64 Build Status
arm64 Build Status
Version
ROS 2 Rolling (u26.04) Build Status amd64 Build Status
arm64 Build Status
Version

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: true enables 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: true restores 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 (default 20.0 m) : reject GPS readings whose horizontal ENU uncertainty (√(σ_E²+σ_N²)) exceeds this threshold.
    • gnss_max_uncertainty_vert (default 40.0 m) : 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, or MULTI_OBJECTIVE.
  • assume_planar_world: true : planar-world annealing (subset of SM options; IMU-gravity options are not exposed by FrameToFrameLoopClosure::Parameters).
  • use_gnss: true : per-keyframe GNSS factors (FactorGnssEnu).
    • gnss_max_uncertainty_horiz (default 20.0 m) : reject GPS readings whose horizontal ENU uncertainty exceeds this threshold.
    • gnss_max_uncertainty_vert (default 40.0 m) : 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 (default false): if true, 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 the third_party/kiss-matcher submodule to be populated).
    • kiss_matcher_resolution (default 1.0 m) : voxel size for KISS-Matcher feature extraction; controls normal_radius ≈ 3× and fpfh_radius ≈ 5×.
    • kiss_matcher_layer (default "points_to_register_points") : name of the mp2p_icp::metric_map_t layer 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

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

Launch files

No launch files found

Messages

No message files found.

Services

No service files found

Plugins

No plugins found.

Recent questions tagged mola_sm_loop_closure at Robotics Stack Exchange

Package symbol

mola_sm_loop_closure package from mola_sm_loop_closure repo

mola_sm_loop_closure

ROS Distro
rolling

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

Simplemap loop-closure postprocessing library and CLI tool

Additional Links

Maintainers

  • Jose-Luis Blanco-Claraco

Authors

  • Jose-Luis Blanco-Claraco

CI ROS CI Check clang-format Docs codecov

Distro Build dev Build releases Stable version
ROS 2 Humble (u22.04) Build Status amd64 Build Status
arm64 Build Status
Version
ROS 2 Jazzy @ u24.04 Build Status amd64 Build Status
arm64 Build Status
Version
ROS 2 Kilted @ u24.04 Build Status amd64 Build Status
arm64 Build Status
Version
ROS 2 Lyrical (u26.04) Build Status amd64 Build Status
arm64 Build Status
Version
ROS 2 Rolling (u26.04) Build Status amd64 Build Status
arm64 Build Status
Version

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: true enables 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: true restores 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 (default 20.0 m) : reject GPS readings whose horizontal ENU uncertainty (√(σ_E²+σ_N²)) exceeds this threshold.
    • gnss_max_uncertainty_vert (default 40.0 m) : 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, or MULTI_OBJECTIVE.
  • assume_planar_world: true : planar-world annealing (subset of SM options; IMU-gravity options are not exposed by FrameToFrameLoopClosure::Parameters).
  • use_gnss: true : per-keyframe GNSS factors (FactorGnssEnu).
    • gnss_max_uncertainty_horiz (default 20.0 m) : reject GPS readings whose horizontal ENU uncertainty exceeds this threshold.
    • gnss_max_uncertainty_vert (default 40.0 m) : 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 (default false): if true, 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 the third_party/kiss-matcher submodule to be populated).
    • kiss_matcher_resolution (default 1.0 m) : voxel size for KISS-Matcher feature extraction; controls normal_radius ≈ 3× and fpfh_radius ≈ 5×.
    • kiss_matcher_layer (default "points_to_register_points") : name of the mp2p_icp::metric_map_t layer 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

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

Launch files

No launch files found

Messages

No message files found.

Services

No service files found

Plugins

No plugins found.

Recent questions tagged mola_sm_loop_closure at Robotics Stack Exchange

No version for distro ardent showing humble. Known supported distros are highlighted in the buttons above.
Package symbol

mola_sm_loop_closure package from mola_sm_loop_closure repo

mola_sm_loop_closure

ROS Distro
humble

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

Simplemap loop-closure postprocessing library and CLI tool

Additional Links

Maintainers

  • Jose-Luis Blanco-Claraco

Authors

  • Jose-Luis Blanco-Claraco

CI ROS CI Check clang-format Docs codecov

Distro Build dev Build releases Stable version
ROS 2 Humble (u22.04) Build Status amd64 Build Status
arm64 Build Status
Version
ROS 2 Jazzy @ u24.04 Build Status amd64 Build Status
arm64 Build Status
Version
ROS 2 Kilted @ u24.04 Build Status amd64 Build Status
arm64 Build Status
Version
ROS 2 Lyrical (u26.04) Build Status amd64 Build Status
arm64 Build Status
Version
ROS 2 Rolling (u26.04) Build Status amd64 Build Status
arm64 Build Status
Version

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: true enables 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: true restores 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 (default 20.0 m) : reject GPS readings whose horizontal ENU uncertainty (√(σ_E²+σ_N²)) exceeds this threshold.
    • gnss_max_uncertainty_vert (default 40.0 m) : 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, or MULTI_OBJECTIVE.
  • assume_planar_world: true : planar-world annealing (subset of SM options; IMU-gravity options are not exposed by FrameToFrameLoopClosure::Parameters).
  • use_gnss: true : per-keyframe GNSS factors (FactorGnssEnu).
    • gnss_max_uncertainty_horiz (default 20.0 m) : reject GPS readings whose horizontal ENU uncertainty exceeds this threshold.
    • gnss_max_uncertainty_vert (default 40.0 m) : 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 (default false): if true, 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 the third_party/kiss-matcher submodule to be populated).
    • kiss_matcher_resolution (default 1.0 m) : voxel size for KISS-Matcher feature extraction; controls normal_radius ≈ 3× and fpfh_radius ≈ 5×.
    • kiss_matcher_layer (default "points_to_register_points") : name of the mp2p_icp::metric_map_t layer 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

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

Launch files

No launch files found

Messages

No message files found.

Services

No service files found

Plugins

No plugins found.

Recent questions tagged mola_sm_loop_closure at Robotics Stack Exchange

No version for distro bouncy showing humble. Known supported distros are highlighted in the buttons above.
Package symbol

mola_sm_loop_closure package from mola_sm_loop_closure repo

mola_sm_loop_closure

ROS Distro
humble

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

Simplemap loop-closure postprocessing library and CLI tool

Additional Links

Maintainers

  • Jose-Luis Blanco-Claraco

Authors

  • Jose-Luis Blanco-Claraco

CI ROS CI Check clang-format Docs codecov

Distro Build dev Build releases Stable version
ROS 2 Humble (u22.04) Build Status amd64 Build Status
arm64 Build Status
Version
ROS 2 Jazzy @ u24.04 Build Status amd64 Build Status
arm64 Build Status
Version
ROS 2 Kilted @ u24.04 Build Status amd64 Build Status
arm64 Build Status
Version
ROS 2 Lyrical (u26.04) Build Status amd64 Build Status
arm64 Build Status
Version
ROS 2 Rolling (u26.04) Build Status amd64 Build Status
arm64 Build Status
Version

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: true enables 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: true restores 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 (default 20.0 m) : reject GPS readings whose horizontal ENU uncertainty (√(σ_E²+σ_N²)) exceeds this threshold.
    • gnss_max_uncertainty_vert (default 40.0 m) : 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, or MULTI_OBJECTIVE.
  • assume_planar_world: true : planar-world annealing (subset of SM options; IMU-gravity options are not exposed by FrameToFrameLoopClosure::Parameters).
  • use_gnss: true : per-keyframe GNSS factors (FactorGnssEnu).
    • gnss_max_uncertainty_horiz (default 20.0 m) : reject GPS readings whose horizontal ENU uncertainty exceeds this threshold.
    • gnss_max_uncertainty_vert (default 40.0 m) : 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 (default false): if true, 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 the third_party/kiss-matcher submodule to be populated).
    • kiss_matcher_resolution (default 1.0 m) : voxel size for KISS-Matcher feature extraction; controls normal_radius ≈ 3× and fpfh_radius ≈ 5×.
    • kiss_matcher_layer (default "points_to_register_points") : name of the mp2p_icp::metric_map_t layer 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

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

Launch files

No launch files found

Messages

No message files found.

Services

No service files found

Plugins

No plugins found.

Recent questions tagged mola_sm_loop_closure at Robotics Stack Exchange

No version for distro crystal showing humble. Known supported distros are highlighted in the buttons above.
Package symbol

mola_sm_loop_closure package from mola_sm_loop_closure repo

mola_sm_loop_closure

ROS Distro
humble

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

Simplemap loop-closure postprocessing library and CLI tool

Additional Links

Maintainers

  • Jose-Luis Blanco-Claraco

Authors

  • Jose-Luis Blanco-Claraco

CI ROS CI Check clang-format Docs codecov

Distro Build dev Build releases Stable version
ROS 2 Humble (u22.04) Build Status amd64 Build Status
arm64 Build Status
Version
ROS 2 Jazzy @ u24.04 Build Status amd64 Build Status
arm64 Build Status
Version
ROS 2 Kilted @ u24.04 Build Status amd64 Build Status
arm64 Build Status
Version
ROS 2 Lyrical (u26.04) Build Status amd64 Build Status
arm64 Build Status
Version
ROS 2 Rolling (u26.04) Build Status amd64 Build Status
arm64 Build Status
Version

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: true enables 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: true restores 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 (default 20.0 m) : reject GPS readings whose horizontal ENU uncertainty (√(σ_E²+σ_N²)) exceeds this threshold.
    • gnss_max_uncertainty_vert (default 40.0 m) : 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, or MULTI_OBJECTIVE.
  • assume_planar_world: true : planar-world annealing (subset of SM options; IMU-gravity options are not exposed by FrameToFrameLoopClosure::Parameters).
  • use_gnss: true : per-keyframe GNSS factors (FactorGnssEnu).
    • gnss_max_uncertainty_horiz (default 20.0 m) : reject GPS readings whose horizontal ENU uncertainty exceeds this threshold.
    • gnss_max_uncertainty_vert (default 40.0 m) : 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 (default false): if true, 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 the third_party/kiss-matcher submodule to be populated).
    • kiss_matcher_resolution (default 1.0 m) : voxel size for KISS-Matcher feature extraction; controls normal_radius ≈ 3× and fpfh_radius ≈ 5×.
    • kiss_matcher_layer (default "points_to_register_points") : name of the mp2p_icp::metric_map_t layer 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

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

Launch files

No launch files found

Messages

No message files found.

Services

No service files found

Plugins

No plugins found.

Recent questions tagged mola_sm_loop_closure at Robotics Stack Exchange

No version for distro eloquent showing humble. Known supported distros are highlighted in the buttons above.
Package symbol

mola_sm_loop_closure package from mola_sm_loop_closure repo

mola_sm_loop_closure

ROS Distro
humble

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

Simplemap loop-closure postprocessing library and CLI tool

Additional Links

Maintainers

  • Jose-Luis Blanco-Claraco

Authors

  • Jose-Luis Blanco-Claraco

CI ROS CI Check clang-format Docs codecov

Distro Build dev Build releases Stable version
ROS 2 Humble (u22.04) Build Status amd64 Build Status
arm64 Build Status
Version
ROS 2 Jazzy @ u24.04 Build Status amd64 Build Status
arm64 Build Status
Version
ROS 2 Kilted @ u24.04 Build Status amd64 Build Status
arm64 Build Status
Version
ROS 2 Lyrical (u26.04) Build Status amd64 Build Status
arm64 Build Status
Version
ROS 2 Rolling (u26.04) Build Status amd64 Build Status
arm64 Build Status
Version

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: true enables 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: true restores 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 (default 20.0 m) : reject GPS readings whose horizontal ENU uncertainty (√(σ_E²+σ_N²)) exceeds this threshold.
    • gnss_max_uncertainty_vert (default 40.0 m) : 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, or MULTI_OBJECTIVE.
  • assume_planar_world: true : planar-world annealing (subset of SM options; IMU-gravity options are not exposed by FrameToFrameLoopClosure::Parameters).
  • use_gnss: true : per-keyframe GNSS factors (FactorGnssEnu).
    • gnss_max_uncertainty_horiz (default 20.0 m) : reject GPS readings whose horizontal ENU uncertainty exceeds this threshold.
    • gnss_max_uncertainty_vert (default 40.0 m) : 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 (default false): if true, 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 the third_party/kiss-matcher submodule to be populated).
    • kiss_matcher_resolution (default 1.0 m) : voxel size for KISS-Matcher feature extraction; controls normal_radius ≈ 3× and fpfh_radius ≈ 5×.
    • kiss_matcher_layer (default "points_to_register_points") : name of the mp2p_icp::metric_map_t layer 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

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

Launch files

No launch files found

Messages

No message files found.

Services

No service files found

Plugins

No plugins found.

Recent questions tagged mola_sm_loop_closure at Robotics Stack Exchange

No version for distro dashing showing humble. Known supported distros are highlighted in the buttons above.
Package symbol

mola_sm_loop_closure package from mola_sm_loop_closure repo

mola_sm_loop_closure

ROS Distro
humble

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

Simplemap loop-closure postprocessing library and CLI tool

Additional Links

Maintainers

  • Jose-Luis Blanco-Claraco

Authors

  • Jose-Luis Blanco-Claraco

CI ROS CI Check clang-format Docs codecov

Distro Build dev Build releases Stable version
ROS 2 Humble (u22.04) Build Status amd64 Build Status
arm64 Build Status
Version
ROS 2 Jazzy @ u24.04 Build Status amd64 Build Status
arm64 Build Status
Version
ROS 2 Kilted @ u24.04 Build Status amd64 Build Status
arm64 Build Status
Version
ROS 2 Lyrical (u26.04) Build Status amd64 Build Status
arm64 Build Status
Version
ROS 2 Rolling (u26.04) Build Status amd64 Build Status
arm64 Build Status
Version

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: true enables 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: true restores 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 (default 20.0 m) : reject GPS readings whose horizontal ENU uncertainty (√(σ_E²+σ_N²)) exceeds this threshold.
    • gnss_max_uncertainty_vert (default 40.0 m) : 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, or MULTI_OBJECTIVE.
  • assume_planar_world: true : planar-world annealing (subset of SM options; IMU-gravity options are not exposed by FrameToFrameLoopClosure::Parameters).
  • use_gnss: true : per-keyframe GNSS factors (FactorGnssEnu).
    • gnss_max_uncertainty_horiz (default 20.0 m) : reject GPS readings whose horizontal ENU uncertainty exceeds this threshold.
    • gnss_max_uncertainty_vert (default 40.0 m) : 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 (default false): if true, 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 the third_party/kiss-matcher submodule to be populated).
    • kiss_matcher_resolution (default 1.0 m) : voxel size for KISS-Matcher feature extraction; controls normal_radius ≈ 3× and fpfh_radius ≈ 5×.
    • kiss_matcher_layer (default "points_to_register_points") : name of the mp2p_icp::metric_map_t layer 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

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

Launch files

No launch files found

Messages

No message files found.

Services

No service files found

Plugins

No plugins found.

Recent questions tagged mola_sm_loop_closure at Robotics Stack Exchange

No version for distro galactic showing humble. Known supported distros are highlighted in the buttons above.
Package symbol

mola_sm_loop_closure package from mola_sm_loop_closure repo

mola_sm_loop_closure

ROS Distro
humble

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

Simplemap loop-closure postprocessing library and CLI tool

Additional Links

Maintainers

  • Jose-Luis Blanco-Claraco

Authors

  • Jose-Luis Blanco-Claraco

CI ROS CI Check clang-format Docs codecov

Distro Build dev Build releases Stable version
ROS 2 Humble (u22.04) Build Status amd64 Build Status
arm64 Build Status
Version
ROS 2 Jazzy @ u24.04 Build Status amd64 Build Status
arm64 Build Status
Version
ROS 2 Kilted @ u24.04 Build Status amd64 Build Status
arm64 Build Status
Version
ROS 2 Lyrical (u26.04) Build Status amd64 Build Status
arm64 Build Status
Version
ROS 2 Rolling (u26.04) Build Status amd64 Build Status
arm64 Build Status
Version

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: true enables 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: true restores 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 (default 20.0 m) : reject GPS readings whose horizontal ENU uncertainty (√(σ_E²+σ_N²)) exceeds this threshold.
    • gnss_max_uncertainty_vert (default 40.0 m) : 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, or MULTI_OBJECTIVE.
  • assume_planar_world: true : planar-world annealing (subset of SM options; IMU-gravity options are not exposed by FrameToFrameLoopClosure::Parameters).
  • use_gnss: true : per-keyframe GNSS factors (FactorGnssEnu).
    • gnss_max_uncertainty_horiz (default 20.0 m) : reject GPS readings whose horizontal ENU uncertainty exceeds this threshold.
    • gnss_max_uncertainty_vert (default 40.0 m) : 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 (default false): if true, 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 the third_party/kiss-matcher submodule to be populated).
    • kiss_matcher_resolution (default 1.0 m) : voxel size for KISS-Matcher feature extraction; controls normal_radius ≈ 3× and fpfh_radius ≈ 5×.
    • kiss_matcher_layer (default "points_to_register_points") : name of the mp2p_icp::metric_map_t layer 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

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

Launch files

No launch files found

Messages

No message files found.

Services

No service files found

Plugins

No plugins found.

Recent questions tagged mola_sm_loop_closure at Robotics Stack Exchange

No version for distro foxy showing humble. Known supported distros are highlighted in the buttons above.
Package symbol

mola_sm_loop_closure package from mola_sm_loop_closure repo

mola_sm_loop_closure

ROS Distro
humble

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

Simplemap loop-closure postprocessing library and CLI tool

Additional Links

Maintainers

  • Jose-Luis Blanco-Claraco

Authors

  • Jose-Luis Blanco-Claraco

CI ROS CI Check clang-format Docs codecov

Distro Build dev Build releases Stable version
ROS 2 Humble (u22.04) Build Status amd64 Build Status
arm64 Build Status
Version
ROS 2 Jazzy @ u24.04 Build Status amd64 Build Status
arm64 Build Status
Version
ROS 2 Kilted @ u24.04 Build Status amd64 Build Status
arm64 Build Status
Version
ROS 2 Lyrical (u26.04) Build Status amd64 Build Status
arm64 Build Status
Version
ROS 2 Rolling (u26.04) Build Status amd64 Build Status
arm64 Build Status
Version

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: true enables 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: true restores 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 (default 20.0 m) : reject GPS readings whose horizontal ENU uncertainty (√(σ_E²+σ_N²)) exceeds this threshold.
    • gnss_max_uncertainty_vert (default 40.0 m) : 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, or MULTI_OBJECTIVE.
  • assume_planar_world: true : planar-world annealing (subset of SM options; IMU-gravity options are not exposed by FrameToFrameLoopClosure::Parameters).
  • use_gnss: true : per-keyframe GNSS factors (FactorGnssEnu).
    • gnss_max_uncertainty_horiz (default 20.0 m) : reject GPS readings whose horizontal ENU uncertainty exceeds this threshold.
    • gnss_max_uncertainty_vert (default 40.0 m) : 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 (default false): if true, 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 the third_party/kiss-matcher submodule to be populated).
    • kiss_matcher_resolution (default 1.0 m) : voxel size for KISS-Matcher feature extraction; controls normal_radius ≈ 3× and fpfh_radius ≈ 5×.
    • kiss_matcher_layer (default "points_to_register_points") : name of the mp2p_icp::metric_map_t layer 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

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

Launch files

No launch files found

Messages

No message files found.

Services

No service files found

Plugins

No plugins found.

Recent questions tagged mola_sm_loop_closure at Robotics Stack Exchange

No version for distro iron showing humble. Known supported distros are highlighted in the buttons above.
Package symbol

mola_sm_loop_closure package from mola_sm_loop_closure repo

mola_sm_loop_closure

ROS Distro
humble

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

Simplemap loop-closure postprocessing library and CLI tool

Additional Links

Maintainers

  • Jose-Luis Blanco-Claraco

Authors

  • Jose-Luis Blanco-Claraco

CI ROS CI Check clang-format Docs codecov

Distro Build dev Build releases Stable version
ROS 2 Humble (u22.04) Build Status amd64 Build Status
arm64 Build Status
Version
ROS 2 Jazzy @ u24.04 Build Status amd64 Build Status
arm64 Build Status
Version
ROS 2 Kilted @ u24.04 Build Status amd64 Build Status
arm64 Build Status
Version
ROS 2 Lyrical (u26.04) Build Status amd64 Build Status
arm64 Build Status
Version
ROS 2 Rolling (u26.04) Build Status amd64 Build Status
arm64 Build Status
Version

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: true enables 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: true restores 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 (default 20.0 m) : reject GPS readings whose horizontal ENU uncertainty (√(σ_E²+σ_N²)) exceeds this threshold.
    • gnss_max_uncertainty_vert (default 40.0 m) : 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, or MULTI_OBJECTIVE.
  • assume_planar_world: true : planar-world annealing (subset of SM options; IMU-gravity options are not exposed by FrameToFrameLoopClosure::Parameters).
  • use_gnss: true : per-keyframe GNSS factors (FactorGnssEnu).
    • gnss_max_uncertainty_horiz (default 20.0 m) : reject GPS readings whose horizontal ENU uncertainty exceeds this threshold.
    • gnss_max_uncertainty_vert (default 40.0 m) : 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 (default false): if true, 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 the third_party/kiss-matcher submodule to be populated).
    • kiss_matcher_resolution (default 1.0 m) : voxel size for KISS-Matcher feature extraction; controls normal_radius ≈ 3× and fpfh_radius ≈ 5×.
    • kiss_matcher_layer (default "points_to_register_points") : name of the mp2p_icp::metric_map_t layer 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

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

Launch files

No launch files found

Messages

No message files found.

Services

No service files found

Plugins

No plugins found.

Recent questions tagged mola_sm_loop_closure at Robotics Stack Exchange

No version for distro lunar showing humble. Known supported distros are highlighted in the buttons above.
Package symbol

mola_sm_loop_closure package from mola_sm_loop_closure repo

mola_sm_loop_closure

ROS Distro
humble

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

Simplemap loop-closure postprocessing library and CLI tool

Additional Links

Maintainers

  • Jose-Luis Blanco-Claraco

Authors

  • Jose-Luis Blanco-Claraco

CI ROS CI Check clang-format Docs codecov

Distro Build dev Build releases Stable version
ROS 2 Humble (u22.04) Build Status amd64 Build Status
arm64 Build Status
Version
ROS 2 Jazzy @ u24.04 Build Status amd64 Build Status
arm64 Build Status
Version
ROS 2 Kilted @ u24.04 Build Status amd64 Build Status
arm64 Build Status
Version
ROS 2 Lyrical (u26.04) Build Status amd64 Build Status
arm64 Build Status
Version
ROS 2 Rolling (u26.04) Build Status amd64 Build Status
arm64 Build Status
Version

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: true enables 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: true restores 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 (default 20.0 m) : reject GPS readings whose horizontal ENU uncertainty (√(σ_E²+σ_N²)) exceeds this threshold.
    • gnss_max_uncertainty_vert (default 40.0 m) : 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, or MULTI_OBJECTIVE.
  • assume_planar_world: true : planar-world annealing (subset of SM options; IMU-gravity options are not exposed by FrameToFrameLoopClosure::Parameters).
  • use_gnss: true : per-keyframe GNSS factors (FactorGnssEnu).
    • gnss_max_uncertainty_horiz (default 20.0 m) : reject GPS readings whose horizontal ENU uncertainty exceeds this threshold.
    • gnss_max_uncertainty_vert (default 40.0 m) : 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 (default false): if true, 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 the third_party/kiss-matcher submodule to be populated).
    • kiss_matcher_resolution (default 1.0 m) : voxel size for KISS-Matcher feature extraction; controls normal_radius ≈ 3× and fpfh_radius ≈ 5×.
    • kiss_matcher_layer (default "points_to_register_points") : name of the mp2p_icp::metric_map_t layer 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

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

Launch files

No launch files found

Messages

No message files found.

Services

No service files found

Plugins

No plugins found.

Recent questions tagged mola_sm_loop_closure at Robotics Stack Exchange

No version for distro jade showing humble. Known supported distros are highlighted in the buttons above.
Package symbol

mola_sm_loop_closure package from mola_sm_loop_closure repo

mola_sm_loop_closure

ROS Distro
humble

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

Simplemap loop-closure postprocessing library and CLI tool

Additional Links

Maintainers

  • Jose-Luis Blanco-Claraco

Authors

  • Jose-Luis Blanco-Claraco

CI ROS CI Check clang-format Docs codecov

Distro Build dev Build releases Stable version
ROS 2 Humble (u22.04) Build Status amd64 Build Status
arm64 Build Status
Version
ROS 2 Jazzy @ u24.04 Build Status amd64 Build Status
arm64 Build Status
Version
ROS 2 Kilted @ u24.04 Build Status amd64 Build Status
arm64 Build Status
Version
ROS 2 Lyrical (u26.04) Build Status amd64 Build Status
arm64 Build Status
Version
ROS 2 Rolling (u26.04) Build Status amd64 Build Status
arm64 Build Status
Version

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: true enables 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: true restores 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 (default 20.0 m) : reject GPS readings whose horizontal ENU uncertainty (√(σ_E²+σ_N²)) exceeds this threshold.
    • gnss_max_uncertainty_vert (default 40.0 m) : 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, or MULTI_OBJECTIVE.
  • assume_planar_world: true : planar-world annealing (subset of SM options; IMU-gravity options are not exposed by FrameToFrameLoopClosure::Parameters).
  • use_gnss: true : per-keyframe GNSS factors (FactorGnssEnu).
    • gnss_max_uncertainty_horiz (default 20.0 m) : reject GPS readings whose horizontal ENU uncertainty exceeds this threshold.
    • gnss_max_uncertainty_vert (default 40.0 m) : 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 (default false): if true, 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 the third_party/kiss-matcher submodule to be populated).
    • kiss_matcher_resolution (default 1.0 m) : voxel size for KISS-Matcher feature extraction; controls normal_radius ≈ 3× and fpfh_radius ≈ 5×.
    • kiss_matcher_layer (default "points_to_register_points") : name of the mp2p_icp::metric_map_t layer 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

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

Launch files

No launch files found

Messages

No message files found.

Services

No service files found

Plugins

No plugins found.

Recent questions tagged mola_sm_loop_closure at Robotics Stack Exchange

No version for distro indigo showing humble. Known supported distros are highlighted in the buttons above.
Package symbol

mola_sm_loop_closure package from mola_sm_loop_closure repo

mola_sm_loop_closure

ROS Distro
humble

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

Simplemap loop-closure postprocessing library and CLI tool

Additional Links

Maintainers

  • Jose-Luis Blanco-Claraco

Authors

  • Jose-Luis Blanco-Claraco

CI ROS CI Check clang-format Docs codecov

Distro Build dev Build releases Stable version
ROS 2 Humble (u22.04) Build Status amd64 Build Status
arm64 Build Status
Version
ROS 2 Jazzy @ u24.04 Build Status amd64 Build Status
arm64 Build Status
Version
ROS 2 Kilted @ u24.04 Build Status amd64 Build Status
arm64 Build Status
Version
ROS 2 Lyrical (u26.04) Build Status amd64 Build Status
arm64 Build Status
Version
ROS 2 Rolling (u26.04) Build Status amd64 Build Status
arm64 Build Status
Version

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: true enables 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: true restores 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 (default 20.0 m) : reject GPS readings whose horizontal ENU uncertainty (√(σ_E²+σ_N²)) exceeds this threshold.
    • gnss_max_uncertainty_vert (default 40.0 m) : 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, or MULTI_OBJECTIVE.
  • assume_planar_world: true : planar-world annealing (subset of SM options; IMU-gravity options are not exposed by FrameToFrameLoopClosure::Parameters).
  • use_gnss: true : per-keyframe GNSS factors (FactorGnssEnu).
    • gnss_max_uncertainty_horiz (default 20.0 m) : reject GPS readings whose horizontal ENU uncertainty exceeds this threshold.
    • gnss_max_uncertainty_vert (default 40.0 m) : 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 (default false): if true, 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 the third_party/kiss-matcher submodule to be populated).
    • kiss_matcher_resolution (default 1.0 m) : voxel size for KISS-Matcher feature extraction; controls normal_radius ≈ 3× and fpfh_radius ≈ 5×.
    • kiss_matcher_layer (default "points_to_register_points") : name of the mp2p_icp::metric_map_t layer 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

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

Launch files

No launch files found

Messages

No message files found.

Services

No service files found

Plugins

No plugins found.

Recent questions tagged mola_sm_loop_closure at Robotics Stack Exchange

No version for distro hydro showing humble. Known supported distros are highlighted in the buttons above.
Package symbol

mola_sm_loop_closure package from mola_sm_loop_closure repo

mola_sm_loop_closure

ROS Distro
humble

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

Simplemap loop-closure postprocessing library and CLI tool

Additional Links

Maintainers

  • Jose-Luis Blanco-Claraco

Authors

  • Jose-Luis Blanco-Claraco

CI ROS CI Check clang-format Docs codecov

Distro Build dev Build releases Stable version
ROS 2 Humble (u22.04) Build Status amd64 Build Status
arm64 Build Status
Version
ROS 2 Jazzy @ u24.04 Build Status amd64 Build Status
arm64 Build Status
Version
ROS 2 Kilted @ u24.04 Build Status amd64 Build Status
arm64 Build Status
Version
ROS 2 Lyrical (u26.04) Build Status amd64 Build Status
arm64 Build Status
Version
ROS 2 Rolling (u26.04) Build Status amd64 Build Status
arm64 Build Status
Version

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: true enables 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: true restores 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 (default 20.0 m) : reject GPS readings whose horizontal ENU uncertainty (√(σ_E²+σ_N²)) exceeds this threshold.
    • gnss_max_uncertainty_vert (default 40.0 m) : 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, or MULTI_OBJECTIVE.
  • assume_planar_world: true : planar-world annealing (subset of SM options; IMU-gravity options are not exposed by FrameToFrameLoopClosure::Parameters).
  • use_gnss: true : per-keyframe GNSS factors (FactorGnssEnu).
    • gnss_max_uncertainty_horiz (default 20.0 m) : reject GPS readings whose horizontal ENU uncertainty exceeds this threshold.
    • gnss_max_uncertainty_vert (default 40.0 m) : 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 (default false): if true, 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 the third_party/kiss-matcher submodule to be populated).
    • kiss_matcher_resolution (default 1.0 m) : voxel size for KISS-Matcher feature extraction; controls normal_radius ≈ 3× and fpfh_radius ≈ 5×.
    • kiss_matcher_layer (default "points_to_register_points") : name of the mp2p_icp::metric_map_t layer 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

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

Launch files

No launch files found

Messages

No message files found.

Services

No service files found

Plugins

No plugins found.

Recent questions tagged mola_sm_loop_closure at Robotics Stack Exchange

No version for distro kinetic showing humble. Known supported distros are highlighted in the buttons above.
Package symbol

mola_sm_loop_closure package from mola_sm_loop_closure repo

mola_sm_loop_closure

ROS Distro
humble

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

Simplemap loop-closure postprocessing library and CLI tool

Additional Links

Maintainers

  • Jose-Luis Blanco-Claraco

Authors

  • Jose-Luis Blanco-Claraco

CI ROS CI Check clang-format Docs codecov

Distro Build dev Build releases Stable version
ROS 2 Humble (u22.04) Build Status amd64 Build Status
arm64 Build Status
Version
ROS 2 Jazzy @ u24.04 Build Status amd64 Build Status
arm64 Build Status
Version
ROS 2 Kilted @ u24.04 Build Status amd64 Build Status
arm64 Build Status
Version
ROS 2 Lyrical (u26.04) Build Status amd64 Build Status
arm64 Build Status
Version
ROS 2 Rolling (u26.04) Build Status amd64 Build Status
arm64 Build Status
Version

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: true enables 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: true restores 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 (default 20.0 m) : reject GPS readings whose horizontal ENU uncertainty (√(σ_E²+σ_N²)) exceeds this threshold.
    • gnss_max_uncertainty_vert (default 40.0 m) : 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, or MULTI_OBJECTIVE.
  • assume_planar_world: true : planar-world annealing (subset of SM options; IMU-gravity options are not exposed by FrameToFrameLoopClosure::Parameters).
  • use_gnss: true : per-keyframe GNSS factors (FactorGnssEnu).
    • gnss_max_uncertainty_horiz (default 20.0 m) : reject GPS readings whose horizontal ENU uncertainty exceeds this threshold.
    • gnss_max_uncertainty_vert (default 40.0 m) : 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 (default false): if true, 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 the third_party/kiss-matcher submodule to be populated).
    • kiss_matcher_resolution (default 1.0 m) : voxel size for KISS-Matcher feature extraction; controls normal_radius ≈ 3× and fpfh_radius ≈ 5×.
    • kiss_matcher_layer (default "points_to_register_points") : name of the mp2p_icp::metric_map_t layer 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

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

Launch files

No launch files found

Messages

No message files found.

Services

No service files found

Plugins

No plugins found.

Recent questions tagged mola_sm_loop_closure at Robotics Stack Exchange

No version for distro melodic showing humble. Known supported distros are highlighted in the buttons above.
Package symbol

mola_sm_loop_closure package from mola_sm_loop_closure repo

mola_sm_loop_closure

ROS Distro
humble

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

Simplemap loop-closure postprocessing library and CLI tool

Additional Links

Maintainers

  • Jose-Luis Blanco-Claraco

Authors

  • Jose-Luis Blanco-Claraco

CI ROS CI Check clang-format Docs codecov

Distro Build dev Build releases Stable version
ROS 2 Humble (u22.04) Build Status amd64 Build Status
arm64 Build Status
Version
ROS 2 Jazzy @ u24.04 Build Status amd64 Build Status
arm64 Build Status
Version
ROS 2 Kilted @ u24.04 Build Status amd64 Build Status
arm64 Build Status
Version
ROS 2 Lyrical (u26.04) Build Status amd64 Build Status
arm64 Build Status
Version
ROS 2 Rolling (u26.04) Build Status amd64 Build Status
arm64 Build Status
Version

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: true enables 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: true restores 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 (default 20.0 m) : reject GPS readings whose horizontal ENU uncertainty (√(σ_E²+σ_N²)) exceeds this threshold.
    • gnss_max_uncertainty_vert (default 40.0 m) : 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, or MULTI_OBJECTIVE.
  • assume_planar_world: true : planar-world annealing (subset of SM options; IMU-gravity options are not exposed by FrameToFrameLoopClosure::Parameters).
  • use_gnss: true : per-keyframe GNSS factors (FactorGnssEnu).
    • gnss_max_uncertainty_horiz (default 20.0 m) : reject GPS readings whose horizontal ENU uncertainty exceeds this threshold.
    • gnss_max_uncertainty_vert (default 40.0 m) : 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 (default false): if true, 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 the third_party/kiss-matcher submodule to be populated).
    • kiss_matcher_resolution (default 1.0 m) : voxel size for KISS-Matcher feature extraction; controls normal_radius ≈ 3× and fpfh_radius ≈ 5×.
    • kiss_matcher_layer (default "points_to_register_points") : name of the mp2p_icp::metric_map_t layer 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

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

Launch files

No launch files found

Messages

No message files found.

Services

No service files found

Plugins

No plugins found.

Recent questions tagged mola_sm_loop_closure at Robotics Stack Exchange

No version for distro noetic showing humble. Known supported distros are highlighted in the buttons above.
Package symbol

mola_sm_loop_closure package from mola_sm_loop_closure repo

mola_sm_loop_closure

ROS Distro
humble

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

Simplemap loop-closure postprocessing library and CLI tool

Additional Links

Maintainers

  • Jose-Luis Blanco-Claraco

Authors

  • Jose-Luis Blanco-Claraco

CI ROS CI Check clang-format Docs codecov

Distro Build dev Build releases Stable version
ROS 2 Humble (u22.04) Build Status amd64 Build Status
arm64 Build Status
Version
ROS 2 Jazzy @ u24.04 Build Status amd64 Build Status
arm64 Build Status
Version
ROS 2 Kilted @ u24.04 Build Status amd64 Build Status
arm64 Build Status
Version
ROS 2 Lyrical (u26.04) Build Status amd64 Build Status
arm64 Build Status
Version
ROS 2 Rolling (u26.04) Build Status amd64 Build Status
arm64 Build Status
Version

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: true enables 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: true restores 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 (default 20.0 m) : reject GPS readings whose horizontal ENU uncertainty (√(σ_E²+σ_N²)) exceeds this threshold.
    • gnss_max_uncertainty_vert (default 40.0 m) : 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, or MULTI_OBJECTIVE.
  • assume_planar_world: true : planar-world annealing (subset of SM options; IMU-gravity options are not exposed by FrameToFrameLoopClosure::Parameters).
  • use_gnss: true : per-keyframe GNSS factors (FactorGnssEnu).
    • gnss_max_uncertainty_horiz (default 20.0 m) : reject GPS readings whose horizontal ENU uncertainty exceeds this threshold.
    • gnss_max_uncertainty_vert (default 40.0 m) : 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 (default false): if true, 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 the third_party/kiss-matcher submodule to be populated).
    • kiss_matcher_resolution (default 1.0 m) : voxel size for KISS-Matcher feature extraction; controls normal_radius ≈ 3× and fpfh_radius ≈ 5×.
    • kiss_matcher_layer (default "points_to_register_points") : name of the mp2p_icp::metric_map_t layer 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

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

Launch files

No launch files found

Messages

No message files found.

Services

No service files found

Plugins

No plugins found.

Recent questions tagged mola_sm_loop_closure at Robotics Stack Exchange