wbc.hpp
Go to the documentation of this file.
1 #ifndef SOBEC_WBC
2 #define SOBEC_WBC
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 
25 
26 struct WBCSettings {
28  public:
29  // timing
30  int totalSteps = 4;
31  int T = 100;
32  int TdoubleSupport = 50;
33  int TsingleSupport = 100;
35  int ddpIteration = 1;
36 
37  double Dt = 1e-2;
38  double simu_step = 1e-3;
39 
40  int Nc = (int)round(Dt / simu_step);
41 };
42 class WBC {
50  protected:
56 
60  Eigen::Matrix3d ref_base_rotation_;
61 
62  Eigen::VectorXd x0_;
63 
66  double yaw_left_;
67  double yaw_right_;
68 
69  // timings
71 
73 
74  // INTERNAL UPDATING functions
78 
79  // References for costs:
80  std::vector<pinocchio::SE3> ref_LF_poses_, ref_RF_poses_;
81 
82  // Security management
83  bool initialized_ = false;
84  void rewindWalkingCycle();
85 
86  // Memory preallocations:
87  std::vector<unsigned long> controlled_joints_id_;
88  Eigen::VectorXd x_internal_;
89  bool time_to_solve_ddp_ = false;
91  std::set<std::string> contacts_before_, contacts_after_;
94 
95  public:
96  WBC();
97  WBC(const WBCSettings &settings, const RobotDesigner &design,
98  const HorizonManager &horizon, const Eigen::VectorXd &q0,
99  const Eigen::VectorXd &v0, const std::string &actuationCostName);
100 
101  void initialize(const WBCSettings &settings, const RobotDesigner &design,
102  const HorizonManager &horizon, const Eigen::VectorXd &q0,
103  const Eigen::VectorXd &v0,
104  const std::string &actuationCostName);
105 
107 
108  void updateSupportTiming();
109 
110  const supportSwitch &getSwitches(const unsigned long before,
111  const unsigned long after);
112 
113  const Eigen::VectorXd &shapeState(const Eigen::VectorXd &q,
114  const Eigen::VectorXd &v);
115 
117 
119 
121 
123 
124  void updateStepCycleTiming();
125 
126  bool timeToSolveDDP(int iteration);
127 
128  void iterate(const Eigen::VectorXd &q_current,
129  const Eigen::VectorXd &v_current, bool is_feasible);
130 
131  void iterate(int iteration, const Eigen::VectorXd &q_current,
132  const Eigen::VectorXd &v_current, bool is_feasible);
133  void iterateNoThinking(const Eigen::VectorXd &q_current,
134  const Eigen::VectorXd &v_current, bool is_feasible);
135 
136  void iterateNoThinking(int iteration, const Eigen::VectorXd &q_current,
137  const Eigen::VectorXd &v_current, bool is_feasible);
138 
139  void recedeWithCycle();
140  void recedeWithCycle(HorizonManager &cycle);
141  void goToNextDoubleSupport();
142 
143  // getters and setters
145 
146  const Eigen::VectorXd &get_x0() const { return x0_; }
147  void set_x0(const Eigen::VectorXd &x0) { x0_ = x0; }
148 
150  void set_walkingCycle(const HorizonManager &walkingCycle) {
151  walkingCycle_ = walkingCycle;
152  }
153 
155  void set_standingCycle(const HorizonManager &standingCycle) {
156  standingCycle_ = standingCycle;
157  }
158 
160  void set_horizon(const HorizonManager &horizon) { horizon_ = horizon; }
161 
163  void set_designer(const RobotDesigner &designer) { designer_ = designer; }
164 
165  const std::vector<int> &get_land_LF() { return land_LF_; }
166  const std::vector<int> &get_land_RF() { return land_RF_; }
167  const std::vector<int> &get_takeoff_LF() { return takeoff_LF_; }
168  const std::vector<int> &get_takeoff_RF() { return takeoff_RF_; }
169 
170  const int &get_land_LF_cycle() { return land_LF_cycle_; }
171  const int &get_land_RF_cycle() { return land_RF_cycle_; }
172  const int &get_takeoff_LF_cycle() { return takeoff_LF_cycle_; }
173  const int &get_takeoff_RF_cycle() { return takeoff_RF_cycle_; }
174 
175  // USER REFERENCE SETTERS AND GETTERS
176  const std::vector<pinocchio::SE3> &getPoseRef_LF() { return ref_LF_poses_; }
177  const pinocchio::SE3 &getPoseRef_LF(unsigned long time) {
178  return ref_LF_poses_[time];
179  }
180  void setPoseRef_LF(const std::vector<pinocchio::SE3> &ref_LF_poses) {
182  }
183  void setPoseRef_LF(const pinocchio::SE3 &ref_LF_pose, unsigned long time) {
184  ref_LF_poses_[time] = ref_LF_pose;
185  }
186 
187  const std::vector<pinocchio::SE3> &getPoseRef_RF() { return ref_RF_poses_; }
188  const pinocchio::SE3 &getPoseRef_RF(unsigned long time) {
189  return ref_RF_poses_[time];
190  }
191  void setPoseRef_RF(const std::vector<pinocchio::SE3> &ref_RF_poses) {
193  }
194  void setPoseRef_RF(const pinocchio::SE3 &ref_RF_pose, unsigned long time) {
195  ref_RF_poses_[time] = ref_RF_pose;
196  }
197 
198  const eVector3 &getCoMRef() { return ref_com_; }
200 
201  const Eigen::Matrix3d &getBaseRotRef() { return ref_base_rotation_; }
202  void setBaseRotRef(Eigen::Matrix3d ref_base_rotation) {
203  ref_base_rotation_ = ref_base_rotation;
204  }
205 
206  const eVector3 &getVelRef_COM() { return ref_com_vel_; }
208 
209  // For the python bindings:
210  std::vector<pinocchio::SE3> &ref_LF_poses() { return ref_LF_poses_; }
211  std::vector<pinocchio::SE3> &ref_RF_poses() { return ref_RF_poses_; }
212  eVector3 &ref_com() { return ref_com_; }
213  Eigen::Matrix3d &ref_base_rot() { return ref_base_rotation_; }
215 
216  void switchToWalk() { now_ = WALKING; }
219 };
220 } // namespace sobec
221 
222 #endif // SOBEC_OCP
sobec::WBC::updateStepTrackerReferences
void updateStepTrackerReferences()
Definition: wbc.cpp:198
sobec::WBC::ref_RF_poses
std::vector< pinocchio::SE3 > & ref_RF_poses()
Definition: wbc.hpp:211
sobec::WBC::takeoff_LF_
std::vector< int > takeoff_LF_
Definition: wbc.hpp:70
sobec::WBCSettings::Tstep
int Tstep
Definition: wbc.hpp:34
sobec::WBC::nWalkingCycles_
int nWalkingCycles_
Definition: wbc.hpp:65
sobec::WBC::get_takeoff_RF_cycle
const int & get_takeoff_RF_cycle()
Definition: wbc.hpp:173
sobec::WBC::designer_
RobotDesigner designer_
Definition: wbc.hpp:52
sobec::WBC::setBaseRotRef
void setBaseRotRef(Eigen::Matrix3d ref_base_rotation)
Definition: wbc.hpp:202
sobec::WBC::goToNextDoubleSupport
void goToNextDoubleSupport()
Definition: wbc.cpp:317
sobec::WBC::updateNonThinkingReferences
void updateNonThinkingReferences()
Definition: wbc.cpp:242
sobec::WALKING
@ WALKING
Definition: wbc.hpp:23
sobec::STANDING
@ STANDING
Definition: wbc.hpp:23
sobec::WBC::x_internal_
Eigen::VectorXd x_internal_
Definition: wbc.hpp:88
sobec::WBC::iterate
void iterate(const Eigen::VectorXd &q_current, const Eigen::VectorXd &v_current, bool is_feasible)
Definition: wbc.cpp:147
sobec::WBCSettings
Definition: wbc.hpp:26
sobec::WBC::setPoseRef_RF
void setPoseRef_RF(const pinocchio::SE3 &ref_RF_pose, unsigned long time)
Definition: wbc.hpp:194
sobec::WBC::ref_dcm_
eVector3 ref_dcm_
Definition: wbc.hpp:59
sobec::TAKEOFF_LF
@ TAKEOFF_LF
Definition: wbc.hpp:24
designer.hpp
sobec::WBC::generateStandingCycle
void generateStandingCycle(ModelMaker &mm)
Definition: wbc.cpp:120
sobec::WBC::get_x0
const Eigen::VectorXd & get_x0() const
Definition: wbc.hpp:146
sobec::WBC::get_takeoff_RF
const std::vector< int > & get_takeoff_RF()
Definition: wbc.hpp:168
sobec::WBC::getVelRef_COM
const eVector3 & getVelRef_COM()
Definition: wbc.hpp:206
sobec::WBC::get_standingCycle
HorizonManager & get_standingCycle()
Definition: wbc.hpp:154
sobec::WBC::ref_RF_poses_
std::vector< pinocchio::SE3 > ref_RF_poses_
Definition: wbc.hpp:80
sobec::WBC::generateWalkingCycle
void generateWalkingCycle(ModelMaker &mm)
Definition: wbc.cpp:66
sobec::WBC::takeoff_LF_cycle_
int takeoff_LF_cycle_
Definition: wbc.hpp:72
sobec::WBC::first_switch_to_stand_
bool first_switch_to_stand_
Definition: wbc.hpp:90
sobec::WBC::get_horizon
HorizonManager & get_horizon()
Definition: wbc.hpp:159
sobec::WBC::takeoff_RF_cycle_
int takeoff_RF_cycle_
Definition: wbc.hpp:72
sobec::WBC::initialize
void initialize(const WBCSettings &settings, const RobotDesigner &design, const HorizonManager &horizon, const Eigen::VectorXd &q0, const Eigen::VectorXd &v0, const std::string &actuationCostName)
Definition: wbc.cpp:13
sobec::LAND_RF
@ LAND_RF
Definition: wbc.hpp:24
sobec::WBC::ref_com_vel_
eVector3 ref_com_vel_
Definition: wbc.hpp:57
sobec::WBC::setCoMRef
void setCoMRef(eVector3 ref_com)
Definition: wbc.hpp:199
sobec::WBCSettings::simu_step
double simu_step
Definition: wbc.hpp:38
sobec::WBCSettings::T
int T
Definition: wbc.hpp:31
sobec::RobotDesigner
Definition: designer.hpp:28
sobec::WBC::walkingCycle_
HorizonManager walkingCycle_
Definition: wbc.hpp:54
sobec::WBC::land_RF_cycle_
int land_RF_cycle_
Definition: wbc.hpp:72
sobec::WBC::yaw_right_
double yaw_right_
Definition: wbc.hpp:67
sobec::WBC::now_
LocomotionType now_
Definition: wbc.hpp:64
sobec::WBC::iterateNoThinking
void iterateNoThinking(const Eigen::VectorXd &q_current, const Eigen::VectorXd &v_current, bool is_feasible)
Definition: wbc.cpp:172
sobec::WBC::ref_com
eVector3 & ref_com()
Definition: wbc.hpp:212
sobec::WBCSettings::totalSteps
int totalSteps
Definition: wbc.hpp:30
sobec::WBC::getPoseRef_LF
const std::vector< pinocchio::SE3 > & getPoseRef_LF()
Definition: wbc.hpp:176
sobec::WBC::setVelRef_COM
void setVelRef_COM(eVector3 ref_com_vel)
Definition: wbc.hpp:207
sobec::WBC::setPoseRef_RF
void setPoseRef_RF(const std::vector< pinocchio::SE3 > &ref_RF_poses)
Definition: wbc.hpp:191
sobec::WBC::get_settings
WBCSettings & get_settings()
Definition: wbc.hpp:144
sobec::WBC::ref_LF_poses_
std::vector< pinocchio::SE3 > ref_LF_poses_
Definition: wbc.hpp:80
sobec::HorizonManager
Definition: horizon_manager.hpp:19
sobec::WBC::takeoff_RF_
std::vector< int > takeoff_RF_
Definition: wbc.hpp:70
sobec::WBC::get_land_RF_cycle
const int & get_land_RF_cycle()
Definition: wbc.hpp:171
sobec::WBC
Definition: wbc.hpp:42
sobec::WBC::updateStepCycleTiming
void updateStepCycleTiming()
sobec::WBC::set_horizon
void set_horizon(const HorizonManager &horizon)
Definition: wbc.hpp:160
sobec::WBC::get_walkingCycle
HorizonManager & get_walkingCycle()
Definition: wbc.hpp:149
sobec::WBC::currentLocomotion
LocomotionType currentLocomotion()
Definition: wbc.hpp:218
sobec::WBC::rewindWalkingCycle
void rewindWalkingCycle()
Definition: wbc.cpp:304
sobec::WBC::WBC
WBC()
Definition: wbc.cpp:5
sobec
Definition: activation-quad-ref.hpp:19
sobec::WBC::set_x0
void set_x0(const Eigen::VectorXd &x0)
Definition: wbc.hpp:147
horizon_manager.hpp
sobec::WBC::setPoseRef_LF
void setPoseRef_LF(const std::vector< pinocchio::SE3 > &ref_LF_poses)
Definition: wbc.hpp:180
sobec::WBC::set_standingCycle
void set_standingCycle(const HorizonManager &standingCycle)
Definition: wbc.hpp:155
sobec::WBC::switch_
supportSwitch switch_
Definition: wbc.hpp:92
sobec::WBC::getPoseRef_LF
const pinocchio::SE3 & getPoseRef_LF(unsigned long time)
Definition: wbc.hpp:177
sobec::WBC::get_land_RF
const std::vector< int > & get_land_RF()
Definition: wbc.hpp:166
sobec::WBC::get_land_LF
const std::vector< int > & get_land_LF()
Definition: wbc.hpp:165
sobec::WBC::standingCycle_
HorizonManager standingCycle_
Definition: wbc.hpp:55
sobec::WBC::horizon_
HorizonManager horizon_
Definition: wbc.hpp:53
sobec::NO_SWITCH
@ NO_SWITCH
Definition: wbc.hpp:24
sobec::WBC::generateStandingCycleNoThinking
void generateStandingCycleNoThinking(ModelMaker &mm)
Definition: wbc.cpp:131
sobec::WBC::getPoseRef_RF
const pinocchio::SE3 & getPoseRef_RF(unsigned long time)
Definition: wbc.hpp:188
sobec::WBC::shapeState
const Eigen::VectorXd & shapeState(const Eigen::VectorXd &q, const Eigen::VectorXd &v)
Definition: wbc.cpp:325
sobec::WBC::ref_com_vel
eVector3 & ref_com_vel()
Definition: wbc.hpp:214
sobec::WBC::ref_LF_poses
std::vector< pinocchio::SE3 > & ref_LF_poses()
Definition: wbc.hpp:210
sobec::WBC::get_takeoff_LF
const std::vector< int > & get_takeoff_LF()
Definition: wbc.hpp:167
sobec::WBC::x0_
Eigen::VectorXd x0_
Definition: wbc.hpp:62
sobec::WBC::time_to_solve_ddp_
bool time_to_solve_ddp_
Definition: wbc.hpp:89
sobec::WBCSettings::Dt
double Dt
Definition: wbc.hpp:37
sobec::WBC::switchToWalk
void switchToWalk()
Definition: wbc.hpp:216
sobec::WBC::timeToSolveDDP
bool timeToSolveDDP(int iteration)
Definition: wbc.cpp:142
sobec::WBC::set_walkingCycle
void set_walkingCycle(const HorizonManager &walkingCycle)
Definition: wbc.hpp:150
sobec::WBC::ref_base_rot
Eigen::Matrix3d & ref_base_rot()
Definition: wbc.hpp:213
sobec::WBC::yaw_left_
double yaw_left_
Definition: wbc.hpp:66
sobec::WBCSettings::ddpIteration
int ddpIteration
Definition: wbc.hpp:35
sobec::WBC::getCoMRef
const eVector3 & getCoMRef()
Definition: wbc.hpp:198
sobec::WBC::recedeWithCycle
void recedeWithCycle()
Definition: wbc.cpp:281
sobec::WBC::setPoseRef_LF
void setPoseRef_LF(const pinocchio::SE3 &ref_LF_pose, unsigned long time)
Definition: wbc.hpp:183
sobec::WBCSettings::TsingleSupport
int TsingleSupport
Definition: wbc.hpp:33
sobec::WBC::contacts_after_
std::set< std::string > contacts_after_
Definition: wbc.hpp:91
sobec::LocomotionType
LocomotionType
Definition: wbc.hpp:23
sobec::TAKEOFF_RF
@ TAKEOFF_RF
Definition: wbc.hpp:24
sobec::WBC::updateSupportTiming
void updateSupportTiming()
Definition: wbc.cpp:363
sobec::WBC::getBaseRotRef
const Eigen::Matrix3d & getBaseRotRef()
Definition: wbc.hpp:201
sobec::WBC::controlled_joints_id_
std::vector< unsigned long > controlled_joints_id_
Definition: wbc.hpp:87
model_factory.hpp
sobec::WBC::settings_
WBCSettings settings_
Definition: wbc.hpp:51
sobec::WBC::set_designer
void set_designer(const RobotDesigner &designer)
Definition: wbc.hpp:163
sobec::WBCSettings::TdoubleSupport
int TdoubleSupport
Definition: wbc.hpp:32
sobec::WBCSettings::Nc
int Nc
Definition: wbc.hpp:40
sobec::WBC::ref_base_rotation_
Eigen::Matrix3d ref_base_rotation_
Definition: wbc.hpp:60
sobec::WBC::land_LF_
std::vector< int > land_LF_
Definition: wbc.hpp:70
sobec::ModelMaker
Definition: model_factory.hpp:79
sobec::WBC::getSwitches
const supportSwitch & getSwitches(const unsigned long before, const unsigned long after)
Definition: wbc.cpp:400
sobec::WBC::initializeSupportTiming
void initializeSupportTiming()
Definition: wbc.cpp:349
sobec::WBC::land_RF_
std::vector< int > land_RF_
Definition: wbc.hpp:70
sobec::WBC::switchToStand
void switchToStand()
Definition: wbc.hpp:217
sobec::WBC::get_takeoff_LF_cycle
const int & get_takeoff_LF_cycle()
Definition: wbc.hpp:172
sobec::WBC::get_land_LF_cycle
const int & get_land_LF_cycle()
Definition: wbc.hpp:170
sobec::WBC::getPoseRef_RF
const std::vector< pinocchio::SE3 > & getPoseRef_RF()
Definition: wbc.hpp:187
sobec::WBC::ref_com_
eVector3 ref_com_
Definition: wbc.hpp:58
sobec::WBC::initialized_
bool initialized_
Definition: wbc.hpp:83
sobec::WBC::updateStepTrackerLastReference
void updateStepTrackerLastReference()
Definition: wbc.cpp:227
sobec::WBC::get_designer
RobotDesigner & get_designer()
Definition: wbc.hpp:162
sobec::supportSwitch
supportSwitch
Definition: wbc.hpp:24
sobec::LAND_LF
@ LAND_LF
Definition: wbc.hpp:24
sobec::eVector3
Eigen::Vector3d eVector3
Definition: fwd.hpp:143
sobec::WBC::contacts_before_
std::set< std::string > contacts_before_
Definition: wbc.hpp:91
sobec::WBC::horizon_end_
int horizon_end_
Definition: wbc.hpp:93
sobec::WBC::land_LF_cycle_
int land_LF_cycle_
Definition: wbc.hpp:72
sobec::WBC::generateWalkingCycleNoThinking
void generateWalkingCycleNoThinking(ModelMaker &mm)
Definition: wbc.cpp:93