@@ -887,7 +887,9 @@ LaneChangeLanesFilteredObjects NormalLaneChange::filterObjects(
887
887
return {};
888
888
}
889
889
890
- filterObjectsAheadTerminal (objects, current_lanes);
890
+ filterOncomingObjects (objects);
891
+
892
+ filterAheadTerminalObjects (objects, current_lanes);
891
893
892
894
std::vector<PredictedObject> target_lane_objects;
893
895
std::vector<PredictedObject> current_lane_objects;
@@ -915,24 +917,19 @@ LaneChangeLanesFilteredObjects NormalLaneChange::filterObjects(
915
917
return max_dist_ego_to_obj >= 0.0 ;
916
918
};
917
919
918
- const auto is_same_direction = [&](const PredictedObject & object) {
919
- const auto & object_pose = object.kinematics .initial_pose_with_covariance .pose ;
920
- return !utils::path_safety_checker::isTargetObjectOncoming (current_pose, object_pose);
921
- };
922
-
923
920
utils::path_safety_checker::filterObjects (
924
921
target_lane_objects, [&](const PredictedObject & object) {
925
- return is_same_direction (object) && (is_within_vel_th (object) || is_ahead_of_ego (object));
922
+ return (is_within_vel_th (object) || is_ahead_of_ego (object));
926
923
});
927
924
928
925
utils::path_safety_checker::filterObjects (
929
926
other_lane_objects, [&](const PredictedObject & object) {
930
- return is_within_vel_th (object) && is_same_direction (object) && is_ahead_of_ego (object);
927
+ return is_within_vel_th (object) && is_ahead_of_ego (object);
931
928
});
932
929
933
930
utils::path_safety_checker::filterObjects (
934
931
current_lane_objects, [&](const PredictedObject & object) {
935
- return is_within_vel_th (object) && is_same_direction (object) && is_ahead_of_ego (object);
932
+ return is_within_vel_th (object) && is_ahead_of_ego (object);
936
933
});
937
934
938
935
LaneChangeLanesFilteredObjects lane_change_target_objects;
@@ -961,7 +958,34 @@ LaneChangeLanesFilteredObjects NormalLaneChange::filterObjects(
961
958
return lane_change_target_objects;
962
959
}
963
960
964
- void NormalLaneChange::filterObjectsAheadTerminal (
961
+ void NormalLaneChange::filterOncomingObjects (PredictedObjects & objects) const
962
+ {
963
+ const auto & current_pose = getEgoPose ();
964
+
965
+ const auto is_same_direction = [&](const PredictedObject & object) {
966
+ const auto & object_pose = object.kinematics .initial_pose_with_covariance .pose ;
967
+ return !utils::path_safety_checker::isTargetObjectOncoming (current_pose, object_pose);
968
+ };
969
+
970
+ // Perception noise could make stationary objects seem opposite the ego vehicle; check the
971
+ // velocity to prevent this.
972
+ const auto is_stopped_object = [](const auto & object) -> bool {
973
+ constexpr double min_vel_th = -0.5 ;
974
+ constexpr double max_vel_th = 0.5 ;
975
+ return utils::path_safety_checker::filter::velocity_filter (object, min_vel_th, max_vel_th);
976
+ };
977
+
978
+ utils::path_safety_checker::filterObjects (objects, [&](const PredictedObject & object) {
979
+ const auto same_direction = is_same_direction (object);
980
+ if (same_direction) {
981
+ return true ;
982
+ }
983
+
984
+ return is_stopped_object (object);
985
+ });
986
+ }
987
+
988
+ void NormalLaneChange::filterAheadTerminalObjects (
965
989
PredictedObjects & objects, const lanelet::ConstLanelets & current_lanes) const
966
990
{
967
991
const auto & current_pose = getEgoPose ();
0 commit comments