Skip to content

Commit 09df296

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 c9e6dda commit 09df296

File tree

6 files changed

+80
-28
lines changed

6 files changed

+80
-28
lines changed

planning/behavior_path_avoidance_by_lane_change_module/src/scene.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ AvoidancePlanningData AvoidanceByLaneChange::calcAvoidancePlanningData(
156156
std::for_each(
157157
data.current_lanelets.begin(), data.current_lanelets.end(), [&](const auto & lanelet) {
158158
data.drivable_lanes.push_back(utils::avoidance::generateExpandDrivableLanes(
159-
lanelet, planner_data_, avoidance_parameters_, false));
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

+4-1
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);
@@ -159,7 +162,7 @@ std::pair<PredictedObjects, PredictedObjects> separateObjectsByPath(
159162

160163
DrivableLanes generateExpandDrivableLanes(
161164
const lanelet::ConstLanelet & lanelet, const std::shared_ptr<const PlannerData> & planner_data,
162-
const std::shared_ptr<AvoidanceParameters> & parameters, const bool in_avoidance_maneuver);
165+
const std::shared_ptr<AvoidanceParameters> & parameters);
163166

164167
double calcDistanceToReturnDeadLine(
165168
const lanelet::ConstLanelets & lanelets, const PathWithLaneId & path,

planning/behavior_path_avoidance_module/src/scene.cpp

+27-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,37 @@ 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+
const auto limit_drivable_lane = is_stop_signal && is_within_current_lane;
233+
if (limit_drivable_lane) {
234+
data.limit_drivable_lane = true;
235+
data.drivable_lanes.emplace_back(lanelet);
236+
} else {
237+
data.drivable_lanes.push_back(
238+
utils::avoidance::generateExpandDrivableLanes(lanelet, planner_data_, parameters_));
239+
}
232240
});
233241

234242
// calc drivable bound
235243
auto tmp_path = getPreviousModuleOutput().path;
244+
const auto use_hatched_road_markings =
245+
parameters_->use_hatched_road_markings && !data.limit_drivable_lane;
246+
const auto use_intersection_areas =
247+
parameters_->use_intersection_areas && !data.limit_drivable_lane;
248+
const auto use_freespace_areas = parameters_->use_freespace_areas && !data.limit_drivable_lane;
236249
const auto shorten_lanes = utils::cutOverlappedLanes(tmp_path, data.drivable_lanes);
237250
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);
251+
getPreviousModuleOutput().path, planner_data_, shorten_lanes, use_hatched_road_markings,
252+
use_intersection_areas, use_freespace_areas, true);
241253
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);
254+
getPreviousModuleOutput().path, planner_data_, shorten_lanes, use_hatched_road_markings,
255+
use_intersection_areas, use_freespace_areas, false);
245256

246257
// reference path
247258
if (isDrivingSameLane(helper_->getPreviousDrivingLanes(), data.current_lanelets)) {
@@ -942,12 +953,13 @@ BehaviorModuleOutput AvoidanceModule::plan()
942953
current_drivable_area_info.drivable_lanes = avoid_data_.drivable_lanes;
943954
// expand hatched road markings
944955
current_drivable_area_info.enable_expanding_hatched_road_markings =
945-
parameters_->use_hatched_road_markings;
956+
parameters_->use_hatched_road_markings && !data.limit_drivable_lane;
946957
// expand intersection areas
947958
current_drivable_area_info.enable_expanding_intersection_areas =
948-
parameters_->use_intersection_areas;
959+
parameters_->use_intersection_areas && !data.limit_drivable_lane;
949960
// expand freespace areas
950-
current_drivable_area_info.enable_expanding_freespace_areas = parameters_->use_freespace_areas;
961+
current_drivable_area_info.enable_expanding_freespace_areas =
962+
parameters_->use_freespace_areas && !data.limit_drivable_lane;
951963
// generate obstacle polygons
952964
if (parameters_->enable_bound_clipping) {
953965
ObjectDataArray clip_objects;

planning/behavior_path_avoidance_module/src/utils.cpp

+39-11
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
/**
@@ -2078,7 +2116,7 @@ std::pair<PredictedObjects, PredictedObjects> separateObjectsByPath(
20782116

20792117
DrivableLanes generateExpandDrivableLanes(
20802118
const lanelet::ConstLanelet & lanelet, const std::shared_ptr<const PlannerData> & planner_data,
2081-
const std::shared_ptr<AvoidanceParameters> & parameters, const bool in_avoidance_maneuver)
2119+
const std::shared_ptr<AvoidanceParameters> & parameters)
20822120
{
20832121
const auto & route_handler = planner_data->route_handler;
20842122

@@ -2092,11 +2130,6 @@ DrivableLanes generateExpandDrivableLanes(
20922130

20932131
// 1. get left/right side lanes
20942132
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-
}
21002133
const auto all_left_lanelets = route_handler->getAllLeftSharedLinestringLanelets(
21012134
target_lane, parameters->use_opposite_lane, true);
21022135
if (!all_left_lanelets.empty()) {
@@ -2107,11 +2140,6 @@ DrivableLanes generateExpandDrivableLanes(
21072140
}
21082141
};
21092142
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-
}
21152143
const auto all_right_lanelets = route_handler->getAllRightSharedLinestringLanelets(
21162144
target_lane, parameters->use_opposite_lane, true);
21172145
if (!all_right_lanelets.empty()) {

planning/behavior_path_planner_common/include/behavior_path_planner_common/data_manager.hpp

+7
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,13 @@ struct ModuleNameStamped
8787

8888
struct DrivableLanes
8989
{
90+
DrivableLanes() {}
91+
92+
explicit DrivableLanes(const lanelet::ConstLanelet & lanelet)
93+
: right_lane(lanelet), left_lane(lanelet)
94+
{
95+
}
96+
9097
lanelet::ConstLanelet right_lane;
9198
lanelet::ConstLanelet left_lane;
9299
lanelet::ConstLanelets middle_lanes;

0 commit comments

Comments
 (0)