Loading...
Searching...
No Matches
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
22namespace rbd
23{
24class MultiBody;
25
32class RBDYN_DLLAPI MultiBodyGraph
33{
34public:
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
67public:
68 MultiBodyGraph(const std::string rootName = "Root");
71
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
234 const std::vector<std::string> & jointsToFix,
235 bool fixAllJoints = false);
236
237private:
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
287protected:
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
Definition Body.h:21
Definition Joint.h:36
Type
Joint type.
Definition Joint.h:40
Definition MultiBodyGraph.h:33
MultiBodyGraph(const MultiBodyGraph &mbg)
std::map< std::string, std::string > predecessorJoint(const std::string &rootBodyName)
MultiBody makeMultiBody(const std::string &rootBodyName, Joint::Type rootJointType, const Eigen::Vector3d &axis, const sva::PTransformd &X_0_j0=sva::PTransformd::Identity(), const sva::PTransformd &X_b0_j0=sva::PTransformd::Identity()) const
void mergeSubBodies(const std::string &rootBodyName, const std::string &jointName, const std::map< std::string, std::vector< double > > &jointPosByName)
std::map< std::string, std::vector< std::string > > successorJoints(const std::string &rootBodyName)
void addBody(const Body &B)
std::vector< std::shared_ptr< Joint > > joints_
Definition MultiBodyGraph.h:290
std::string rootJointName_
Definition MultiBodyGraph.h:288
const std::shared_ptr< Joint > jointByName(const std::string &name) const
void removeJoint(const std::string &rootBodyName, const std::string &jointName)
void addJoint(const Joint &J)
std::size_t nrNodes() const
void linkBodies(const std::string &b1Name, const sva::PTransformd &tB1, const std::string &b2Name, const sva::PTransformd &tB2, const std::string &jointName, bool isB1toB2=true)
std::map< std::string, sva::PTransformd > bodiesBaseTransform(const std::string &rootBodyName, const sva::PTransformd &X_b0_j0=sva::PTransformd::Identity())
std::map< std::string, std::shared_ptr< Joint > > jointNameToJoint_
Definition MultiBodyGraph.h:293
std::size_t nrJoints() const
MultiBodyGraph(const std::string rootName="Root")
std::vector< std::shared_ptr< Node > > nodes_
Definition MultiBodyGraph.h:289
MultiBody makeMultiBody(const std::string &rootBodyName, bool isFixed, const sva::PTransformd &X_0_j0=sva::PTransformd::Identity(), const sva::PTransformd &X_b0_j0=sva::PTransformd::Identity()) const
MultiBodyGraph & operator=(const MultiBodyGraph &mbg)
std::map< std::string, std::shared_ptr< Node > > bodyNameToNode_
Definition MultiBodyGraph.h:292
static MultiBodyGraph fixJoints(const MultiBodyGraph &other, const std::vector< std::string > &jointsToFix, bool fixAllJoints=false)
void removeJoints(const std::string &rootBodyName, const std::vector< std::string > &joints)
MultiBody makeMultiBody(const std::string &rootBodyName, Joint::Type rootJointType, const sva::PTransformd &X_0_j0=sva::PTransformd::Identity(), const sva::PTransformd &X_b0_j0=sva::PTransformd::Identity()) const
const std::shared_ptr< Node > nodeByName(const std::string &name) const
Definition MultiBody.h:30
Definition common.h:21
Definition MultiBodyGraph.h:42
Arc()
Definition MultiBodyGraph.h:43
std::shared_ptr< Node > next
successor node.
Definition MultiBodyGraph.h:52
Arc(sva::PTransformd X0, const Joint &j, bool forward, std::shared_ptr< Node > n)
Definition MultiBodyGraph.h:45
sva::PTransformd X
Position of the joint in body coordinate.
Definition MultiBodyGraph.h:50
Joint joint
Joint with right direction.
Definition MultiBodyGraph.h:51
Definition MultiBodyGraph.h:60
std::vector< Arc > arcs
Outgoing arc.
Definition MultiBodyGraph.h:64
Node(const Body &b)
Definition MultiBodyGraph.h:61
Body body
Definition MultiBodyGraph.h:63