299 const std::vector<double>& XYbounds,
301 Eigen::MatrixXd* state_result_ds_,
302 Eigen::MatrixXd* control_result_ds_,
303 Eigen::MatrixXd* time_result_ds_,
304 Eigen::MatrixXd* dual_l_result_ds_,
305 Eigen::MatrixXd* dual_n_result_ds_,
307 double& ipopt_time) {
309 size_t horizon_ = hybrid_a_star_result->
x.size() - 1;
311 float ts_ = planner_open_space_config.
delta_t();
317 Eigen::VectorXd steer;
325 horizon_ = extend_size * horizon_;
327 ts_ = ts_ /
static_cast<float>(extend_size);
330 x = Eigen::Map<Eigen::VectorXd, Eigen::Unaligned>(x_extend.data(), horizon_ + 1);
333 y = Eigen::Map<Eigen::VectorXd, Eigen::Unaligned>(y_extend.data(), horizon_ + 1);
336 phi = Eigen::Map<Eigen::VectorXd, Eigen::Unaligned>(phi_extend.data(), horizon_ + 1);
339 v = Eigen::Map<Eigen::VectorXd, Eigen::Unaligned>(v_extend.data(), horizon_ + 1);
341 steer = Eigen::VectorXd(horizon_);
342 a = Eigen::VectorXd(horizon_);
343 for (
size_t i = 0; i < static_cast<size_t>(horizon_); ++i) {
344 steer[i] = hybrid_a_star_result->
steer[i / extend_size];
345 a[i] = hybrid_a_star_result->
a[i / extend_size];
348 for (
size_t i = 0; i < hybrid_a_star_result->
x.size(); ++i) {
349 ADEBUG <<
"i: " << i <<
", val: " << hybrid_a_star_result->
x[i];
351 ADEBUG <<
"interpolated x: \n" << x;
353 ADEBUG <<
"hybrid A steer: ";
354 for (
size_t i = 0; i < hybrid_a_star_result->
steer.size(); ++i) {
355 ADEBUG <<
"i: " << i <<
", val: " << hybrid_a_star_result->
steer[i];
357 ADEBUG <<
"interpolated steer: \n" << steer;
359 x = Eigen::Map<Eigen::VectorXd, Eigen::Unaligned>(hybrid_a_star_result->
x.data(), horizon_ + 1);
360 y = Eigen::Map<Eigen::VectorXd, Eigen::Unaligned>(hybrid_a_star_result->
y.data(), horizon_ + 1);
361 phi = Eigen::Map<Eigen::VectorXd, Eigen::Unaligned>(hybrid_a_star_result->
phi.data(), horizon_ + 1);
362 v = Eigen::Map<Eigen::VectorXd, Eigen::Unaligned>(hybrid_a_star_result->
v.data(), horizon_ + 1);
363 steer = Eigen::Map<Eigen::VectorXd, Eigen::Unaligned>(hybrid_a_star_result->
steer.data(), horizon_);
364 a = Eigen::Map<Eigen::VectorXd, Eigen::Unaligned>(hybrid_a_star_result->
a.data(), horizon_);
367 Eigen::MatrixXd xWS = Eigen::MatrixXd::Zero(4, horizon_ + 1);
368 Eigen::MatrixXd uWS = Eigen::MatrixXd::Zero(2, horizon_);
376 Eigen::MatrixXd x0(4, 1);
377 x0 << sx, sy, sphi, 0.0;
379 Eigen::MatrixXd xF(4, 1);
380 xF << ex, ey, ephi, 0.0;
382 Eigen::MatrixXd last_time_u(2, 1);
383 last_time_u << 0.0, 0.0;
388 Eigen::MatrixXd ego_(4, 1);
393 ego_ << front_to_center, right_to_center, back_to_center, left_to_center;
396 Eigen::MatrixXd l_warm_up;
397 Eigen::MatrixXd n_warm_up;
398 Eigen::MatrixXd s_warm_up = Eigen::MatrixXd::Zero(obstacles.
GetObstaclesNum(), horizon_ + 1);
403 const auto t1 = std::chrono::system_clock::now();
404 if (FLAGS_use_dual_variable_warm_start) {
405 bool dual_variable_warm_start_status = dual_variable_warm_start_ptr->
Solve(
418 if (dual_variable_warm_start_status) {
419 AINFO <<
"Dual variable problem solved successfully!";
421 AERROR <<
"Dual variable problem solving failed";
426 n_warm_up = Eigen::MatrixXd::Zero(4 * obstacles.
GetObstaclesNum(), horizon_ + 1);
428 const auto t2 = std::chrono::system_clock::now();
429 dual_time = std::chrono::duration<double>(t2 - t1).count() * 1000;
433 bool status = distance_approach_ptr->
Solve(
455 const auto t3 = std::chrono::system_clock::now();
456 ipopt_time = std::chrono::duration<double>(t3 - t2).count() * 1000;
459 AERROR <<
"Distance fail";
478 FLAGS_planner_open_space_config_filename, &planner_open_space_config_))
479 <<
"Failed to load open space config file " << FLAGS_planner_open_space_config_filename;
480 AINFO <<
"FLAGS_planner_open_space_config_filename: " << FLAGS_planner_open_space_config_filename;
482 double hybrid_total = 0.0;
483 double dual_total = 0.0;
484 double ipopt_total = 0.0;
486 std::string flag_file_path =
"/apollo/modules/planning/planning_component/conf/planning.conf";
487 google::SetCommandLineOption(
"flagfile", flag_file_path.c_str());
490 std::vector<double> XYbounds_(XYbounds, XYbounds + 4);
491 std::vector<std::vector<common::math::Vec2d>> soft_boundary_vertices_vec;
493 const auto start_timestamp = std::chrono::system_clock::now();
494 if (!hybridA_ptr->
Plan(
503 &hybrid_astar_result,
504 soft_boundary_vertices_vec,
506 AINFO <<
"Hybrid A Star fails";
509 const auto end_timestamp = std::chrono::system_clock::now();
510 std::chrono::duration<double> time_diff = end_timestamp - start_timestamp;
511 hybrid_total = time_diff.count() * 1000;
513 if (FLAGS_enable_parallel_trajectory_smoothing) {
514 std::vector<HybridAStartResult> partition_trajectories;
516 AERROR <<
"TrajectoryPartition failed";
520 size_t size = partition_trajectories.size();
521 std::vector<Eigen::MatrixXd> state_result_ds_vec;
522 std::vector<Eigen::MatrixXd> control_result_ds_vec;
523 std::vector<Eigen::MatrixXd> time_result_ds_vec;
524 std::vector<Eigen::MatrixXd> dual_l_result_ds_vec;
525 std::vector<Eigen::MatrixXd> dual_n_result_ds_vec;
526 state_result_ds_vec.resize(size);
527 control_result_ds_vec.resize(size);
528 time_result_ds_vec.resize(size);
529 dual_l_result_ds_vec.resize(size);
530 dual_n_result_ds_vec.resize(size);
531 std::vector<std::future<bool>> results;
566 double dual_tmp = 0.0;
567 double ipopt_tmp = 0.0;
568 for (
size_t i = 0; i < size; ++i) {
569 double piece_wise_sx = partition_trajectories[i].
x.front();
570 double piece_wise_sy = partition_trajectories[i].y.front();
571 double piece_wise_sphi = partition_trajectories[i].phi.front();
572 double piece_wise_ex = partition_trajectories[i].x.back();
573 double piece_wise_ey = partition_trajectories[i].y.back();
574 double piece_wise_ephi = partition_trajectories[i].phi.back();
577 planner_open_space_config_,
586 &partition_trajectories[i],
587 &state_result_ds_vec[i],
588 &control_result_ds_vec[i],
589 &time_result_ds_vec[i],
590 &dual_l_result_ds_vec[i],
591 &dual_n_result_ds_vec[i],
597 dual_total += dual_tmp;
598 ipopt_total += ipopt_tmp;
602 size_t trajectory_point_size = 0;
603 for (
size_t i = 0; i < size; ++i) {
604 if (state_result_ds_vec[i].cols() < 2) {
605 AERROR <<
"state horizon smaller than 2";
608 AINFO <<
"trajectory idx: "
609 <<
"idx range: " << trajectory_point_size <<
", "
610 << trajectory_point_size +
static_cast<size_t>(state_result_ds_vec[i].cols()) - 1;
611 trajectory_point_size +=
static_cast<size_t>(state_result_ds_vec[i].cols()) - 1;
613 ++trajectory_point_size;
615 const uint64_t state_dimension = state_result_ds_vec.front().rows();
616 Eigen::MatrixXd state_result_ds;
617 state_result_ds.resize(state_dimension, trajectory_point_size);
619 for (
size_t i = 0; i < size; ++i) {
621 uint64_t state_col_num = state_result_ds_vec[i].cols() - 1;
622 for (uint64_t j = 0; j < state_col_num; ++j) {
623 state_result_ds.col(k) = state_result_ds_vec[i].col(j);
627 state_result_ds.col(k) = state_result_ds_vec.back().col(state_result_ds_vec.back().cols() - 1);
629 const uint64_t control_dimension = control_result_ds_vec.front().rows();
630 Eigen::MatrixXd control_result_ds;
631 control_result_ds.resize(control_dimension, trajectory_point_size - 1);
634 for (
size_t i = 0; i < size; ++i) {
635 uint64_t control_col_num = control_result_ds_vec[i].cols() - 1;
636 for (uint64_t j = 0; j < control_col_num; ++j) {
637 control_result_ds.col(k) = control_result_ds_vec[i].col(j);
642 const uint64_t time_dimension = time_result_ds_vec.front().rows();
643 Eigen::MatrixXd time_result_ds;
644 time_result_ds.resize(time_dimension, trajectory_point_size - 1);
646 for (
size_t i = 0; i < size; ++i) {
647 uint64_t time_col_num = time_result_ds_vec[i].cols() - 1;
648 for (uint64_t j = 0; j < time_col_num; ++j) {
649 time_result_ds.col(k) = time_result_ds_vec[i].col(j);
662 Eigen::MatrixXd state_result_ds;
663 Eigen::MatrixXd control_result_ds;
664 Eigen::MatrixXd time_result_ds;
665 Eigen::MatrixXd dual_l_result_ds;
666 Eigen::MatrixXd dual_n_result_ds;
668 planner_open_space_config_,
677 &hybrid_astar_result,
685 AERROR <<
"DistanceSmoothing failed";
723 double* ipopt_time) {
725 size_t size = result_ptr->
GetX()->size();
727 AERROR_IF(size != size_by_distance) <<
"sizes by hybrid A and distance approach not consistent";
728 for (
size_t i = 0; i < size; ++i) {
729 x[i] = result_ptr->
GetX()->at(i);
730 y[i] = result_ptr->
GetY()->at(i);
731 phi[i] = result_ptr->
GetPhi()->at(i);
732 v[i] = result_ptr->
GetV()->at(i);
734 for (
size_t i = 0; i + 1 < size; ++i) {
735 a[i] = result_ptr->
GetA()->at(i);
736 steer[i] = result_ptr->
GetSteer()->at(i);
738 output_size[0] = size;
742 for (
size_t i = 0; i < size_by_distance; ++i) {
750 for (
size_t i = 0; i + 1 < size_by_distance; ++i) {
756 for (
size_t i = 0; i + 1 < size_by_distance; ++i) {
757 for (
size_t j = 0; j < obstacles_edges_sum; ++j) {
758 opt_dual_l[i * obstacles_edges_sum + j] = (*(result_ptr->
PrepareLResult()))(j, i);
760 for (
size_t k = 0; k < obstacles_num_to_car; ++k) {
761 opt_dual_n[i * obstacles_num_to_car + k] = (*(result_ptr->
PrepareNResult()))(k, i);
765 for (
size_t i = 0; i + 1 < size_by_distance; ++i) {
bool Solve(const Eigen::MatrixXd &x0, const Eigen::MatrixXd &xF, const Eigen::MatrixXd &last_time_u, const size_t horizon, const double ts, const Eigen::MatrixXd &ego, const Eigen::MatrixXd &xWS, const Eigen::MatrixXd &uWS, const Eigen::MatrixXd &l_warm_up, const Eigen::MatrixXd &n_warm_up, const Eigen::MatrixXd &s_warm_up, const std::vector< double > &XYbounds, const size_t obstacles_num, const Eigen::MatrixXi &obstacles_edges_num, const Eigen::MatrixXd &obstacles_A, const Eigen::MatrixXd &obstacles_b, Eigen::MatrixXd *state_result, Eigen::MatrixXd *control_result, Eigen::MatrixXd *time_result, Eigen::MatrixXd *dual_l_result, Eigen::MatrixXd *dual_n_result)
void DistanceGetResult(ResultContainer *result_ptr, ObstacleContainer *obstacles_ptr, double *x, double *y, double *phi, double *v, double *a, double *steer, double *opt_x, double *opt_y, double *opt_phi, double *opt_v, double *opt_a, double *opt_steer, double *opt_time, double *opt_dual_l, double *opt_dual_n, size_t *output_size, double *hybrid_time, double *dual_time, double *ipopt_time)
bool DistanceSmoothing(const apollo::planning::PlannerOpenSpaceConfig &planner_open_space_config, const ObstacleContainer &obstacles, double sx, double sy, double sphi, double ex, double ey, double ephi, const std::vector< double > &XYbounds, HybridAStartResult *hybrid_a_star_result, Eigen::MatrixXd *state_result_ds_, Eigen::MatrixXd *control_result_ds_, Eigen::MatrixXd *time_result_ds_, Eigen::MatrixXd *dual_l_result_ds_, Eigen::MatrixXd *dual_n_result_ds_, double &dual_time, double &ipopt_time)