Quad-SDK
Loading...
Searching...
No Matches
quad_kd.h
1#ifndef QUAD_KD_H
2#define QUAD_KD_H
3
4#include <math.h>
5#include <rbdl/addons/urdfreader/urdfreader.h>
6#include <rbdl/rbdl.h>
7#include <rbdl/rbdl_utils.h>
8#include <ros/ros.h>
9#include <tf2/LinearMath/Quaternion.h>
10
11#include <Eigen/Geometry>
12#include <chrono>
13#include <grid_map_core/GridMap.hpp>
14#include <random>
15#include <vector>
16
17#include "quad_utils/function_timer.h"
18#include "quad_utils/math_utils.h"
19
20namespace quad_utils {
21
23
28class QuadKD {
29 public:
34 QuadKD();
35
41 QuadKD(std::string ns);
42
47 void initModel(std::string ns);
48
57 Eigen::Matrix4d createAffineMatrix(Eigen::Vector3d trans,
58 Eigen::Vector3d rpy) const;
59
67 Eigen::Matrix4d createAffineMatrix(Eigen::Vector3d trans,
68 Eigen::AngleAxisd rot) const;
69
78 void transformBodyToWorld(Eigen::Vector3d body_pos, Eigen::Vector3d body_rpy,
79 Eigen::Matrix4d transform_body,
80 Eigen::Matrix4d &transform_world) const;
81
90 void transformWorldToBody(Eigen::Vector3d body_pos, Eigen::Vector3d body_rpy,
91 Eigen::Matrix4d transform_world,
92 Eigen::Matrix4d &transform_body) const;
93
100 void bodyToFootFKBodyFrame(int leg_index, Eigen::Vector3d joint_state,
101 Eigen::Matrix4d &g_body_foot) const;
102
109 void bodyToFootFKBodyFrame(int leg_index, Eigen::Vector3d joint_state,
110 Eigen::Vector3d &foot_pos_body) const;
111
120 void worldToFootFKWorldFrame(int leg_index, Eigen::Vector3d body_pos,
121 Eigen::Vector3d body_rpy,
122 Eigen::Vector3d joint_state,
123 Eigen::Matrix4d &g_world_foot) const;
124
133 void worldToFootFKWorldFrame(int leg_index, Eigen::Vector3d body_pos,
134 Eigen::Vector3d body_rpy,
135 Eigen::Vector3d joint_state,
136 Eigen::Vector3d &foot_pos_world) const;
137
146 void worldToKneeFKWorldFrame(int leg_index, Eigen::Vector3d body_pos,
147 Eigen::Vector3d body_rpy,
148 Eigen::Vector3d joint_state,
149 Eigen::Matrix4d &g_world_knee) const;
150
159 void worldToKneeFKWorldFrame(int leg_index, Eigen::Vector3d body_pos,
160 Eigen::Vector3d body_rpy,
161 Eigen::Vector3d joint_state,
162 Eigen::Vector3d &knee_pos_world) const;
163
173 bool worldToFootIKWorldFrame(int leg_index, Eigen::Vector3d body_pos,
174 Eigen::Vector3d body_rpy,
175 Eigen::Vector3d foot_pos_world,
176 Eigen::Vector3d &joint_state) const;
177
186 bool legbaseToFootIKLegbaseFrame(int leg_index,
187 Eigen::Vector3d foot_pos_legbase,
188 Eigen::Vector3d &joint_state) const;
189
196 double getJointLowerLimit(int leg_index, int joint_index) const;
197
204 double getJointUpperLimit(int leg_index, int joint_index) const;
205
212 double getLinkLength(int leg_index, int link_index) const;
213
221 void worldToLegbaseFKWorldFrame(int leg_index, Eigen::Vector3d body_pos,
222 Eigen::Vector3d body_rpy,
223 Eigen::Matrix4d &g_world_legbase) const;
224
232 void worldToLegbaseFKWorldFrame(int leg_index, Eigen::Vector3d body_pos,
233 Eigen::Vector3d body_rpy,
234 Eigen::Vector3d &leg_base_pos_world) const;
235
244 int leg_index, Eigen::Vector3d body_pos, Eigen::Vector3d body_rpy,
245 Eigen::Vector3d &nominal_hip_pos_world) const;
246
252 void getJacobianGenCoord(const Eigen::VectorXd &state,
253 Eigen::MatrixXd &jacobian) const;
254
260 void getJacobianBodyAngVel(const Eigen::VectorXd &state,
261 Eigen::MatrixXd &jacobian) const;
262
268 void getJacobianWorldAngVel(const Eigen::VectorXd &state,
269 Eigen::MatrixXd &jacobian) const;
270
276 void getRotationMatrix(const Eigen::VectorXd &rpy,
277 Eigen::Matrix3d &rot) const;
278
288 void computeInverseDynamics(const Eigen::VectorXd &state_pos,
289 const Eigen::VectorXd &state_vel,
290 const Eigen::VectorXd &foot_acc,
291 const Eigen::VectorXd &grf,
292 const std::vector<int> &contact_mode,
293 Eigen::VectorXd &tau) const;
294
307 bool convertCentroidalToFullBody(const Eigen::VectorXd &body_state,
308 const Eigen::VectorXd &foot_positions,
309 const Eigen::VectorXd &foot_velocities,
310 const Eigen::VectorXd &grfs,
311 Eigen::VectorXd &joint_positions,
312 Eigen::VectorXd &joint_velocities,
313 Eigen::VectorXd &torques);
314
322 bool applyMotorModel(const Eigen::VectorXd &torques,
323 Eigen::VectorXd &constrained_torques);
324
335 bool applyMotorModel(const Eigen::VectorXd &torques,
336 const Eigen::VectorXd &joint_velocities,
337 Eigen::VectorXd &constrained_torques);
338
347 bool isValidFullState(const Eigen::VectorXd &body_state,
348 const Eigen::VectorXd &joint_state,
349 const Eigen::VectorXd &torques,
350 const grid_map::GridMap &terrain,
351 Eigen::VectorXd &state_violation,
352 Eigen::VectorXd &control_violation);
353
364 const Eigen::VectorXd &body_state, const Eigen::VectorXd &foot_positions,
365 const Eigen::VectorXd &foot_velocities, const Eigen::VectorXd &grfs,
366 const grid_map::GridMap &terrain, Eigen::VectorXd &joint_positions,
367 Eigen::VectorXd &joint_velocities, Eigen::VectorXd &torques,
368 Eigen::VectorXd &state_violation, Eigen::VectorXd &control_violation);
369
370 inline double getGroundClearance(const Eigen::Vector3d &point,
371 const grid_map::GridMap &terrain) {
372 grid_map::Position pos = {point.x(), point.y()};
373 return (point.z() - terrain.atPosition("z", pos));
374 }
375
376 private:
378 const int num_feet_ = 4;
379
381 std::vector<double> l0_vec_;
382
384 double l1_;
385
387 double l2_;
388
390 Eigen::Vector3d abad_offset_;
391
393 Eigen::Vector3d knee_offset_;
394
396 Eigen::Vector3d foot_offset_;
397
399 std::vector<Eigen::Vector3d> legbase_offsets_;
400
402 std::vector<Eigen::Matrix4d> g_body_legbases_;
403
405 const double joint_eps = 0.1;
406
408 std::vector<std::vector<double>> joint_min_;
409
411 std::vector<std::vector<double>> joint_max_;
412
413 RigidBodyDynamics::Model *model_;
414
415 std::vector<std::string> body_name_list_;
416
417 std::vector<unsigned int> body_id_list_;
418
419 std::vector<int> leg_idx_list_;
420
422 const double abad_tau_max_ = 21;
423
425 const double hip_tau_max_ = 21;
426
428 const double knee_tau_max_ = 32;
429
431 const Eigen::VectorXd tau_max_ =
432 (Eigen::VectorXd(12) << abad_tau_max_, hip_tau_max_, knee_tau_max_,
435 .finished();
436
438 const double abad_vel_max_ = 37.7;
439
441 const double hip_vel_max_ = 37.7;
442
444 const double knee_vel_max_ = 25.1;
445
447 const Eigen::VectorXd vel_max_ =
448 (Eigen::VectorXd(12) << abad_vel_max_, hip_vel_max_, knee_vel_max_,
451 .finished();
452
453 const Eigen::VectorXd mm_slope_ = tau_max_.cwiseQuotient(vel_max_);
454};
455
456} // namespace quad_utils
457
458#endif // QUAD_KD_H
A lightweight library for quad kinematic functions.
Definition quad_kd.h:28
const double abad_vel_max_
Abad max joint velocity.
Definition quad_kd.h:438
const Eigen::VectorXd tau_max_
Vector of max torques.
Definition quad_kd.h:431
const double knee_vel_max_
Knee max joint velocity.
Definition quad_kd.h:444
bool isValidFullState(const Eigen::VectorXd &body_state, const Eigen::VectorXd &joint_state, const Eigen::VectorXd &torques, const grid_map::GridMap &terrain, Eigen::VectorXd &state_violation, Eigen::VectorXd &control_violation)
Check if state is valid.
Definition quad_kd.cpp:800
std::vector< Eigen::Matrix4d > g_body_legbases_
Vector of legbase offsets.
Definition quad_kd.h:402
std::vector< std::vector< double > > joint_min_
Vector of the joint lower limits.
Definition quad_kd.h:408
void getJacobianGenCoord(const Eigen::VectorXd &state, Eigen::MatrixXd &jacobian) const
Compute Jacobian for generalized coordinates.
Definition quad_kd.cpp:487
const Eigen::VectorXd vel_max_
Vector of max velocities.
Definition quad_kd.h:447
const double hip_vel_max_
Hip max joint velocity.
Definition quad_kd.h:441
const double abad_tau_max_
Abad max joint torque.
Definition quad_kd.h:422
void initModel(std::string ns)
Initialize model for the class.
Definition quad_kd.cpp:11
bool isValidCentroidalState(const Eigen::VectorXd &body_state, const Eigen::VectorXd &foot_positions, const Eigen::VectorXd &foot_velocities, const Eigen::VectorXd &grfs, const grid_map::GridMap &terrain, Eigen::VectorXd &joint_positions, Eigen::VectorXd &joint_velocities, Eigen::VectorXd &torques, Eigen::VectorXd &state_violation, Eigen::VectorXd &control_violation)
Check if state is valid.
Definition quad_kd.cpp:830
const double knee_tau_max_
Knee max joint torque.
Definition quad_kd.h:428
void getJacobianWorldAngVel(const Eigen::VectorXd &state, Eigen::MatrixXd &jacobian) const
Compute Jacobian for angular velocity in world frame.
Definition quad_kd.cpp:545
void getRotationMatrix(const Eigen::VectorXd &rpy, Eigen::Matrix3d &rot) const
Compute rotation matrix given roll pitch and yaw.
Definition quad_kd.cpp:559
bool applyMotorModel(const Eigen::VectorXd &torques, Eigen::VectorXd &constrained_torques)
Apply a uniform maximum torque to a given set of joint torques.
Definition quad_kd.cpp:771
std::vector< Eigen::Vector3d > legbase_offsets_
Vector of legbase offsets.
Definition quad_kd.h:399
void worldToKneeFKWorldFrame(int leg_index, Eigen::Vector3d body_pos, Eigen::Vector3d body_rpy, Eigen::Vector3d joint_state, Eigen::Matrix4d &g_world_knee) const
Compute forward kinematics for a specified leg.
Definition quad_kd.cpp:293
void worldToNominalHipFKWorldFrame(int leg_index, Eigen::Vector3d body_pos, Eigen::Vector3d body_rpy, Eigen::Vector3d &nominal_hip_pos_world) const
Get the position of the nominal hip location in the world frame.
Definition quad_kd.cpp:182
Eigen::Vector3d foot_offset_
Foot offset from knee.
Definition quad_kd.h:396
void worldToLegbaseFKWorldFrame(int leg_index, Eigen::Vector3d body_pos, Eigen::Vector3d body_rpy, Eigen::Matrix4d &g_world_legbase) const
Get the transform from the world frame to the leg base.
Definition quad_kd.cpp:163
double getLinkLength(int leg_index, int link_index) const
Get the upper joint limit of a particular joint.
Definition quad_kd.cpp:128
double getJointUpperLimit(int leg_index, int joint_index) const
Get the upper joint limit of a particular joint.
Definition quad_kd.cpp:124
double getJointLowerLimit(int leg_index, int joint_index) const
Get the lower joint limit of a particular joint.
Definition quad_kd.cpp:120
std::vector< std::vector< double > > joint_max_
Vector of the joint upper limits.
Definition quad_kd.h:411
Eigen::Matrix4d createAffineMatrix(Eigen::Vector3d trans, Eigen::Vector3d rpy) const
Create an Eigen Eigen::Matrix4d containing a homogeneous transform from a specified translation and a...
Definition quad_kd.cpp:100
void computeInverseDynamics(const Eigen::VectorXd &state_pos, const Eigen::VectorXd &state_vel, const Eigen::VectorXd &foot_acc, const Eigen::VectorXd &grf, const std::vector< int > &contact_mode, Eigen::VectorXd &tau) const
Compute inverse dynamics for swing leg.
Definition quad_kd.cpp:566
double l2_
Lower link length.
Definition quad_kd.h:387
void getJacobianBodyAngVel(const Eigen::VectorXd &state, Eigen::MatrixXd &jacobian) const
Compute Jacobian for angular velocity in body frame.
Definition quad_kd.cpp:503
const int num_feet_
Number of feet.
Definition quad_kd.h:378
void bodyToFootFKBodyFrame(int leg_index, Eigen::Vector3d joint_state, Eigen::Matrix4d &g_body_foot) const
Compute forward kinematics for a specified leg from the body COM.
Definition quad_kd.cpp:197
bool worldToFootIKWorldFrame(int leg_index, Eigen::Vector3d body_pos, Eigen::Vector3d body_rpy, Eigen::Vector3d foot_pos_world, Eigen::Vector3d &joint_state) const
Compute inverse kinematics for a specified leg.
Definition quad_kd.cpp:341
void transformBodyToWorld(Eigen::Vector3d body_pos, Eigen::Vector3d body_rpy, Eigen::Matrix4d transform_body, Eigen::Matrix4d &transform_world) const
Transform a transformation matrix from the body frame to the world frame.
Definition quad_kd.cpp:141
bool convertCentroidalToFullBody(const Eigen::VectorXd &body_state, const Eigen::VectorXd &foot_positions, const Eigen::VectorXd &foot_velocities, const Eigen::VectorXd &grfs, Eigen::VectorXd &joint_positions, Eigen::VectorXd &joint_velocities, Eigen::VectorXd &torques)
Convert centroidal model states (foot coordinates and grfs) to full body (joints and torques)
Definition quad_kd.cpp:702
const double hip_tau_max_
Hip max joint torque.
Definition quad_kd.h:425
void worldToFootFKWorldFrame(int leg_index, Eigen::Vector3d body_pos, Eigen::Vector3d body_rpy, Eigen::Vector3d joint_state, Eigen::Matrix4d &g_world_foot) const
Compute forward kinematics for a specified leg.
Definition quad_kd.cpp:240
QuadKD()
Constructor for QuadKD Class.
Definition quad_kd.cpp:7
void transformWorldToBody(Eigen::Vector3d body_pos, Eigen::Vector3d body_rpy, Eigen::Matrix4d transform_world, Eigen::Matrix4d &transform_body) const
Transform a transformation matrix from the world frame to the body frame.
Definition quad_kd.cpp:152
double l1_
Upper link length.
Definition quad_kd.h:384
Eigen::Vector3d abad_offset_
Abad offset from legbase.
Definition quad_kd.h:390
std::vector< double > l0_vec_
Vector of the abad link lengths.
Definition quad_kd.h:381
bool legbaseToFootIKLegbaseFrame(int leg_index, Eigen::Vector3d foot_pos_legbase, Eigen::Vector3d &joint_state) const
Compute inverse kinematics for a specified leg in the leg base frame.
Definition quad_kd.cpp:372
Eigen::Vector3d knee_offset_
Knee offset from hip.
Definition quad_kd.h:393
const double joint_eps
Epsilon offset for joint bounds.
Definition quad_kd.h:405