30 #include "gtest/gtest.h" 33 namespace mapping_2d {
34 namespace scan_matching {
37 TEST(PrecomputationGridTest, CorrectValues) {
40 std::mt19937 prng(42);
41 std::uniform_int_distribution<int> distribution(0, 255);
42 ProbabilityGrid probability_grid(
43 MapLimits(0.05, Eigen::Vector2d(5., 5.), CellLimits(250, 250)));
44 probability_grid.StartUpdate();
45 for (
const Eigen::Array2i& xy_index :
46 XYIndexRangeIterator(Eigen::Array2i(50, 50), Eigen::Array2i(249, 249))) {
47 probability_grid.SetProbability(
51 std::vector<float> reusable_intermediate_grid;
52 for (
const int width : {1, 2, 3, 8}) {
53 PrecomputationGrid precomputation_grid(
54 probability_grid, probability_grid.limits().cell_limits(), width,
55 &reusable_intermediate_grid);
56 for (
const Eigen::Array2i& xy_index :
57 XYIndexRangeIterator(probability_grid.limits().cell_limits())) {
58 float max_score = -std::numeric_limits<float>::infinity();
59 for (
int y = 0; y != width; ++y) {
60 for (
int x = 0; x != width; ++x) {
61 max_score = std::max<float>(
63 probability_grid.GetProbability(xy_index + Eigen::Array2i(x, y)));
66 EXPECT_NEAR(max_score,
68 precomputation_grid.GetValue(xy_index)),
74 TEST(PrecomputationGridTest, TinyProbabilityGrid) {
75 std::mt19937 prng(42);
76 std::uniform_int_distribution<int> distribution(0, 255);
77 ProbabilityGrid probability_grid(
78 MapLimits(0.05, Eigen::Vector2d(0.1, 0.1), CellLimits(4, 4)));
79 probability_grid.StartUpdate();
80 for (
const Eigen::Array2i& xy_index :
81 XYIndexRangeIterator(probability_grid.limits().cell_limits())) {
82 probability_grid.SetProbability(
86 std::vector<float> reusable_intermediate_grid;
87 for (
const int width : {1, 2, 3, 8, 200}) {
88 PrecomputationGrid precomputation_grid(
89 probability_grid, probability_grid.limits().cell_limits(), width,
90 &reusable_intermediate_grid);
91 for (
const Eigen::Array2i& xy_index :
92 XYIndexRangeIterator(probability_grid.limits().cell_limits())) {
93 float max_score = -std::numeric_limits<float>::infinity();
94 for (
int y = 0; y != width; ++y) {
95 for (
int x = 0; x != width; ++x) {
96 max_score = std::max<float>(
98 probability_grid.GetProbability(xy_index + Eigen::Array2i(x, y)));
101 EXPECT_NEAR(max_score,
103 precomputation_grid.GetValue(xy_index)),
109 proto::FastCorrelativeScanMatcherOptions
110 CreateFastCorrelativeScanMatcherTestOptions(
const int branch_and_bound_depth) {
111 auto parameter_dictionary =
114 linear_search_window = 3., 115 angular_search_window = 1., 116 branch_and_bound_depth = )text" + 117 std::to_string(branch_and_bound_depth) + "}");
121 mapping_2d::proto::RangeDataInserterOptions
122 CreateRangeDataInserterTestOptions() {
125 insert_free_space = true, 126 hit_probability = 0.7, 127 miss_probability = 0.4, 132 TEST(FastCorrelativeScanMatcherTest, CorrectPose) {
133 std::mt19937 prng(42);
134 std::uniform_real_distribution<float> distribution(-1.f, 1.f);
135 RangeDataInserter range_data_inserter(CreateRangeDataInserterTestOptions());
136 constexpr
float kMinScore = 0.1f;
137 const auto options = CreateFastCorrelativeScanMatcherTestOptions(3);
140 point_cloud.emplace_back(-2.5f, 0.5f, 0.f);
141 point_cloud.emplace_back(-2.f, 0.5f, 0.f);
142 point_cloud.emplace_back(0.f, -0.5f, 0.f);
143 point_cloud.emplace_back(0.5f, -1.6f, 0.f);
144 point_cloud.emplace_back(2.5f, 0.5f, 0.f);
145 point_cloud.emplace_back(2.5f, 1.7f, 0.f);
147 for (
int i = 0; i != 50; ++i) {
149 {2. * distribution(prng), 2. * distribution(prng)},
150 0.5 * distribution(prng));
152 ProbabilityGrid probability_grid(
153 MapLimits(0.05, Eigen::Vector2d(5., 5.), CellLimits(200, 200)));
154 probability_grid.StartUpdate();
155 range_data_inserter.Insert(
157 Eigen::Vector3f(expected_pose.translation().x(),
158 expected_pose.translation().y(), 0.f),
164 FastCorrelativeScanMatcher fast_correlative_scan_matcher(probability_grid,
168 EXPECT_TRUE(fast_correlative_scan_matcher.Match(
171 EXPECT_LT(kMinScore, score);
172 EXPECT_THAT(expected_pose,
173 transform::IsNearly(pose_estimate.cast<
float>(), 0.03f))
179 TEST(FastCorrelativeScanMatcherTest, FullSubmapMatching) {
180 std::mt19937 prng(42);
181 std::uniform_real_distribution<float> distribution(-1.f, 1.f);
182 RangeDataInserter range_data_inserter(CreateRangeDataInserterTestOptions());
183 constexpr
float kMinScore = 0.1f;
184 const auto options = CreateFastCorrelativeScanMatcherTestOptions(6);
187 unperturbed_point_cloud.emplace_back(-2.5f, 0.5f, 0.f);
188 unperturbed_point_cloud.emplace_back(-2.25f, 0.5f, 0.f);
189 unperturbed_point_cloud.emplace_back(0.f, 0.5f, 0.f);
190 unperturbed_point_cloud.emplace_back(0.25f, 1.6f, 0.f);
191 unperturbed_point_cloud.emplace_back(2.5f, 0.5f, 0.f);
192 unperturbed_point_cloud.emplace_back(2.0f, 1.8f, 0.f);
194 for (
int i = 0; i != 20; ++i) {
196 {10. * distribution(prng), 10. * distribution(prng)},
197 1.6 * distribution(prng));
202 0.5 * distribution(prng)) *
203 perturbation.inverse();
205 ProbabilityGrid probability_grid(
206 MapLimits(0.05, Eigen::Vector2d(5., 5.), CellLimits(200, 200)));
207 probability_grid.StartUpdate();
208 range_data_inserter.Insert(
216 FastCorrelativeScanMatcher fast_correlative_scan_matcher(probability_grid,
220 EXPECT_TRUE(fast_correlative_scan_matcher.MatchFullSubmap(
221 point_cloud, kMinScore, &score, &pose_estimate));
222 EXPECT_LT(kMinScore, score);
223 EXPECT_THAT(expected_pose,
224 transform::IsNearly(pose_estimate.cast<
float>(), 0.03f))
PointCloud TransformPointCloud(const PointCloud &point_cloud, const transform::Rigid3f &transform)
std::unique_ptr< LuaParameterDictionary > MakeDictionary(const string &code)
proto::RangeDataInserterOptions CreateRangeDataInserterOptions(common::LuaParameterDictionary *const parameter_dictionary)
std::vector< Eigen::Vector3f > PointCloud
static float ToProbability(float value)
proto::FastCorrelativeScanMatcherOptions CreateFastCorrelativeScanMatcherOptions(common::LuaParameterDictionary *const parameter_dictionary)