Skip to content

Commit 52648bb

Browse files
LeifHookedWirelessLeif Terry
authored andcommitted
Fix for robot footprint collision in obstacles critic (ros-navigation#3878)
* Inscribed/Circumscribed costs must be updated to take into account the current shape of the robot. Was previous only being called once in initialize(). * Add early return to avoid calculations if footprint has not changed. * Only update radius if using footprint. Add perf timers. * Remove perf timers. * Update comments. --------- Co-authored-by: Leif Terry <[email protected]> Signed-off-by: enricosutera <[email protected]>
1 parent c7f173b commit 52648bb

File tree

2 files changed

+17
-2
lines changed

2 files changed

+17
-2
lines changed

nav2_mppi_controller/include/nav2_mppi_controller/critics/obstacles_critic.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ class ObstaclesCritic : public CriticFunction
9292
float possibly_inscribed_cost_;
9393
float collision_margin_distance_;
9494
float near_goal_distance_;
95+
float circumscribed_cost_{0}, circumscribed_radius_{0};
9596

9697
unsigned int power_{0};
9798
float repulsion_weight_, critical_weight_{0};

nav2_mppi_controller/src/critics/obstacles_critic.cpp

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,13 @@ float ObstaclesCritic::findCircumscribedCost(
5555
{
5656
double result = -1.0;
5757
bool inflation_layer_found = false;
58+
59+
const double circum_radius = costmap->getLayeredCostmap()->getCircumscribedRadius();
60+
if (static_cast<float>(circum_radius) == circumscribed_radius_) {
61+
// early return if footprint size is unchanged
62+
return circumscribed_cost_;
63+
}
64+
5865
// check if the costmap has an inflation layer
5966
for (auto layer = costmap->getLayeredCostmap()->getPlugins()->begin();
6067
layer != costmap->getLayeredCostmap()->getPlugins()->end();
@@ -66,7 +73,6 @@ float ObstaclesCritic::findCircumscribedCost(
6673
}
6774

6875
inflation_layer_found = true;
69-
const double circum_radius = costmap->getLayeredCostmap()->getCircumscribedRadius();
7076
const double resolution = costmap->getCostmap()->getResolution();
7177
result = inflation_layer->computeCost(circum_radius / resolution);
7278
inflation_scale_factor_ = static_cast<float>(inflation_layer->getCostScalingFactor());
@@ -83,7 +89,10 @@ float ObstaclesCritic::findCircumscribedCost(
8389
"significantly slow down planning times and not avoid anything but absolute collisions!");
8490
}
8591

86-
return static_cast<float>(result);
92+
circumscribed_radius_ = static_cast<float>(circum_radius);
93+
circumscribed_cost_ = static_cast<float>(result);
94+
95+
return circumscribed_cost_;
8796
}
8897

8998
float ObstaclesCritic::distanceToObstacle(const CollisionCost & cost)
@@ -108,6 +117,11 @@ void ObstaclesCritic::score(CriticData & data)
108117
return;
109118
}
110119

120+
if (consider_footprint_) {
121+
// footprint may have changed since initialization if user has dynamic footprints
122+
possibly_inscribed_cost_ = findCircumscribedCost(costmap_ros_);
123+
}
124+
111125
// If near the goal, don't apply the preferential term since the goal is near obstacles
112126
bool near_goal = false;
113127
if (utils::withinPositionGoalTolerance(near_goal_distance_, data.state.pose.pose, data.path)) {

0 commit comments

Comments
 (0)