centroidal_control_collection
DdpSingleRigidBody.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 ForceColl
8 {
9 class Contact;
10 }
11 
12 namespace CCC
13 {
22 {
23 public:
25  struct MotionParam
26  {
27  EIGEN_MAKE_ALIGNED_OPERATOR_NEW
28 
30  std::vector<std::shared_ptr<ForceColl::Contact>> contact_list;
31 
33  Eigen::Matrix3d inertia_mat = Eigen::Matrix3d::Identity();
34  };
35 
37  struct RefData
38  {
39  EIGEN_MAKE_ALIGNED_OPERATOR_NEW
40 
42  Eigen::Vector3d pos = Eigen::Vector3d::Zero();
43 
45  Eigen::Vector3d ori = Eigen::Vector3d::Zero();
46  };
47 
49  struct WeightParam
50  {
52  Eigen::Vector3d running_pos;
53 
55  Eigen::Vector3d running_ori;
56 
58  Eigen::Vector3d running_linear_vel;
59 
61  Eigen::Vector3d running_angular_vel;
62 
64  double running_force;
65 
67  Eigen::Vector3d terminal_pos;
68 
70  Eigen::Vector3d terminal_ori;
71 
73  Eigen::Vector3d terminal_linear_vel;
74 
76  Eigen::Vector3d terminal_angular_vel;
77 
89  WeightParam(const Eigen::Vector3d & _running_pos = Eigen::Vector3d::Constant(1.0),
90  const Eigen::Vector3d & _running_ori = Eigen::Vector3d::Constant(1.0),
91  const Eigen::Vector3d & _running_linear_vel = Eigen::Vector3d::Constant(0.01),
92  const Eigen::Vector3d & _running_angular_vel = Eigen::Vector3d::Constant(0.01),
93  double _running_force = 1e-6,
94  const Eigen::Vector3d & _terminal_pos = Eigen::Vector3d::Constant(1.0),
95  const Eigen::Vector3d & _terminal_ori = Eigen::Vector3d::Constant(1.0),
96  const Eigen::Vector3d & _terminal_linear_vel = Eigen::Vector3d::Constant(0.01),
97  const Eigen::Vector3d & _terminal_angular_vel = Eigen::Vector3d::Constant(0.01))
98  : running_pos(_running_pos), running_ori(_running_ori), running_linear_vel(_running_linear_vel),
99  running_angular_vel(_running_angular_vel), running_force(_running_force), terminal_pos(_terminal_pos),
100  terminal_ori(_terminal_ori), terminal_linear_vel(_terminal_linear_vel),
101  terminal_angular_vel(_terminal_angular_vel)
102  {
103  }
104  };
105 
110  class DdpProblem : public nmpc_ddp::DDPProblem<12, Eigen::Dynamic>
111  {
112  public:
113  EIGEN_MAKE_ALIGNED_OPERATOR_NEW
114 
120  DdpProblem(double horizon_dt, double mass, const WeightParam & weight_param)
121  : nmpc_ddp::DDPProblem<12, Eigen::Dynamic>(horizon_dt), mass_(mass), weight_param_(weight_param)
122  {
123  }
124 
128  inline void setMotionParamFunc(const std::function<MotionParam(double)> & motion_param_func)
129  {
130  motion_param_func_ = motion_param_func;
131  }
132 
136  inline void setRefDataFunc(const std::function<RefData(double)> & ref_data_func)
137  {
138  ref_data_func_ = ref_data_func;
139  }
140 
141  using DDPProblem::inputDim;
142 
146  virtual int inputDim(double t) const override;
147 
189  virtual StateDimVector stateEq(double t, const StateDimVector & x, const InputDimVector & u) const override;
190 
197  virtual double runningCost(double t, const StateDimVector & x, const InputDimVector & u) const override;
198 
204  virtual double terminalCost(double t, const StateDimVector & x) const override;
205 
238  virtual void calcStateEqDeriv(double t,
239  const StateDimVector & x,
240  const InputDimVector & u,
241  Eigen::Ref<StateStateDimMatrix> state_eq_deriv_x,
242  Eigen::Ref<StateInputDimMatrix> state_eq_deriv_u) const override;
243 
254  inline virtual void calcStateEqDeriv(double, // t
255  const StateDimVector &, // x
256  const InputDimVector &, // u
257  Eigen::Ref<StateStateDimMatrix>, // state_eq_deriv_x
258  Eigen::Ref<StateInputDimMatrix>, // state_eq_deriv_u
259  std::vector<StateStateDimMatrix> &, // state_eq_deriv_xx
260  std::vector<InputInputDimMatrix> &, // state_eq_deriv_uu
261  std::vector<StateInputDimMatrix> & // state_eq_deriv_xu
262  ) const override
263  {
264  throw std::runtime_error("Second-order derivatives of state equation are not implemented.");
265  }
266 
274  virtual void calcRunningCostDeriv(double t,
275  const StateDimVector & x,
276  const InputDimVector & u,
277  Eigen::Ref<StateDimVector> running_cost_deriv_x,
278  Eigen::Ref<InputDimVector> running_cost_deriv_u) const override;
279 
290  virtual void calcRunningCostDeriv(double t,
291  const StateDimVector & x,
292  const InputDimVector & u,
293  Eigen::Ref<StateDimVector> running_cost_deriv_x,
294  Eigen::Ref<InputDimVector> running_cost_deriv_u,
295  Eigen::Ref<StateStateDimMatrix> running_cost_deriv_xx,
296  Eigen::Ref<InputInputDimMatrix> running_cost_deriv_uu,
297  Eigen::Ref<StateInputDimMatrix> running_cost_deriv_xu) const override;
298 
304  virtual void calcTerminalCostDeriv(double t,
305  const StateDimVector & x,
306  Eigen::Ref<StateDimVector> terminal_cost_deriv_x) const override;
307 
314  virtual void calcTerminalCostDeriv(double t,
315  const StateDimVector & x,
316  Eigen::Ref<StateDimVector> terminal_cost_deriv_x,
317  Eigen::Ref<StateStateDimMatrix> terminal_cost_deriv_xx) const override;
318 
319  public:
321  double mass_ = 0;
322 
323  protected:
326 
328  std::function<MotionParam(double)> motion_param_func_;
329 
331  std::function<RefData(double)> ref_data_func_;
332  };
333 
336  {
337  EIGEN_MAKE_ALIGNED_OPERATOR_NEW
338 
340  Eigen::Vector3d pos = Eigen::Vector3d::Zero();
341 
343  Eigen::Vector3d ori = Eigen::Vector3d::Zero();
344 
346  Eigen::Vector3d linear_vel = Eigen::Vector3d::Zero();
347 
349  Eigen::Vector3d angular_vel = Eigen::Vector3d::Zero();
350 
356  std::vector<DdpProblem::InputDimVector> u_list = {};
357 
360 
364  InitialParam(const DdpProblem::StateDimVector & state);
365 
367  DdpProblem::StateDimVector toState() const;
368  };
369 
370 public:
371  EIGEN_MAKE_ALIGNED_OPERATOR_NEW
372 
379  DdpSingleRigidBody(double mass,
380  double horizon_dt,
381  int horizon_steps,
382  const WeightParam & weight_param = WeightParam());
383 
391  Eigen::VectorXd planOnce(const std::function<MotionParam(double)> & motion_param_func,
392  const std::function<RefData(double)> & ref_data_func,
393  const InitialParam & initial_param,
394  double current_time);
395 
396 public:
398  std::shared_ptr<DdpProblem> ddp_problem_;
399 
401  std::shared_ptr<nmpc_ddp::DDPSolver<12, Eigen::Dynamic>> ddp_solver_;
402 
404  std::array<double, 2> force_scale_limits_ = {0.0, 1e6};
405 };
406 } // namespace CCC
CCC::DdpSingleRigidBody
Differential dynamic programming (DDP) for centroidal model with single rigid-body dynamics (SRBD) ap...
Definition: DdpSingleRigidBody.h:21
CCC::DdpSingleRigidBody::WeightParam::terminal_pos
Eigen::Vector3d terminal_pos
CoM position weight in terminal cost.
Definition: DdpSingleRigidBody.h:67
CCC::DdpSingleRigidBody::WeightParam
Weight parameter.
Definition: DdpSingleRigidBody.h:49
CCC::DdpSingleRigidBody::InitialParam
Initial parameter.
Definition: DdpSingleRigidBody.h:335
CCC::DdpSingleRigidBody::RefData::ori
Eigen::Vector3d ori
Base link orientation [rad].
Definition: DdpSingleRigidBody.h:45
CCC::DdpSingleRigidBody::ddp_problem_
std::shared_ptr< DdpProblem > ddp_problem_
DDP problem.
Definition: DdpSingleRigidBody.h:398
CCC::DdpSingleRigidBody::InitialParam::linear_vel
Eigen::Vector3d linear_vel
Linear velocity [m/s].
Definition: DdpSingleRigidBody.h:346
CCC::DdpSingleRigidBody::MotionParam::contact_list
EIGEN_MAKE_ALIGNED_OPERATOR_NEW std::vector< std::shared_ptr< ForceColl::Contact > > contact_list
Contact list.
Definition: DdpSingleRigidBody.h:30
CCC::DdpSingleRigidBody::force_scale_limits_
std::array< double, 2 > force_scale_limits_
Force scale limits (i.e., limits of in the order of lower, upper)
Definition: DdpSingleRigidBody.h:404
CCC::DdpSingleRigidBody::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::DdpSingleRigidBody::WeightParam::terminal_ori
Eigen::Vector3d terminal_ori
Base link orientation weight in terminal cost.
Definition: DdpSingleRigidBody.h:70
CCC::DdpSingleRigidBody::InitialParam::angular_vel
Eigen::Vector3d angular_vel
Angular velocity [rad/s].
Definition: DdpSingleRigidBody.h:349
CCC::DdpSingleRigidBody::planOnce
Eigen::VectorXd planOnce(const std::function< MotionParam(double)> &motion_param_func, const std::function< RefData(double)> &ref_data_func, const InitialParam &initial_param, double current_time)
Plan one step.
CCC::DdpSingleRigidBody::WeightParam::running_linear_vel
Eigen::Vector3d running_linear_vel
Linear velocity weight in running cost.
Definition: DdpSingleRigidBody.h:58
CCC::DdpSingleRigidBody::MotionParam::inertia_mat
Eigen::Matrix3d inertia_mat
Inertia matrix [kg m^2].
Definition: DdpSingleRigidBody.h:33
CCC::DdpSingleRigidBody::DdpProblem::weight_param_
WeightParam weight_param_
Weight parameter.
Definition: DdpSingleRigidBody.h:325
CCC::DdpSingleRigidBody::WeightParam::running_force
double running_force
Force weight in running cost.
Definition: DdpSingleRigidBody.h:64
CCC::DdpSingleRigidBody::DdpProblem::inputDim
virtual int inputDim(double t) const override
Gets the input dimension.
CCC::DdpSingleRigidBody::MotionParam
Motion parameter.
Definition: DdpSingleRigidBody.h:25
CCC::DdpSingleRigidBody::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: DdpSingleRigidBody.h:254
CCC::DdpSingleRigidBody::DdpProblem::setMotionParamFunc
void setMotionParamFunc(const std::function< MotionParam(double)> &motion_param_func)
Set function of motion parameter.
Definition: DdpSingleRigidBody.h:128
CCC::DdpSingleRigidBody::WeightParam::terminal_angular_vel
Eigen::Vector3d terminal_angular_vel
Angular velocity weight in terminal cost.
Definition: DdpSingleRigidBody.h:76
CCC::DdpSingleRigidBody::InitialParam::toState
DdpProblem::StateDimVector toState() const
Get state of DDP problem.
CCC::DdpSingleRigidBody::DdpProblem::stateEq
virtual StateDimVector stateEq(double t, const StateDimVector &x, const InputDimVector &u) const override
Calculate discrete state equation.
CCC::DdpSingleRigidBody::DdpProblem::terminalCost
virtual double terminalCost(double t, const StateDimVector &x) const override
Calculate terminal cost.
CCC::DdpSingleRigidBody::WeightParam::WeightParam
WeightParam(const Eigen::Vector3d &_running_pos=Eigen::Vector3d::Constant(1.0), const Eigen::Vector3d &_running_ori=Eigen::Vector3d::Constant(1.0), const Eigen::Vector3d &_running_linear_vel=Eigen::Vector3d::Constant(0.01), const Eigen::Vector3d &_running_angular_vel=Eigen::Vector3d::Constant(0.01), double _running_force=1e-6, const Eigen::Vector3d &_terminal_pos=Eigen::Vector3d::Constant(1.0), const Eigen::Vector3d &_terminal_ori=Eigen::Vector3d::Constant(1.0), const Eigen::Vector3d &_terminal_linear_vel=Eigen::Vector3d::Constant(0.01), const Eigen::Vector3d &_terminal_angular_vel=Eigen::Vector3d::Constant(0.01))
Constructor.
Definition: DdpSingleRigidBody.h:89
CCC::DdpSingleRigidBody::InitialParam::u_list
std::vector< DdpProblem::InputDimVector > u_list
Initial guess of input sequence.
Definition: DdpSingleRigidBody.h:356
CCC::DdpSingleRigidBody::DdpProblem::ref_data_func_
std::function< RefData(double)> ref_data_func_
Function of reference data.
Definition: DdpSingleRigidBody.h:331
CCC::DdpSingleRigidBody::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
Definition: CommonModels.h:7
CCC::DdpSingleRigidBody::DdpProblem::motion_param_func_
std::function< MotionParam(double)> motion_param_func_
Function of motion parameter.
Definition: DdpSingleRigidBody.h:328
CCC::DdpSingleRigidBody::DdpSingleRigidBody
EIGEN_MAKE_ALIGNED_OPERATOR_NEW DdpSingleRigidBody(double mass, double horizon_dt, int horizon_steps, const WeightParam &weight_param=WeightParam())
Constructor.
CCC::DdpSingleRigidBody::DdpProblem
DDP problem of centroidal model with single rigid-body dynamics (SRBD) approximation.
Definition: DdpSingleRigidBody.h:110
CCC::DdpSingleRigidBody::WeightParam::running_angular_vel
Eigen::Vector3d running_angular_vel
Angular velocity weight in running cost.
Definition: DdpSingleRigidBody.h:61
CCC::DdpSingleRigidBody::InitialParam::ori
Eigen::Vector3d ori
Base link orientation [rad].
Definition: DdpSingleRigidBody.h:343
CCC::DdpSingleRigidBody::DdpProblem::mass_
double mass_
Robot mass [Kg].
Definition: DdpSingleRigidBody.h:321
CCC::DdpSingleRigidBody::InitialParam::InitialParam
InitialParam()
Constructor.
Definition: DdpSingleRigidBody.h:359
CCC::DdpSingleRigidBody::ddp_solver_
std::shared_ptr< nmpc_ddp::DDPSolver< 12, Eigen::Dynamic > > ddp_solver_
DDP solver.
Definition: DdpSingleRigidBody.h:401
ForceColl
Definition: DdpCentroidal.h:7
CCC::DdpSingleRigidBody::DdpProblem::setRefDataFunc
void setRefDataFunc(const std::function< RefData(double)> &ref_data_func)
Set function of reference data.
Definition: DdpSingleRigidBody.h:136
CCC::DdpSingleRigidBody::WeightParam::running_ori
Eigen::Vector3d running_ori
Base link orientation weight in running cost.
Definition: DdpSingleRigidBody.h:55
CCC::DdpSingleRigidBody::InitialParam::pos
EIGEN_MAKE_ALIGNED_OPERATOR_NEW Eigen::Vector3d pos
CoM position [m].
Definition: DdpSingleRigidBody.h:340
CCC::DdpSingleRigidBody::DdpProblem::DdpProblem
EIGEN_MAKE_ALIGNED_OPERATOR_NEW DdpProblem(double horizon_dt, double mass, const WeightParam &weight_param)
Constructor.
Definition: DdpSingleRigidBody.h:120
CCC::DdpSingleRigidBody::DdpProblem::runningCost
virtual double runningCost(double t, const StateDimVector &x, const InputDimVector &u) const override
Calculate running cost.
CCC::DdpSingleRigidBody::RefData
Reference data.
Definition: DdpSingleRigidBody.h:37
CCC::DdpSingleRigidBody::RefData::pos
EIGEN_MAKE_ALIGNED_OPERATOR_NEW Eigen::Vector3d pos
CoM position [m].
Definition: DdpSingleRigidBody.h:42
CCC::DdpSingleRigidBody::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::DdpSingleRigidBody::WeightParam::terminal_linear_vel
Eigen::Vector3d terminal_linear_vel
Linear velocity weight in terminal cost.
Definition: DdpSingleRigidBody.h:73
CCC::DdpSingleRigidBody::WeightParam::running_pos
Eigen::Vector3d running_pos
CoM position weight in running cost.
Definition: DdpSingleRigidBody.h:52