map-closures 2.1.0__tar.gz → 2.2.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. {map_closures-2.1.0 → map_closures-2.2.0}/CMakeLists.txt +1 -1
  2. {map_closures-2.1.0 → map_closures-2.2.0}/PKG-INFO +13 -2
  3. {map_closures-2.1.0 → map_closures-2.2.0}/README.md +12 -1
  4. {map_closures-2.1.0 → map_closures-2.2.0}/map_closures/__init__.py +1 -1
  5. map_closures-2.2.0/map_closures/map_closures.py +149 -0
  6. {map_closures-2.1.0 → map_closures-2.2.0}/pyproject.toml +3 -3
  7. map_closures-2.1.0/map_closures/map_closures.py +0 -60
  8. {map_closures-2.1.0 → map_closures-2.2.0}/LICENSE +0 -0
  9. {map_closures-2.1.0 → map_closures-2.2.0}/MANIFEST.in +0 -0
  10. {map_closures-2.1.0 → map_closures-2.2.0}/map_closures/config/__init__.py +0 -0
  11. {map_closures-2.1.0 → map_closures-2.2.0}/map_closures/config/config.py +0 -0
  12. {map_closures-2.1.0 → map_closures-2.2.0}/map_closures/datasets/__init__.py +0 -0
  13. {map_closures-2.1.0 → map_closures-2.2.0}/map_closures/datasets/apollo.py +0 -0
  14. {map_closures-2.1.0 → map_closures-2.2.0}/map_closures/datasets/generic.py +0 -0
  15. {map_closures-2.1.0 → map_closures-2.2.0}/map_closures/datasets/helipr.py +0 -0
  16. {map_closures-2.1.0 → map_closures-2.2.0}/map_closures/datasets/kitti.py +0 -0
  17. {map_closures-2.1.0 → map_closures-2.2.0}/map_closures/datasets/mcap.py +0 -0
  18. {map_closures-2.1.0 → map_closures-2.2.0}/map_closures/datasets/mulran.py +0 -0
  19. {map_closures-2.1.0 → map_closures-2.2.0}/map_closures/datasets/ncd.py +0 -0
  20. {map_closures-2.1.0 → map_closures-2.2.0}/map_closures/datasets/ouster.py +0 -0
  21. {map_closures-2.1.0 → map_closures-2.2.0}/map_closures/datasets/rosbag.py +0 -0
  22. {map_closures-2.1.0 → map_closures-2.2.0}/map_closures/pipeline.py +0 -0
  23. {map_closures-2.1.0 → map_closures-2.2.0}/map_closures/tools/__init__.py +0 -0
  24. {map_closures-2.1.0 → map_closures-2.2.0}/map_closures/tools/cmd.py +0 -0
  25. {map_closures-2.1.0 → map_closures-2.2.0}/map_closures/tools/evaluation.py +0 -0
  26. {map_closures-2.1.0 → map_closures-2.2.0}/map_closures/tools/utils.py +0 -0
  27. {map_closures-2.1.0 → map_closures-2.2.0}/map_closures/visualizer/closures_visualizer.py +0 -0
  28. {map_closures-2.1.0 → map_closures-2.2.0}/map_closures/visualizer/local_maps_visualizer.py +0 -0
  29. {map_closures-2.1.0 → map_closures-2.2.0}/map_closures/visualizer/registration_visualizer.py +0 -0
  30. {map_closures-2.1.0 → map_closures-2.2.0}/map_closures/visualizer/visualizer.py +0 -0
  31. {map_closures-2.1.0 → map_closures-2.2.0}/map_closures/voxel_map.py +0 -0
@@ -20,7 +20,7 @@
20
20
  # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
21
  # SOFTWARE.
22
22
  cmake_minimum_required(VERSION 3.16...3.26)
23
- project(map_closure_pybind VERSION 2.1.0 LANGUAGES CXX)
23
+ project(map_closure_pybind VERSION 2.2.0 LANGUAGES CXX)
24
24
 
25
25
  # Set build type
26
26
  set(CMAKE_BUILD_TYPE Release)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: map_closures
3
- Version: 2.1.0
3
+ Version: 2.2.0
4
4
  Summary: Effectively Detecting Loop Closures using Point Cloud Density Maps
5
5
  Keywords: Loop Closures,Localization,SLAM,LiDAR
6
6
  Author: Saurabh Gupta, Tiziano Guadagnino
@@ -53,6 +53,8 @@ Description-Content-Type: text/markdown
53
53
  <span>&nbsp;&nbsp;•&nbsp;&nbsp;</span>
54
54
  <a href=https://www.ipb.uni-bonn.de/pdfs/gupta2024icra.pdf>ICRA24 Paper</a>
55
55
  <span>&nbsp;&nbsp;•&nbsp;&nbsp;</span>
56
+ <a href=https://www.ipb.uni-bonn.de/pdfs/gupta2026ijrr.pdf>IJRR26 Paper</a>
57
+ <span>&nbsp;&nbsp;•&nbsp;&nbsp;</span>
56
58
  <a href=https://github.com/PRBonn/MapClosures/issues>Contact Us</a>
57
59
  <br />
58
60
  <br />
@@ -96,7 +98,7 @@ map_closure_pipeline -v
96
98
 
97
99
  ## Citation
98
100
 
99
- If you use this library for any academic work, please cite our original [paper](https://www.ipb.uni-bonn.de/pdfs/gupta2024icra.pdf).
101
+ If you use this library for any academic work, please cite our original papers.
100
102
 
101
103
  ```bibtex
102
104
  @inproceedings{gupta2024icra,
@@ -106,6 +108,15 @@ If you use this library for any academic work, please cite our original [paper](
106
108
  year = {2024},
107
109
  codeurl = {https://github.com/PRBonn/MapClosures},
108
110
  }
111
+ @article{gupta2026ijrr,
112
+ author = {Saurabh Gupta and Tiziano Guadagnino and Benedikt Mersch and Niklas Trekel and Meher V. R. Malladi and Cyrill Stachniss},
113
+ title = {{Efficiently Closing Loops in LiDAR-Based SLAM Using Point Cloud Density Maps}},
114
+ booktitle = {The International Journal of Robotics Research (IJRR)},
115
+ volume = {0},
116
+ number = {0},
117
+ year = {2026},
118
+ codeurl = {https://github.com/PRBonn/MapClosures},
119
+ }
109
120
  ```
110
121
 
111
122
  ## Acknowledgement
@@ -12,6 +12,8 @@
12
12
  <span>&nbsp;&nbsp;•&nbsp;&nbsp;</span>
13
13
  <a href=https://www.ipb.uni-bonn.de/pdfs/gupta2024icra.pdf>ICRA24 Paper</a>
14
14
  <span>&nbsp;&nbsp;•&nbsp;&nbsp;</span>
15
+ <a href=https://www.ipb.uni-bonn.de/pdfs/gupta2026ijrr.pdf>IJRR26 Paper</a>
16
+ <span>&nbsp;&nbsp;•&nbsp;&nbsp;</span>
15
17
  <a href=https://github.com/PRBonn/MapClosures/issues>Contact Us</a>
16
18
  <br />
17
19
  <br />
@@ -55,7 +57,7 @@ map_closure_pipeline -v
55
57
 
56
58
  ## Citation
57
59
 
58
- If you use this library for any academic work, please cite our original [paper](https://www.ipb.uni-bonn.de/pdfs/gupta2024icra.pdf).
60
+ If you use this library for any academic work, please cite our original papers.
59
61
 
60
62
  ```bibtex
61
63
  @inproceedings{gupta2024icra,
@@ -65,6 +67,15 @@ If you use this library for any academic work, please cite our original [paper](
65
67
  year = {2024},
66
68
  codeurl = {https://github.com/PRBonn/MapClosures},
67
69
  }
70
+ @article{gupta2026ijrr,
71
+ author = {Saurabh Gupta and Tiziano Guadagnino and Benedikt Mersch and Niklas Trekel and Meher V. R. Malladi and Cyrill Stachniss},
72
+ title = {{Efficiently Closing Loops in LiDAR-Based SLAM Using Point Cloud Density Maps}},
73
+ booktitle = {The International Journal of Robotics Research (IJRR)},
74
+ volume = {0},
75
+ number = {0},
76
+ year = {2026},
77
+ codeurl = {https://github.com/PRBonn/MapClosures},
78
+ }
68
79
  ```
69
80
 
70
81
  ## Acknowledgement
@@ -20,4 +20,4 @@
20
20
  # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
21
  # SOFTWARE.
22
22
 
23
- __version__ = "2.1.0"
23
+ __version__ = "2.2.0"
@@ -0,0 +1,149 @@
1
+ # MIT License
2
+ #
3
+ # Copyright (c) 2026 Saurabh Gupta
4
+ #
5
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ # of this software and associated documentation files (the "Software"), to deal
7
+ # in the Software without restriction, including without limitation the rights
8
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ # copies of the Software, and to permit persons to whom the Software is
10
+ # furnished to do so, subject to the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be included in all
13
+ # copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ # SOFTWARE.
22
+ from typing import List, overload
23
+
24
+ import numpy as np
25
+ from typing_extensions import TypeAlias
26
+
27
+ from map_closures.config import MapClosuresConfig
28
+ from map_closures.pybind import map_closures_pybind
29
+ from map_closures.pybind.map_closures_pybind import _Vector3dVector as Vector3dVector
30
+
31
+ ClosureCandidate: TypeAlias = map_closures_pybind._ClosureCandidate
32
+
33
+
34
+ class MapClosures:
35
+ def __init__(self, config: MapClosuresConfig = MapClosuresConfig()):
36
+ self._config = config
37
+ self._pipeline = map_closures_pybind._MapClosures(self._config.model_dump())
38
+
39
+ @overload
40
+ def get_best_closure(self, query_idx: int, local_map: np.ndarray) -> ClosureCandidate:
41
+ ...
42
+
43
+ @overload
44
+ def get_best_closure(
45
+ self,
46
+ query_idx: int,
47
+ local_map: np.ndarray,
48
+ voxel_means: np.ndarray,
49
+ voxel_normals: np.ndarray,
50
+ ) -> ClosureCandidate:
51
+ ...
52
+
53
+ def get_best_closure(
54
+ self,
55
+ query_idx: int,
56
+ local_map: np.ndarray,
57
+ voxel_means: np.ndarray = None,
58
+ voxel_normals: np.ndarray = None,
59
+ ) -> ClosureCandidate:
60
+ if voxel_means is None or voxel_normals is None:
61
+ closure = self._pipeline._GetBestClosure(query_idx, Vector3dVector(local_map))
62
+ else:
63
+ closure = self._pipeline._GetBestClosure(
64
+ query_idx,
65
+ Vector3dVector(local_map),
66
+ Vector3dVector(voxel_means),
67
+ Vector3dVector(voxel_normals),
68
+ )
69
+ return closure
70
+
71
+ @overload
72
+ def get_top_k_closures(
73
+ self, query_idx: int, local_map: np.ndarray, k: int
74
+ ) -> List[ClosureCandidate]:
75
+ ...
76
+
77
+ @overload
78
+ def get_top_k_closures(
79
+ self,
80
+ query_idx: int,
81
+ local_map: np.ndarray,
82
+ k: int,
83
+ voxel_means: np.ndarray,
84
+ voxel_normals: np.ndarray,
85
+ ) -> List[ClosureCandidate]:
86
+ ...
87
+
88
+ def get_top_k_closures(
89
+ self,
90
+ query_idx: int,
91
+ local_map: np.ndarray,
92
+ k: int,
93
+ voxel_means: np.ndarray = None,
94
+ voxel_normals: np.ndarray = None,
95
+ ) -> List[ClosureCandidate]:
96
+ if voxel_means is None or voxel_normals is None:
97
+ top_k_closures = self._pipeline._GetTopKClosures(
98
+ query_idx, Vector3dVector(local_map), k
99
+ )
100
+ else:
101
+ top_k_closures = self._pipeline._GetTopKClosures(
102
+ query_idx,
103
+ Vector3dVector(local_map),
104
+ Vector3dVector(voxel_means),
105
+ Vector3dVector(voxel_normals),
106
+ k,
107
+ )
108
+ return top_k_closures
109
+
110
+ @overload
111
+ def get_closures(self, query_idx: int, local_map: np.ndarray) -> List[ClosureCandidate]:
112
+ ...
113
+
114
+ @overload
115
+ def get_closures(
116
+ self,
117
+ query_idx: int,
118
+ local_map: np.ndarray,
119
+ voxel_means: np.ndarray,
120
+ voxel_normals: np.ndarray,
121
+ ) -> List[ClosureCandidate]:
122
+ ...
123
+
124
+ def get_closures(
125
+ self,
126
+ query_idx: int,
127
+ local_map: np.ndarray,
128
+ voxel_means: np.ndarray = None,
129
+ voxel_normals: np.ndarray = None,
130
+ ) -> List[ClosureCandidate]:
131
+ if voxel_means is None or voxel_normals is None:
132
+ closures = self._pipeline._GetClosures(query_idx, Vector3dVector(local_map))
133
+ else:
134
+ closures = self._pipeline._GetClosures(
135
+ query_idx,
136
+ Vector3dVector(local_map),
137
+ Vector3dVector(voxel_means),
138
+ Vector3dVector(voxel_normals),
139
+ )
140
+ return closures
141
+
142
+ def get_density_map_from_id(self, map_id: int) -> np.ndarray:
143
+ return self._pipeline._getDensityMapFromId(map_id)
144
+
145
+ def get_ground_alignment_from_id(self, map_id: int) -> np.ndarray:
146
+ return np.asarray(self._pipeline._getGroundAlignmentFromId(map_id))
147
+
148
+ def save_hbst_database(self, database_path: str):
149
+ self._pipeline._SaveHbstDatabase(database_path)
@@ -4,7 +4,7 @@ build-backend = "scikit_build_core.build"
4
4
 
5
5
  [project]
6
6
  name = "map_closures"
7
- version = "2.1.0"
7
+ version = "2.2.0"
8
8
  description = "Effectively Detecting Loop Closures using Point Cloud Density Maps"
9
9
  authors = [{ name = "Saurabh Gupta" }, { name = "Tiziano Guadagnino" }]
10
10
  readme = "README.md"
@@ -58,8 +58,8 @@ Homepage = "https://github.com/PRBonn/MapClosures"
58
58
 
59
59
  [tool.scikit-build]
60
60
  build-dir = "build/{wheel_tag}"
61
- cmake.verbose = false
62
- cmake.minimum-version = "3.22"
61
+ build.verbose = false
62
+ cmake.version = ">=3.22"
63
63
  editable.mode = "redirect"
64
64
  editable.rebuild = true
65
65
  editable.verbose = true
@@ -1,60 +0,0 @@
1
- # MIT License
2
- #
3
- # Copyright (c) 2026 Saurabh Gupta
4
- #
5
- # Permission is hereby granted, free of charge, to any person obtaining a copy
6
- # of this software and associated documentation files (the "Software"), to deal
7
- # in the Software without restriction, including without limitation the rights
8
- # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- # copies of the Software, and to permit persons to whom the Software is
10
- # furnished to do so, subject to the following conditions:
11
- #
12
- # The above copyright notice and this permission notice shall be included in all
13
- # copies or substantial portions of the Software.
14
- #
15
- # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- # SOFTWARE.
22
- from typing import List
23
-
24
- import numpy as np
25
- from typing_extensions import TypeAlias
26
-
27
- from map_closures.config import MapClosuresConfig
28
- from map_closures.pybind import map_closures_pybind
29
- from map_closures.pybind.map_closures_pybind import _Vector3dVector as Vector3dVector
30
-
31
- ClosureCandidate: TypeAlias = map_closures_pybind._ClosureCandidate
32
-
33
-
34
- class MapClosures:
35
- def __init__(self, config: MapClosuresConfig = MapClosuresConfig()):
36
- self._config = config
37
- self._pipeline = map_closures_pybind._MapClosures(self._config.model_dump())
38
-
39
- def get_best_closure(self, query_idx: int, local_map: np.ndarray) -> ClosureCandidate:
40
- closure = self._pipeline._GetBestClosure(query_idx, Vector3dVector(local_map))
41
- return closure
42
-
43
- def get_top_k_closures(
44
- self, query_idx: int, local_map: np.ndarray, k: int
45
- ) -> List[ClosureCandidate]:
46
- top_k_closures = self._pipeline._GetTopKClosures(query_idx, Vector3dVector(local_map), k)
47
- return top_k_closures
48
-
49
- def get_closures(self, query_idx: int, local_map: np.ndarray) -> List[ClosureCandidate]:
50
- closures = self._pipeline._GetClosures(query_idx, Vector3dVector(local_map))
51
- return closures
52
-
53
- def get_density_map_from_id(self, map_id: int) -> np.ndarray:
54
- return self._pipeline._getDensityMapFromId(map_id)
55
-
56
- def get_ground_alignment_from_id(self, map_id: int) -> np.ndarray:
57
- return np.asarray(self._pipeline._getGroundAlignmentFromId(map_id))
58
-
59
- def save_hbst_database(self, database_path: str):
60
- self._pipeline._SaveHbstDatabase(database_path)
File without changes
File without changes