1 #ifndef SimTK_SIMMATH_MULTIBODY_GRAPH_MAKER_H_
2 #define SimTK_SIMMATH_MULTIBODY_GRAPH_MAKER_H_
164 int addJointType(
const std::string& name,
166 bool haveGoodLoopJointAvailable =
false,
191 void addBody(
const std::string& name,
204 bool deleteBody(
const std::string& name);
238 void addJoint(
const std::string& name,
239 const std::string& type,
240 const std::string& parentBodyName,
241 const std::string& childBodyName,
242 bool mustBeLoopJoint,
253 bool deleteJoint(
const std::string& name);
257 void generateGraph();
261 void dumpGraph(std::ostream& out)
const;
273 {
return mobilizers[mobilizerNum]; }
286 {
return constraints[loopConstraintNum]; }
299 std::map<std::string,int>::const_iterator p =
300 bodyName2Num.find(bodyName);
301 return p==bodyName2Num.end() ? -1 : p->second;
316 std::map<std::string,int>::const_iterator p =
317 jointName2Num.find(jointName);
318 return p==jointName2Num.end() ? -1 : p->second;
325 {
return jointTypes[jointTypeNum]; }
328 std::map<std::string,int>::const_iterator p =
329 jointTypeName2Num.find(jointTypeName);
330 return p==jointTypeName2Num.end() ? -1 : p->second;
337 { weldTypeName=name; initialize(); }
346 { freeTypeName=name; initialize(); }
353 const std::string& getGroundBodyName()
const;
356 Body& updBody(
int bodyNum) {
return bodies[bodyNum];}
357 Joint& updJoint(
int jointNum) {
return joints[jointNum];}
358 Joint& updJoint(
const std::string& name) {
return joints[jointName2Num[name]];}
361 int splitBody(
int bodyNum);
362 int chooseNewBaseBody()
const;
363 void connectBodyToGround(
int bodyNum);
364 int addMobilizerForJoint(
int jointNum);
365 int findHeaviestUnassignedForwardJoint(
int inboardBody)
const;
366 int findHeaviestUnassignedReverseJoint(
int inboardBody)
const;
369 bool bodiesAreConnected(
int b1,
int b2)
const;
373 bodies.clear(); joints.clear(); jointTypes.clear();
374 bodyName2Num.clear(); jointName2Num.clear(); jointTypeName2Num.clear();
375 mobilizers.clear(); constraints.clear();
378 std::string weldTypeName, freeTypeName;
379 std::vector<Body> bodies;
380 std::vector<Joint> joints;
381 std::vector<JointType> jointTypes;
382 std::map<std::string,int> bodyName2Num;
383 std::map<std::string,int> jointName2Num;
384 std::map<std::string,int> jointTypeName2Num;
387 std::vector<Mobilizer> mobilizers;
388 std::vector<LoopConstraint> constraints;
397 explicit Body(
const std::string& name,
401 : name(name), mass(mass), mustBeBaseBody(mustBeBaseBody),
440 bool mustBeLoopJoint,
void*
userRef)
441 : name(name), jointTypeNum(jointTypeNum),
442 parentBodyNum(parentBodyNum), childBodyNum(childBodyNum),
443 mustBeLoopJoint(mustBeLoopJoint), userRef(userRef),
479 : name(name), numMobilities(numMobilities),
480 haveGoodLoopJointAvailable(haveGoodLoopJointAvailable),
497 : joint(-1), level(-1), inboardBody(-1), outboardBody(-1),
498 isReversed(false), mgm(0) {}
499 Mobilizer(
int jointNum,
int level,
int inboardBodyNum,
int outboardBodyNum,
501 : joint(jointNum), level(level), inboardBody(inboardBodyNum),
502 outboardBody(outboardBodyNum), isReversed(isReversed),
564 int getOutboardMasterBodyNum()
const
587 int parentBodyNum,
int childBodyNum,
589 : type(type), joint(jointNum),
590 parentBody(parentBodyNum), childBody(childBodyNum),
624 #endif // SimTK_SIMMATH_MULTIBODY_GRAPH_MAKER_H_
bool hasMobilizer() const
Definition: MultibodyGraphMaker.h:452
std::string name
Definition: MultibodyGraphMaker.h:482
bool isSlave() const
Definition: MultibodyGraphMaker.h:409
bool mustBeBaseBody
Definition: MultibodyGraphMaker.h:416
const std::string & getJointTypeName() const
Get the loop constraint type name of the constraint that should be used here.
Definition: MultibodyGraphMaker.h:599
LoopConstraint(const std::string &type, int jointNum, int parentBodyNum, int childBodyNum, MultibodyGraphMaker *graphMaker)
Definition: MultibodyGraphMaker.h:586
int getJointNum(const std::string &jointName) const
Return the joint number assigned to the input joint with the given name.
Definition: MultibodyGraphMaker.h:315
void * userRef
Definition: MultibodyGraphMaker.h:458
Local class that collects information about joints.
Definition: MultibodyGraphMaker.h:436
int getNumFragments() const
Definition: MultibodyGraphMaker.h:405
int jointTypeNum
Definition: MultibodyGraphMaker.h:462
The Body class represents a reference frame that can be used to describe mass properties and geometry...
Definition: Body.h:55
void * userRef
Definition: MultibodyGraphMaker.h:417
std::vector< int > slaves
Definition: MultibodyGraphMaker.h:429
int mobilizer
Definition: MultibodyGraphMaker.h:467
const Mobilizer & getMobilizer(int mobilizerNum) const
Get a Mobilizer object by its mobilizer number, ordered outwards by topological distance from Ground...
Definition: MultibodyGraphMaker.h:272
void setFreeJointTypeName(const std::string &name)
Change the name to be used to identify the free (6 dof) joint type and free (0 constraints) loop cons...
Definition: MultibodyGraphMaker.h:345
bool mustBeLoopJoint
Definition: MultibodyGraphMaker.h:457
int getJointTypeNum(const std::string &jointTypeName) const
Get the assigned number for a joint type from the type name.
Definition: MultibodyGraphMaker.h:327
Mobilizer()
Definition: MultibodyGraphMaker.h:496
int getBodyNum(const std::string &bodyName) const
Return the body number assigned to the input body with the given name.
Definition: MultibodyGraphMaker.h:298
const LoopConstraint & getLoopConstraint(int loopConstraintNum) const
Get a loop constraint by its assigned number.
Definition: MultibodyGraphMaker.h:285
int getNumJoints() const
Return the number of joints, including all input joints, and all joints added to connect otherwise di...
Definition: MultibodyGraphMaker.h:308
void * getOutboardMasterBodyRef() const
Get the user reference pointer for the outboard body of this mobilizer, if it is one of the input bod...
Definition: MultibodyGraphMaker.h:535
int childBodyNum
Definition: MultibodyGraphMaker.h:461
const std::string & getJointTypeName() const
Get the joint type name of the joint that this mobilizer represents.
Definition: MultibodyGraphMaker.h:538
int numMobilities
Definition: MultibodyGraphMaker.h:483
Joint(const std::string &name, int jointTypeNum, int parentBodyNum, int childBodyNum, bool mustBeLoopJoint, void *userRef)
Definition: MultibodyGraphMaker.h:438
Local class that defines the properties of a known joint type.
Definition: MultibodyGraphMaker.h:475
bool isSlaveMobilizer() const
Return true if the outboard body of this mobilizer is a slave we created in order to cut a loop...
Definition: MultibodyGraphMaker.h:546
int getNumMobilizers() const
Returns the number of mobilizers (tree joints) in the spanning tree.
Definition: MultibodyGraphMaker.h:269
int getNumJoints() const
Definition: MultibodyGraphMaker.h:407
bool isAddedBaseJoint
Definition: MultibodyGraphMaker.h:464
int getNumSlaves() const
Definition: MultibodyGraphMaker.h:406
int level
Definition: MultibodyGraphMaker.h:425
bool isAddedBaseMobilizer() const
Return true if this mobilizer does not represent one of the input joints, but is instead a joint we a...
Definition: MultibodyGraphMaker.h:511
Body(const std::string &name, double mass, bool mustBeBaseBody, void *userRef)
Definition: MultibodyGraphMaker.h:397
Local class that represents one of the mobilizers (tree joints) in the generated spanning tree...
Definition: MultibodyGraphMaker.h:494
Includes internal headers providing declarations for the basic SimTK Core classes, including Simmatrix.
int mobilizer
Definition: MultibodyGraphMaker.h:426
void * getJointTypeRef() const
Get the reference pointer (if any) that was provided when this mobilizer's joint type was defined in ...
Definition: MultibodyGraphMaker.h:542
int parentBodyNum
Definition: MultibodyGraphMaker.h:461
int getNumFragments() const
Return the number of fragments into which we chopped the outboard body of this mobilizer.
Definition: MultibodyGraphMaker.h:553
void * getJointRef() const
Get the user reference pointer for the joint associated with this mobilizer, if there is such a joint...
Definition: MultibodyGraphMaker.h:516
std::vector< int > jointsAsParent
Definition: MultibodyGraphMaker.h:421
Mobilizer(int jointNum, int level, int inboardBodyNum, int outboardBodyNum, bool isReversed, MultibodyGraphMaker *graphMaker)
Definition: MultibodyGraphMaker.h:499
LoopConstraint()
Definition: MultibodyGraphMaker.h:585
void * getJointRef() const
Get the user reference pointer for the joint associated with this loop constraint.
Definition: MultibodyGraphMaker.h:595
int master
Definition: MultibodyGraphMaker.h:428
std::string name
Definition: MultibodyGraphMaker.h:414
bool isInTree() const
Definition: MultibodyGraphMaker.h:411
bool isMaster() const
Definition: MultibodyGraphMaker.h:410
int getNumJointTypes() const
Return the number of registered joint types.
Definition: MultibodyGraphMaker.h:322
double mass
Definition: MultibodyGraphMaker.h:415
void * getParentBodyRef() const
Get the user reference pointer for the parent body defined by the joint associated with this loop con...
Definition: MultibodyGraphMaker.h:603
const JointType & getJointType(int jointTypeNum) const
Get a JointType object by its assigned number.
Definition: MultibodyGraphMaker.h:324
JointType(const std::string &name, int numMobilities, bool haveGoodLoopJointAvailable, void *userRef)
Definition: MultibodyGraphMaker.h:477
void * userRef
Definition: MultibodyGraphMaker.h:485
int loopConstraint
Definition: MultibodyGraphMaker.h:468
Local class that collects information about bodies.
Definition: MultibodyGraphMaker.h:395
This is the header file that every Simmath compilation unit should include first. ...
void forgetGraph(MultibodyGraphMaker &graph)
int getNumLoopConstraints() const
Return the number of loop joint constraints that were used to close loops in the graph topology...
Definition: MultibodyGraphMaker.h:282
bool forgetGraph(MultibodyGraphMaker &graph)
Return true if the joint is deleted as a result of restoring it to the state prior to generateGraph()...
bool haveGoodLoopJointAvailable
Definition: MultibodyGraphMaker.h:484
const std::string & getFreeJointTypeName() const
Return the name currently being used to identify the free joint type and free loop constraint type...
Definition: MultibodyGraphMaker.h:349
void setWeldJointTypeName(const std::string &name)
Change the name to be used to identify the weld joint type (0 dof) and weld loop constraint type (6 c...
Definition: MultibodyGraphMaker.h:336
void * getInboardBodyRef() const
Get the user reference pointer for the inboard body of this mobilizer.
Definition: MultibodyGraphMaker.h:522
void * getChildBodyRef() const
Get the user reference pointer for the child body defined by the joint associated with this loop cons...
Definition: MultibodyGraphMaker.h:607
const std::string & getWeldJointTypeName() const
Return the name currently being used to identify the weld joint type and weld loop constraint type...
Definition: MultibodyGraphMaker.h:340
Local class that represents one of the constraints that were added to close topological loops that we...
Definition: MultibodyGraphMaker.h:583
std::string name
Definition: MultibodyGraphMaker.h:456
void * getOutboardBodyRef() const
Get the user reference pointer for the outboard body of this mobilizer.
Definition: MultibodyGraphMaker.h:529
std::vector< int > jointsAsChild
Definition: MultibodyGraphMaker.h:420
const Body & getBody(int bodyNum) const
Get a Body object by its assigned number.
Definition: MultibodyGraphMaker.h:294
int getNumBodies() const
Return the number of bodies, including all input bodies, a ground body, and any slave bodies...
Definition: MultibodyGraphMaker.h:290
bool hasLoopConstraint() const
Definition: MultibodyGraphMaker.h:453
#define SimTK_SIMMATH_EXPORT
Definition: SimTKmath/include/simmath/internal/common.h:64
bool isReversedFromJoint() const
Return true if this mobilizer represents one of the input joints but the sense of inboard->outboard i...
Definition: MultibodyGraphMaker.h:559
const Joint & getJoint(int jointNum) const
Get a Joint object by its assigned number.
Definition: MultibodyGraphMaker.h:311
Construct a reasonably good spanning-tree-plus-constraints structure for modeling a given set of bodi...
Definition: MultibodyGraphMaker.h:146