|
@@ -191,10 +191,13 @@ MpcLateralController::MpcLateralController()
|
|
|
m_mpc.m_steer_lim = vehicle_info.max_steer_angle_rad;
|
|
|
|
|
|
// steer rate limit depending on curvature
|
|
|
- const auto steer_rate_lim_dps_list_by_curvature =
|
|
|
- node.declare_parameter<std::vector<double>>("steer_rate_lim_dps_list_by_curvature");
|
|
|
- const auto curvature_list_for_steer_rate_lim =
|
|
|
- node.declare_parameter<std::vector<double>>("curvature_list_for_steer_rate_lim");
|
|
|
+
|
|
|
+ std::vector<double> steer_rate_lim_dps_list_by_curvature;
|
|
|
+ std::vector<double> curvature_list_for_steer_rate_lim;
|
|
|
+// const auto steer_rate_lim_dps_list_by_curvature =
|
|
|
+// node.declare_parameter<std::vector<double>>("steer_rate_lim_dps_list_by_curvature");
|
|
|
+// const auto curvature_list_for_steer_rate_lim =
|
|
|
+// node.declare_parameter<std::vector<double>>("curvature_list_for_steer_rate_lim");
|
|
|
for (size_t i = 0; i < steer_rate_lim_dps_list_by_curvature.size(); ++i) {
|
|
|
m_mpc.m_steer_rate_lim_map_by_curvature.emplace_back(
|
|
|
curvature_list_for_steer_rate_lim.at(i),
|
|
@@ -202,23 +205,28 @@ MpcLateralController::MpcLateralController()
|
|
|
}
|
|
|
|
|
|
// steer rate limit depending on velocity
|
|
|
- const auto steer_rate_lim_dps_list_by_velocity =
|
|
|
- node.declare_parameter<std::vector<double>>("steer_rate_lim_dps_list_by_velocity");
|
|
|
- const auto velocity_list_for_steer_rate_lim =
|
|
|
- node.declare_parameter<std::vector<double>>("velocity_list_for_steer_rate_lim");
|
|
|
+ std::vector<double> steer_rate_lim_dps_list_by_velocity;
|
|
|
+ std::vector<double> velocity_list_for_steer_rate_lim;
|
|
|
+// const auto steer_rate_lim_dps_list_by_velocity =
|
|
|
+// node.declare_parameter<std::vector<double>>("steer_rate_lim_dps_list_by_velocity");
|
|
|
+// const auto velocity_list_for_steer_rate_lim =
|
|
|
+// node.declare_parameter<std::vector<double>>("velocity_list_for_steer_rate_lim");
|
|
|
for (size_t i = 0; i < steer_rate_lim_dps_list_by_velocity.size(); ++i) {
|
|
|
m_mpc.m_steer_rate_lim_map_by_velocity.emplace_back(
|
|
|
velocity_list_for_steer_rate_lim.at(i), steer_rate_lim_dps_list_by_velocity.at(i) * deg2rad);
|
|
|
}
|
|
|
|
|
|
/* vehicle model setup */
|
|
|
+// auto vehicle_model_ptr =
|
|
|
+// createVehicleModel(wheelbase, m_mpc.m_steer_lim, m_mpc.m_param.steer_tau, node);
|
|
|
auto vehicle_model_ptr =
|
|
|
- createVehicleModel(wheelbase, m_mpc.m_steer_lim, m_mpc.m_param.steer_tau, node);
|
|
|
+ createVehicleModel(wheelbase, m_mpc.m_steer_lim, m_mpc.m_param.steer_tau, xp);
|
|
|
m_mpc.setVehicleModel(vehicle_model_ptr);
|
|
|
|
|
|
/* QP solver setup */
|
|
|
m_mpc.setVehicleModel(vehicle_model_ptr);
|
|
|
- auto qpsolver_ptr = createQPSolverInterface(node);
|
|
|
+// auto qpsolver_ptr = createQPSolverInterface(node);
|
|
|
+ auto qpsolver_ptr = createQPSolverInterface(xp);
|
|
|
m_mpc.setQPSolver(qpsolver_ptr);
|
|
|
|
|
|
/* delay compensation */
|
|
@@ -232,7 +240,8 @@ MpcLateralController::MpcLateralController()
|
|
|
/* steering offset compensation */
|
|
|
enable_auto_steering_offset_removal_ =
|
|
|
dp_bool("steering_offset.enable_auto_steering_offset_removal");
|
|
|
- steering_offset_ = createSteerOffsetEstimator(wheelbase, node);
|
|
|
+// steering_offset_ = createSteerOffsetEstimator(wheelbase, node);
|
|
|
+ steering_offset_ = createSteerOffsetEstimator(wheelbase, xp);
|
|
|
|
|
|
/* initialize low-pass filter */
|
|
|
{
|
|
@@ -242,42 +251,81 @@ MpcLateralController::MpcLateralController()
|
|
|
}
|
|
|
|
|
|
// ego nearest index search
|
|
|
+// const auto check_and_get_param = [&](const auto & param) {
|
|
|
+// return node.has_parameter(param) ? node.get_parameter(param).as_double() : dp_double(param);
|
|
|
+// };
|
|
|
const auto check_and_get_param = [&](const auto & param) {
|
|
|
- return node.has_parameter(param) ? node.get_parameter(param).as_double() : dp_double(param);
|
|
|
+ return xp.GetParam(param,0.0);
|
|
|
};
|
|
|
m_ego_nearest_dist_threshold = check_and_get_param("ego_nearest_dist_threshold");
|
|
|
m_ego_nearest_yaw_threshold = check_and_get_param("ego_nearest_yaw_threshold");
|
|
|
m_mpc.ego_nearest_dist_threshold = m_ego_nearest_dist_threshold;
|
|
|
m_mpc.ego_nearest_yaw_threshold = m_ego_nearest_yaw_threshold;
|
|
|
|
|
|
- m_pub_predicted_traj = node.create_publisher<Trajectory>("~/output/predicted_trajectory", 1);
|
|
|
- m_pub_debug_values =
|
|
|
- node.create_publisher<Float32MultiArrayStamped>("~/output/lateral_diagnostic", 1);
|
|
|
- m_pub_steer_offset = node.create_publisher<Float32Stamped>("~/output/estimated_steer_offset", 1);
|
|
|
+// m_pub_predicted_traj = node.create_publisher<Trajectory>("~/output/predicted_trajectory", 1);
|
|
|
+// m_pub_debug_values =
|
|
|
+// node.create_publisher<Float32MultiArrayStamped>("~/output/lateral_diagnostic", 1);
|
|
|
+// m_pub_steer_offset = node.create_publisher<Float32Stamped>("~/output/estimated_steer_offset", 1);
|
|
|
|
|
|
- declareMPCparameters(node);
|
|
|
+// declareMPCparameters(node);
|
|
|
+ declareMPCparameters(xp);
|
|
|
|
|
|
/* get parameter updates */
|
|
|
- using std::placeholders::_1;
|
|
|
- m_set_param_res =
|
|
|
- node.add_on_set_parameters_callback(std::bind(&MpcLateralController::paramCallback, this, _1));
|
|
|
+// using std::placeholders::_1;
|
|
|
+// m_set_param_res =
|
|
|
+// node.add_on_set_parameters_callback(std::bind(&MpcLateralController::paramCallback, this, _1));
|
|
|
|
|
|
m_mpc.initializeSteeringPredictor();
|
|
|
|
|
|
- m_mpc.setLogger(logger_);
|
|
|
- m_mpc.setClock(clock_);
|
|
|
+// m_mpc.setLogger(logger_);
|
|
|
+// m_mpc.setClock(clock_);
|
|
|
}
|
|
|
|
|
|
MpcLateralController::~MpcLateralController()
|
|
|
{
|
|
|
}
|
|
|
|
|
|
-std::shared_ptr<VehicleModelInterface> MpcLateralController::createVehicleModel(
|
|
|
- const double wheelbase, const double steer_lim, const double steer_tau, rclcpp::Node & node)
|
|
|
+//std::shared_ptr<VehicleModelInterface> MpcLateralController::createVehicleModel(
|
|
|
+// const double wheelbase, const double steer_lim, const double steer_tau, rclcpp::Node & node)
|
|
|
+//{
|
|
|
+// std::shared_ptr<VehicleModelInterface> vehicle_model_ptr;
|
|
|
+
|
|
|
+// const std::string vehicle_model_type = node.declare_parameter<std::string>("vehicle_model_type");
|
|
|
+
|
|
|
+// if (vehicle_model_type == "kinematics") {
|
|
|
+// vehicle_model_ptr = std::make_shared<KinematicsBicycleModel>(wheelbase, steer_lim, steer_tau);
|
|
|
+// return vehicle_model_ptr;
|
|
|
+// }
|
|
|
+
|
|
|
+// if (vehicle_model_type == "kinematics_no_delay") {
|
|
|
+// vehicle_model_ptr = std::make_shared<KinematicsBicycleModelNoDelay>(wheelbase, steer_lim);
|
|
|
+// return vehicle_model_ptr;
|
|
|
+// }
|
|
|
+
|
|
|
+// if (vehicle_model_type == "dynamics") {
|
|
|
+// const double mass_fl = node.declare_parameter<double>("vehicle.mass_fl");
|
|
|
+// const double mass_fr = node.declare_parameter<double>("vehicle.mass_fr");
|
|
|
+// const double mass_rl = node.declare_parameter<double>("vehicle.mass_rl");
|
|
|
+// const double mass_rr = node.declare_parameter<double>("vehicle.mass_rr");
|
|
|
+// const double cf = node.declare_parameter<double>("vehicle.cf");
|
|
|
+// const double cr = node.declare_parameter<double>("vehicle.cr");
|
|
|
+
|
|
|
+// // vehicle_model_ptr is only assigned in ctor, so parameter value have to be passed at init time
|
|
|
+// vehicle_model_ptr =
|
|
|
+// std::make_shared<DynamicsBicycleModel>(wheelbase, mass_fl, mass_fr, mass_rl, mass_rr, cf, cr);
|
|
|
+// return vehicle_model_ptr;
|
|
|
+// }
|
|
|
+
|
|
|
+// RCLCPP_ERROR(logger_, "vehicle_model_type is undefined");
|
|
|
+// return vehicle_model_ptr;
|
|
|
+//}
|
|
|
+
|
|
|
+std::shared_ptr<VehicleModelInterface> MpcLateralController::createVehicleModel(
|
|
|
+ const double wheelbase, const double steer_lim, const double steer_tau, iv::xmlparam::Xmlparam & xp)
|
|
|
{
|
|
|
std::shared_ptr<VehicleModelInterface> vehicle_model_ptr;
|
|
|
|
|
|
- const std::string vehicle_model_type = node.declare_parameter<std::string>("vehicle_model_type");
|
|
|
+ const std::string vehicle_model_type = xp.GetParam("vehicle_model_type","kinematics") ;//node.declare_parameter<std::string>("vehicle_model_type");
|
|
|
|
|
|
if (vehicle_model_type == "kinematics") {
|
|
|
vehicle_model_ptr = std::make_shared<KinematicsBicycleModel>(wheelbase, steer_lim, steer_tau);
|
|
@@ -290,29 +338,58 @@ std::shared_ptr<VehicleModelInterface> MpcLateralController::createVehicleModel(
|
|
|
}
|
|
|
|
|
|
if (vehicle_model_type == "dynamics") {
|
|
|
- const double mass_fl = node.declare_parameter<double>("vehicle.mass_fl");
|
|
|
- const double mass_fr = node.declare_parameter<double>("vehicle.mass_fr");
|
|
|
- const double mass_rl = node.declare_parameter<double>("vehicle.mass_rl");
|
|
|
- const double mass_rr = node.declare_parameter<double>("vehicle.mass_rr");
|
|
|
- const double cf = node.declare_parameter<double>("vehicle.cf");
|
|
|
- const double cr = node.declare_parameter<double>("vehicle.cr");
|
|
|
+// const double mass_fl = node.declare_parameter<double>("vehicle.mass_fl");
|
|
|
+// const double mass_fr = node.declare_parameter<double>("vehicle.mass_fr");
|
|
|
+// const double mass_rl = node.declare_parameter<double>("vehicle.mass_rl");
|
|
|
+// const double mass_rr = node.declare_parameter<double>("vehicle.mass_rr");
|
|
|
+// const double cf = node.declare_parameter<double>("vehicle.cf");
|
|
|
+// const double cr = node.declare_parameter<double>("vehicle.cr");
|
|
|
+
|
|
|
+ const double mass_fl = xp.GetParam("vehicle.mass_fl",0.0);
|
|
|
+ const double mass_fr = xp.GetParam("vehicle.mass_fr",0.0);
|
|
|
+ const double mass_rl = xp.GetParam("vehicle.mass_rl",0.0);
|
|
|
+ const double mass_rr = xp.GetParam("vehicle.mass_rr",0.0);
|
|
|
+ const double cf = xp.GetParam("vehicle.cf",0.0);
|
|
|
+ const double cr = xp.GetParam("vehicle.cr",0.0);
|
|
|
|
|
|
// vehicle_model_ptr is only assigned in ctor, so parameter value have to be passed at init time
|
|
|
vehicle_model_ptr =
|
|
|
- std::make_shared<DynamicsBicycleModel>(wheelbase, mass_fl, mass_fr, mass_rl, mass_rr, cf, cr);
|
|
|
+ std::make_shared<DynamicsBicycleModel>(wheelbase, mass_fl, mass_fr, mass_rl, mass_rr, cf, cr);
|
|
|
return vehicle_model_ptr;
|
|
|
}
|
|
|
|
|
|
- RCLCPP_ERROR(logger_, "vehicle_model_type is undefined");
|
|
|
+ std::cout<<"vehicle_model_type is undefined"<<std::endl;
|
|
|
+ // RCLCPP_ERROR(logger_, "vehicle_model_type is undefined");
|
|
|
return vehicle_model_ptr;
|
|
|
}
|
|
|
|
|
|
+//std::shared_ptr<QPSolverInterface> MpcLateralController::createQPSolverInterface(
|
|
|
+// rclcpp::Node & node)
|
|
|
+//{
|
|
|
+// std::shared_ptr<QPSolverInterface> qpsolver_ptr;
|
|
|
+
|
|
|
+// const std::string qp_solver_type = node.declare_parameter<std::string>("qp_solver_type");
|
|
|
+
|
|
|
+// if (qp_solver_type == "unconstraint_fast") {
|
|
|
+// qpsolver_ptr = std::make_shared<QPSolverEigenLeastSquareLLT>();
|
|
|
+// return qpsolver_ptr;
|
|
|
+// }
|
|
|
+
|
|
|
+// if (qp_solver_type == "osqp") {
|
|
|
+// qpsolver_ptr = std::make_shared<QPSolverOSQP>(logger_);
|
|
|
+// return qpsolver_ptr;
|
|
|
+// }
|
|
|
+
|
|
|
+// RCLCPP_ERROR(logger_, "qp_solver_type is undefined");
|
|
|
+// return qpsolver_ptr;
|
|
|
+//}
|
|
|
+
|
|
|
std::shared_ptr<QPSolverInterface> MpcLateralController::createQPSolverInterface(
|
|
|
- rclcpp::Node & node)
|
|
|
+ iv::xmlparam::Xmlparam & xp)
|
|
|
{
|
|
|
std::shared_ptr<QPSolverInterface> qpsolver_ptr;
|
|
|
|
|
|
- const std::string qp_solver_type = node.declare_parameter<std::string>("qp_solver_type");
|
|
|
+ const std::string qp_solver_type = xp.GetParam("qp_solver_type","") ;//node.declare_parameter<std::string>("qp_solver_type");
|
|
|
|
|
|
if (qp_solver_type == "unconstraint_fast") {
|
|
|
qpsolver_ptr = std::make_shared<QPSolverEigenLeastSquareLLT>();
|
|
@@ -324,20 +401,34 @@ std::shared_ptr<QPSolverInterface> MpcLateralController::createQPSolverInterface
|
|
|
return qpsolver_ptr;
|
|
|
}
|
|
|
|
|
|
- RCLCPP_ERROR(logger_, "qp_solver_type is undefined");
|
|
|
+ std::cout<<"qp_solver_type is undefined"<<std::endl;
|
|
|
+// RCLCPP_ERROR(logger_, "qp_solver_type is undefined");
|
|
|
return qpsolver_ptr;
|
|
|
}
|
|
|
|
|
|
+//std::shared_ptr<SteeringOffsetEstimator> MpcLateralController::createSteerOffsetEstimator(
|
|
|
+// const double wheelbase, rclcpp::Node & node)
|
|
|
+//{
|
|
|
+// const std::string ns = "steering_offset.";
|
|
|
+// const auto vel_thres = node.declare_parameter<double>(ns + "update_vel_threshold");
|
|
|
+// const auto steer_thres = node.declare_parameter<double>(ns + "update_steer_threshold");
|
|
|
+// const auto limit = node.declare_parameter<double>(ns + "steering_offset_limit");
|
|
|
+// const auto num = node.declare_parameter<int>(ns + "average_num");
|
|
|
+// steering_offset_ =
|
|
|
+// std::make_shared<SteeringOffsetEstimator>(wheelbase, num, vel_thres, steer_thres, limit);
|
|
|
+// return steering_offset_;
|
|
|
+//}
|
|
|
+
|
|
|
std::shared_ptr<SteeringOffsetEstimator> MpcLateralController::createSteerOffsetEstimator(
|
|
|
- const double wheelbase, rclcpp::Node & node)
|
|
|
+ const double wheelbase, iv::xmlparam::Xmlparam & xp)
|
|
|
{
|
|
|
const std::string ns = "steering_offset.";
|
|
|
- const auto vel_thres = node.declare_parameter<double>(ns + "update_vel_threshold");
|
|
|
- const auto steer_thres = node.declare_parameter<double>(ns + "update_steer_threshold");
|
|
|
- const auto limit = node.declare_parameter<double>(ns + "steering_offset_limit");
|
|
|
- const auto num = node.declare_parameter<int>(ns + "average_num");
|
|
|
+ const auto vel_thres = xp.GetParam(ns + "update_vel_threshold",0.0);
|
|
|
+ const auto steer_thres = xp.GetParam(ns + "update_steer_threshold",0.0);
|
|
|
+ const auto limit = xp.GetParam(ns + "steering_offset_limit",0.0);
|
|
|
+ const auto num = xp.GetParam(ns + "average_num",0);
|
|
|
steering_offset_ =
|
|
|
- std::make_shared<SteeringOffsetEstimator>(wheelbase, num, vel_thres, steer_thres, limit);
|
|
|
+ std::make_shared<SteeringOffsetEstimator>(wheelbase, num, vel_thres, steer_thres, limit);
|
|
|
return steering_offset_;
|
|
|
}
|
|
|
|
|
@@ -620,12 +711,50 @@ bool MpcLateralController::isMpcConverged()
|
|
|
return (max_steering_value - min_steering_value) < m_mpc_converged_threshold_rps;
|
|
|
}
|
|
|
|
|
|
-void MpcLateralController::declareMPCparameters(rclcpp::Node & node)
|
|
|
+//void MpcLateralController::declareMPCparameters(rclcpp::Node & node)
|
|
|
+//{
|
|
|
+// m_mpc.m_param.prediction_horizon = node.declare_parameter<int>("mpc_prediction_horizon");
|
|
|
+// m_mpc.m_param.prediction_dt = node.declare_parameter<double>("mpc_prediction_dt");
|
|
|
+
|
|
|
+// const auto dp = [&](const auto & param) { return node.declare_parameter<double>(param); };
|
|
|
+
|
|
|
+// auto & nw = m_mpc.m_param.nominal_weight;
|
|
|
+// nw.lat_error = dp("mpc_weight_lat_error");
|
|
|
+// nw.heading_error = dp("mpc_weight_heading_error");
|
|
|
+// nw.heading_error_squared_vel = dp("mpc_weight_heading_error_squared_vel");
|
|
|
+// nw.steering_input = dp("mpc_weight_steering_input");
|
|
|
+// nw.steering_input_squared_vel = dp("mpc_weight_steering_input_squared_vel");
|
|
|
+// nw.lat_jerk = dp("mpc_weight_lat_jerk");
|
|
|
+// nw.steer_rate = dp("mpc_weight_steer_rate");
|
|
|
+// nw.steer_acc = dp("mpc_weight_steer_acc");
|
|
|
+// nw.terminal_lat_error = dp("mpc_weight_terminal_lat_error");
|
|
|
+// nw.terminal_heading_error = dp("mpc_weight_terminal_heading_error");
|
|
|
+
|
|
|
+// auto & lcw = m_mpc.m_param.low_curvature_weight;
|
|
|
+// lcw.lat_error = dp("mpc_low_curvature_weight_lat_error");
|
|
|
+// lcw.heading_error = dp("mpc_low_curvature_weight_heading_error");
|
|
|
+// lcw.heading_error_squared_vel = dp("mpc_low_curvature_weight_heading_error_squared_vel");
|
|
|
+// lcw.steering_input = dp("mpc_low_curvature_weight_steering_input");
|
|
|
+// lcw.steering_input_squared_vel = dp("mpc_low_curvature_weight_steering_input_squared_vel");
|
|
|
+// lcw.lat_jerk = dp("mpc_low_curvature_weight_lat_jerk");
|
|
|
+// lcw.steer_rate = dp("mpc_low_curvature_weight_steer_rate");
|
|
|
+// lcw.steer_acc = dp("mpc_low_curvature_weight_steer_acc");
|
|
|
+// m_mpc.m_param.low_curvature_thresh_curvature = dp("mpc_low_curvature_thresh_curvature");
|
|
|
+
|
|
|
+// m_mpc.m_param.zero_ff_steer_deg = dp("mpc_zero_ff_steer_deg");
|
|
|
+// m_mpc.m_param.acceleration_limit = dp("mpc_acceleration_limit");
|
|
|
+// m_mpc.m_param.velocity_time_constant = dp("mpc_velocity_time_constant");
|
|
|
+// m_mpc.m_param.min_prediction_length = dp("mpc_min_prediction_length");
|
|
|
+//}
|
|
|
+
|
|
|
+void MpcLateralController::declareMPCparameters(iv::xmlparam::Xmlparam & xp)
|
|
|
{
|
|
|
- m_mpc.m_param.prediction_horizon = node.declare_parameter<int>("mpc_prediction_horizon");
|
|
|
- m_mpc.m_param.prediction_dt = node.declare_parameter<double>("mpc_prediction_dt");
|
|
|
+ m_mpc.m_param.prediction_horizon = xp.GetParam("mpc_prediction_horizon",1);// node.declare_parameter<int>("mpc_prediction_horizon");
|
|
|
+ m_mpc.m_param.prediction_dt = xp.GetParam("mpc_prediction_dt",1.0);// node.declare_parameter<double>("mpc_prediction_dt");
|
|
|
+
|
|
|
+ // const auto dp = [&](const auto & param) { return node.declare_parameter<double>(param); };
|
|
|
+ const auto dp = [&](const auto & param) { return xp.GetParam(param,1.0); };
|
|
|
|
|
|
- const auto dp = [&](const auto & param) { return node.declare_parameter<double>(param); };
|
|
|
|
|
|
auto & nw = m_mpc.m_param.nominal_weight;
|
|
|
nw.lat_error = dp("mpc_weight_lat_error");
|