@@ -720,7 +720,10 @@ MapBasedPredictionNode::MapBasedPredictionNode(const rclcpp::NodeOptions & node_
720
720
google::InstallFailureSignalHandler ();
721
721
}
722
722
enable_delay_compensation_ = declare_parameter<bool >(" enable_delay_compensation" );
723
- prediction_time_horizon_ = declare_parameter<double >(" prediction_time_horizon" );
723
+ prediction_time_horizon_.vehicle = declare_parameter<double >(" prediction_time_horizon.vehicle" );
724
+ prediction_time_horizon_.pedestrian =
725
+ declare_parameter<double >(" prediction_time_horizon.pedestrian" );
726
+ prediction_time_horizon_.unknown = declare_parameter<double >(" prediction_time_horizon.unknown" );
724
727
lateral_control_time_horizon_ =
725
728
declare_parameter<double >(" lateral_control_time_horizon" ); // [s] for lateral control point
726
729
prediction_sampling_time_interval_ = declare_parameter<double >(" prediction_sampling_delta_time" );
@@ -791,8 +794,7 @@ MapBasedPredictionNode::MapBasedPredictionNode(const rclcpp::NodeOptions & node_
791
794
" crosswalk_with_signal.timeout_set_for_no_intention_to_walk" );
792
795
793
796
path_generator_ = std::make_shared<PathGenerator>(
794
- prediction_time_horizon_, lateral_control_time_horizon_, prediction_sampling_time_interval_,
795
- min_crosswalk_user_velocity_);
797
+ prediction_sampling_time_interval_, min_crosswalk_user_velocity_);
796
798
797
799
path_generator_->setUseVehicleAcceleration (use_vehicle_acceleration_);
798
800
path_generator_->setAccelerationHalfLife (acceleration_exponential_half_life_);
@@ -969,8 +971,8 @@ void MapBasedPredictionNode::objectsCallback(const TrackedObjects::ConstSharedPt
969
971
970
972
// For off lane obstacles
971
973
if (current_lanelets.empty ()) {
972
- PredictedPath predicted_path =
973
- path_generator_-> generatePathForOffLaneVehicle ( transformed_object);
974
+ PredictedPath predicted_path = path_generator_-> generatePathForOffLaneVehicle (
975
+ transformed_object, prediction_time_horizon_. vehicle );
974
976
predicted_path.confidence = 1.0 ;
975
977
if (predicted_path.path .empty ()) break ;
976
978
@@ -985,8 +987,8 @@ void MapBasedPredictionNode::objectsCallback(const TrackedObjects::ConstSharedPt
985
987
transformed_object.kinematics .twist_with_covariance .twist .linear .x ,
986
988
transformed_object.kinematics .twist_with_covariance .twist .linear .y );
987
989
if (std::fabs (abs_obj_speed) < min_velocity_for_map_based_prediction_) {
988
- PredictedPath predicted_path =
989
- path_generator_-> generatePathForLowSpeedVehicle ( transformed_object);
990
+ PredictedPath predicted_path = path_generator_-> generatePathForLowSpeedVehicle (
991
+ transformed_object, prediction_time_horizon_. vehicle );
990
992
predicted_path.confidence = 1.0 ;
991
993
if (predicted_path.path .empty ()) break ;
992
994
@@ -998,13 +1000,14 @@ void MapBasedPredictionNode::objectsCallback(const TrackedObjects::ConstSharedPt
998
1000
999
1001
// Get Predicted Reference Path for Each Maneuver and current lanelets
1000
1002
// return: <probability, paths>
1001
- const auto ref_paths =
1002
- getPredictedReferencePath (transformed_object, current_lanelets, objects_detected_time);
1003
+ const auto ref_paths = getPredictedReferencePath (
1004
+ transformed_object, current_lanelets, objects_detected_time,
1005
+ prediction_time_horizon_.vehicle );
1003
1006
1004
1007
// If predicted reference path is empty, assume this object is out of the lane
1005
1008
if (ref_paths.empty ()) {
1006
- PredictedPath predicted_path =
1007
- path_generator_-> generatePathForLowSpeedVehicle ( transformed_object);
1009
+ PredictedPath predicted_path = path_generator_-> generatePathForLowSpeedVehicle (
1010
+ transformed_object, prediction_time_horizon_. vehicle );
1008
1011
predicted_path.confidence = 1.0 ;
1009
1012
if (predicted_path.path .empty ()) break ;
1010
1013
@@ -1039,7 +1042,8 @@ void MapBasedPredictionNode::objectsCallback(const TrackedObjects::ConstSharedPt
1039
1042
1040
1043
for (const auto & ref_path : ref_paths) {
1041
1044
PredictedPath predicted_path = path_generator_->generatePathForOnLaneVehicle (
1042
- yaw_fixed_transformed_object, ref_path.path , ref_path.speed_limit );
1045
+ yaw_fixed_transformed_object, ref_path.path , prediction_time_horizon_.vehicle ,
1046
+ lateral_control_time_horizon_, ref_path.speed_limit );
1043
1047
if (predicted_path.path .empty ()) continue ;
1044
1048
1045
1049
if (!check_lateral_acceleration_constraints_) {
@@ -1102,8 +1106,8 @@ void MapBasedPredictionNode::objectsCallback(const TrackedObjects::ConstSharedPt
1102
1106
}
1103
1107
default : {
1104
1108
auto predicted_unknown_object = convertToPredictedObject (transformed_object);
1105
- PredictedPath predicted_path =
1106
- path_generator_-> generatePathForNonVehicleObject ( transformed_object);
1109
+ PredictedPath predicted_path = path_generator_-> generatePathForNonVehicleObject (
1110
+ transformed_object, prediction_time_horizon_. unknown );
1107
1111
predicted_path.confidence = 1.0 ;
1108
1112
1109
1113
predicted_unknown_object.kinematics .predicted_paths .push_back (predicted_path);
@@ -1170,7 +1174,8 @@ PredictedObject MapBasedPredictionNode::getPredictedObjectAsCrosswalkUser(
1170
1174
{
1171
1175
auto predicted_object = convertToPredictedObject (object);
1172
1176
{
1173
- PredictedPath predicted_path = path_generator_->generatePathForNonVehicleObject (object);
1177
+ PredictedPath predicted_path =
1178
+ path_generator_->generatePathForNonVehicleObject (object, prediction_time_horizon_.pedestrian );
1174
1179
predicted_path.confidence = 1.0 ;
1175
1180
1176
1181
predicted_object.kinematics .predicted_paths .push_back (predicted_path);
@@ -1221,7 +1226,7 @@ PredictedObject MapBasedPredictionNode::getPredictedObjectAsCrosswalkUser(
1221
1226
1222
1227
if (hasPotentialToReach (
1223
1228
object, edge_points.front_center_point , edge_points.front_right_point ,
1224
- edge_points.front_left_point , prediction_time_horizon_ * 2.0 ,
1229
+ edge_points.front_left_point , prediction_time_horizon_. pedestrian * 2.0 ,
1225
1230
min_crosswalk_user_velocity_, max_crosswalk_user_delta_yaw_threshold_for_lanelet_)) {
1226
1231
PredictedPath predicted_path =
1227
1232
path_generator_->generatePathToTargetPoint (object, edge_points.front_center_point );
@@ -1231,7 +1236,7 @@ PredictedObject MapBasedPredictionNode::getPredictedObjectAsCrosswalkUser(
1231
1236
1232
1237
if (hasPotentialToReach (
1233
1238
object, edge_points.back_center_point , edge_points.back_right_point ,
1234
- edge_points.back_left_point , prediction_time_horizon_ * 2.0 ,
1239
+ edge_points.back_left_point , prediction_time_horizon_. pedestrian * 2.0 ,
1235
1240
min_crosswalk_user_velocity_, max_crosswalk_user_delta_yaw_threshold_for_lanelet_)) {
1236
1241
PredictedPath predicted_path =
1237
1242
path_generator_->generatePathToTargetPoint (object, edge_points.back_center_point );
@@ -1255,27 +1260,27 @@ PredictedObject MapBasedPredictionNode::getPredictedObjectAsCrosswalkUser(
1255
1260
1256
1261
const auto reachable_first = hasPotentialToReach (
1257
1262
object, edge_points.front_center_point , edge_points.front_right_point ,
1258
- edge_points.front_left_point , prediction_time_horizon_, min_crosswalk_user_velocity_ ,
1259
- max_crosswalk_user_delta_yaw_threshold_for_lanelet_);
1263
+ edge_points.front_left_point , prediction_time_horizon_. pedestrian ,
1264
+ min_crosswalk_user_velocity_, max_crosswalk_user_delta_yaw_threshold_for_lanelet_);
1260
1265
const auto reachable_second = hasPotentialToReach (
1261
1266
object, edge_points.back_center_point , edge_points.back_right_point ,
1262
- edge_points.back_left_point , prediction_time_horizon_, min_crosswalk_user_velocity_ ,
1263
- max_crosswalk_user_delta_yaw_threshold_for_lanelet_);
1267
+ edge_points.back_left_point , prediction_time_horizon_. pedestrian ,
1268
+ min_crosswalk_user_velocity_, max_crosswalk_user_delta_yaw_threshold_for_lanelet_);
1264
1269
1265
1270
if (!reachable_first && !reachable_second) {
1266
1271
continue ;
1267
1272
}
1268
1273
1269
1274
const auto reachable_crosswalk = isReachableCrosswalkEdgePoints (
1270
- object, crosswalk, edge_points, lanelet_map_ptr_, prediction_time_horizon_,
1275
+ object, crosswalk, edge_points, lanelet_map_ptr_, prediction_time_horizon_. pedestrian ,
1271
1276
min_crosswalk_user_velocity_);
1272
1277
1273
1278
if (!reachable_crosswalk) {
1274
1279
continue ;
1275
1280
}
1276
1281
1277
- PredictedPath predicted_path =
1278
- path_generator_-> generatePathForCrosswalkUser ( object, reachable_crosswalk.get ());
1282
+ PredictedPath predicted_path = path_generator_-> generatePathForCrosswalkUser (
1283
+ object, reachable_crosswalk.get (), prediction_time_horizon_. pedestrian );
1279
1284
predicted_path.confidence = 1.0 ;
1280
1285
1281
1286
if (predicted_path.path .empty ()) {
@@ -1613,7 +1618,7 @@ void MapBasedPredictionNode::updateObjectsHistory(
1613
1618
1614
1619
std::vector<PredictedRefPath> MapBasedPredictionNode::getPredictedReferencePath (
1615
1620
const TrackedObject & object, const LaneletsData & current_lanelets_data,
1616
- const double object_detected_time)
1621
+ const double object_detected_time, const double time_horizon )
1617
1622
{
1618
1623
const double obj_vel = std::hypot (
1619
1624
object.kinematics .twist_with_covariance .twist .linear .x ,
@@ -1625,7 +1630,7 @@ std::vector<PredictedRefPath> MapBasedPredictionNode::getPredictedReferencePath(
1625
1630
object.kinematics .acceleration_with_covariance .accel .linear .x ,
1626
1631
object.kinematics .acceleration_with_covariance .accel .linear .y )
1627
1632
: 0.0 ;
1628
- const double t_h = prediction_time_horizon_ ;
1633
+ const double t_h = time_horizon ;
1629
1634
const double λ = std::log (2 ) / acceleration_exponential_half_life_;
1630
1635
1631
1636
auto get_search_distance_with_decaying_acc = [&]() -> double {
0 commit comments