Skip to content

Commit 0dae23f

Browse files
authored
feat(dynamic_avoidance): consider shifting objects (#4545)
Signed-off-by: Takayuki Murooka <takayuki5168@gmail.com>
1 parent 9ad6493 commit 0dae23f

File tree

2 files changed

+16
-18
lines changed

2 files changed

+16
-18
lines changed

planning/behavior_path_planner/include/behavior_path_planner/scene_module/dynamic_avoidance/dynamic_avoidance_module.hpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -318,7 +318,7 @@ class DynamicAvoidanceModule : public SceneModuleInterface
318318
const double time_to_collision) const;
319319
MinMaxValue calcMinMaxLateralOffsetToAvoid(
320320
const std::vector<PathPointWithLaneId> & path_points_for_object_polygon,
321-
const Polygon2d & obj_points, const bool is_collision_left,
321+
const Polygon2d & obj_points, const bool is_collision_left, const double obj_normal_vel,
322322
const std::optional<DynamicAvoidanceObject> & prev_object) const;
323323

324324
std::pair<lanelet::ConstLanelets, lanelet::ConstLanelets> getAdjacentLanes(

planning/behavior_path_planner/src/scene_module/dynamic_avoidance/dynamic_avoidance_module.cpp

+15-17
Original file line numberDiff line numberDiff line change
@@ -502,7 +502,7 @@ void DynamicAvoidanceModule::updateTargetObjects()
502502
const auto lon_offset_to_avoid = calcMinMaxLongitudinalOffsetToAvoid(
503503
*path_points_for_object_polygon, object.pose, obj_points, object.vel, time_to_collision);
504504
const auto lat_offset_to_avoid = calcMinMaxLateralOffsetToAvoid(
505-
*path_points_for_object_polygon, obj_points, is_collision_left, prev_object);
505+
*path_points_for_object_polygon, obj_points, is_collision_left, object.lat_vel, prev_object);
506506

507507
const bool should_be_avoided = true;
508508
target_objects_manager_.updateObject(
@@ -782,7 +782,7 @@ MinMaxValue DynamicAvoidanceModule::calcMinMaxLongitudinalOffsetToAvoid(
782782

783783
MinMaxValue DynamicAvoidanceModule::calcMinMaxLateralOffsetToAvoid(
784784
const std::vector<PathPointWithLaneId> & path_points_for_object_polygon,
785-
const Polygon2d & obj_points, const bool is_collision_left,
785+
const Polygon2d & obj_points, const bool is_collision_left, const double obj_normal_vel,
786786
const std::optional<DynamicAvoidanceObject> & prev_object) const
787787
{
788788
// calculate min/max lateral offset from object to path
@@ -798,28 +798,25 @@ MinMaxValue DynamicAvoidanceModule::calcMinMaxLateralOffsetToAvoid(
798798
}
799799
return getMinMaxValues(obj_lat_abs_offset_vec);
800800
}();
801-
const double min_obj_lat_offset = obj_lat_abs_offset.min_value * (is_collision_left ? 1.0 : -1.0);
802-
const double max_obj_lat_offset = obj_lat_abs_offset.max_value * (is_collision_left ? 1.0 : -1.0);
801+
const double min_obj_lat_abs_offset = obj_lat_abs_offset.min_value;
802+
const double max_obj_lat_abs_offset = obj_lat_abs_offset.max_value;
803803

804804
// calculate bound min and max lateral offset
805805
const double min_bound_lat_offset = [&]() {
806+
constexpr double object_time_to_shift = 2.0;
807+
const double lat_abs_offset_to_shift =
808+
std::max(0.0, obj_normal_vel * (is_collision_left ? -1.0 : 1.0)) *
809+
object_time_to_shift; // TODO(murooka) use rosparam
806810
const double raw_min_bound_lat_offset =
807-
min_obj_lat_offset - parameters_->lat_offset_from_obstacle * (is_collision_left ? 1.0 : -1.0);
811+
min_obj_lat_abs_offset - parameters_->lat_offset_from_obstacle - lat_abs_offset_to_shift;
808812
const double min_bound_lat_abs_offset_limit =
809813
planner_data_->parameters.vehicle_width / 2.0 - parameters_->max_lat_offset_to_avoid;
810-
if (is_collision_left) {
811-
if (raw_min_bound_lat_offset < min_bound_lat_abs_offset_limit) {
812-
return min_bound_lat_abs_offset_limit;
813-
}
814-
} else {
815-
if (-min_bound_lat_abs_offset_limit < raw_min_bound_lat_offset) {
816-
return -min_bound_lat_abs_offset_limit;
817-
}
818-
}
819-
return raw_min_bound_lat_offset;
814+
return std::max(raw_min_bound_lat_offset, min_bound_lat_abs_offset_limit) *
815+
(is_collision_left ? 1.0 : -1.0);
820816
}();
821817
const double max_bound_lat_offset =
822-
max_obj_lat_offset + parameters_->lat_offset_from_obstacle * (is_collision_left ? 1.0 : -1.0);
818+
(max_obj_lat_abs_offset + parameters_->lat_offset_from_obstacle) *
819+
(is_collision_left ? 1.0 : -1.0);
823820

824821
// filter min_bound_lat_offset
825822
const auto prev_min_lat_avoid_to_offset = [&]() -> std::optional<double> {
@@ -830,7 +827,8 @@ MinMaxValue DynamicAvoidanceModule::calcMinMaxLateralOffsetToAvoid(
830827
}();
831828
const double filtered_min_bound_lat_offset =
832829
prev_min_lat_avoid_to_offset
833-
? signal_processing::lowpassFilter(min_bound_lat_offset, *prev_min_lat_avoid_to_offset, 0.3)
830+
? signal_processing::lowpassFilter(
831+
min_bound_lat_offset, *prev_min_lat_avoid_to_offset, 0.5) // TODO(murooka) use rosparam
834832
: min_bound_lat_offset;
835833

836834
return MinMaxValue{filtered_min_bound_lat_offset, max_bound_lat_offset};

0 commit comments

Comments
 (0)