Skip to content

Commit f7d91e3

Browse files
feat(obstacle_cruise): ignore right beside objects (autowarefoundation#6754) (#1267)
* ignore near beside objects * change a magic num Signed-off-by: Yuki Takagi <yuki.takagi@tier4.jp>
1 parent 1ad6c07 commit f7d91e3

File tree

3 files changed

+48
-64
lines changed

3 files changed

+48
-64
lines changed

planning/obstacle_cruise_planner/config/obstacle_cruise_planner.param.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@
8787
obstacle_traj_angle_threshold : 1.22 # [rad] = 70 [deg], yaw threshold of crossing obstacle against the nearest trajectory point for cruise or stop
8888

8989
stop:
90-
max_lat_margin: 0.2 # lateral margin between obstacle and trajectory band with ego's width
90+
max_lat_margin: 0.3 # lateral margin between obstacle and trajectory band with ego's width
9191
crossing_obstacle:
9292
collision_time_margin : 4.0 # time threshold of collision between obstacle adn ego for cruise or stop [s]
9393

planning/obstacle_cruise_planner/src/node.cpp

+47-19
Original file line numberDiff line numberDiff line change
@@ -556,9 +556,10 @@ std::vector<Polygon2d> ObstacleCruisePlannerNode::createOneStepPolygons(
556556
const geometry_msgs::msg::Pose & current_ego_pose, const double lat_margin) const
557557
{
558558
const auto & p = behavior_determination_param_;
559-
const bool is_enable_current_pose_consideration = p.enable_to_consider_current_pose;
560-
const double step_length = p.decimate_trajectory_step_length;
561-
const double time_to_convergence = p.time_to_convergence;
559+
560+
const double front_length = vehicle_info.max_longitudinal_offset_m;
561+
const double rear_length = vehicle_info.rear_overhang_m;
562+
const double vehicle_width = vehicle_info.vehicle_width_m;
562563

563564
const size_t nearest_idx =
564565
motion_utils::findNearestSegmentIndex(traj_points, current_ego_pose.position);
@@ -567,41 +568,68 @@ std::vector<Polygon2d> ObstacleCruisePlannerNode::createOneStepPolygons(
567568
tier4_autoware_utils::inverseTransformPose(current_ego_pose, nearest_pose);
568569
const double current_ego_lat_error = current_ego_pose_error.position.y;
569570
const double current_ego_yaw_error = tf2::getYaw(current_ego_pose_error.orientation);
570-
double time_elapsed = 0.0;
571-
572-
std::vector<Polygon2d> polygons;
573-
std::vector<geometry_msgs::msg::Pose> last_poses = {traj_points.at(0).pose};
574-
if (is_enable_current_pose_consideration) {
575-
last_poses.push_back(current_ego_pose);
576-
}
571+
double time_elapsed{0.0};
577572

573+
std::vector<Polygon2d> output_polygons;
574+
Polygon2d tmp_polys{};
578575
for (size_t i = 0; i < traj_points.size(); ++i) {
579576
std::vector<geometry_msgs::msg::Pose> current_poses = {traj_points.at(i).pose};
580577

581578
// estimate the future ego pose with assuming that the pose error against the reference path
582579
// will decrease to zero by the time_to_convergence
583-
if (is_enable_current_pose_consideration && time_elapsed < time_to_convergence) {
584-
const double rem_ratio = (time_to_convergence - time_elapsed) / time_to_convergence;
580+
if (p.enable_to_consider_current_pose && time_elapsed < p.time_to_convergence) {
581+
const double rem_ratio = (p.time_to_convergence - time_elapsed) / p.time_to_convergence;
585582
geometry_msgs::msg::Pose indexed_pose_err;
586583
indexed_pose_err.set__orientation(
587584
tier4_autoware_utils::createQuaternionFromYaw(current_ego_yaw_error * rem_ratio));
588585
indexed_pose_err.set__position(
589586
tier4_autoware_utils::createPoint(0.0, current_ego_lat_error * rem_ratio, 0.0));
590-
591587
current_poses.push_back(
592588
tier4_autoware_utils::transformPose(indexed_pose_err, traj_points.at(i).pose));
593-
594589
if (traj_points.at(i).longitudinal_velocity_mps != 0.0) {
595-
time_elapsed += step_length / std::abs(traj_points.at(i).longitudinal_velocity_mps);
590+
time_elapsed +=
591+
p.decimate_trajectory_step_length / std::abs(traj_points.at(i).longitudinal_velocity_mps);
596592
} else {
597593
time_elapsed = std::numeric_limits<double>::max();
598594
}
599595
}
600-
polygons.push_back(
601-
polygon_utils::createOneStepPolygon(last_poses, current_poses, vehicle_info, lat_margin));
602-
last_poses = current_poses;
596+
597+
Polygon2d idx_poly{};
598+
for (const auto & pose : current_poses) {
599+
if (i == 0 && traj_points.at(i).longitudinal_velocity_mps > 1e-3) {
600+
boost::geometry::append(
601+
idx_poly,
602+
tier4_autoware_utils::toFootprint(pose, front_length, rear_length, vehicle_width)
603+
.outer());
604+
boost::geometry::append(
605+
idx_poly,
606+
tier4_autoware_utils::fromMsg(tier4_autoware_utils::calcOffsetPose(
607+
pose, front_length, vehicle_width * 0.5 + lat_margin, 0.0)
608+
.position)
609+
.to_2d());
610+
boost::geometry::append(
611+
idx_poly, tier4_autoware_utils::fromMsg(
612+
tier4_autoware_utils::calcOffsetPose(
613+
pose, front_length, -vehicle_width * 0.5 - lat_margin, 0.0)
614+
.position)
615+
.to_2d());
616+
} else {
617+
boost::geometry::append(
618+
idx_poly, tier4_autoware_utils::toFootprint(
619+
pose, front_length, rear_length, vehicle_width + lat_margin * 2.0)
620+
.outer());
621+
}
622+
}
623+
624+
boost::geometry::append(tmp_polys, idx_poly.outer());
625+
Polygon2d hull_polygon;
626+
boost::geometry::convex_hull(tmp_polys, hull_polygon);
627+
boost::geometry::correct(hull_polygon);
628+
629+
output_polygons.push_back(hull_polygon);
630+
tmp_polys = std::move(idx_poly);
603631
}
604-
return polygons;
632+
return output_polygons;
605633
}
606634

607635
std::vector<Obstacle> ObstacleCruisePlannerNode::convertToObstacles(

planning/obstacle_cruise_planner/src/polygon_utils.cpp

-44
Original file line numberDiff line numberDiff line change
@@ -20,18 +20,6 @@
2020

2121
namespace
2222
{
23-
void appendPointToPolygon(Polygon2d & polygon, const geometry_msgs::msg::Point & geom_point)
24-
{
25-
Point2d point(geom_point.x, geom_point.y);
26-
bg::append(polygon.outer(), point);
27-
}
28-
29-
geometry_msgs::msg::Point calcOffsetPosition(
30-
const geometry_msgs::msg::Pose & pose, const double offset_x, const double offset_y)
31-
{
32-
return tier4_autoware_utils::calcOffsetPose(pose, offset_x, offset_y, 0.0).position;
33-
}
34-
3523
PointWithStamp calcNearestCollisionPoint(
3624
const size_t first_within_idx, const std::vector<PointWithStamp> & collision_points,
3725
const std::vector<TrajectoryPoint> & decimated_traj_points, const bool is_driving_forward)
@@ -104,38 +92,6 @@ std::optional<std::pair<size_t, std::vector<PointWithStamp>>> getCollisionIndex(
10492

10593
namespace polygon_utils
10694
{
107-
Polygon2d createOneStepPolygon(
108-
const std::vector<geometry_msgs::msg::Pose> & last_poses,
109-
const std::vector<geometry_msgs::msg::Pose> & current_poses,
110-
const vehicle_info_util::VehicleInfo & vehicle_info, const double lat_margin)
111-
{
112-
Polygon2d polygon;
113-
114-
const double base_to_front = vehicle_info.max_longitudinal_offset_m;
115-
const double width = vehicle_info.vehicle_width_m / 2.0 + lat_margin;
116-
const double base_to_rear = vehicle_info.rear_overhang_m;
117-
118-
for (auto & pose : last_poses) {
119-
appendPointToPolygon(polygon, calcOffsetPosition(pose, base_to_front, width));
120-
appendPointToPolygon(polygon, calcOffsetPosition(pose, base_to_front, -width));
121-
appendPointToPolygon(polygon, calcOffsetPosition(pose, -base_to_rear, -width));
122-
appendPointToPolygon(polygon, calcOffsetPosition(pose, -base_to_rear, width));
123-
}
124-
for (auto & pose : current_poses) {
125-
appendPointToPolygon(polygon, calcOffsetPosition(pose, base_to_front, width));
126-
appendPointToPolygon(polygon, calcOffsetPosition(pose, base_to_front, -width));
127-
appendPointToPolygon(polygon, calcOffsetPosition(pose, -base_to_rear, -width));
128-
appendPointToPolygon(polygon, calcOffsetPosition(pose, -base_to_rear, width));
129-
}
130-
131-
bg::correct(polygon);
132-
133-
Polygon2d hull_polygon;
134-
bg::convex_hull(polygon, hull_polygon);
135-
136-
return hull_polygon;
137-
}
138-
13995
std::optional<std::pair<geometry_msgs::msg::Point, double>> getCollisionPoint(
14096
const std::vector<TrajectoryPoint> & traj_points, const std::vector<Polygon2d> & traj_polygons,
14197
const Obstacle & obstacle, const bool is_driving_forward,

0 commit comments

Comments
 (0)