spatial-dyn
articulated_body.h
1 
10 #ifndef SPATIAL_DYN_STRUCTS_ARTICULATED_BODY_H_
11 #define SPATIAL_DYN_STRUCTS_ARTICULATED_BODY_H_
12 
13 #include <functional> // std::function
14 #include <map> // std::map
15 #include <memory> // std::unique_ptr
16 #include <ostream> // std::ostream
17 #include <string> // std::string
18 #include <utility> // std::pair
19 #include <vector> // std::vector
20 
21 #include "spatial_dyn/eigen/spatial_math.h"
22 #include "spatial_dyn/structs/rigid_body.h"
23 
24 namespace spatial_dyn {
25 
34 
35  public:
37  EIGEN_MAKE_ALIGNED_OPERATOR_NEW
39 
44 
51  ArticulatedBody(const std::string& name);
52 
57 
62 
66  virtual ~ArticulatedBody();
67 
72 
76  // ArticulatedBody& operator=(ArticulatedBody&& ab) = default;
77 
83  mutable std::string name;
84 
90  mutable std::vector<Graphics> graphics;
91 
96  size_t dof() const { return dof_; };
97 
111  int AddRigidBody(const RigidBody& rb, int id_parent = -1);
112 
117  const std::vector<RigidBody>& rigid_bodies() const { return rigid_bodies_; };
118 
122  const RigidBody& rigid_bodies(int i) const;
123 
128  const Eigen::VectorXd& q() const { return q_; };
129 
133  double q(int i) const;
134 
138  virtual void set_q(Eigen::Ref<const Eigen::VectorXd> q);
139 
144  const Eigen::VectorXd& dq() const { return dq_; };
145 
149  double dq(int i) const;
150 
154  virtual void set_dq(Eigen::Ref<const Eigen::VectorXd> dq);
155 
161  const SpatialMotiond& g() const { return g_; };
162 
166  void set_g(const Eigen::Vector3d& g);
167 
177  virtual void AddLoad(const SpatialInertiad& inertia, int idx_link = -1);
178 
188  virtual void ReplaceLoad(const SpatialInertiad& inertia, int idx_link = -1);
189 
196  virtual void ClearLoad(int idx_link = -1);
197 
203  const std::map<size_t, SpatialInertiad>& inertia_load() const { return inertia_load_; }
204 
224  const Eigen::Isometry3d& T_base_to_world() const { return T_base_to_world_; };
225 
232  template<typename Derived>
233  void set_T_base_to_world(const Eigen::RotationBase<Derived,3>& ori_in_world,
234  const Eigen::Vector3d& pos_in_world) {
235  T_base_to_world_ = Eigen::Translation3d(pos_in_world) * ori_in_world;
236  }
237 
243  void set_T_base_to_world(const Eigen::Isometry3d& T_to_world);
244 
250  const SpatialInertiad& inertia_base() const { return inertia_base_; }
251 
260  void set_inertia_base(double mass, const Eigen::Vector3d& com, const Eigen::Vector6d& I_com_flat);
261 
267  void set_inertia_base(const SpatialInertiad& inertia);
268 
295  const Eigen::Isometry3d& T_to_parent(int i) const;
296 
307  Eigen::Isometry3d T_to_parent(int i, double q) const;
308 
317  Eigen::Isometry3d T_from_parent(int i) const { return T_to_parent(i).inverse(); };
318 
329  Eigen::Isometry3d T_from_parent(int i, double q) const { return T_to_parent(i, q).inverse(); };
330 
356  const Eigen::Isometry3d& T_to_world(int i) const;
357 
368  Eigen::Isometry3d T_to_world(int i, Eigen::Ref<const Eigen::VectorXd> q) const;
369 
378  Eigen::Isometry3d T_from_world(int i) const { return T_to_world(i).inverse(); };
379 
390  Eigen::Isometry3d T_from_world(int i, Eigen::Ref<const Eigen::VectorXd> q) const {
391  return T_to_world(i, q).inverse();
392  };
393 
403  const std::vector<int>& ancestors(int i) const;
404 
414  const std::vector<int>& subtree(int i) const;
415 
423  Eigen::VectorXd Map(const std::function<double(const RigidBody& rb)>& rb_function) const;
424 
426  struct Cache; // Defined in articulated_body_cache.h
427  std::unique_ptr<Cache> cache_; // Pointer to cache for internal use
429 
430  protected:
431 
433  void ExpandDof(int id, int id_parent);
434 
435  size_t dof_ = 0;
436  std::vector<RigidBody> rigid_bodies_;
437 
438  Eigen::VectorXd q_;
439  Eigen::VectorXd dq_;
440  SpatialMotiond g_ = -9.81 * SpatialMotiond::UnitLinZ();
441 
442  std::map<size_t, SpatialInertiad> inertia_load_;
443 
444  Eigen::Isometry3d T_base_to_world_ = Eigen::Isometry3d::Identity();
445  SpatialInertiad inertia_base_ = SpatialInertiad(1, Eigen::Vector3d::Zero(), Eigen::Vector6d::Zero());
446 
447  std::vector<std::vector<int>> ancestors_; // Ancestors from base to link i
448  std::vector<std::vector<int>> subtrees_; // Descendants of link i including link i
450 
451 };
452 
458 std::ostream& operator<<(std::ostream& os, const ArticulatedBody& ab);
459 
460 } // namespace spatial_dyn
461 
462 #endif // SPATIAL_DYN_STRUCTS_ARTICULATED_BODY_H_
Definition: articulated_body.h:33
const std::vector< int > & subtree(int i) const
Definition: articulated_body.cc:228
virtual void ReplaceLoad(const SpatialInertiad &inertia, int idx_link=-1)
Definition: articulated_body.cc:147
void set_g(const Eigen::Vector3d &g)
Definition: articulated_body.cc:130
const Eigen::VectorXd & dq() const
Definition: articulated_body.h:144
Eigen::Isometry3d T_from_parent(int i, double q) const
Definition: articulated_body.h:329
const std::vector< int > & ancestors(int i) const
Definition: articulated_body.cc:224
int AddRigidBody(const RigidBody &rb, int id_parent=-1)
Definition: articulated_body.cc:241
virtual ~ArticulatedBody()
Definition: articulated_body.cc:50
const Eigen::Isometry3d & T_base_to_world() const
Definition: articulated_body.h:224
Eigen::Isometry3d T_from_world(int i) const
Definition: articulated_body.h:378
const std::map< size_t, SpatialInertiad > & inertia_load() const
Definition: articulated_body.h:203
virtual void set_dq(Eigen::Ref< const Eigen::VectorXd > dq)
Definition: articulated_body.cc:114
size_t dof() const
Definition: articulated_body.h:96
ArticulatedBody & operator=(const ArticulatedBody &ab)
Definition: articulated_body.cc:52
ArticulatedBody()
Definition: articulated_body.cc:18
void set_T_base_to_world(const Eigen::RotationBase< Derived, 3 > &ori_in_world, const Eigen::Vector3d &pos_in_world)
Definition: articulated_body.h:233
const Eigen::Isometry3d & T_to_world(int i) const
Definition: articulated_body.cc:196
const SpatialInertiad & inertia_base() const
Definition: articulated_body.h:250
const Eigen::Isometry3d & T_to_parent(int i) const
Definition: articulated_body.cc:178
std::string name
Definition: articulated_body.h:83
void set_inertia_base(double mass, const Eigen::Vector3d &com, const Eigen::Vector6d &I_com_flat)
Definition: articulated_body.cc:163
Eigen::VectorXd Map(const std::function< double(const RigidBody &rb)> &rb_function) const
Definition: articulated_body.cc:233
const SpatialMotiond & g() const
Definition: articulated_body.h:161
virtual void set_q(Eigen::Ref< const Eigen::VectorXd > q)
Definition: articulated_body.cc:92
virtual void ClearLoad(int idx_link=-1)
Definition: articulated_body.cc:153
virtual void AddLoad(const SpatialInertiad &inertia, int idx_link=-1)
Definition: articulated_body.cc:137
std::vector< Graphics > graphics
Definition: articulated_body.h:90
Eigen::Isometry3d T_from_world(int i, Eigen::Ref< const Eigen::VectorXd > q) const
Definition: articulated_body.h:390
const std::vector< RigidBody > & rigid_bodies() const
Definition: articulated_body.h:117
const Eigen::VectorXd & q() const
Definition: articulated_body.h:128
Eigen::Isometry3d T_from_parent(int i) const
Definition: articulated_body.h:317
Definition: rigid_body.h:34
Definition: spatial_inertia.h:21
Definition: spatial_motion.h:18
std::ostream & operator<<(std::ostream &os, const ArticulatedBody &ab)
Definition: articulated_body.cc:346
Definition: discrete_dynamics.cc:21