small-gicp 0.0.3__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.
- small_gicp-0.0.3/.clang-format +168 -0
- small_gicp-0.0.3/.github/workflows/build-linux.yml +40 -0
- small_gicp-0.0.3/.github/workflows/build-windows.yml +32 -0
- small_gicp-0.0.3/.github/workflows/coverage.yml +55 -0
- small_gicp-0.0.3/.github/workflows/test.yml +38 -0
- small_gicp-0.0.3/.gitignore +10 -0
- small_gicp-0.0.3/.pytest_cache/.gitignore +2 -0
- small_gicp-0.0.3/.pytest_cache/CACHEDIR.TAG +4 -0
- small_gicp-0.0.3/.pytest_cache/README.md +8 -0
- small_gicp-0.0.3/.pytest_cache/v/cache/lastfailed +3 -0
- small_gicp-0.0.3/.pytest_cache/v/cache/nodeids +1 -0
- small_gicp-0.0.3/.pytest_cache/v/cache/stepwise +1 -0
- small_gicp-0.0.3/BENCHMARK.md +119 -0
- small_gicp-0.0.3/CMakeLists.txt +328 -0
- small_gicp-0.0.3/LICENSE +21 -0
- small_gicp-0.0.3/PKG-INFO +397 -0
- small_gicp-0.0.3/README.md +385 -0
- small_gicp-0.0.3/cmake/FindIridescence.cmake +21 -0
- small_gicp-0.0.3/cmake/small_gicp-config.cmake.in +28 -0
- small_gicp-0.0.3/codecov.yml +6 -0
- small_gicp-0.0.3/data/T_target_source.txt +4 -0
- small_gicp-0.0.3/data/source.ply +0 -0
- small_gicp-0.0.3/data/target.ply +0 -0
- small_gicp-0.0.3/docker/Dockerfile.build.gcc +23 -0
- small_gicp-0.0.3/docker/Dockerfile.build.llvm +33 -0
- small_gicp-0.0.3/docker/Dockerfile.test.gcc +31 -0
- small_gicp-0.0.3/docker/Dockerfile.test.llvm +41 -0
- small_gicp-0.0.3/docs/assets/downsampling_comp.png +0 -0
- small_gicp-0.0.3/docs/assets/downsampling_threads.png +0 -0
- small_gicp-0.0.3/docs/assets/kdtree_time.png +0 -0
- small_gicp-0.0.3/docs/assets/odometry_native.png +0 -0
- small_gicp-0.0.3/docs/assets/odometry_time.png +0 -0
- small_gicp-0.0.3/include/small_gicp/ann/flat_container.hpp +146 -0
- small_gicp-0.0.3/include/small_gicp/ann/gaussian_voxelmap.hpp +88 -0
- small_gicp-0.0.3/include/small_gicp/ann/incremental_voxelmap.hpp +251 -0
- small_gicp-0.0.3/include/small_gicp/ann/kdtree.hpp +105 -0
- small_gicp-0.0.3/include/small_gicp/ann/kdtree_omp.hpp +22 -0
- small_gicp-0.0.3/include/small_gicp/ann/kdtree_tbb.hpp +22 -0
- small_gicp-0.0.3/include/small_gicp/ann/nanoflann.hpp +2048 -0
- small_gicp-0.0.3/include/small_gicp/ann/nanoflann_omp.hpp +657 -0
- small_gicp-0.0.3/include/small_gicp/ann/nanoflann_tbb.hpp +639 -0
- small_gicp-0.0.3/include/small_gicp/ann/traits.hpp +60 -0
- small_gicp-0.0.3/include/small_gicp/benchmark/benchmark.hpp +146 -0
- small_gicp-0.0.3/include/small_gicp/benchmark/benchmark_odom.hpp +118 -0
- small_gicp-0.0.3/include/small_gicp/benchmark/read_points.hpp +111 -0
- small_gicp-0.0.3/include/small_gicp/factors/general_factor.hpp +77 -0
- small_gicp-0.0.3/include/small_gicp/factors/gicp_factor.hpp +93 -0
- small_gicp-0.0.3/include/small_gicp/factors/icp_factor.hpp +69 -0
- small_gicp-0.0.3/include/small_gicp/factors/plane_icp_factor.hpp +74 -0
- small_gicp-0.0.3/include/small_gicp/pcl/pcl_point.hpp +35 -0
- small_gicp-0.0.3/include/small_gicp/pcl/pcl_point_traits.hpp +38 -0
- small_gicp-0.0.3/include/small_gicp/pcl/pcl_proxy.hpp +37 -0
- small_gicp-0.0.3/include/small_gicp/pcl/pcl_registration.hpp +116 -0
- small_gicp-0.0.3/include/small_gicp/pcl/pcl_registration_impl.hpp +248 -0
- small_gicp-0.0.3/include/small_gicp/points/eigen.hpp +19 -0
- small_gicp-0.0.3/include/small_gicp/points/point_cloud.hpp +98 -0
- small_gicp-0.0.3/include/small_gicp/points/traits.hpp +81 -0
- small_gicp-0.0.3/include/small_gicp/registration/optimizer.hpp +157 -0
- small_gicp-0.0.3/include/small_gicp/registration/reduction.hpp +65 -0
- small_gicp-0.0.3/include/small_gicp/registration/reduction_omp.hpp +71 -0
- small_gicp-0.0.3/include/small_gicp/registration/reduction_tbb.hpp +141 -0
- small_gicp-0.0.3/include/small_gicp/registration/registration.hpp +53 -0
- small_gicp-0.0.3/include/small_gicp/registration/registration_helper.hpp +85 -0
- small_gicp-0.0.3/include/small_gicp/registration/registration_result.hpp +32 -0
- small_gicp-0.0.3/include/small_gicp/registration/rejector.hpp +30 -0
- small_gicp-0.0.3/include/small_gicp/registration/termination_criteria.hpp +23 -0
- small_gicp-0.0.3/include/small_gicp/util/downsampling.hpp +105 -0
- small_gicp-0.0.3/include/small_gicp/util/downsampling_omp.hpp +91 -0
- small_gicp-0.0.3/include/small_gicp/util/downsampling_tbb.hpp +85 -0
- small_gicp-0.0.3/include/small_gicp/util/fast_floor.hpp +17 -0
- small_gicp-0.0.3/include/small_gicp/util/lie.hpp +96 -0
- small_gicp-0.0.3/include/small_gicp/util/normal_estimation.hpp +151 -0
- small_gicp-0.0.3/include/small_gicp/util/normal_estimation_omp.hpp +85 -0
- small_gicp-0.0.3/include/small_gicp/util/normal_estimation_tbb.hpp +83 -0
- small_gicp-0.0.3/include/small_gicp/util/sort_omp.hpp +75 -0
- small_gicp-0.0.3/include/small_gicp/util/vector3i_hash.hpp +26 -0
- small_gicp-0.0.3/package.xml +22 -0
- small_gicp-0.0.3/pyproject.toml +38 -0
- small_gicp-0.0.3/scripts/plot_downsampling.py +127 -0
- small_gicp-0.0.3/scripts/plot_kdtree.py +92 -0
- small_gicp-0.0.3/scripts/plot_odometry.py +89 -0
- small_gicp-0.0.3/scripts/plot_odometry_accuracy.py +91 -0
- small_gicp-0.0.3/scripts/plot_odometry_native.py +66 -0
- small_gicp-0.0.3/scripts/run_downsampling_benchmark.sh +11 -0
- small_gicp-0.0.3/scripts/run_kdtree_benchmark.sh +18 -0
- small_gicp-0.0.3/scripts/run_odometry_benchmark.sh +20 -0
- small_gicp-0.0.3/scripts/run_odometry_benchmark_native.sh +20 -0
- small_gicp-0.0.3/src/benchmark/downsampling_benchmark.cpp +137 -0
- small_gicp-0.0.3/src/benchmark/kdtree_benchmark.cpp +167 -0
- small_gicp-0.0.3/src/benchmark/odometry_benchmark.cpp +97 -0
- small_gicp-0.0.3/src/benchmark/odometry_benchmark_fast_gicp.cpp +66 -0
- small_gicp-0.0.3/src/benchmark/odometry_benchmark_fast_vgicp.cpp +69 -0
- small_gicp-0.0.3/src/benchmark/odometry_benchmark_pcl.cpp +63 -0
- small_gicp-0.0.3/src/benchmark/odometry_benchmark_small_gicp.cpp +60 -0
- small_gicp-0.0.3/src/benchmark/odometry_benchmark_small_gicp_model_tbb.cpp +75 -0
- small_gicp-0.0.3/src/benchmark/odometry_benchmark_small_gicp_omp.cpp +67 -0
- small_gicp-0.0.3/src/benchmark/odometry_benchmark_small_gicp_pcl.cpp +65 -0
- small_gicp-0.0.3/src/benchmark/odometry_benchmark_small_gicp_tbb.cpp +70 -0
- small_gicp-0.0.3/src/benchmark/odometry_benchmark_small_gicp_tbb_flow.cpp +183 -0
- small_gicp-0.0.3/src/benchmark/odometry_benchmark_small_vgicp_model_tbb.cpp +75 -0
- small_gicp-0.0.3/src/benchmark/odometry_benchmark_small_vgicp_omp.cpp +65 -0
- small_gicp-0.0.3/src/benchmark/odometry_benchmark_small_vgicp_tbb.cpp +73 -0
- small_gicp-0.0.3/src/example/01_basic_registration.cpp +71 -0
- small_gicp-0.0.3/src/example/02_basic_registration_pcl.cpp +107 -0
- small_gicp-0.0.3/src/example/03_registration_template.cpp +336 -0
- small_gicp-0.0.3/src/example/basic_registration.py +158 -0
- small_gicp-0.0.3/src/example/kitti_odometry.py +98 -0
- small_gicp-0.0.3/src/python/align.cpp +148 -0
- small_gicp-0.0.3/src/python/factors.cpp +86 -0
- small_gicp-0.0.3/src/python/kdtree.cpp +35 -0
- small_gicp-0.0.3/src/python/misc.cpp +27 -0
- small_gicp-0.0.3/src/python/pointcloud.cpp +53 -0
- small_gicp-0.0.3/src/python/preprocess.cpp +161 -0
- small_gicp-0.0.3/src/python/python.cpp +27 -0
- small_gicp-0.0.3/src/python/result.cpp +40 -0
- small_gicp-0.0.3/src/python/voxelmap.cpp +70 -0
- small_gicp-0.0.3/src/small_gicp/benchmark/benchmark_odom.cpp +29 -0
- small_gicp-0.0.3/src/small_gicp/registration/registration.cpp +5 -0
- small_gicp-0.0.3/src/small_gicp/registration/registration_helper.cpp +131 -0
- small_gicp-0.0.3/src/test/downsampling_test.cpp +94 -0
- small_gicp-0.0.3/src/test/kdtree_test.cpp +241 -0
- small_gicp-0.0.3/src/test/normal_estimation_test.cpp +263 -0
- small_gicp-0.0.3/src/test/points_test.cpp +60 -0
- small_gicp-0.0.3/src/test/python_test.py +190 -0
- small_gicp-0.0.3/src/test/registration_test.cpp +344 -0
- small_gicp-0.0.3/src/test/sort_omp_test.cpp +107 -0
- small_gicp-0.0.3/src/test/vector_test.cpp +31 -0
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
---
|
|
2
|
+
Language: Cpp
|
|
3
|
+
# BasedOnStyle: Google
|
|
4
|
+
AccessModifierOffset: -2
|
|
5
|
+
AlignAfterOpenBracket: AlwaysBreak
|
|
6
|
+
AlignConsecutiveMacros: false
|
|
7
|
+
AlignConsecutiveAssignments: false
|
|
8
|
+
AlignConsecutiveDeclarations: false
|
|
9
|
+
AlignEscapedNewlines: Left
|
|
10
|
+
AlignOperands: true
|
|
11
|
+
AlignTrailingComments: true
|
|
12
|
+
AllowAllArgumentsOnNextLine: false
|
|
13
|
+
AllowAllConstructorInitializersOnNextLine: false
|
|
14
|
+
AllowAllParametersOfDeclarationOnNextLine: false
|
|
15
|
+
AllowShortBlocksOnASingleLine: Never
|
|
16
|
+
AllowShortCaseLabelsOnASingleLine: false
|
|
17
|
+
AllowShortFunctionsOnASingleLine: Inline
|
|
18
|
+
AllowShortLambdasOnASingleLine: All
|
|
19
|
+
AllowShortIfStatementsOnASingleLine: WithoutElse
|
|
20
|
+
AllowShortLoopsOnASingleLine: true
|
|
21
|
+
AlwaysBreakAfterDefinitionReturnType: None
|
|
22
|
+
AlwaysBreakAfterReturnType: None
|
|
23
|
+
AlwaysBreakBeforeMultilineStrings: true
|
|
24
|
+
AlwaysBreakTemplateDeclarations: Yes
|
|
25
|
+
BinPackArguments: false
|
|
26
|
+
BinPackParameters: false
|
|
27
|
+
BraceWrapping:
|
|
28
|
+
AfterCaseLabel: false
|
|
29
|
+
AfterClass: false
|
|
30
|
+
AfterControlStatement: false
|
|
31
|
+
AfterEnum: false
|
|
32
|
+
AfterFunction: false
|
|
33
|
+
AfterNamespace: false
|
|
34
|
+
AfterObjCDeclaration: false
|
|
35
|
+
AfterStruct: false
|
|
36
|
+
AfterUnion: false
|
|
37
|
+
AfterExternBlock: false
|
|
38
|
+
BeforeCatch: false
|
|
39
|
+
BeforeElse: false
|
|
40
|
+
IndentBraces: false
|
|
41
|
+
SplitEmptyFunction: true
|
|
42
|
+
SplitEmptyRecord: true
|
|
43
|
+
SplitEmptyNamespace: true
|
|
44
|
+
BreakBeforeBinaryOperators: None
|
|
45
|
+
BreakBeforeBraces: Attach
|
|
46
|
+
BreakBeforeInheritanceComma: false
|
|
47
|
+
BreakInheritanceList: BeforeColon
|
|
48
|
+
BreakBeforeTernaryOperators: true
|
|
49
|
+
BreakConstructorInitializersBeforeComma: false
|
|
50
|
+
BreakConstructorInitializers: BeforeColon
|
|
51
|
+
BreakAfterJavaFieldAnnotations: false
|
|
52
|
+
BreakStringLiterals: true
|
|
53
|
+
ColumnLimit: 180
|
|
54
|
+
CommentPragmas: '^ IWYU pragma:'
|
|
55
|
+
CompactNamespaces: false
|
|
56
|
+
ConstructorInitializerAllOnOneLineOrOnePerLine: true
|
|
57
|
+
ConstructorInitializerIndentWidth: 0
|
|
58
|
+
ContinuationIndentWidth: 2
|
|
59
|
+
Cpp11BracedListStyle: true
|
|
60
|
+
DeriveLineEnding: true
|
|
61
|
+
DerivePointerAlignment: false
|
|
62
|
+
DisableFormat: false
|
|
63
|
+
ExperimentalAutoDetectBinPacking: false
|
|
64
|
+
FixNamespaceComments: true
|
|
65
|
+
ForEachMacros:
|
|
66
|
+
- foreach
|
|
67
|
+
- Q_FOREACH
|
|
68
|
+
- BOOST_FOREACH
|
|
69
|
+
IncludeBlocks: Regroup
|
|
70
|
+
IncludeCategories:
|
|
71
|
+
- Regex: '^<ext/.*\.h>'
|
|
72
|
+
Priority: 2
|
|
73
|
+
SortPriority: 0
|
|
74
|
+
- Regex: '^<.*\.h>'
|
|
75
|
+
Priority: 1
|
|
76
|
+
SortPriority: 0
|
|
77
|
+
- Regex: '^<.*'
|
|
78
|
+
Priority: 2
|
|
79
|
+
SortPriority: 0
|
|
80
|
+
- Regex: '.*'
|
|
81
|
+
Priority: 3
|
|
82
|
+
SortPriority: 0
|
|
83
|
+
IncludeIsMainRegex: '([-_](test|unittest))?$'
|
|
84
|
+
IncludeIsMainSourceRegex: ''
|
|
85
|
+
IndentCaseLabels: true
|
|
86
|
+
IndentGotoLabels: true
|
|
87
|
+
IndentPPDirectives: None
|
|
88
|
+
IndentWidth: 2
|
|
89
|
+
IndentWrappedFunctionNames: false
|
|
90
|
+
JavaScriptQuotes: Leave
|
|
91
|
+
JavaScriptWrapImports: true
|
|
92
|
+
KeepEmptyLinesAtTheStartOfBlocks: false
|
|
93
|
+
MacroBlockBegin: ''
|
|
94
|
+
MacroBlockEnd: ''
|
|
95
|
+
MaxEmptyLinesToKeep: 1
|
|
96
|
+
NamespaceIndentation: None
|
|
97
|
+
ObjCBinPackProtocolList: Never
|
|
98
|
+
ObjCBlockIndentWidth: 2
|
|
99
|
+
ObjCSpaceAfterProperty: false
|
|
100
|
+
ObjCSpaceBeforeProtocolList: true
|
|
101
|
+
PenaltyBreakAssignment: 2
|
|
102
|
+
PenaltyBreakBeforeFirstCallParameter: 1
|
|
103
|
+
PenaltyBreakComment: 300
|
|
104
|
+
PenaltyBreakFirstLessLess: 120
|
|
105
|
+
PenaltyBreakString: 1000
|
|
106
|
+
PenaltyBreakTemplateDeclaration: 10
|
|
107
|
+
PenaltyExcessCharacter: 1000000
|
|
108
|
+
PenaltyReturnTypeOnItsOwnLine: 200
|
|
109
|
+
PointerAlignment: Left
|
|
110
|
+
RawStringFormats:
|
|
111
|
+
- Language: Cpp
|
|
112
|
+
Delimiters:
|
|
113
|
+
- cc
|
|
114
|
+
- CC
|
|
115
|
+
- cpp
|
|
116
|
+
- Cpp
|
|
117
|
+
- CPP
|
|
118
|
+
- 'c++'
|
|
119
|
+
- 'C++'
|
|
120
|
+
CanonicalDelimiter: ''
|
|
121
|
+
BasedOnStyle: google
|
|
122
|
+
- Language: TextProto
|
|
123
|
+
Delimiters:
|
|
124
|
+
- pb
|
|
125
|
+
- PB
|
|
126
|
+
- proto
|
|
127
|
+
- PROTO
|
|
128
|
+
EnclosingFunctions:
|
|
129
|
+
- EqualsProto
|
|
130
|
+
- EquivToProto
|
|
131
|
+
- PARSE_PARTIAL_TEXT_PROTO
|
|
132
|
+
- PARSE_TEST_PROTO
|
|
133
|
+
- PARSE_TEXT_PROTO
|
|
134
|
+
- ParseTextOrDie
|
|
135
|
+
- ParseTextProtoOrDie
|
|
136
|
+
CanonicalDelimiter: ''
|
|
137
|
+
BasedOnStyle: google
|
|
138
|
+
ReflowComments: true
|
|
139
|
+
SortIncludes: false
|
|
140
|
+
SortUsingDeclarations: true
|
|
141
|
+
SpaceAfterCStyleCast: false
|
|
142
|
+
SpaceAfterLogicalNot: false
|
|
143
|
+
SpaceAfterTemplateKeyword: true
|
|
144
|
+
SpaceBeforeAssignmentOperators: true
|
|
145
|
+
SpaceBeforeCpp11BracedList: false
|
|
146
|
+
SpaceBeforeCtorInitializerColon: true
|
|
147
|
+
SpaceBeforeInheritanceColon: true
|
|
148
|
+
SpaceBeforeParens: ControlStatements
|
|
149
|
+
SpaceBeforeRangeBasedForLoopColon: true
|
|
150
|
+
SpaceInEmptyBlock: false
|
|
151
|
+
SpaceInEmptyParentheses: false
|
|
152
|
+
SpacesBeforeTrailingComments: 2
|
|
153
|
+
SpacesInAngles: false
|
|
154
|
+
SpacesInConditionalStatement: false
|
|
155
|
+
SpacesInContainerLiterals: true
|
|
156
|
+
SpacesInCStyleCastParentheses: false
|
|
157
|
+
SpacesInParentheses: false
|
|
158
|
+
SpacesInSquareBrackets: false
|
|
159
|
+
SpaceBeforeSquareBrackets: false
|
|
160
|
+
Standard: Auto
|
|
161
|
+
StatementMacros:
|
|
162
|
+
- Q_UNUSED
|
|
163
|
+
- QT_REQUIRE_VERSION
|
|
164
|
+
TabWidth: 8
|
|
165
|
+
UseCRLF: false
|
|
166
|
+
UseTab: Never
|
|
167
|
+
...
|
|
168
|
+
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
name: Build(Linux)
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [ master ]
|
|
6
|
+
paths-ignore: '**.md'
|
|
7
|
+
pull_request:
|
|
8
|
+
branches: [ master ]
|
|
9
|
+
paths-ignore: '**.md'
|
|
10
|
+
|
|
11
|
+
# Allows you to run this workflow manually from the Actions tab
|
|
12
|
+
workflow_dispatch:
|
|
13
|
+
|
|
14
|
+
jobs:
|
|
15
|
+
build:
|
|
16
|
+
runs-on: ubuntu-latest
|
|
17
|
+
strategy:
|
|
18
|
+
matrix:
|
|
19
|
+
DISTRO: [noble, jammy, focal]
|
|
20
|
+
TOOLCHAIN: [gcc, llvm]
|
|
21
|
+
|
|
22
|
+
steps:
|
|
23
|
+
- uses: actions/checkout@v2
|
|
24
|
+
with:
|
|
25
|
+
submodules: recursive
|
|
26
|
+
|
|
27
|
+
- name: Docker login
|
|
28
|
+
continue-on-error: true
|
|
29
|
+
uses: docker/login-action@v1
|
|
30
|
+
with:
|
|
31
|
+
username: ${{ secrets.DOCKER_USERNAME }}
|
|
32
|
+
password: ${{ secrets.DOCKER_TOKEN }}
|
|
33
|
+
|
|
34
|
+
- name: Docker build
|
|
35
|
+
uses: docker/build-push-action@v2
|
|
36
|
+
with:
|
|
37
|
+
file: ${{github.workspace}}/docker/Dockerfile.build.${{ matrix.TOOLCHAIN }}
|
|
38
|
+
build-args: BASE_IMAGE=ubuntu:${{ matrix.DISTRO }}
|
|
39
|
+
context: .
|
|
40
|
+
push: false
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
name: Build(Windows)
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [ master ]
|
|
6
|
+
paths-ignore: '**.md'
|
|
7
|
+
pull_request:
|
|
8
|
+
branches: [ master ]
|
|
9
|
+
paths-ignore: '**.md'
|
|
10
|
+
|
|
11
|
+
# Allows you to run this workflow manually from the Actions tab
|
|
12
|
+
workflow_dispatch:
|
|
13
|
+
|
|
14
|
+
jobs:
|
|
15
|
+
build:
|
|
16
|
+
runs-on: windows-latest
|
|
17
|
+
|
|
18
|
+
steps:
|
|
19
|
+
- uses: actions/checkout@v4
|
|
20
|
+
|
|
21
|
+
- uses: microsoft/setup-msbuild@v2
|
|
22
|
+
|
|
23
|
+
- uses: actions/setup-python@v5
|
|
24
|
+
with:
|
|
25
|
+
python-version: '3.12'
|
|
26
|
+
cache: 'pip'
|
|
27
|
+
|
|
28
|
+
- run: pip install numpy scipy pytest
|
|
29
|
+
|
|
30
|
+
- run: pip install .
|
|
31
|
+
|
|
32
|
+
- run: python -m pytest src/test/python_test.py -v
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
name: Coverage
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [ master ]
|
|
6
|
+
paths-ignore: '**.md'
|
|
7
|
+
pull_request:
|
|
8
|
+
branches: [ master ]
|
|
9
|
+
paths-ignore: '**.md'
|
|
10
|
+
|
|
11
|
+
# Allows you to run this workflow manually from the Actions tab
|
|
12
|
+
workflow_dispatch:
|
|
13
|
+
|
|
14
|
+
jobs:
|
|
15
|
+
coverage:
|
|
16
|
+
runs-on: ubuntu-22.04
|
|
17
|
+
|
|
18
|
+
steps:
|
|
19
|
+
- uses: actions/checkout@v2
|
|
20
|
+
with:
|
|
21
|
+
submodules: recursive
|
|
22
|
+
|
|
23
|
+
- name: Install Dependencies
|
|
24
|
+
run: |
|
|
25
|
+
sudo apt-get -y update
|
|
26
|
+
sudo apt-get install --no-install-recommends -y build-essential cmake python3-pip pybind11-dev libeigen3-dev libfmt-dev libtbb-dev libomp-dev libpcl-dev libgtest-dev lcov
|
|
27
|
+
pip install -U setuptools pytest pytest-cov numpy scipy
|
|
28
|
+
|
|
29
|
+
- name: Build (C++)
|
|
30
|
+
run: |
|
|
31
|
+
mkdir build && cd build
|
|
32
|
+
cmake .. -DBUILD_TESTS=ON -DBUILD_EXAMPLES=ON -DBUILD_BENCHMARKS=ON -DBUILD_WITH_TBB=ON -DBUILD_WITH_PCL=ON -DENABLE_COVERAGE=ON
|
|
33
|
+
make -j$(nproc)
|
|
34
|
+
|
|
35
|
+
- name: Test (C++)
|
|
36
|
+
run: |
|
|
37
|
+
cd build
|
|
38
|
+
ctest -j$(nproc)
|
|
39
|
+
make coverage
|
|
40
|
+
|
|
41
|
+
- name: Build (Python)
|
|
42
|
+
run: |
|
|
43
|
+
pip install . --user
|
|
44
|
+
|
|
45
|
+
- name: Test (Python)
|
|
46
|
+
run: |
|
|
47
|
+
pytest src/example/basic_registration.py --cov=src --cov-report=xml
|
|
48
|
+
pytest src/test/python_test.py --cov=src --cov-report=xml
|
|
49
|
+
|
|
50
|
+
- name: Upload coverage reports to Codecov
|
|
51
|
+
uses: codecov/codecov-action@v4.0.1
|
|
52
|
+
with:
|
|
53
|
+
token: ${{ secrets.CODECOV_TOKEN }}
|
|
54
|
+
slug: koide3/small_gicp
|
|
55
|
+
files: build/coverage.info,coverage.xml
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
name: Test
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [ master ]
|
|
6
|
+
paths-ignore: '**.md'
|
|
7
|
+
pull_request:
|
|
8
|
+
branches: [ master ]
|
|
9
|
+
paths-ignore: '**.md'
|
|
10
|
+
|
|
11
|
+
# Allows you to run this workflow manually from the Actions tab
|
|
12
|
+
workflow_dispatch:
|
|
13
|
+
|
|
14
|
+
jobs:
|
|
15
|
+
test:
|
|
16
|
+
runs-on: ubuntu-22.04
|
|
17
|
+
|
|
18
|
+
steps:
|
|
19
|
+
- uses: actions/checkout@v2
|
|
20
|
+
with:
|
|
21
|
+
submodules: recursive
|
|
22
|
+
|
|
23
|
+
- name: Install Dependencies
|
|
24
|
+
run: |
|
|
25
|
+
sudo apt-get -y update
|
|
26
|
+
sudo apt-get install --no-install-recommends -y build-essential cmake python3-pip pybind11-dev libeigen3-dev libfmt-dev libtbb-dev libomp-dev libpcl-dev libgtest-dev
|
|
27
|
+
pip install -U setuptools pytest numpy scipy
|
|
28
|
+
|
|
29
|
+
- name: Build
|
|
30
|
+
run: |
|
|
31
|
+
mkdir build && cd build
|
|
32
|
+
cmake .. -DBUILD_TESTS=ON -DBUILD_EXAMPLES=ON -DBUILD_BENCHMARKS=ON -DBUILD_WITH_TBB=ON -DBUILD_WITH_PCL=ON
|
|
33
|
+
cmake --build . -j$(nproc)
|
|
34
|
+
ctest -j$(nproc)
|
|
35
|
+
cd ..
|
|
36
|
+
pip install . --user
|
|
37
|
+
pytest src/example/basic_registration.py
|
|
38
|
+
pytest src/test/python_test.py
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
# pytest cache directory #
|
|
2
|
+
|
|
3
|
+
This directory contains data from the pytest's cache plugin,
|
|
4
|
+
which provides the `--lf` and `--ff` options, as well as the `cache` fixture.
|
|
5
|
+
|
|
6
|
+
**Do not** commit this to version control.
|
|
7
|
+
|
|
8
|
+
See [the docs](https://docs.pytest.org/en/stable/how-to/cache.html) for more information.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
[]
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
[]
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
# Benchmark
|
|
2
|
+
|
|
3
|
+
## Build
|
|
4
|
+
|
|
5
|
+
```bash
|
|
6
|
+
cd small_gicp
|
|
7
|
+
mkdir build && cd build
|
|
8
|
+
|
|
9
|
+
cmake .. -DBUILD_WITH_TBB=ON -DBUILD_WITH_PCL=ON -DBUILD_BENCHMARKS=ON
|
|
10
|
+
|
|
11
|
+
# [optional] Build with Iridescence (visualization)
|
|
12
|
+
git clone https://github.com/koide3/iridescence --recursive
|
|
13
|
+
mkdir iridescence/build && cd iridescence/build
|
|
14
|
+
cmake .. && make -j
|
|
15
|
+
sudo make install
|
|
16
|
+
|
|
17
|
+
cmake .. -DBUILD_WITH_IRIDESCENCE=ON
|
|
18
|
+
|
|
19
|
+
# [optional] Build with fast_gicp
|
|
20
|
+
export FAST_GICP_INCLUDE_DIR=/your/fast_gicp/include
|
|
21
|
+
cmake .. -DBUILD_WITH_FAST_GICP=ON
|
|
22
|
+
|
|
23
|
+
# Build
|
|
24
|
+
make -j
|
|
25
|
+
|
|
26
|
+
# Test
|
|
27
|
+
# Show options
|
|
28
|
+
./odometry_benchmark
|
|
29
|
+
|
|
30
|
+
# USAGE: odometry_benchmark <dataset_path> <output_path> [options]
|
|
31
|
+
# OPTIONS:
|
|
32
|
+
# --visualize
|
|
33
|
+
# --num_threads <value> (default: 4)
|
|
34
|
+
# --num_neighbors <value> (default: 20)
|
|
35
|
+
# --downsampling_resolution <value> (default: 0.25)
|
|
36
|
+
# --voxel_resolution <value> (default: 2.0)
|
|
37
|
+
# --engine <pcl|small_gicp|small_gicp_omp|small_vgicp_omp|small_gicp_tbb|small_vgicp_tbb|small_vgicp_model_tbb|small_gicp_tbb_flow> (default: small_gicp)
|
|
38
|
+
|
|
39
|
+
# Run odometry benchmark
|
|
40
|
+
./odometry_benchmark /your/kitti/dataset/velodyne /tmp/traj_lidar.txt --visualize --num_threads 16 --engine small_gicp_tbb
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Results
|
|
44
|
+
|
|
45
|
+
All benchmarks were conducted on the KITTI 00 sequence.
|
|
46
|
+
|
|
47
|
+
### Downsampling
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
cd small_gicp/scripts
|
|
51
|
+
./run_downsampling_benchmark.sh
|
|
52
|
+
python3 plot_downsampling.py
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
- Single-threaded `small_gicp::voxelgrid_sampling` is about **1.3x faster** than `pcl::VoxelGrid`.
|
|
56
|
+
- Multi-threaded `small_gicp::voxelgrid_sampling_tbb` (6 threads) is about **3.2x faster** than `pcl::VoxelGrid`.
|
|
57
|
+
- `small_gicp::voxelgrid_sampling` gives accurate downsampling results (almost identical to those of `pcl::VoxelGrid`) while `pcl::ApproximateVoxelGrid` yields spurious points (up to 2x points).
|
|
58
|
+
- `small_gicp::voxelgrid_sampling` can process a larger point cloud with a fine voxel resolution compared to `pcl::VoxelGrid` (for a point cloud of 1000m width, minimum voxel resolution can be 0.5 mm).
|
|
59
|
+
|
|
60
|
+

|
|
61
|
+
|
|
62
|
+
- While TBB shows slightly better scalability, both the parallelism backends do not obtain a speed gain for the cases with threads more than 16.
|
|
63
|
+
|
|
64
|
+

|
|
65
|
+
|
|
66
|
+
### KdTree construction
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
cd small_gicp/scripts
|
|
70
|
+
./run_kdtree_benchmark.sh
|
|
71
|
+
python3 plot_kdtree.py
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
- Multi-threaded implementation (TBB and OMP) can be up to **4x faster** than the single-threaded one (All the implementations are based on nanoflann).
|
|
75
|
+
- The processing speed gets faster as the number of threads increases, but the speed gain is not monotonic sometimes (because of the scheduling algorithm or some CPU(AMD 5995WX)-specific issues?).
|
|
76
|
+
- This benchmark only compares the construction time (query time is not included).
|
|
77
|
+
|
|
78
|
+

|
|
79
|
+
|
|
80
|
+
### Odometry estimation
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
cd small_gicp/scripts
|
|
84
|
+
./run_odometry_benchmark.sh
|
|
85
|
+
python3 plot_odometry.py
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
- Single-thread `small_gicp::GICP` is about **2.4x and 1.9x faster** than `pcl::GICP` and `fast_gicp::GICP`, respectively.
|
|
89
|
+
- `small_gicp::(GICP|VGICP)` shows a better multi-thread scalability compared to `fast_gicp::(GICP|VGICP)`.
|
|
90
|
+
- `small_gicp::GICP` parallelized with [TBB flow graph](src/odometry_benchmark_small_gicp_tbb_flow.cpp) shows an excellent scalability to many-threads situations (**~128 threads**) but with latency degradation.
|
|
91
|
+
|
|
92
|
+

|
|
93
|
+
|
|
94
|
+
**SIMD intrinsics (-march=native)** (We recommend keeping this feature disabled unless you are 100% sure what it is)
|
|
95
|
+
|
|
96
|
+
- `BUILD_WITH_MARCH_NATIVE=ON` enables platform-specific intrinsics and squeezing the performance (**1.1x speedup for free**).
|
|
97
|
+
- However, you must ensure that all involved libraries are built with `-march=native`, otherwise the program will crash.
|
|
98
|
+
- Generally, it is difficult to properly set `-march=native` for all libraries, and we recommend keeping `BUILD_WITH_MARCH_NATIVE=OFF`.
|
|
99
|
+
|
|
100
|
+
Results:
|
|
101
|
+
- `BUILD_WITH_MARCH_NATIVE=OFF` : `Eigen::SimdInstructionSetsInUse()=SSE, SSE2`
|
|
102
|
+
- `BUILD_WITH_MARCH_NATIVE=ON` : `Eigen::SimdInstructionSetsInUse()=AVX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2`
|
|
103
|
+
|
|
104
|
+

|
|
105
|
+
|
|
106
|
+
**Accuracy**
|
|
107
|
+
|
|
108
|
+
- `small_gicp::GICP` outputs mostly identical results to those of `fast_gicp::GICP`.
|
|
109
|
+
- The results of `small_gicp::VGICP` slightly differ from `fast_gicp::VGICP`. Although the difference is marginal, it needs to be investigated.
|
|
110
|
+
|
|
111
|
+
```
|
|
112
|
+
pcl_gicp : APE=6.451 +- 3.421 RPE(100)=2.424 +- 1.707 RPE(400)=8.416 +- 4.284 RPE(800)=12.652 +- 6.799
|
|
113
|
+
fast_gicp : APE=6.118 +- 3.078 RPE(100)=1.212 +- 0.717 RPE(400)=6.058 +- 3.128 RPE(800)=10.356 +- 6.335
|
|
114
|
+
fast_vgicp : APE=6.791 +- 3.215 RPE(100)=1.253 +- 0.734 RPE(400)=6.315 +- 3.011 RPE(800)=10.367 +- 6.147
|
|
115
|
+
small_gicp : APE=6.096 +- 3.056 RPE(100)=1.211 +- 0.717 RPE(400)=6.057 +- 3.123 RPE(800)=10.364 +- 6.336
|
|
116
|
+
small_gicp (tbb) : APE=6.096 +- 3.056 RPE(100)=1.211 +- 0.717 RPE(400)=6.057 +- 3.123 RPE(800)=10.364 +- 6.336
|
|
117
|
+
small_gicp (omp) : APE=6.096 +- 3.056 RPE(100)=1.211 +- 0.717 RPE(400)=6.057 +- 3.123 RPE(800)=10.364 +- 6.336
|
|
118
|
+
small_vgicp : APE=5.956 +- 2.725 RPE(100)=1.315 +- 0.762 RPE(400)=6.849 +- 3.401 RPE(800)=10.396 +- 6.972
|
|
119
|
+
```
|