blob: 6d355cbbb483d87afc4e8b93871f63c9d4fccfce [file] [log] [blame]
/**********************************************************************************************************************
This file is part of the Control Toolbox (https://adrlab.bitbucket.io/ct), copyright by ETH Zurich, Google Inc.
Authors: Michael Neunert, Markus Giftthaler, Markus Stäuble, Diego Pardo, Farbod Farshidian
Licensed under Apache2 license (see LICENSE file in main directory)
**********************************************************************************************************************/
/*!
* This Example displays some constraint toolbox outputs, giving the user a feeling for
* sparsity patterns, etc.
*/
#include <ct/optcon/optcon.h>
using namespace ct::core;
using namespace ct::optcon;
// some random state and control dimensions
const size_t state_dim = 10;
const size_t control_dim = 5;
void controlInputBoxConstraintExample()
{
// create constraint container
std::shared_ptr<ConstraintContainerAnalytical<state_dim, control_dim>> constraints(
new ct::optcon::ConstraintContainerAnalytical<state_dim, control_dim>());
// desired boundaries
ControlVector<control_dim> u_lb = -ControlVector<control_dim>::Ones();
ControlVector<control_dim> u_ub = ControlVector<control_dim>::Ones();
// constraint term
std::shared_ptr<ControlInputConstraint<state_dim, control_dim>> controlConstraint(
new ControlInputConstraint<state_dim, control_dim>(u_lb, u_ub));
controlConstraint->setName("ControlInputConstraint");
// add and initialize constraint term
constraints->addIntermediateConstraint(controlConstraint, true);
constraints->initialize();
std::cout << "=============================================" << std::endl;
std::cout << "Printing example for control input constraint:" << std::endl;
std::cout << "=============================================" << std::endl;
constraints->printout();
}
void terminalConstraintExample()
{
// create constraint container
std::shared_ptr<ConstraintContainerAnalytical<state_dim, control_dim>> constraints(
new ct::optcon::ConstraintContainerAnalytical<state_dim, control_dim>());
// desired terminal state
StateVector<state_dim> x_final = StateVector<state_dim>::Random();
// terminal constrain term
std::shared_ptr<TerminalConstraint<state_dim, control_dim>> terminalConstraint(
new TerminalConstraint<state_dim, control_dim>(x_final));
terminalConstraint->setName("TerminalConstraint");
// add and initialize terminal constraint term
constraints->addTerminalConstraint(terminalConstraint, true);
constraints->initialize();
std::cout << "==============================================" << std::endl;
std::cout << "Printing example for terminal state constraint:" << std::endl;
std::cout << "==============================================" << std::endl;
constraints->printout();
}
void boxConstraintsExample()
{
// create constraint container
std::shared_ptr<ConstraintContainerAnalytical<state_dim, control_dim>> constraints(
new ct::optcon::ConstraintContainerAnalytical<state_dim, control_dim>());
// desired terminal state
ControlVector<control_dim> u_lb = -1.11 * ControlVector<control_dim>::Ones();
ControlVector<control_dim> u_ub = 1.11 * ControlVector<control_dim>::Ones();
StateVector<state_dim> x_lb = -3.33 * StateVector<state_dim>::Ones();
StateVector<state_dim> x_ub = 3.33 * StateVector<state_dim>::Ones();
// constrain terms
std::shared_ptr<ControlInputConstraint<state_dim, control_dim>> controlConstraint(
new ControlInputConstraint<state_dim, control_dim>(u_lb, u_ub));
controlConstraint->setName("ControlInputConstraint");
std::shared_ptr<StateConstraint<state_dim, control_dim>> stateConstraint(
new StateConstraint<state_dim, control_dim>(x_lb, x_ub));
stateConstraint->setName("StateConstraint");
// add and initialize constraint terms
constraints->addIntermediateConstraint(controlConstraint, true);
constraints->addIntermediateConstraint(stateConstraint, true);
constraints->initialize();
std::cout << "=============================================" << std::endl;
std::cout << "Printing example for combined box constraint:" << std::endl;
std::cout << "=============================================" << std::endl;
constraints->printout();
}
void sparseBoxConstraintsExample()
{
// create constraint container
std::shared_ptr<ConstraintContainerAnalytical<state_dim, control_dim>> constraints(
new ct::optcon::ConstraintContainerAnalytical<state_dim, control_dim>());
// box constraint boundaries with sparsities
Eigen::VectorXi sp_control(control_dim);
sp_control << 0, 1, 0, 0, 1;
Eigen::VectorXd u_lb(2);
Eigen::VectorXd u_ub(2);
u_lb.setConstant(-1.11);
u_ub = -u_lb;
Eigen::VectorXi sp_state(state_dim);
sp_state << 0, 1, 0, 0, 1, 0, 1, 1, 0, 0;
Eigen::VectorXd x_lb(4);
Eigen::VectorXd x_ub(4);
x_lb.setConstant(-3.33);
x_ub = -x_lb;
// constrain terms
std::shared_ptr<ControlInputConstraint<state_dim, control_dim>> controlConstraint(
new ControlInputConstraint<state_dim, control_dim>(u_lb, u_ub, sp_control));
controlConstraint->setName("ControlInputConstraint");
std::shared_ptr<StateConstraint<state_dim, control_dim>> stateConstraint(
new StateConstraint<state_dim, control_dim>(x_lb, x_ub, sp_state));
stateConstraint->setName("StateConstraint");
// add and initialize constraint terms
constraints->addIntermediateConstraint(controlConstraint, true);
constraints->addIntermediateConstraint(stateConstraint, true);
constraints->initialize();
std::cout << "=============================================" << std::endl;
std::cout << "Printing example for sparse box constraint:" << std::endl;
std::cout << "=============================================" << std::endl;
constraints->printout();
}
int main(int argc, char **argv)
{
controlInputBoxConstraintExample();
terminalConstraintExample();
boxConstraintsExample();
sparseBoxConstraintsExample();
return 1;
}