centroidal_control_collection
LinearMpcXY.h
Go to the documentation of this file.
1 /* Author: Masaki Murooka */
2 
3 #pragma once
4 
5 #include <functional>
6 
7 #include <SpaceVecAlg/SpaceVecAlg>
8 
9 #include <qp_solver_collection/QpSolverCollection.h>
10 
12 
13 namespace ForceColl
14 {
15 class Contact;
16 }
17 
18 namespace CCC
19 {
29 {
30 public:
32  static constexpr int state_dim_ = 6;
33 
36 
39 
40 public:
42  struct MotionParam
43  {
44  EIGEN_MAKE_ALIGNED_OPERATOR_NEW
45 
47  double com_z;
48 
50  double total_force_z;
51 
53  std::vector<std::shared_ptr<ForceColl::Contact>> contact_list;
54  };
55 
57  struct InitialParam
58  {
59  EIGEN_MAKE_ALIGNED_OPERATOR_NEW
60 
62  Eigen::Vector2d pos = Eigen::Vector2d::Zero();
63 
65  Eigen::Vector2d vel = Eigen::Vector2d::Zero();
66 
68  Eigen::Vector2d angular_momentum = Eigen::Vector2d::Zero();
69 
73  StateDimVector toState(double mass) const;
74  };
75 
77  struct RefData
78  {
79  EIGEN_MAKE_ALIGNED_OPERATOR_NEW
80 
82  Eigen::Vector2d pos = Eigen::Vector2d::Zero();
83 
85  Eigen::Vector2d vel = Eigen::Vector2d::Zero();
86 
88  Eigen::Vector2d angular_momentum = Eigen::Vector2d::Zero();
89 
91  static constexpr int outputDim()
92  {
93  return 6;
94  }
95 
99  StateDimVector toOutput(double mass) const;
100  };
101 
103  struct WeightParam
104  {
105  EIGEN_MAKE_ALIGNED_OPERATOR_NEW
106 
108  Eigen::Vector2d linear_momentum_integral;
109 
111  Eigen::Vector2d linear_momentum;
112 
114  Eigen::Vector2d angular_momentum;
115 
117  double force;
118 
125  WeightParam(const Eigen::Vector2d & _linear_momentum_integral = Eigen::Vector2d::Constant(1.0),
126  const Eigen::Vector2d & _linear_momentum = Eigen::Vector2d::Constant(0.0),
127  const Eigen::Vector2d & _angular_momentum = Eigen::Vector2d::Constant(1.0),
128  double _force = 1e-5)
129  : linear_momentum_integral(_linear_momentum_integral), linear_momentum(_linear_momentum),
130  angular_momentum(_angular_momentum), force(_force)
131  {
132  }
133 
137  Eigen::VectorXd inputWeight(int total_input_dim) const;
138 
142  Eigen::VectorXd outputWeight(size_t seq_len) const;
143  };
144 
186  class Model : public _StateSpaceModel
187  {
188  public:
194  Model(double mass, const MotionParam & motion_param, int output_dim = 0);
195 
196  public:
199  };
200 
201 public:
202  EIGEN_MAKE_ALIGNED_OPERATOR_NEW
203 
211  LinearMpcXY(double mass,
212  double horizon_dt,
213  int horizon_steps,
214  const WeightParam & weight_param = WeightParam(),
215  QpSolverCollection::QpSolverType qp_solver_type = QpSolverCollection::QpSolverType::Any);
216 
224  Eigen::VectorXd planOnce(const std::function<MotionParam(double)> & motion_param_func,
225  const std::function<RefData(double)> & ref_data_func,
226  const InitialParam & initial_param,
227  double current_time);
228 
229 protected:
231  Eigen::VectorXd procOnce(const std::vector<std::shared_ptr<_StateSpaceModel>> & model_list,
232  const StateDimVector & current_x,
233  const Eigen::VectorXd & ref_output_seq);
234 
235 public:
237  double mass_ = 0;
238 
240  double horizon_dt_ = 0;
241 
243  int horizon_steps_ = 0;
244 
247 
249  std::shared_ptr<QpSolverCollection::QpSolver> qp_solver_;
250 
252  QpSolverCollection::QpCoeff qp_coeff_;
253 
255  std::pair<double, double> force_range_;
256 };
257 } // namespace CCC
State-space model.
Definition: LinearMpcXY.h:187
Model(double mass, const MotionParam &motion_param, int output_dim=0)
Constructor.
MotionParam motion_param_
Motion parameter.
Definition: LinearMpcXY.h:198
Linear MPC of translational and rotational x,y-component motion considering predefined z-component mo...
Definition: LinearMpcXY.h:29
EIGEN_MAKE_ALIGNED_OPERATOR_NEW LinearMpcXY(double mass, double horizon_dt, int horizon_steps, const WeightParam &weight_param=WeightParam(), QpSolverCollection::QpSolverType qp_solver_type=QpSolverCollection::QpSolverType::Any)
Constructor.
int horizon_steps_
Number of steps in horizon.
Definition: LinearMpcXY.h:243
WeightParam weight_param_
Objective weight parameter.
Definition: LinearMpcXY.h:246
std::shared_ptr< QpSolverCollection::QpSolver > qp_solver_
QP solver.
Definition: LinearMpcXY.h:249
double mass_
Robot mass [kg].
Definition: LinearMpcXY.h:237
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.
std::pair< double, double > force_range_
Min/max ridge force [N].
Definition: LinearMpcXY.h:255
double horizon_dt_
Discretization timestep in horizon [sec].
Definition: LinearMpcXY.h:240
QpSolverCollection::QpCoeff qp_coeff_
QP coefficients.
Definition: LinearMpcXY.h:252
_StateSpaceModel::StateDimVector StateDimVector
Type of state vector.
Definition: LinearMpcXY.h:38
Eigen::VectorXd procOnce(const std::vector< std::shared_ptr< _StateSpaceModel >> &model_list, const StateDimVector &current_x, const Eigen::VectorXd &ref_output_seq)
Process one step.
static constexpr int state_dim_
State dimension.
Definition: LinearMpcXY.h:32
State-space model.
Eigen::Matrix< double, StateDim, 1 > StateDimVector
Type of state vector.
EIGEN_MAKE_ALIGNED_OPERATOR_NEW Eigen::Vector2d pos
CoM position [m].
Definition: LinearMpcXY.h:62
StateDimVector toState(double mass) const
Get state of state-space model.
Eigen::Vector2d angular_momentum
Angular momentum [kg m^2/s].
Definition: LinearMpcXY.h:68
Eigen::Vector2d vel
CoM linear velocity [m/s].
Definition: LinearMpcXY.h:65
std::vector< std::shared_ptr< ForceColl::Contact > > contact_list
Contact list.
Definition: LinearMpcXY.h:53
EIGEN_MAKE_ALIGNED_OPERATOR_NEW double com_z
CoM z position [m].
Definition: LinearMpcXY.h:47
double total_force_z
Total z force [N].
Definition: LinearMpcXY.h:50
StateDimVector toOutput(double mass) const
Get reference output of state-space model.
static constexpr int outputDim()
Get reference output size.
Definition: LinearMpcXY.h:91
Eigen::Vector2d angular_momentum
Angular momentum [kg m^2/s].
Definition: LinearMpcXY.h:88
EIGEN_MAKE_ALIGNED_OPERATOR_NEW Eigen::Vector2d pos
CoM position [m].
Definition: LinearMpcXY.h:82
Eigen::Vector2d vel
CoM linear velocity [m/s].
Definition: LinearMpcXY.h:85
double force
Force weight.
Definition: LinearMpcXY.h:117
Eigen::VectorXd outputWeight(size_t seq_len) const
Get output weight vector.
Eigen::VectorXd inputWeight(int total_input_dim) const
Get input weight vector.
EIGEN_MAKE_ALIGNED_OPERATOR_NEW Eigen::Vector2d linear_momentum_integral
Linear momentum integral weight.
Definition: LinearMpcXY.h:108
Eigen::Vector2d linear_momentum
Linear momentum weight.
Definition: LinearMpcXY.h:111
WeightParam(const Eigen::Vector2d &_linear_momentum_integral=Eigen::Vector2d::Constant(1.0), const Eigen::Vector2d &_linear_momentum=Eigen::Vector2d::Constant(0.0), const Eigen::Vector2d &_angular_momentum=Eigen::Vector2d::Constant(1.0), double _force=1e-5)
Constructor.
Definition: LinearMpcXY.h:125
Eigen::Vector2d angular_momentum
Angular momentum weight.
Definition: LinearMpcXY.h:114