33 size_t horizon,
double ts,
const Eigen::MatrixXd& ego,
34 const Eigen::MatrixXi& obstacles_edges_num,
const size_t obstacles_num,
35 const Eigen::MatrixXd& obstacles_A,
const Eigen::MatrixXd& obstacles_b,
36 const Eigen::MatrixXd& xWS,
40 obstacles_edges_num_(obstacles_edges_num),
41 obstacles_A_(obstacles_A),
42 obstacles_b_(obstacles_b),
44 ACHECK(horizon < std::numeric_limits<int>::max())
45 <<
"Invalid cast on horizon in open space planner";
46 horizon_ =
static_cast<int>(horizon);
47 ACHECK(obstacles_num < std::numeric_limits<int>::max())
48 <<
"Invalid cast on obstacles_num in open space planner";
49 obstacles_num_ =
static_cast<int>(obstacles_num);
50 w_ev_ = ego_(1, 0) + ego_(3, 0);
51 l_ev_ = ego_(0, 0) + ego_(2, 0);
52 g_ = {l_ev_ / 2, w_ev_ / 2, l_ev_ / 2, w_ev_ / 2};
53 offset_ = (ego_(0, 0) + ego_(2, 0)) / 2 - ego_(2, 0);
54 obstacles_edges_sum_ = obstacles_edges_num_.sum();
56 n_start_index_ = l_start_index_ + obstacles_edges_sum_ * (horizon_ + 1);
57 d_start_index_ = n_start_index_ + 4 * obstacles_num_ * (horizon_ + 1);
58 l_warm_up_ = Eigen::MatrixXd::Zero(obstacles_edges_sum_, horizon_ + 1);
59 n_warm_up_ = Eigen::MatrixXd::Zero(4 * obstacles_num_, horizon_ + 1);
145 int variable_index = 0;
148 for (
int i = 0; i < horizon_ + 1; ++i) {
149 for (
int j = 0; j < obstacles_edges_sum_; ++j) {
150 x_l[variable_index] = -2e19;
151 x_u[variable_index] = 2e19;
155 ADEBUG <<
"variable_index after adding lagrange l : " << variable_index;
158 for (
int i = 0; i < horizon_ + 1; ++i) {
159 for (
int j = 0; j < 4 * obstacles_num_; ++j) {
160 x_l[variable_index] = -2e19;
161 x_u[variable_index] = 2e19;
165 ADEBUG <<
"variable_index after adding lagrange n : " << variable_index;
168 for (
int i = 0; i < horizon_ + 1; ++i) {
169 for (
int j = 0; j < obstacles_num_; ++j) {
171 x_l[variable_index] = -2e19;
172 x_u[variable_index] = 2e19;
176 ADEBUG <<
"variable_index after adding d : " << variable_index;
178 int constraint_index = 0;
179 for (
int i = 0; i < horizon_ + 1; ++i) {
180 for (
int j = 0; j < obstacles_num_; ++j) {
182 g_l[constraint_index] = -2e19;
183 g_u[constraint_index] = 1.0;
186 g_l[constraint_index + 1] = 0.0;
187 g_u[constraint_index + 1] = 0.0;
188 g_l[constraint_index + 2] = 0.0;
189 g_u[constraint_index + 2] = 0.0;
192 g_l[constraint_index + 3] = 0.0;
193 g_u[constraint_index + 3] = 0.0;
194 constraint_index += 4;
198 int l_index = l_start_index_;
199 int n_index = n_start_index_;
200 int d_index = d_start_index_;
202 for (
int i = 0; i < lambda_horizon_; ++i) {
203 g_l[constraint_index] = 0.0;
204 g_u[constraint_index] = 2e19;
208 for (
int i = 0; i < miu_horizon_; ++i) {
209 g_l[constraint_index] = 0.0;
210 g_u[constraint_index] = 2e19;
214 for (
int i = 0; i < dual_formulation_horizon_; ++i) {
215 g_l[constraint_index] = 0.0;
216 g_u[constraint_index] = 2e19;
221 ADEBUG <<
"constraint_index after adding obstacles constraints: "
258 int nele_jac,
int* iRow,
281 if (values ==
nullptr) {
283 int constraint_index = 0;
288 int l_index = l_start_index_;
289 int n_index = n_start_index_;
290 int d_index = d_start_index_;
291 for (
int i = 0; i < horizon_ + 1; ++i) {
292 for (
int j = 0; j < obstacles_num_; ++j) {
293 int current_edges_num = obstacles_edges_num_(j, 0);
296 for (
int k = 0; k < current_edges_num; ++k) {
298 iRow[nz_index] = constraint_index;
299 jCol[nz_index] = l_index + k;
305 for (
int k = 0; k < current_edges_num; ++k) {
306 iRow[nz_index] = constraint_index + 1;
307 jCol[nz_index] = l_index + k;
312 iRow[nz_index] = constraint_index + 1;
313 jCol[nz_index] = n_index;
316 iRow[nz_index] = constraint_index + 1;
317 jCol[nz_index] = n_index + 2;
322 for (
int k = 0; k < current_edges_num; ++k) {
323 iRow[nz_index] = constraint_index + 2;
324 jCol[nz_index] = l_index + k;
329 iRow[nz_index] = constraint_index + 2;
330 jCol[nz_index] = n_index + 1;
333 iRow[nz_index] = constraint_index + 2;
334 jCol[nz_index] = n_index + 3;
339 for (
int k = 0; k < current_edges_num; ++k) {
340 iRow[nz_index] = constraint_index + 3;
341 jCol[nz_index] = l_index + k;
346 for (
int k = 0; k < 4; ++k) {
347 iRow[nz_index] = constraint_index + 3;
348 jCol[nz_index] = n_index + k;
353 iRow[nz_index] = constraint_index + 3;
354 jCol[nz_index] = d_index;
358 l_index += current_edges_num;
361 constraint_index += 4;
365 l_index = l_start_index_;
366 n_index = n_start_index_;
367 d_index = d_start_index_;
368 for (
int i = 0; i < lambda_horizon_; ++i) {
369 iRow[nz_index] = constraint_index;
370 jCol[nz_index] = l_index;
375 for (
int i = 0; i < miu_horizon_; ++i) {
376 iRow[nz_index] = constraint_index;
377 jCol[nz_index] = n_index;
382 for (
int i = 0; i < dual_formulation_horizon_; ++i) {
383 iRow[nz_index] = constraint_index;
384 jCol[nz_index] = d_index;
390 CHECK_EQ(constraint_index, m) <<
"No. of constraints wrong in eval_jac_g.";
392 ADEBUG <<
"nz_index here : " << nz_index <<
" nele_jac is : " << nele_jac;
394 std::fill(values, values + nele_jac, 0.0);
400 int l_index = l_start_index_;
401 int n_index = n_start_index_;
403 for (
int i = 0; i < horizon_ + 1; ++i) {
404 int edges_counter = 0;
405 for (
int j = 0; j < obstacles_num_; ++j) {
406 int current_edges_num = obstacles_edges_num_(j, 0);
408 obstacles_A_.block(edges_counter, 0, current_edges_num, 2);
410 obstacles_b_.block(edges_counter, 0, current_edges_num, 1);
415 for (
int k = 0; k < current_edges_num; ++k) {
417 tmp1 += Aj(k, 0) * x[l_index + k];
418 tmp2 += Aj(k, 1) * x[l_index + k];
422 for (
int k = 0; k < current_edges_num; ++k) {
425 2 * tmp1 * Aj(k, 0) + 2 * tmp2 * Aj(k, 1);
432 for (
int k = 0; k < current_edges_num; ++k) {
433 values[nz_index] = std::cos(xWS_(2, i)) * Aj(k, 0) +
434 std::sin(xWS_(2, i)) * Aj(k, 1);
439 values[nz_index] = 1.0;
442 values[nz_index] = -1.0;
445 ADEBUG <<
"eval_jac_g, after adding part 2";
449 for (
int k = 0; k < current_edges_num; ++k) {
450 values[nz_index] = -std::sin(xWS_(2, i)) * Aj(k, 0) +
451 std::cos(xWS_(2, i)) * Aj(k, 1);
456 values[nz_index] = 1.0;
459 values[nz_index] = -1.0;
466 for (
int k = 0; k < 4; ++k) {
467 tmp3 += -g_[k] * x[n_index + k];
470 for (
int k = 0; k < current_edges_num; ++k) {
471 tmp4 += bj(k, 0) * x[l_index + k];
475 for (
int k = 0; k < current_edges_num; ++k) {
477 -(xWS_(0, i) + std::cos(xWS_(2, i)) * offset_) * Aj(k, 0) -
478 (xWS_(1, i) + std::sin(xWS_(2, i)) * offset_) * Aj(k, 1) +
484 for (
int k = 0; k < 4; ++k) {
485 values[nz_index] = g_[k];
490 values[nz_index] = 1.0;
494 edges_counter += current_edges_num;
495 l_index += current_edges_num;
500 for (
int i = 0; i < lambda_horizon_; ++i) {
501 values[nz_index] = 1.0;
504 for (
int i = 0; i < miu_horizon_; ++i) {
505 values[nz_index] = 1.0;
508 for (
int i = 0; i < dual_formulation_horizon_; ++i) {
509 values[nz_index] = 1.0;
513 ADEBUG <<
"eval_jac_g, fulfilled obstacle constraint values";
514 CHECK_EQ(nz_index, nele_jac);
517 ADEBUG <<
"eval_jac_g done";
612 ADEBUG <<
"eval_constraints";
618 int l_index = l_start_index_;
619 int n_index = n_start_index_;
620 int d_index = d_start_index_;
621 int constraint_index = 0;
623 for (
int i = 0; i < horizon_ + 1; ++i) {
624 int edges_counter = 0;
626 for (
int j = 0; j < obstacles_num_; ++j) {
627 int current_edges_num = obstacles_edges_num_(j, 0);
629 obstacles_A_.block(edges_counter, 0, current_edges_num, 2);
631 obstacles_b_.block(edges_counter, 0, current_edges_num, 1);
636 for (
int k = 0; k < current_edges_num; ++k) {
637 tmp1 += Aj(k, 0) * x[l_index + k];
638 tmp2 += Aj(k, 1) * x[l_index + k];
640 g[constraint_index] = tmp1 * tmp1 + tmp2 * tmp2;
643 g[constraint_index + 1] = x[n_index] - x[n_index + 2] +
644 cos(xWS_(2, i)) * tmp1 + sin(xWS_(2, i)) * tmp2;
646 g[constraint_index + 2] = x[n_index + 1] - x[n_index + 3] -
647 sin(xWS_(2, i)) * tmp1 + cos(xWS_(2, i)) * tmp2;
652 for (
int k = 0; k < 4; ++k) {
653 tmp3 += g_[k] * x[n_index + k];
657 for (
int k = 0; k < current_edges_num; ++k) {
658 tmp4 += bj(k, 0) * x[l_index + k];
661 g[constraint_index + 3] =
662 x[d_index] + tmp3 - (xWS_(0, i) + cos(xWS_(2, i)) * offset_) * tmp1 -
663 (xWS_(1, i) + sin(xWS_(2, i)) * offset_) * tmp2 + tmp4;
666 edges_counter += current_edges_num;
667 l_index += current_edges_num;
670 constraint_index += 4;
673 l_index = l_start_index_;
674 n_index = n_start_index_;
675 d_index = d_start_index_;
676 for (
int i = 0; i < lambda_horizon_; ++i) {
677 g[constraint_index] = x[l_index];
681 for (
int i = 0; i < miu_horizon_; ++i) {
682 g[constraint_index] = x[n_index];
686 for (
int i = 0; i < dual_formulation_horizon_; ++i) {
687 g[constraint_index] = x[d_index];
692 CHECK_EQ(constraint_index, m)
693 <<
"No. of constraints wrong in eval_g. n : " << n;
700 std::vector<double> xp(n);
701 std::vector<double> lamp(m);
702 std::vector<double> zl(m);
703 std::vector<double> zu(m);
705 std::vector<adouble> xa(n);
706 std::vector<adouble> g(m);
707 std::vector<double> lam(m);
713 obj_lam =
new double[m + 1];
739 for (
int idx = 0; idx < n; idx++) {
742 for (
int idx = 0; idx < m; idx++) {
749 obj_value *= mkparam(sig);
752 for (
int idx = 0; idx < m; idx++) {
753 obj_value += g[idx] * mkparam(lam[idx]);
768 sparse_hess(
tag_L, n, 0, &xp[0], &nnz_L, &rind_L, &cind_L, &hessval,