11 using namespace Eigen;
14 namespace robot_model {
16 using Matrix4dVector = std::vector<Matrix4d, Eigen::aligned_allocator<Eigen::Matrix4d>>;
17 using MatrixXdVector = std::vector<MatrixXd, Eigen::aligned_allocator<Eigen::MatrixXd>>;
33 virtual HebiStatusCode addObjective(HebiIKPtr ik)
const = 0;
42 HebiStatusCode addObjective(HebiIKPtr ik)
const override;
43 double _weight, _x, _y, _z;
52 HebiStatusCode addObjective(HebiIKPtr ik)
const override;
54 const double _matrix[9];
63 HebiStatusCode addObjective(HebiIKPtr ik)
const override;
64 double _weight, _x, _y, _z;
69 JointLimitConstraint(
const Eigen::VectorXd& min_positions,
const Eigen::VectorXd& max_positions);
70 JointLimitConstraint(
double weight,
const Eigen::VectorXd& min_positions,
const Eigen::VectorXd& max_positions);
73 HebiStatusCode addObjective(HebiIKPtr ik)
const override;
75 Eigen::VectorXd _min_positions;
76 Eigen::VectorXd _max_positions;
80 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
140 using ObjectiveCallback = std::function<void(
const std::vector<double>&, std::array<double, N>&)>;
147 void callCallback(
void*,
size_t num_positions,
const double* positions,
double* errors)
const {
154 std::vector<double> positions_array(num_positions);
155 for (
size_t i = 0; i < num_positions; ++i)
156 positions_array[i] = positions[i];
160 std::array<double, N> errors_array;
161 for (
size_t i = 0; i < N; ++i)
162 errors_array[i] = errors[i];
164 _callback(positions_array, errors_array);
166 for (
size_t i = 0; i < N; ++i)
167 errors[i] = errors_array[i];
171 HebiStatusCode addObjective(HebiIKPtr ik)
const override {
172 return hebiIKAddObjectiveCustom(ik, _weight, N, &custom_objective_callback_wrapper<N>,
173 const_cast<CustomObjective*>(
this));
176 ObjectiveCallback _callback;
187 reinterpret_cast<CustomObjective<T>*
>(user_data)->callCallback(user_data, num_positions, positions, errors);
190 class ActuatorMetadata;
191 class BracketMetadata;
194 class RigidBodyMetadata;
209 return metadata_.element_type_;
218 if (elementType() == HebiRobotModelElementTypeActuator) {
219 return reinterpret_cast<const ActuatorMetadata*>(
this);
230 if (elementType() == HebiRobotModelElementTypeBracket) {
231 return reinterpret_cast<const BracketMetadata*>(
this);
242 if (elementType() == HebiRobotModelElementTypeJoint) {
243 return reinterpret_cast<const JointMetadata*>(
this);
254 if (elementType() == HebiRobotModelElementTypeLink) {
255 return reinterpret_cast<const LinkMetadata*>(
this);
266 if (elementType() == HebiRobotModelElementTypeRigidBody) {
267 return reinterpret_cast<const RigidBodyMetadata*>(
this);
274 const HebiRobotModelElementMetadata&
metadata()
const {
return metadata_; }
276 HebiRobotModelElementMetadata metadata_;
287 HebiActuatorType
actuatorType()
const {
return metadata().actuator_type_; }
298 HebiBracketType
bracketType()
const {
return metadata().bracket_type_; }
309 HebiJointType
jointType()
const {
return metadata().joint_type_; }
320 HebiLinkType
linkType()
const {
return metadata().link_type_; }
325 float extension()
const {
return metadata().extension_; }
330 float twist()
const {
return metadata().twist_; }
351 HebiRobotModelPtr
const internal_;
358 HebiStatusCode addObjectives(HebiIKPtr ik,
const T& objective)
const {
359 static_assert(std::is_convertible<T*, Objective*>::value,
360 "Must pass arguments of base type hebi::robot_model::Objective to the variable args of solveIK!");
361 return static_cast<const Objective*>(&objective)->addObjective(ik);
367 template<
typename T,
typename... Args>
368 HebiStatusCode addObjectives(HebiIKPtr ik,
const T& objective, Args... args)
const {
369 static_assert(std::is_convertible<T*, Objective*>::value,
370 "Must pass arguments of base type hebi::robot_model::Objective to the variable args of solveIK!");
371 auto res = static_cast<const Objective*>(&objective)->addObjective(ik);
372 if (res != HebiStatusSuccess)
374 return addObjectives(ik, args...);
380 bool tryAdd(HebiRobotModelElementPtr element,
bool combine);
412 static std::unique_ptr<RobotModel> loadHRDF(
const std::string& file);
431 void setBaseFrame(const Eigen::Matrix4d& base_frame);
437 Eigen::Matrix4d getBaseFrame() const;
448 size_t getFrameCount(HebiFrameType frame_type) const;
454 size_t getDoFCount() const;
478 bool addRigidBody(const Eigen::Matrix4d& com, const Eigen::VectorXd& inertia,
double mass,
479 const Eigen::Matrix4d& output,
bool combine);
490 bool addJoint(HebiJointType joint_type,
bool combine);
498 bool addActuator(ActuatorType actuator_type);
514 bool addLink(LinkType link_type,
double extension,
double twist);
522 bool addBracket(BracketType bracket_type);
529 void getForwardKinematics(HebiFrameType, const Eigen::VectorXd& positions,
Matrix4dVector& frames) const;
555 void getFK(HebiFrameType, const Eigen::VectorXd& positions,
Matrix4dVector& frames) const;
576 void getEndEffector(const Eigen::VectorXd& positions, Eigen::Matrix4d& transform) const;
584 template<typename... Args>
585 IKResult solveInverseKinematics(const Eigen::VectorXd& initial_positions, Eigen::VectorXd& result,
586 Args... args)
const {
587 return solveIK(initial_positions, result, args...);
604 template<
typename... Args>
605 IKResult solveIK(
const Eigen::VectorXd& initial_positions, Eigen::VectorXd& result, Args... objectives)
const {
607 auto ik = hebiIKCreate();
611 res.
result = addObjectives(ik, objectives...);
612 if (res.
result != HebiStatusSuccess) {
618 auto positions_array =
new double[initial_positions.size()];
620 Map<Eigen::VectorXd> tmp(positions_array, initial_positions.size());
621 tmp = initial_positions;
623 auto result_array =
new double[initial_positions.size()];
626 res.
result = hebiIKSolve(ik, internal_, positions_array, result_array,
nullptr);
629 delete[] positions_array;
631 Map<Eigen::VectorXd> tmp(result_array, initial_positions.size());
634 delete[] result_array;
646 void getJacobians(HebiFrameType,
const Eigen::VectorXd& positions,
MatrixXdVector& jacobians)
const;
660 void getJ(HebiFrameType,
const Eigen::VectorXd& positions,
MatrixXdVector& jacobians)
const;
667 void getJacobianEndEffector(
const Eigen::VectorXd& positions, Eigen::MatrixXd& jacobian)
const;
687 void getJEndEffector(
const Eigen::VectorXd& positions, Eigen::MatrixXd& jacobian)
const;
697 void getMasses(Eigen::VectorXd& masses)
const;
702 void getMetadata(std::vector<MetadataBase>& metadata)
const;
std::vector< Matrix4d, Eigen::aligned_allocator< Eigen::Matrix4d > > Matrix4dVector
Definition: robot_model.hpp:16
BracketType
Definition: robot_model.hpp:393
void custom_objective_callback_wrapper(void *user_data, size_t num_positions, const double *positions, double *errors)
C-style callback wrapper to call into CustomObjective class; this should only be used by the CustomOb...
Definition: robot_model.hpp:185
CustomObjective(ObjectiveCallback error_function)
Definition: robot_model.hpp:142
#define HEBI_DISABLE_COPY_MOVE(Class)
Definition: util.hpp:6
Represents a chain or tree of robot elements (rigid bodies and joints).
Definition: robot_model.hpp:344
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:605
Definition: robot_model.hpp:36
HebiStatusCode result
Definition: robot_model.hpp:21
Definition: robot_model.hpp:67
virtual ~Objective()
Definition: robot_model.hpp:30
Definition: robot_model.hpp:57
LinkType
Definition: robot_model.hpp:391
Definition: robot_model.hpp:26
Definition: robot_model.hpp:46
Rigid Body specific view of an element in a RobotModel instance.
Definition: robot_model.hpp:336
Allows you to add a custom objective function.
Definition: robot_model.hpp:135
void callCallback(void *, size_t num_positions, const double *positions, double *errors) const
Definition: robot_model.hpp:147
Definition: robot_model.hpp:20
std::function< void(const std::vector< double > &, std::array< double, N > &)> ObjectiveCallback
Definition: robot_model.hpp:140
ActuatorType
Definition: robot_model.hpp:389
std::vector< MatrixXd, Eigen::aligned_allocator< Eigen::MatrixXd > > MatrixXdVector
Definition: robot_model.hpp:17
CustomObjective(double weight, ObjectiveCallback error_function)
Definition: robot_model.hpp:143