Skip to content

Commit c87ebf8

Browse files
rename
Signed-off-by: Yuki Takagi <yuki.takagi@tier4.jp>
1 parent 450cdc8 commit c87ebf8

File tree

2 files changed

+60
-76
lines changed
  • planning/behavior_path_dynamic_avoidance_module

2 files changed

+60
-76
lines changed

planning/behavior_path_dynamic_avoidance_module/include/behavior_path_dynamic_avoidance_module/scene.hpp

+14-16
Original file line numberDiff line numberDiff line change
@@ -77,10 +77,14 @@ enum class PolygonGenerationMethod {
7777
OBJECT_PATH_BASE,
7878
};
7979

80-
enum class ObjectBehaviorType {
81-
IGNORE = 0,
82-
REGULATED,
83-
PRIORITIZED,
80+
enum class ObjectType {
81+
OUT_OF_SCOPE = 0, // The module do not care about this type of objects.
82+
REGULATED, // The module assumes this type of objects move in paralell against lanes. Drivable
83+
// areas are divided proportionately with the ego. In typicaly, cars, bus and trucks
84+
// are classified to this type.
85+
UNREGULATED, // The module does not assume the objects move in paralell against lanes and
86+
// assignes drivable area with priority to ego. In typicaly, pedestrians should be
87+
// classified to this type.
8488
};
8589

8690
struct DynamicAvoidanceParameters
@@ -181,17 +185,11 @@ class DynamicAvoidanceModule : public SceneModuleInterface
181185
for (const auto & path : predicted_object.kinematics.predicted_paths) {
182186
predicted_paths.push_back(path);
183187
}
184-
for (size_t i = 0;
185-
i < predicted_object.kinematics.initial_pose_with_covariance.covariance.size(); ++i) {
186-
pose_covariance_sqrt[i] =
187-
std::sqrt(predicted_object.kinematics.initial_pose_with_covariance.covariance[i]);
188-
}
189188
}
190189

191190
std::string uuid{};
192191
uint8_t label{};
193192
geometry_msgs::msg::Pose pose{};
194-
double pose_covariance_sqrt[36]; // for experimental
195193
autoware_auto_perception_msgs::msg::Shape shape;
196194
double vel{0.0};
197195
double lat_vel{0.0};
@@ -382,12 +380,12 @@ class DynamicAvoidanceModule : public SceneModuleInterface
382380

383381
bool canTransitFailureState() override { return false; }
384382

385-
ObjectBehaviorType getLabelAsTargetObstacle(const uint8_t label) const;
383+
ObjectType getLabelAsTargetObstacle(const uint8_t label) const;
386384
void registerRegulatedObjects(const std::vector<DynamicAvoidanceObject> & prev_objects);
387-
void registerPrioritizedObjects(const std::vector<DynamicAvoidanceObject> & prev_objects);
385+
void registerUnregulatedObjects(const std::vector<DynamicAvoidanceObject> & prev_objects);
388386
void determineWhetherToAvoidAgainstRegulatedObjects(
389387
const std::vector<DynamicAvoidanceObject> & prev_objects);
390-
void determineWhetherToAvoidAgainstPrioritizedObjects(
388+
void determineWhetherToAvoidAgainstUnregulatedObjects(
391389
const std::vector<DynamicAvoidanceObject> & prev_objects);
392390
LatFeasiblePaths generateLateralFeasiblePaths(
393391
const geometry_msgs::msg::Pose & ego_pose, const double ego_vel) const;
@@ -420,12 +418,12 @@ class DynamicAvoidanceModule : public SceneModuleInterface
420418
const geometry_msgs::msg::Pose & obj_pose, const Polygon2d & obj_points, const double obj_vel,
421419
const PredictedPath & obj_path, const autoware_auto_perception_msgs::msg::Shape & obj_shape,
422420
const TimeWhileCollision & time_while_collision) const;
423-
std::optional<MinMaxValue> calcMinMaxLateralOffsetToAvoid(
421+
std::optional<MinMaxValue> calcMinMaxLateralOffsetToAvoidRegulatedObject(
424422
const std::vector<PathPointWithLaneId> & ref_path_points_for_obj_poly,
425423
const Polygon2d & obj_points, const geometry_msgs::msg::Point & obj_pos, const double obj_vel,
426424
const bool is_collision_left, const double obj_normal_vel,
427425
const std::optional<DynamicAvoidanceObject> & prev_object) const;
428-
std::optional<MinMaxValue> calcMinMaxLateralOffsetAgainstPrioritizedObject(
426+
std::optional<MinMaxValue> calcMinMaxLateralOffsetToAvoidUnregulatedObject(
429427
const std::vector<PathPointWithLaneId> & ref_path_points_for_obj_poly,
430428
const std::optional<DynamicAvoidanceObject> & prev_object,
431429
const DynamicAvoidanceObject & object) const;
@@ -435,7 +433,7 @@ class DynamicAvoidanceModule : public SceneModuleInterface
435433
const DynamicAvoidanceObject & object) const;
436434
std::optional<tier4_autoware_utils::Polygon2d> calcObjectPathBasedDynamicObstaclePolygon(
437435
const DynamicAvoidanceObject & object) const;
438-
std::optional<tier4_autoware_utils::Polygon2d> calcPrioritizedObstacleAvoidPolygon(
436+
std::optional<tier4_autoware_utils::Polygon2d> calcPredictedPathBasedDynamicObstaclePolygon(
439437
const DynamicAvoidanceObject & object, const EgoPathReservePoly & ego_path_poly) const;
440438
EgoPathReservePoly calcEgoPathPreservePoly(const PathWithLaneId & ego_path) const;
441439

planning/behavior_path_dynamic_avoidance_module/src/scene.cpp

+46-60
Original file line numberDiff line numberDiff line change
@@ -364,14 +364,14 @@ void DynamicAvoidanceModule::updateData()
364364

365365
// 1. Rough filtering of target objects with small computing cost
366366
registerRegulatedObjects(prev_objects);
367-
registerPrioritizedObjects(prev_objects);
367+
registerUnregulatedObjects(prev_objects);
368368

369369
const auto & ego_lat_feasible_paths = generateLateralFeasiblePaths(getEgoPose(), getEgoSpeed());
370370
target_objects_manager_.finalize(ego_lat_feasible_paths);
371371

372372
// 2. Precise filtering of target objects and check if they should be avoided
373373
determineWhetherToAvoidAgainstRegulatedObjects(prev_objects);
374-
determineWhetherToAvoidAgainstPrioritizedObjects(prev_objects);
374+
determineWhetherToAvoidAgainstUnregulatedObjects(prev_objects);
375375

376376
const auto target_objects_candidate = target_objects_manager_.getValidObjects();
377377
target_objects_.clear();
@@ -407,8 +407,8 @@ BehaviorModuleOutput DynamicAvoidanceModule::plan()
407407
std::vector<DrivableAreaInfo::Obstacle> obstacles_for_drivable_area;
408408
for (const auto & object : target_objects_) {
409409
const auto obstacle_poly = [&]() {
410-
if (getLabelAsTargetObstacle(object.label) == ObjectBehaviorType::PRIORITIZED) {
411-
return calcPrioritizedObstacleAvoidPolygon(object, ego_path_reserve_poly);
410+
if (getLabelAsTargetObstacle(object.label) == ObjectType::UNREGULATED) {
411+
return calcPredictedPathBasedDynamicObstaclePolygon(object, ego_path_reserve_poly);
412412
}
413413

414414
if (parameters_->polygon_generation_method == PolygonGenerationMethod::EGO_PATH_BASE) {
@@ -463,35 +463,35 @@ BehaviorModuleOutput DynamicAvoidanceModule::planWaitingApproval()
463463
return out;
464464
}
465465

466-
ObjectBehaviorType DynamicAvoidanceModule::getLabelAsTargetObstacle(const uint8_t label) const
466+
ObjectType DynamicAvoidanceModule::getLabelAsTargetObstacle(const uint8_t label) const
467467
{
468468
using autoware_auto_perception_msgs::msg::ObjectClassification;
469469

470470
if (label == ObjectClassification::CAR && parameters_->avoid_car) {
471-
return ObjectBehaviorType::REGULATED;
471+
return ObjectType::REGULATED;
472472
}
473473
if (label == ObjectClassification::TRUCK && parameters_->avoid_truck) {
474-
return ObjectBehaviorType::REGULATED;
474+
return ObjectType::REGULATED;
475475
}
476476
if (label == ObjectClassification::BUS && parameters_->avoid_bus) {
477-
return ObjectBehaviorType::REGULATED;
477+
return ObjectType::REGULATED;
478478
}
479479
if (label == ObjectClassification::TRAILER && parameters_->avoid_trailer) {
480-
return ObjectBehaviorType::REGULATED;
480+
return ObjectType::REGULATED;
481481
}
482482
if (label == ObjectClassification::UNKNOWN && parameters_->avoid_unknown) {
483-
return ObjectBehaviorType::PRIORITIZED;
483+
return ObjectType::UNREGULATED;
484484
}
485485
if (label == ObjectClassification::BICYCLE && parameters_->avoid_bicycle) {
486-
return ObjectBehaviorType::PRIORITIZED;
486+
return ObjectType::UNREGULATED;
487487
}
488488
if (label == ObjectClassification::MOTORCYCLE && parameters_->avoid_motorcycle) {
489-
return ObjectBehaviorType::REGULATED;
489+
return ObjectType::REGULATED;
490490
}
491491
if (label == ObjectClassification::PEDESTRIAN && parameters_->avoid_pedestrian) {
492-
return ObjectBehaviorType::PRIORITIZED;
492+
return ObjectType::UNREGULATED;
493493
}
494-
return ObjectBehaviorType::IGNORE;
494+
return ObjectType::OUT_OF_SCOPE;
495495
}
496496

497497
void DynamicAvoidanceModule::registerRegulatedObjects(
@@ -519,7 +519,7 @@ void DynamicAvoidanceModule::registerRegulatedObjects(
519519
// 1.a. check label
520520
if (
521521
getLabelAsTargetObstacle(predicted_object.classification.front().label) !=
522-
ObjectBehaviorType::REGULATED) {
522+
ObjectType::REGULATED) {
523523
continue;
524524
}
525525

@@ -588,7 +588,7 @@ void DynamicAvoidanceModule::registerRegulatedObjects(
588588
}
589589
}
590590

591-
void DynamicAvoidanceModule::registerPrioritizedObjects(
591+
void DynamicAvoidanceModule::registerUnregulatedObjects(
592592
const std::vector<DynamicAvoidanceObject> & prev_objects)
593593
{
594594
const auto input_path = getPreviousModuleOutput().path;
@@ -606,14 +606,14 @@ void DynamicAvoidanceModule::registerPrioritizedObjects(
606606
predicted_object.kinematics.predicted_paths.end(),
607607
[](const PredictedPath & a, const PredictedPath & b) { return a.confidence < b.confidence; });
608608

609-
// 1.a. check label
609+
// 1.a. Check if the obstacle is labeled as pedestrians, bicycle or similar.
610610
if (
611611
getLabelAsTargetObstacle(predicted_object.classification.front().label) !=
612-
ObjectBehaviorType::PRIORITIZED) {
612+
ObjectType::UNREGULATED) {
613613
continue;
614614
}
615615

616-
// 1.b. check obstacle velocity
616+
// 1.b. Check if the object's velocity is within the module's coverage range.
617617
const auto [obj_tangent_vel, obj_normal_vel] =
618618
projectObstacleVelocityToTrajectory(input_path.points, predicted_object);
619619
if (
@@ -622,7 +622,7 @@ void DynamicAvoidanceModule::registerPrioritizedObjects(
622622
continue;
623623
}
624624

625-
// 1.c. check if object is not crossing ego's path
625+
// 1.c. Check if object' lateral velocity is small enough to be avoid.
626626
if (obj_normal_vel > parameters_->max_pedestrians_crossing_vel) {
627627
RCLCPP_INFO_EXPRESSION(
628628
getLogger(), parameters_->enable_debug_info,
@@ -632,20 +632,12 @@ void DynamicAvoidanceModule::registerPrioritizedObjects(
632632
continue;
633633
}
634634

635-
// 1.e. check if object lateral distance to ego's path is small enough
635+
// Blocks for compatibility with existing code
636+
// 1.e. check if object lateral distance to ego's path is small enough
637+
// 1.f. calculate the object is on ego's path or not
638+
636639
const double dist_obj_center_to_path =
637640
std::abs(motion_utils::calcLateralOffset(input_path.points, obj_pose.position));
638-
639-
// constexpr double max_ped_obj_lat_offset_to_ego_path = 30.0;
640-
// if (dist_obj_center_to_path > max_ped_obj_lat_offset_to_ego_path) {
641-
// RCLCPP_INFO_EXPRESSION(
642-
// getLogger(), parameters_->enable_debug_info,
643-
// "[DynamicAvoidance] Ignore obstacle (%s) since lateral distance (%7.3f) is large.",
644-
// obj_uuid.c_str(), dist_obj_center_to_path);
645-
// continue;
646-
// }
647-
648-
// 1.f. calculate the object is on ego's path or not
649641
const bool is_object_on_ego_path =
650642
dist_obj_center_to_path <
651643
planner_data_->parameters.vehicle_width / 2.0 + parameters_->min_obj_lat_offset_to_ego_path;
@@ -664,6 +656,7 @@ void DynamicAvoidanceModule::registerPrioritizedObjects(
664656
return *prev_object->latest_time_inside_ego_path;
665657
}();
666658

659+
// register the object
667660
const auto target_object = DynamicAvoidanceObject(
668661
predicted_object, obj_tangent_vel, obj_normal_vel, is_object_on_ego_path,
669662
latest_time_inside_ego_path);
@@ -677,7 +670,7 @@ void DynamicAvoidanceModule::determineWhetherToAvoidAgainstRegulatedObjects(
677670
const auto & input_path = getPreviousModuleOutput().path;
678671

679672
for (const auto & object : target_objects_manager_.getValidObjects()) {
680-
if (getLabelAsTargetObstacle(object.label) != ObjectBehaviorType::REGULATED) {
673+
if (getLabelAsTargetObstacle(object.label) != ObjectType::REGULATED) {
681674
continue;
682675
}
683676

@@ -810,7 +803,7 @@ void DynamicAvoidanceModule::determineWhetherToAvoidAgainstRegulatedObjects(
810803
const auto lon_offset_to_avoid = calcMinMaxLongitudinalOffsetToAvoid(
811804
ref_path_points_for_obj_poly, object.pose, obj_points, object.vel, obj_path, object.shape,
812805
time_while_collision);
813-
const auto lat_offset_to_avoid = calcMinMaxLateralOffsetToAvoid(
806+
const auto lat_offset_to_avoid = calcMinMaxLateralOffsetToAvoidRegulatedObject(
814807
ref_path_points_for_obj_poly, obj_points, object.pose.position, object.vel, is_collision_left,
815808
object.lat_vel, prev_object);
816809

@@ -831,30 +824,22 @@ void DynamicAvoidanceModule::determineWhetherToAvoidAgainstRegulatedObjects(
831824
// prev_input_ref_path_points_ = input_ref_path_points;
832825
}
833826

834-
void DynamicAvoidanceModule::determineWhetherToAvoidAgainstPrioritizedObjects(
827+
void DynamicAvoidanceModule::determineWhetherToAvoidAgainstUnregulatedObjects(
835828
const std::vector<DynamicAvoidanceObject> & prev_objects)
836829
{
837830
const auto & input_path = getPreviousModuleOutput().path;
838831

839832
for (const auto & object : target_objects_manager_.getValidObjects()) {
840-
if (getLabelAsTargetObstacle(object.label) != ObjectBehaviorType::PRIORITIZED) {
833+
if (getLabelAsTargetObstacle(object.label) != ObjectType::UNREGULATED) {
841834
continue;
842835
}
843836

844837
const auto obj_uuid = object.uuid;
845-
const auto prev_object = getObstacleFromUuid(prev_objects, obj_uuid);
846-
const auto obj_path = *std::max_element(
847-
object.predicted_paths.begin(), object.predicted_paths.end(),
848-
[](const PredictedPath & a, const PredictedPath & b) { return a.confidence < b.confidence; });
849-
850838
const auto & ref_path_points_for_obj_poly = input_path.points;
851839

852-
// 2.b. calculate which side object exists against ego's path
853-
const bool is_object_left = isLeft(input_path.points, object.pose.position);
840+
// 2.g. check if the ego is not ahead of the object.
854841
const auto lat_lon_offset =
855842
getLateralLongitudinalOffset(input_path.points, object.pose, object.shape);
856-
857-
// 2.g. check if the ego is not ahead of the object.
858843
const double signed_dist_ego_to_obj = [&]() {
859844
const size_t ego_seg_idx = planner_data_->findEgoSegmentIndex(input_path.points);
860845
const double lon_offset_ego_to_obj = motion_utils::calcSignedArcLength(
@@ -879,8 +864,8 @@ void DynamicAvoidanceModule::determineWhetherToAvoidAgainstPrioritizedObjects(
879864

880865
// 2.h. calculate longitudinal and lateral offset to avoid to generate object polygon by
881866
// "ego_path_base"
882-
const auto lat_offset_to_avoid = calcMinMaxLateralOffsetAgainstPrioritizedObject(
883-
ref_path_points_for_obj_poly, prev_object, object);
867+
const auto lat_offset_to_avoid = calcMinMaxLateralOffsetToAvoidUnregulatedObject(
868+
ref_path_points_for_obj_poly, getObstacleFromUuid(prev_objects, obj_uuid), object);
884869
if (!lat_offset_to_avoid) {
885870
RCLCPP_INFO_EXPRESSION(
886871
getLogger(), parameters_->enable_debug_info,
@@ -1409,7 +1394,7 @@ double DynamicAvoidanceModule::calcValidLengthToAvoid(
14091394
}
14101395

14111396
// min value denotes near side, max value denotes far side
1412-
std::optional<MinMaxValue> DynamicAvoidanceModule::calcMinMaxLateralOffsetToAvoid(
1397+
std::optional<MinMaxValue> DynamicAvoidanceModule::calcMinMaxLateralOffsetToAvoidRegulatedObject(
14131398
const std::vector<PathPointWithLaneId> & ref_path_points_for_obj_poly,
14141399
const Polygon2d & obj_points, const geometry_msgs::msg::Point & obj_pos, const double obj_vel,
14151400
const bool is_collision_left, const double obj_normal_vel,
@@ -1503,7 +1488,7 @@ std::optional<MinMaxValue> DynamicAvoidanceModule::calcMinMaxLateralOffsetToAvoi
15031488
}
15041489

15051490
// min value denotes near side, max value denotes far side
1506-
std::optional<MinMaxValue> DynamicAvoidanceModule::calcMinMaxLateralOffsetAgainstPrioritizedObject(
1491+
std::optional<MinMaxValue> DynamicAvoidanceModule::calcMinMaxLateralOffsetToAvoidUnregulatedObject(
15071492
const std::vector<PathPointWithLaneId> & ref_path_points_for_obj_poly,
15081493
const std::optional<DynamicAvoidanceObject> & prev_object,
15091494
const DynamicAvoidanceObject & object) const
@@ -1691,6 +1676,7 @@ DynamicAvoidanceModule::calcEgoPathBasedDynamicObstaclePolygon(
16911676
return obj_poly;
16921677
}
16931678

1679+
// TODO (takagi): replace by another function?
16941680
std::optional<tier4_autoware_utils::Polygon2d>
16951681
DynamicAvoidanceModule::calcObjectPathBasedDynamicObstaclePolygon(
16961682
const DynamicAvoidanceObject & object) const
@@ -1747,8 +1733,11 @@ DynamicAvoidanceModule::calcObjectPathBasedDynamicObstaclePolygon(
17471733
return obj_poly;
17481734
}
17491735

1736+
// Calculate polygons according to predicted_path with certain confidence,
1737+
// except for the area required for ego safety.
1738+
// input: an object, the minimum area required for ego safety, and some global params
17501739
std::optional<tier4_autoware_utils::Polygon2d>
1751-
DynamicAvoidanceModule::calcPrioritizedObstacleAvoidPolygon(
1740+
DynamicAvoidanceModule::calcPredictedPathBasedDynamicObstaclePolygon(
17521741
const DynamicAvoidanceObject & object, const EgoPathReservePoly & ego_path_poly) const
17531742
{
17541743
std::vector<geometry_msgs::msg::Pose> candidate_poses;
@@ -1763,19 +1752,13 @@ DynamicAvoidanceModule::calcPrioritizedObstacleAvoidPolygon(
17631752
}
17641753
}
17651754

1766-
constexpr double deviation_scale = 0.0; // for experimental
1767-
namespace cov_idx = tier4_autoware_utils::xyzrpy_covariance_index;
1768-
const double obj_half_length =
1769-
object.shape.dimensions.x * 0.5 + object.pose_covariance_sqrt[cov_idx::X_X] * deviation_scale;
1770-
const double obj_half_width =
1771-
object.shape.dimensions.y * 0.5 + object.pose_covariance_sqrt[cov_idx::Y_Y] * deviation_scale;
1772-
17731755
tier4_autoware_utils::Polygon2d obj_points_as_poly;
17741756
for (const auto pose : candidate_poses) {
17751757
boost::geometry::append(
1776-
obj_points_as_poly,
1777-
tier4_autoware_utils::toFootprint(pose, obj_half_length, obj_half_length, obj_half_width)
1778-
.outer());
1758+
obj_points_as_poly, tier4_autoware_utils::toFootprint(
1759+
pose, object.shape.dimensions.x * 0.5, object.shape.dimensions.x * 0.5,
1760+
object.shape.dimensions.y * 0.5)
1761+
.outer());
17791762
}
17801763
boost::geometry::correct(obj_points_as_poly);
17811764
Polygon2d obj_poly;
@@ -1812,6 +1795,9 @@ DynamicAvoidanceModule::calcPrioritizedObstacleAvoidPolygon(
18121795
return output_poly[0];
18131796
}
18141797

1798+
// Calculate the driving area required to ensure the safety of the own vehicle.
1799+
// It is assumed that this area will not be clipped.
1800+
// input: ego's reference path, ego's pose, ego's speed, and some global params
18151801
DynamicAvoidanceModule::EgoPathReservePoly DynamicAvoidanceModule::calcEgoPathPreservePoly(
18161802
const PathWithLaneId & ego_path) const
18171803
{

0 commit comments

Comments
 (0)