@@ -94,15 +94,47 @@ std::vector<lanelet::BasicPolygon2d> calculate_detection_areas(
94
94
return detection_areas;
95
95
}
96
96
97
+ void clear_behind_objects (
98
+ grid_map::GridMap & grid_map,
99
+ const std::vector<autoware_auto_perception_msgs::msg::PredictedObject> & objects,
100
+ const double min_object_velocity)
101
+ {
102
+ const lanelet::BasicPoint2d grid_map_position = grid_map.getPosition ();
103
+ const auto range = grid_map.getLength ().maxCoeff () / 2.0 ;
104
+ for (const auto & object : objects) {
105
+ const lanelet::BasicPoint2d object_position = {
106
+ object.kinematics .initial_pose_with_covariance .pose .position .x ,
107
+ object.kinematics .initial_pose_with_covariance .pose .position .y };
108
+ if (
109
+ object.kinematics .initial_twist_with_covariance .twist .linear .x >= min_object_velocity &&
110
+ lanelet::geometry::distance2d (grid_map_position, object_position) < range) {
111
+ lanelet::BasicPoints2d points;
112
+ for (const auto & edge_point : tier4_autoware_utils::toPolygon2d (object).outer ())
113
+ points.push_back (edge_point);
114
+ for (const auto & edge_point : tier4_autoware_utils::toPolygon2d (object).outer ())
115
+ points.push_back (interpolate_point ({object_position, edge_point}, range));
116
+ lanelet::BasicPolygon2d polygon_behind_object;
117
+ boost::geometry::convex_hull (points, polygon_behind_object);
118
+ grid_map::Polygon polygon_to_clear;
119
+ for (const auto & p : polygon_behind_object) polygon_to_clear.addVertex (p);
120
+ for (grid_map_utils::PolygonIterator it (grid_map, polygon_to_clear); !it.isPastEnd (); ++it)
121
+ grid_map.at (" layer" , *it) = 0 ;
122
+ }
123
+ }
124
+ }
125
+
97
126
bool is_crosswalk_occluded (
98
127
const lanelet::ConstLanelet & crosswalk_lanelet,
99
128
const nav_msgs::msg::OccupancyGrid & occupancy_grid,
100
129
const geometry_msgs::msg::Point & path_intersection, const double detection_range,
130
+ const std::vector<autoware_auto_perception_msgs::msg::PredictedObject> & dynamic_objects,
101
131
const behavior_velocity_planner::CrosswalkModule::PlannerParam & params)
102
132
{
103
133
grid_map::GridMap grid_map;
104
134
grid_map::GridMapRosConverter::fromOccupancyGrid (occupancy_grid, " layer" , grid_map);
105
135
136
+ if (params.occlusion_ignore_behind_predicted_objects )
137
+ clear_behind_objects (grid_map, dynamic_objects, params.occlusion_min_objects_velocity );
106
138
const auto min_nb_of_cells = std::ceil (params.occlusion_min_size / grid_map.getResolution ());
107
139
for (const auto & detection_area : calculate_detection_areas (
108
140
crosswalk_lanelet, {path_intersection.x , path_intersection.y }, detection_range)) {
@@ -115,11 +147,12 @@ bool is_crosswalk_occluded(
115
147
}
116
148
117
149
double calculate_detection_range (
118
- const double object_velocity, const double dist_ego_to_crosswalk, const double ego_velocity)
150
+ const double occluded_object_velocity, const double dist_ego_to_crosswalk,
151
+ const double ego_velocity)
119
152
{
120
153
constexpr double min_ego_velocity = 1.0 ;
121
154
const auto time_to_crosswalk = dist_ego_to_crosswalk / std::max (min_ego_velocity, ego_velocity);
122
- return time_to_crosswalk > 0.0 ? time_to_crosswalk / object_velocity : 20.0 ;
155
+ return time_to_crosswalk > 0.0 ? time_to_crosswalk / occluded_object_velocity : 20.0 ;
123
156
}
124
157
125
158
void update_occlusion_timers (
0 commit comments