29 #include <corbo-optimal-control/structured_ocp/discretization_grids/full_discretization_grid.h>
37 #include "gtest/gtest.h"
39 using corbo::FullDiscretizationGrid;
61 FullDiscretizationGrid
grid;
66 Eigen::Vector2d x0(0, 5);
68 Eigen::Vector2d u0(0, 0);
73 grid.setHorizon(num_states, dt);
74 grid.initialize(x0, x0, u0);
77 grid.getShootingNodeTimeSeries(sn);
78 EXPECT_DOUBLE_EQ(sn->getValueDimension(), 2);
79 EXPECT_DOUBLE_EQ(sn->getTimeDimension(), 5);
81 Eigen::MatrixXd s_seq = sn->getValuesMatrixView();
83 EXPECT_DOUBLE_EQ(s_seq(0, 0), 0.0);
84 EXPECT_DOUBLE_EQ(s_seq(1, 0), 5.0);
85 EXPECT_DOUBLE_EQ(s_seq(0, 1), 0.0);
86 EXPECT_DOUBLE_EQ(s_seq(1, 1), 5.0);
87 EXPECT_DOUBLE_EQ(s_seq(0, 2), 0.0);
88 EXPECT_DOUBLE_EQ(s_seq(1, 2), 5.0);
89 EXPECT_DOUBLE_EQ(s_seq(0, 3), 0.0);
90 EXPECT_DOUBLE_EQ(s_seq(1, 3), 5.0);
91 EXPECT_DOUBLE_EQ(s_seq(0, 4), 0.0);
92 EXPECT_DOUBLE_EQ(s_seq(1, 4), 5.0);
95 grid.getControlInputTimeSeries(un);
96 EXPECT_DOUBLE_EQ(un->getValueDimension(), 2);
97 EXPECT_DOUBLE_EQ(un->getTimeDimension(), 5);
99 Eigen::MatrixXd u_seq = un->getValuesMatrixView();
100 EXPECT_TRUE(u_seq.isZero()) << u_seq;
103 EXPECT_TRUE(grid.getShootingIntervals()[0].shooting_node->isFixed());
104 for (
int i = 1; i < (
int)grid.getShootingIntervals().size(); ++i)
106 EXPECT_FALSE(grid.getShootingIntervals()[i].shooting_node->isFixed());
112 Eigen::Vector2d x0(0, 5);
113 Eigen::Vector2d xf(5, 0);
115 Eigen::Vector2d u0(0, 0);
120 grid.setHorizon(num_states, dt);
121 grid.initialize(x0, xf, u0);
124 grid.getShootingNodeTimeSeries(sn);
125 EXPECT_DOUBLE_EQ(sn->getValueDimension(), 2);
126 EXPECT_DOUBLE_EQ(sn->getTimeDimension(), 5);
128 Eigen::MatrixXd s_seq = sn->getValuesMatrixView();
130 EXPECT_DOUBLE_EQ(s_seq(0, 0), 0.0);
131 EXPECT_DOUBLE_EQ(s_seq(1, 0), 5.0);
132 EXPECT_DOUBLE_EQ(s_seq(0, 1), 1.25);
133 EXPECT_DOUBLE_EQ(s_seq(1, 1), 3.75);
134 EXPECT_DOUBLE_EQ(s_seq(0, 2), 2.5);
135 EXPECT_DOUBLE_EQ(s_seq(1, 2), 2.5);
136 EXPECT_DOUBLE_EQ(s_seq(0, 3), 3.75);
137 EXPECT_DOUBLE_EQ(s_seq(1, 3), 1.25);
138 EXPECT_DOUBLE_EQ(s_seq(0, 4), 5.0);
139 EXPECT_DOUBLE_EQ(s_seq(1, 4), 0.0);
142 grid.getControlInputTimeSeries(un);
143 EXPECT_DOUBLE_EQ(un->getValueDimension(), 2);
144 EXPECT_DOUBLE_EQ(un->getTimeDimension(), 5);
146 Eigen::MatrixXd u_seq = un->getValuesMatrixView();
147 EXPECT_TRUE(u_seq.isZero()) << u_seq;
150 EXPECT_TRUE(grid.getShootingIntervals()[0].shooting_node->isFixed());
151 for (
int i = 1; i < (
int)grid.getShootingIntervals().size(); ++i)
153 EXPECT_FALSE(grid.getShootingIntervals()[i].shooting_node->isFixed());
159 Eigen::Vector2d x0(0, 5);
160 Eigen::Vector2d xf(5, 0);
162 Eigen::Vector2d u0(0, 0);
167 grid.setHorizon(num_states, dt);
168 grid.initialize(x0, xf, u0);
170 grid.pruneTrajectory(Eigen::Vector2d(2.4, 2.4));
173 grid.getShootingNodeTimeSeries(sn);
174 EXPECT_DOUBLE_EQ(sn->getValueDimension(), 2);
175 EXPECT_DOUBLE_EQ(sn->getTimeDimension(), 3);
177 Eigen::MatrixXd s_seq = sn->getValuesMatrixView();
180 EXPECT_DOUBLE_EQ(s_seq(0, 0), 2.4);
181 EXPECT_DOUBLE_EQ(s_seq(1, 0), 2.4);
182 EXPECT_DOUBLE_EQ(s_seq(0, 1), 3.75);
183 EXPECT_DOUBLE_EQ(s_seq(1, 1), 1.25);
184 EXPECT_DOUBLE_EQ(s_seq(0, 2), 5.0);
185 EXPECT_DOUBLE_EQ(s_seq(1, 2), 0.0);
188 grid.getControlInputTimeSeries(un);
189 EXPECT_DOUBLE_EQ(un->getValueDimension(), 2);
190 EXPECT_DOUBLE_EQ(un->getTimeDimension(), 3);
192 Eigen::MatrixXd u_seq = un->getValuesMatrixView();
193 EXPECT_TRUE(u_seq.isZero()) << u_seq;
196 EXPECT_TRUE(grid.getShootingIntervals()[0].shooting_node->isFixed());
197 for (
int i = 1; i < (
int)grid.getShootingIntervals().size(); ++i)
199 EXPECT_FALSE(grid.getShootingIntervals()[i].shooting_node->isFixed());
205 Eigen::Vector2d x0(0, 5);
206 Eigen::Vector2d xf(5, 0);
208 Eigen::Vector2d u0(0, 0);
213 grid.setHorizon(num_states, dt);
214 grid.initialize(x0, xf, u0);
217 grid.pruneTrajectory(xf);
220 grid.getShootingNodeTimeSeries(sn);
221 EXPECT_DOUBLE_EQ(sn->getValueDimension(), 2);
222 EXPECT_DOUBLE_EQ(sn->getTimeDimension(), 2);
224 Eigen::MatrixXd s_seq = sn->getValuesMatrixView();
227 EXPECT_DOUBLE_EQ(s_seq(0, 0), 5.0);
228 EXPECT_DOUBLE_EQ(s_seq(1, 0), 0.0);
229 EXPECT_DOUBLE_EQ(s_seq(0, 1), 5.0);
230 EXPECT_DOUBLE_EQ(s_seq(1, 1), 0.0);
233 grid.getControlInputTimeSeries(un);
234 EXPECT_DOUBLE_EQ(un->getValueDimension(), 2);
235 EXPECT_DOUBLE_EQ(un->getTimeDimension(), 2);
237 Eigen::MatrixXd u_seq = un->getValuesMatrixView();
238 EXPECT_TRUE(u_seq.isZero()) << u_seq;
241 EXPECT_TRUE(grid.getShootingIntervals()[0].shooting_node->isFixed());
242 for (
int i = 1; i < (
int)grid.getShootingIntervals().size(); ++i)
244 EXPECT_FALSE(grid.getShootingIntervals()[i].shooting_node->isFixed());
250 Eigen::Vector2d x0(0, 5);
251 Eigen::Vector2d xf(5, 0);
253 Eigen::Vector2d u0(0, 0);
258 grid.setHorizon(num_states, dt);
259 grid.initialize(x0, xf, u0);
261 grid.extrapolateTrajectory(2);
264 grid.getShootingNodeTimeSeries(sn);
265 EXPECT_DOUBLE_EQ(sn->getValueDimension(), 2);
266 EXPECT_DOUBLE_EQ(sn->getTimeDimension(), 7);
268 Eigen::MatrixXd s_seq = sn->getValuesMatrixView();
270 EXPECT_DOUBLE_EQ(s_seq(0, 0), 0.0);
271 EXPECT_DOUBLE_EQ(s_seq(1, 0), 5.0);
272 EXPECT_DOUBLE_EQ(s_seq(0, 1), 1.25);
273 EXPECT_DOUBLE_EQ(s_seq(1, 1), 3.75);
274 EXPECT_DOUBLE_EQ(s_seq(0, 2), 2.5);
275 EXPECT_DOUBLE_EQ(s_seq(1, 2), 2.5);
276 EXPECT_DOUBLE_EQ(s_seq(0, 3), 3.75);
277 EXPECT_DOUBLE_EQ(s_seq(1, 3), 1.25);
278 EXPECT_DOUBLE_EQ(s_seq(0, 4), 5.0);
279 EXPECT_DOUBLE_EQ(s_seq(1, 4), 0.0);
280 EXPECT_DOUBLE_EQ(s_seq(0, 5), 6.25);
281 EXPECT_DOUBLE_EQ(s_seq(1, 5), -1.25);
282 EXPECT_DOUBLE_EQ(s_seq(0, 6), 7.5);
283 EXPECT_DOUBLE_EQ(s_seq(1, 6), -2.5);
286 grid.getControlInputTimeSeries(un);
287 EXPECT_DOUBLE_EQ(un->getValueDimension(), 2);
288 EXPECT_DOUBLE_EQ(un->getTimeDimension(), 7);
290 Eigen::MatrixXd u_seq = un->getValuesMatrixView();
291 EXPECT_TRUE(u_seq.isZero()) << u_seq;
294 EXPECT_TRUE(grid.getShootingIntervals()[0].shooting_node->isFixed());
295 for (
int i = 1; i < (
int)grid.getShootingIntervals().size(); ++i)
297 EXPECT_FALSE(grid.getShootingIntervals()[i].shooting_node->isFixed());
303 Eigen::Vector2d x0(0, 0);
304 Eigen::Vector2d xf(1, -1);
305 Eigen::Vector2d u0(0, 0);
310 grid.setSingleDt(
true);
312 grid.setHorizon(num_states, dt);
313 grid.initialize(x0, xf, u0);
316 grid.resampleTrajectory(5);
320 grid.getShootingNodeTimeSeries(sn);
321 EXPECT_DOUBLE_EQ(sn->getValueDimension(), 2);
322 EXPECT_DOUBLE_EQ(sn->getTimeDimension(), 5);
323 Eigen::MatrixXd s_seq = sn->getValuesMatrixView();
326 for (
int i = 0; i < s_seq.cols(); ++i)
328 EXPECT_DOUBLE_EQ(x0[0] + (
double)i * (xf[0] - x0[0]) / 4.0, s_seq(0, i));
329 EXPECT_DOUBLE_EQ(x0[1] + (
double)i * (xf[1] - x0[1]) / 4.0, s_seq(1, i));
334 grid.getControlInputTimeSeries(un);
335 EXPECT_DOUBLE_EQ(un->getValueDimension(), 2);
336 EXPECT_DOUBLE_EQ(un->getTimeDimension(), 5);
338 Eigen::MatrixXd u_seq = un->getValuesMatrixView();
339 EXPECT_TRUE(u_seq.isZero()) << u_seq;
342 EXPECT_DOUBLE_EQ(4.0 * grid.getFirstDt(), 0.9) <<
"dt: " << grid.getFirstDt();
345 EXPECT_TRUE(grid.getShootingIntervals()[0].shooting_node->isFixed());
346 for (
int i = 1; i < (
int)grid.getShootingIntervals().size(); ++i)
348 EXPECT_FALSE(grid.getShootingIntervals()[i].shooting_node->isFixed());
352 grid.resampleTrajectory(15);
354 grid.getShootingNodeTimeSeries(sn);
355 EXPECT_DOUBLE_EQ(sn->getValueDimension(), 2);
356 EXPECT_DOUBLE_EQ(sn->getTimeDimension(), 15);
357 s_seq = sn->getValuesMatrixView();
360 for (
int i = 0; i < s_seq.cols(); ++i)
362 EXPECT_DOUBLE_EQ(x0[0] + (
double)i * (xf[0] - x0[0]) / 14.0, s_seq(0, i));
363 EXPECT_DOUBLE_EQ(x0[1] + (
double)i * (xf[1] - x0[1]) / 14.0, s_seq(1, i));
367 grid.getControlInputTimeSeries(un);
368 EXPECT_DOUBLE_EQ(un->getValueDimension(), 2);
369 EXPECT_DOUBLE_EQ(un->getTimeDimension(), 15);
371 u_seq = un->getValuesMatrixView();
372 EXPECT_TRUE(u_seq.isZero()) << u_seq;
375 EXPECT_DOUBLE_EQ(14.0 * grid.getFirstDt(), 0.9) <<
"dt: " << grid.getFirstDt();
378 EXPECT_TRUE(grid.getShootingIntervals()[0].shooting_node->isFixed());
379 for (
int i = 1; i < (
int)grid.getShootingIntervals().size(); ++i)
381 EXPECT_FALSE(grid.getShootingIntervals()[i].shooting_node->isFixed());
387 Eigen::Vector2d x0(0, 0);
388 Eigen::Vector2d xf(1, -1);
389 Eigen::Vector2d u0(0, 0);
394 grid.setSingleDt(
true);
396 grid.setHorizon(num_states, dt);
397 grid.initialize(x0, xf, u0);
400 grid.resampleTrajectory(11);
404 grid.getShootingNodeTimeSeries(sn);
405 EXPECT_DOUBLE_EQ(sn->getValueDimension(), 2);
406 EXPECT_DOUBLE_EQ(sn->getTimeDimension(), 11);
407 Eigen::MatrixXd s_seq = sn->getValuesMatrixView();
410 for (
int i = 0; i < s_seq.cols(); ++i)
412 EXPECT_DOUBLE_EQ(x0[0] + (
double)i * (xf[0] - x0[0]) / 10.0, s_seq(0, i));
413 EXPECT_DOUBLE_EQ(x0[1] + (
double)i * (xf[1] - x0[1]) / 10.0, s_seq(1, i));
418 grid.getControlInputTimeSeries(un);
419 EXPECT_DOUBLE_EQ(un->getValueDimension(), 2);
420 EXPECT_DOUBLE_EQ(un->getTimeDimension(), 11);
422 Eigen::MatrixXd u_seq = un->getValuesMatrixView();
423 EXPECT_TRUE(u_seq.isZero()) << u_seq;
426 EXPECT_DOUBLE_EQ(10.0 * grid.getFirstDt(), 0.9) <<
"dt: " << grid.getFirstDt();
429 EXPECT_TRUE(grid.getShootingIntervals()[0].shooting_node->isFixed());
430 for (
int i = 1; i < (
int)grid.getShootingIntervals().size(); ++i)
432 EXPECT_FALSE(grid.getShootingIntervals()[i].shooting_node->isFixed());
436 grid.resampleTrajectory(10);
438 grid.getShootingNodeTimeSeries(sn);
439 EXPECT_DOUBLE_EQ(sn->getValueDimension(), 2);
440 EXPECT_DOUBLE_EQ(sn->getTimeDimension(), 10);
441 s_seq = sn->getValuesMatrixView();
444 for (
int i = 0; i < s_seq.cols(); ++i)
446 EXPECT_DOUBLE_EQ(x0[0] + (
double)i * (xf[0] - x0[0]) / 9.0, s_seq(0, i));
447 EXPECT_DOUBLE_EQ(x0[1] + (
double)i * (xf[1] - x0[1]) / 9.0, s_seq(1, i));
451 grid.getControlInputTimeSeries(un);
452 EXPECT_DOUBLE_EQ(un->getValueDimension(), 2);
453 EXPECT_DOUBLE_EQ(un->getTimeDimension(), 10);
455 u_seq = un->getValuesMatrixView();
456 EXPECT_TRUE(u_seq.isZero()) << u_seq;
459 EXPECT_DOUBLE_EQ(9.0 * grid.getFirstDt(), 0.9) <<
"dt: " << grid.getFirstDt();
462 EXPECT_TRUE(grid.getShootingIntervals()[0].shooting_node->isFixed());
463 for (
int i = 1; i < (
int)grid.getShootingIntervals().size(); ++i)
465 EXPECT_FALSE(grid.getShootingIntervals()[i].shooting_node->isFixed());
471 Eigen::Vector2d x0(3, 0);
472 Eigen::Vector2d xf(0, 3);
474 Eigen::Vector2d u0(0, 0);
479 grid.setHorizon(num_states, dt);
480 grid.initialize(x0, xf, u0);
483 grid.getShootingIntervalsRaw()[0].controls.front()->values()[0] = 1.5;
484 grid.getShootingIntervalsRaw()[1].controls.front()->values()[0] = 2.5;
485 grid.getShootingIntervalsRaw()[2].controls.front()->values()[0] = 3.5;
488 EXPECT_TRUE(grid.shiftGridValues(1));
492 grid.getShootingNodeTimeSeries(sn);
493 EXPECT_DOUBLE_EQ(sn->getValueDimension(), 2);
494 EXPECT_DOUBLE_EQ(sn->getTimeDimension(), 4);
496 Eigen::MatrixXd s_seq = sn->getValuesMatrixView();
498 EXPECT_DOUBLE_EQ(s_seq(0, 0), 2);
499 EXPECT_DOUBLE_EQ(s_seq(1, 0), 1);
500 EXPECT_DOUBLE_EQ(s_seq(0, 1), 1);
501 EXPECT_DOUBLE_EQ(s_seq(1, 1), 2);
502 EXPECT_DOUBLE_EQ(s_seq(0, 2), 0);
503 EXPECT_DOUBLE_EQ(s_seq(1, 2), 3);
504 EXPECT_DOUBLE_EQ(s_seq(0, 3), -1);
505 EXPECT_DOUBLE_EQ(s_seq(1, 3), 4);
509 grid.getControlInputTimeSeries(un);
510 EXPECT_DOUBLE_EQ(un->getValueDimension(), 2);
511 EXPECT_DOUBLE_EQ(un->getTimeDimension(), 4);
513 Eigen::MatrixXd u_seq = un->getValuesMatrixView();
514 EXPECT_DOUBLE_EQ(u_seq(0, 0), 2.5);
515 EXPECT_DOUBLE_EQ(u_seq(1, 0), 0);
516 EXPECT_DOUBLE_EQ(u_seq(0, 1), 3.5);
517 EXPECT_DOUBLE_EQ(u_seq(1, 1), 0);
518 EXPECT_DOUBLE_EQ(u_seq(0, 2), 3.5);
519 EXPECT_DOUBLE_EQ(u_seq(1, 2), 0);
525 Eigen::Vector2d x0(3, 0);
526 Eigen::Vector2d xf(0, 3);
528 Eigen::Vector2d u0(0, 0);
533 grid.setHorizon(num_states, dt);
534 grid.initialize(x0, xf, u0);
537 grid.getShootingIntervalsRaw()[0].controls.front()->values()[0] = 1.5;
538 grid.getShootingIntervalsRaw()[1].controls.front()->values()[0] = 2.5;
539 grid.getShootingIntervalsRaw()[2].controls.front()->values()[0] = 3.5;
542 EXPECT_TRUE(grid.shiftGridValues(2));
546 grid.getShootingNodeTimeSeries(sn);
547 EXPECT_DOUBLE_EQ(sn->getValueDimension(), 2);
548 EXPECT_DOUBLE_EQ(sn->getTimeDimension(), 4);
550 Eigen::MatrixXd s_seq = sn->getValuesMatrixView();
552 EXPECT_DOUBLE_EQ(s_seq(0, 0), 1);
553 EXPECT_DOUBLE_EQ(s_seq(1, 0), 2);
554 EXPECT_DOUBLE_EQ(s_seq(0, 1), 0);
555 EXPECT_DOUBLE_EQ(s_seq(1, 1), 3);
556 EXPECT_DOUBLE_EQ(s_seq(0, 2), -1);
557 EXPECT_DOUBLE_EQ(s_seq(1, 2), 4);
558 EXPECT_DOUBLE_EQ(s_seq(0, 3), -2);
559 EXPECT_DOUBLE_EQ(s_seq(1, 3), 5);
563 grid.getControlInputTimeSeries(un);
564 EXPECT_DOUBLE_EQ(un->getValueDimension(), 2);
565 EXPECT_DOUBLE_EQ(un->getTimeDimension(), 4);
567 Eigen::MatrixXd u_seq = un->getValuesMatrixView();
568 EXPECT_DOUBLE_EQ(u_seq(0, 0), 3.5);
569 EXPECT_DOUBLE_EQ(u_seq(1, 0), 0);
570 EXPECT_DOUBLE_EQ(u_seq(0, 1), 3.5);
571 EXPECT_DOUBLE_EQ(u_seq(1, 1), 0);
572 EXPECT_DOUBLE_EQ(u_seq(0, 2), 3.5);
573 EXPECT_DOUBLE_EQ(u_seq(1, 2), 0);
579 Eigen::Vector2d x0(3, 0);
580 Eigen::Vector2d xf(0, 3);
582 Eigen::Vector2d u0(0, 0);
587 grid.setHorizon(num_states, dt);
588 grid.initialize(x0, xf, u0);
591 grid.getShootingIntervalsRaw()[0].controls.front()->values()[0] = 1.5;
592 grid.getShootingIntervalsRaw()[1].controls.front()->values()[0] = 2.5;
593 grid.getShootingIntervalsRaw()[2].controls.front()->values()[0] = 3.5;
596 EXPECT_TRUE(grid.shiftGridValues(Eigen::Vector2d(2.1, 0.9)));
600 grid.getShootingNodeTimeSeries(sn);
601 EXPECT_DOUBLE_EQ(sn->getValueDimension(), 2);
602 EXPECT_DOUBLE_EQ(sn->getTimeDimension(), 4);
604 Eigen::MatrixXd s_seq = sn->getValuesMatrixView();
606 EXPECT_DOUBLE_EQ(s_seq(0, 0), 2);
607 EXPECT_DOUBLE_EQ(s_seq(1, 0), 1);
608 EXPECT_DOUBLE_EQ(s_seq(0, 1), 1);
609 EXPECT_DOUBLE_EQ(s_seq(1, 1), 2);
610 EXPECT_DOUBLE_EQ(s_seq(0, 2), 0);
611 EXPECT_DOUBLE_EQ(s_seq(1, 2), 3);
612 EXPECT_DOUBLE_EQ(s_seq(0, 3), -1);
613 EXPECT_DOUBLE_EQ(s_seq(1, 3), 4);
617 grid.getControlInputTimeSeries(un);
618 EXPECT_DOUBLE_EQ(un->getValueDimension(), 2);
619 EXPECT_DOUBLE_EQ(un->getTimeDimension(), 4);
621 Eigen::MatrixXd u_seq = un->getValuesMatrixView();
622 EXPECT_DOUBLE_EQ(u_seq(0, 0), 2.5);
623 EXPECT_DOUBLE_EQ(u_seq(1, 0), 0);
624 EXPECT_DOUBLE_EQ(u_seq(0, 1), 3.5);
625 EXPECT_DOUBLE_EQ(u_seq(1, 1), 0);
626 EXPECT_DOUBLE_EQ(u_seq(0, 2), 3.5);
627 EXPECT_DOUBLE_EQ(u_seq(1, 2), 0);