Skip to content

Commit bacfc98

Browse files
committed
fix(avoidance): limit drivable lane only when the ego in on original lane
Signed-off-by: satoshi-ota <satoshi.ota928@gmail.com>
1 parent b2cd2aa commit bacfc98

File tree

5 files changed

+86
-31
lines changed

5 files changed

+86
-31
lines changed

planning/behavior_path_avoidance_by_lane_change_module/src/scene.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -155,8 +155,8 @@ AvoidancePlanningData AvoidanceByLaneChange::calcAvoidancePlanningData(
155155
// expand drivable lanes
156156
std::for_each(
157157
data.current_lanelets.begin(), data.current_lanelets.end(), [&](const auto & lanelet) {
158-
data.drivable_lanes.push_back(utils::avoidance::generateExpandDrivableLanes(
159-
lanelet, planner_data_, avoidance_parameters_, false));
158+
data.drivable_lanes.push_back(utils::avoidance::generateExpandedDrivableLanes(
159+
lanelet, planner_data_, avoidance_parameters_));
160160
});
161161

162162
// calc drivable bound

planning/behavior_path_avoidance_module/include/behavior_path_avoidance_module/data_structs.hpp

+2
Original file line numberDiff line numberDiff line change
@@ -552,6 +552,8 @@ struct AvoidancePlanningData
552552

553553
bool found_avoidance_path{false};
554554

555+
bool limit_drivable_lane{false};
556+
555557
double to_stop_line{std::numeric_limits<double>::max()};
556558

557559
double to_start_point{std::numeric_limits<double>::lowest()};

planning/behavior_path_avoidance_module/include/behavior_path_avoidance_module/utils.hpp

+7-2
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,9 @@ bool isOnRight(const ObjectData & obj);
3636
double calcShiftLength(
3737
const bool & is_object_on_right, const double & overhang_dist, const double & avoid_margin);
3838

39+
bool isWithinLanes(
40+
const lanelet::ConstLanelets & lanelets, std::shared_ptr<const PlannerData> & planner_data);
41+
3942
bool isShiftNecessary(const bool & is_object_on_right, const double & shift_length);
4043

4144
bool isSameDirectionShift(const bool & is_object_on_right, const double & shift_length);
@@ -157,9 +160,11 @@ std::pair<PredictedObjects, PredictedObjects> separateObjectsByPath(
157160
const std::shared_ptr<AvoidanceParameters> & parameters,
158161
const double object_check_forward_distance, DebugData & debug);
159162

160-
DrivableLanes generateExpandDrivableLanes(
163+
DrivableLanes generateNotExpandedDrivableLanes(const lanelet::ConstLanelet & lanelet);
164+
165+
DrivableLanes generateExpandedDrivableLanes(
161166
const lanelet::ConstLanelet & lanelet, const std::shared_ptr<const PlannerData> & planner_data,
162-
const std::shared_ptr<AvoidanceParameters> & parameters, const bool in_avoidance_maneuver);
167+
const std::shared_ptr<AvoidanceParameters> & parameters);
163168

164169
double calcDistanceToReturnDeadLine(
165170
const lanelet::ConstLanelets & lanelets, const PathWithLaneId & path,

planning/behavior_path_avoidance_module/src/scene.cpp

+26-15
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
#include "behavior_path_planner_common/utils/path_safety_checker/objects_filtering.hpp"
2222
#include "behavior_path_planner_common/utils/path_safety_checker/safety_check.hpp"
2323
#include "behavior_path_planner_common/utils/path_utils.hpp"
24+
#include "behavior_path_planner_common/utils/traffic_light_utils.hpp"
2425
#include "behavior_path_planner_common/utils/utils.hpp"
2526

2627
#include <lanelet2_extension/utility/message_conversion.hpp>
@@ -32,8 +33,6 @@
3233
#include "tier4_planning_msgs/msg/detail/avoidance_debug_msg_array__struct.hpp"
3334
#include <tier4_planning_msgs/msg/detail/avoidance_debug_factor__struct.hpp>
3435

35-
#include <boost/geometry/algorithms/centroid.hpp>
36-
3736
#include <algorithm>
3837
#include <limits>
3938
#include <memory>
@@ -223,25 +222,36 @@ void AvoidanceModule::fillFundamentalData(AvoidancePlanningData & data, DebugDat
223222
utils::avoidance::getExtendLanes(data.current_lanelets, getEgoPose(), planner_data_);
224223

225224
// expand drivable lanes
226-
const auto has_shift_point = !path_shifter_.getShiftLines().empty();
227-
const auto in_avoidance_maneuver = has_shift_point || helper_->isShifted();
225+
const auto is_within_current_lane =
226+
utils::avoidance::isWithinLanes(data.current_lanelets, planner_data_);
228227
std::for_each(
229228
data.current_lanelets.begin(), data.current_lanelets.end(), [&](const auto & lanelet) {
230-
data.drivable_lanes.push_back(utils::avoidance::generateExpandDrivableLanes(
231-
lanelet, planner_data_, parameters_, in_avoidance_maneuver));
229+
const auto next_lanes = planner_data_->route_handler->getNextLanelets(lanelet);
230+
const auto is_stop_signal =
231+
utils::traffic_light::isTrafficSignalStop(next_lanes, planner_data_);
232+
if (is_stop_signal && is_within_current_lane) {
233+
data.limit_drivable_lane = true;
234+
data.drivable_lanes.push_back(utils::avoidance::generateNotExpandedDrivableLanes(lanelet));
235+
} else {
236+
data.drivable_lanes.push_back(
237+
utils::avoidance::generateExpandedDrivableLanes(lanelet, planner_data_, parameters_));
238+
}
232239
});
233240

234241
// calc drivable bound
235242
auto tmp_path = getPreviousModuleOutput().path;
243+
const auto use_hatched_road_markings =
244+
parameters_->use_hatched_road_markings && !data.limit_drivable_lane;
245+
const auto use_intersection_areas =
246+
parameters_->use_intersection_areas && !data.limit_drivable_lane;
247+
const auto use_freespace_areas = parameters_->use_freespace_areas && !data.limit_drivable_lane;
236248
const auto shorten_lanes = utils::cutOverlappedLanes(tmp_path, data.drivable_lanes);
237249
data.left_bound = utils::calcBound(
238-
getPreviousModuleOutput().path, planner_data_, shorten_lanes,
239-
parameters_->use_hatched_road_markings, parameters_->use_intersection_areas,
240-
parameters_->use_freespace_areas, true);
250+
getPreviousModuleOutput().path, planner_data_, shorten_lanes, use_hatched_road_markings,
251+
use_intersection_areas, use_freespace_areas, true);
241252
data.right_bound = utils::calcBound(
242-
getPreviousModuleOutput().path, planner_data_, shorten_lanes,
243-
parameters_->use_hatched_road_markings, parameters_->use_intersection_areas,
244-
parameters_->use_freespace_areas, false);
253+
getPreviousModuleOutput().path, planner_data_, shorten_lanes, use_hatched_road_markings,
254+
use_intersection_areas, use_freespace_areas, false);
245255

246256
// reference path
247257
if (isDrivingSameLane(helper_->getPreviousDrivingLanes(), data.current_lanelets)) {
@@ -942,12 +952,13 @@ BehaviorModuleOutput AvoidanceModule::plan()
942952
current_drivable_area_info.drivable_lanes = avoid_data_.drivable_lanes;
943953
// expand hatched road markings
944954
current_drivable_area_info.enable_expanding_hatched_road_markings =
945-
parameters_->use_hatched_road_markings;
955+
parameters_->use_hatched_road_markings && !data.limit_drivable_lane;
946956
// expand intersection areas
947957
current_drivable_area_info.enable_expanding_intersection_areas =
948-
parameters_->use_intersection_areas;
958+
parameters_->use_intersection_areas && !data.limit_drivable_lane;
949959
// expand freespace areas
950-
current_drivable_area_info.enable_expanding_freespace_areas = parameters_->use_freespace_areas;
960+
current_drivable_area_info.enable_expanding_freespace_areas =
961+
parameters_->use_freespace_areas && !data.limit_drivable_lane;
951962
// generate obstacle polygons
952963
if (parameters_->enable_bound_clipping) {
953964
ObjectDataArray clip_objects;

planning/behavior_path_avoidance_module/src/utils.cpp

+49-12
Original file line numberDiff line numberDiff line change
@@ -957,6 +957,44 @@ double calcShiftLength(
957957
return std::fabs(shift_length) > 1e-3 ? shift_length : 0.0;
958958
}
959959

960+
bool isWithinLanes(
961+
const lanelet::ConstLanelets & lanelets, std::shared_ptr<const PlannerData> & planner_data)
962+
{
963+
const auto & rh = planner_data->route_handler;
964+
const auto & ego_pose = planner_data->self_odometry->pose.pose;
965+
const auto transform = tier4_autoware_utils::pose2transform(ego_pose);
966+
const auto footprint = tier4_autoware_utils::transformVector(
967+
planner_data->parameters.vehicle_info.createFootprint(), transform);
968+
969+
lanelet::ConstLanelet closest_lanelet{};
970+
if (!lanelet::utils::query::getClosestLanelet(lanelets, ego_pose, &closest_lanelet)) {
971+
return true;
972+
}
973+
974+
lanelet::ConstLanelets concat_lanelets{};
975+
976+
// push previous lanelet
977+
lanelet::ConstLanelets prev_lanelet;
978+
if (rh->getPreviousLaneletsWithinRoute(closest_lanelet, &prev_lanelet)) {
979+
concat_lanelets.push_back(prev_lanelet.front());
980+
}
981+
982+
// push nearest lanelet
983+
{
984+
concat_lanelets.push_back(closest_lanelet);
985+
}
986+
987+
// push next lanelet
988+
lanelet::ConstLanelet next_lanelet;
989+
if (rh->getNextLaneletWithinRoute(closest_lanelet, &next_lanelet)) {
990+
concat_lanelets.push_back(next_lanelet);
991+
}
992+
993+
const auto combine_lanelet = lanelet::utils::combineLaneletsShape(concat_lanelets);
994+
995+
return boost::geometry::within(footprint, combine_lanelet.polygon2d().basicPolygon());
996+
}
997+
960998
bool isShiftNecessary(const bool & is_object_on_right, const double & shift_length)
961999
{
9621000
/**
@@ -2076,9 +2114,18 @@ std::pair<PredictedObjects, PredictedObjects> separateObjectsByPath(
20762114
return std::make_pair(target_objects, other_objects);
20772115
}
20782116

2079-
DrivableLanes generateExpandDrivableLanes(
2117+
DrivableLanes generateNotExpandedDrivableLanes(const lanelet::ConstLanelet & lanelet)
2118+
{
2119+
DrivableLanes current_drivable_lanes;
2120+
current_drivable_lanes.left_lane = lanelet;
2121+
current_drivable_lanes.right_lane = lanelet;
2122+
2123+
return current_drivable_lanes;
2124+
}
2125+
2126+
DrivableLanes generateExpandedDrivableLanes(
20802127
const lanelet::ConstLanelet & lanelet, const std::shared_ptr<const PlannerData> & planner_data,
2081-
const std::shared_ptr<AvoidanceParameters> & parameters, const bool in_avoidance_maneuver)
2128+
const std::shared_ptr<AvoidanceParameters> & parameters)
20822129
{
20832130
const auto & route_handler = planner_data->route_handler;
20842131

@@ -2092,11 +2139,6 @@ DrivableLanes generateExpandDrivableLanes(
20922139

20932140
// 1. get left/right side lanes
20942141
const auto update_left_lanelets = [&](const lanelet::ConstLanelet & target_lane) {
2095-
const auto next_lanes = route_handler->getNextLanelets(target_lane);
2096-
const auto is_stop_signal = utils::traffic_light::isTrafficSignalStop(next_lanes, planner_data);
2097-
if (is_stop_signal && !in_avoidance_maneuver) {
2098-
return;
2099-
}
21002142
const auto all_left_lanelets = route_handler->getAllLeftSharedLinestringLanelets(
21012143
target_lane, parameters->use_opposite_lane, true);
21022144
if (!all_left_lanelets.empty()) {
@@ -2107,11 +2149,6 @@ DrivableLanes generateExpandDrivableLanes(
21072149
}
21082150
};
21092151
const auto update_right_lanelets = [&](const lanelet::ConstLanelet & target_lane) {
2110-
const auto next_lanes = route_handler->getNextLanelets(target_lane);
2111-
const auto is_stop_signal = utils::traffic_light::isTrafficSignalStop(next_lanes, planner_data);
2112-
if (is_stop_signal && !in_avoidance_maneuver) {
2113-
return;
2114-
}
21152152
const auto all_right_lanelets = route_handler->getAllRightSharedLinestringLanelets(
21162153
target_lane, parameters->use_opposite_lane, true);
21172154
if (!all_right_lanelets.empty()) {

0 commit comments

Comments
 (0)