MultiBodyGraph.h
Go to the documentation of this file.
1 /*
2  * Copyright 2012-2019 CNRS-UM LIRMM, CNRS-AIST JRL
3  */
4 
5 #pragma once
6 
7 // includes
8 // std
9 #include <map>
10 #include <memory>
11 #include <vector>
12 
13 // SpaceVecAlg
14 #include <SpaceVecAlg/SpaceVecAlg>
15 
16 // RBDyn
17 #include <rbdyn/config.hh>
18 
19 #include "Body.h"
20 #include "Joint.h"
21 
22 namespace rbd
23 {
24 class MultiBody;
25 
32 class RBDYN_DLLAPI MultiBodyGraph
33 {
34 public:
35  struct Node;
36 
41  struct Arc
42  {
43  Arc() {}
44 
45  Arc(sva::PTransformd X0, const Joint & j, bool forward, std::shared_ptr<Node> n) : X(X0), joint(j), next(n)
46  {
47  joint.forward(forward);
48  }
49 
50  sva::PTransformd X;
52  std::shared_ptr<Node> next;
53  };
54 
59  struct Node
60  {
61  Node(const Body & b) : body(b) {}
62 
64  std::vector<Arc> arcs;
65  };
66 
67 public:
68  MultiBodyGraph(const std::string rootName = "Root");
69  MultiBodyGraph(const MultiBodyGraph & mbg);
70  ~MultiBodyGraph();
71 
72  MultiBodyGraph & operator=(const MultiBodyGraph & mbg);
73 
74  void clear();
75 
81  void addBody(const Body & B);
82 
88  void addJoint(const Joint & J);
89 
102  void linkBodies(const std::string & b1Name,
103  const sva::PTransformd & tB1,
104  const std::string & b2Name,
105  const sva::PTransformd & tB2,
106  const std::string & jointName,
107  bool isB1toB2 = true);
108 
114  const std::shared_ptr<Node> nodeByName(const std::string & name) const;
115 
121  const std::shared_ptr<Joint> jointByName(const std::string & name) const;
122 
124  std::size_t nrNodes() const;
125 
127  std::size_t nrJoints() const;
128 
137  MultiBody makeMultiBody(const std::string & rootBodyName,
138  bool isFixed,
139  const sva::PTransformd & X_0_j0 = sva::PTransformd::Identity(),
140  const sva::PTransformd & X_b0_j0 = sva::PTransformd::Identity()) const;
141 
150  MultiBody makeMultiBody(const std::string & rootBodyName,
151  Joint::Type rootJointType,
152  const sva::PTransformd & X_0_j0 = sva::PTransformd::Identity(),
153  const sva::PTransformd & X_b0_j0 = sva::PTransformd::Identity()) const;
154 
164  MultiBody makeMultiBody(const std::string & rootBodyName,
165  Joint::Type rootJointType,
166  const Eigen::Vector3d & axis,
167  const sva::PTransformd & X_0_j0 = sva::PTransformd::Identity(),
168  const sva::PTransformd & X_b0_j0 = sva::PTransformd::Identity()) const;
169 
176  void removeJoint(const std::string & rootBodyName, const std::string & jointName);
177 
185  void removeJoints(const std::string & rootBodyName, const std::vector<std::string> & joints);
186 
194  void mergeSubBodies(const std::string & rootBodyName,
195  const std::string & jointName,
196  const std::map<std::string, std::vector<double>> & jointPosByName);
197 
206  std::map<std::string, sva::PTransformd> bodiesBaseTransform(
207  const std::string & rootBodyName,
208  const sva::PTransformd & X_b0_j0 = sva::PTransformd::Identity());
209 
216  std::map<std::string, std::vector<std::string>> successorJoints(const std::string & rootBodyName);
217 
224  std::map<std::string, std::string> predecessorJoint(const std::string & rootBodyName);
225 
233  static MultiBodyGraph fixJoints(const MultiBodyGraph & other,
234  const std::vector<std::string> & jointsToFix,
235  bool fixAllJoints = false);
236 
237 private:
242  bool rmArc(Node & node, const std::string & parentJointName, const std::string & jointName);
243 
248  void rmArcFromMbg(const Arc & arc);
249 
254  void rmNodeFromMbg(const std::string & jointNameFrom, const std::shared_ptr<Node> & node);
255 
261  bool findMergeSubNodes(Node & node,
262  const std::string & parentJointName,
263  const std::string & jointName,
264  const std::map<std::string, std::vector<double>> & jointPosByName);
265 
270  sva::RBInertiad mergeSubNodes(Node & node,
271  const std::string & parentJointName,
272  const std::map<std::string, std::vector<double>> & jointPosByName);
273 
278  sva::RBInertiad mergeInertia(const sva::RBInertiad & parentInertia,
279  const sva::RBInertiad & childInertia,
280  const Joint & joint,
281  const sva::PTransformd & X_p_j,
282  const std::map<std::string, std::vector<double>> & jointPosByName);
283 
284  // copy mbg in this. this must be empty before calling this function.
285  void copy(const rbd::MultiBodyGraph & mbg);
286 
287 protected:
288  std::string rootJointName_;
289  std::vector<std::shared_ptr<Node>> nodes_;
290  std::vector<std::shared_ptr<Joint>> joints_;
291 
292  std::map<std::string, std::shared_ptr<Node>> bodyNameToNode_;
293  std::map<std::string, std::shared_ptr<Joint>> jointNameToJoint_;
294 };
295 
296 } // namespace rbd
rbd::MultiBodyGraph::jointNameToJoint_
std::map< std::string, std::shared_ptr< Joint > > jointNameToJoint_
Definition: MultiBodyGraph.h:293
rbd::MultiBodyGraph::Arc::Arc
Arc()
Definition: MultiBodyGraph.h:43
rbd::Joint::Type
Type
Joint type.
Definition: Joint.h:39
rbd::MultiBodyGraph::Arc::joint
Joint joint
Joint with right direction.
Definition: MultiBodyGraph.h:51
rbd::MultiBodyGraph::Node::body
Body body
Definition: MultiBodyGraph.h:63
rbd::MultiBodyGraph::Node::arcs
std::vector< Arc > arcs
Outgoing arc.
Definition: MultiBodyGraph.h:64
rbd::MultiBodyGraph::joints_
std::vector< std::shared_ptr< Joint > > joints_
Definition: MultiBodyGraph.h:290
rbd::MultiBody
Definition: MultiBody.h:29
rbd::MultiBodyGraph::rootJointName_
std::string rootJointName_
Definition: MultiBodyGraph.h:288
Joint.h
rbd::Joint
Definition: Joint.h:35
rbd::MultiBodyGraph::Arc
Definition: MultiBodyGraph.h:41
rbd::MultiBodyGraph::Arc::next
std::shared_ptr< Node > next
successor node.
Definition: MultiBodyGraph.h:52
rbd::MultiBodyGraph
Definition: MultiBodyGraph.h:32
rbd::MultiBodyGraph::Node::Node
Node(const Body &b)
Definition: MultiBodyGraph.h:61
rbd::MultiBodyGraph::bodyNameToNode_
std::map< std::string, std::shared_ptr< Node > > bodyNameToNode_
Definition: MultiBodyGraph.h:292
rbd
Definition: common.h:20
Body.h
rbd::MultiBodyGraph::Arc::Arc
Arc(sva::PTransformd X0, const Joint &j, bool forward, std::shared_ptr< Node > n)
Definition: MultiBodyGraph.h:45
rbd::MultiBodyGraph::Node
Definition: MultiBodyGraph.h:59
rbd::MultiBodyGraph::nodes_
std::vector< std::shared_ptr< Node > > nodes_
Definition: MultiBodyGraph.h:289
rbd::Body
Definition: Body.h:20
rbd::MultiBodyGraph::Arc::X
sva::PTransformd X
Position of the joint in body coordinate.
Definition: MultiBodyGraph.h:50