35 #include <gtest/gtest.h> 39 #include <costmap_cspace_msgs/MapMetaData3D.h> 75 , ec_(0.5
f, 0.5
f, 0.2
f)
76 , dm_(cm_rough_, bbf_costmap_)
79 const int local_range = 10;
80 omp_set_num_threads(2);
82 costmap_cspace_msgs::MapMetaData3D map_info;
86 map_info.linear_resolution = 1.0;
87 map_info.angular_resolution = M_PI * 2 /
angle_;
97 Astar::Gridmap<char, 0x40> cm;
98 Astar::Gridmap<char, 0x80> cm_hyst;
107 cm_hyst.reset(size3d);
108 cm_rough_.reset(size2d);
109 bbf_costmap_.
reset(size2d);
114 bbf_costmap_.
clear();
120 .local_range = local_range,
123 .resolution = map_info.linear_resolution,
125 dm_.
init(model, dmp);
143 for (
int x = 0; x <
w_; x++)
153 const std::string& msg)
const 158 2.7 + ec_[0] * (p -
Astar::Vec(3, 5, 0)).norm(),
165 ec_[0] * (p - e_).norm(),
171 ASSERT_NEAR(2.7, d, tolerance_) << msg;
177 for (
int y = 0; y <
h_; y++)
179 for (
int x = 0; x <
w_; x++)
183 if (::testing::Test::HasFatalFailure())
193 public ::testing::WithParamInterface<std::vector<Vec3>>
198 UpdateWithTemporaryObstacles,
215 std::vector<Vec3>()));
233 const std::vector<Vec3> obstacles = GetParam();
236 for (
int from_y = 0; from_y <
h_; from_y++)
238 for (
int from_x = 0; from_x <
w_; from_x++)
240 const std::string from(xyStr(from_x, from_y));
241 for (
int to_y = from_y; to_y <
h_; to_y++)
243 for (
int to_x = from_x; to_x <
w_; to_x++)
245 const std::string to(xyStr(to_x, to_y));
249 for (
const Vec3& obstacle : obstacles)
251 if (from_x < obstacle[0] && obstacle[0] < to_x &&
252 from_y < obstacle[1] && obstacle[1] < to_y)
263 for (
int i = 0; i < 5; i++)
268 Vec3(from_x, from_y, 0),
Vec3(to_x, to_y, 0)));
269 if (!
validate(
"update " + from +
"-" + to))
288 const int range_ = 2;
289 const int local_range_ = 2;
290 const int longcut_range_ = 2;
294 const int search_range_ = 4;
302 : ec_(0.5
f, 0.5
f, 0.2
f)
303 , dm_(cm_rough_, bbf_costmap_)
305 costmap_cspace_msgs::MapMetaData3D map_info;
307 map_info.height =
h_;
309 map_info.linear_resolution = 1.0;
310 map_info.angular_resolution = M_PI * 2 /
angle_;
316 omp_set_num_threads(1);
321 Astar::Gridmap<char, 0x40> cm;
322 Astar::Gridmap<char, 0x80> cm_hyst;
331 cm_hyst.reset(size3d);
332 cm_rough_.reset(size2d);
333 bbf_costmap_.
reset(size2d);
337 bbf_costmap_.
clear();
343 .local_range = local_range_,
344 .longcut_range = longcut_range_,
346 .resolution = map_info.linear_resolution,
348 dm_.
init(model, dmp);
357 const float tolerance = 0.4;
359 const int range_overshoot = range_ + local_range_ + longcut_range_ + search_range_;
361 const auto validate = [
this, s, e, tolerance, range_overshoot]()
363 for (
int y = 0; y <
h_; y++)
365 for (
int x = 0; x <
w_; x++)
368 const float cost =
dm_[p];
369 const float d = (p - e).norm();
370 const float d_from_start = (p - s).norm();
371 if (x < s[0] || d_from_start <= range_overshoot)
373 ASSERT_NEAR(
ec_[0] * d, cost, tolerance) << xyStr(x, y);
375 else if (d_from_start > range_overshoot)
377 ASSERT_EQ(std::numeric_limits<float>::max(), cost) << xyStr(x, y);
385 SCOPED_TRACE(
"After create");
388 if (::testing::Test::HasFatalFailure())
396 SCOPED_TRACE(
"After update");
399 if (::testing::Test::HasFatalFailure())
408 const float tolerance = 0.4;
410 const int range_overshoot = range_ + local_range_ + longcut_range_ + search_range_;
411 const auto validate = [
this, s, e, tolerance, range_overshoot](
const int obstacle_x)
413 for (
int y = 0; y <
h_; y++)
415 for (
int x = 0; x <
w_; x++)
418 const float cost =
dm_[p];
419 const float d = (p - e).norm();
420 const float d_from_start = (p - s).norm();
421 if ((x < s[0] || d_from_start < range_overshoot) && x < obstacle_x)
423 ASSERT_NEAR(
ec_[0] * d, cost, tolerance) << xyStr(x, y);
425 else if (x > obstacle_x)
427 ASSERT_EQ(std::numeric_limits<float>::max(), cost) << xyStr(x, y);
435 SCOPED_TRACE(
"No obstacle");
439 for (
int y = 0; y <
h_; y++)
448 SCOPED_TRACE(
"Obstacle at x=5");
451 if (::testing::Test::HasFatalFailure())
464 SCOPED_TRACE(
"No obstacle");
467 if (::testing::Test::HasFatalFailure())
476 int main(
int argc,
char** argv)
478 testing::InitGoogleTest(&argc, argv);
480 return RUN_ALL_TESTS();
std::shared_ptr< GridAstarModel3D > Ptr
void init(const GridAstarModel3D::Ptr model, const Params &p)
CyclicVecInt< DIM, NONCYCLIC > Vec
void reset(const Vec &size)
int main(int argc, char **argv)
Astar::Gridmap< char, 0x80 > cm_rough_
TEST_P(DistanceMapTestWithParam, Update)
float angle_resolution_aspect_
void validateDistance(const Astar::Vec p, const float d, const std::string &msg) const
TEST_F(DistanceMapTest, Create)
CyclicVecInt< 3, 2 > Vec3
const Astar::Gridmap< float > & gridmap() const
INSTANTIATE_TEST_CASE_P(UpdateWithTemporaryObstacles, DistanceMapTestWithParam, ::testing::Values(std::vector< Vec3 >({ Vec3(7, 7, 0), }), std::vector< Vec3 >({ Vec3(4, 2, 0), Vec3(7, 2, 0), }), std::vector< Vec3 >({ Vec3(3, 5, 0), }), std::vector< Vec3 >()))
void setParams(const CostCoeff &cc, const int num_cost_estim_task)
Astar::Gridmap< char, 0x80 > cm_rough_
bool validate(const std::string &msg) const
void create(const Astar::Vec &s, const Astar::Vec &e)
void update(const Astar::Vec &s, const Astar::Vec &e, const Rect &rect)