HEBI C++ API  1.0.0-rc1
kinematics.hpp
Go to the documentation of this file.
1 #pragma once
2 
3 #include "hebi_kinematics.h"
4 #include "Eigen/Eigen"
5 #include "util.hpp"
6 #include <vector>
7 #include <memory>
8 
9 using namespace Eigen;
10 
11 namespace hebi {
12 namespace kinematics {
13 
14 typedef std::vector<Matrix4f, Eigen::aligned_allocator<Eigen::Matrix4f> > Matrix4fVector;
15 typedef std::vector<MatrixXf, Eigen::aligned_allocator<Eigen::MatrixXf> > MatrixXfVector;
16 
17 class Kinematics;
18 
20 {
21  friend Kinematics;
22 
23  private:
27  HebiBodyPtr internal_;
28 
33  bool manage_pointer_lifetime_ = true;
34 
38  HebiBodyPtr getInternal() const { return internal_; }
39 
44  void consume() { manage_pointer_lifetime_ = false; }
45 
46  protected:
47  #ifndef DOXYGEN_OMIT_INTERNAL
48 
52  KinematicBody(HebiBodyPtr internal) : internal_(internal) {};
53  #endif // DOXYGEN_OMIT_INTERNAL
54 
55  public:
60  virtual ~KinematicBody() noexcept
61  {
62  if (manage_pointer_lifetime_)
63  hebiBodyRelease(internal_);
64  }
65 
69  static std::shared_ptr<KinematicBody> createX5();
70 
83  static std::shared_ptr<KinematicBody> createX5Link(float length, float twist);
84 
94  static std::shared_ptr<KinematicBody> createGenericLink(const Eigen::Vector3f& com, const Eigen::Matrix4f& output);
95 };
96 
103 class Kinematics final
104 {
105  private:
109  const HebiKinematicsPtr internal_;
110 
111  public:
116  Kinematics();
117 
122  virtual ~Kinematics() noexcept;
123 
135  void setBaseFrame(const Eigen::Matrix4f& base_frame);
136 
141  Eigen::Matrix4f getBaseFrame() const;
142 
152  size_t getFrameCount(HebiFrameType frame_type) const;
153 
158  size_t getDoFCount() const;
159 
170  bool addBody(std::shared_ptr<KinematicBody> new_body);
171 
177  void getForwardKinematics(HebiFrameType, const Eigen::VectorXd& positions, Matrix4fVector& frames) const;
203  void getFK(HebiFrameType, const Eigen::VectorXd& positions, Matrix4fVector& frames) const;
204 
225  void getEndEffector(HebiFrameType, const Eigen::VectorXd& positions, Eigen::Matrix4f& transform) const;
226 
233  void solveInverseKinematics(const Eigen::Vector3f& target_xyz, const Eigen::VectorXd& positions, Eigen::VectorXd& result) const;
250  void solveIK(const Eigen::Vector3f& target_xyz, const Eigen::VectorXd& initial_positions, Eigen::VectorXd& result) const;
251 
257  void getJacobians(HebiFrameType, const Eigen::VectorXd& positions, MatrixXfVector& jacobians) const;
271  void getJ(HebiFrameType, const Eigen::VectorXd& positions, MatrixXfVector& jacobians) const;
272 
278  void getJacobianEndEffector(HebiFrameType, const Eigen::VectorXd& positions, Eigen::MatrixXf& jacobian) const;
300  void getJEndEffector(HebiFrameType, const Eigen::VectorXd& positions, Eigen::MatrixXf& jacobian) const;
301 
302  private:
307 };
308 
309 } // namespace kinematics
310 } // namespace hebi
std::vector< Matrix4f, Eigen::aligned_allocator< Eigen::Matrix4f > > Matrix4fVector
Definition: kinematics.hpp:14
Definition: color.hpp:5
#define HEBI_DISABLE_COPY_MOVE(Class)
Definition: util.hpp:7
std::vector< MatrixXf, Eigen::aligned_allocator< Eigen::MatrixXf > > MatrixXfVector
Definition: kinematics.hpp:15
Represents a kinematic chain or tree of bodies (links and joints and modules).
Definition: kinematics.hpp:103
Definition: kinematics.hpp:19
virtual ~KinematicBody() noexcept
Destructor cleans up body (and any child pointers that are still owned).
Definition: kinematics.hpp:60