Skip to content

Commit 799e4f9

Browse files
kosuke55soblin
andauthored
feat(goal_planner): extend pull over lanes inward to extract objects (autowarefoundation#8714)
* feat(goal_planner): extend pull over lanes inward to extract objects Signed-off-by: kosuke55 <kosuke.tnp@gmail.com> * update from review Signed-off-by: kosuke55 <kosuke.tnp@gmail.com> * use optionale Signed-off-by: kosuke55 <kosuke.tnp@gmail.com> * rename lamda Signed-off-by: kosuke55 <kosuke.tnp@gmail.com> * return nullopt Signed-off-by: kosuke55 <kosuke.tnp@gmail.com> * Update planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/src/util.cpp Co-authored-by: Mamoru Sobue <mamoru.sobue@tier4.jp> * pre-commit Signed-off-by: kosuke55 <kosuke.tnp@gmail.com> --------- Signed-off-by: kosuke55 <kosuke.tnp@gmail.com> Co-authored-by: Mamoru Sobue <mamoru.sobue@tier4.jp>
1 parent 1557806 commit 799e4f9

File tree

7 files changed

+204
-50
lines changed

7 files changed

+204
-50
lines changed

planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/include/autoware/behavior_path_goal_planner_module/goal_planner_module.hpp

+1
Original file line numberDiff line numberDiff line change
@@ -275,6 +275,7 @@ struct GoalPlannerDebugData
275275
FreespacePlannerDebugData freespace_planner{};
276276
std::vector<Polygon2d> ego_polygons_expanded{};
277277
lanelet::ConstLanelet expanded_pull_over_lane_between_ego{};
278+
Polygon2d objects_extraction_polygon{};
278279
};
279280

280281
struct LastApprovalData

planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/include/autoware/behavior_path_goal_planner_module/goal_searcher.hpp

+5-5
Original file line numberDiff line numberDiff line change
@@ -31,13 +31,12 @@ class GoalSearcher : public GoalSearcherBase
3131
public:
3232
GoalSearcher(const GoalPlannerParameters & parameters, const LinearRing2d & vehicle_footprint);
3333

34-
GoalCandidates search(
35-
const std::shared_ptr<OccupancyGridBasedCollisionDetector> occupancy_grid_map,
36-
const std::shared_ptr<const PlannerData> & planner_data) override;
34+
GoalCandidates search(const std::shared_ptr<const PlannerData> & planner_data) override;
3735
void update(
3836
GoalCandidates & goal_candidates,
3937
const std::shared_ptr<OccupancyGridBasedCollisionDetector> occupancy_grid_map,
40-
const std::shared_ptr<const PlannerData> & planner_data) const override;
38+
const std::shared_ptr<const PlannerData> & planner_data,
39+
const PredictedObjects & objects) const override;
4140

4241
// todo(kosuke55): Functions for this specific use should not be in the interface,
4342
// so it is better to consider interface design when we implement other goal searchers.
@@ -47,7 +46,8 @@ class GoalSearcher : public GoalSearcherBase
4746
bool isSafeGoalWithMarginScaleFactor(
4847
const GoalCandidate & goal_candidate, const double margin_scale_factor,
4948
const std::shared_ptr<OccupancyGridBasedCollisionDetector> occupancy_grid_map,
50-
const std::shared_ptr<const PlannerData> & planner_data) const override;
49+
const std::shared_ptr<const PlannerData> & planner_data,
50+
const PredictedObjects & objects) const override;
5151

5252
private:
5353
void countObjectsToAvoid(

planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/include/autoware/behavior_path_goal_planner_module/goal_searcher_base.hpp

+5-5
Original file line numberDiff line numberDiff line change
@@ -53,13 +53,12 @@ class GoalSearcherBase
5353
const Pose & getReferenceGoal() const { return reference_goal_pose_; }
5454

5555
MultiPolygon2d getAreaPolygons() const { return area_polygons_; }
56-
virtual GoalCandidates search(
57-
const std::shared_ptr<OccupancyGridBasedCollisionDetector> occupancy_grid_map,
58-
const std::shared_ptr<const PlannerData> & planner_data) = 0;
56+
virtual GoalCandidates search(const std::shared_ptr<const PlannerData> & planner_data) = 0;
5957
virtual void update(
6058
[[maybe_unused]] GoalCandidates & goal_candidates,
6159
[[maybe_unused]] const std::shared_ptr<OccupancyGridBasedCollisionDetector> occupancy_grid_map,
62-
[[maybe_unused]] const std::shared_ptr<const PlannerData> & planner_data) const
60+
[[maybe_unused]] const std::shared_ptr<const PlannerData> & planner_data,
61+
[[maybe_unused]] const PredictedObjects & objects) const
6362
{
6463
return;
6564
}
@@ -69,7 +68,8 @@ class GoalSearcherBase
6968
virtual bool isSafeGoalWithMarginScaleFactor(
7069
const GoalCandidate & goal_candidate, const double margin_scale_factor,
7170
const std::shared_ptr<OccupancyGridBasedCollisionDetector> occupancy_grid_map,
72-
const std::shared_ptr<const PlannerData> & planner_data) const = 0;
71+
const std::shared_ptr<const PlannerData> & planner_data,
72+
const PredictedObjects & objects) const = 0;
7373

7474
protected:
7575
GoalPlannerParameters parameters_{};

planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/include/autoware/behavior_path_goal_planner_module/util.hpp

+13
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,19 @@ lanelet::ConstLanelets generateBetweenEgoAndExpandedPullOverLanes(
6464
const geometry_msgs::msg::Pose ego_pose,
6565
const autoware::vehicle_info_utils::VehicleInfo & vehicle_info, const double outer_road_offset,
6666
const double inner_road_offset);
67+
68+
/*
69+
* @brief generate polygon to extract objects
70+
* @param pull_over_lanes pull over lanes
71+
* @param left_side left side or right side
72+
* @param outer_offset outer offset from pull over lane boundary
73+
* @param inner_offset inner offset from pull over lane boundary
74+
* @return polygon to extract objects
75+
*/
76+
std::optional<Polygon2d> generateObjectExtractionPolygon(
77+
const lanelet::ConstLanelets & pull_over_lanes, const bool left_side, const double outer_offset,
78+
const double inner_offset);
79+
6780
PredictedObjects extractObjectsInExpandedPullOverLanes(
6881
const RouteHandler & route_handler, const bool left_side, const double backward_distance,
6982
const double forward_distance, double bound_offset, const PredictedObjects & objects);

planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/src/goal_planner_module.cpp

+51-14
Original file line numberDiff line numberDiff line change
@@ -459,18 +459,33 @@ void GoalPlannerModule::updateData()
459459
{
460460
universe_utils::ScopedTimeTrack st(__func__, *time_keeper_);
461461

462-
// extract static and dynamic objects in expanded pull over lanes
462+
// extract static and dynamic objects in extraction polygon for path coliision check
463463
{
464464
const auto & p = parameters_;
465465
const auto & rh = *(planner_data_->route_handler);
466466
const auto objects = *(planner_data_->dynamic_object);
467-
const auto static_target_objects =
468-
goal_planner_utils::extractStaticObjectsInExpandedPullOverLanes(
469-
rh, left_side_parking_, p->backward_goal_search_length, p->forward_goal_search_length,
470-
p->detection_bound_offset, objects, p->th_moving_object_velocity);
471-
const auto dynamic_target_objects = goal_planner_utils::extractObjectsInExpandedPullOverLanes(
472-
rh, left_side_parking_, p->backward_goal_search_length, p->forward_goal_search_length,
473-
p->detection_bound_offset, objects);
467+
const double vehicle_width = planner_data_->parameters.vehicle_width;
468+
const auto pull_over_lanes = goal_planner_utils::getPullOverLanes(
469+
rh, left_side_parking_, p->backward_goal_search_length, p->forward_goal_search_length);
470+
const auto objects_extraction_polygon = goal_planner_utils::generateObjectExtractionPolygon(
471+
pull_over_lanes, left_side_parking_, p->detection_bound_offset,
472+
p->margin_from_boundary + p->max_lateral_offset + vehicle_width);
473+
if (objects_extraction_polygon.has_value()) {
474+
debug_data_.objects_extraction_polygon = objects_extraction_polygon.value();
475+
}
476+
PredictedObjects dynamic_target_objects{};
477+
for (const auto & object : objects.objects) {
478+
const auto object_polygon = universe_utils::toPolygon2d(object);
479+
if (
480+
objects_extraction_polygon.has_value() &&
481+
boost::geometry::intersects(object_polygon, objects_extraction_polygon.value())) {
482+
dynamic_target_objects.objects.push_back(object);
483+
}
484+
}
485+
const auto static_target_objects = utils::path_safety_checker::filterObjectsByVelocity(
486+
dynamic_target_objects, p->th_moving_object_velocity);
487+
488+
// these objects are used for path collision check not for safety check
474489
thread_safe_data_.set_static_target_objects(static_target_objects);
475490
thread_safe_data_.set_dynamic_target_objects(dynamic_target_objects);
476491
}
@@ -739,7 +754,9 @@ bool GoalPlannerModule::planFreespacePath(
739754
{
740755
GoalCandidates goal_candidates{};
741756
goal_candidates = thread_safe_data_.get_goal_candidates();
742-
goal_searcher->update(goal_candidates, occupancy_grid_map, planner_data);
757+
goal_searcher->update(
758+
goal_candidates, occupancy_grid_map, planner_data,
759+
thread_safe_data_.get_static_target_objects());
743760
thread_safe_data_.set_goal_candidates(goal_candidates);
744761
debug_data_.freespace_planner.num_goal_candidates = goal_candidates.size();
745762
debug_data_.freespace_planner.is_planning = true;
@@ -824,7 +841,7 @@ GoalCandidates GoalPlannerModule::generateGoalCandidates() const
824841
// calculate goal candidates
825842
const auto & route_handler = planner_data_->route_handler;
826843
if (utils::isAllowedGoalModification(route_handler)) {
827-
return goal_searcher_->search(occupancy_grid_map_, planner_data_);
844+
return goal_searcher_->search(planner_data_);
828845
}
829846

830847
// NOTE:
@@ -1282,9 +1299,9 @@ DecidingPathStatusWithStamp GoalPlannerModule::checkDecidingPathStatus(
12821299
// check goal pose collision
12831300
const auto modified_goal_opt = thread_safe_data_.get_modified_goal_pose();
12841301
if (
1285-
modified_goal_opt &&
1286-
!goal_searcher->isSafeGoalWithMarginScaleFactor(
1287-
modified_goal_opt.value(), hysteresis_factor, occupancy_grid_map, planner_data)) {
1302+
modified_goal_opt && !goal_searcher->isSafeGoalWithMarginScaleFactor(
1303+
modified_goal_opt.value(), hysteresis_factor, occupancy_grid_map,
1304+
planner_data, thread_safe_data_.get_static_target_objects())) {
12881305
RCLCPP_DEBUG(getLogger(), "[DecidingPathStatus]: DECIDING->NOT_DECIDED. goal is not safe");
12891306
return {DecidingPathStatus::NOT_DECIDED, clock_->now()};
12901307
}
@@ -1443,7 +1460,9 @@ BehaviorModuleOutput GoalPlannerModule::planPullOverAsOutput()
14431460

14441461
// update goal candidates
14451462
auto goal_candidates = thread_safe_data_.get_goal_candidates();
1446-
goal_searcher_->update(goal_candidates, occupancy_grid_map_, planner_data_);
1463+
goal_searcher_->update(
1464+
goal_candidates, occupancy_grid_map_, planner_data_,
1465+
thread_safe_data_.get_static_target_objects());
14471466

14481467
// Select a path that is as safe as possible and has a high priority.
14491468
const auto pull_over_path_candidates = thread_safe_data_.get_pull_over_path_candidates();
@@ -2518,6 +2537,24 @@ void GoalPlannerModule::setDebugData()
25182537
// Visualize goal candidates
25192538
const auto goal_candidates = thread_safe_data_.get_goal_candidates();
25202539
add(goal_planner_utils::createGoalCandidatesMarkerArray(goal_candidates, color));
2540+
2541+
// Visualize objects extraction polygon
2542+
auto marker = autoware::universe_utils::createDefaultMarker(
2543+
"map", rclcpp::Clock{RCL_ROS_TIME}.now(), "objects_extraction_polygon", 0, Marker::LINE_LIST,
2544+
autoware::universe_utils::createMarkerScale(0.1, 0.0, 0.0),
2545+
autoware::universe_utils::createMarkerColor(0.0, 1.0, 1.0, 0.999));
2546+
const double ego_z = planner_data_->self_odometry->pose.pose.position.z;
2547+
for (size_t i = 0; i < debug_data_.objects_extraction_polygon.outer().size(); ++i) {
2548+
const auto & current_point = debug_data_.objects_extraction_polygon.outer().at(i);
2549+
const auto & next_point = debug_data_.objects_extraction_polygon.outer().at(
2550+
(i + 1) % debug_data_.objects_extraction_polygon.outer().size());
2551+
marker.points.push_back(
2552+
autoware::universe_utils::createPoint(current_point.x(), current_point.y(), ego_z));
2553+
marker.points.push_back(
2554+
autoware::universe_utils::createPoint(next_point.x(), next_point.y(), ego_z));
2555+
}
2556+
2557+
debug_marker_.markers.push_back(marker);
25212558
}
25222559

25232560
// Visualize previous module output

planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/src/goal_searcher.cpp

+8-26
Original file line numberDiff line numberDiff line change
@@ -97,9 +97,7 @@ GoalSearcher::GoalSearcher(
9797
{
9898
}
9999

100-
GoalCandidates GoalSearcher::search(
101-
const std::shared_ptr<OccupancyGridBasedCollisionDetector> occupancy_grid_map,
102-
const std::shared_ptr<const PlannerData> & planner_data)
100+
GoalCandidates GoalSearcher::search(const std::shared_ptr<const PlannerData> & planner_data)
103101
{
104102
GoalCandidates goal_candidates{};
105103

@@ -193,8 +191,6 @@ GoalCandidates GoalSearcher::search(
193191
}
194192
createAreaPolygons(original_search_poses, planner_data);
195193

196-
update(goal_candidates, occupancy_grid_map, planner_data);
197-
198194
return goal_candidates;
199195
}
200196

@@ -268,16 +264,10 @@ void GoalSearcher::countObjectsToAvoid(
268264
void GoalSearcher::update(
269265
GoalCandidates & goal_candidates,
270266
const std::shared_ptr<OccupancyGridBasedCollisionDetector> occupancy_grid_map,
271-
const std::shared_ptr<const PlannerData> & planner_data) const
267+
const std::shared_ptr<const PlannerData> & planner_data, const PredictedObjects & objects) const
272268
{
273-
const auto pull_over_lane_stop_objects =
274-
goal_planner_utils::extractStaticObjectsInExpandedPullOverLanes(
275-
*(planner_data->route_handler), left_side_parking_, parameters_.backward_goal_search_length,
276-
parameters_.forward_goal_search_length, parameters_.detection_bound_offset,
277-
*(planner_data->dynamic_object), parameters_.th_moving_object_velocity);
278-
279269
if (parameters_.prioritize_goals_before_objects) {
280-
countObjectsToAvoid(goal_candidates, pull_over_lane_stop_objects, planner_data);
270+
countObjectsToAvoid(goal_candidates, objects, planner_data);
281271
}
282272

283273
if (parameters_.goal_priority == "minimum_weighted_distance") {
@@ -297,15 +287,15 @@ void GoalSearcher::update(
297287
const Pose goal_pose = goal_candidate.goal_pose;
298288

299289
// check collision with footprint
300-
if (checkCollision(goal_pose, pull_over_lane_stop_objects, occupancy_grid_map)) {
290+
if (checkCollision(goal_pose, objects, occupancy_grid_map)) {
301291
goal_candidate.is_safe = false;
302292
continue;
303293
}
304294

305295
// check longitudinal margin with pull over lane objects
306296
constexpr bool filter_inside = true;
307297
const auto target_objects = goal_planner_utils::filterObjectsByLateralDistance(
308-
goal_pose, planner_data->parameters.vehicle_width, pull_over_lane_stop_objects,
298+
goal_pose, planner_data->parameters.vehicle_width, objects,
309299
parameters_.object_recognition_collision_check_hard_margins.back(), filter_inside);
310300
if (checkCollisionWithLongitudinalDistance(
311301
goal_pose, target_objects, occupancy_grid_map, planner_data)) {
@@ -323,33 +313,25 @@ void GoalSearcher::update(
323313
bool GoalSearcher::isSafeGoalWithMarginScaleFactor(
324314
const GoalCandidate & goal_candidate, const double margin_scale_factor,
325315
const std::shared_ptr<OccupancyGridBasedCollisionDetector> occupancy_grid_map,
326-
const std::shared_ptr<const PlannerData> & planner_data) const
316+
const std::shared_ptr<const PlannerData> & planner_data, const PredictedObjects & objects) const
327317
{
328318
if (!parameters_.use_object_recognition) {
329319
return true;
330320
}
331321

332322
const Pose goal_pose = goal_candidate.goal_pose;
333-
334-
const auto pull_over_lane_stop_objects =
335-
goal_planner_utils::extractStaticObjectsInExpandedPullOverLanes(
336-
*(planner_data->route_handler), left_side_parking_, parameters_.backward_goal_search_length,
337-
parameters_.forward_goal_search_length, parameters_.detection_bound_offset,
338-
*(planner_data->dynamic_object), parameters_.th_moving_object_velocity);
339-
340323
const double margin =
341324
parameters_.object_recognition_collision_check_hard_margins.back() * margin_scale_factor;
342325

343326
if (utils::checkCollisionBetweenFootprintAndObjects(
344-
vehicle_footprint_, goal_pose, pull_over_lane_stop_objects, margin)) {
327+
vehicle_footprint_, goal_pose, objects, margin)) {
345328
return false;
346329
}
347330

348331
// check longitudinal margin with pull over lane objects
349332
constexpr bool filter_inside = true;
350333
const auto target_objects = goal_planner_utils::filterObjectsByLateralDistance(
351-
goal_pose, planner_data->parameters.vehicle_width, pull_over_lane_stop_objects, margin,
352-
filter_inside);
334+
goal_pose, planner_data->parameters.vehicle_width, objects, margin, filter_inside);
353335
if (checkCollisionWithLongitudinalDistance(
354336
goal_pose, target_objects, occupancy_grid_map, planner_data)) {
355337
return false;

0 commit comments

Comments
 (0)