openpilot is an open source driver assistance system. openpilot performs the functions of Automated Lane Centering and Adaptive Cruise Control for over 200 supported car makes and models.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

405 lines
15 KiB

/*
* This file is part of ACADO Toolkit.
*
* ACADO Toolkit -- A Toolkit for Automatic Control and Dynamic Optimization.
* Copyright (C) 2008-2014 by Boris Houska, Hans Joachim Ferreau,
* Milan Vukov, Rien Quirynen, KU Leuven.
* Developed within the Optimization in Engineering Center (OPTEC)
* under supervision of Moritz Diehl. All rights reserved.
*
* ACADO Toolkit is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 3 of the License, or (at your option) any later version.
*
* ACADO Toolkit is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with ACADO Toolkit; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
*/
/**
* \file include/acado/ocp/ocp.hpp
* \authors Boris Houska, Hans Joachim Ferreau, Milan Vukov, Rien Quirynen
* \date 2008 - 2014
*/
#ifndef ACADO_TOOLKIT_OCP_HPP
#define ACADO_TOOLKIT_OCP_HPP
#include <acado/ocp/multi_objective_functionality.hpp>
#include <acado/ocp/model_container.hpp>
BEGIN_NAMESPACE_ACADO
class Grid;
class Objective;
class Constraint;
/**
* \brief Data class for defining optimal control problems.
*
* \ingroup BasicDataStructures
*
* The class OCP is a data class for defining optimal control problems.
* In the most easiest an optimal control problem can consists of an
* objective only - i.e. in principle we can set up NLP's as well if no
* dynamic system is specified. However, in general the objective
* functional is optimized subject to a dynamic equation and different
* kind of constraints. \n
* \n
* Note that the OCP class is only designed for the user and collects
* data only. In order to solve an OCP this class must be setup and
* passed to an appropriate OptimizationAlgorithm.\n
* \n
* For setting up an optimal control problem (OCP), we should first specify
* the time horizon on which the OCP is defined. Note that there are
* several constructors available which allow to construct an OCP directly
* with the corresponding time interval. Here, the interval can consist of
* of given bounds, but in another variant a parameter can be passed in
* order to allow the setup of optimal control problems for which the end
* time is optimized, too.\n
* \n
* Constraints can be specified with the "subjectTo" syntax. Please note
* that every parameter, state, control etc which is not fixed via a
* constraint will be regarded as an optimization variable. In particular,
* initial value or boundary constraints appear in many OCP formulations
* and of course all these constraints should all be set explicitly.
* Moreover, the dynamic equations (model) is regarded as a constraint, too.\n
* \n
* Please note that the OCP class only collects the formulation of the
* problem. If initial values for non-linear problems should be specified,
* this needs to be done on the algorithm dealing with the OCP.
* (\sa OptimizationAlgorithm)\n
* \n
* For advanced users and developers it might be important to know that the
* class OCP inherits the MultiObjectiveFunctionality which is needed if
* more than one objective should be specified.\n
* \n
* Please check the tutorial examples as well as the class reference below,
* to learn about the usage of this class in more detail.\n
* \n
*/
class OCP: public MultiObjectiveFunctionality, public ModelContainer
{
public:
/** Default Constructor which can optionally set the time-horizon of the problem.
*/
OCP( const double &tStart_ = 0.0, /**< start of the time horizon of the OCP */
const double &tEnd_ = 1.0, /**< end of the time horizon of the OCP */
const int &N_ = 20 /**< number of discretization intervals */ );
/** Constructor which can set a non equidistant time-horizon of the problem.
*/
OCP( const double &tStart_, /**< start of the time horizon of the OCP */
const double &tEnd_, /**< end of the time horizon of the OCP */
const DVector& _numSteps /**< number of integration steps in each discretization interval */ );
/** Constructor that takes a parametric version of the time horizon. This contructor
* should be used if the end time should be optimized, too.
*/
OCP( const double &tStart_, /**< start of the time horizon of the OCP */
const Parameter &tEnd_, /**< end of the time horizon of the OCP */
const int &N_ = 20 /**< number of discretization intervals */ );
/** Constructor that takes the time horizon in form of a Grid.
*/
OCP( const Grid &grid_ /**< discretization grid */ );
/** Destructor (deletes everything). */
virtual ~OCP( );
/** Adds an expression as a the Mayer term to be minimized.
* \return SUCCESSFUL_RETURN
*/
returnValue minimizeMayerTerm( const Expression& arg );
/** Adds an expression as a the Mayer term to be minimized. In this version
* the number of the objective can be specified as well. This functionality
* is needed for multi-objective optimal control problems.
* \return SUCCESSFUL_RETURN
*/
returnValue minimizeMayerTerm( const int &multiObjectiveIdx, const Expression& arg );
/** Adds an expression as a the Mayer term to be maximized.
* Note that this function is introduced for convenience only.
* A call of the form maximizeMayerTerm( arg ) is equivalent to
* calling minimizeMayerTerm( -arg ).\n
*
* \return SUCCESSFUL_RETURN
*/
returnValue maximizeMayerTerm( const Expression& arg );
/** Adds an expression as a the Lagrange term to be minimized.
* \return SUCCESSFUL_RETURN
*/
returnValue minimizeLagrangeTerm( const Expression& arg );
/** Adds an expression as a the Lagrange term to be maximized.
* \return SUCCESSFUL_RETURN
*/
returnValue maximizeLagrangeTerm( const Expression& arg );
/** \name Least Squares terms.
*
* Adds a Least Square term of the form
*
* \f{equation*}{
* \frac{1}{2} \sum_i \Vert h(t_i,x(t_i),u(t_i),p(t_i),...) - r \Vert^2_{S_{i}}
* \f}
*
* Here the sum is over all grid points of the objective grid. The
* DMatrix \f$ S \f$ is assumed to be symmetric and positive (semi-) definite.
* The Function \f$ r \f$ is called reference and can be
* specified by the user. The function \f$ h \f$ is a standard Function.
*
* \sa Function
*
* \return SUCCESSFUL_RETURN
*
* @{ */
returnValue minimizeLSQ( const DMatrix &S, /**< a weighting matrix */
const Function &h, /**< the LSQ-Function */
const DVector &r /**< the reference */ );
returnValue minimizeLSQ( const Function &h, /**< the LSQ-Function */
const DVector &r /**< the reference */ );
returnValue minimizeLSQ( const Function &h /**< the LSQ-Function */ );
returnValue minimizeLSQ( const MatrixVariablesGrid &S, /**< a weighting matrix */
const Function &h, /**< the LSQ-Function */
const VariablesGrid &r /**< the reference */ );
returnValue minimizeLSQ( const DMatrix &S, /**< a weighting matrix */
const Function &h, /**< the LSQ-Function */
const VariablesGrid &r /**< the reference */ );
returnValue minimizeLSQ( const Function &h, /**< the LSQ-Function */
const VariablesGrid &r /**< the reference */ );
returnValue minimizeLSQ( const MatrixVariablesGrid &S, /**< a weighting matrix */
const Function &h, /**< the LSQ-Function */
const char* rFilename /**< filename where the reference is stored */ );
returnValue minimizeLSQ( const DMatrix &S,/**< a weighting matrix */
const Function &h, /**< the LSQ-Function */
const char* rFilename /**< filename where the reference is stored */ );
returnValue minimizeLSQ( const Function &h, /**< the LSQ-Function */
const char* rFilename /**< filename where the reference is stored */ );
/** \note Applicable only for automatic code generation. */
returnValue minimizeLSQ( const DMatrix& S, /**< a weighting matrix */
const Function& h /**< the LSQ-Function */ );
/** Pass the sparsity pattern of the weighting matrix to the code generator.
* \note Applicable only for automatic code generation. */
returnValue minimizeLSQ( const BMatrix& S, /**< a weighting matrix */
const Function& h /**< the LSQ-Function */ );
/** \note Applicable only for automatic code generation. */
returnValue minimizeLSQ( const DMatrix& S, /**< a weighting matrix */
const std::string& h /**< the externally defined LSQ-Function */ );
/** Pass the sparsity pattern of the weighting matrix to the code generator.
* \note Applicable only for automatic code generation. */
returnValue minimizeLSQ( const BMatrix& S, /**< a weighting matrix */
const std::string& h /**< the externally defined LSQ-Function */ );
/** @} */
/** \name Least Squares end terms.
*
* Adds an Least Square term that is only evaluated at the end:
*
* \f{equation*}{
* \frac{1}{2} \Vert( m(T,x(T),u(T),p(T),...) - r )\Vert^2_S
* \f}
*
* where \f$ S \f$ is a weighting matrix, \f$ r \f$ a reference vector
* and \f$ T \f$ the time at the last objective grid point. The function
* \f$ m \f$ is a standard Function.
*
* \return SUCCESSFUL_RETURN
*
* @{ */
returnValue minimizeLSQEndTerm( const DMatrix & S, /**< a weighting matrix */
const Function & m, /**< the LSQ-Function */
const DVector & r /**< the reference */ );
returnValue minimizeLSQEndTerm( const Function & m, /**< the LSQ-Function */
const DVector & r /**< the reference */ );
/** \note Applicable only for automatic code generation. */
returnValue minimizeLSQEndTerm( const DMatrix& S, /**< a weighting matrix */
const Function& m /**< the LSQ-Function */ );
/** \note Applicable only for automatic code generation. */
returnValue minimizeLSQEndTerm( const DMatrix& S, /**< a weighting matrix */
const std::string& m /**< the externally defined LSQ-Function */ );
/** Pass the sparsity pattern of the weighting matrix to the code generator.
* \note Applicable only for automatic code generation. */
returnValue minimizeLSQEndTerm( const BMatrix& S, /**< a weighting matrix */
const Function& m /**< the LSQ-Function */ );
/** Pass the sparsity pattern of the weighting matrix to the code generator.
* \note Applicable only for automatic code generation. */
returnValue minimizeLSQEndTerm( const BMatrix& S, /**< a weighting matrix */
const std::string& m /**< the externally defined LSQ-Function */ );
/** @} */
/** \name Set linear terms in the LSQ formulation.
* @{ */
/** Applicable only for automatic code generation.
* \note Experimental. */
returnValue minimizeLSQLinearTerms( const DVector& Slx, /**< a weighting vector for differential states. */
const DVector& Slu /**< a weighting vector for controls. */ );
/** Applicable only for automatic code generation.
* \note Experimental. */
returnValue minimizeLSQLinearTerms( const BVector& Slx, /**< a weighting vector for differential states. */
const BVector& Slu /**< a weighting vector for controls. */ );
/** @} */
/** Adds an differential equation (as a continuous equality constraint). \n
* \n
* \param differentialEquation_ the differential equation to be added \n
* \param n_ the number of control intervals \n
* \n
* \return SUCCESSFUL_RETURN
*/
returnValue subjectTo( const DifferentialEquation& differentialEquation_ );
/** Adds a (continuous) constraint.
* \return SUCCESSFUL_RETURN \n
* RET_INFEASIBLE_CONSTRAINT \n
*/
returnValue subjectTo( const ConstraintComponent& component );
/**< Adds a discrete, point, constraint.
* \return SUCCESSFUL_RETURN \n
* RET_INFEASIBLE_CONSTRAINT \n
*/
returnValue subjectTo( int index_, const ConstraintComponent& component );
/** Add a coupled boundary constraint.
*
* Coupled boundary constraints of general form
*
* \f{equation*}{
* \text{lb} \leq h_1( t_0,x(t_0),u(t_0),p,... ) + h_2( t_e,x(t_e),u(t_e),p,... ) \leq \text{ub}
* \f}
*
* where \f$ t_0 \f$ is the first and \f$ t_e \f$ the last time point in the grid.
* Adds a constraint of the form \verbatim lb <= arg1(0) + arg2(T) <= ub \endverbatim
* with constant lower and upper bounds.
*
* \return SUCCESSFUL_RETURN \n
* RET_INFEASIBLE_CONSTRAINT
*/
returnValue subjectTo( const double lb_,
const Expression& arg1,
const Expression& arg2,
const double ub_ );
/** Add a custom constraint.
*
* Adds a constraint of the form
*
* \f{equation*}{
* \text{lb} <= \sum_i h_i(t_i, x(t_i), u(t_i), p, ...) <= \text{ub}
* \f}
*
* with constant lower and upper bounds.
*
* \return SUCCESSFUL_RETURN \n
* RET_INFEASIBLE_CONSTRAINT
*
* @{
*/
returnValue subjectTo( const double lb_, const Expression *arguments, const double ub_ );
/** \name Add a custom constraint to the OCP formulation.
*
* Adds a constraint of the form
*
* \f{equation*}{
* \text{lb} <= h_i(t_i, x(t_i), u(t_i), p, ...) <= \text{ub}
* \f}
*
* with constant lower and upper bounds.
*
* @{
*/
returnValue subjectTo( const DVector& _lb, const Expression& _expr, const DVector& _ub );
returnValue subjectTo( int _index, const DVector& _lb, const Expression& _expr, const DVector& _ub );
/** @} */
/** \name Helper functions.
*
* @{ */
BooleanType hasObjective () const;
BooleanType hasConstraint () const;
returnValue getGrid ( Grid& grid_ ) const;
returnValue getObjective ( Objective& objective_ ) const;
returnValue getObjective ( const int &multiObjectiveIdx, Expression **arg ) const;
returnValue getConstraint( Constraint& constraint_ ) const;
returnValue setObjective ( const Objective & objective_ );
returnValue setConstraint( const Constraint& constraint_ );
returnValue setNumberIntegrationSteps( const uint numSteps );
/** Returns whether the ocp grid is equidistant.
*
* \return true iff the OCP grid is equidistant, false otherwise.
*/
virtual BooleanType hasEquidistantGrid( ) const;
double getStartTime ( ) const;
double getEndTime( ) const;
/** @} */
protected:
void setupGrid( double tStart, double tEnd, int N );
void setupGrid( const DVector& times );
/** Common discretization grid. */
std::shared_ptr<Grid> grid;
/** The Objective. */
std::shared_ptr<Objective> objective;
/** The Constraints. */
std::shared_ptr<Constraint> constraint;
};
CLOSE_NAMESPACE_ACADO
#endif // ACADO_TOOLKIT_OCP_HPP