centroidal_control_collection
DdpZmp.h
Go to the documentation of this file.
1 /* Author: Masaki Murooka */
2 
3 #pragma once
4 
5 #include <nmpc_ddp/DDPSolver.h>
6 
7 namespace CCC
8 {
15 class DdpZmp
16 {
17 public:
19  struct RefData
20  {
21  EIGEN_MAKE_ALIGNED_OPERATOR_NEW
22 
24  Eigen::Vector3d zmp = Eigen::Vector3d::Zero();
25 
27  double com_z = 0;
28  };
29 
31  struct PlannedData
32  {
33  EIGEN_MAKE_ALIGNED_OPERATOR_NEW
34 
36  Eigen::Vector2d zmp = Eigen::Vector2d::Zero();
37 
39  double force_z = 0;
40  };
41 
43  struct WeightParam
44  {
47 
49  double running_zmp;
50 
53 
56 
59 
62 
71  WeightParam(double _running_com_pos_z = 1e2,
72  double _running_zmp = 1e-1,
73  double _running_force_z = 1e-4,
74  double _terminal_com_pos_xy = 1.0,
75  double _terminal_com_pos_z = 1e2,
76  double _terminal_com_vel = 1.0)
77  : running_com_pos_z(_running_com_pos_z), running_zmp(_running_zmp), running_force_z(_running_force_z),
78  terminal_com_pos_xy(_terminal_com_pos_xy), terminal_com_pos_z(_terminal_com_pos_z),
79  terminal_com_vel(_terminal_com_vel)
80  {
81  }
82  };
83 
101  class DdpProblem : public nmpc_ddp::DDPProblem<6, 3>
102  {
103  public:
104  EIGEN_MAKE_ALIGNED_OPERATOR_NEW
105 
111  DdpProblem(double horizon_dt, double mass, const WeightParam & weight_param)
112  : nmpc_ddp::DDPProblem<6, 3>(horizon_dt), mass_(mass), weight_param_(weight_param)
113  {
114  }
115 
119  void setRefDataFunc(const std::function<RefData(double)> & ref_data_func)
120  {
121  ref_data_func_ = ref_data_func;
122  }
123 
130  virtual StateDimVector stateEq(double t, const StateDimVector & x, const InputDimVector & u) const override;
131 
138  virtual double runningCost(double t, const StateDimVector & x, const InputDimVector & u) const override;
139 
145  virtual double terminalCost(double t, const StateDimVector & x) const override;
146 
154  virtual void calcStateEqDeriv(double t,
155  const StateDimVector & x,
156  const InputDimVector & u,
157  Eigen::Ref<StateStateDimMatrix> state_eq_deriv_x,
158  Eigen::Ref<StateInputDimMatrix> state_eq_deriv_u) const override;
159 
170  inline virtual void calcStateEqDeriv(double, // t
171  const StateDimVector &, // x
172  const InputDimVector &, // u
173  Eigen::Ref<StateStateDimMatrix>, // state_eq_deriv_x
174  Eigen::Ref<StateInputDimMatrix>, // state_eq_deriv_u
175  std::vector<StateStateDimMatrix> &, // state_eq_deriv_xx
176  std::vector<InputInputDimMatrix> &, // state_eq_deriv_uu
177  std::vector<StateInputDimMatrix> & // state_eq_deriv_xu
178  ) const override
179  {
180  throw std::runtime_error("Second-order derivatives of state equation are not implemented.");
181  }
182 
190  virtual void calcRunningCostDeriv(double t,
191  const StateDimVector & x,
192  const InputDimVector & u,
193  Eigen::Ref<StateDimVector> running_cost_deriv_x,
194  Eigen::Ref<InputDimVector> running_cost_deriv_u) const override;
195 
206  virtual void calcRunningCostDeriv(double t,
207  const StateDimVector & x,
208  const InputDimVector & u,
209  Eigen::Ref<StateDimVector> running_cost_deriv_x,
210  Eigen::Ref<InputDimVector> running_cost_deriv_u,
211  Eigen::Ref<StateStateDimMatrix> running_cost_deriv_xx,
212  Eigen::Ref<InputInputDimMatrix> running_cost_deriv_uu,
213  Eigen::Ref<StateInputDimMatrix> running_cost_deriv_xu) const override;
214 
220  virtual void calcTerminalCostDeriv(double t,
221  const StateDimVector & x,
222  Eigen::Ref<StateDimVector> terminal_cost_deriv_x) const override;
223 
230  virtual void calcTerminalCostDeriv(double t,
231  const StateDimVector & x,
232  Eigen::Ref<StateDimVector> terminal_cost_deriv_x,
233  Eigen::Ref<StateStateDimMatrix> terminal_cost_deriv_xx) const override;
234 
235  protected:
237  double mass_;
238 
241 
243  std::function<RefData(double)> ref_data_func_;
244  };
245 
248  {
249  EIGEN_MAKE_ALIGNED_OPERATOR_NEW
250 
252  Eigen::Vector3d pos = Eigen::Vector3d::Zero();
253 
255  Eigen::Vector3d vel = Eigen::Vector3d::Zero();
256 
262  std::vector<DdpProblem::InputDimVector> u_list = {};
263 
265  DdpProblem::StateDimVector toState() const;
266  };
267 
268 public:
269  EIGEN_MAKE_ALIGNED_OPERATOR_NEW
270 
277  DdpZmp(double mass, double horizon_dt, int horizon_steps, const WeightParam & weight_param = WeightParam())
278  : ddp_problem_(std::make_shared<DdpProblem>(horizon_dt, mass, weight_param)),
279  ddp_solver_(std::make_shared<nmpc_ddp::DDPSolver<6, 3>>(ddp_problem_))
280  {
281  ddp_solver_->config().horizon_steps = horizon_steps;
282  }
283 
290  PlannedData planOnce(const std::function<RefData(double)> & ref_data_func,
291  const InitialParam & initial_param,
292  double current_time);
293 
294 public:
296  std::shared_ptr<DdpProblem> ddp_problem_;
297 
299  std::shared_ptr<nmpc_ddp::DDPSolver<6, 3>> ddp_solver_;
300 };
301 } // namespace CCC
CCC::DdpZmp::DdpProblem
DDP problem of CoM-ZMP model.
Definition: DdpZmp.h:101
CCC::DdpZmp::WeightParam::terminal_com_vel
double terminal_com_vel
CoM velocity weight in terminal cost.
Definition: DdpZmp.h:61
CCC::DdpZmp::PlannedData::force_z
double force_z
Z force [N].
Definition: DdpZmp.h:39
CCC::DdpZmp::InitialParam
Initial parameter.
Definition: DdpZmp.h:247
CCC::DdpZmp::RefData
Reference data.
Definition: DdpZmp.h:19
CCC::DdpZmp::planOnce
PlannedData planOnce(const std::function< RefData(double)> &ref_data_func, const InitialParam &initial_param, double current_time)
Plan one step.
CCC::DdpZmp::PlannedData
Planned data.
Definition: DdpZmp.h:31
CCC::DdpZmp::DdpProblem::calcTerminalCostDeriv
virtual void calcTerminalCostDeriv(double t, const StateDimVector &x, Eigen::Ref< StateDimVector > terminal_cost_deriv_x) const override
Calculate first-order derivatives of terminal cost.
CCC::DdpZmp::InitialParam::vel
Eigen::Vector3d vel
CoM velocity [m/s].
Definition: DdpZmp.h:255
CCC::DdpZmp::InitialParam::toState
DdpProblem::StateDimVector toState() const
Get state of DDP problem.
CCC::DdpZmp::DdpProblem::calcStateEqDeriv
virtual void calcStateEqDeriv(double t, const StateDimVector &x, const InputDimVector &u, Eigen::Ref< StateStateDimMatrix > state_eq_deriv_x, Eigen::Ref< StateInputDimMatrix > state_eq_deriv_u) const override
Calculate first-order derivatives of discrete state equation.
CCC::DdpZmp::WeightParam::running_zmp
double running_zmp
ZMP weight in running cost.
Definition: DdpZmp.h:49
CCC::DdpZmp::DdpProblem::DdpProblem
EIGEN_MAKE_ALIGNED_OPERATOR_NEW DdpProblem(double horizon_dt, double mass, const WeightParam &weight_param)
Constructor.
Definition: DdpZmp.h:111
CCC::DdpZmp::DdpProblem::weight_param_
WeightParam weight_param_
Weight parameter.
Definition: DdpZmp.h:240
CCC::DdpZmp::DdpProblem::setRefDataFunc
void setRefDataFunc(const std::function< RefData(double)> &ref_data_func)
Set function of reference data.
Definition: DdpZmp.h:119
CCC::DdpZmp::InitialParam::u_list
std::vector< DdpProblem::InputDimVector > u_list
Initial guess of input sequence.
Definition: DdpZmp.h:262
CCC::DdpZmp::DdpProblem::calcStateEqDeriv
virtual void calcStateEqDeriv(double, const StateDimVector &, const InputDimVector &, Eigen::Ref< StateStateDimMatrix >, Eigen::Ref< StateInputDimMatrix >, std::vector< StateStateDimMatrix > &, std::vector< InputInputDimMatrix > &, std::vector< StateInputDimMatrix > &) const override
Calculate first-order and second-order derivatives of discrete state equation.
Definition: DdpZmp.h:170
CCC::DdpZmp::DdpProblem::stateEq
virtual StateDimVector stateEq(double t, const StateDimVector &x, const InputDimVector &u) const override
Calculate discrete state equation.
CCC::DdpZmp::WeightParam::terminal_com_pos_z
double terminal_com_pos_z
CoM z position weight in terminal cost.
Definition: DdpZmp.h:58
CCC::DdpZmp::DdpProblem::calcRunningCostDeriv
virtual void calcRunningCostDeriv(double t, const StateDimVector &x, const InputDimVector &u, Eigen::Ref< StateDimVector > running_cost_deriv_x, Eigen::Ref< InputDimVector > running_cost_deriv_u) const override
Calculate first-order derivatives of running cost.
CCC::DdpZmp::WeightParam::running_force_z
double running_force_z
Z force weight in running cost.
Definition: DdpZmp.h:52
CCC
Definition: CommonModels.h:7
CCC::DdpZmp::WeightParam::WeightParam
WeightParam(double _running_com_pos_z=1e2, double _running_zmp=1e-1, double _running_force_z=1e-4, double _terminal_com_pos_xy=1.0, double _terminal_com_pos_z=1e2, double _terminal_com_vel=1.0)
Constructor.
Definition: DdpZmp.h:71
CCC::DdpZmp::DdpZmp
EIGEN_MAKE_ALIGNED_OPERATOR_NEW DdpZmp(double mass, double horizon_dt, int horizon_steps, const WeightParam &weight_param=WeightParam())
Constructor.
Definition: DdpZmp.h:277
CCC::DdpZmp::WeightParam::terminal_com_pos_xy
double terminal_com_pos_xy
CoM x and y position weight in terminal cost.
Definition: DdpZmp.h:55
CCC::DdpZmp::WeightParam
Weight parameter.
Definition: DdpZmp.h:43
CCC::DdpZmp::ddp_solver_
std::shared_ptr< nmpc_ddp::DDPSolver< 6, 3 > > ddp_solver_
DDP solver.
Definition: DdpZmp.h:299
CCC::DdpZmp::RefData::com_z
double com_z
CoM z position [m].
Definition: DdpZmp.h:27
CCC::DdpZmp
Differential dynamic programming (DDP) for CoM-ZMP model.
Definition: DdpZmp.h:15
CCC::DdpZmp::DdpProblem::terminalCost
virtual double terminalCost(double t, const StateDimVector &x) const override
Calculate terminal cost.
CCC::DdpZmp::WeightParam::running_com_pos_z
double running_com_pos_z
CoM z position weight in running cost.
Definition: DdpZmp.h:46
CCC::DdpZmp::DdpProblem::ref_data_func_
std::function< RefData(double)> ref_data_func_
Function of reference data.
Definition: DdpZmp.h:243
CCC::DdpZmp::PlannedData::zmp
EIGEN_MAKE_ALIGNED_OPERATOR_NEW Eigen::Vector2d zmp
ZMP [m].
Definition: DdpZmp.h:36
CCC::DdpZmp::DdpProblem::runningCost
virtual double runningCost(double t, const StateDimVector &x, const InputDimVector &u) const override
Calculate running cost.
CCC::DdpZmp::DdpProblem::mass_
double mass_
Robot mass [Kg].
Definition: DdpZmp.h:237
CCC::DdpZmp::InitialParam::pos
EIGEN_MAKE_ALIGNED_OPERATOR_NEW Eigen::Vector3d pos
CoM position [m].
Definition: DdpZmp.h:252
CCC::DdpZmp::ddp_problem_
std::shared_ptr< DdpProblem > ddp_problem_
DDP problem.
Definition: DdpZmp.h:296
CCC::DdpZmp::RefData::zmp
EIGEN_MAKE_ALIGNED_OPERATOR_NEW Eigen::Vector3d zmp
ZMP [m].
Definition: DdpZmp.h:24