Skip to content

Commit bbe5949

Browse files
orlando21larafcladera
authored andcommitted
Changed VoxelMapper class to use axis-aligned voxels and added more unit tests
1 parent 96c9b6d commit bbe5949

File tree

5 files changed

+748
-176
lines changed

5 files changed

+748
-176
lines changed

autonomy_core/map_plan/mapper/CMakeLists.txt

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,14 +28,34 @@ target_link_libraries(local_global_mapper PUBLIC ${PROJECT_NAME} Boost::timer)
2828

2929
#----------------------------------------------------------------------------------
3030
# Add testing with GoogleTest
31+
32+
# To run test:
33+
# catkin test mapper
3134
enable_testing()
3235

3336
catkin_add_gtest(test_voxel_mapper test/test_voxel_mapper.cpp)
3437
target_link_libraries(test_voxel_mapper ${catkin_LIBRARIES} ${PROJECT_NAME})
3538

3639
#----------------------------------------------------------------------------------
3740
# Add microbenchmarking with Google Benchmark
38-
find_package(benchmark REQUIRED)
41+
42+
# To run benchmark:
43+
# rosrun mapper benchmarking
44+
# if you want to save the results to a file:
45+
# rosrun mapper benchmarking --benchmark_out=file_name.json
46+
# if you want to compare two benchmark files, use the compare.py script located
47+
# in the build directory under mapper/_deps/benchmark-src/tools/ (you will need
48+
# to have pandas installed). Also changed the shebang to use python3
49+
# e.g. from the catkin root directory run:
50+
# ./build/mapper/_deps/benchmark-src/tools/compare.py benchmarks file1.json file2.json
51+
52+
include(FetchContent)
53+
FetchContent_Declare(
54+
benchmark
55+
URL https://github.com/google/benchmark/archive/b7afda2cd2d81230737caa1073e160b6406798d7.zip
56+
)
57+
FetchContent_MakeAvailable(benchmark)
58+
3959
add_executable(benchmarking test/benchmark_voxel_mapper.cpp)
4060
target_link_libraries(benchmarking benchmark::benchmark ${PROJECT_NAME})
4161

autonomy_core/map_plan/mapper/include/mapper/voxel_mapper.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ class VoxelMapper {
1919
// access private methods and members
2020
friend class VoxelMapperTest;
2121
FRIEND_TEST(VoxelMapperTest, TestAllocateRelocate);
22-
FRIEND_TEST(VoxelMapperTest, TestDecayLocalCloud);
2322

2423
public:
2524
/**
@@ -37,6 +36,9 @@ class VoxelMapper {
3736
int8_t val = 0,
3837
int decay_times_to_empty = 0);
3938

39+
/// set the map with some predefined values
40+
void setMap(const Eigen::Vector3d &ori, const Eigen::Vector3i &dim,
41+
const std::vector<signed char> &map, double res);
4042
/// Set all voxels as unknown
4143
void setMapUnknown();
4244
/// Set all voxels as free

autonomy_core/map_plan/mapper/src/voxel_mapper.cpp

Lines changed: 36 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,25 @@ VoxelMapper::VoxelMapper(const Eigen::Vector3d& origin,
3636
}
3737
}
3838

39+
void VoxelMapper::setMap(const Eigen::Vector3d &ori, const Eigen::Vector3i &dim,
40+
const std::vector<signed char> &map, double res) {
41+
dim_ = dim;
42+
origin_d_ = ori;
43+
res_ = res;
44+
45+
map_.resize(boost::extents[dim_(0)][dim_(1)][dim_(2)]);
46+
47+
Eigen::Vector3i n;
48+
for (n(0) = 0; n(0) < dim_(0); n(0)++) {
49+
for (n(1) = 0; n(1) < dim_(1); n(1)++) {
50+
for (n(2) = 0; n(2) < dim_(2); n(2)++) {
51+
int idx = n(0) + dim_(0) * n(1) + dim_(0) * dim_(1) * n(2);
52+
map_[n(0)][n(1)][n(2)] = map[idx];
53+
}
54+
}
55+
}
56+
}
57+
3958
void VoxelMapper::setMapUnknown() {
4059
val_default = val_unknown;
4160
std::fill(map_.data(), map_.data() + map_.num_elements(), val_unknown);
@@ -108,13 +127,14 @@ vec_Vec3d VoxelMapper::getLocalCloud(const Eigen::Vector3d& pos,
108127
for (int i = 0; i < 3; i++) dim_low(i) = dim1(i) < 0 ? 0 : dim1(i);
109128

110129
Eigen::Vector3i dim2 = floatToInt(pos + ori + dim);
111-
for (int i = 0; i < 3; i++) dim_up(i) = dim2(i) > dim_(i) ? dim_(i) : dim2(i);
130+
for (int i = 0; i < 3; i++)
131+
dim_up(i) = dim2(i) >= dim_(i) ? dim_(i)-1 : dim2(i);
112132

113133
vec_Vec3d pts;
114134
Eigen::Vector3i n;
115-
for (n(0) = dim_low(0); n(0) < dim_up(0); n(0)++) {
116-
for (n(1) = dim_low(1); n(1) < dim_up(1); n(1)++) {
117-
for (n(2) = dim_low(2); n(2) < dim_up(2); n(2)++) {
135+
for (n(0) = dim_low(0); n(0) <= dim_up(0); n(0)++) {
136+
for (n(1) = dim_low(1); n(1) <= dim_up(1); n(1)++) {
137+
for (n(2) = dim_low(2); n(2) <= dim_up(2); n(2)++) {
118138
if (map_[n(0)][n(1)][n(2)] > val_even) pts.push_back(intToFloat(n));
119139
}
120140
}
@@ -140,14 +160,15 @@ void VoxelMapper::decayLocalCloud(const Eigen::Vector3d& pos,
140160
for (int i = 0; i < 3; i++) dim_low(i) = dim1(i) < 0 ? 0 : dim1(i);
141161

142162
Eigen::Vector3i dim2 = floatToInt(end_pos);
143-
for (int i = 0; i < 3; i++) dim_up(i) = dim2(i) > dim_(i) ? dim_(i) : dim2(i);
163+
for (int i = 0; i < 3; i++)
164+
dim_up(i) = dim2(i) >= dim_(i) ? dim_(i)-1 : dim2(i);
144165

145166
// Decaying voxels within robot's local region (voxels will disappear if
146167
// unobserved for (val_occ - val_even) / val_decay times)
147168
Eigen::Vector3i n;
148-
for (n(0) = dim_low(0); n(0) < dim_up(0); n(0)++) {
149-
for (n(1) = dim_low(1); n(1) < dim_up(1); n(1)++) {
150-
for (n(2) = dim_low(2); n(2) < dim_up(2); n(2)++) {
169+
for (n(0) = dim_low(0); n(0) <= dim_up(0); n(0)++) {
170+
for (n(1) = dim_low(1); n(1) <= dim_up(1); n(1)++) {
171+
for (n(2) = dim_low(2); n(2) <= dim_up(2); n(2)++) {
151172
if (map_[n(0)][n(1)][n(2)] > val_even)
152173
map_[n(0)][n(1)][n(2)] = map_[n(0)][n(1)][n(2)] - val_decay;
153174
if (inflated_map_[n(0)][n(1)][n(2)] > val_even)
@@ -169,13 +190,14 @@ vec_Vec3d VoxelMapper::getInflatedLocalCloud(const Eigen::Vector3d& pos,
169190
for (int i = 0; i < 3; i++) dim_low(i) = dim1(i) < 0 ? 0 : dim1(i);
170191

171192
Eigen::Vector3i dim2 = floatToInt(pos + ori + dim);
172-
for (int i = 0; i < 3; i++) dim_up(i) = dim2(i) > dim_(i) ? dim_(i) : dim2(i);
193+
for (int i = 0; i < 3; i++)
194+
dim_up(i) = dim2(i) >= dim_(i) ? dim_(i)-1 : dim2(i);
173195

174196
vec_Vec3d pts;
175197
Eigen::Vector3i n;
176-
for (n(0) = dim_low(0); n(0) < dim_up(0); n(0)++) {
177-
for (n(1) = dim_low(1); n(1) < dim_up(1); n(1)++) {
178-
for (n(2) = dim_low(2); n(2) < dim_up(2); n(2)++) {
198+
for (n(0) = dim_low(0); n(0) <= dim_up(0); n(0)++) {
199+
for (n(1) = dim_low(1); n(1) <= dim_up(1); n(1)++) {
200+
for (n(2) = dim_low(2); n(2) <= dim_up(2); n(2)++) {
179201
if (inflated_map_[n(0)][n(1)][n(2)] > val_free)
180202
pts.push_back(intToFloat(n));
181203
}
@@ -494,7 +516,8 @@ Eigen::Vector3i VoxelMapper::floatToInt(const Eigen::Vector3d& pt) {
494516
}
495517

496518
Eigen::Vector3d VoxelMapper::intToFloat(const Eigen::Vector3i& pn) {
497-
return pn.cast<double>() * res_ + origin_d_;
519+
return (pn.cast<double>() + Eigen::Vector3d(0.5, 0.5, 0.5)) * res_
520+
+ origin_d_;
498521
}
499522

500523
bool VoxelMapper::isOutSide(const Eigen::Vector3i& pn) {

autonomy_core/map_plan/mapper/test/benchmark_voxel_mapper.cpp

Lines changed: 17 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
* fourth argument is the resolution multiplied by 100 because arguments are
77
* signed long.
88
*/
9-
static void BM_GetMap(benchmark::State& state) {
9+
static void BM_GetInflatedMap(benchmark::State& state) {
1010
int x_dim = state.range(0);
1111
int y_dim = state.range(1);
1212
int z_dim = state.range(2);
@@ -23,15 +23,10 @@ static void BM_GetMap(benchmark::State& state) {
2323
decay_times);
2424

2525
for (auto _ : state) {
26-
test_mapper.getMap();
26+
test_mapper.getInflatedMap();
2727
}
2828
}
2929

30-
BENCHMARK(BM_GetMap)
31-
->Args({200, 200, 10, 50})
32-
->Args({200, 200, 10, 25})
33-
->Args({200, 200, 10, 10});
34-
3530

3631
/**
3732
* @brief Arguments represent the x-dim, y-dim, and z-dim size respectively. The
@@ -62,11 +57,6 @@ static void BM_DecayLocalCloud(benchmark::State& state) {
6257
}
6358
}
6459

65-
BENCHMARK(BM_DecayLocalCloud)
66-
->Args({200, 200, 10, 50})
67-
->Args({200, 200, 10, 25})
68-
->Args({200, 200, 10, 10});
69-
7060

7161
/**
7262
* @brief Arguments represent the x-dim, y-dim, and z-dim size respectively. The
@@ -126,11 +116,6 @@ static void BM_AddCloud(benchmark::State& state) {
126116
}
127117
}
128118

129-
BENCHMARK(BM_AddCloud)
130-
->Args({200, 200, 10, 50})
131-
->Args({200, 200, 10, 25})
132-
->Args({200, 200, 10, 10});
133-
134119

135120
/**
136121
* @brief Arguments represent the x-dim, y-dim, and z-dim size respectively. The
@@ -161,42 +146,28 @@ static void BM_GetInflatedLocalMap(benchmark::State& state) {
161146
}
162147
}
163148

164-
BENCHMARK(BM_GetInflatedLocalMap)
149+
150+
BENCHMARK(BM_GetInflatedMap)
165151
->Args({200, 200, 10, 50})
166152
->Args({200, 200, 10, 25})
167153
->Args({200, 200, 10, 10});
168154

155+
BENCHMARK(BM_DecayLocalCloud)
156+
->Args({200, 200, 10, 50})
157+
->Args({200, 200, 10, 25})
158+
->Args({200, 200, 10, 10});
169159

170-
// class VoxelMapperBenchmark : public benchmark::Fixture {
171-
// public:
172-
// void SetUp(const ::benchmark::State& state) {
173-
// int x_origin_ = -100;
174-
// int y_origin_ = -100;
175-
// int z_origin_ = -5;
176-
// int x_dim_ = 200;
177-
// int y_dim_ = 200;
178-
// int z_dim_ = 10;
179-
// double resolution_ = 0.5;
180-
// int8_t val_default_ = 0;
181-
// int decay_times_ = 30;
182-
// Eigen::Vector3d origin(x_origin_, y_origin_, z_origin_);
183-
// Eigen::Vector3d dimensions(x_dim_, y_dim_, z_dim_);
184-
// p_test_mapper_.reset(new mapper::VoxelMapper(origin, dimensions,
185-
// resolution_, val_default_,
186-
// decay_times_));
187-
// }
188-
189-
// std::unique_ptr<mapper::VoxelMapper> p_test_mapper_;
160+
BENCHMARK(BM_AddCloud)
161+
->Args({200, 200, 10, 50})
162+
->Args({200, 200, 10, 25})
163+
->Args({200, 200, 10, 10});
190164

191-
// };
165+
BENCHMARK(BM_GetInflatedLocalMap)
166+
->Args({200, 200, 10, 50})
167+
->Args({200, 200, 10, 25})
168+
->Args({200, 200, 10, 10});
192169

193-
// BENCHMARK_DEFINE_F(VoxelMapperBenchmark, GetMapTest)(benchmark::State& st) {
194-
// for (auto _ : st) {
195-
// p_test_mapper_->getMap();
196-
// }
197-
// }
198170

199-
// BENCHMARK_REGISTER_F(VoxelMapperBenchmark, GetMapTest);
171+
BENCHMARK_MAIN();
200172

201173

202-
BENCHMARK_MAIN();

0 commit comments

Comments
 (0)