Biorbd
MuscleGroup.cpp
1 #define BIORBD_API_EXPORTS
2 #include "Muscles/MuscleGroup.h"
3 
4 #include "Utils/Error.h"
5 #include "Muscles/IdealizedActuator.h"
6 #include "Muscles/HillType.h"
7 #include "Muscles/HillThelenType.h"
8 #include "Muscles/HillThelenTypeFatigable.h"
9 #include "Muscles/StateDynamicsBuchanan.h"
10 #include "Muscles/StateDynamicsDeGroote.h"
11 
13  m_mus(std::make_shared<std::vector<std::shared_ptr<biorbd::muscles::Muscle>>>()),
14  m_name(std::make_shared<biorbd::utils::String>()),
15  m_originName(std::make_shared<biorbd::utils::String>()),
16  m_insertName(std::make_shared<biorbd::utils::String>())
17 {
18 
19 }
20 
22  m_mus(other.m_mus),
23  m_name(other.m_name),
24  m_originName(other.m_originName),
25  m_insertName(other.m_insertName)
26 {
27 
28 }
29 
31  const biorbd::utils::String &name,
32  const biorbd::utils::String &originName,
33  const biorbd::utils::String &insertionName) :
34  m_mus(std::make_shared<std::vector<std::shared_ptr<biorbd::muscles::Muscle>>>()),
35  m_name(std::make_shared<biorbd::utils::String>(name)),
36  m_originName(std::make_shared<biorbd::utils::String>(originName)),
37  m_insertName(std::make_shared<biorbd::utils::String>(insertionName))
38 {
39 }
40 
42 {
43 
44 }
45 
47 {
49  copy.DeepCopy(*this);
50  return copy;
51 }
52 
54 {
55  m_mus->resize(other.m_mus->size());
56  for (unsigned int i=0; i<other.m_mus->size(); ++i){
57  if ((*other.m_mus)[i]->type() == biorbd::muscles::MUSCLE_TYPE::IDEALIZED_ACTUATOR)
58  (*m_mus)[i] = std::make_shared<biorbd::muscles::IdealizedActuator>((*other.m_mus)[i]);
59  else if ((*other.m_mus)[i]->type() == biorbd::muscles::MUSCLE_TYPE::HILL)
60  (*m_mus)[i] = std::make_shared<biorbd::muscles::HillType>((*other.m_mus)[i]);
61  else if ((*other.m_mus)[i]->type() == biorbd::muscles::MUSCLE_TYPE::HILL_THELEN)
62  (*m_mus)[i] = std::make_shared<biorbd::muscles::HillThelenType>((*other.m_mus)[i]);
63  else if ((*other.m_mus)[i]->type() == biorbd::muscles::MUSCLE_TYPE::HILL_THELEN_FATIGABLE)
64  (*m_mus)[i] = std::make_shared<biorbd::muscles::HillThelenTypeFatigable>((*other.m_mus)[i]);
65  else
66  biorbd::utils::Error::raise("DeepCopy was not prepared to copy " + biorbd::utils::String(biorbd::muscles::MUSCLE_TYPE_toStr((*other.m_mus)[i]->type())) + " type");
67  }
68  *m_mus = *other.m_mus;
69  *m_name = *other.m_name;
70  *m_originName = *other.m_originName;
71  *m_insertName = *other.m_insertName;
72 }
73 
75  const biorbd::utils::String &name,
76  biorbd::muscles::MUSCLE_TYPE type,
77  const biorbd::muscles::Geometry &geometry,
78  const biorbd::muscles::Characteristics &characteristics,
79  biorbd::muscles::STATE_TYPE stateType,
80  biorbd::muscles::STATE_FATIGUE_TYPE dynamicFatigueType)
81 {
82  std::shared_ptr<biorbd::muscles::Muscle> muscle;
83  std::shared_ptr<biorbd::muscles::StateDynamics> state;
84 
85  // Cast the dynamic type
86  if (stateType == biorbd::muscles::STATE_TYPE::SIMPLE_STATE)
87  state = std::make_shared<biorbd::muscles::StateDynamics>();
88  else if (stateType == biorbd::muscles::STATE_TYPE::DYNAMIC)
89  state = std::make_shared<biorbd::muscles::StateDynamics>();
90  else if (stateType == biorbd::muscles::STATE_TYPE::BUCHANAN)
91  state = std::make_shared<biorbd::muscles::StateDynamicsBuchanan>();
92  else if (stateType == biorbd::muscles::STATE_TYPE::DE_GROOTE)
93  state = std::make_shared<biorbd::muscles::StateDynamicsDeGroote>();
94  else
95  state = std::make_shared<biorbd::muscles::StateDynamics>();
96 
97  if (type == biorbd::muscles::MUSCLE_TYPE::IDEALIZED_ACTUATOR)
98  muscle = std::make_shared<biorbd::muscles::IdealizedActuator>(name,geometry,characteristics, *state);
99  else if (type == biorbd::muscles::MUSCLE_TYPE::HILL)
100  muscle = std::make_shared<biorbd::muscles::HillType>(name,geometry,characteristics, *state);
101  else if (type == biorbd::muscles::MUSCLE_TYPE::HILL_THELEN)
102  muscle = std::make_shared<biorbd::muscles::HillThelenType>(name,geometry,characteristics, *state);
103  else if (type == biorbd::muscles::MUSCLE_TYPE::HILL_THELEN_FATIGABLE)
104  muscle = std::make_shared<biorbd::muscles::HillThelenTypeFatigable>(name,geometry,characteristics, *state, dynamicFatigueType);
105  else
106  biorbd::utils::Error::raise("Wrong muscle type");
107  addMuscle(*muscle);
108 }
109 
111  const biorbd::utils::String &name,
112  biorbd::muscles::MUSCLE_TYPE type,
113  const biorbd::muscles::Geometry &geometry,
114  const biorbd::muscles::Characteristics &characteristics,
115  biorbd::muscles::STATE_FATIGUE_TYPE dynamicFatigueType)
116 {
117  std::shared_ptr<biorbd::muscles::Muscle> muscle;
118  if (type == biorbd::muscles::MUSCLE_TYPE::IDEALIZED_ACTUATOR)
119  muscle = std::make_shared<biorbd::muscles::IdealizedActuator>(name,geometry,characteristics);
120  else if (type == biorbd::muscles::MUSCLE_TYPE::HILL)
121  muscle = std::make_shared<biorbd::muscles::HillType>(name,geometry,characteristics);
122  else if (type == biorbd::muscles::MUSCLE_TYPE::HILL_THELEN)
123  muscle = std::make_shared<biorbd::muscles::HillThelenType>(name,geometry,characteristics);
124  else if (type == biorbd::muscles::MUSCLE_TYPE::HILL_THELEN_FATIGABLE)
125  muscle = std::make_shared<biorbd::muscles::HillThelenTypeFatigable>(name,geometry,characteristics, dynamicFatigueType);
126  else
127  biorbd::utils::Error::raise("Wrong muscle type");
128  addMuscle(*muscle);
129 }
130 
132  const biorbd::utils::String& name,
133  biorbd::muscles::MUSCLE_TYPE type,
134  const biorbd::muscles::Geometry& geometry,
135  const biorbd::muscles::Characteristics& characteristics,
136  const biorbd::muscles::PathModifiers &pathModifiers,
137  biorbd::muscles::STATE_TYPE stateType,
138  biorbd::muscles::STATE_FATIGUE_TYPE dynamicFatigueType)
139 {
140  std::shared_ptr<biorbd::muscles::Muscle> muscle;
141  std::shared_ptr<biorbd::muscles::StateDynamics> state;
142 
143  // Cast the dynamic type
144  if (stateType == biorbd::muscles::STATE_TYPE::SIMPLE_STATE)
145  state = std::make_shared<biorbd::muscles::StateDynamics>();
146  else if (stateType == biorbd::muscles::STATE_TYPE::BUCHANAN)
147  state = std::make_shared<biorbd::muscles::StateDynamicsBuchanan>();
148  else if (stateType == biorbd::muscles::STATE_TYPE::DE_GROOTE)
149  state = std::make_shared<biorbd::muscles::StateDynamicsDeGroote>();
150  else {
151  state = std::make_shared<biorbd::muscles::StateDynamics>();
152  }
153 
154 
155  if (type == biorbd::muscles::MUSCLE_TYPE::IDEALIZED_ACTUATOR)
156  muscle = std::make_shared<biorbd::muscles::IdealizedActuator>
157  (name,geometry,characteristics,pathModifiers,*state);
158  else if (type == biorbd::muscles::MUSCLE_TYPE::HILL)
159  muscle = std::make_shared<biorbd::muscles::HillType>
160  (name,geometry,characteristics,pathModifiers,*state);
161  else if (type == biorbd::muscles::MUSCLE_TYPE::HILL_THELEN)
162  muscle = std::make_shared<biorbd::muscles::HillThelenType>
163  (name,geometry,characteristics,pathModifiers,*state);
164  else if (type == biorbd::muscles::MUSCLE_TYPE::HILL_THELEN_FATIGABLE)
165  muscle = std::make_shared<biorbd::muscles::HillThelenTypeFatigable>(
166  name,geometry,characteristics,pathModifiers,*state,dynamicFatigueType);
167  else
168  biorbd::utils::Error::raise("Wrong muscle type");
169  addMuscle(*muscle);
170 }
171 
173  const biorbd::utils::String &name,
174  biorbd::muscles::MUSCLE_TYPE type,
175  const biorbd::muscles::Geometry &geometry,
176  const biorbd::muscles::Characteristics &characteristics,
177  const biorbd::muscles::PathModifiers &pathModifiers,
178  biorbd::muscles::STATE_FATIGUE_TYPE dynamicFatigueType)
179 {
180  std::shared_ptr<biorbd::muscles::Muscle> muscle;
181 
182  if (type == biorbd::muscles::MUSCLE_TYPE::IDEALIZED_ACTUATOR)
183  muscle = std::make_shared<biorbd::muscles::IdealizedActuator>(name,geometry,characteristics,pathModifiers);
184  else if (type == biorbd::muscles::MUSCLE_TYPE::HILL)
185  muscle = std::make_shared<biorbd::muscles::HillType>(name,geometry,characteristics,pathModifiers);
186  else if (type == biorbd::muscles::MUSCLE_TYPE::HILL_THELEN)
187  muscle = std::make_shared<biorbd::muscles::HillThelenType>(name,geometry,characteristics,pathModifiers);
188  else if (type == biorbd::muscles::MUSCLE_TYPE::HILL_THELEN_FATIGABLE)
189  muscle = std::make_shared<biorbd::muscles::HillThelenTypeFatigable>(name,geometry,characteristics,pathModifiers,dynamicFatigueType);
190  else
191  biorbd::utils::Error::raise("Wrong muscle type");
192  addMuscle(*muscle);
193 }
194 
196  const biorbd::muscles::Muscle &muscle)
197 {
198  biorbd::utils::Error::check(muscleID(muscle.name()) == -1, "This muscle name was already defined for this muscle group");
199 
200  // Add muscle according to its type
201  if (muscle.type() == biorbd::muscles::MUSCLE_TYPE::IDEALIZED_ACTUATOR)
202  m_mus->push_back(std::make_shared<biorbd::muscles::IdealizedActuator>(muscle));
203  else if (muscle.type() == biorbd::muscles::MUSCLE_TYPE::HILL_THELEN_FATIGABLE)
204  m_mus->push_back(std::make_shared<biorbd::muscles::HillThelenTypeFatigable>(muscle));
205  else if (muscle.type() == biorbd::muscles::MUSCLE_TYPE::HILL_THELEN)
206  m_mus->push_back(std::make_shared<biorbd::muscles::HillThelenType>(muscle));
207  else if (muscle.type() == biorbd::muscles::MUSCLE_TYPE::HILL)
208  m_mus->push_back(std::make_shared<biorbd::muscles::HillType>(muscle));
209  else
210  biorbd::utils::Error::raise("Muscle type not found");
211  return;
212 }
213 
215 {
216  biorbd::utils::Error::check(idx<nbMuscles(), "Idx asked is higher than number of muscles");
217  return *(*m_mus)[idx];
218 }
220 {
221  biorbd::utils::Error::check(idx<nbMuscles(), "Idx asked is higher than number of muscles");
222  return *(*m_mus)[idx];
223 }
224 
225 
227  return static_cast<unsigned int>(m_mus->size());
228 }
229 
230 std::vector<std::shared_ptr<biorbd::muscles::Muscle>>& biorbd::muscles::MuscleGroup::muscles()
231 {
232  return *m_mus;
233 }
234 
235 const std::vector<std::shared_ptr<biorbd::muscles::Muscle>>& biorbd::muscles::MuscleGroup::muscles() const
236 {
237  return *m_mus;
238 }
239 
241  for (unsigned int i=0; i<m_mus->size(); ++i){
242  if (!nameToFind.compare( (*m_mus)[i]->name()) )
243  return static_cast<int>(i);
244  }
245  // If we get here, there is no muscle of that name in this group
246  return -1;
247 }
248 
250  *m_name = name;
251 }
253  return *m_name;
254 }
255 
257  *m_originName = name;
258 }
260  return *m_originName;
261 }
262 
264  *m_insertName = name;
265 }
267  return *m_insertName;
268 }
biorbd::muscles::Compound::type
biorbd::muscles::MUSCLE_TYPE type() const
Return the type of the muscle.
Definition: Compound.cpp:83
biorbd::muscles::MuscleGroup::origin
const biorbd::utils::String & origin() const
Return the origin segment name.
Definition: MuscleGroup.cpp:259
biorbd::muscles::MuscleGroup::muscleID
int muscleID(const biorbd::utils::String &name)
Return the muscle index.
Definition: MuscleGroup.cpp:240
biorbd::muscles::MuscleGroup::setInsertion
void setInsertion(const biorbd::utils::String &name)
Set the insertion segment name where the origin lies.
Definition: MuscleGroup.cpp:263
biorbd::muscles::MuscleGroup::m_mus
std::shared_ptr< std::vector< std::shared_ptr< biorbd::muscles::Muscle > > > m_mus
The set of muscles.
Definition: MuscleGroup.h:225
biorbd::muscles::MuscleGroup::muscles
std::vector< std::shared_ptr< biorbd::muscles::Muscle > > & muscles()
Return the muscles in the group.
Definition: MuscleGroup.cpp:230
biorbd::muscles::MuscleGroup
A muscle group is muscle that share parents for both origin and insertion.
Definition: MuscleGroup.h:23
biorbd::muscles::Geometry
Class Geometry of the muscle.
Definition: Geometry.h:30
biorbd::muscles::MuscleGroup::muscle
biorbd::muscles::Muscle & muscle(unsigned int idx)
Return the muscle of a specific index in the group.
Definition: MuscleGroup.cpp:214
biorbd::muscles::MuscleGroup::m_name
std::shared_ptr< biorbd::utils::String > m_name
The muscle group name.
Definition: MuscleGroup.h:226
biorbd::muscles::MuscleGroup::m_originName
std::shared_ptr< biorbd::utils::String > m_originName
The origin name.
Definition: MuscleGroup.h:227
biorbd::muscles::Compound::name
const biorbd::utils::String & name() const
Return the name of the muscle.
Definition: Compound.cpp:73
biorbd::utils::Error::raise
static void raise(const biorbd::utils::String &message)
Throw an error message.
Definition: Error.cpp:4
biorbd::muscles::MuscleGroup::nbMuscles
unsigned int nbMuscles() const
Return the number of muscles in the group.
Definition: MuscleGroup.cpp:226
biorbd::muscles::PathModifiers
Holder of all the path modifiers of a muscle.
Definition: PathModifiers.h:18
biorbd::muscles::MuscleGroup::setOrigin
void setOrigin(const biorbd::utils::String &name)
Set the origin segment name where the origin lies.
Definition: MuscleGroup.cpp:256
biorbd::muscles::MuscleGroup::DeepCopy
biorbd::muscles::MuscleGroup DeepCopy() const
Deep copy of a muscle group.
Definition: MuscleGroup.cpp:46
biorbd::muscles::MuscleGroup::m_insertName
std::shared_ptr< biorbd::utils::String > m_insertName
The insertion name.
Definition: MuscleGroup.h:228
biorbd::muscles::MuscleGroup::name
const biorbd::utils::String & name() const
Return the name of the muscle group.
Definition: MuscleGroup.cpp:252
biorbd::utils::String
Wrapper around the std::string class with augmented functionality.
Definition: String.h:17
biorbd::muscles::MuscleGroup::addMuscle
virtual void addMuscle(const biorbd::utils::String &name, biorbd::muscles::MUSCLE_TYPE type, const biorbd::muscles::Geometry &geometry, const biorbd::muscles::Characteristics &characteristics, biorbd::muscles::STATE_TYPE stateType=biorbd::muscles::STATE_TYPE::NO_STATE_TYPE, biorbd::muscles::STATE_FATIGUE_TYPE dynamicFatigueType=biorbd::muscles::STATE_FATIGUE_TYPE::NO_FATIGUE_STATE_TYPE)
To add a muscle to the group.
Definition: MuscleGroup.cpp:74
biorbd::muscles::MuscleGroup::MuscleGroup
MuscleGroup()
Construct a muscle group.
Definition: MuscleGroup.cpp:12
biorbd::muscles::MuscleGroup::insertion
const biorbd::utils::String & insertion() const
Return the insertion segment name.
Definition: MuscleGroup.cpp:266
biorbd::muscles::MuscleGroup::setName
void setName(const biorbd::utils::String &name)
Set the name of the muscle group.
Definition: MuscleGroup.cpp:249
biorbd::muscles::Characteristics
Class Holds that muscle characteristics.
Definition: Characteristics.h:17
biorbd::muscles::MuscleGroup::~MuscleGroup
virtual ~MuscleGroup()
Destroy class properly.
Definition: MuscleGroup.cpp:41
biorbd::muscles::Muscle
Base class of all muscle.
Definition: Muscle.h:23
biorbd::utils::Error::check
static void check(bool cond, const biorbd::utils::String &message)
Assert that raises the error message if false.
Definition: Error.cpp:10