diff --git a/nav2_smac_planner/include/nav2_smac_planner/collision_checker.hpp b/nav2_smac_planner/include/nav2_smac_planner/collision_checker.hpp index b2665e6c120a700840a92341a98fc0b75aa033e5..81fbbf887f1707afcec18e815f4060cccae5b72f 100644 --- a/nav2_smac_planner/include/nav2_smac_planner/collision_checker.hpp +++ b/nav2_smac_planner/include/nav2_smac_planner/collision_checker.hpp @@ -69,7 +69,26 @@ public: costmap_->mapToWorld(static_cast<double>(x), static_cast<double>(y), wx, wy); if (!footprint_is_radius_) { - // if footprint, then we check for the footprint's points + // if footprint, then we check for the footprint's points, but first see + // if the robot is even potentially in an inscribed collision + footprint_cost_ = costmap_->getCost( + static_cast<unsigned int>(x), static_cast<unsigned int>(y)); + + if (footprint_cost_ < POSSIBLY_INSCRIBED) { + return false; + } + + // If its inscribed, in collision, or unknown in the middle, + // no need to even check the footprint, its invalid + if (footprint_cost_ == UNKNOWN && !traverse_unknown) { + return true; + } + + if (footprint_cost_ == INSCRIBED || footprint_cost_ == OCCUPIED) { + return true; + } + + // if possible inscribed, need to check actual footprint pose footprint_cost_ = footprintCostAtPose( wx, wy, static_cast<double>(theta), unoriented_footprint_); if (footprint_cost_ == UNKNOWN && traverse_unknown) { diff --git a/nav2_smac_planner/include/nav2_smac_planner/constants.hpp b/nav2_smac_planner/include/nav2_smac_planner/constants.hpp index 1a67c746e24834bc341dbe6a9d93c3284acdfc3f..39e7bbd1f87ce0870779dfd064b429769e1b603b 100644 --- a/nav2_smac_planner/include/nav2_smac_planner/constants.hpp +++ b/nav2_smac_planner/include/nav2_smac_planner/constants.hpp @@ -63,6 +63,7 @@ const float UNKNOWN = 255; const float OCCUPIED = 254; const float INSCRIBED = 253; const float MAX_NON_OBSTACLE = 252; +const float POSSIBLY_INSCRIBED = 128; const float FREE = 0; } // namespace nav2_smac_planner diff --git a/nav2_smac_planner/test/test_collision_checker.cpp b/nav2_smac_planner/test/test_collision_checker.cpp index 687b4b5cc3515c25bff1657c4df0eb23e7904aea..68084993b2aed4fe8637365d46f3c88237b6447b 100644 --- a/nav2_smac_planner/test/test_collision_checker.cpp +++ b/nav2_smac_planner/test/test_collision_checker.cpp @@ -94,7 +94,7 @@ TEST(collision_footprint, test_footprint_at_pose_with_movement) for (unsigned int i = 40; i <= 60; ++i) { for (unsigned int j = 40; j <= 60; ++j) { - costmap_->setCost(i, j, 0); + costmap_->setCost(i, j, 128); } } @@ -118,7 +118,7 @@ TEST(collision_footprint, test_footprint_at_pose_with_movement) collision_checker.inCollision(50, 50, 0.0, false); float cost = collision_checker.getCost(); - EXPECT_NEAR(cost, 0.0, 0.001); + EXPECT_NEAR(cost, 128.0, 0.001); collision_checker.inCollision(50, 49, 0.0, false); float up_value = collision_checker.getCost(); @@ -133,8 +133,7 @@ TEST(collision_footprint, test_footprint_at_pose_with_movement) TEST(collision_footprint, test_point_and_line_cost) { nav2_costmap_2d::Costmap2D * costmap_ = new nav2_costmap_2d::Costmap2D( - 100, 100, 0.10000, 0, 0.0, - 0.0); + 100, 100, 0.10000, 0, 0.0, 128.0); costmap_->setCost(62, 50, 254); costmap_->setCost(39, 60, 254); @@ -159,7 +158,7 @@ TEST(collision_footprint, test_point_and_line_cost) collision_checker.inCollision(50, 50, 0.0, false); float value = collision_checker.getCost(); - EXPECT_NEAR(value, 0.0, 0.001); + EXPECT_NEAR(value, 128.0, 0.001); collision_checker.inCollision(49, 50, 0.0, false); float left_value = collision_checker.getCost();