261 double ex,
double ey,
double ephi,
const std::vector<double>& XYbounds,
263 Eigen::MatrixXd* control_result_ds_, Eigen::MatrixXd* time_result_ds_,
264 Eigen::MatrixXd* dual_l_result_ds_, Eigen::MatrixXd* dual_n_result_ds_,
265 double& dual_time,
double& ipopt_time) {
267 size_t horizon_ = hybrid_a_star_result->
x.size() - 1;
269 float ts_ = planner_open_space_config.
delta_t();
275 Eigen::VectorXd steer;
279 if (horizon_ <= 10 && horizon_ > 2 &&
284 horizon_ = extend_size * horizon_;
286 ts_ = ts_ /
static_cast<float>(extend_size);
288 std::vector<double> x_extend =
290 x = Eigen::Map<Eigen::VectorXd, Eigen::Unaligned>(x_extend.data(),
293 std::vector<double> y_extend =
295 y = Eigen::Map<Eigen::VectorXd, Eigen::Unaligned>(y_extend.data(),
298 std::vector<double> phi_extend =
300 phi = Eigen::Map<Eigen::VectorXd, Eigen::Unaligned>(phi_extend.data(),
303 std::vector<double> v_extend =
305 v = Eigen::Map<Eigen::VectorXd, Eigen::Unaligned>(v_extend.data(),
308 steer = Eigen::VectorXd(horizon_);
309 a = Eigen::VectorXd(horizon_);
310 for (
size_t i = 0; i < static_cast<size_t>(horizon_); ++i) {
311 steer[i] = hybrid_a_star_result->
steer[i / extend_size];
312 a[i] = hybrid_a_star_result->
a[i / extend_size];
315 for (
size_t i = 0; i < hybrid_a_star_result->
x.size(); ++i) {
316 ADEBUG <<
"i: " << i <<
", val: " << hybrid_a_star_result->
x[i];
318 ADEBUG <<
"interpolated x: \n" << x;
320 ADEBUG <<
"hybrid A steer: ";
321 for (
size_t i = 0; i < hybrid_a_star_result->
steer.size(); ++i) {
322 ADEBUG <<
"i: " << i <<
", val: " << hybrid_a_star_result->
steer[i];
324 ADEBUG <<
"interpolated steer: \n" << steer;
326 x = Eigen::Map<Eigen::VectorXd, Eigen::Unaligned>(
327 hybrid_a_star_result->
x.data(), horizon_ + 1);
328 y = Eigen::Map<Eigen::VectorXd, Eigen::Unaligned>(
329 hybrid_a_star_result->
y.data(), horizon_ + 1);
330 phi = Eigen::Map<Eigen::VectorXd, Eigen::Unaligned>(
331 hybrid_a_star_result->
phi.data(), horizon_ + 1);
332 v = Eigen::Map<Eigen::VectorXd, Eigen::Unaligned>(
333 hybrid_a_star_result->
v.data(), horizon_ + 1);
334 steer = Eigen::Map<Eigen::VectorXd, Eigen::Unaligned>(
335 hybrid_a_star_result->
steer.data(), horizon_);
336 a = Eigen::Map<Eigen::VectorXd, Eigen::Unaligned>(
337 hybrid_a_star_result->
a.data(), horizon_);
340 Eigen::MatrixXd xWS = Eigen::MatrixXd::Zero(4, horizon_ + 1);
341 Eigen::MatrixXd uWS = Eigen::MatrixXd::Zero(2, horizon_);
349 Eigen::MatrixXd x0(4, 1);
350 x0 << sx, sy, sphi, 0.0;
352 Eigen::MatrixXd xF(4, 1);
353 xF << ex, ey, ephi, 0.0;
355 Eigen::MatrixXd last_time_u(2, 1);
356 last_time_u << 0.0, 0.0;
362 Eigen::MatrixXd ego_(4, 1);
367 ego_ << front_to_center, right_to_center, back_to_center, left_to_center;
370 Eigen::MatrixXd l_warm_up;
371 Eigen::MatrixXd n_warm_up;
372 Eigen::MatrixXd s_warm_up =
378 const auto t1 = std::chrono::system_clock::now();
379 if (FLAGS_use_dual_variable_warm_start) {
380 bool dual_variable_warm_start_status = dual_variable_warm_start_ptr->
Solve(
383 obstacles.
GetbMatrix(), xWS, &l_warm_up, &n_warm_up, &s_warm_up);
385 if (dual_variable_warm_start_status) {
386 AINFO <<
"Dual variable problem solved successfully!";
388 AERROR <<
"Dual variable problem solving failed";
397 const auto t2 = std::chrono::system_clock::now();
398 dual_time = std::chrono::duration<double>(t2 - t1).count() * 1000;
403 bool status = distance_approach_ptr->
Solve(
404 x0, xF, last_time_u, horizon_, ts_, ego_, xWS, uWS, l_warm_up, n_warm_up,
407 obstacles.
GetbMatrix(), state_result_ds_, control_result_ds_,
408 time_result_ds_, dual_l_result_ds_, dual_n_result_ds_);
409 const auto t3 = std::chrono::system_clock::now();
410 ipopt_time = std::chrono::duration<double>(t3 - t2).count() * 1000;
413 AERROR <<
"Distance fail";
421 double sphi,
double ex,
double ey,
double ephi,
425 FLAGS_planner_open_space_config_filename, &planner_open_space_config_))
426 <<
"Failed to load open space config file "
427 << FLAGS_planner_open_space_config_filename;
428 AINFO <<
"FLAGS_planner_open_space_config_filename: "
429 << FLAGS_planner_open_space_config_filename;
431 double hybrid_total = 0.0;
432 double dual_total = 0.0;
433 double ipopt_total = 0.0;
435 std::string flag_file_path =
436 "modules/planning/planning_component/conf/planning.conf";
437 google::SetCommandLineOption(
"flagfile", flag_file_path.c_str());
440 std::vector<double> XYbounds_(XYbounds, XYbounds + 4);
441 std::vector<std::vector<common::math::Vec2d>> soft_boundary_vertices_vec;
443 const auto start_timestamp = std::chrono::system_clock::now();
444 if (!hybridA_ptr->
Plan(sx, sy, sphi, ex, ey, ephi, XYbounds_,
446 &hybrid_astar_result,
447 soft_boundary_vertices_vec,
false)) {
448 AINFO <<
"Hybrid A Star fails";
451 const auto end_timestamp = std::chrono::system_clock::now();
452 std::chrono::duration<double> time_diff = end_timestamp - start_timestamp;
453 hybrid_total = time_diff.count() * 1000;
455 if (FLAGS_enable_parallel_trajectory_smoothing) {
456 std::vector<HybridAStartResult> partition_trajectories;
458 &partition_trajectories)) {
459 AERROR <<
"TrajectoryPartition failed";
463 size_t size = partition_trajectories.size();
464 std::vector<Eigen::MatrixXd> state_result_ds_vec;
465 std::vector<Eigen::MatrixXd> control_result_ds_vec;
466 std::vector<Eigen::MatrixXd> time_result_ds_vec;
467 std::vector<Eigen::MatrixXd> dual_l_result_ds_vec;
468 std::vector<Eigen::MatrixXd> dual_n_result_ds_vec;
469 state_result_ds_vec.resize(size);
470 control_result_ds_vec.resize(size);
471 time_result_ds_vec.resize(size);
472 dual_l_result_ds_vec.resize(size);
473 dual_n_result_ds_vec.resize(size);
474 std::vector<std::future<bool>> results;
509 double dual_tmp = 0.0;
510 double ipopt_tmp = 0.0;
511 for (
size_t i = 0; i < size; ++i) {
512 double piece_wise_sx = partition_trajectories[i].
x.front();
513 double piece_wise_sy = partition_trajectories[i].y.front();
514 double piece_wise_sphi = partition_trajectories[i].phi.front();
515 double piece_wise_ex = partition_trajectories[i].x.back();
516 double piece_wise_ey = partition_trajectories[i].y.back();
517 double piece_wise_ephi = partition_trajectories[i].phi.back();
520 piece_wise_sx, piece_wise_sy, piece_wise_sphi,
521 piece_wise_ex, piece_wise_ey, piece_wise_ephi,
522 XYbounds_, &partition_trajectories[i],
523 &state_result_ds_vec[i], &control_result_ds_vec[i],
524 &time_result_ds_vec[i], &dual_l_result_ds_vec[i],
525 &dual_n_result_ds_vec[i], dual_tmp, ipopt_tmp)) {
529 dual_total += dual_tmp;
530 ipopt_total += ipopt_tmp;
534 size_t trajectory_point_size = 0;
535 for (
size_t i = 0; i < size; ++i) {
536 if (state_result_ds_vec[i].cols() < 2) {
537 AERROR <<
"state horizon smaller than 2";
540 AINFO <<
"trajectory idx: "
541 <<
"idx range: " << trajectory_point_size <<
", "
542 << trajectory_point_size +
543 static_cast<size_t>(state_result_ds_vec[i].cols()) - 1;
544 trajectory_point_size +=
545 static_cast<size_t>(state_result_ds_vec[i].cols()) - 1;
547 ++trajectory_point_size;
549 const uint64_t state_dimension = state_result_ds_vec.front().rows();
550 Eigen::MatrixXd state_result_ds;
551 state_result_ds.resize(state_dimension, trajectory_point_size);
553 for (
size_t i = 0; i < size; ++i) {
555 uint64_t state_col_num = state_result_ds_vec[i].cols() - 1;
556 for (uint64_t j = 0; j < state_col_num; ++j) {
557 state_result_ds.col(k) = state_result_ds_vec[i].col(j);
561 state_result_ds.col(k) =
562 state_result_ds_vec.back().col(state_result_ds_vec.back().cols() - 1);
564 const uint64_t control_dimension = control_result_ds_vec.front().rows();
565 Eigen::MatrixXd control_result_ds;
566 control_result_ds.resize(control_dimension, trajectory_point_size - 1);
569 for (
size_t i = 0; i < size; ++i) {
570 uint64_t control_col_num = control_result_ds_vec[i].cols() - 1;
571 for (uint64_t j = 0; j < control_col_num; ++j) {
572 control_result_ds.col(k) = control_result_ds_vec[i].col(j);
577 const uint64_t time_dimension = time_result_ds_vec.front().rows();
578 Eigen::MatrixXd time_result_ds;
579 time_result_ds.resize(time_dimension, trajectory_point_size - 1);
581 for (
size_t i = 0; i < size; ++i) {
582 uint64_t time_col_num = time_result_ds_vec[i].cols() - 1;
583 for (uint64_t j = 0; j < time_col_num; ++j) {
584 time_result_ds.col(k) = time_result_ds_vec[i].col(j);
597 Eigen::MatrixXd state_result_ds;
598 Eigen::MatrixXd control_result_ds;
599 Eigen::MatrixXd time_result_ds;
600 Eigen::MatrixXd dual_l_result_ds;
601 Eigen::MatrixXd dual_n_result_ds;
603 sphi, ex, ey, ephi, XYbounds_, &hybrid_astar_result,
604 &state_result_ds, &control_result_ds,
605 &time_result_ds, &dual_l_result_ds,
606 &dual_n_result_ds, dual_total, ipopt_total)) {
607 AERROR <<
"DistanceSmoothing failed";
626 double* phi,
double* v,
double* a,
double* steer,
627 double* opt_x,
double* opt_y,
double* opt_phi,
628 double* opt_v,
double* opt_a,
double* opt_steer,
629 double* opt_time,
double* opt_dual_l,
double* opt_dual_n,
630 size_t* output_size,
double* hybrid_time,
631 double* dual_time,
double* ipopt_time) {
633 size_t size = result_ptr->
GetX()->size();
636 <<
"sizes by hybrid A and distance approach not consistent";
637 for (
size_t i = 0; i < size; ++i) {
638 x[i] = result_ptr->
GetX()->at(i);
639 y[i] = result_ptr->
GetY()->at(i);
640 phi[i] = result_ptr->
GetPhi()->at(i);
641 v[i] = result_ptr->
GetV()->at(i);
643 for (
size_t i = 0; i + 1 < size; ++i) {
644 a[i] = result_ptr->
GetA()->at(i);
645 steer[i] = result_ptr->
GetSteer()->at(i);
647 output_size[0] = size;
651 for (
size_t i = 0; i < size_by_distance; ++i) {
659 for (
size_t i = 0; i + 1 < size_by_distance; ++i) {
666 for (
size_t i = 0; i + 1 < size_by_distance; ++i) {
667 for (
size_t j = 0; j < obstacles_edges_sum; ++j) {
668 opt_dual_l[i * obstacles_edges_sum + j] =
671 for (
size_t k = 0; k < obstacles_num_to_car; ++k) {
672 opt_dual_n[i * obstacles_num_to_car + k] =
677 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)