1 #define BIORBD_API_EXPORTS
2 #include "Muscles/Muscles.h"
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"
16 m_mus(std::make_shared<std::vector<biorbd::muscles::
MuscleGroup>>())
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];
52 if (m_mus->size() > 0)
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);
65 const std::vector<std::shared_ptr<biorbd::muscles::Muscle>>
68 std::vector<std::shared_ptr<biorbd::muscles::Muscle>> m;
69 for (
auto group : muscleGroups()){
70 for (
auto muscle : group.muscles()){
78 unsigned int idx)
const
80 for (
auto g : muscleGroups()){
81 if (idx >= g.nbMuscles()){
92 std::vector<biorbd::utils::String> names;
93 for (
auto group : muscleGroups()){
94 for (
auto muscle : group.muscles()){
95 names.push_back(muscle->name());
114 return (*m_mus)[idx];
119 return (*m_mus)[idx];
122 int idx = getGroupId(name);
124 return muscleGroup(
static_cast<unsigned int>(idx));
146 updateMuscles(Q, QDot,
true);
148 return muscularJointTorque(F);
153 const std::vector<std::shared_ptr<biorbd::muscles::State>>& emg)
155 return muscularJointTorque(muscleForces(emg));
160 const std::vector<std::shared_ptr<biorbd::muscles::State>>& emg,
164 return muscularJointTorque(muscleForces(emg, Q, QDot));
168 const std::vector<std::shared_ptr<biorbd::muscles::State>>& emg,
169 bool areadyNormalized)
174 for (
unsigned int i=0; i<nbMuscleGroups(); ++i)
175 for (
unsigned int j=0; j<muscleGroup(i).nbMuscles(); ++j){
178 muscleGroup(i).muscle(j).activationDot(*emg[cmp], areadyNormalized);
182 return activationDot;
186 const std::vector<std::shared_ptr<biorbd::muscles::State>>& emg)
191 unsigned int cmpMus(0);
192 for (
unsigned int i=0; i<m_mus->size(); ++i){
193 for (
unsigned int j=0; j<(*m_mus)[i].nbMuscles(); ++j){
194 forces(cmpMus, 0) = ((*m_mus)[i].muscle(j).force(*emg[cmpMus]));
204 const std::vector<std::shared_ptr<biorbd::muscles::State>> &emg,
209 updateMuscles(Q, QDot,
true);
211 return muscleForces(emg);
215 return static_cast<unsigned int>(m_mus->size());
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();
237 updateMuscles(Q,
true);
238 return musclesLengthJacobian();
248 unsigned int total(0);
249 for (
unsigned int grp=0; grp<m_mus->size(); ++grp)
250 total += (*m_mus)[grp].nbMuscles();
271 for (
auto group : *m_mus)
272 for (
unsigned int j=0; j<group.nbMuscles(); ++j){
273 group.muscle(j).updateOrientations(model, Q, QDot, updateKinTP);
294 for (
auto group : *m_mus)
295 for (
unsigned int j=0; j<group.nbMuscles(); ++j){
296 group.muscle(j).updateOrientations(model, Q,updateKinTP);
301 std::vector<std::vector<biorbd::utils::Vector3d>>& musclePointsInGlobal,
302 std::vector<biorbd::utils::Matrix> &jacoPointsInGlobal,
305 unsigned int cmpMuscle = 0;
306 for (
auto group : *m_mus)
307 for (
unsigned int j=0; j<group.nbMuscles(); ++j){
308 group.muscle(j).updateOrientations(musclePointsInGlobal[cmpMuscle], jacoPointsInGlobal[cmpMuscle], QDot);
313 std::vector<std::vector<biorbd::utils::Vector3d>>& musclePointsInGlobal,
314 std::vector<biorbd::utils::Matrix> &jacoPointsInGlobal)
317 unsigned int cmpMuscle = 0;
318 for (
auto group : *m_mus)
319 for (
unsigned int j=0; j<group.nbMuscles(); ++j){
320 group.muscle(j).updateOrientations(musclePointsInGlobal[cmpMuscle], jacoPointsInGlobal[cmpMuscle]);