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