biped_ig.hpp
Go to the documentation of this file.
1 
10 #ifndef AIG_BIPED_IG
11 #define AIG_BIPED_IG
12 
13 // clang-format off
14 #include <Eigen/Dense>
15 #include "pinocchio/fwd.hpp"
16 #include "pinocchio/multibody/data.hpp"
17 #include "pinocchio/multibody/model.hpp"
18 #include "pinocchio/spatial/se3.hpp"
19 #include "aig/arm_ig.hpp"
20 #include "aig/leg_ig.hpp"
21 #include "aig/dyna_com.hpp"
22 // clang-format on
23 
24 namespace aig {
30  public:
31  std::string left_hip_joint_name;
32  std::string left_knee_joint_name;
33  std::string left_ankle_joint_name;
34  std::string left_foot_frame_name;
35  std::string right_hip_joint_name;
36  std::string right_knee_joint_name;
38  std::string right_foot_frame_name;
43  std::string urdf;
48  std::string srdf;
49 
51  : left_hip_joint_name(""),
59  urdf(""),
60  srdf("") {}
61 
62  BipedIGSettings(const std::string &_left_hip_joint_name,
63  const std::string &_left_knee_joint_name,
64  const std::string &_left_ankle_joint_name,
65  const std::string &_left_foot_frame_name,
66  const std::string &_right_hip_joint_name,
67  const std::string &_right_knee_joint_name,
68  const std::string &_right_ankle_joint_name,
69  const std::string &_right_foot_frame_name,
70  const std::string &_urdf, const std::string &_srdf)
71  : left_hip_joint_name(_left_hip_joint_name),
72  left_knee_joint_name(_left_knee_joint_name),
73  left_ankle_joint_name(_left_ankle_joint_name),
74  left_foot_frame_name(_left_foot_frame_name),
75  right_hip_joint_name(_right_hip_joint_name),
76  right_knee_joint_name(_right_knee_joint_name),
77  right_ankle_joint_name(_right_ankle_joint_name),
78  right_foot_frame_name(_right_foot_frame_name),
79  urdf(_urdf),
80  srdf(_srdf) {}
81 
82  friend std::ostream &operator<<(std::ostream &out,
83  const BipedIGSettings &obj) {
84  out << "BipedIGSettings:\n";
85  out << " left_hip_joint_name: " << obj.left_hip_joint_name << "\n";
86  out << " left_knee_joint_name: " << obj.left_knee_joint_name << "\n";
87  out << " left_ankle_joint_name: " << obj.left_ankle_joint_name << "\n";
88  out << " left_foot_frame_name: " << obj.left_foot_frame_name << "\n";
89  out << " right_hip_joint_name: " << obj.right_hip_joint_name << "\n";
90  out << " right_knee_joint_name: " << obj.right_knee_joint_name << "\n";
91  out << " right_ankle_joint_name: " << obj.right_ankle_joint_name << "\n";
92  out << " right_foot_frame_name: " << obj.right_foot_frame_name << "\n";
93  out << " urdf: " << obj.urdf << "\n";
94  out << " srdf: " << obj.srdf << std::endl;
95  return out;
96  }
97 
98  friend bool operator==(const BipedIGSettings &lhs,
99  const BipedIGSettings &rhs) {
100  bool test = true;
101  test &= lhs.left_hip_joint_name == rhs.left_hip_joint_name;
102  test &= lhs.left_knee_joint_name == rhs.left_knee_joint_name;
103  test &= lhs.left_ankle_joint_name == rhs.left_ankle_joint_name;
104  test &= lhs.left_foot_frame_name == rhs.left_foot_frame_name;
105  test &= lhs.right_hip_joint_name == rhs.right_hip_joint_name;
106  test &= lhs.right_knee_joint_name == rhs.right_knee_joint_name;
108  test &= lhs.right_foot_frame_name == rhs.right_foot_frame_name;
109  test &= lhs.urdf == rhs.urdf;
110  test &= lhs.srdf == rhs.srdf;
111  return test;
112  }
113 };
114 
115 BipedIGSettings makeSettingsFor(const std::string &path_to_robots,
116  const std::string &robot_name);
117 
122 class BipedIG {
123  // Private attributes.
124  private:
125  pinocchio::Model model_;
126  pinocchio::Data data_;
127  BipedIGSettings settings_;
128  LegIG left_leg_, right_leg_;
129  // ArmIG left_arm_, right_arm_;
130  Eigen::VectorXd q0_; // q0_ is a reference configuration used to take all not
131  // computed joints (such as head and arms)
132  Eigen::Vector3d com_from_waist_;
133  int lleg_idx_qs_; // Indexes in the configuration vector.
134  int rleg_idx_qs_; // Indexes in the configuration vector.
135 
136  // variables used in the waist-com vector correction:
137  Eigen::Vector3d error_, com_temp_;
138  Eigen::VectorXd posture_temp_;
139  Eigen::Matrix3d baseRotation_temp_;
140 
141  aig::DynaCoM dynamics_;
142 
143  // Private methods.
144  private:
145  void derivatives(const Eigen::VectorXd &q1, const Eigen::VectorXd &q3,
146  Eigen::VectorXd &posture, Eigen::VectorXd &velocity,
147  Eigen::VectorXd &acceleration, const double &dt);
148 
149  pinocchio::SE3 computeBase(const Eigen::Vector3d &com,
150  const pinocchio::SE3 &leftFoot,
151  const pinocchio::SE3 &rightFoot);
152 
153  pinocchio::SE3 computeBase(const Eigen::Vector3d &com,
154  const Eigen::Matrix3d &baseRotation);
155 
156  void configureLegs();
157 
158  // Public methods.
159  public:
160  BipedIG();
161 
162  BipedIG(const BipedIGSettings &settings);
163 
164  void initialize(const BipedIGSettings &settings);
165 
166  const BipedIGSettings &get_settings() { return settings_; };
168  return left_leg_.get_settings();
169  };
171  return right_leg_.get_settings();
172  };
173 
174  const Eigen::VectorXd &getQ0() { return q0_; }
175  void setQ0(const Eigen::VectorXd q0) { q0_ = q0; }
176 
179  const Eigen::Vector3d &getAMVariation() { return dynamics_.getAMVariation(); }
180 
182  const Eigen::Vector3d &getCoM() { return dynamics_.getCoM(); }
184  const Eigen::Vector3d &getVCoM() { return dynamics_.getVCoM(); }
186  const Eigen::Vector3d &getACoM() { return dynamics_.getACoM(); }
188  const Eigen::Vector3d &getAM() { return dynamics_.getAM(); }
190  const Eigen::Vector2d &getCoP() { return dynamics_.getCoP(); }
192  const Eigen::Vector2d &getNL() { return dynamics_.getNL(); }
193 
194  void checkCompatibility(); // TODO
195 
196  void solve(const Eigen::Vector3d &com, const pinocchio::SE3 &leftFoot,
197  const pinocchio::SE3 &rightFoot, const Eigen::VectorXd &q0,
198  Eigen::VectorXd &posture, const double &tolerance = 1e-10,
199  const int &max_iterations = 0);
200 
201  void solve(const Eigen::Vector3d &com, const Eigen::Isometry3d &leftFeet,
202  const Eigen::Isometry3d &rightFeet, const Eigen::VectorXd &q0,
203  Eigen::VectorXd &posture, const double &tolerance = 1e-10,
204  const int &max_iterations = 0);
205 
206  void solve(const Eigen::Vector3d &com, const Eigen::Matrix3d &baseRotation,
207  const pinocchio::SE3 &leftFoot, const pinocchio::SE3 &rightFoot,
208  const Eigen::VectorXd &q0, Eigen::VectorXd &posture,
209  const double &tolerance = 1e-10, const int &max_iterations = 0);
210 
211  void solve(const Eigen::Vector3d &com, const Eigen::Matrix3d &baseRotation,
212  const Eigen::Isometry3d &leftFoot,
213  const Eigen::Isometry3d &rightFoot, const Eigen::VectorXd &q0,
214  Eigen::VectorXd &posture, const double &tolerance = 1e-10,
215  const int &max_iterations = 0);
216 
217  void solve(const pinocchio::SE3 &base, const pinocchio::SE3 &leftFoot,
218  const pinocchio::SE3 &rightFoot, const Eigen::VectorXd &q0,
219  Eigen::VectorXd &posture);
220 
221  void solve(const Eigen::Isometry3d &base, const Eigen::Isometry3d &leftFoot,
222  const Eigen::Isometry3d &rightFoot, const Eigen::VectorXd &q0,
223  Eigen::VectorXd &posture);
224 
225  void solve(const std::array<Eigen::Vector3d, 3> &coms,
226  const std::array<pinocchio::SE3, 3> &leftFeet,
227  const std::array<pinocchio::SE3, 3> &rightFeet,
228  const Eigen::VectorXd &q0, Eigen::VectorXd &posture,
229  Eigen::VectorXd &velocity, Eigen::VectorXd &acceleration,
230  const double &dt, const double &tolerance = 1e-10,
231  const int &max_iterations = 0);
232 
233  void solve(const std::array<Eigen::Vector3d, 3> &coms,
234  const std::array<Eigen::Isometry3d, 3> &leftFeet,
235  const std::array<Eigen::Isometry3d, 3> &rightFeet,
236  const Eigen::VectorXd &q0, Eigen::VectorXd &posture,
237  Eigen::VectorXd &velocity, Eigen::VectorXd &acceleration,
238  const double &dt, const double &tolerance = 1e-10,
239  const int &max_iterations = 0);
240 
241  void solve(const std::array<Eigen::Vector3d, 3> &coms,
242  const std::array<Eigen::Matrix3d, 3> &baseRotations,
243  const std::array<pinocchio::SE3, 3> &leftFeet,
244  const std::array<pinocchio::SE3, 3> &rightFeet,
245  const Eigen::VectorXd &q0, Eigen::VectorXd &posture,
246  Eigen::VectorXd &velocity, Eigen::VectorXd &acceleration,
247  const double &dt, const double &tolerance = 1e-10,
248  const int &max_iterations = 0);
249 
250  void solve(const std::array<Eigen::Vector3d, 3> &coms,
251  const std::array<Eigen::Matrix3d, 3> &baseRotations,
252  const std::array<Eigen::Isometry3d, 3> &leftFeet,
253  const std::array<Eigen::Isometry3d, 3> &rightFeet,
254  const Eigen::VectorXd &q0, Eigen::VectorXd &posture,
255  Eigen::VectorXd &velocity, Eigen::VectorXd &acceleration,
256  const double &dt, const double &tolerance = 1e-10,
257  const int &max_iterations = 0);
258 
259  void solve(const std::array<pinocchio::SE3, 3> &bases,
260  const std::array<pinocchio::SE3, 3> &leftFeet,
261  const std::array<pinocchio::SE3, 3> &rightFeet,
262  const Eigen::VectorXd &q0, Eigen::VectorXd &posture,
263  Eigen::VectorXd &velocity, Eigen::VectorXd &acceleration,
264  const double &dt);
265 
266  void solve(const std::array<Eigen::Isometry3d, 3> &bases,
267  const std::array<Eigen::Isometry3d, 3> &leftFeet,
268  const std::array<Eigen::Isometry3d, 3> &rightFeet,
269  const Eigen::VectorXd &q0, Eigen::VectorXd &posture,
270  Eigen::VectorXd &velocity, Eigen::VectorXd &acceleration,
271  const double &dt);
272 
273  void set_com_from_waist(const Eigen::Vector3d &com_from_waist);
274 
275  void set_com_from_waist(const Eigen::VectorXd &q);
276 
277  void correctCoMfromWaist(const Eigen::Vector3d &com,
278  const pinocchio::SE3 &leftFoot,
279  const pinocchio::SE3 &rightFoot,
280  const Eigen::VectorXd &q0,
281  const double &tolerance = 1e-10,
282  const int &max_iterations = 20);
283 
284  void correctCoMfromWaist(const Eigen::Vector3d &com,
285  const Eigen::Isometry3d &leftFoot,
286  const Eigen::Isometry3d &rightFoot,
287  const Eigen::VectorXd &q0,
288  const double &tolerance = 1e-10,
289  const int &max_iterations = 20);
290 
291  void computeDynamics(const Eigen::VectorXd &posture,
292  const Eigen::VectorXd &velocity,
293  const Eigen::VectorXd &acceleration,
294  const Eigen::Matrix<double, 6, 1> &externalWrench =
295  Eigen::Matrix<double, 6, 1>::Zero(),
296  bool flatHorizontalGround = true);
297 
298  void computeNL(const double &w, const Eigen::VectorXd &posture,
299  const Eigen::VectorXd &velocity,
300  const Eigen::VectorXd &acceleration,
301  const Eigen::Matrix<double, 6, 1> &externalWrench =
302  Eigen::Matrix<double, 6, 1>::Zero(),
303  bool flatHorizontalGround = true);
304 
305  void computeNL(const double &w);
306 
307  pinocchio::Model &get_model() { return model_; }
308  pinocchio::Data &get_data() { return data_; }
309  Eigen::Vector3d &get_com_from_waist() { return com_from_waist_; }
310 };
311 } // namespace aig
312 #endif // AIG_BIPED_IG
Class to perform inverse geometry on a robot arm.
Definition: biped_ig.hpp:122
const Eigen::Vector3d & getACoM()
Get the CoM acceleration. Please call computeDynamics first.
Definition: biped_ig.hpp:186
const LegIGSettings & get_left_leg_settings()
Definition: biped_ig.hpp:167
const Eigen::Vector3d & getCoM()
Get the CoM position. Please call computeDynamics first.
Definition: biped_ig.hpp:182
const LegIGSettings & get_right_leg_settings()
Definition: biped_ig.hpp:170
const BipedIGSettings & get_settings()
Definition: biped_ig.hpp:166
const Eigen::Vector3d & getAMVariation()
Get the Angular Momentum variation. Please call computeDynamics first. Deprecate it,...
Definition: biped_ig.hpp:179
const Eigen::VectorXd & getQ0()
Definition: biped_ig.hpp:174
pinocchio::Model & get_model()
Definition: biped_ig.hpp:307
void computeNL(const double &w, const Eigen::VectorXd &posture, const Eigen::VectorXd &velocity, const Eigen::VectorXd &acceleration, const Eigen::Matrix< double, 6, 1 > &externalWrench=Eigen::Matrix< double, 6, 1 >::Zero(), bool flatHorizontalGround=true)
Definition: biped_ig.cpp:400
pinocchio::Data & get_data()
Definition: biped_ig.hpp:308
Eigen::Vector3d & get_com_from_waist()
Definition: biped_ig.hpp:309
void correctCoMfromWaist(const Eigen::Vector3d &com, const pinocchio::SE3 &leftFoot, const pinocchio::SE3 &rightFoot, const Eigen::VectorXd &q0, const double &tolerance=1e-10, const int &max_iterations=20)
Definition: biped_ig.cpp:357
void computeDynamics(const Eigen::VectorXd &posture, const Eigen::VectorXd &velocity, const Eigen::VectorXd &acceleration, const Eigen::Matrix< double, 6, 1 > &externalWrench=Eigen::Matrix< double, 6, 1 >::Zero(), bool flatHorizontalGround=true)
Definition: biped_ig.cpp:391
const Eigen::Vector2d & getCoP()
Get the CoP Position. Please call computeDynamics first.
Definition: biped_ig.hpp:190
void solve(const Eigen::Vector3d &com, const pinocchio::SE3 &leftFoot, const pinocchio::SE3 &rightFoot, const Eigen::VectorXd &q0, Eigen::VectorXd &posture, const double &tolerance=1e-10, const int &max_iterations=0)
Definition: biped_ig.cpp:195
const Eigen::Vector3d & getAM()
Get the angular momentum. Please call computeDynamics first.
Definition: biped_ig.hpp:188
BipedIG()
Definition: biped_ig.cpp:48
const Eigen::Vector2d & getNL()
Get the nonlinear effect. Please call computeDynamics first.
Definition: biped_ig.hpp:192
const Eigen::Vector3d & getVCoM()
Get the CoM velocity. Please call computeDynamics first.
Definition: biped_ig.hpp:184
void setQ0(const Eigen::VectorXd q0)
Definition: biped_ig.hpp:175
void checkCompatibility()
void initialize(const BipedIGSettings &settings)
Definition: biped_ig.cpp:61
void set_com_from_waist(const Eigen::Vector3d &com_from_waist)
Definition: biped_ig.cpp:345
Definition: dyna_com.hpp:56
const Eigen::Vector3d & getCoM()
Definition: dyna_com.hpp:162
const Eigen::Vector2d & getNL()
Definition: dyna_com.hpp:167
const Eigen::Vector2d & getCoP()
Definition: dyna_com.hpp:166
const Eigen::Vector3d & getVCoM()
Definition: dyna_com.hpp:163
const Eigen::Vector3d & getAM()
Definition: dyna_com.hpp:165
const Eigen::Vector3d & getAMVariation()
Please call computeDynamics first.
Definition: dyna_com.hpp:161
const Eigen::Vector3d & getACoM()
Definition: dyna_com.hpp:164
Definition: leg_ig.hpp:72
const LegIGSettings & get_settings()
Definition: leg_ig.hpp:89
Class to perform inverse geometry on a biped robot.
Class to perform inverse geometry on a robot leg.
Definition: arm_ig.hpp:18
BipedIGSettings makeSettingsFor(const std::string &path_to_robots, const std::string &robot_name)
Definition: biped_ig.cpp:21
const std::string path_to_robots(EXAMPLE_ROBOT_DATA_MODEL_DIR)
Definition: biped_ig.hpp:29
std::string left_foot_frame_name
Definition: biped_ig.hpp:34
std::string right_ankle_joint_name
Definition: biped_ig.hpp:37
std::string right_knee_joint_name
Definition: biped_ig.hpp:36
std::string right_hip_joint_name
Definition: biped_ig.hpp:35
std::string right_foot_frame_name
Definition: biped_ig.hpp:38
std::string left_knee_joint_name
Definition: biped_ig.hpp:32
std::string left_hip_joint_name
Definition: biped_ig.hpp:31
std::string left_ankle_joint_name
Definition: biped_ig.hpp:33
BipedIGSettings(const std::string &_left_hip_joint_name, const std::string &_left_knee_joint_name, const std::string &_left_ankle_joint_name, const std::string &_left_foot_frame_name, const std::string &_right_hip_joint_name, const std::string &_right_knee_joint_name, const std::string &_right_ankle_joint_name, const std::string &_right_foot_frame_name, const std::string &_urdf, const std::string &_srdf)
Definition: biped_ig.hpp:62
friend bool operator==(const BipedIGSettings &lhs, const BipedIGSettings &rhs)
Definition: biped_ig.hpp:98
friend std::ostream & operator<<(std::ostream &out, const BipedIGSettings &obj)
Definition: biped_ig.hpp:82
std::string srdf
This must contain either a valid path to the srdf file or the content of this file in a string.
Definition: biped_ig.hpp:48
std::string urdf
This must contain either a valid path to the urdf file or the content of this file in a string.
Definition: biped_ig.hpp:43
BipedIGSettings()
Definition: biped_ig.hpp:50
Definition: leg_ig.hpp:27