nmpc_ddp
DDPSolver.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 
9 #include <nmpc_ddp/DDPProblem.h>
10 
11 namespace nmpc_ddp
12 {
23 template<int StateDim, int InputDim>
24 class DDPSolver
25 {
26 public:
29 
32 
35 
38 
41 
44 
45 public:
48  {
51  {
52  // Initialize alpha_list
53  int list_size = 11;
54  alpha_list.resize(list_size);
55  Eigen::VectorXd alpha_exponent_list = Eigen::VectorXd::LinSpaced(list_size, 0, -3);
56  for(int i = 0; i < list_size; i++)
57  {
58  alpha_list[i] = std::pow(10, alpha_exponent_list[i]);
59  }
60  }
61 
63  int print_level = 1;
64 
65  // \todo Support use_state_eq_second_derivative
68 
70  bool with_input_constraint = false;
71 
73  int max_iter = 500;
74 
76  int horizon_steps = 100;
77 
79  int reg_type = 1;
80 
82  double initial_lambda = 1e-4; // 1.0
83 
85  double initial_dlambda = 1.0;
86 
88  double lambda_factor = 1.6;
89 
91  double lambda_min = 1e-6;
92 
94  double lambda_max = 1e10;
95 
97  double k_rel_norm_thre = 1e-4;
98 
100  double lambda_thre = 1e-5;
101 
103  Eigen::VectorXd alpha_list;
104 
107 
109  double cost_update_thre = 1e-7;
110  };
111 
113  struct ControlData
114  {
116  std::vector<StateDimVector> x_list;
117 
119  std::vector<InputDimVector> u_list;
120 
122  Eigen::VectorXd cost_list;
123  };
124 
126  struct Derivative
127  {
133  Derivative(int state_dim, int input_dim, int outer_dim)
134  {
135  Fx.resize(state_dim, state_dim);
136  Fu.resize(state_dim, input_dim);
137  Fxx.assign(outer_dim, StateStateDimMatrix(state_dim, state_dim));
138  Fuu.assign(outer_dim, InputInputDimMatrix(input_dim, input_dim));
139  Fxu.assign(outer_dim, StateInputDimMatrix(state_dim, input_dim));
140  Lx.resize(state_dim);
141  Lu.resize(input_dim);
142  Lxx.resize(state_dim, state_dim);
143  Luu.resize(input_dim, input_dim);
144  Lxu.resize(state_dim, input_dim);
145  }
146 
149 
152 
154  std::vector<StateStateDimMatrix> Fxx;
155 
157  std::vector<InputInputDimMatrix> Fuu;
158 
160  std::vector<StateInputDimMatrix> Fxu;
161 
164 
167 
170 
173 
176  };
177 
179  struct TraceData
180  {
182  int iter = 0;
183 
185  double cost = 0;
186 
188  double lambda = 0;
189 
191  double dlambda = 0;
192 
194  double alpha = 0;
195 
197  double k_rel_norm = 0;
198 
200  double cost_update_actual = 0;
201 
204 
206  double cost_update_ratio = 0;
207 
210 
212  double duration_backward = 0;
213 
215  double duration_forward = 0;
216  };
217 
220  {
222  double solve = 0;
223 
225  double setup = 0;
226 
228  double opt = 0;
229 
231  double derivative = 0;
232 
234  double backward = 0;
235 
237  double forward = 0;
238 
240  double Q = 0;
241 
243  double reg = 0;
244 
246  double gain = 0;
247  };
248 
249 public:
250  EIGEN_MAKE_ALIGNED_OPERATOR_NEW
251 
255  DDPSolver(const std::shared_ptr<DDPProblem<StateDim, InputDim>> & problem);
256 
259  {
260  return config_;
261  }
262 
264  inline const Configuration & config() const
265  {
266  return config_;
267  }
268 
275  bool solve(double current_t, const StateDimVector & current_x, const std::vector<InputDimVector> & initial_u_list);
276 
282  inline void setInputLimitsFunc(const std::function<std::array<InputDimVector, 2>(double)> & input_limits_func)
283  {
284  input_limits_func_ = input_limits_func;
285  }
286 
288  inline const ControlData & controlData() const
289  {
290  return control_data_;
291  }
292 
294  inline const std::vector<TraceData> & traceDataList() const
295  {
296  return trace_data_list_;
297  }
298 
301  {
302  return computation_duration_;
303  }
304 
308  void dumpTraceDataList(const std::string & file_path) const;
309 
310 protected:
315  int procOnce(int iter);
316 
320  bool backwardPass();
321 
325  void forwardPass(double alpha);
326 
327 protected:
330 
332  std::shared_ptr<DDPProblem<StateDim, InputDim>> problem_;
333 
335  std::vector<TraceData> trace_data_list_;
336 
338  std::function<std::array<InputDimVector, 2>(double)> input_limits_func_;
339 
342 
344  double current_t_ = 0;
345 
347  double lambda_ = 0;
348 
350  double dlambda_ = 0;
351 
354 
357 
359  std::vector<InputDimVector> k_list_;
360 
362  std::vector<InputStateDimMatrix> K_list_;
363 
365  std::vector<Derivative> derivative_list_;
366 
369 
372 
374  Eigen::Vector2d dV_;
375 };
376 } // namespace nmpc_ddp
377 
378 #include <nmpc_ddp/DDPSolver.hpp>
DDP problem.
Definition: DDPProblem.h:17
Eigen::Matrix< double, InputDim, 1 > InputDimVector
Type of vector of input dimension.
Definition: DDPProblem.h:23
Eigen::Matrix< double, InputDim, InputDim > InputInputDimMatrix
Type of matrix of input x input dimension.
Definition: DDPProblem.h:29
Eigen::Matrix< double, StateDim, 1 > StateDimVector
Type of vector of state dimension.
Definition: DDPProblem.h:20
Eigen::Matrix< double, InputDim, StateDim > InputStateDimMatrix
Type of matrix of input x state dimension.
Definition: DDPProblem.h:35
Eigen::Matrix< double, StateDim, StateDim > StateStateDimMatrix
Type of matrix of state x state dimension.
Definition: DDPProblem.h:26
Eigen::Matrix< double, StateDim, InputDim > StateInputDimMatrix
Type of matrix of state x input dimension.
Definition: DDPProblem.h:32
DDP solver.
Definition: DDPSolver.h:25
std::shared_ptr< DDPProblem< StateDim, InputDim > > problem_
DDP problem.
Definition: DDPSolver.h:332
typename DDPProblem< StateDim, InputDim >::StateStateDimMatrix StateStateDimMatrix
Type of matrix of state x state dimension.
Definition: DDPSolver.h:34
ComputationDuration computation_duration_
Computation duration data.
Definition: DDPSolver.h:341
void forwardPass(double alpha)
Process forward pass.
Definition: DDPSolver.hpp:537
bool backwardPass()
Process backward pass.
Definition: DDPSolver.hpp:343
typename DDPProblem< StateDim, InputDim >::InputInputDimMatrix InputInputDimMatrix
Type of matrix of input x input dimension.
Definition: DDPSolver.h:37
double current_t_
Current time [sec].
Definition: DDPSolver.h:344
const ControlData & controlData() const
Const accessor to control data calculated by solve().
Definition: DDPSolver.h:288
const std::vector< TraceData > & traceDataList() const
Const accessor to trace data list.
Definition: DDPSolver.h:294
ControlData control_data_
Control data (sequence of state, input, and cost)
Definition: DDPSolver.h:353
typename DDPProblem< StateDim, InputDim >::StateInputDimMatrix StateInputDimMatrix
Type of matrix of state x input dimension.
Definition: DDPSolver.h:40
const ComputationDuration & computationDuration() const
Const accessor to computation duration.
Definition: DDPSolver.h:300
StateStateDimMatrix last_Vxx_
Second-order derivative of value in last step of horizon.
Definition: DDPSolver.h:371
void setInputLimitsFunc(const std::function< std::array< InputDimVector, 2 >(double)> &input_limits_func)
Set function to return input limits.
Definition: DDPSolver.h:282
typename DDPProblem< StateDim, InputDim >::StateDimVector StateDimVector
Type of vector of state dimension.
Definition: DDPSolver.h:28
std::vector< InputStateDimMatrix > K_list_
Sequence of feedback gain for input w.r.t. state error (K[0], ..., K[N-1])
Definition: DDPSolver.h:362
ControlData candidate_control_data_
Candidate control data (sequence of state, input, and cost)
Definition: DDPSolver.h:356
std::vector< InputDimVector > k_list_
Sequence of feedforward term for input (k[0], ..., k[N-1])
Definition: DDPSolver.h:359
void dumpTraceDataList(const std::string &file_path) const
Dump trace data list.
Definition: DDPSolver.hpp:563
std::vector< Derivative > derivative_list_
Sequence of derivatives.
Definition: DDPSolver.h:365
StateDimVector last_Vx_
First-order derivative of value in last step of horizon.
Definition: DDPSolver.h:368
double lambda_
Regularization coefficient.
Definition: DDPSolver.h:347
typename DDPProblem< StateDim, InputDim >::InputStateDimMatrix InputStateDimMatrix
Type of matrix of input x state dimension.
Definition: DDPSolver.h:43
Configuration config_
Configuration.
Definition: DDPSolver.h:329
Eigen::Vector2d dV_
Expected update of value.
Definition: DDPSolver.h:374
int procOnce(int iter)
Process one iteration.
Definition: DDPSolver.hpp:144
std::function< std::array< InputDimVector, 2 >double)> input_limits_func_
Function to return input limits (in the order of lower, upper)
Definition: DDPSolver.h:338
typename DDPProblem< StateDim, InputDim >::InputDimVector InputDimVector
Type of vector of input dimension.
Definition: DDPSolver.h:31
bool solve(double current_t, const StateDimVector &current_x, const std::vector< InputDimVector > &initial_u_list)
Solve optimization.
Definition: DDPSolver.hpp:27
const Configuration & config() const
Const accessor to configuration.
Definition: DDPSolver.h:264
EIGEN_MAKE_ALIGNED_OPERATOR_NEW DDPSolver(const std::shared_ptr< DDPProblem< StateDim, InputDim >> &problem)
Constructor.
Definition: DDPSolver.hpp:21
Configuration & config()
Accessor to configuration.
Definition: DDPSolver.h:258
std::vector< TraceData > trace_data_list_
Sequence of trace data.
Definition: DDPSolver.h:335
double dlambda_
Scaling factor of regularization coefficient.
Definition: DDPSolver.h:350
Definition: BoxQP.h:10
Data of computation duration.
Definition: DDPSolver.h:220
double reg
Duration to calculate regularization (included in backward) [msec].
Definition: DDPSolver.h:243
double gain
Duration to calculate gains (included in backward) [msec].
Definition: DDPSolver.h:246
double opt
Duration of optimization loop (included in solve) [msec].
Definition: DDPSolver.h:228
double derivative
Duration to calculate derivatives (included in opt) [msec].
Definition: DDPSolver.h:231
double setup
Duration to setup (included in solve) [msec].
Definition: DDPSolver.h:225
double Q
Duration to calculate Q (included in backward) [msec].
Definition: DDPSolver.h:240
double backward
Duration to process backward pass (included in opt) [msec].
Definition: DDPSolver.h:234
double solve
Duration to solve [msec].
Definition: DDPSolver.h:222
double forward
Duration to process forward pass (included in opt) [msec].
Definition: DDPSolver.h:237
double cost_update_ratio_thre
Allowable threshold of cost update ratio.
Definition: DDPSolver.h:106
int max_iter
Maximum iteration of optimization loop.
Definition: DDPSolver.h:73
double k_rel_norm_thre
Termination threshold of relative norm of k.
Definition: DDPSolver.h:97
bool use_state_eq_second_derivative
Whether to use second-order derivatives of state equation.
Definition: DDPSolver.h:67
double initial_dlambda
Initial scaling factor of regularization coefficient.
Definition: DDPSolver.h:85
int reg_type
Regularization type (1: Quu + lambda * I, 2: Vxx + lambda * I)
Definition: DDPSolver.h:79
double lambda_max
Maximum regularization coefficient.
Definition: DDPSolver.h:94
double lambda_factor
Increasing/decreasing factor of regularization coefficient scaling.
Definition: DDPSolver.h:88
bool with_input_constraint
Whether input has constraints.
Definition: DDPSolver.h:70
int horizon_steps
Number of steps in horizon.
Definition: DDPSolver.h:76
double lambda_thre
Termination threshold of regularization coefficient.
Definition: DDPSolver.h:100
double initial_lambda
Initial regularization coefficient.
Definition: DDPSolver.h:82
int print_level
Print level (0: no print, 1: print only important, 2: print verbose, 3: print very verbose)
Definition: DDPSolver.h:63
double cost_update_thre
Termination threshold of cost update.
Definition: DDPSolver.h:109
Eigen::VectorXd alpha_list
List of alpha (scaling factor of k)
Definition: DDPSolver.h:103
double lambda_min
Minimum regularization coefficient.
Definition: DDPSolver.h:91
std::vector< InputDimVector > u_list
Sequence of input (u[0], ..., u[N-1])
Definition: DDPSolver.h:119
std::vector< StateDimVector > x_list
Sequence of state (x[0], ..., x[N-1], x[N])
Definition: DDPSolver.h:116
Eigen::VectorXd cost_list
Sequence of cost (L[0], ..., L[N-1], phi[N])
Definition: DDPSolver.h:122
Derivatives of DDP problem.
Definition: DDPSolver.h:127
StateStateDimMatrix Fx
First-order derivative of state equation w.r.t. state.
Definition: DDPSolver.h:148
std::vector< StateInputDimMatrix > Fxu
Second-order derivative of state equation w.r.t. state and input (tensor of rank 3)
Definition: DDPSolver.h:160
InputDimVector Lu
First-order derivative of running cost w.r.t. input.
Definition: DDPSolver.h:166
StateInputDimMatrix Lxu
Second-order derivative of running cost w.r.t. state and input.
Definition: DDPSolver.h:175
std::vector< StateStateDimMatrix > Fxx
Second-order derivative of state equation w.r.t. state (tensor of rank 3)
Definition: DDPSolver.h:154
StateDimVector Lx
First-order derivative of running cost w.r.t. state.
Definition: DDPSolver.h:163
std::vector< InputInputDimMatrix > Fuu
Second-order derivative of state equation w.r.t. input (tensor of rank 3)
Definition: DDPSolver.h:157
InputInputDimMatrix Luu
Second-order derivative of running cost w.r.t. input.
Definition: DDPSolver.h:172
StateStateDimMatrix Lxx
Second-order derivative of running cost w.r.t. state.
Definition: DDPSolver.h:169
Derivative(int state_dim, int input_dim, int outer_dim)
Constructor.
Definition: DDPSolver.h:133
StateInputDimMatrix Fu
First-order derivative of state equation w.r.t. input.
Definition: DDPSolver.h:151
Data to trace optimization loop.
Definition: DDPSolver.h:180
double cost_update_actual
Actual update value of cost.
Definition: DDPSolver.h:200
double k_rel_norm
Norm of relative values of k and u.
Definition: DDPSolver.h:197
double alpha
Scaling factor of k.
Definition: DDPSolver.h:194
double lambda
Regularization coefficient.
Definition: DDPSolver.h:188
double cost_update_expected
Expected update value of cost.
Definition: DDPSolver.h:203
double duration_forward
Duration to process forward pass [msec].
Definition: DDPSolver.h:215
int iter
Iteration of optimization loop.
Definition: DDPSolver.h:182
double duration_backward
Duration to process backward pass [msec].
Definition: DDPSolver.h:212
double cost
Total cost.
Definition: DDPSolver.h:185
double cost_update_ratio
Ratio of actual and expected update values of cost.
Definition: DDPSolver.h:206
double duration_derivative
Duration to calculate derivatives [msec].
Definition: DDPSolver.h:209
double dlambda
Scaling factor of regularization coefficient.
Definition: DDPSolver.h:191