1 #define BIORBD_API_EXPORTS
2 #include "RigidBody/Segment.h"
5 #include "Utils/String.h"
6 #include "Utils/Error.h"
7 #include "Utils/Vector3d.h"
8 #include "Utils/RotoTrans.h"
9 #include "RigidBody/Joints.h"
10 #include "RigidBody/Mesh.h"
11 #include "RigidBody/SegmentCharacteristics.h"
12 #include "Utils/Range.h"
15 biorbd::utils::Node(),
16 m_idxPF (std::make_shared<int>(-1)),
17 m_cor(std::make_shared<RigidBodyDynamics::Math::SpatialTransform>()),
18 m_seqT(std::make_shared<biorbd::utils::String>()),
19 m_seqR(std::make_shared<biorbd::utils::String>()),
20 m_QRanges(std::make_shared<std::vector<biorbd::utils::Range>>()),
21 m_QDotRanges(std::make_shared<std::vector<biorbd::utils::Range>>()),
22 m_QDDotRanges(std::make_shared<std::vector<biorbd::utils::Range>>()),
23 m_nbDof(std::make_shared<unsigned int>(0)),
24 m_nbQdot(std::make_shared<unsigned int>(0)),
25 m_nbQddot(std::make_shared<unsigned int>(0)),
26 m_nbDofTrue(std::make_shared<unsigned int>(0)),
27 m_nbDofTrueOutside(std::make_shared<unsigned int>(0)),
28 m_nbDofTrans(std::make_shared<unsigned int>(0)),
29 m_nbDofRot(std::make_shared<unsigned int>(0)),
30 m_nbDofQuat(std::make_shared<unsigned int>(0)),
31 m_isQuaternion(std::make_shared<bool>(false)),
32 m_dof(std::make_shared<std::vector<RigidBodyDynamics::Joint>>()),
33 m_idxDof(std::make_shared<std::vector<unsigned int>>()),
34 m_sequenceTrans(std::make_shared<std::vector<unsigned int>>()),
35 m_sequenceRot(std::make_shared<std::vector<unsigned int>>()),
36 m_nameDof(std::make_shared<std::vector<biorbd::utils::String>>()),
37 m_dofPosition(std::make_shared<std::vector<unsigned int>>()),
50 const std::vector<biorbd::utils::Range>& QRanges,
51 const std::vector<biorbd::utils::Range>& QDotRanges,
52 const std::vector<biorbd::utils::Range>& QDDotRanges,
54 const RigidBodyDynamics::Math::SpatialTransform& cor,
57 biorbd::utils::Node(name, parentName),
58 m_idxPF (std::make_shared<int>(PF)),
59 m_cor(std::make_shared<RigidBodyDynamics::Math::SpatialTransform>(cor)),
60 m_seqT(std::make_shared<biorbd::utils::String>(seqT)),
61 m_seqR(std::make_shared<biorbd::utils::String>(seqR)),
62 m_QRanges(std::make_shared<std::vector<biorbd::utils::Range>>()),
63 m_QDotRanges(std::make_shared<std::vector<biorbd::utils::Range>>()),
64 m_QDDotRanges(std::make_shared<std::vector<biorbd::utils::Range>>()),
65 m_nbDof(std::make_shared<unsigned int>(0)),
66 m_nbQdot(std::make_shared<unsigned int>(0)),
67 m_nbQddot(std::make_shared<unsigned int>(0)),
68 m_nbDofTrue(std::make_shared<unsigned int>(0)),
69 m_nbDofTrueOutside(std::make_shared<unsigned int>(0)),
70 m_nbDofTrans(std::make_shared<unsigned int>(0)),
71 m_nbDofRot(std::make_shared<unsigned int>(0)),
72 m_nbDofQuat(std::make_shared<unsigned int>(0)),
73 m_isQuaternion(std::make_shared<bool>(false)),
74 m_dof(std::make_shared<std::vector<RigidBodyDynamics::Joint>>()),
75 m_idxDof(std::make_shared<std::vector<unsigned int>>()),
76 m_sequenceTrans(std::make_shared<std::vector<unsigned int>>()),
77 m_sequenceRot(std::make_shared<std::vector<unsigned int>>()),
78 m_nameDof(std::make_shared<std::vector<biorbd::utils::String>>()),
79 m_dofPosition(std::make_shared<std::vector<unsigned int>>()),
94 const std::vector<biorbd::utils::Range>& QRanges,
95 const std::vector<biorbd::utils::Range>& QDotRanges,
96 const std::vector<biorbd::utils::Range>& QDDotRanges,
98 const RigidBodyDynamics::Math::SpatialTransform& cor,
102 biorbd::utils::Node(name, parentName),
103 m_idxPF (std::make_shared<int>(PF)),
104 m_cor(std::make_shared<RigidBodyDynamics::Math::SpatialTransform>(cor)),
105 m_seqT(std::make_shared<biorbd::utils::String>()),
106 m_seqR(std::make_shared<biorbd::utils::String>(seqR)),
107 m_QRanges(std::make_shared<std::vector<biorbd::utils::Range>>()),
108 m_QDotRanges(std::make_shared<std::vector<biorbd::utils::Range>>()),
109 m_QDDotRanges(std::make_shared<std::vector<biorbd::utils::Range>>()),
110 m_nbDof(std::make_shared<unsigned int>(0)),
111 m_nbQdot(std::make_shared<unsigned int>(0)),
112 m_nbQddot(std::make_shared<unsigned int>(0)),
113 m_nbDofTrue(std::make_shared<unsigned int>(0)),
114 m_nbDofTrueOutside(std::make_shared<unsigned int>(0)),
115 m_nbDofTrans(std::make_shared<unsigned int>(0)),
116 m_nbDofRot(std::make_shared<unsigned int>(0)),
117 m_nbDofQuat(std::make_shared<unsigned int>(0)),
118 m_isQuaternion(std::make_shared<bool>(false)),
119 m_dof(std::make_shared<std::vector<RigidBodyDynamics::Joint>>()),
120 m_idxDof(std::make_shared<std::vector<unsigned int>>()),
121 m_sequenceTrans(std::make_shared<std::vector<unsigned int>>()),
122 m_sequenceRot(std::make_shared<std::vector<unsigned int>>()),
123 m_nameDof(std::make_shared<std::vector<biorbd::utils::String>>()),
124 m_dofPosition(std::make_shared<std::vector<unsigned int>>()),
146 *m_cor = *other.
m_cor;
161 m_dof->resize(other.
m_dof->size());
162 for (
unsigned int i=0; i<other.
m_dof->size(); ++i)
163 (*m_dof)[i] = (*other.
m_dof)[i];
167 m_nameDof->resize(other.
m_nameDof->size());
168 for (
unsigned int i=0; i<other.
m_nameDof->size(); ++i)
182 return *m_isQuaternion;
187 *m_typeOfNode = biorbd::utils::NODE_TYPE::SEGMENT;
192 return (*m_idxDof)[*m_nbDof-1];
194 return (*m_idxDof)[*m_nbDof];
204 return *m_nbDofTrueOutside;
207 return *m_nbDofTrans;
230 return (*m_nameDof)[i];
243 const std::vector<biorbd::utils::Range>&
249 const std::vector<biorbd::utils::Range>&
252 return *m_QDotRanges;
255 const std::vector<biorbd::utils::Range>&
258 return *m_QDDotRanges;
265 return *m_characteristics;
272 const std::vector<biorbd::utils::Range>& QRanges,
273 const std::vector<biorbd::utils::Range>& QDotRanges,
274 const std::vector<biorbd::utils::Range>& QDDotRanges)
276 determineIfRotIsQuaternion(seqR);
277 setSequence(seqT, seqR);
280 size_t nRot(seqR.length());
281 if (*m_isQuaternion){
285 QRanges.size() == 0 ||
286 QRanges.size() == seqT.length() + nRot,
287 "QRanges and number of dof must be equal");
288 *m_QRanges = QRanges;
291 QDotRanges.size() == 0 ||
292 QDotRanges.size() == seqT.length() + nRot,
293 "QDotRanges and number of dof must be equal");
294 *m_QDotRanges = QDotRanges;
297 QDDotRanges.size() == 0 ||
298 QDDotRanges.size() == seqT.length() + nRot,
299 "QDDotRanges and number of dof must be equal");
300 *m_QDDotRanges = QDDotRanges;
305 if (!seqR.
tolower().compare(
"q"))
306 *m_isQuaternion =
true;
314 m_sequenceTrans->clear();
315 m_sequenceTrans->resize(*m_nbDofTrans);
316 m_sequenceRot->clear();
318 m_sequenceRot->resize(1);
320 m_sequenceRot->resize(*m_nbDofRot);
322 str2numSequence(*m_sequenceTrans, seqT);
323 str2numSequence(*m_sequenceRot, seqR);
327 m_nameDof->resize(*m_nbDofTrue);
328 for (
unsigned int i=0; i<*m_nbDofTrans; ++i)
329 (*m_nameDof)[i] =
"Trans" + seqT(i).
toupper();
330 for (
unsigned int i=0; i<*m_nbDofRot; ++i)
331 (*m_nameDof)[*m_nbDofTrans+i] =
"Rot" + seqR(i).
toupper();
333 for (
unsigned int i=0; i<*m_nbDofQuat; ++i)
338 std::vector<unsigned int>& sequenceInteger,
340 for (
unsigned int i=0; i<sequenceText.length(); i++){
341 char tp = sequenceText.
tolower()[i];
343 sequenceInteger[i] = 0;
345 sequenceInteger[i] = 1;
347 sequenceInteger[i] = 2;
349 sequenceInteger[i] = 3;
356 *m_nbDofTrans = nTrans;
357 if (*m_isQuaternion){
360 *m_nbDof = nTrans + 1;
361 *m_nbQdot = nTrans + 3;
362 *m_nbQddot = nTrans + 3;
363 *m_nbDofTrue = nTrans + *m_nbDofQuat;
364 *m_nbDofTrueOutside = nTrans + 3;
369 *m_nbDof = nTrans + *m_nbDofRot;
370 *m_nbQdot = *m_nbDof;
371 *m_nbQddot = *m_nbDof;
372 *m_nbDofTrue = *m_nbDof;
373 *m_nbDofTrueOutside = *m_nbDof;
378 setNumberOfDof(
static_cast<unsigned int>(seqT.length()),
static_cast<unsigned int>(seqR.length()));
379 str2numSequence(seqT, seqR);
383 m_dofPosition->clear();
384 m_dofPosition->resize(*m_nbDof);
386 for (
unsigned int i=0; i<*m_nbDofTrans; i++)
387 (*m_dofPosition)[i] = (*m_sequenceTrans)[i];
389 (*m_dofPosition)[*m_nbDofTrans] = (*m_sequenceRot)[0];
391 for (
unsigned int i=0; i<*m_nbDofRot; i++)
392 (*m_dofPosition)[i+*m_nbDofTrans] = (*m_sequenceRot)[i];
396 m_dofCharacteristics->clear();
399 m_dofCharacteristics->resize(*m_nbDof);
400 for (
unsigned int i=0; i<*m_nbDof-1; i++)
403 (*m_dofCharacteristics)[*m_nbDof-1] = *m_characteristics;
406 m_dofCharacteristics->resize(1);
407 (*m_dofCharacteristics)[0] = *m_characteristics;
421 m_dof->resize(*m_nbDof);
422 for (
unsigned int i=0; i<*m_nbDofTrans; i++)
423 (*m_dof)[i] = RigidBodyDynamics::Joint(
424 RigidBodyDynamics::JointTypePrismatic,
425 axis[(*m_dofPosition)[i]]);
429 (*m_dof)[*m_nbDofTrans] = RigidBodyDynamics::Joint(
430 RigidBodyDynamics::JointTypeSpherical);
432 for (
unsigned int i=*m_nbDofTrans; i<*m_nbDofRot+*m_nbDofTrans; i++)
433 (*m_dof)[i] = RigidBodyDynamics::Joint(
434 RigidBodyDynamics::JointTypeRevolute,
435 axis[(*m_dofPosition)[i]]);
439 (*m_dof)[0] = RigidBodyDynamics::Joint
440 (RigidBodyDynamics::JointTypeFixed);
446 setDofCharacteristicsOnLastBody();
450 RigidBodyDynamics::Math::SpatialTransform zero (
451 RigidBodyDynamics::Math::Matrix3dIdentity,
452 RigidBodyDynamics::Math::Vector3d(0,0,0));
459 m_idxDof->resize(*m_nbDof);
461 unsigned int parent_id(model.GetBodyId(parent().c_str()));
462 if (parent_id == std::numeric_limits<unsigned int>::max())
465 (*m_idxDof)[0] = model.AddBody(
466 parent_id, *m_cor, (*m_dof)[0],
467 (*m_dofCharacteristics)[0], name());
468 else if (*m_nbDof == 1)
469 (*m_idxDof)[0] = model.AddBody(
470 parent_id, *m_cor, (*m_dof)[0],
471 (*m_dofCharacteristics)[0], name());
473 (*m_idxDof)[0] = model.AddBody(
474 parent_id, *m_cor, (*m_dof)[0],
475 (*m_dofCharacteristics)[0]);
476 for (
unsigned int i=1; i<*m_nbDof; i++)
478 (*m_idxDof)[i] = model.AddBody(
479 (*m_idxDof)[i-1], zero,
480 (*m_dof)[i], (*m_dofCharacteristics)[i]);
482 (*m_idxDof)[i] = model.AddBody(
483 (*m_idxDof)[i-1], zero, (*m_dof)[i],
484 (*m_dofCharacteristics)[i], name());
492 unsigned int idx(INT_MAX);
494 for (
unsigned int i=0; i<nbDof(); ++i){
495 if (!dofName.
tolower().compare((*m_nameDof)[i].tolower())){
504 "Type should be \"Rot\" or \"Trans\" and axis "
505 "should be \"X\", \"Y\" or \"Z\", e.g. "
506 "\"RotY\" for Rotation around y or \"TransX\" "
507 "for Translation on x");