Skip to content

Commit

Permalink
feat(behavior_path_planner): cut overlapped path (autowarefoundation#…
Browse files Browse the repository at this point in the history
…2451)

* feat(behavior_path_planner): cut overlapped path

Signed-off-by: yutaka <purewater0901@gmail.com>

* clean code

Signed-off-by: yutaka <purewater0901@gmail.com>

Signed-off-by: yutaka <purewater0901@gmail.com>
  • Loading branch information
purewater0901 authored and kyoichi-sugahara committed Dec 14, 2022
1 parent e0a8ee8 commit e074c8a
Show file tree
Hide file tree
Showing 9 changed files with 105 additions and 12 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -289,6 +289,10 @@ std::vector<DrivableLanes> generateDrivableLanes(const lanelet::ConstLanelets &
std::vector<DrivableLanes> generateDrivableLanesWithShoulderLanes(
const lanelet::ConstLanelets & current_lanes, const lanelet::ConstLanelets & shoulder_lanes);

size_t getOverlappedLaneletId(const std::vector<DrivableLanes> & lanes);
std::vector<DrivableLanes> cutOverlappedLanes(
PathWithLaneId & path, const std::vector<DrivableLanes> & lanes);

void occupancyGridToImage(const OccupancyGrid & occupancy_grid, cv::Mat * cv_image);

void imageToOccupancyGrid(const cv::Mat & cv_image, OccupancyGrid * occupancy_grid);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2007,14 +2007,16 @@ void AvoidanceModule::generateExtendedDrivableArea(ShiftedPath * shifted_path) c
drivable_lanes.push_back(current_drivable_lanes);
}

drivable_lanes = util::expandLanelets(
drivable_lanes, parameters_->drivable_area_left_bound_offset,
const auto shorten_lanes = util::cutOverlappedLanes(shifted_path->path, drivable_lanes);

const auto extended_lanes = util::expandLanelets(
shorten_lanes, parameters_->drivable_area_left_bound_offset,
parameters_->drivable_area_right_bound_offset, {"road_border"});

{
const auto & p = planner_data_->parameters;
shifted_path->path.drivable_area = util::generateDrivableArea(
shifted_path->path, drivable_lanes, p.drivable_area_resolution, p.vehicle_length,
shifted_path->path, extended_lanes, p.drivable_area_resolution, p.vehicle_length,
planner_data_);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -274,8 +274,9 @@ PathWithLaneId LaneChangeModule::getReferencePath() const
lane_change_buffer);

const auto drivable_lanes = util::generateDrivableLanes(current_lanes);
const auto shorten_lanes = util::cutOverlappedLanes(reference_path, drivable_lanes);
const auto expanded_lanes = util::expandLanelets(
drivable_lanes, parameters_->drivable_area_left_bound_offset,
shorten_lanes, parameters_->drivable_area_left_bound_offset,
parameters_->drivable_area_right_bound_offset);

reference_path.drivable_area = util::generateDrivableArea(
Expand Down Expand Up @@ -620,8 +621,9 @@ void LaneChangeModule::generateExtendedDrivableArea(PathWithLaneId & path)
const auto & route_handler = planner_data_->route_handler;
const auto drivable_lanes = lane_change_utils::generateDrivableLanes(
*route_handler, status_.current_lanes, status_.lane_change_lanes);
const auto shorten_lanes = util::cutOverlappedLanes(path, drivable_lanes);
const auto expanded_lanes = util::expandLanelets(
drivable_lanes, parameters_->drivable_area_left_bound_offset,
shorten_lanes, parameters_->drivable_area_left_bound_offset,
parameters_->drivable_area_right_bound_offset);

const double & resolution = common_parameters.drivable_area_resolution;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -137,8 +137,10 @@ PathWithLaneId LaneFollowingModule::getReferencePath() const
lane_change_buffer);
}

const auto shorten_lanes = util::cutOverlappedLanes(reference_path, drivable_lanes);

const auto expanded_lanes = util::expandLanelets(
drivable_lanes, parameters_.drivable_area_left_bound_offset,
shorten_lanes, parameters_.drivable_area_left_bound_offset,
parameters_.drivable_area_right_bound_offset);

reference_path.drivable_area = util::generateDrivableArea(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -185,8 +185,9 @@ BehaviorModuleOutput PullOutModule::plan()
path = status_.backward_path;
}

const auto shorten_lanes = util::cutOverlappedLanes(path, status_.lanes);
const auto expanded_lanes = util::expandLanelets(
status_.lanes, parameters_.drivable_area_left_bound_offset,
shorten_lanes, parameters_.drivable_area_left_bound_offset,
parameters_.drivable_area_right_bound_offset);
path.drivable_area = util::generateDrivableArea(
path, expanded_lanes, planner_data_->parameters.drivable_area_resolution,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -92,8 +92,9 @@ boost::optional<PullOutPath> ShiftPullOut::plan(Pose start_pose, Pose goal_pose)

// Generate drivable area
const double resolution = common_parameters.drivable_area_resolution;
const auto shorten_lanes = util::cutOverlappedLanes(shift_path, drivable_lanes);
shift_path.drivable_area = util::generateDrivableArea(
shift_path, drivable_lanes, resolution, common_parameters.vehicle_length, planner_data_);
shift_path, shorten_lanes, resolution, common_parameters.vehicle_length, planner_data_);

shift_path.header = planner_data_->route_handler->getRouteHeader();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -438,8 +438,9 @@ BehaviorModuleOutput PullOverModule::plan()
for (size_t i = status_.current_path_idx; i < status_.pull_over_path.partial_paths.size(); ++i) {
auto & path = status_.pull_over_path.partial_paths.at(i);
const auto p = planner_data_->parameters;
const auto shorten_lanes = util::cutOverlappedLanes(path, status_.lanes);
const auto lane = util::expandLanelets(
status_.lanes, parameters_.drivable_area_left_bound_offset,
shorten_lanes, parameters_.drivable_area_left_bound_offset,
parameters_.drivable_area_right_bound_offset);
path.drivable_area = util::generateDrivableArea(
path, lane, p.drivable_area_resolution, p.vehicle_length, planner_data_);
Expand Down Expand Up @@ -610,8 +611,9 @@ PathWithLaneId PullOverModule::getReferencePath() const
-calcMinimumShiftPathDistance(), parameters_.deceleration_interval);

const auto drivable_lanes = util::generateDrivableLanes(status_.current_lanes);
const auto shorten_lanes = util::cutOverlappedLanes(reference_path, drivable_lanes);
const auto lanes = util::expandLanelets(
drivable_lanes, parameters_.drivable_area_left_bound_offset,
shorten_lanes, parameters_.drivable_area_left_bound_offset,
parameters_.drivable_area_right_bound_offset);

reference_path.drivable_area = util::generateDrivableArea(
Expand Down Expand Up @@ -659,8 +661,9 @@ PathWithLaneId PullOverModule::generateStopPath() const
}

const auto drivable_lanes = util::generateDrivableLanes(status_.current_lanes);
const auto shorten_lanes = util::cutOverlappedLanes(stop_path, drivable_lanes);
const auto lanes = util::expandLanelets(
drivable_lanes, parameters_.drivable_area_left_bound_offset,
shorten_lanes, parameters_.drivable_area_left_bound_offset,
parameters_.drivable_area_right_bound_offset);

stop_path.drivable_area = util::generateDrivableArea(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -416,7 +416,8 @@ void SideShiftModule::adjustDrivableArea(ShiftedPath * path) const
-parameters_.drivable_area_right_bound_offset);

const auto drivable_lanes = util::generateDrivableLanes(current_lanelets_);
const auto expanded_lanes = util::expandLanelets(drivable_lanes, left_offset, right_offset);
const auto shorten_lanes = util::cutOverlappedLanes(path->path, drivable_lanes);
const auto expanded_lanes = util::expandLanelets(shorten_lanes, left_offset, right_offset);

{
const auto & p = planner_data_->parameters;
Expand Down
77 changes: 77 additions & 0 deletions planning/behavior_path_planner/src/utilities.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@
#include "autoware_auto_perception_msgs/msg/predicted_object.hpp"
#include "autoware_auto_perception_msgs/msg/predicted_path.hpp"

#include <boost/assign/list_of.hpp>

#include <algorithm>
#include <limits>
#include <memory>
Expand Down Expand Up @@ -1258,6 +1260,81 @@ std::vector<DrivableLanes> generateDrivableLanesWithShoulderLanes(
return drivable_lanes;
}

size_t getOverlappedLaneletId(const std::vector<DrivableLanes> & lanes)
{
auto overlaps = [](const DrivableLanes & lanes, const DrivableLanes & target_lanes) {
const auto lanelets = transformToLanelets(lanes);
const auto target_lanelets = transformToLanelets(target_lanes);

for (const auto & lanelet : lanelets) {
for (const auto & target_lanelet : target_lanelets) {
if (boost::geometry::overlaps(
lanelet.polygon2d().basicPolygon(), target_lanelet.polygon2d().basicPolygon())) {
return true;
}
}
}

// No overlapping
return false;
};

if (lanes.size() <= 2) {
return lanes.size();
}

size_t overlapped_idx = lanes.size();
for (size_t i = 0; i < lanes.size() - 2; ++i) {
for (size_t j = i + 2; j < lanes.size(); ++j) {
if (overlaps(lanes.at(i), lanes.at(j))) {
overlapped_idx = std::min(overlapped_idx, j);
}
}
}

return overlapped_idx;
}

std::vector<DrivableLanes> cutOverlappedLanes(
PathWithLaneId & path, const std::vector<DrivableLanes> & lanes)
{
const size_t overlapped_lanelet_id = getOverlappedLaneletId(lanes);
if (overlapped_lanelet_id == lanes.size()) {
return lanes;
}

const std::vector<DrivableLanes> shorten_lanes{
lanes.begin(), lanes.begin() + overlapped_lanelet_id};
const std::vector<DrivableLanes> removed_lanes{
lanes.begin() + overlapped_lanelet_id, lanes.end()};

const auto transformed_lanes = util::transformToLanelets(removed_lanes);

auto isIncluded = [&transformed_lanes](const std::vector<int64_t> & lane_ids) {
if (transformed_lanes.empty() || lane_ids.empty()) return false;

for (const auto & transformed_lane : transformed_lanes) {
for (const auto & lane_id : lane_ids) {
if (lane_id == transformed_lane.id()) {
return true;
}
}
}

return false;
};

for (size_t i = 0; i < path.points.size(); ++i) {
const auto & lane_ids = path.points.at(i).lane_ids;
if (isIncluded(lane_ids)) {
path.points.erase(path.points.begin() + i, path.points.end());
break;
}
}

return shorten_lanes;
}

// input lanes must be in sequence
// NOTE: lanes in the path argument is used to calculate the size of the drivable area to cover
// designated forward and backward length by getPathScope function.
Expand Down

0 comments on commit e074c8a

Please sign in to comment.