Skip to content

Commit 5d41e6e

Browse files
committed
fix(avoidance): improve safety check lanes
Signed-off-by: satoshi-ota <satoshi.ota928@gmail.com>
1 parent 84787be commit 5d41e6e

File tree

2 files changed

+36
-12
lines changed
  • planning/behavior_path_avoidance_module

2 files changed

+36
-12
lines changed

planning/behavior_path_avoidance_module/include/behavior_path_avoidance_module/utils.hpp

+1
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ std::vector<DrivableAreaInfo::Obstacle> generateObstaclePolygonsForDrivableArea(
7878
const double vehicle_width);
7979

8080
lanelet::ConstLanelets getAdjacentLane(
81+
const lanelet::ConstLanelet & current_lane,
8182
const std::shared_ptr<const PlannerData> & planner_data,
8283
const std::shared_ptr<AvoidanceParameters> & parameters, const bool is_right_shift);
8384

planning/behavior_path_avoidance_module/src/utils.cpp

+35-12
Original file line numberDiff line numberDiff line change
@@ -1243,11 +1243,13 @@ lanelet::ConstLanelets getCurrentLanesFromPath(
12431243
throw std::logic_error("empty path.");
12441244
}
12451245

1246-
if (path.points.front().lane_ids.empty()) {
1246+
const auto idx = planner_data->findEgoIndex(path.points);
1247+
1248+
if (path.points.at(idx).lane_ids.empty()) {
12471249
throw std::logic_error("empty lane ids.");
12481250
}
12491251

1250-
const auto start_id = path.points.front().lane_ids.front();
1252+
const auto start_id = path.points.at(idx).lane_ids.front();
12511253
const auto start_lane = planner_data->route_handler->getLaneletsFromId(start_id);
12521254
const auto & p = planner_data->parameters;
12531255

@@ -1794,6 +1796,7 @@ AvoidLineArray combineRawShiftLinesWithUniqueCheck(
17941796
}
17951797

17961798
lanelet::ConstLanelets getAdjacentLane(
1799+
const lanelet::ConstLanelet & current_lane,
17971800
const std::shared_ptr<const PlannerData> & planner_data,
17981801
const std::shared_ptr<AvoidanceParameters> & parameters, const bool is_right_shift)
17991802
{
@@ -1802,18 +1805,17 @@ lanelet::ConstLanelets getAdjacentLane(
18021805
const auto & backward_distance = parameters->safety_check_backward_distance;
18031806
const auto & vehicle_pose = planner_data->self_odometry->pose.pose;
18041807

1805-
lanelet::ConstLanelet current_lane;
1806-
if (!rh->getClosestLaneletWithinRoute(vehicle_pose, &current_lane)) {
1807-
RCLCPP_ERROR(
1808-
rclcpp::get_logger("behavior_path_planner").get_child("avoidance"),
1809-
"failed to find closest lanelet within route!!!");
1810-
return {}; // TODO(Satoshi Ota)
1811-
}
1812-
18131808
const auto ego_succeeding_lanes =
18141809
rh->getLaneletSequence(current_lane, vehicle_pose, backward_distance, forward_distance);
18151810

18161811
lanelet::ConstLanelets lanes{};
1812+
1813+
const auto exist = [&lanes](const auto id) {
1814+
const auto itr = std::find_if(
1815+
lanes.begin(), lanes.end(), [&id](const auto & lane) { return lane.id() == id; });
1816+
return itr != lanes.end();
1817+
};
1818+
18171819
for (const auto & lane : ego_succeeding_lanes) {
18181820
const auto opt_left_lane = rh->getLeftLanelet(lane, true, false);
18191821
if (!is_right_shift && opt_left_lane) {
@@ -1828,6 +1830,20 @@ lanelet::ConstLanelets getAdjacentLane(
18281830
const auto right_opposite_lanes = rh->getRightOppositeLanelets(lane);
18291831
if (is_right_shift && !right_opposite_lanes.empty()) {
18301832
lanes.push_back(right_opposite_lanes.front());
1833+
1834+
for (const auto & prev_lane : rh->getPreviousLanelets(right_opposite_lanes.front())) {
1835+
if (!exist(prev_lane.id())) {
1836+
lanes.push_back(prev_lane);
1837+
}
1838+
}
1839+
}
1840+
}
1841+
1842+
for (const auto & lane : lanes) {
1843+
for (const auto & next_lane : rh->getNextLanelets(lane)) {
1844+
if (!exist(next_lane.id())) {
1845+
lanes.push_back(next_lane);
1846+
}
18311847
}
18321848
}
18331849

@@ -1881,9 +1897,16 @@ std::vector<ExtendedPredictedObject> getSafetyCheckTargetObjects(
18811897
return ret;
18821898
}();
18831899

1900+
lanelet::ConstLanelet closest_lanelet;
1901+
const auto & ego_pose = planner_data->self_odometry->pose.pose;
1902+
if (!lanelet::utils::query::getClosestLanelet(
1903+
data.current_lanelets, ego_pose, &closest_lanelet)) {
1904+
return {};
1905+
}
1906+
18841907
// check right lanes
18851908
if (check_right_lanes) {
1886-
const auto check_lanes = getAdjacentLane(planner_data, p, true);
1909+
const auto check_lanes = getAdjacentLane(closest_lanelet, planner_data, p, true);
18871910

18881911
if (p->check_other_object) {
18891912
const auto [targets, others] = utils::path_safety_checker::separateObjectsByLanelets(
@@ -1905,7 +1928,7 @@ std::vector<ExtendedPredictedObject> getSafetyCheckTargetObjects(
19051928

19061929
// check left lanes
19071930
if (check_left_lanes) {
1908-
const auto check_lanes = getAdjacentLane(planner_data, p, false);
1931+
const auto check_lanes = getAdjacentLane(closest_lanelet, planner_data, p, false);
19091932

19101933
if (p->check_other_object) {
19111934
const auto [targets, others] = utils::path_safety_checker::separateObjectsByLanelets(

0 commit comments

Comments
 (0)