wbc_horizon.hpp
Go to the documentation of this file.
1 #ifndef SOBEC_WBC_HORIZON
2 #define SOBEC_WBC_HORIZON
3 
4 #include <pinocchio/fwd.hpp>
5 
6 // include pinocchio first
7 
8 #include <ndcurves/bezier_curve.h>
9 #include <ndcurves/fwd.h>
10 #include <ndcurves/piecewise_curve.h>
11 #include <ndcurves/polynomial.h>
12 #include <ndcurves/se3_curve.h>
13 
17 
18 namespace sobec {
19 
22 
25  public:
26  // timing
27  int totalSteps = 4;
28  int T = 100;
29  int TdoubleSupport = 50;
30  int TsingleSupport = 100;
32  int ddpIteration = 1;
33 
34  double Dt = 1e-2;
35  double simu_step = 1e-3;
36 
37  double min_force = 150;
38  double support_force = 1000;
39 
40  int Nc = (int)round(Dt / simu_step);
41 };
42 class WBCHorizon {
50  protected:
55 
59  Eigen::Matrix3d ref_base_rotation_;
60 
61  Eigen::VectorXd x0_;
62 
64  double yaw_left_;
65  double yaw_right_;
66 
67  // timings
69 
70  // INTERNAL UPDATING functions
74 
75  // References for costs:
76  std::vector<pinocchio::SE3> ref_LF_poses_, ref_RF_poses_;
77 
78  // Security management
79  bool initialized_ = false;
80 
81  // Memory preallocations:
82  std::vector<unsigned long> controlled_joints_id_;
83  Eigen::VectorXd x_internal_;
84  bool time_to_solve_ddp_ = false;
85 
86  public:
87  WBCHorizon();
88  WBCHorizon(const WBCHorizonSettings &settings, const RobotDesigner &design,
89  const HorizonManager &horizon, const Eigen::VectorXd &q0,
90  const Eigen::VectorXd &v0, const std::string &actuationCostName);
91 
92  void initialize(const WBCHorizonSettings &settings,
93  const RobotDesigner &design, const HorizonManager &horizon,
94  const Eigen::VectorXd &q0, const Eigen::VectorXd &v0,
95  const std::string &actuationCostName);
96 
97  void updateSupportTiming();
98 
99  const Eigen::VectorXd &shapeState(const Eigen::VectorXd &q,
100  const Eigen::VectorXd &v);
101 
102  void setForceAlongHorizon();
103 
104  std::vector<Support> generateSupportCycle();
105 
106  void generateFullHorizon(ModelMaker &mm, const Experiment &experiment);
107 
108  bool timeToSolveDDP(int iteration);
109 
110  void iterate(const Eigen::VectorXd &q_current,
111  const Eigen::VectorXd &v_current, bool is_feasible);
112 
113  void iterate(int iteration, const Eigen::VectorXd &q_current,
114  const Eigen::VectorXd &v_current, bool is_feasible);
115  void iterateNoThinking(const Eigen::VectorXd &q_current,
116  const Eigen::VectorXd &v_current, bool is_feasible);
117 
118  void iterateNoThinking(int iteration, const Eigen::VectorXd &q_current,
119  const Eigen::VectorXd &v_current, bool is_feasible);
120  void iterateNoThinkingWithDelay(const Eigen::VectorXd &q_current,
121  const Eigen::VectorXd &v_current,
122  bool contact_left, bool contact_right,
123  bool is_feasible);
124  void recedeWithCycle();
125  void goToNextDoubleSupport();
126 
127  // getters and setters
129 
130  const Eigen::VectorXd &get_x0() const { return x0_; }
131  void set_x0(const Eigen::VectorXd &x0) { x0_ = x0; }
132 
134  void set_fullHorizon(const HorizonManager &fullHorizon) {
135  fullHorizon_ = fullHorizon;
136  }
137 
139  void set_horizon(const HorizonManager &horizon) { horizon_ = horizon; }
140 
142  void set_designer(const RobotDesigner &designer) { designer_ = designer; }
143 
144  const std::vector<int> &get_land_LF() { return land_LF_; }
145  const std::vector<int> &get_land_RF() { return land_RF_; }
146  const std::vector<int> &get_takeoff_LF() { return takeoff_LF_; }
147  const std::vector<int> &get_takeoff_RF() { return takeoff_RF_; }
148 
149  const int &get_horizon_iteration() { return horizon_iteration_; }
150 
151  // USER REFERENCE SETTERS AND GETTERS
152  const std::vector<pinocchio::SE3> &getPoseRef_LF() { return ref_LF_poses_; }
153  const pinocchio::SE3 &getPoseRef_LF(unsigned long time) {
154  return ref_LF_poses_[time];
155  }
156  void setPoseRef_LF(const std::vector<pinocchio::SE3> &ref_LF_poses) {
158  }
159  void setPoseRef_LF(const pinocchio::SE3 &ref_LF_pose, unsigned long time) {
160  ref_LF_poses_[time] = ref_LF_pose;
161  }
162 
163  const std::vector<pinocchio::SE3> &getPoseRef_RF() { return ref_RF_poses_; }
164  const pinocchio::SE3 &getPoseRef_RF(unsigned long time) {
165  return ref_RF_poses_[time];
166  }
167  void setPoseRef_RF(const std::vector<pinocchio::SE3> &ref_RF_poses) {
169  }
170  void setPoseRef_RF(const pinocchio::SE3 &ref_RF_pose, unsigned long time) {
171  ref_RF_poses_[time] = ref_RF_pose;
172  }
173 
174  const eVector3 &getCoMRef() { return ref_com_; }
176 
177  const Eigen::Matrix3d &getBaseRotRef() { return ref_base_rotation_; }
178  void setBaseRotRef(Eigen::Matrix3d ref_base_rotation) {
179  ref_base_rotation_ = ref_base_rotation;
180  }
181 
182  const eVector3 &getVelRef_COM() { return ref_com_vel_; }
185 
186  // For the python bindings:
187  std::vector<pinocchio::SE3> &ref_LF_poses() { return ref_LF_poses_; }
188  std::vector<pinocchio::SE3> &ref_RF_poses() { return ref_RF_poses_; }
189  eVector3 &ref_com() { return ref_com_; }
190  Eigen::Matrix3d &ref_base_rot() { return ref_base_rotation_; }
192 };
193 } // namespace sobec
194 
195 #endif // SOBEC_WBC_HORIZON
sobec::WBCHorizon::x_internal_
Eigen::VectorXd x_internal_
Definition: wbc_horizon.hpp:83
sobec::WBCHorizon::get_horizon_iteration
const int & get_horizon_iteration()
Definition: wbc_horizon.hpp:149
sobec::WBCHorizonSettings::min_force
double min_force
Definition: wbc_horizon.hpp:37
sobec::WBCHorizon::controlled_joints_id_
std::vector< unsigned long > controlled_joints_id_
Definition: wbc_horizon.hpp:82
sobec::WBCHorizon::set_x0
void set_x0(const Eigen::VectorXd &x0)
Definition: wbc_horizon.hpp:131
sobec::WBCHorizonSettings::T
int T
Definition: wbc_horizon.hpp:28
sobec::WBCHorizon::getPoseRef_LF
const pinocchio::SE3 & getPoseRef_LF(unsigned long time)
Definition: wbc_horizon.hpp:153
sobec::WBCHorizon::iterate
void iterate(const Eigen::VectorXd &q_current, const Eigen::VectorXd &v_current, bool is_feasible)
Definition: wbc_horizon.cpp:176
sobec::WBCHorizonSettings::totalSteps
int totalSteps
Definition: wbc_horizon.hpp:27
sobec::WBCHorizon::updateSupportTiming
void updateSupportTiming()
Definition: wbc_horizon.cpp:403
sobec::WBCHorizonSettings
Definition: wbc_horizon.hpp:23
sobec::WBCHorizon::getPoseRef_RF
const std::vector< pinocchio::SE3 > & getPoseRef_RF()
Definition: wbc_horizon.hpp:163
sobec::WBCHorizon::takeoff_RF_
std::vector< int > takeoff_RF_
Definition: wbc_horizon.hpp:68
sobec::WBCHorizon::set_horizon
void set_horizon(const HorizonManager &horizon)
Definition: wbc_horizon.hpp:139
sobec::WBCHorizon::generateSupportCycle
std::vector< Support > generateSupportCycle()
Definition: wbc_horizon.cpp:130
sobec::WBCHorizon::takeoff_LF_
std::vector< int > takeoff_LF_
Definition: wbc_horizon.hpp:68
sobec::WBCHorizon::iterateNoThinking
void iterateNoThinking(const Eigen::VectorXd &q_current, const Eigen::VectorXd &v_current, bool is_feasible)
Definition: wbc_horizon.cpp:201
designer.hpp
sobec::WBCHorizon::get_x0
const Eigen::VectorXd & get_x0() const
Definition: wbc_horizon.hpp:130
sobec::WBCHorizon::get_takeoff_RF
const std::vector< int > & get_takeoff_RF()
Definition: wbc_horizon.hpp:147
sobec::WBCHorizon::getPoseRef_LF
const std::vector< pinocchio::SE3 > & getPoseRef_LF()
Definition: wbc_horizon.hpp:152
sobec::WBCHorizon::WBCHorizon
WBCHorizon()
Definition: wbc_horizon.cpp:5
sobec::Experiment
Experiment
Definition: model_factory.hpp:22
sobec::WBCHorizon::initialized_
bool initialized_
Definition: wbc_horizon.hpp:79
sobec::WBCHorizon::horizon_
HorizonManager horizon_
Definition: wbc_horizon.hpp:53
sobec::WBCHorizon::land_LF_
std::vector< int > land_LF_
Definition: wbc_horizon.hpp:68
sobec::WBCHorizon::ref_com
eVector3 & ref_com()
Definition: wbc_horizon.hpp:189
sobec::WBCHorizon::yaw_right_
double yaw_right_
Definition: wbc_horizon.hpp:65
sobec::WBCHorizon::getPoseRef_RF
const pinocchio::SE3 & getPoseRef_RF(unsigned long time)
Definition: wbc_horizon.hpp:164
sobec::WBCHorizonSettings::Tstep
int Tstep
Definition: wbc_horizon.hpp:31
sobec::RobotDesigner
Definition: designer.hpp:28
sobec::WBCHorizon::get_designer
RobotDesigner & get_designer()
Definition: wbc_horizon.hpp:141
sobec::WBCHorizon::setPoseRef_LF
void setPoseRef_LF(const pinocchio::SE3 &ref_LF_pose, unsigned long time)
Definition: wbc_horizon.hpp:159
sobec::WBCHorizon::get_horizon
HorizonManager & get_horizon()
Definition: wbc_horizon.hpp:138
sobec::HorizonManager
Definition: horizon_manager.hpp:19
sobec::WBCHorizon::x0_
Eigen::VectorXd x0_
Definition: wbc_horizon.hpp:61
sobec::WBCHorizon::shapeState
const Eigen::VectorXd & shapeState(const Eigen::VectorXd &q, const Eigen::VectorXd &v)
Definition: wbc_horizon.cpp:379
sobec::WBCHorizon::ref_RF_poses
std::vector< pinocchio::SE3 > & ref_RF_poses()
Definition: wbc_horizon.hpp:188
sobec::WBCHorizon::setPoseRef_RF
void setPoseRef_RF(const pinocchio::SE3 &ref_RF_pose, unsigned long time)
Definition: wbc_horizon.hpp:170
sobec::WBCHorizon::setForceAlongHorizon
void setForceAlongHorizon()
Definition: wbc_horizon.cpp:69
sobec::WBCHorizon::ref_LF_poses_
std::vector< pinocchio::SE3 > ref_LF_poses_
Definition: wbc_horizon.hpp:76
sobec::WBCHorizon::horizonEnd
bool horizonEnd()
Definition: wbc_horizon.hpp:184
sobec::WBCHorizon::setCoMRef
void setCoMRef(eVector3 ref_com)
Definition: wbc_horizon.hpp:175
sobec::WBCHorizon
Definition: wbc_horizon.hpp:42
sobec::WBCHorizonSettings::support_force
double support_force
Definition: wbc_horizon.hpp:38
sobec
Definition: activation-quad-ref.hpp:19
sobec::WBCHorizon::getVelRef_COM
const eVector3 & getVelRef_COM()
Definition: wbc_horizon.hpp:182
horizon_manager.hpp
sobec::WBCHorizon::land_RF_
std::vector< int > land_RF_
Definition: wbc_horizon.hpp:68
sobec::WBCHorizon::get_takeoff_LF
const std::vector< int > & get_takeoff_LF()
Definition: wbc_horizon.hpp:146
sobec::WBCHorizon::setPoseRef_LF
void setPoseRef_LF(const std::vector< pinocchio::SE3 > &ref_LF_poses)
Definition: wbc_horizon.hpp:156
sobec::WBCHorizon::get_settings
WBCHorizonSettings & get_settings()
Definition: wbc_horizon.hpp:128
sobec::WBCHorizon::ref_dcm_
eVector3 ref_dcm_
Definition: wbc_horizon.hpp:58
sobec::WBCHorizon::settings_
WBCHorizonSettings settings_
Definition: wbc_horizon.hpp:51
sobec::WBCHorizonSettings::TdoubleSupport
int TdoubleSupport
Definition: wbc_horizon.hpp:29
sobec::WBCHorizon::getCoMRef
const eVector3 & getCoMRef()
Definition: wbc_horizon.hpp:174
sobec::WBCHorizonSettings::ddpIteration
int ddpIteration
Definition: wbc_horizon.hpp:32
sobec::WBCHorizon::ref_base_rotation_
Eigen::Matrix3d ref_base_rotation_
Definition: wbc_horizon.hpp:59
sobec::WBCHorizon::yaw_left_
double yaw_left_
Definition: wbc_horizon.hpp:64
sobec::WBCHorizon::updateStepTrackerReferences
void updateStepTrackerReferences()
Definition: wbc_horizon.cpp:273
sobec::WBCHorizon::time_to_solve_ddp_
bool time_to_solve_ddp_
Definition: wbc_horizon.hpp:84
sobec::WBCHorizonSettings::TsingleSupport
int TsingleSupport
Definition: wbc_horizon.hpp:30
sobec::WBCHorizon::fullHorizon_
HorizonManager fullHorizon_
Definition: wbc_horizon.hpp:54
sobec::WBCHorizonSettings::simu_step
double simu_step
Definition: wbc_horizon.hpp:35
sobec::WBCHorizon::generateFullHorizon
void generateFullHorizon(ModelMaker &mm, const Experiment &experiment)
Definition: wbc_horizon.cpp:160
sobec::WBCHorizon::ref_com_vel_
eVector3 ref_com_vel_
Definition: wbc_horizon.hpp:56
sobec::WBCHorizon::ref_com_vel
eVector3 & ref_com_vel()
Definition: wbc_horizon.hpp:191
sobec::WBCHorizon::recedeWithCycle
void recedeWithCycle()
Definition: wbc_horizon.cpp:356
sobec::WBCHorizon::set_designer
void set_designer(const RobotDesigner &designer)
Definition: wbc_horizon.hpp:142
sobec::WBCHorizon::iterateNoThinkingWithDelay
void iterateNoThinkingWithDelay(const Eigen::VectorXd &q_current, const Eigen::VectorXd &v_current, bool contact_left, bool contact_right, bool is_feasible)
Definition: wbc_horizon.cpp:228
sobec::WBCHorizon::timeToSolveDDP
bool timeToSolveDDP(int iteration)
Definition: wbc_horizon.cpp:171
model_factory.hpp
sobec::WBCHorizon::set_fullHorizon
void set_fullHorizon(const HorizonManager &fullHorizon)
Definition: wbc_horizon.hpp:134
sobec::WBCHorizon::setVelRef_COM
void setVelRef_COM(eVector3 ref_com_vel)
Definition: wbc_horizon.hpp:183
sobec::WBCHorizon::setPoseRef_RF
void setPoseRef_RF(const std::vector< pinocchio::SE3 > &ref_RF_poses)
Definition: wbc_horizon.hpp:167
sobec::WBCHorizon::ref_base_rot
Eigen::Matrix3d & ref_base_rot()
Definition: wbc_horizon.hpp:190
sobec::HorizonManager::size
unsigned long size()
Definition: horizon_manager.cpp:353
sobec::WBCHorizon::initialize
void initialize(const WBCHorizonSettings &settings, const RobotDesigner &design, const HorizonManager &horizon, const Eigen::VectorXd &q0, const Eigen::VectorXd &v0, const std::string &actuationCostName)
Definition: wbc_horizon.cpp:15
sobec::ModelMaker
Definition: model_factory.hpp:79
sobec::WBCHorizon::get_land_LF
const std::vector< int > & get_land_LF()
Definition: wbc_horizon.hpp:144
sobec::WBCHorizon::setBaseRotRef
void setBaseRotRef(Eigen::Matrix3d ref_base_rotation)
Definition: wbc_horizon.hpp:178
sobec::WBCHorizon::goToNextDoubleSupport
void goToNextDoubleSupport()
Definition: wbc_horizon.cpp:365
sobec::WBCHorizonSettings::Dt
double Dt
Definition: wbc_horizon.hpp:34
sobec::WBCHorizon::ref_com_
eVector3 ref_com_
Definition: wbc_horizon.hpp:57
sobec::WBCHorizon::updateNonThinkingReferences
void updateNonThinkingReferences()
Definition: wbc_horizon.cpp:317
sobec::WBCHorizon::ref_LF_poses
std::vector< pinocchio::SE3 > & ref_LF_poses()
Definition: wbc_horizon.hpp:187
sobec::WBCHorizon::get_land_RF
const std::vector< int > & get_land_RF()
Definition: wbc_horizon.hpp:145
sobec::WBCHorizon::designer_
RobotDesigner designer_
Definition: wbc_horizon.hpp:52
sobec::WBCHorizon::getBaseRotRef
const Eigen::Matrix3d & getBaseRotRef()
Definition: wbc_horizon.hpp:177
sobec::WBCHorizon::horizon_iteration_
int horizon_iteration_
Definition: wbc_horizon.hpp:63
sobec::eVector3
Eigen::Vector3d eVector3
Definition: fwd.hpp:143
sobec::WBCHorizon::updateStepTrackerLastReference
void updateStepTrackerLastReference()
Definition: wbc_horizon.cpp:302
sobec::WBCHorizon::get_fullHorizon
HorizonManager & get_fullHorizon()
Definition: wbc_horizon.hpp:133
sobec::WBCHorizonSettings::Nc
int Nc
Definition: wbc_horizon.hpp:40
sobec::WBCHorizon::ref_RF_poses_
std::vector< pinocchio::SE3 > ref_RF_poses_
Definition: wbc_horizon.hpp:76