diff options
Diffstat (limited to 'ml/dlib/dlib/control/mpc_abstract.h')
-rw-r--r-- | ml/dlib/dlib/control/mpc_abstract.h | 276 |
1 files changed, 0 insertions, 276 deletions
diff --git a/ml/dlib/dlib/control/mpc_abstract.h b/ml/dlib/dlib/control/mpc_abstract.h deleted file mode 100644 index b4421c076..000000000 --- a/ml/dlib/dlib/control/mpc_abstract.h +++ /dev/null @@ -1,276 +0,0 @@ -// Copyright (C) 2015 Davis E. King (davis@dlib.net) -// License: Boost Software License See LICENSE.txt for the full license. -#undef DLIB_MPC_ABSTRACT_Hh_ -#ifdef DLIB_MPC_ABSTRACT_Hh_ - -#include "../matrix.h" - -namespace dlib -{ - template < - long S_, - long I_, - unsigned long horizon_ - > - class mpc - { - /*! - REQUIREMENTS ON horizon_ - horizon_ > 0 - - REQUIREMENTS ON S_ - S_ >= 0 - - REQUIREMENTS ON I_ - I_ >= 0 - - WHAT THIS OBJECT REPRESENTS - This object implements a linear model predictive controller. To explain - what that means, suppose you have some process you want to control and the - process dynamics are described by the linear equation: - x_{i+1} = A*x_i + B*u_i + C - That is, the next state the system goes into is a linear function of its - current state (x_i) and the current control (u_i) plus some constant bias - or disturbance. - - A model predictive controller can find the control (u) you should apply to - drive the state (x) to some reference value, or alternatively to make the - state track some reference time-varying sequence. It does this by - simulating the process for horizon_ time steps and selecting the control - that leads to the best performance over the next horizon_ steps. - - To be precise, each time you ask this object for a control, it solves the - following quadratic program: - - min sum_i trans(x_i-target_i)*Q*(x_i-target_i) + trans(u_i)*R*u_i - x_i,u_i - - such that: x_0 == current_state - x_{i+1} == A*x_i + B*u_i + C - lower <= u_i <= upper - 0 <= i < horizon_ - - and reports u_0 as the control you should take given that you are currently - in current_state. Q and R are user supplied matrices that define how we - penalize variations away from the target state as well as how much we want - to avoid generating large control signals. - - Finally, the algorithm we use to solve this quadratic program is based - largely on the method described in: - A Fast Gradient method for embedded linear predictive control (2011) - by Markus Kogel and Rolf Findeisen - !*/ - - public: - - const static long S = S_; - const static long I = I_; - const static unsigned long horizon = horizon_; - - mpc( - ); - /*! - ensures - - #get_max_iterations() == 0 - - The A,B,C,Q,R,lower, and upper parameter matrices are filled with zeros. - Therefore, to use this object you must initialize it via the constructor - that supplies these parameters. - !*/ - - mpc ( - const matrix<double,S,S>& A, - const matrix<double,S,I>& B, - const matrix<double,S,1>& C, - const matrix<double,S,1>& Q, - const matrix<double,I,1>& R, - const matrix<double,I,1>& lower, - const matrix<double,I,1>& upper - ); - /*! - requires - - A.nr() > 0 - - B.nc() > 0 - - A.nr() == A.nc() == B.nr() == C.nr() == Q.nr() - - B.nc() == R.nr() == lower.nr() == upper.nr() - - min(Q) >= 0 - - min(R) > 0 - - min(upper-lower) >= 0 - ensures - - #get_A() == A - - #get_B() == B - - #get_C() == C - - #get_Q() == Q - - #get_R() == R - - #get_lower_constraints() == lower - - #get_upper_constraints() == upper - - for all valid i: - - get_target(i) == a vector of all zeros - - get_target(i).size() == A.nr() - - #get_max_iterations() == 10000 - - #get_epsilon() == 0.01 - !*/ - - const matrix<double,S,S>& get_A ( - ) const; - /*! - ensures - - returns the A matrix from the quadratic program defined above. - !*/ - - const matrix<double,S,I>& get_B ( - ) const; - /*! - ensures - - returns the B matrix from the quadratic program defined above. - !*/ - - const matrix<double,S,1>& get_C ( - ) const; - /*! - ensures - - returns the C matrix from the quadratic program defined above. - !*/ - - const matrix<double,S,1>& get_Q ( - ) const; - /*! - ensures - - returns the diagonal of the Q matrix from the quadratic program defined - above. - !*/ - - const matrix<double,I,1>& get_R ( - ) const; - /*! - ensures - - returns the diagonal of the R matrix from the quadratic program defined - above. - !*/ - - const matrix<double,I,1>& get_lower_constraints ( - ) const; - /*! - ensures - - returns the lower matrix from the quadratic program defined above. All - controls generated by this object will have values no less than this - lower bound. That is, any control u will satisfy min(u-lower) >= 0. - !*/ - - const matrix<double,I,1>& get_upper_constraints ( - ) const; - /*! - ensures - - returns the upper matrix from the quadratic program defined above. All - controls generated by this object will have values no larger than this - upper bound. That is, any control u will satisfy min(upper-u) >= 0. - !*/ - - const matrix<double,S,1>& get_target ( - const unsigned long time - ) const; - /*! - requires - - time < horizon - ensures - - This object will try to find the control sequence that results in the - process obtaining get_target(time) state at the indicated time. Note - that the next time instant after "right now" is time 0. - !*/ - - void set_target ( - const matrix<double,S,1>& val, - const unsigned long time - ); - /*! - requires - - time < horizon - ensures - - #get_target(time) == val - !*/ - - void set_target ( - const matrix<double,S,1>& val - ); - /*! - ensures - - for all valid t: - - #get_target(t) == val - !*/ - - void set_last_target ( - const matrix<double,S,1>& val - ); - /*! - ensures - - performs: set_target(val, horizon-1) - !*/ - - unsigned long get_max_iterations ( - ) const; - /*! - ensures - - When operator() is called it solves an optimization problem to - get_epsilon() precision to determine the next control action. In - particular, we run the optimizer until the magnitude of each element of - the gradient vector is less than get_epsilon() or until - get_max_iterations() solver iterations have been executed. - !*/ - - void set_max_iterations ( - unsigned long max_iter - ); - /*! - ensures - - #get_max_iterations() == max_iter - !*/ - - void set_epsilon ( - double eps - ); - /*! - requires - - eps > 0 - ensures - - #get_epsilon() == eps - !*/ - - double get_epsilon ( - ) const; - /*! - ensures - - When operator() is called it solves an optimization problem to - get_epsilon() precision to determine the next control action. In - particular, we run the optimizer until the magnitude of each element of - the gradient vector is less than get_epsilon() or until - get_max_iterations() solver iterations have been executed. This means - that smaller epsilon values will give more accurate outputs but may take - longer to compute. - !*/ - - matrix<double,I,1> operator() ( - const matrix<double,S,1>& current_state - ); - /*! - requires - - min(R) > 0 - - A.nr() == current_state.size() - ensures - - Solves the model predictive control problem defined by the arguments to - this objects constructor, assuming that the starting state is given by - current_state. Then we return the control that should be taken in the - current state that best optimizes the quadratic objective function - defined above. - - We also shift over the target states so that you only need to update the - last one (if you are using non-zero target states) via a call to - set_last_target()). In particular, for all valid t, it will be the case - that: - - #get_target(t) == get_target(t+1) - - #get_target(horizon-1) == get_target(horizon-1) - !*/ - - }; - -} - -#endif // DLIB_MPC_ABSTRACT_Hh_ - |