12 namespace robot_model {
14 using Matrix4dVector = std::vector<Matrix4d, Eigen::aligned_allocator<Eigen::Matrix4d> >;
15 using MatrixXdVector = std::vector<MatrixXd, Eigen::aligned_allocator<Eigen::MatrixXd> >;
31 virtual HebiStatusCode addObjective(HebiIKPtr ik)
const = 0;
40 HebiStatusCode addObjective(HebiIKPtr ik)
const override;
41 double _weight, _x, _y, _z;
50 HebiStatusCode addObjective(HebiIKPtr ik)
const override;
52 const double _matrix[9];
61 HebiStatusCode addObjective(HebiIKPtr ik)
const override;
62 double _weight, _x, _y, _z;
68 JointLimitConstraint(
const Eigen::VectorXd& min_positions,
const Eigen::VectorXd& max_positions);
69 JointLimitConstraint(
double weight,
const Eigen::VectorXd& min_positions,
const Eigen::VectorXd& max_positions);
71 HebiStatusCode addObjective(HebiIKPtr ik)
const override;
73 Eigen::VectorXd _min_positions;
74 Eigen::VectorXd _max_positions;
77 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
94 HebiRobotModelPtr
const internal_;
101 HebiStatusCode addObjectives(HebiIKPtr ik,
const T& objective)
const 103 static_assert(std::is_convertible<T*, Objective*>::value,
104 "Must pass arguments of base type hebi::robot_model::Objective to the variable args of solveIK!");
105 return static_cast<const Objective*
>(&objective)->addObjective(ik);
111 template<
typename T,
typename ... Args>
112 HebiStatusCode addObjectives(HebiIKPtr ik,
const T& objective, Args ... args)
const 114 static_assert(std::is_convertible<T*, Objective*>::value,
115 "Must pass arguments of base type hebi::robot_model::Objective to the variable args of solveIK!");
116 auto res =
static_cast<const Objective*
>(&objective)->addObjective(ik);
117 if (res != HebiStatusSuccess)
119 return addObjectives(ik, args ...);
125 static void setTranslate(Eigen::Matrix4d& matrix,
double x,
double y,
double z);
130 static void setRotX(Eigen::Matrix4d& matrix,
double radians);
135 static void setSphereInertia(Eigen::VectorXd& inertia,
double mass,
double radius);
140 static void setRodXAxisInertia(Eigen::VectorXd& inertia,
double mass,
double length);
145 bool tryAdd(HebiRobotModelElementPtr element,
bool combine);
196 void setBaseFrame(
const Eigen::Matrix4d& base_frame);
202 Eigen::Matrix4d getBaseFrame()
const;
213 size_t getFrameCount(HebiFrameType frame_type)
const;
219 size_t getDoFCount()
const;
244 const Eigen::Matrix4d& com,
245 const Eigen::VectorXd& inertia,
247 const Eigen::Matrix4d& output,
260 HebiJointType joint_type,
285 bool addLink(
LinkType link_type,
double extension,
double twist);
300 void getForwardKinematics(HebiFrameType,
const Eigen::VectorXd& positions,
Matrix4dVector& frames)
const;
326 void getFK(HebiFrameType,
const Eigen::VectorXd& positions,
Matrix4dVector& frames)
const;
348 void getEndEffector(
const Eigen::VectorXd& positions, Eigen::Matrix4d& transform)
const;
356 template<
typename ... Args>
359 return solveIK(initial_positions, result, args ...);
376 template<
typename ... Args>
378 Eigen::VectorXd& result,
379 Args ... objectives)
const 382 auto ik = hebiIKCreate();
386 res.
result = addObjectives(ik, objectives ...);
387 if (res.
result != HebiStatusSuccess)
394 auto positions_array =
new double[initial_positions.size()];
396 Map<Eigen::VectorXd> tmp(positions_array, initial_positions.size());
397 tmp = initial_positions;
399 auto result_array =
new double[initial_positions.size()];
402 res.
result = hebiIKSolve(ik, internal_, positions_array, result_array,
nullptr);
405 delete[] positions_array;
407 Map<Eigen::VectorXd> tmp(result_array, initial_positions.size());
410 delete[] result_array;
422 void getJacobians(HebiFrameType,
const Eigen::VectorXd& positions,
MatrixXdVector& jacobians)
const;
436 void getJ(HebiFrameType,
const Eigen::VectorXd& positions,
MatrixXdVector& jacobians)
const;
443 void getJacobianEndEffector(
const Eigen::VectorXd& positions, Eigen::MatrixXd& jacobian)
const;
463 void getJEndEffector(
const Eigen::VectorXd& positions, Eigen::MatrixXd& jacobian)
const;
473 void getMasses(Eigen::VectorXd& masses)
const;
479 static const std::map<ActuatorType, double> actuator_masses_;
std::vector< Matrix4d, Eigen::aligned_allocator< Eigen::Matrix4d > > Matrix4dVector
Definition: robot_model.hpp:14
BracketType
Definition: robot_model.hpp:163
#define HEBI_DISABLE_COPY_MOVE(Class)
Definition: util.hpp:7
Represents a chain or tree of robot elements (rigid bodies and joints).
Definition: robot_model.hpp:86
Definition: robot_model.hpp:34
IKResult solveInverseKinematics(const Eigen::VectorXd &initial_positions, Eigen::VectorXd &result, Args...args) const
Solves for an inverse kinematics solution given a set of objectives.
Definition: robot_model.hpp:357
HebiStatusCode result
Definition: robot_model.hpp:20
Definition: robot_model.hpp:65
virtual ~Objective()
Definition: robot_model.hpp:29
Definition: robot_model.hpp:55
LinkType
Definition: robot_model.hpp:158
Definition: robot_model.hpp:25
Definition: robot_model.hpp:44
IKResult solveIK(const Eigen::VectorXd &initial_positions, Eigen::VectorXd &result, Args...objectives) const
Solves for an inverse kinematics solution given a set of objectives.
Definition: robot_model.hpp:377
Definition: robot_model.hpp:18
ActuatorType
Definition: robot_model.hpp:148
std::vector< MatrixXd, Eigen::aligned_allocator< Eigen::MatrixXd > > MatrixXdVector
Definition: robot_model.hpp:15