nmpc_fmpc
FmpcSolver.h
Go to the documentation of this file.
1 /* Author: Masaki Murooka */
2 
3 #pragma once
4 
5 #include <array>
6 #include <functional>
7 #include <memory>
8 
10 
11 namespace nmpc_fmpc
12 {
22 template<int StateDim, int InputDim, int IneqDim>
24 {
25 public:
28 
31 
34 
37 
40 
43 
46 
49 
52 
54  using IneqIneqDimMatrix = Eigen::Matrix<double, IneqDim, IneqDim>;
55 
56 public:
59  {
61  int print_level = 1;
62 
64  int horizon_steps = 100;
65 
67  int max_iter = 10;
68 
70  double kkt_error_thre = 1e-4;
71 
73  bool check_nan = true;
74 
77 
79  bool update_barrier_eps = true;
80 
82  bool break_if_llt_fails = false;
83 
85  bool enable_line_search = false;
86 
89  };
90 
92  enum class Status
93  {
95  Uninitialized = 0,
96 
98  Succeeded = 1,
99 
101  ErrorInForward = 2,
102 
104  ErrorInBackward = 3,
105 
107  ErrorInUpdate = 4,
108 
111 
114  };
115 
117  struct Variable
118  {
122  Variable(int _horizon_steps = 0);
123 
131  void reset(double _x, double _u, double _lambda, double _s, double _nu);
132 
136  bool containsNaN() const;
137 
140 
142  std::vector<StateDimVector> x_list;
143 
145  std::vector<InputDimVector> u_list;
146 
148  std::vector<StateDimVector> lambda_list;
149 
151  std::vector<IneqDimVector> s_list;
152 
154  std::vector<IneqDimVector> nu_list;
155 
157  int print_level = 1;
158  };
159 
161  struct Coefficient
162  {
168  Coefficient(int state_dim, int input_dim, int ineq_dim);
169 
173  Coefficient(int state_dim);
174 
178  bool containsNaN() const;
179 
182 
185 
188 
191 
194 
197 
200 
203 
206 
214 
217 
220 
223 
226 
228  int print_level = 1;
229  };
230 
232  struct TraceData
233  {
235  int iter = 0;
236 
238  double kkt_error = 0;
239 
241  double duration_coeff = 0;
242 
244  double duration_backward = 0;
245 
247  double duration_forward = 0;
248 
250  double duration_update = 0;
251  };
252 
255  {
257  double solve = 0;
258 
260  double setup = 0;
261 
263  double opt = 0;
264 
266  double coeff = 0;
267 
269  double backward = 0;
270 
272  double forward = 0;
273 
275  double update = 0;
276 
278  double gain_pre = 0;
279 
281  double gain_solve = 0;
282 
284  double gain_post = 0;
285 
287  double fraction = 0;
288  };
289 
290 public:
291  EIGEN_MAKE_ALIGNED_OPERATOR_NEW
292 
296  FmpcSolver(const std::shared_ptr<FmpcProblem<StateDim, InputDim, IneqDim>> & problem) : problem_(problem) {}
297 
300  {
301  return config_;
302  }
303 
305  inline const Configuration & config() const
306  {
307  return config_;
308  }
309 
316  Status solve(double current_t, const StateDimVector & current_x, const Variable & initial_variable);
317 
319  inline const Variable & variable() const
320  {
321  return variable_;
322  }
323 
325  inline const std::vector<Coefficient> & coeffList() const
326  {
327  return coeff_list_;
328  }
329 
331  inline const std::vector<TraceData> & traceDataList() const
332  {
333  return trace_data_list_;
334  }
335 
338  {
339  return computation_duration_;
340  }
341 
345  void dumpTraceDataList(const std::string & file_path) const;
346 
347 protected:
349  void checkVariable() const;
350 
355  Status procOnce(int iter);
356 
360  double calcKktError(double barrier_eps) const;
361 
365  bool backwardPass();
366 
370  bool forwardPass();
371 
375  bool updateVariables();
376 
378  void setupMeritFunc();
379 
383  double calcMeritFunc(const Variable & variable) const;
384 
385 protected:
388 
390  std::shared_ptr<FmpcProblem<StateDim, InputDim, IneqDim>> problem_;
391 
394 
397 
399  std::vector<Coefficient> coeff_list_;
400 
402  std::vector<TraceData> trace_data_list_;
403 
406 
408  double current_t_ = 0;
409 
411  StateDimVector current_x_ = StateDimVector::Zero();
412 
414  double barrier_eps_ = 1e-4;
415 
417  double merit_const_scale_ = 0.0;
418 
420  double merit_func_ = 0.0;
421 
423  double merit_deriv_ = 0.0;
424 };
425 } // namespace nmpc_fmpc
426 
427 #include <nmpc_fmpc/FmpcSolver.hpp>
Fast MPC problem.
Definition: FmpcProblem.h:16
Eigen::Matrix< double, IneqDim, InputDim > IneqInputDimMatrix
Type of matrix of inequality x input dimension.
Definition: FmpcProblem.h:43
typename nmpc_ddp::DDPProblem< StateDim, InputDim >::StateStateDimMatrix StateStateDimMatrix
Type of matrix of state x state dimension.
Definition: FmpcProblem.h:28
typename nmpc_ddp::DDPProblem< StateDim, InputDim >::StateInputDimMatrix StateInputDimMatrix
Type of matrix of state x input dimension.
Definition: FmpcProblem.h:34
typename nmpc_ddp::DDPProblem< StateDim, InputDim >::InputInputDimMatrix InputInputDimMatrix
Type of matrix of input x input dimension.
Definition: FmpcProblem.h:31
typename nmpc_ddp::DDPProblem< StateDim, InputDim >::StateDimVector StateDimVector
Type of vector of state dimension.
Definition: FmpcProblem.h:19
typename nmpc_ddp::DDPProblem< StateDim, InputDim >::InputDimVector InputDimVector
Type of vector of input dimension.
Definition: FmpcProblem.h:22
Eigen::Matrix< double, IneqDim, 1 > IneqDimVector
Type of vector of inequality dimension.
Definition: FmpcProblem.h:25
typename nmpc_ddp::DDPProblem< StateDim, InputDim >::InputStateDimMatrix InputStateDimMatrix
Type of matrix of input x state dimension.
Definition: FmpcProblem.h:37
Eigen::Matrix< double, IneqDim, StateDim > IneqStateDimMatrix
Type of matrix of inequality x state dimension.
Definition: FmpcProblem.h:40
FMPC solver.
Definition: FmpcSolver.h:24
typename FmpcProblem< StateDim, InputDim, IneqDim >::InputInputDimMatrix InputInputDimMatrix
Type of matrix of input x input dimension.
Definition: FmpcSolver.h:39
Variable variable_
Optimization variables.
Definition: FmpcSolver.h:393
bool updateVariables()
Update optimization variables given Newton-step direction.
Definition: FmpcSolver.hpp:711
const Variable & variable() const
Const accessor to optimization variables.
Definition: FmpcSolver.h:319
double merit_func_
Merit function.
Definition: FmpcSolver.h:420
std::vector< Coefficient > coeff_list_
Sequence of coefficients of linearized KKT condition.
Definition: FmpcSolver.h:399
typename FmpcProblem< StateDim, InputDim, IneqDim >::InputStateDimMatrix InputStateDimMatrix
Type of matrix of input x state dimension.
Definition: FmpcSolver.h:45
Configuration config_
Configuration.
Definition: FmpcSolver.h:387
bool forwardPass()
Process forward pass a.k.a forward Riccati recursion.
Definition: FmpcSolver.hpp:668
Eigen::Matrix< double, IneqDim, IneqDim > IneqIneqDimMatrix
Type of matrix of inequality x inequality dimension.
Definition: FmpcSolver.h:54
Status
Result status.
Definition: FmpcSolver.h:93
@ MaxIterationReached
Maximum iteration reached.
@ ErrorInUpdate
Error in update.
@ ErrorInBackward
Error in backward.
@ ErrorInForward
Error in forward.
@ IterationContinued
Iteration continued (used internally only)
double current_t_
Current time [sec].
Definition: FmpcSolver.h:408
Status solve(double current_t, const StateDimVector &current_x, const Variable &initial_variable)
Solve optimization.
Definition: FmpcSolver.hpp:158
double calcMeritFunc(const Variable &variable) const
Calculate merit function.
Definition: FmpcSolver.hpp:936
const std::vector< Coefficient > & coeffList() const
Const accessor to sequence of coefficients of linearized KKT condition.
Definition: FmpcSolver.h:325
typename FmpcProblem< StateDim, InputDim, IneqDim >::StateInputDimMatrix StateInputDimMatrix
Type of matrix of state x input dimension.
Definition: FmpcSolver.h:42
EIGEN_MAKE_ALIGNED_OPERATOR_NEW FmpcSolver(const std::shared_ptr< FmpcProblem< StateDim, InputDim, IneqDim >> &problem)
Constructor.
Definition: FmpcSolver.h:296
double merit_const_scale_
Scale of constraint errors in the merit function.
Definition: FmpcSolver.h:417
std::shared_ptr< FmpcProblem< StateDim, InputDim, IneqDim > > problem_
FMPC problem.
Definition: FmpcSolver.h:390
StateDimVector current_x_
Current state.
Definition: FmpcSolver.h:411
const ComputationDuration & computationDuration() const
Const accessor to computation duration.
Definition: FmpcSolver.h:337
std::vector< TraceData > trace_data_list_
Sequence of trace data.
Definition: FmpcSolver.h:402
Status procOnce(int iter)
Process one iteration.
Definition: FmpcSolver.hpp:365
double calcKktError(double barrier_eps) const
Calculate KKT condition error.
Definition: FmpcSolver.hpp:496
typename FmpcProblem< StateDim, InputDim, IneqDim >::IneqStateDimMatrix IneqStateDimMatrix
Type of matrix of inequality x state dimension.
Definition: FmpcSolver.h:48
Variable delta_variable_
Update amount of optimization variables.
Definition: FmpcSolver.h:396
typename FmpcProblem< StateDim, InputDim, IneqDim >::IneqInputDimMatrix IneqInputDimMatrix
Type of matrix of inequality x input dimension.
Definition: FmpcSolver.h:51
typename FmpcProblem< StateDim, InputDim, IneqDim >::IneqDimVector IneqDimVector
Type of vector of inequality dimension.
Definition: FmpcSolver.h:33
void setupMeritFunc()
Setup the merit function and its directional derivative.
Definition: FmpcSolver.hpp:837
ComputationDuration computation_duration_
Computation duration data.
Definition: FmpcSolver.h:405
void dumpTraceDataList(const std::string &file_path) const
Dump trace data list.
Definition: FmpcSolver.hpp:260
bool backwardPass()
Process backward pass a.k.a backward Riccati recursion.
Definition: FmpcSolver.hpp:524
typename FmpcProblem< StateDim, InputDim, IneqDim >::StateStateDimMatrix StateStateDimMatrix
Type of matrix of state x state dimension.
Definition: FmpcSolver.h:36
typename FmpcProblem< StateDim, InputDim, IneqDim >::StateDimVector StateDimVector
Type of vector of state dimension.
Definition: FmpcSolver.h:27
Configuration & config()
Accessor to configuration.
Definition: FmpcSolver.h:299
const Configuration & config() const
Const accessor to configuration.
Definition: FmpcSolver.h:305
typename FmpcProblem< StateDim, InputDim, IneqDim >::InputDimVector InputDimVector
Type of vector of input dimension.
Definition: FmpcSolver.h:30
double merit_deriv_
Directional derivative of merit function.
Definition: FmpcSolver.h:423
void checkVariable() const
Check optimization variables.
Definition: FmpcSolver.hpp:285
const std::vector< TraceData > & traceDataList() const
Const accessor to trace data list.
Definition: FmpcSolver.h:331
double barrier_eps_
Barrier parameter.
Definition: FmpcSolver.h:414
Coefficients of linearized KKT condition.
Definition: FmpcSolver.h:162
Coefficient(int state_dim, int input_dim, int ineq_dim)
Constructor.
Definition: FmpcSolver.hpp:98
StateDimVector s
Offset vector for lambda calculation.
Definition: FmpcSolver.h:222
StateInputDimMatrix Lxu
Second-order derivative of running cost w.r.t. state and input.
Definition: FmpcSolver.h:205
StateStateDimMatrix A
First-order derivative of state equation w.r.t. state.
Definition: FmpcSolver.h:181
StateStateDimMatrix P
Coefficient matrix for lambda calculation.
Definition: FmpcSolver.h:225
int print_level
Print level (0: no print, 1: print only important, 2: print verbose, 3: print very verbose)
Definition: FmpcSolver.h:228
InputInputDimMatrix Luu
Second-order derivative of running cost w.r.t. input.
Definition: FmpcSolver.h:202
StateStateDimMatrix Lxx
Second-order derivative of running cost w.r.t. state.
Definition: FmpcSolver.h:199
IneqInputDimMatrix D
First-order derivative of inequality constraints w.r.t. input.
Definition: FmpcSolver.h:190
IneqStateDimMatrix C
First-order derivative of inequality constraints w.r.t. state.
Definition: FmpcSolver.h:187
InputDimVector Lu
First-order derivative of running cost w.r.t. input.
Definition: FmpcSolver.h:196
InputStateDimMatrix K
Feedback gain for input w.r.t. state error.
Definition: FmpcSolver.h:219
InputDimVector k
Feedforward term for input.
Definition: FmpcSolver.h:216
StateDimVector Lx
First-order derivative of running cost w.r.t. state.
Definition: FmpcSolver.h:193
StateInputDimMatrix B
First-order derivative of state equation w.r.t. input.
Definition: FmpcSolver.h:184
bool containsNaN() const
Check whether NaN or infinity is containd.
Definition: FmpcSolver.hpp:134
Data of computation duration.
Definition: FmpcSolver.h:255
double gain_pre
Duration of pre-process for gain calculation (included in backward) [msec].
Definition: FmpcSolver.h:278
double gain_post
Duration of post-process for gain calculation (included in backward) [msec].
Definition: FmpcSolver.h:284
double solve
Duration to solve [msec].
Definition: FmpcSolver.h:257
double backward
Duration to process backward pass (included in opt) [msec].
Definition: FmpcSolver.h:269
double gain_solve
Duration to solve linear equation for gain calculation (included in backward) [msec].
Definition: FmpcSolver.h:281
double setup
Duration to setup (included in solve) [msec].
Definition: FmpcSolver.h:260
double coeff
Duration to calculate coefficients (included in opt) [msec].
Definition: FmpcSolver.h:266
double update
Duration to update variables (included in opt) [msec].
Definition: FmpcSolver.h:275
double fraction
Duration to calculate fraction-to-boundary rule (included in update) [msec].
Definition: FmpcSolver.h:287
double opt
Duration of optimization loop (included in solve) [msec].
Definition: FmpcSolver.h:263
double forward
Duration to process forward pass (included in opt) [msec].
Definition: FmpcSolver.h:272
bool break_if_llt_fails
Whether to break if LLT decomposition fails.
Definition: FmpcSolver.h:82
bool check_nan
Whether to check NaN.
Definition: FmpcSolver.h:73
bool merit_const_scale_from_lagrange_multipliers
Whether to calculate the scale of constraint errors in the merit function from Lagrange multipliers.
Definition: FmpcSolver.h:88
bool enable_line_search
Whether to enable line search.
Definition: FmpcSolver.h:85
int horizon_steps
Number of steps in horizon.
Definition: FmpcSolver.h:64
int print_level
Print level (0: no print, 1: print only important, 2: print verbose, 3: print very verbose)
Definition: FmpcSolver.h:61
double kkt_error_thre
Threshold of KKT condition error.
Definition: FmpcSolver.h:70
int max_iter
Maximum iteration of optimization loop.
Definition: FmpcSolver.h:67
bool update_barrier_eps
Whether to update barrier parameter.
Definition: FmpcSolver.h:79
bool init_complementary_variable
Whether to initialize complementarity variables.
Definition: FmpcSolver.h:76
Data to trace optimization loop.
Definition: FmpcSolver.h:233
double duration_update
Duration to update variables [msec].
Definition: FmpcSolver.h:250
double duration_backward
Duration to process backward pass [msec].
Definition: FmpcSolver.h:244
double kkt_error
KKT condition error.
Definition: FmpcSolver.h:238
double duration_forward
Duration to process forward pass [msec].
Definition: FmpcSolver.h:247
int iter
Iteration of optimization loop.
Definition: FmpcSolver.h:235
double duration_coeff
Duration to calculate coefficients [msec].
Definition: FmpcSolver.h:241
Optimization variables.
Definition: FmpcSolver.h:118
Variable(int _horizon_steps=0)
Constructor.
Definition: FmpcSolver.hpp:32
int horizon_steps
Number of steps in horizon.
Definition: FmpcSolver.h:139
std::vector< StateDimVector > x_list
Sequence of state (x[0], ..., x[N-1], x[N])
Definition: FmpcSolver.h:142
std::vector< InputDimVector > u_list
Sequence of input (u[0], ..., u[N-1])
Definition: FmpcSolver.h:145
std::vector< StateDimVector > lambda_list
Sequence of Lagrange multipliers of equality constraints (lambda[0], ..., lambda[N-1],...
Definition: FmpcSolver.h:148
int print_level
Print level (0: no print, 1: print only important, 2: print verbose, 3: print very verbose)
Definition: FmpcSolver.h:157
std::vector< IneqDimVector > s_list
Sequence of slack variables of inequality constraints (s[0], ..., s[N-1])
Definition: FmpcSolver.h:151
bool containsNaN() const
Check whether NaN or infinity is containd.
Definition: FmpcSolver.hpp:71
std::vector< IneqDimVector > nu_list
Sequence of Lagrange multipliers of inequality constraints (nu[0], ..., nu[N-1])
Definition: FmpcSolver.h:154
void reset(double _x, double _u, double _lambda, double _s, double _nu)
Reset variables.
Definition: FmpcSolver.hpp:42