35 const Eigen::MatrixXd& ego,
36 const Eigen::MatrixXi& obstacles_edges_num,
37 const size_t obstacles_num,
38 const Eigen::MatrixXd& obstacles_A,
39 const Eigen::MatrixXd& obstacles_b,
40 const Eigen::MatrixXd& xWS,
44 obstacles_edges_num_(obstacles_edges_num),
45 obstacles_A_(obstacles_A),
46 obstacles_b_(obstacles_b),
48 ACHECK(horizon < std::numeric_limits<int>::max()) <<
"Invalid cast on horizon in open space planner";
49 horizon_ =
static_cast<int>(horizon);
50 ACHECK(obstacles_num < std::numeric_limits<int>::max()) <<
"Invalid cast on obstacles_num in open space planner";
51 obstacles_num_ =
static_cast<int>(obstacles_num);
52 w_ev_ = ego_(1, 0) + ego_(3, 0);
53 l_ev_ = ego_(0, 0) + ego_(2, 0);
54 g_ = {l_ev_ / 2, w_ev_ / 2, l_ev_ / 2, w_ev_ / 2};
55 offset_ = (ego_(0, 0) + ego_(2, 0)) / 2 - ego_(2, 0);
56 obstacles_edges_sum_ = obstacles_edges_num_.sum();
58 n_start_index_ = l_start_index_ + obstacles_edges_sum_ * (horizon_ + 1);
59 d_start_index_ = n_start_index_ + 4 * obstacles_num_ * (horizon_ + 1);
60 l_warm_up_ = Eigen::MatrixXd::Zero(obstacles_edges_sum_, horizon_ + 1);
61 n_warm_up_ = Eigen::MatrixXd::Zero(4 * obstacles_num_, horizon_ + 1);
68 const Eigen::MatrixXd& ego,
69 const Eigen::MatrixXi& obstacles_edges_num,
70 const size_t obstacles_num,
71 const Eigen::MatrixXd& obstacles_A,
72 const Eigen::MatrixXd& obstacles_b,
73 const Eigen::MatrixXd& xWS,
77 obstacles_edges_num_(obstacles_edges_num),
78 obstacles_A_(obstacles_A),
79 obstacles_b_(obstacles_b),
81 ACHECK(horizon < std::numeric_limits<int>::max()) <<
"Invalid cast on horizon in open space planner";
82 horizon_ =
static_cast<int>(horizon);
83 ACHECK(obstacles_num < std::numeric_limits<int>::max()) <<
"Invalid cast on obstacles_num in open space planner";
84 obstacles_num_ =
static_cast<int>(obstacles_num);
85 w_ev_ = ego_(1, 0) + ego_(3, 0);
86 l_ev_ = ego_(0, 0) + ego_(2, 0);
87 g_ = {l_ev_ / 2, w_ev_ / 2, l_ev_ / 2, w_ev_ / 2};
88 offset_ = (ego_(0, 0) + ego_(2, 0)) / 2 - ego_(2, 0);
89 obstacles_edges_sum_ = obstacles_edges_num_.sum();
91 n_start_index_ = l_start_index_ + obstacles_edges_sum_ * (horizon_ + 1);
92 d_start_index_ = n_start_index_ + 4 * obstacles_num_ * (horizon_ + 1);
93 l_warm_up_ = Eigen::MatrixXd::Zero(obstacles_edges_sum_, horizon_ + 1);
94 n_warm_up_ = Eigen::MatrixXd::Zero(4 * obstacles_num_, horizon_ + 1);
95 weight_d_ = dual_variable_warm_start_config.
weight_d();
191 int variable_index = 0;
194 for (
int i = 0; i < horizon_ + 1; ++i) {
195 for (
int j = 0; j < obstacles_edges_sum_; ++j) {
196 x_l[variable_index] = -2e19;
197 x_u[variable_index] = 2e19;
201 ADEBUG <<
"variable_index after adding lagrange l : " << variable_index;
204 for (
int i = 0; i < horizon_ + 1; ++i) {
205 for (
int j = 0; j < 4 * obstacles_num_; ++j) {
206 x_l[variable_index] = -2e19;
207 x_u[variable_index] = 2e19;
211 ADEBUG <<
"variable_index after adding lagrange n : " << variable_index;
214 for (
int i = 0; i < horizon_ + 1; ++i) {
215 for (
int j = 0; j < obstacles_num_; ++j) {
217 x_l[variable_index] = -2e19;
218 x_u[variable_index] = 2e19;
222 ADEBUG <<
"variable_index after adding d : " << variable_index;
224 int constraint_index = 0;
225 for (
int i = 0; i < horizon_ + 1; ++i) {
226 for (
int j = 0; j < obstacles_num_; ++j) {
228 g_l[constraint_index] = -2e19;
229 g_u[constraint_index] = 1.0;
232 g_l[constraint_index + 1] = 0.0;
233 g_u[constraint_index + 1] = 0.0;
234 g_l[constraint_index + 2] = 0.0;
235 g_u[constraint_index + 2] = 0.0;
238 g_l[constraint_index + 3] = 0.0;
239 g_u[constraint_index + 3] = 0.0;
240 constraint_index += 4;
244 int l_index = l_start_index_;
245 int n_index = n_start_index_;
246 int d_index = d_start_index_;
248 for (
int i = 0; i < lambda_horizon_; ++i) {
249 g_l[constraint_index] = 0.0;
250 g_u[constraint_index] = 2e19;
254 for (
int i = 0; i < miu_horizon_; ++i) {
255 g_l[constraint_index] = 0.0;
256 g_u[constraint_index] = 2e19;
260 for (
int i = 0; i < dual_formulation_horizon_; ++i) {
261 g_l[constraint_index] = 0.0;
262 g_u[constraint_index] = 2e19;
267 ADEBUG <<
"constraint_index after adding obstacles constraints: " << constraint_index;
325 if (values ==
nullptr) {
327 int constraint_index = 0;
332 int l_index = l_start_index_;
333 int n_index = n_start_index_;
334 int d_index = d_start_index_;
335 for (
int i = 0; i < horizon_ + 1; ++i) {
336 for (
int j = 0; j < obstacles_num_; ++j) {
337 int current_edges_num = obstacles_edges_num_(j, 0);
340 for (
int k = 0; k < current_edges_num; ++k) {
342 iRow[nz_index] = constraint_index;
343 jCol[nz_index] = l_index + k;
349 for (
int k = 0; k < current_edges_num; ++k) {
350 iRow[nz_index] = constraint_index + 1;
351 jCol[nz_index] = l_index + k;
356 iRow[nz_index] = constraint_index + 1;
357 jCol[nz_index] = n_index;
360 iRow[nz_index] = constraint_index + 1;
361 jCol[nz_index] = n_index + 2;
366 for (
int k = 0; k < current_edges_num; ++k) {
367 iRow[nz_index] = constraint_index + 2;
368 jCol[nz_index] = l_index + k;
373 iRow[nz_index] = constraint_index + 2;
374 jCol[nz_index] = n_index + 1;
377 iRow[nz_index] = constraint_index + 2;
378 jCol[nz_index] = n_index + 3;
383 for (
int k = 0; k < current_edges_num; ++k) {
384 iRow[nz_index] = constraint_index + 3;
385 jCol[nz_index] = l_index + k;
390 for (
int k = 0; k < 4; ++k) {
391 iRow[nz_index] = constraint_index + 3;
392 jCol[nz_index] = n_index + k;
397 iRow[nz_index] = constraint_index + 3;
398 jCol[nz_index] = d_index;
402 l_index += current_edges_num;
405 constraint_index += 4;
409 l_index = l_start_index_;
410 n_index = n_start_index_;
411 d_index = d_start_index_;
412 for (
int i = 0; i < lambda_horizon_; ++i) {
413 iRow[nz_index] = constraint_index;
414 jCol[nz_index] = l_index;
419 for (
int i = 0; i < miu_horizon_; ++i) {
420 iRow[nz_index] = constraint_index;
421 jCol[nz_index] = n_index;
426 for (
int i = 0; i < dual_formulation_horizon_; ++i) {
427 iRow[nz_index] = constraint_index;
428 jCol[nz_index] = d_index;
434 CHECK_EQ(constraint_index, m) <<
"No. of constraints wrong in eval_jac_g.";
436 ADEBUG <<
"nz_index here : " << nz_index <<
" nele_jac is : " << nele_jac;
438 std::fill(values, values + nele_jac, 0.0);
444 int l_index = l_start_index_;
445 int n_index = n_start_index_;
447 for (
int i = 0; i < horizon_ + 1; ++i) {
448 int edges_counter = 0;
449 for (
int j = 0; j < obstacles_num_; ++j) {
450 int current_edges_num = obstacles_edges_num_(j, 0);
451 Eigen::MatrixXd Aj = obstacles_A_.block(edges_counter, 0, current_edges_num, 2);
452 Eigen::MatrixXd bj = obstacles_b_.block(edges_counter, 0, current_edges_num, 1);
457 for (
int k = 0; k < current_edges_num; ++k) {
459 tmp1 += Aj(k, 0) * x[l_index + k];
460 tmp2 += Aj(k, 1) * x[l_index + k];
464 for (
int k = 0; k < current_edges_num; ++k) {
466 values[nz_index] = 2 * tmp1 * Aj(k, 0) + 2 * tmp2 * Aj(k, 1);
473 for (
int k = 0; k < current_edges_num; ++k) {
474 values[nz_index] = std::cos(xWS_(2, i)) * Aj(k, 0) + std::sin(xWS_(2, i)) * Aj(k, 1);
479 values[nz_index] = 1.0;
482 values[nz_index] = -1.0;
485 ADEBUG <<
"eval_jac_g, after adding part 2";
489 for (
int k = 0; k < current_edges_num; ++k) {
490 values[nz_index] = -std::sin(xWS_(2, i)) * Aj(k, 0) + std::cos(xWS_(2, i)) * Aj(k, 1);
495 values[nz_index] = 1.0;
498 values[nz_index] = -1.0;
505 for (
int k = 0; k < 4; ++k) {
506 tmp3 += -g_[k] * x[n_index + k];
509 for (
int k = 0; k < current_edges_num; ++k) {
510 tmp4 += bj(k, 0) * x[l_index + k];
514 for (
int k = 0; k < current_edges_num; ++k) {
515 values[nz_index] = -(xWS_(0, i) + std::cos(xWS_(2, i)) * offset_) * Aj(k, 0)
516 - (xWS_(1, i) + std::sin(xWS_(2, i)) * offset_) * Aj(k, 1) + bj(k, 0);
521 for (
int k = 0; k < 4; ++k) {
522 values[nz_index] = g_[k];
527 values[nz_index] = 1.0;
531 edges_counter += current_edges_num;
532 l_index += current_edges_num;
537 for (
int i = 0; i < lambda_horizon_; ++i) {
538 values[nz_index] = 1.0;
541 for (
int i = 0; i < miu_horizon_; ++i) {
542 values[nz_index] = 1.0;
545 for (
int i = 0; i < dual_formulation_horizon_; ++i) {
546 values[nz_index] = 1.0;
550 ADEBUG <<
"eval_jac_g, fulfilled obstacle constraint values";
551 CHECK_EQ(nz_index, nele_jac);
554 ADEBUG <<
"eval_jac_g done";
660 ADEBUG <<
"eval_constraints";
666 int l_index = l_start_index_;
667 int n_index = n_start_index_;
668 int d_index = d_start_index_;
669 int constraint_index = 0;
671 for (
int i = 0; i < horizon_ + 1; ++i) {
672 int edges_counter = 0;
674 for (
int j = 0; j < obstacles_num_; ++j) {
675 int current_edges_num = obstacles_edges_num_(j, 0);
676 Eigen::MatrixXd Aj = obstacles_A_.block(edges_counter, 0, current_edges_num, 2);
677 Eigen::MatrixXd bj = obstacles_b_.block(edges_counter, 0, current_edges_num, 1);
682 for (
int k = 0; k < current_edges_num; ++k) {
683 tmp1 += Aj(k, 0) * x[l_index + k];
684 tmp2 += Aj(k, 1) * x[l_index + k];
686 g[constraint_index] = tmp1 * tmp1 + tmp2 * tmp2;
689 g[constraint_index + 1] = x[n_index] - x[n_index + 2] + cos(xWS_(2, i)) * tmp1 + sin(xWS_(2, i)) * tmp2;
691 g[constraint_index + 2] = x[n_index + 1] - x[n_index + 3] - sin(xWS_(2, i)) * tmp1 + cos(xWS_(2, i)) * tmp2;
696 for (
int k = 0; k < 4; ++k) {
697 tmp3 += g_[k] * x[n_index + k];
701 for (
int k = 0; k < current_edges_num; ++k) {
702 tmp4 += bj(k, 0) * x[l_index + k];
705 g[constraint_index + 3] = x[d_index] + tmp3 - (xWS_(0, i) + cos(xWS_(2, i)) * offset_) * tmp1
706 - (xWS_(1, i) + sin(xWS_(2, i)) * offset_) * tmp2 + tmp4;
709 edges_counter += current_edges_num;
710 l_index += current_edges_num;
713 constraint_index += 4;
716 l_index = l_start_index_;
717 n_index = n_start_index_;
718 d_index = d_start_index_;
719 for (
int i = 0; i < lambda_horizon_; ++i) {
720 g[constraint_index] = x[l_index];
724 for (
int i = 0; i < miu_horizon_; ++i) {
725 g[constraint_index] = x[n_index];
729 for (
int i = 0; i < dual_formulation_horizon_; ++i) {
730 g[constraint_index] = x[d_index];
735 CHECK_EQ(constraint_index, m) <<
"No. of constraints wrong in eval_g. n : " << n;
741 std::vector<double> xp(n);
742 std::vector<double> lamp(m);
743 std::vector<double> zl(m);
744 std::vector<double> zu(m);
746 std::vector<adouble> xa(n);
747 std::vector<adouble> g(m);
748 std::vector<double> lam(m);
754 obj_lam =
new double[m + 1];
780 for (
int idx = 0; idx < n; idx++) {
783 for (
int idx = 0; idx < m; idx++) {
790 obj_value *= mkparam(sig);
793 for (
int idx = 0; idx < m; idx++) {
794 obj_value += g[idx] * mkparam(lam[idx]);
809 sparse_hess(
tag_L, n, 0, &xp[0], &nnz_L, &rind_L, &cind_L, &hessval, options_L);