Skip to content

Commit fe9f3af

Browse files
committed
fix edge case handle in RemoveInCollision/RemovePassed BT actions
Signed-off-by: zz990099 <[email protected]>
1 parent ec1d47d commit fe9f3af

File tree

2 files changed

+10
-17
lines changed

2 files changed

+10
-17
lines changed

nav2_behavior_tree/plugins/action/remove_in_collision_goals_action.cpp

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ BT::NodeStatus RemoveInCollisionGoals::on_completion(
6868
std::vector<nav2_msgs::msg::WaypointStatus> waypoint_statuses;
6969
auto waypoint_statuses_get_res = getInput("input_waypoint_statuses", waypoint_statuses);
7070
if (!waypoint_statuses_get_res) {
71-
RCLCPP_WARN(node_->get_logger(), "Missing [input_waypoint_statuses] port input!");
71+
RCLCPP_ERROR(node_->get_logger(), "Missing [input_waypoint_statuses] port input!");
7272
}
7373

7474
nav_msgs::msg::Goals valid_goal_poses;
@@ -97,9 +97,7 @@ BT::NodeStatus RemoveInCollisionGoals::on_completion(
9797
}
9898
setOutput("output_goals", valid_goal_poses);
9999
// set `waypoint_statuses` output
100-
if (waypoint_statuses_get_res) {
101-
setOutput("output_waypoint_statuses", waypoint_statuses);
102-
}
100+
setOutput("output_waypoint_statuses", waypoint_statuses);
103101

104102
return BT::NodeStatus::SUCCESS;
105103
}

nav2_behavior_tree/plugins/action/remove_passed_goals_action.cpp

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -71,11 +71,11 @@ inline BT::NodeStatus RemovePassedGoals::tick()
7171
std::vector<nav2_msgs::msg::WaypointStatus> waypoint_statuses;
7272
auto waypoint_statuses_get_res = getInput("input_waypoint_statuses", waypoint_statuses);
7373
if (!waypoint_statuses_get_res) {
74-
RCLCPP_WARN(node_->get_logger(), "Missing [input_waypoint_statuses] port input!");
74+
RCLCPP_ERROR(node_->get_logger(), "Missing [input_waypoint_statuses] port input!");
7575
}
7676

7777
double dist_to_goal;
78-
while (goal_poses.goals.size() > 0) {
78+
while (goal_poses.goals.size() > 1) {
7979
dist_to_goal = euclidean_distance(goal_poses.goals[0].pose, current_pose.pose);
8080

8181
if (dist_to_goal > viapoint_achieved_radius_) {
@@ -86,25 +86,20 @@ inline BT::NodeStatus RemovePassedGoals::tick()
8686
if (waypoint_statuses_get_res) {
8787
auto cur_waypoint_index =
8888
find_next_matching_goal_in_waypoint_statuses(waypoint_statuses, goal_poses.goals[0]);
89-
if (cur_waypoint_index != -1) {
90-
waypoint_statuses[cur_waypoint_index].waypoint_status =
91-
nav2_msgs::msg::WaypointStatus::COMPLETED;
89+
if (cur_waypoint_index == -1) {
90+
RCLCPP_ERROR(node_->get_logger(), "Failed to find matching goal in waypoint_statuses");
91+
return BT::NodeStatus::FAILURE;
9292
}
93-
}
94-
95-
// prevent from removing the last goal
96-
if (goal_poses.goals.size() == 1) {
97-
break;
93+
waypoint_statuses[cur_waypoint_index].waypoint_status =
94+
nav2_msgs::msg::WaypointStatus::COMPLETED;
9895
}
9996

10097
goal_poses.goals.erase(goal_poses.goals.begin());
10198
}
10299

103100
setOutput("output_goals", goal_poses);
104101
// set `waypoint_statuses` output
105-
if (waypoint_statuses_get_res) {
106-
setOutput("output_waypoint_statuses", waypoint_statuses);
107-
}
102+
setOutput("output_waypoint_statuses", waypoint_statuses);
108103

109104
return BT::NodeStatus::SUCCESS;
110105
}

0 commit comments

Comments
 (0)