Skip to content

Commit cd281ff

Browse files
fix(behavior_path_planner, behavior_static_obstacle_avoidance_module): crash during goal changes (#10205)
* fix(behavior_path_planner, behavior_static_obstacle_avoidance_module): empty path handling Signed-off-by: Shumpei Wakabayashi <shumpei.wakabayashi@tier4.jp> * style(pre-commit): autofix * refactor: use optional Signed-off-by: Shumpei Wakabayashi <shumpei.wakabayashi@tier4.jp> * fix: std Signed-off-by: Shumpei Wakabayashi <shumpei.wakabayashi@tier4.jp> --------- Signed-off-by: Shumpei Wakabayashi <shumpei.wakabayashi@tier4.jp> Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
1 parent 8796045 commit cd281ff

File tree

5 files changed

+47
-1
lines changed

5 files changed

+47
-1
lines changed

planning/behavior_path_planner/autoware_behavior_path_planner/include/autoware/behavior_path_planner/planner_manager.hpp

+2
Original file line numberDiff line numberDiff line change
@@ -575,6 +575,8 @@ class PlannerManager
575575
ModuleUpdateInfo debug_info_;
576576

577577
std::shared_ptr<SceneModuleVisitor> debug_msg_ptr_;
578+
579+
mutable std::optional<BehaviorModuleOutput> last_valid_reference_path_;
578580
};
579581
} // namespace autoware::behavior_path_planner
580582

planning/behavior_path_planner/autoware_behavior_path_planner/src/planner_manager.cpp

+19-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,8 @@ PlannerManager::PlannerManager(rclcpp::Node & node)
4040
"autoware_behavior_path_planner",
4141
"autoware::behavior_path_planner::SceneModuleManagerInterface"),
4242
logger_(node.get_logger().get_child("planner_manager")),
43-
clock_(*node.get_clock())
43+
clock_(*node.get_clock()),
44+
last_valid_reference_path_(std::nullopt)
4445
{
4546
current_route_lanelet_ = std::make_shared<std::optional<lanelet::ConstLanelet>>(std::nullopt);
4647
processing_time_.emplace("total_time", 0.0);
@@ -272,6 +273,23 @@ BehaviorModuleOutput PlannerManager::getReferencePath(
272273
const std::shared_ptr<PlannerData> & data) const
273274
{
274275
const auto reference_path = utils::getReferencePath(current_route_lanelet_->value(), data);
276+
277+
if (reference_path.path.points.empty()) {
278+
RCLCPP_WARN_THROTTLE(
279+
logger_, clock_, 5000,
280+
"Empty reference path detected. Using last valid reference path if available.");
281+
282+
if (last_valid_reference_path_.has_value()) {
283+
return last_valid_reference_path_.value();
284+
}
285+
286+
RCLCPP_WARN_THROTTLE(
287+
logger_, clock_, 5000, "No valid previous reference path available. Creating empty path.");
288+
return BehaviorModuleOutput{};
289+
}
290+
291+
last_valid_reference_path_ = reference_path;
292+
275293
publishDebugRootReferencePath(reference_path);
276294
return reference_path;
277295
}

planning/behavior_path_planner/autoware_behavior_path_planner_common/src/utils/path_utils.cpp

+8
Original file line numberDiff line numberDiff line change
@@ -472,6 +472,14 @@ BehaviorModuleOutput getReferencePath(
472472
*route_handler, current_lanes_with_backward_margin, no_shift_pose, backward_length,
473473
p.forward_path_length, p);
474474

475+
if (reference_path.points.empty()) {
476+
auto clock{rclcpp::Clock{RCL_ROS_TIME}};
477+
RCLCPP_WARN_THROTTLE(
478+
rclcpp::get_logger("path_utils"), clock, 5000, "Empty reference path detected.");
479+
BehaviorModuleOutput output;
480+
return output;
481+
}
482+
475483
// clip backward length
476484
// NOTE: In order to keep backward_path_length at least, resampling interval is added to the
477485
// backward.

planning/behavior_path_planner/autoware_behavior_path_static_obstacle_avoidance_module/src/scene.cpp

+12
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,13 @@ void StaticObstacleAvoidanceModule::fillFundamentalData(
201201
AvoidancePlanningData & data, DebugData & debug)
202202
{
203203
autoware_utils::ScopedTimeTrack st(__func__, *time_keeper_);
204+
205+
if (getPreviousModuleOutput().reference_path.points.empty()) {
206+
RCLCPP_WARN_THROTTLE(
207+
getLogger(), *clock_, 5000, "Previous module reference path is empty. Skip processing.");
208+
return;
209+
}
210+
204211
// reference pose
205212
data.reference_pose =
206213
utils::getUnshiftedEgoPose(getEgoPose(), helper_->getPreviousSplineShiftPath());
@@ -209,6 +216,11 @@ void StaticObstacleAvoidanceModule::fillFundamentalData(
209216
data.current_lanelets = utils::static_obstacle_avoidance::getCurrentLanesFromPath(
210217
getPreviousModuleOutput().reference_path, planner_data_);
211218

219+
if (data.current_lanelets.empty()) {
220+
RCLCPP_WARN_THROTTLE(getLogger(), *clock_, 5000, "Current lanelets is empty. Skip processing.");
221+
return;
222+
}
223+
212224
data.extend_lanelets = utils::static_obstacle_avoidance::getExtendLanes(
213225
data.current_lanelets, getEgoPose(), planner_data_);
214226

planning/behavior_path_planner/autoware_behavior_path_static_obstacle_avoidance_module/src/utils.cpp

+6
Original file line numberDiff line numberDiff line change
@@ -1487,6 +1487,12 @@ lanelet::ConstLanelets getExtendLanes(
14871487
const lanelet::ConstLanelets & lanelets, const Pose & ego_pose,
14881488
const std::shared_ptr<const PlannerData> & planner_data)
14891489
{
1490+
if (lanelets.empty()) {
1491+
RCLCPP_WARN(
1492+
rclcpp::get_logger("static_obstacle_avoidance"), "Empty lanelets provided to getExtendLanes");
1493+
return lanelets;
1494+
}
1495+
14901496
lanelet::ConstLanelets extend_lanelets = lanelets;
14911497

14921498
while (rclcpp::ok()) {

0 commit comments

Comments
 (0)