Biorbd
Muscles.cpp
1 #define BIORBD_API_EXPORTS
2 #include "Muscles/Muscles.h"
3 
4 #include "Utils/Error.h"
5 #include "Utils/Matrix.h"
6 #include "RigidBody/Joints.h"
7 #include "RigidBody/GeneralizedCoordinates.h"
8 #include "RigidBody/GeneralizedVelocity.h"
9 #include "RigidBody/GeneralizedTorque.h"
10 #include "Muscles/Muscle.h"
11 #include "Muscles/Geometry.h"
12 #include "Muscles/MuscleGroup.h"
13 #include "Muscles/StateDynamics.h"
14 
16  m_mus(std::make_shared<std::vector<biorbd::muscles::MuscleGroup>>())
17 {
18 
19 }
20 
22  m_mus(other.m_mus)
23 {
24 
25 }
26 
28 {
29 
30 }
31 
33 {
35  copy.DeepCopy(*this);
36  return copy;
37 }
38 
40 {
41  m_mus->resize(other.m_mus->size());
42  for (unsigned int i=0; i<other.m_mus->size(); ++i)
43  (*m_mus)[i] = (*other.m_mus)[i];
44 }
45 
46 
48  const biorbd::utils::String &name,
49  const biorbd::utils::String &originName,
50  const biorbd::utils::String &insertionName)
51 {
52  if (m_mus->size() > 0)
53  biorbd::utils::Error::check(getGroupId(name)==-1, "Muscle group already defined");
54 
55  m_mus->push_back(biorbd::muscles::MuscleGroup(name, originName, insertionName));
56 }
57 
59  for (unsigned int i=0; i<m_mus->size(); ++i)
60  if (!name.compare((*m_mus)[i].name()))
61  return static_cast<int>(i);
62  return -1;
63 }
64 
65 const std::vector<std::shared_ptr<biorbd::muscles::Muscle>>
67 {
68  std::vector<std::shared_ptr<biorbd::muscles::Muscle>> m;
69  for (auto group : muscleGroups()){
70  for (auto muscle : group.muscles()){
71  m.push_back(muscle);
72  }
73  }
74  return m;
75 }
76 
78  unsigned int idx) const
79 {
80  for (auto g : muscleGroups()){
81  if (idx >= g.nbMuscles()){
82  idx -= g.nbMuscles();
83  } else {
84  return g.muscle(idx);
85  }
86  }
87  biorbd::utils::Error::raise("idx is higher than the number of muscles");
88 }
89 
90 std::vector<biorbd::utils::String> biorbd::muscles::Muscles::muscleNames() const
91 {
92  std::vector<biorbd::utils::String> names;
93  for (auto group : muscleGroups()){
94  for (auto muscle : group.muscles()){
95  names.push_back(muscle->name());
96  }
97  }
98  return names;
99 }
100 
101 std::vector<biorbd::muscles::MuscleGroup>& biorbd::muscles::Muscles::muscleGroups()
102 {
103  return *m_mus;
104 }
105 
106 const std::vector<biorbd::muscles::MuscleGroup>& biorbd::muscles::Muscles::muscleGroups() const
107 {
108  return *m_mus;
109 }
110 
112 {
113  biorbd::utils::Error::check(idx<nbMuscleGroups(), "Idx asked is higher than number of muscle groups");
114  return (*m_mus)[idx];
115 }
116 
118  biorbd::utils::Error::check(idx<nbMuscleGroups(), "Idx asked is higher than number of muscle groups");
119  return (*m_mus)[idx];
120 }
122  int idx = getGroupId(name);
123  biorbd::utils::Error::check(idx!=-1, "Group name could not be found");
124  return muscleGroup(static_cast<unsigned int>(idx));
125 }
126 
127 // From muscle activation (return muscle force)
129  const biorbd::utils::Vector &F)
130 {
131  // Get the Jacobian matrix and get the forces of each muscle
132  const biorbd::utils::Matrix& jaco(musclesLengthJacobian());
133 
134  // Compute the reaction of the forces on the bodies
135  return biorbd::rigidbody::GeneralizedTorque( -jaco.transpose() * F );
136 }
137 
138 // From Muscular Force
140  const biorbd::utils::Vector &F,
143 {
144 
145  // Update the muscular position
146  updateMuscles(Q, QDot, true);
147 
148  return muscularJointTorque(F);
149 }
150 
151 // From muscle activation (return muscle force)
153  const std::vector<std::shared_ptr<biorbd::muscles::State>>& emg)
154 {
155  return muscularJointTorque(muscleForces(emg));
156 }
157 
158 // From muscle activation (do not return muscle force)
160  const std::vector<std::shared_ptr<biorbd::muscles::State>>& emg,
163 {
164  return muscularJointTorque(muscleForces(emg, Q, QDot));
165 }
166 
168  const std::vector<std::shared_ptr<biorbd::muscles::State>>& emg,
169  bool areadyNormalized)
170 {
171  biorbd::utils::Vector activationDot(nbMuscleTotal());
172 
173  unsigned int cmp(0);
174  for (unsigned int i=0; i<nbMuscleGroups(); ++i)
175  for (unsigned int j=0; j<muscleGroup(i).nbMuscles(); ++j){
176  // Recueillir dérivées d'activtion
177  activationDot(cmp) =
178  muscleGroup(i).muscle(j).activationDot(*emg[cmp], areadyNormalized);
179  ++cmp;
180  }
181 
182  return activationDot;
183 }
184 
186  const std::vector<std::shared_ptr<biorbd::muscles::State>>& emg)
187 {
188  // Output variable
189  biorbd::utils::Vector forces(nbMuscleTotal()); // All the muscles/two pointers per muscleTous les muscles (origine/insertion)
190 
191  unsigned int cmpMus(0);
192  for (unsigned int i=0; i<m_mus->size(); ++i){ // muscle group
193  for (unsigned int j=0; j<(*m_mus)[i].nbMuscles(); ++j){
194  forces(cmpMus, 0) = ((*m_mus)[i].muscle(j).force(*emg[cmpMus]));
195  ++cmpMus;
196  }
197  }
198 
199  // The forces
200  return forces;
201 }
202 
204  const std::vector<std::shared_ptr<biorbd::muscles::State>> &emg,
207 {
208  // Update the muscular position
209  updateMuscles(Q, QDot, true);
210 
211  return muscleForces(emg);
212 }
213 
215  return static_cast<unsigned int>(m_mus->size());
216 }
217 
219 {
220  // Assuming that this is also a Joints type (via BiorbdModel)
221  const biorbd::rigidbody::Joints &model = dynamic_cast<biorbd::rigidbody::Joints &>(*this);
222 
223  biorbd::utils::Matrix tp(nbMuscleTotal(), model.nbDof());
224  unsigned int cmpMus(0);
225  for (unsigned int i=0; i<nbMuscleGroups(); ++i)
226  for (unsigned int j=0; j<((*m_mus)[i]).nbMuscles(); ++j)
227  tp.block(cmpMus++,0,1,model.nbDof()) = ((*m_mus)[i]).muscle(j).position().jacobianLength();
228 
229  return tp;
230 
231 }
232 
235 {
236  // Update the muscular position
237  updateMuscles(Q, true);
238  return musclesLengthJacobian();
239 }
240 
241 
243  return nbMuscles();
244 }
245 
247 {
248  unsigned int total(0);
249  for (unsigned int grp=0; grp<m_mus->size(); ++grp) // muscular group
250  total += (*m_mus)[grp].nbMuscles();
251  return total;
252 }
253 
257  bool updateKin)
258 {
259  // Assuming that this is also a Joints type (via BiorbdModel)
260  biorbd::rigidbody::Joints &model = dynamic_cast<biorbd::rigidbody::Joints &>(*this);
261 
262  // Update all the muscles
263  int updateKinTP;
264  if (updateKin) {
265  updateKinTP = 2;
266  }
267  else {
268  updateKinTP = 0;
269  }
270 
271  for (auto group : *m_mus) // muscle group
272  for (unsigned int j=0; j<group.nbMuscles(); ++j){
273  group.muscle(j).updateOrientations(model, Q, QDot, updateKinTP);
274  updateKinTP=1;
275  }
276 }
279  bool updateKin)
280 {
281  // Assuming that this is also a Joints type (via BiorbdModel)
282  biorbd::rigidbody::Joints &model = dynamic_cast<biorbd::rigidbody::Joints &>(*this);
283 
284  // Update all the muscles
285  int updateKinTP;
286  if (updateKin) {
287  updateKinTP = 2;
288  }
289  else {
290  updateKinTP = 0;
291  }
292 
293  // Update all the muscles
294  for (auto group : *m_mus) // muscle group
295  for (unsigned int j=0; j<group.nbMuscles(); ++j){
296  group.muscle(j).updateOrientations(model, Q,updateKinTP);
297  updateKinTP=1;
298  }
299 }
301  std::vector<std::vector<biorbd::utils::Vector3d>>& musclePointsInGlobal,
302  std::vector<biorbd::utils::Matrix> &jacoPointsInGlobal,
304 {
305  unsigned int cmpMuscle = 0;
306  for (auto group : *m_mus) // muscle group
307  for (unsigned int j=0; j<group.nbMuscles(); ++j){
308  group.muscle(j).updateOrientations(musclePointsInGlobal[cmpMuscle], jacoPointsInGlobal[cmpMuscle], QDot);
309  ++cmpMuscle;
310  }
311 }
313  std::vector<std::vector<biorbd::utils::Vector3d>>& musclePointsInGlobal,
314  std::vector<biorbd::utils::Matrix> &jacoPointsInGlobal)
315 {
316  // Updater all the muscles
317  unsigned int cmpMuscle = 0;
318  for (auto group : *m_mus) // muscle group
319  for (unsigned int j=0; j<group.nbMuscles(); ++j){
320  group.muscle(j).updateOrientations(musclePointsInGlobal[cmpMuscle], jacoPointsInGlobal[cmpMuscle]);
321  ++cmpMuscle;
322  }
323 }
biorbd::muscles::Muscles::muscularJointTorque
biorbd::rigidbody::GeneralizedTorque muscularJointTorque(const biorbd::utils::Vector &F)
Compute the muscular joint torque.
Definition: Muscles.cpp:128
biorbd::muscles::Muscles::muscle
const biorbd::muscles::Muscle & muscle(unsigned int idx) const
Returns a specific muscle sorted by muscles()
Definition: Muscles.cpp:77
biorbd::muscles::Muscles::musclesLengthJacobian
biorbd::utils::Matrix musclesLengthJacobian()
Return the previously computed muscle length jacobian.
Definition: Muscles.cpp:218
biorbd::utils::Vector
Wrapper of the Eigen VectorXd.
Definition: Vector.h:20
biorbd::muscles::Muscles::muscleForces
biorbd::utils::Vector muscleForces(const std::vector< std::shared_ptr< biorbd::muscles::State >> &emg)
Compute and return the muscle forces.
Definition: Muscles.cpp:185
biorbd::muscles::Muscles::DeepCopy
biorbd::muscles::Muscles DeepCopy() const
Deep copy of muscles.
Definition: Muscles.cpp:32
biorbd::muscles::Muscles::m_mus
std::shared_ptr< std::vector< biorbd::muscles::MuscleGroup > > m_mus
Holder for muscle groups.
Definition: Muscles.h:313
biorbd::muscles::Muscles::activationDot
biorbd::utils::Vector activationDot(const std::vector< std::shared_ptr< biorbd::muscles::State >> &states, bool areadyNormalized=true)
Interface that returns in a vector all the activations dot.
Definition: Muscles.cpp:167
biorbd::muscles::Muscles
Muscle group holder.
Definition: Muscles.h:32
biorbd::rigidbody::GeneralizedCoordinates
Class GeneralizedCoordinates.
Definition: GeneralizedCoordinates.h:15
biorbd::rigidbody::Joints::nbDof
unsigned int nbDof() const
Return the number of degrees of freedom (DoF)
Definition: Joints.cpp:87
biorbd::muscles::Muscles::muscleGroup
biorbd::muscles::MuscleGroup & muscleGroup(unsigned int idx)
Return the muscle group of specific index.
Definition: Muscles.cpp:111
biorbd::muscles::MuscleGroup
A muscle group is muscle that share parents for both origin and insertion.
Definition: MuscleGroup.h:23
biorbd::muscles::Muscles::Muscles
Muscles()
Construct muscles.
Definition: Muscles.cpp:15
biorbd::muscles::Muscles::nbMuscleGroups
unsigned int nbMuscleGroups() const
Return the total number of muscle groups.
Definition: Muscles.cpp:214
biorbd::muscles::Muscles::muscleNames
std::vector< biorbd::utils::String > muscleNames() const
muscleNames Return the names for all the muscle ordered by their respective group name
Definition: Muscles.cpp:90
biorbd::utils::Error::raise
static void raise(const biorbd::utils::String &message)
Throw an error message.
Definition: Error.cpp:4
biorbd::rigidbody::Joints
This is the core of the musculoskeletal model in biorbd.
Definition: Joints.h:40
biorbd::muscles::Muscles::nbMuscles
unsigned int nbMuscles() const
Return the total number of muscle.
Definition: Muscles.cpp:246
biorbd::utils::Matrix
A wrapper for the Eigen::MatrixXd.
Definition: Matrix.h:21
biorbd::muscles::Muscles::~Muscles
virtual ~Muscles()
Destroy class properly.
Definition: Muscles.cpp:27
biorbd::muscles::Muscles::muscles
const std::vector< std::shared_ptr< biorbd::muscles::Muscle > > muscles() const
Returns all the muscles. It sorts the muscles by group.
Definition: Muscles.cpp:66
biorbd::rigidbody::GeneralizedTorque
Class GeneralizedTorque.
Definition: GeneralizedTorque.h:15
biorbd::muscles::Muscles::nbMuscleTotal
unsigned int nbMuscleTotal() const
Return the total number of muscle.
Definition: Muscles.cpp:242
biorbd::muscles::Muscles::getGroupId
int getGroupId(const biorbd::utils::String &name) const
Return the group ID.
Definition: Muscles.cpp:58
biorbd::utils::String
Wrapper around the std::string class with augmented functionality.
Definition: String.h:17
biorbd::muscles::Muscles::addMuscleGroup
void addMuscleGroup(const biorbd::utils::String &name, const biorbd::utils::String &originName, const biorbd::utils::String &insertionName)
Add a muscle group to the set.
Definition: Muscles.cpp:47
biorbd::muscles::Muscles::updateMuscles
void updateMuscles(const biorbd::rigidbody::GeneralizedCoordinates &Q, bool updateKin)
Update all the muscles (positions, jacobian, etc.)
Definition: Muscles.cpp:277
biorbd::muscles::Muscles::muscleGroups
std::vector< biorbd::muscles::MuscleGroup > & muscleGroups()
Return the muscle groups.
Definition: Muscles.cpp:101
biorbd::rigidbody::GeneralizedVelocity
Class GeneralizedVelocity.
Definition: GeneralizedVelocity.h:15
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