15 #include <gmock/gmock.h>
16 #include <gtest/gtest.h>
21 #include <range/v3/range/conversion.hpp>
22 #include <range/v3/view/transform.hpp>
34 TEST(LikelihoodFieldModel, LikelihoodField) {
35 constexpr
double kResolution = 0.5;
37 const auto grid = StaticOccupancyGrid<5, 5>{{
38 false,
false,
false,
false, true ,
39 false,
false,
false, true ,
false,
40 false,
false, true ,
false,
false,
41 false, true ,
false,
false,
false,
42 true ,
false,
false,
false,
false},
45 const double expected_likelihood_field[] = {
46 0.025, 0.025, 0.025, 0.069, 1.022,
47 0.025, 0.027, 0.069, 1.022, 0.069,
48 0.025, 0.069, 1.022, 0.069, 0.025,
49 0.069, 1.022, 0.069, 0.027, 0.025,
50 1.022, 0.069, 0.025, 0.025, 0.025
55 auto sensor_model =
UUT{params, grid};
58 auto expected_cubed_likelihood =
59 expected_likelihood_field | ranges::views::transform([](
auto v) {
return v * v * v; }) | ranges::to<std::vector>;
62 sensor_model.likelihood_field().data(),
63 testing::Pointwise(testing::DoubleNear(0.003), expected_cubed_likelihood));
66 TEST(LikelihoodFieldModel, ImportanceWeight) {
67 constexpr
double kResolution = 0.5;
69 const auto grid = StaticOccupancyGrid<5, 5>{{
70 false,
false,
false,
false,
false,
71 false,
false,
false,
false,
false,
72 false,
false, true ,
false,
false,
73 false,
false,
false,
false,
false,
74 false,
false,
false,
false,
false},
79 auto sensor_model =
UUT{params, grid};
82 auto state_weighting_function = sensor_model(std::vector<std::pair<double, double>>{{1.25, 1.25}});
83 ASSERT_NEAR(2.068, state_weighting_function(grid.origin()), 0.003);
87 auto state_weighting_function = sensor_model(std::vector<std::pair<double, double>>{{2.25, 2.25}});
88 ASSERT_NEAR(1.000, state_weighting_function(grid.origin()), 0.003);
92 auto state_weighting_function = sensor_model(std::vector<std::pair<double, double>>{{-50.0, 50.0}});
93 ASSERT_NEAR(1.000, state_weighting_function(grid.origin()), 0.003);
97 auto state_weighting_function =
98 sensor_model(std::vector<std::pair<double, double>>{{1.20, 1.20}, {1.25, 1.25}, {1.30, 1.30}});
99 ASSERT_NEAR(4.205, state_weighting_function(grid.origin()), 0.01);
103 auto state_weighting_function = sensor_model(std::vector<std::pair<double, double>>{{0.0, 0.0}});
108 TEST(LikelihoodFieldModel, GridWithOffset) {
109 constexpr
double kResolution = 2.0;
111 const auto grid = StaticOccupancyGrid<5, 5>{{
112 false,
false,
false,
false,
false,
113 false,
false,
false,
false,
false,
114 false,
false,
false,
false,
false,
115 false,
false,
false,
false,
false,
116 false,
false,
false,
false,
true },
122 auto sensor_model =
UUT{params, grid};
125 auto state_weighting_function = sensor_model(std::vector<std::pair<double, double>>{{4.5, 4.5}});
126 ASSERT_NEAR(2.068, state_weighting_function(
Sophus::SE2d{}), 0.003);
130 auto state_weighting_function = sensor_model(std::vector<std::pair<double, double>>{{9.5, 9.5}});
131 ASSERT_NEAR(2.068, state_weighting_function(grid.origin()), 0.003);
135 TEST(LikelihoodFieldModel, GridWithRotation) {
136 constexpr
double kResolution = 2.0;
138 const auto grid = StaticOccupancyGrid<5, 5>{{
139 false,
false,
false,
false,
false,
140 false,
false,
false,
false,
false,
141 false,
false,
false,
false,
false,
142 false,
false,
false,
false,
false,
143 false,
false,
false,
false,
true },
149 auto sensor_model =
UUT{params, grid};
152 auto state_weighting_function = sensor_model(std::vector<std::pair<double, double>>{{-9.5, 9.5}});
153 ASSERT_NEAR(2.068, state_weighting_function(
Sophus::SE2d{}), 0.003);
157 auto state_weighting_function = sensor_model(std::vector<std::pair<double, double>>{{9.5, 9.5}});
158 ASSERT_NEAR(2.068, state_weighting_function(grid.origin()), 0.003);
162 TEST(LikelihoodFieldModel, GridWithRotationAndOffset) {
163 constexpr
double kResolution = 2.0;
166 const auto origin =
Sophus::SE2d{origin_rotation, origin_rotation * Eigen::Vector2d{-5, -5}};
168 const auto grid = StaticOccupancyGrid<5, 5>{{
169 false,
false,
false,
false,
false,
170 false,
false,
false,
false,
false,
171 false,
false,
false,
false,
false,
172 false,
false,
false,
false,
false,
173 false,
false,
false,
false,
true },
179 auto sensor_model =
UUT{params, grid};
182 auto state_weighting_function = sensor_model(std::vector<std::pair<double, double>>{{-4.5, 4.5}});
183 ASSERT_NEAR(2.068, state_weighting_function(
Sophus::SE2d{}), 0.003);
187 auto state_weighting_function = sensor_model(std::vector<std::pair<double, double>>{{9.5, 9.5}});
188 ASSERT_NEAR(2.068, state_weighting_function(grid.origin()), 0.003);
192 TEST(LikelihoodFieldModel, GridUpdates) {
195 constexpr
double kResolution = 0.5;
197 auto grid = StaticOccupancyGrid<5, 5>{{
198 false,
false,
false,
false,
false,
199 false,
false,
false,
false,
false,
200 false,
false, true ,
false,
false,
201 false,
false,
false,
false,
false,
202 false,
false,
false,
false,
false},
203 kResolution, origin};
207 auto sensor_model =
UUT{params, std::move(grid)};
210 auto state_weighting_function = sensor_model(std::vector<std::pair<double, double>>{{1., 1.}});
211 EXPECT_NEAR(2.068577607986223, state_weighting_function(origin), 1e-6);
215 grid = StaticOccupancyGrid<5, 5>{{
216 false,
false,
false,
false,
false,
217 false,
false,
false,
false,
false,
218 false,
false,
false,
false,
false,
219 false,
false,
false,
false,
false,
220 false,
false,
false,
false,
true},
221 kResolution, origin};
223 sensor_model.update_map(std::move(grid));
226 auto state_weighting_function = sensor_model(std::vector<std::pair<double, double>>{{1., 1.}});
227 EXPECT_NEAR(1.0, state_weighting_function(origin), 1e-3);