5#include <rbdl/addons/urdfreader/urdfreader.h>
7#include <rbdl/rbdl_utils.h>
9#include <tf2/LinearMath/Quaternion.h>
11#include <Eigen/Geometry>
13#include <grid_map_core/GridMap.hpp>
17#include "quad_utils/function_timer.h"
18#include "quad_utils/math_utils.h"
58 Eigen::Vector3d rpy)
const;
68 Eigen::AngleAxisd rot)
const;
79 Eigen::Matrix4d transform_body,
80 Eigen::Matrix4d &transform_world)
const;
91 Eigen::Matrix4d transform_world,
92 Eigen::Matrix4d &transform_body)
const;
101 Eigen::Matrix4d &g_body_foot)
const;
110 Eigen::Vector3d &foot_pos_body)
const;
121 Eigen::Vector3d body_rpy,
122 Eigen::Vector3d joint_state,
123 Eigen::Matrix4d &g_world_foot)
const;
134 Eigen::Vector3d body_rpy,
135 Eigen::Vector3d joint_state,
136 Eigen::Vector3d &foot_pos_world)
const;
147 Eigen::Vector3d body_rpy,
148 Eigen::Vector3d joint_state,
149 Eigen::Matrix4d &g_world_knee)
const;
160 Eigen::Vector3d body_rpy,
161 Eigen::Vector3d joint_state,
162 Eigen::Vector3d &knee_pos_world)
const;
174 Eigen::Vector3d body_rpy,
175 Eigen::Vector3d foot_pos_world,
176 Eigen::Vector3d &joint_state)
const;
187 Eigen::Vector3d foot_pos_legbase,
188 Eigen::Vector3d &joint_state)
const;
222 Eigen::Vector3d body_rpy,
223 Eigen::Matrix4d &g_world_legbase)
const;
233 Eigen::Vector3d body_rpy,
234 Eigen::Vector3d &leg_base_pos_world)
const;
244 int leg_index, Eigen::Vector3d body_pos, Eigen::Vector3d body_rpy,
245 Eigen::Vector3d &nominal_hip_pos_world)
const;
253 Eigen::MatrixXd &jacobian)
const;
261 Eigen::MatrixXd &jacobian)
const;
269 Eigen::MatrixXd &jacobian)
const;
277 Eigen::Matrix3d &rot)
const;
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;
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);
323 Eigen::VectorXd &constrained_torques);
336 const Eigen::VectorXd &joint_velocities,
337 Eigen::VectorXd &constrained_torques);
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);
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);
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));
413 RigidBodyDynamics::Model *model_;
415 std::vector<std::string> body_name_list_;
417 std::vector<unsigned int> body_id_list_;
419 std::vector<int> leg_idx_list_;
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