Skip to content

Commit b266f47

Browse files
authored
fix(lane_change): fix chattering for stopped objects (#5302)
Update planning/behavior_path_planner/src/utils/path_safety_checker/safety_check.cpp fix(path_safety_checker): remove redundant parameter name Signed-off-by: Fumiya Watanabe <rej55.g@gmail.com>
1 parent 1c5ca20 commit b266f47

File tree

5 files changed

+69
-45
lines changed

5 files changed

+69
-45
lines changed

planning/behavior_path_planner/include/behavior_path_planner/utils/path_safety_checker/path_safety_checker_parameters.hpp

+13-12
Original file line numberDiff line numberDiff line change
@@ -182,18 +182,19 @@ struct SafetyCheckParams
182182

183183
struct CollisionCheckDebug
184184
{
185-
std::string unsafe_reason; ///< Reason indicating unsafe situation.
186-
Twist current_twist{}; ///< Ego vehicle's current velocity and rotation.
187-
Pose expected_ego_pose{}; ///< Predicted future pose of ego vehicle.
188-
Pose current_obj_pose{}; ///< Detected object's current pose.
189-
Twist object_twist{}; ///< Detected object's velocity and rotation.
190-
Pose expected_obj_pose{}; ///< Predicted future pose of object.
191-
double rss_longitudinal{0.0}; ///< Longitudinal RSS measure.
192-
double inter_vehicle_distance{0.0}; ///< Distance between ego vehicle and object.
193-
double extended_polygon_lon_offset{0.0}; ///< Longitudinal offset for extended polygon.
194-
double extended_polygon_lat_offset{0.0}; ///< Lateral offset for extended polygon.
195-
bool is_front{false}; ///< True if object is in front of ego vehicle.
196-
bool is_safe{false}; ///< True if situation is deemed safe.
185+
std::string unsafe_reason; ///< Reason indicating unsafe situation.
186+
Twist current_twist{}; ///< Ego vehicle's current velocity and rotation.
187+
Pose expected_ego_pose{}; ///< Predicted future pose of ego vehicle.
188+
Pose current_obj_pose{}; ///< Detected object's current pose.
189+
Twist object_twist{}; ///< Detected object's velocity and rotation.
190+
Pose expected_obj_pose{}; ///< Predicted future pose of object.
191+
double rss_longitudinal{0.0}; ///< Longitudinal RSS measure.
192+
double inter_vehicle_distance{0.0}; ///< Distance between ego vehicle and object.
193+
double forward_lon_offset{0.0}; ///< Forward longitudinal offset for extended polygon.
194+
double backward_lon_offset{0.0}; ///< Backward longitudinal offset for extended polygon.
195+
double lat_offset{0.0}; ///< Lateral offset for extended polygon.
196+
bool is_front{false}; ///< True if object is in front of ego vehicle.
197+
bool is_safe{false}; ///< True if situation is deemed safe.
197198
std::vector<PoseWithVelocityStamped> ego_predicted_path; ///< ego vehicle's predicted path.
198199
std::vector<PoseWithVelocityAndPolygonStamped> obj_predicted_path; ///< object's predicted path.
199200
Polygon2d extended_ego_polygon{}; ///< Ego vehicle's extended collision polygon.

planning/behavior_path_planner/include/behavior_path_planner/utils/path_safety_checker/safety_check.hpp

+3-2
Original file line numberDiff line numberDiff line change
@@ -66,10 +66,11 @@ bool isTargetObjectFront(
6666

6767
Polygon2d createExtendedPolygon(
6868
const Pose & base_link_pose, const vehicle_info_util::VehicleInfo & vehicle_info,
69-
const double lon_length, const double lat_margin, CollisionCheckDebug & debug);
69+
const double lon_length, const double lat_margin, const double is_stopped_obj,
70+
CollisionCheckDebug & debug);
7071
Polygon2d createExtendedPolygon(
7172
const Pose & obj_pose, const Shape & shape, const double lon_length, const double lat_margin,
72-
CollisionCheckDebug & debug);
73+
const double is_stopped_obj, CollisionCheckDebug & debug);
7374

7475
PredictedPath convertToPredictedPath(
7576
const std::vector<PoseWithVelocityStamped> & path, const double time_resolution);

planning/behavior_path_planner/src/marker_utils/utils.cpp

+3-2
Original file line numberDiff line numberDiff line change
@@ -641,8 +641,9 @@ MarkerArray showSafetyCheckInfo(const CollisionCheckDebugMap & obj_debug_vec, st
641641
<< "\nRSS dist: " << std::setprecision(4) << info.rss_longitudinal
642642
<< "\nEgo to obj: " << info.inter_vehicle_distance
643643
<< "\nExtended polygon: " << (info.is_front ? "ego" : "object")
644-
<< "\nExtended polygon lateral offset: " << info.extended_polygon_lat_offset
645-
<< "\nExtended polygon longitudinal offset: " << info.extended_polygon_lon_offset
644+
<< "\nExtended polygon lateral offset: " << info.lat_offset
645+
<< "\nExtended polygon forward longitudinal offset: " << info.forward_lon_offset
646+
<< "\nExtended polygon backward longitudinal offset: " << info.backward_lon_offset
646647
<< "\nLast checked position: " << (info.is_front ? "obj in front ego" : "obj at back ego")
647648
<< "\nSafe: " << (info.is_safe ? "Yes" : "No");
648649

planning/behavior_path_planner/src/utils/path_safety_checker/safety_check.cpp

+38-22
Original file line numberDiff line numberDiff line change
@@ -82,28 +82,33 @@ bool isTargetObjectFront(
8282

8383
Polygon2d createExtendedPolygon(
8484
const Pose & base_link_pose, const vehicle_info_util::VehicleInfo & vehicle_info,
85-
const double lon_length, const double lat_margin, CollisionCheckDebug & debug)
85+
const double lon_length, const double lat_margin, const double is_stopped_obj,
86+
CollisionCheckDebug & debug)
8687
{
8788
const double & base_to_front = vehicle_info.max_longitudinal_offset_m;
8889
const double & width = vehicle_info.vehicle_width_m;
8990
const double & base_to_rear = vehicle_info.rear_overhang_m;
9091

91-
const double lon_offset = std::max(lon_length + base_to_front, base_to_front);
92-
92+
// if stationary object, extend forward and backward by the half of lon length
93+
const double forward_lon_offset = base_to_front + (is_stopped_obj ? lon_length / 2 : lon_length);
94+
const double backward_lon_offset =
95+
-base_to_rear - (is_stopped_obj ? lon_length / 2 : 0); // minus value
9396
const double lat_offset = width / 2.0 + lat_margin;
9497

9598
{
96-
debug.extended_polygon_lon_offset = lon_offset;
97-
debug.extended_polygon_lat_offset = lat_offset;
99+
debug.forward_lon_offset = forward_lon_offset;
100+
debug.backward_lon_offset = backward_lon_offset;
101+
debug.lat_offset = lat_offset;
98102
}
99103

100-
const auto p1 = tier4_autoware_utils::calcOffsetPose(base_link_pose, lon_offset, lat_offset, 0.0);
104+
const auto p1 =
105+
tier4_autoware_utils::calcOffsetPose(base_link_pose, forward_lon_offset, lat_offset, 0.0);
101106
const auto p2 =
102-
tier4_autoware_utils::calcOffsetPose(base_link_pose, lon_offset, -lat_offset, 0.0);
107+
tier4_autoware_utils::calcOffsetPose(base_link_pose, forward_lon_offset, -lat_offset, 0.0);
103108
const auto p3 =
104-
tier4_autoware_utils::calcOffsetPose(base_link_pose, -base_to_rear, -lat_offset, 0.0);
109+
tier4_autoware_utils::calcOffsetPose(base_link_pose, backward_lon_offset, -lat_offset, 0.0);
105110
const auto p4 =
106-
tier4_autoware_utils::calcOffsetPose(base_link_pose, -base_to_rear, lat_offset, 0.0);
111+
tier4_autoware_utils::calcOffsetPose(base_link_pose, backward_lon_offset, lat_offset, 0.0);
107112

108113
Polygon2d polygon;
109114
appendPointToPolygon(polygon, p1.position);
@@ -118,7 +123,7 @@ Polygon2d createExtendedPolygon(
118123

119124
Polygon2d createExtendedPolygon(
120125
const Pose & obj_pose, const Shape & shape, const double lon_length, const double lat_margin,
121-
CollisionCheckDebug & debug)
126+
const double is_stopped_obj, CollisionCheckDebug & debug)
122127
{
123128
const auto obj_polygon = tier4_autoware_utils::toPolygon2d(obj_pose, shape);
124129
if (obj_polygon.outer().empty()) {
@@ -139,19 +144,27 @@ Polygon2d createExtendedPolygon(
139144
min_y = std::min(transformed_p.y, min_y);
140145
}
141146

142-
const double lon_offset = max_x + lon_length;
147+
// if stationary object, extend forward and backward by the half of lon length
148+
const double forward_lon_offset = max_x + (is_stopped_obj ? lon_length / 2 : lon_length);
149+
const double backward_lon_offset = min_x - (is_stopped_obj ? lon_length / 2 : 0); // minus value
150+
143151
const double left_lat_offset = max_y + lat_margin;
144152
const double right_lat_offset = min_y - lat_margin;
145153

146154
{
147-
debug.extended_polygon_lon_offset = lon_offset;
148-
debug.extended_polygon_lat_offset = (left_lat_offset + right_lat_offset) / 2;
155+
debug.forward_lon_offset = forward_lon_offset;
156+
debug.backward_lon_offset = backward_lon_offset;
157+
debug.lat_offset = (left_lat_offset + right_lat_offset) / 2;
149158
}
150159

151-
const auto p1 = tier4_autoware_utils::calcOffsetPose(obj_pose, lon_offset, left_lat_offset, 0.0);
152-
const auto p2 = tier4_autoware_utils::calcOffsetPose(obj_pose, lon_offset, right_lat_offset, 0.0);
153-
const auto p3 = tier4_autoware_utils::calcOffsetPose(obj_pose, min_x, right_lat_offset, 0.0);
154-
const auto p4 = tier4_autoware_utils::calcOffsetPose(obj_pose, min_x, left_lat_offset, 0.0);
160+
const auto p1 =
161+
tier4_autoware_utils::calcOffsetPose(obj_pose, forward_lon_offset, left_lat_offset, 0.0);
162+
const auto p2 =
163+
tier4_autoware_utils::calcOffsetPose(obj_pose, forward_lon_offset, right_lat_offset, 0.0);
164+
const auto p3 =
165+
tier4_autoware_utils::calcOffsetPose(obj_pose, backward_lon_offset, right_lat_offset, 0.0);
166+
const auto p4 =
167+
tier4_autoware_utils::calcOffsetPose(obj_pose, backward_lon_offset, left_lat_offset, 0.0);
155168

156169
Polygon2d polygon;
157170
appendPointToPolygon(polygon, p1.position);
@@ -338,14 +351,17 @@ std::vector<Polygon2d> getCollidedPolygons(
338351

339352
const auto & lon_offset = std::max(rss_dist, min_lon_length) * hysteresis_factor;
340353
const auto & lat_margin = rss_parameters.lateral_distance_max_threshold * hysteresis_factor;
341-
const auto & extended_ego_polygon =
342-
is_object_front
343-
? createExtendedPolygon(ego_pose, ego_vehicle_info, lon_offset, lat_margin, debug)
344-
: ego_polygon;
354+
// TODO(watanabe) fix hard coding value
355+
const bool is_stopped_object = object_velocity < 0.3;
356+
const auto & extended_ego_polygon = is_object_front ? createExtendedPolygon(
357+
ego_pose, ego_vehicle_info, lon_offset,
358+
lat_margin, is_stopped_object, debug)
359+
: ego_polygon;
345360
const auto & extended_obj_polygon =
346361
is_object_front
347362
? obj_polygon
348-
: createExtendedPolygon(obj_pose, target_object.shape, lon_offset, lat_margin, debug);
363+
: createExtendedPolygon(
364+
obj_pose, target_object.shape, lon_offset, lat_margin, is_stopped_object, debug);
349365

350366
{
351367
debug.rss_longitudinal = rss_dist;

planning/behavior_path_planner/test/test_safety_check.cpp

+12-7
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,10 @@ TEST(BehaviorPathPlanningSafetyUtilsTest, createExtendedEgoPolygon)
5252

5353
const double lon_length = 10.0;
5454
const double lat_margin = 2.0;
55+
const bool is_stopped_object = false;
5556

56-
const auto polygon =
57-
createExtendedPolygon(ego_pose, vehicle_info, lon_length, lat_margin, debug);
57+
const auto polygon = createExtendedPolygon(
58+
ego_pose, vehicle_info, lon_length, lat_margin, is_stopped_object, debug);
5859

5960
EXPECT_EQ(polygon.outer().size(), static_cast<unsigned int>(5));
6061

@@ -79,9 +80,10 @@ TEST(BehaviorPathPlanningSafetyUtilsTest, createExtendedEgoPolygon)
7980

8081
const double lon_length = 10.0;
8182
const double lat_margin = 2.0;
83+
const bool is_stopped_object = false;
8284

83-
const auto polygon =
84-
createExtendedPolygon(ego_pose, vehicle_info, lon_length, lat_margin, debug);
85+
const auto polygon = createExtendedPolygon(
86+
ego_pose, vehicle_info, lon_length, lat_margin, is_stopped_object, debug);
8587

8688
EXPECT_EQ(polygon.outer().size(), static_cast<unsigned int>(5));
8789

@@ -107,9 +109,10 @@ TEST(BehaviorPathPlanningSafetyUtilsTest, createExtendedEgoPolygon)
107109

108110
const double lon_length = 10.0;
109111
const double lat_margin = 2.0;
112+
const bool is_stopped_object = false;
110113

111-
const auto polygon =
112-
createExtendedPolygon(ego_pose, vehicle_info, lon_length, lat_margin, debug);
114+
const auto polygon = createExtendedPolygon(
115+
ego_pose, vehicle_info, lon_length, lat_margin, is_stopped_object, debug);
113116

114117
EXPECT_EQ(polygon.outer().size(), static_cast<unsigned int>(5));
115118

@@ -155,9 +158,11 @@ TEST(BehaviorPathPlanningSafetyUtilsTest, createExtendedObjPolygon)
155158

156159
const double lon_length = 10.0;
157160
const double lat_margin = 2.0;
161+
const bool is_stopped_object = false;
158162

159163
CollisionCheckDebug debug;
160-
const auto polygon = createExtendedPolygon(obj_pose, shape, lon_length, lat_margin, debug);
164+
const auto polygon =
165+
createExtendedPolygon(obj_pose, shape, lon_length, lat_margin, is_stopped_object, debug);
161166

162167
EXPECT_EQ(polygon.outer().size(), static_cast<unsigned int>(5));
163168

0 commit comments

Comments
 (0)