Skip to content

Commit e9ee1e0

Browse files
fix(lane_change): check prepare phase in intersection
Signed-off-by: Muhammad Zulfaqar Azmi <zulfaqar.azmi@tier4.jp>
1 parent 81d5374 commit e9ee1e0

File tree

3 files changed

+73
-9
lines changed

3 files changed

+73
-9
lines changed

planning/behavior_path_lane_change_module/include/behavior_path_lane_change_module/utils/utils.hpp

+10-1
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
#include "rclcpp/logger.hpp"
2424

2525
#include <route_handler/route_handler.hpp>
26+
#include <tier4_autoware_utils/geometry/boost_geometry.hpp>
2627

2728
#include <autoware_auto_perception_msgs/msg/predicted_objects.hpp>
2829
#include <autoware_auto_planning_msgs/msg/path_with_lane_id.hpp>
@@ -31,6 +32,7 @@
3132

3233
#include <lanelet2_core/Forward.h>
3334

35+
#include <memory>
3436
#include <string>
3537
#include <vector>
3638

@@ -189,7 +191,7 @@ std::optional<lanelet::BasicPolygon2d> createPolygon(
189191

190192
ExtendedPredictedObject transform(
191193
const PredictedObject & object, const BehaviorPathPlannerParameters & common_parameters,
192-
const LaneChangeParameters & lane_change_parameters);
194+
const LaneChangeParameters & lane_change_parameters, const bool check_at_prepare_phase);
193195

194196
bool isCollidedPolygonsInLanelet(
195197
const std::vector<Polygon2d> & collided_polygons, const lanelet::ConstLanelets & lanes);
@@ -224,6 +226,13 @@ lanelet::ConstLanelets generateExpandedLanelets(
224226
* @return rclcpp::Logger The logger instance configured for the specified lane change type.
225227
*/
226228
rclcpp::Logger getLogger(const std::string & type);
229+
230+
Polygon2d getEgoCurrentFootprint(
231+
const Pose & ego_pose, const vehicle_info_util::VehicleInfo & ego_info);
232+
233+
bool isWithinIntersection(
234+
const std::shared_ptr<RouteHandler> & route_handler, const lanelet::ConstLanelet & lanelet,
235+
const Polygon2d & polygon);
227236
} // namespace behavior_path_planner::utils::lane_change
228237

229238
namespace behavior_path_planner::utils::lane_change::debug

planning/behavior_path_lane_change_module/src/scene.cpp

+31-5
Original file line numberDiff line numberDiff line change
@@ -856,23 +856,38 @@ LaneChangeTargetObjects NormalLaneChange::getTargetObjects(
856856
target_objects.other_lane.reserve(target_obj_index.other_lane.size());
857857

858858
// objects in current lane
859+
860+
lanelet::ConstLanelet current_lane;
861+
if (getRouteHandler()->getClosestLaneletWithinRoute(getEgoPose(), &current_lane)) {
862+
}
863+
const auto ego_footprint =
864+
utils::lane_change::getEgoCurrentFootprint(getEgoPose(), common_parameters.vehicle_info);
865+
const auto is_ego_within_intersection =
866+
utils::lane_change::isWithinIntersection(getRouteHandler(), current_lane, ego_footprint);
867+
868+
const auto check_prepare_phase =
869+
is_ego_within_intersection || lane_change_parameters_->enable_prepare_segment_collision_check;
870+
859871
for (const auto & obj_idx : target_obj_index.current_lane) {
860872
const auto extended_object = utils::lane_change::transform(
861-
objects.objects.at(obj_idx), common_parameters, *lane_change_parameters_);
873+
objects.objects.at(obj_idx), common_parameters, *lane_change_parameters_,
874+
check_prepare_phase);
862875
target_objects.current_lane.push_back(extended_object);
863876
}
864877

865878
// objects in target lane
866879
for (const auto & obj_idx : target_obj_index.target_lane) {
867880
const auto extended_object = utils::lane_change::transform(
868-
objects.objects.at(obj_idx), common_parameters, *lane_change_parameters_);
881+
objects.objects.at(obj_idx), common_parameters, *lane_change_parameters_,
882+
check_prepare_phase);
869883
target_objects.target_lane.push_back(extended_object);
870884
}
871885

872886
// objects in other lane
873887
for (const auto & obj_idx : target_obj_index.other_lane) {
874888
const auto extended_object = utils::lane_change::transform(
875-
objects.objects.at(obj_idx), common_parameters, *lane_change_parameters_);
889+
objects.objects.at(obj_idx), common_parameters, *lane_change_parameters_,
890+
check_prepare_phase);
876891
target_objects.other_lane.push_back(extended_object);
877892
}
878893

@@ -930,14 +945,25 @@ LaneChangeTargetObjectIndices NormalLaneChange::filterObject(
930945
target_backward_polygons.push_back(lane_polygon);
931946
}
932947

948+
lanelet::ConstLanelet current_lane;
949+
if (!route_handler.getClosestLaneletWithinRoute(getEgoPose(), &current_lane)) {
950+
}
951+
const auto ego_footprint =
952+
utils::lane_change::getEgoCurrentFootprint(getEgoPose(), common_parameters.vehicle_info);
953+
const auto is_ego_within_intersection =
954+
utils::lane_change::isWithinIntersection(getRouteHandler(), current_lane, ego_footprint);
955+
956+
const auto check_prepare_phase =
957+
is_ego_within_intersection || lane_change_parameters_->enable_prepare_segment_collision_check;
958+
933959
LaneChangeTargetObjectIndices filtered_obj_indices;
934960
for (size_t i = 0; i < objects.objects.size(); ++i) {
935961
const auto & object = objects.objects.at(i);
936962
const auto obj_velocity_norm = std::hypot(
937963
object.kinematics.initial_twist_with_covariance.twist.linear.x,
938964
object.kinematics.initial_twist_with_covariance.twist.linear.y);
939-
const auto extended_object =
940-
utils::lane_change::transform(object, common_parameters, *lane_change_parameters_);
965+
const auto extended_object = utils::lane_change::transform(
966+
object, common_parameters, *lane_change_parameters_, check_prepare_phase);
941967

942968
const auto obj_polygon = tier4_autoware_utils::toPolygon2d(object);
943969

planning/behavior_path_lane_change_module/src/utils/utils.cpp

+32-3
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,11 @@
3131
#include <motion_utils/trajectory/path_with_lane_id.hpp>
3232
#include <motion_utils/trajectory/trajectory.hpp>
3333
#include <rclcpp/rclcpp.hpp>
34+
#include <tier4_autoware_utils/geometry/boost_geometry.hpp>
3435
#include <tier4_autoware_utils/geometry/boost_polygon_utils.hpp>
36+
#include <vehicle_info_util/vehicle_info.hpp>
37+
38+
#include <geometry_msgs/msg/detail/pose__struct.hpp>
3539

3640
#include <lanelet2_core/LaneletMap.h>
3741
#include <lanelet2_core/geometry/LineString.h>
@@ -1123,7 +1127,7 @@ std::optional<lanelet::BasicPolygon2d> createPolygon(
11231127
ExtendedPredictedObject transform(
11241128
const PredictedObject & object,
11251129
[[maybe_unused]] const BehaviorPathPlannerParameters & common_parameters,
1126-
const LaneChangeParameters & lane_change_parameters)
1130+
const LaneChangeParameters & lane_change_parameters, const bool check_at_prepare_phase)
11271131
{
11281132
ExtendedPredictedObject extended_object;
11291133
extended_object.uuid = object.object_id;
@@ -1133,8 +1137,6 @@ ExtendedPredictedObject transform(
11331137
extended_object.shape = object.shape;
11341138

11351139
const auto & time_resolution = lane_change_parameters.prediction_time_resolution;
1136-
const auto & check_at_prepare_phase =
1137-
lane_change_parameters.enable_prepare_segment_collision_check;
11381140
const auto & prepare_duration = lane_change_parameters.lane_change_prepare_duration;
11391141
const auto & velocity_threshold =
11401142
lane_change_parameters.prepare_segment_ignore_object_velocity_thresh;
@@ -1192,6 +1194,32 @@ rclcpp::Logger getLogger(const std::string & type)
11921194
{
11931195
return rclcpp::get_logger("lane_change").get_child(type);
11941196
}
1197+
1198+
Polygon2d getEgoCurrentFootprint(
1199+
const Pose & ego_pose, const vehicle_info_util::VehicleInfo & ego_info)
1200+
{
1201+
const auto base_to_front = ego_info.max_longitudinal_offset_m;
1202+
const auto base_to_rear = ego_info.rear_overhang_m;
1203+
const auto width = ego_info.vehicle_width_m;
1204+
1205+
return tier4_autoware_utils::toFootprint(ego_pose, base_to_front, base_to_rear, width);
1206+
}
1207+
1208+
bool isWithinIntersection(
1209+
const std::shared_ptr<RouteHandler> & route_handler, const lanelet::ConstLanelet & lanelet,
1210+
const Polygon2d & polygon)
1211+
{
1212+
const std::string id = lanelet.attributeOr("intersection_area", "else");
1213+
if (id == "else") {
1214+
return false;
1215+
}
1216+
1217+
const auto lanelet_polygon =
1218+
route_handler->getLaneletMapPtr()->polygonLayer.get(std::atoi(id.c_str()));
1219+
1220+
return boost::geometry::within(
1221+
polygon, utils::toPolygon2d(lanelet::utils::to2D(lanelet_polygon.basicPolygon())));
1222+
}
11951223
} // namespace behavior_path_planner::utils::lane_change
11961224

11971225
namespace behavior_path_planner::utils::lane_change::debug
@@ -1231,4 +1259,5 @@ geometry_msgs::msg::Polygon createExecutionArea(
12311259

12321260
return polygon;
12331261
}
1262+
12341263
} // namespace behavior_path_planner::utils::lane_change::debug

0 commit comments

Comments
 (0)