260 {
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
280
281 if (values == nullptr) {
282 int nz_index = 0;
283 int constraint_index = 0;
284
285
286
287
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);
294
295
296 for (int k = 0; k < current_edges_num; ++k) {
297
298 iRow[nz_index] = constraint_index;
299 jCol[nz_index] = l_index + k;
300 ++nz_index;
301 }
302
303
304
305 for (int k = 0; k < current_edges_num; ++k) {
306 iRow[nz_index] = constraint_index + 1;
307 jCol[nz_index] = l_index + k;
308 ++nz_index;
309 }
310
311
312 iRow[nz_index] = constraint_index + 1;
313 jCol[nz_index] = n_index;
314 ++nz_index;
315
316 iRow[nz_index] = constraint_index + 1;
317 jCol[nz_index] = n_index + 2;
318 ++nz_index;
319
320
321
322 for (int k = 0; k < current_edges_num; ++k) {
323 iRow[nz_index] = constraint_index + 2;
324 jCol[nz_index] = l_index + k;
325 ++nz_index;
326 }
327
328
329 iRow[nz_index] = constraint_index + 2;
330 jCol[nz_index] = n_index + 1;
331 ++nz_index;
332
333 iRow[nz_index] = constraint_index + 2;
334 jCol[nz_index] = n_index + 3;
335 ++nz_index;
336
337
338
339 for (int k = 0; k < current_edges_num; ++k) {
340 iRow[nz_index] = constraint_index + 3;
341 jCol[nz_index] = l_index + k;
342 ++nz_index;
343 }
344
345
346 for (int k = 0; k < 4; ++k) {
347 iRow[nz_index] = constraint_index + 3;
348 jCol[nz_index] = n_index + k;
349 ++nz_index;
350 }
351
352
353 iRow[nz_index] = constraint_index + 3;
354 jCol[nz_index] = d_index;
355 ++nz_index;
356
357
358 l_index += current_edges_num;
359 n_index += 4;
360 d_index += 1;
361 constraint_index += 4;
362 }
363 }
364
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;
371 ++nz_index;
372 ++constraint_index;
373 ++l_index;
374 }
375 for (int i = 0; i < miu_horizon_; ++i) {
376 iRow[nz_index] = constraint_index;
377 jCol[nz_index] = n_index;
378 ++nz_index;
379 ++constraint_index;
380 ++n_index;
381 }
382 for (int i = 0; i < dual_formulation_horizon_; ++i) {
383 iRow[nz_index] = constraint_index;
384 jCol[nz_index] = d_index;
385 ++nz_index;
386 ++constraint_index;
387 ++d_index;
388 }
389
390 CHECK_EQ(constraint_index, m) << "No. of constraints wrong in eval_jac_g.";
391
392 ADEBUG <<
"nz_index here : " << nz_index <<
" nele_jac is : " << nele_jac;
393 } else {
394 std::fill(values, values + nele_jac, 0.0);
395 int nz_index = 0;
396
397
398
399
400 int l_index = l_start_index_;
401 int n_index = n_start_index_;
402
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);
407 Eigen::MatrixXd Aj =
408 obstacles_A_.block(edges_counter, 0, current_edges_num, 2);
409 Eigen::MatrixXd bj =
410 obstacles_b_.block(edges_counter, 0, current_edges_num, 1);
411
412
413 double tmp1 = 0;
414 double tmp2 = 0;
415 for (int k = 0; k < current_edges_num; ++k) {
416
417 tmp1 += Aj(k, 0) * x[l_index + k];
418 tmp2 += Aj(k, 1) * x[l_index + k];
419 }
420
421
422 for (int k = 0; k < current_edges_num; ++k) {
423
424 values[nz_index] =
425 2 * tmp1 * Aj(k, 0) + 2 * tmp2 * Aj(k, 1);
426 ++nz_index;
427 }
428
429
430
431
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);
435 ++nz_index;
436 }
437
438
439 values[nz_index] = 1.0;
440 ++nz_index;
441
442 values[nz_index] = -1.0;
443 ++nz_index;
444
445 ADEBUG <<
"eval_jac_g, after adding part 2";
446
447
448
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);
452 ++nz_index;
453 }
454
455
456 values[nz_index] = 1.0;
457 ++nz_index;
458
459 values[nz_index] = -1.0;
460 ++nz_index;
461
462
463
464 double tmp3 = 0.0;
465 double tmp4 = 0.0;
466 for (int k = 0; k < 4; ++k) {
467 tmp3 += -g_[k] * x[n_index + k];
468 }
469
470 for (int k = 0; k < current_edges_num; ++k) {
471 tmp4 += bj(k, 0) * x[l_index + k];
472 }
473
474
475 for (int k = 0; k < current_edges_num; ++k) {
476 values[nz_index] =
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) +
479 bj(k, 0);
480 ++nz_index;
481 }
482
483
484 for (int k = 0; k < 4; ++k) {
485 values[nz_index] = g_[k];
486 ++nz_index;
487 }
488
489
490 values[nz_index] = 1.0;
491 ++nz_index;
492
493
494 edges_counter += current_edges_num;
495 l_index += current_edges_num;
496 n_index += 4;
497 }
498 }
499
500 for (int i = 0; i < lambda_horizon_; ++i) {
501 values[nz_index] = 1.0;
502 ++nz_index;
503 }
504 for (int i = 0; i < miu_horizon_; ++i) {
505 values[nz_index] = 1.0;
506 ++nz_index;
507 }
508 for (int i = 0; i < dual_formulation_horizon_; ++i) {
509 values[nz_index] = 1.0;
510 ++nz_index;
511 }
512
513 ADEBUG <<
"eval_jac_g, fulfilled obstacle constraint values";
514 CHECK_EQ(nz_index, nele_jac);
515 }
516
517 ADEBUG <<
"eval_jac_g done";
518 return true;
519}