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 l_warm_up_ = Eigen::MatrixXd::Zero(obstacles_edges_sum_, horizon_ + 1);
60 n_warm_up_ = Eigen::MatrixXd::Zero(4 * obstacles_num_, horizon_ + 1);
67 const Eigen::MatrixXd& ego,
68 const Eigen::MatrixXi& obstacles_edges_num,
69 const size_t obstacles_num,
70 const Eigen::MatrixXd& obstacles_A,
71 const Eigen::MatrixXd& obstacles_b,
72 const Eigen::MatrixXd& xWS,
76 obstacles_edges_num_(obstacles_edges_num),
77 obstacles_A_(obstacles_A),
78 obstacles_b_(obstacles_b),
80 ACHECK(horizon < std::numeric_limits<int>::max()) <<
"Invalid cast on horizon in open space planner";
81 horizon_ =
static_cast<int>(horizon);
82 ACHECK(obstacles_num < std::numeric_limits<int>::max()) <<
"Invalid cast on obstacles_num in open space planner";
83 obstacles_num_ =
static_cast<int>(obstacles_num);
84 w_ev_ = ego_(1, 0) + ego_(3, 0);
85 l_ev_ = ego_(0, 0) + ego_(2, 0);
86 g_ = {l_ev_ / 2, w_ev_ / 2, l_ev_ / 2, w_ev_ / 2};
87 offset_ = (ego_(0, 0) + ego_(2, 0)) / 2 - ego_(2, 0);
88 obstacles_edges_sum_ = obstacles_edges_num_.sum();
90 n_start_index_ = l_start_index_ + obstacles_edges_sum_ * (horizon_ + 1);
91 l_warm_up_ = Eigen::MatrixXd::Zero(obstacles_edges_sum_, horizon_ + 1);
92 n_warm_up_ = Eigen::MatrixXd::Zero(4 * obstacles_num_, horizon_ + 1);
101 IndexStyleEnum& index_style) {
102 lambda_horizon_ = obstacles_edges_sum_ * (horizon_ + 1);
104 miu_horizon_ = obstacles_num_ * 4 * (horizon_ + 1);
106 dual_formulation_horizon_ = obstacles_num_ * (horizon_ + 1);
108 num_of_variables_ = lambda_horizon_ + miu_horizon_;
110 num_of_constraints_ = 3 * obstacles_num_ * (horizon_ + 1) + num_of_variables_;
113 n = num_of_variables_;
116 m = num_of_constraints_;
122 for (
int i = 0; i < horizon_ + 1; ++i) {
123 for (
int j = 0; j < obstacles_num_; ++j) {
124 int current_edges_num = obstacles_edges_num_(j, 0);
125 tmp += current_edges_num * 3 + 2 + 2 + 4;
128 nnz_jac_g = tmp + num_of_variables_;
130 ADEBUG <<
"nnz_jac_g : " << nnz_jac_g;
131 index_style = IndexStyleEnum::C_STYLE;
182 int variable_index = 0;
185 for (
int i = 0; i < horizon_ + 1; ++i) {
186 for (
int j = 0; j < obstacles_edges_sum_; ++j) {
187 x_l[variable_index] = -2e19;
188 x_u[variable_index] = 2e19;
192 ADEBUG <<
"variable_index after adding lagrange l : " << variable_index;
195 for (
int i = 0; i < horizon_ + 1; ++i) {
196 for (
int j = 0; j < 4 * obstacles_num_; ++j) {
197 x_l[variable_index] = -2e19;
198 x_u[variable_index] = 2e19;
202 ADEBUG <<
"variable_index after adding lagrange n : " << variable_index;
204 int constraint_index = 0;
205 for (
int i = 0; i < horizon_ + 1; ++i) {
206 for (
int j = 0; j < obstacles_num_; ++j) {
208 g_l[constraint_index] = 0.0;
209 g_u[constraint_index] = 0.0;
210 g_l[constraint_index + 1] = 0.0;
211 g_u[constraint_index + 1] = 0.0;
214 g_l[constraint_index + 2] = min_safety_distance_;
215 g_u[constraint_index + 2] = 2e19;
216 constraint_index += 3;
220 int l_index = l_start_index_;
221 int n_index = n_start_index_;
223 for (
int i = 0; i < lambda_horizon_; ++i) {
224 g_l[constraint_index] = 0.0;
225 g_u[constraint_index] = 2e19;
229 for (
int i = 0; i < miu_horizon_; ++i) {
230 g_l[constraint_index] = 0.0;
231 g_u[constraint_index] = 2e19;
236 ADEBUG <<
"constraint_index after adding obstacles constraints: " << constraint_index;
247 std::fill(grad_f, grad_f + n, 0.0);
248 int l_index = l_start_index_;
249 for (
int i = 0; i < horizon_ + 1; ++i) {
250 int edges_counter = 0;
252 for (
int j = 0; j < obstacles_num_; ++j) {
253 int current_edges_num = obstacles_edges_num_(j, 0);
254 Eigen::MatrixXd Aj = obstacles_A_.block(edges_counter, 0, current_edges_num, 2);
255 Eigen::MatrixXd bj = obstacles_b_.block(edges_counter, 0, current_edges_num, 1);
260 for (
int k = 0; k < current_edges_num; ++k) {
261 tmp1 += Aj(k, 0) * x[l_index + k];
262 tmp2 += Aj(k, 1) * x[l_index + k];
264 for (
int k = 0; k < current_edges_num; ++k) {
265 grad_f[l_index + k] += 2.0 * tmp1 * Aj(k, 0) + 2.0 * tmp2 * Aj(k, 1);
269 edges_counter += current_edges_num;
270 l_index += current_edges_num;
293 if (values ==
nullptr) {
295 int constraint_index = 0;
300 int l_index = l_start_index_;
301 int n_index = n_start_index_;
302 for (
int i = 0; i < horizon_ + 1; ++i) {
303 for (
int j = 0; j < obstacles_num_; ++j) {
304 int current_edges_num = obstacles_edges_num_(j, 0);
308 for (
int k = 0; k < current_edges_num; ++k) {
309 iRow[nz_index] = constraint_index;
310 jCol[nz_index] = l_index + k;
315 iRow[nz_index] = constraint_index;
316 jCol[nz_index] = n_index;
319 iRow[nz_index] = constraint_index;
320 jCol[nz_index] = n_index + 2;
325 for (
int k = 0; k < current_edges_num; ++k) {
326 iRow[nz_index] = constraint_index + 1;
327 jCol[nz_index] = l_index + k;
332 iRow[nz_index] = constraint_index + 1;
333 jCol[nz_index] = n_index + 1;
336 iRow[nz_index] = constraint_index + 1;
337 jCol[nz_index] = n_index + 3;
342 for (
int k = 0; k < current_edges_num; ++k) {
343 iRow[nz_index] = constraint_index + 2;
344 jCol[nz_index] = l_index + k;
349 for (
int k = 0; k < 4; ++k) {
350 iRow[nz_index] = constraint_index + 2;
351 jCol[nz_index] = n_index + k;
356 l_index += current_edges_num;
358 constraint_index += 3;
362 l_index = l_start_index_;
363 n_index = n_start_index_;
364 for (
int i = 0; i < lambda_horizon_; ++i) {
365 iRow[nz_index] = constraint_index;
366 jCol[nz_index] = l_index;
371 for (
int i = 0; i < miu_horizon_; ++i) {
372 iRow[nz_index] = constraint_index;
373 jCol[nz_index] = n_index;
379 CHECK_EQ(constraint_index, m) <<
"No. of constraints wrong in eval_jac_g.";
381 ADEBUG <<
"nz_index here : " << nz_index <<
" nele_jac is : " << nele_jac;
383 std::fill(values, values + nele_jac, 0.0);
389 int l_index = l_start_index_;
390 int n_index = n_start_index_;
392 for (
int i = 0; i < horizon_ + 1; ++i) {
393 int edges_counter = 0;
394 for (
int j = 0; j < obstacles_num_; ++j) {
395 int current_edges_num = obstacles_edges_num_(j, 0);
396 Eigen::MatrixXd Aj = obstacles_A_.block(edges_counter, 0, current_edges_num, 2);
397 Eigen::MatrixXd bj = obstacles_b_.block(edges_counter, 0, current_edges_num, 1);
401 for (
int k = 0; k < current_edges_num; ++k) {
403 tmp1 += Aj(k, 0) * x[l_index + k];
404 tmp2 += Aj(k, 1) * x[l_index + k];
409 for (
int k = 0; k < current_edges_num; ++k) {
410 values[nz_index] = std::cos(xWS_(2, i)) * Aj(k, 0) + std::sin(xWS_(2, i)) * Aj(k, 1);
415 values[nz_index] = 1.0;
418 values[nz_index] = -1.0;
421 ADEBUG <<
"eval_jac_g, after adding part 2";
425 for (
int k = 0; k < current_edges_num; ++k) {
426 values[nz_index] = -std::sin(xWS_(2, i)) * Aj(k, 0) + std::cos(xWS_(2, i)) * Aj(k, 1);
431 values[nz_index] = 1.0;
434 values[nz_index] = -1.0;
441 for (
int k = 0; k < 4; ++k) {
442 tmp3 += -g_[k] * x[n_index + k];
445 for (
int k = 0; k < current_edges_num; ++k) {
446 tmp4 += bj(k, 0) * x[l_index + k];
450 for (
int k = 0; k < current_edges_num; ++k) {
451 values[nz_index] = (xWS_(0, i) + std::cos(xWS_(2, i)) * offset_) * Aj(k, 0)
452 + (xWS_(1, i) + std::sin(xWS_(2, i)) * offset_) * Aj(k, 1) - bj(k, 0);
457 for (
int k = 0; k < 4; ++k) {
458 values[nz_index] = -g_[k];
463 edges_counter += current_edges_num;
464 l_index += current_edges_num;
469 for (
int i = 0; i < lambda_horizon_; ++i) {
470 values[nz_index] = 1.0;
473 for (
int i = 0; i < miu_horizon_; ++i) {
474 values[nz_index] = 1.0;
478 ADEBUG <<
"eval_jac_g, fulfilled obstacle constraint values";
479 CHECK_EQ(nz_index, nele_jac);
482 ADEBUG <<
"eval_jac_g done";
570 const Eigen::MatrixXd& l_warm_up,
571 const Eigen::MatrixXd& n_warm_up) {
573 int kNumVariables = num_of_variables_;
574 double x[kNumVariables];
575 int variable_index = 0;
578 for (
int i = 0; i < horizon_ + 1; ++i) {
579 for (
int j = 0; j < obstacles_edges_sum_; ++j) {
580 x[variable_index] = l_warm_up(j, i);
586 for (
int i = 0; i < horizon_ + 1; ++i) {
587 for (
int j = 0; j < 4 * obstacles_num_; ++j) {
588 x[variable_index] = n_warm_up(j, i);
594 int kNumConstraint = num_of_constraints_;
595 double g[kNumConstraint];
596 eval_g(num_of_variables_, x,
true, num_of_constraints_, g);
599 double x_l[kNumVariables];
600 double x_u[kNumVariables];
601 double g_l[kNumConstraint];
602 double g_u[kNumConstraint];
603 get_bounds_info(num_of_variables_, x_l, x_u, num_of_constraints_, g_l, g_u);
606 int constraint_index = 0;
608 for (
int i = 0; i < horizon_ + 1; ++i) {
609 for (
int j = 0; j < obstacles_num_; ++j) {
611 if (g_l[constraint_index + 0] > g[constraint_index + 0]
612 || g_u[constraint_index + 0] < g[constraint_index + 0]) {
613 AERROR <<
"G' * mu + R' * A * lambda == 0 constraint fails, "
614 <<
"constraint_index: " << constraint_index + 0 <<
", g: " << g[constraint_index + 0];
617 if (g_l[constraint_index + 1] > g[constraint_index + 1]
618 || g_u[constraint_index + 1] < g[constraint_index + 1]) {
619 AERROR <<
"G' * mu + R' * A * lambda == 0 constraint fails, "
620 <<
"constraint_index: " << constraint_index + 1 <<
", g: " << g[constraint_index + 1];
624 if (g_l[constraint_index + 2] > g[constraint_index + 2]
625 || g_u[constraint_index + 2] < g[constraint_index + 2]) {
626 AERROR <<
"-g' * mu + (A * t - b) * lambda) >= d_min constraint fails, "
627 <<
"constraint_index: " << constraint_index + 2 <<
", g: " << g[constraint_index + 2];
631 constraint_index += 3;
635 for (
int i = 0; i < lambda_horizon_; ++i) {
636 if (g_l[constraint_index] > g[constraint_index] || g_u[constraint_index] < g[constraint_index]) {
637 AERROR <<
"lambda box constraint fails, "
638 <<
"constraint_index: " << constraint_index <<
", g: " << g[constraint_index];
644 for (
int i = 0; i < miu_horizon_; ++i) {
645 if (g_l[constraint_index] > g[constraint_index] || g_u[constraint_index] < g[constraint_index]) {
646 AERROR <<
"miu box constraint fails, "
647 <<
"constraint_index: " << constraint_index <<
", g: " << g[constraint_index];
659 int l_index = l_start_index_;
660 for (
int i = 0; i < horizon_ + 1; ++i) {
661 int edges_counter = 0;
663 for (
int j = 0; j < obstacles_num_; ++j) {
664 int current_edges_num = obstacles_edges_num_(j, 0);
665 Eigen::MatrixXd Aj = obstacles_A_.block(edges_counter, 0, current_edges_num, 2);
666 Eigen::MatrixXd bj = obstacles_b_.block(edges_counter, 0, current_edges_num, 1);
671 for (
int k = 0; k < current_edges_num; ++k) {
672 tmp1 += Aj(k, 0) * x[l_index + k];
673 tmp2 += Aj(k, 1) * x[l_index + k];
675 *obj_value += tmp1 * tmp1 + tmp2 * tmp2;
678 edges_counter += current_edges_num;
679 l_index += current_edges_num;
689 ADEBUG <<
"eval_constraints";
695 int l_index = l_start_index_;
696 int n_index = n_start_index_;
697 int constraint_index = 0;
699 for (
int i = 0; i < horizon_ + 1; ++i) {
700 int edges_counter = 0;
702 for (
int j = 0; j < obstacles_num_; ++j) {
703 int current_edges_num = obstacles_edges_num_(j, 0);
704 Eigen::MatrixXd Aj = obstacles_A_.block(edges_counter, 0, current_edges_num, 2);
705 Eigen::MatrixXd bj = obstacles_b_.block(edges_counter, 0, current_edges_num, 1);
710 for (
int k = 0; k < current_edges_num; ++k) {
711 tmp1 += Aj(k, 0) * x[l_index + k];
712 tmp2 += Aj(k, 1) * x[l_index + k];
716 g[constraint_index + 0] = x[n_index] - x[n_index + 2] + cos(xWS_(2, i)) * tmp1 + sin(xWS_(2, i)) * tmp2;
718 g[constraint_index + 1] = x[n_index + 1] - x[n_index + 3] - sin(xWS_(2, i)) * tmp1 + cos(xWS_(2, i)) * tmp2;
722 for (
int k = 0; k < 4; ++k) {
723 tmp3 += g_[k] * x[n_index + k];
727 for (
int k = 0; k < current_edges_num; ++k) {
728 tmp4 += bj(k, 0) * x[l_index + k];
731 g[constraint_index + 2] = -tmp3 + (xWS_(0, i) + cos(xWS_(2, i)) * offset_) * tmp1
732 + (xWS_(1, i) + sin(xWS_(2, i)) * offset_) * tmp2 - tmp4;
735 edges_counter += current_edges_num;
736 l_index += current_edges_num;
738 constraint_index += 3;
741 l_index = l_start_index_;
742 n_index = n_start_index_;
743 for (
int i = 0; i < lambda_horizon_; ++i) {
744 g[constraint_index] = x[l_index];
748 for (
int i = 0; i < miu_horizon_; ++i) {
749 g[constraint_index] = x[n_index];
754 CHECK_EQ(constraint_index, m) <<
"No. of constraints wrong in eval_g. n : " << n;
760 std::vector<double> xp(n);
761 std::vector<double> lamp(m);
762 std::vector<double> zl(m);
763 std::vector<double> zu(m);
765 std::vector<adouble> xa(n);
766 std::vector<adouble> g(m);
767 std::vector<double> lam(m);
774 obj_lam =
new double[m + 1];
800 for (
int idx = 0; idx < n; idx++) {
803 for (
int idx = 0; idx < m; idx++) {
810 obj_value *= mkparam(sig);
813 for (
int idx = 0; idx < m; idx++) {
814 obj_value += g[idx] * mkparam(lam[idx]);
829 sparse_hess(
tag_L, n, 0, &xp[0], &nnz_L, &rind_L, &cind_L, &hessval, options_L);