Biorbd
Muscle.cpp
1 #define BIORBD_API_EXPORTS
2 #include "Muscles/Muscle.h"
3 
4 #include "Utils/Error.h"
5 #include "RigidBody/Joints.h"
6 #include "RigidBody/GeneralizedCoordinates.h"
7 #include "RigidBody/GeneralizedVelocity.h"
8 #include "Muscles/PathModifiers.h"
9 #include "Muscles/StateDynamics.h"
10 #include "Muscles/StateDynamicsBuchanan.h"
11 #include "Muscles/StateDynamicsDeGroote.h"
12 #include "Muscles/Characteristics.h"
13 #include "Muscles/Geometry.h"
14 
16  biorbd::muscles::Compound(),
17  m_position(std::make_shared<biorbd::muscles::Geometry>()),
18  m_characteristics(std::make_shared<biorbd::muscles::Characteristics>()),
19  m_state(std::make_shared<biorbd::muscles::State>())
20 {
21 
22 }
23 
25  const biorbd::utils::String & name,
26  const biorbd::muscles::Geometry & position,
27  const biorbd::muscles::Characteristics &characteristics) :
28  biorbd::muscles::Compound (name),
29  m_position(std::make_shared<biorbd::muscles::Geometry>(position)),
30  m_characteristics(std::make_shared<biorbd::muscles::Characteristics>(characteristics)),
31  m_state(std::make_shared<biorbd::muscles::State>())
32 {
33 
34 }
35 
37  const biorbd::utils::String &name,
38  const biorbd::muscles::Geometry &position,
39  const biorbd::muscles::Characteristics &characteristics,
40  const biorbd::muscles::State &dynamicState) :
41  biorbd::muscles::Compound (name),
42  m_position(std::make_shared<biorbd::muscles::Geometry>(position)),
43  m_characteristics(std::make_shared<biorbd::muscles::Characteristics>(characteristics)),
44  m_state(std::make_shared<biorbd::muscles::State>(dynamicState))
45 {
46 
47 }
48 
50  const biorbd::utils::String &name,
51  const biorbd::muscles::Geometry &position,
52  const biorbd::muscles::Characteristics &characteristics,
53  const biorbd::muscles::PathModifiers &pathModifiers) :
54  biorbd::muscles::Compound (name, pathModifiers),
55  m_position(std::make_shared<biorbd::muscles::Geometry>(position)),
56  m_characteristics(std::make_shared<biorbd::muscles::Characteristics>(characteristics)),
57  m_state(std::make_shared<biorbd::muscles::State>())
58 {
59 
60 }
61 
63  biorbd::muscles::Compound (other),
64  m_position(other.m_position),
65  m_characteristics(other.m_characteristics),
66  m_state(other.m_state)
67 {
68 
69 }
70 
71 biorbd::muscles::Muscle::Muscle(const std::shared_ptr<biorbd::muscles::Muscle> other) :
72  biorbd::muscles::Compound (other),
73  m_position(other->m_position),
74  m_characteristics(other->m_characteristics),
75  m_state(other->m_state)
76 {
77 
78 }
79 
83  const biorbd::muscles::PathModifiers &pathModifiers,
84  const biorbd::muscles::State& emg) :
85  biorbd::muscles::Compound(name,pathModifiers),
86  m_position(std::make_shared<biorbd::muscles::Geometry>(g)),
87  m_characteristics(std::make_shared<biorbd::muscles::Characteristics>(c)),
88  m_state(std::make_shared<biorbd::muscles::State>())
89 {
90  setState(emg);
91 
92  biorbd::utils::Error::check(pathModifiers.nbWraps() <= 1, "Multiple wrapping objects is not implemented yet");
93 }
94 
96 {
97  //dtor
98 }
99 
101 {
103  *m_position = other.m_position->DeepCopy();
104  *m_characteristics = other.m_characteristics->DeepCopy();
105  *m_state = other.m_state->DeepCopy();
106 }
107 
111  int updateKin)
112 {
113  // Update de la position des insertions et origines
114  m_position->updateKinematics(model,*m_characteristics,*m_pathChanger,&Q,nullptr,updateKin);
115 }
120  int updateKin)
121 {
122  // Update de la position des insertions et origines
123  m_position->updateKinematics(model,*m_characteristics,*m_pathChanger,&Q,&Qdot,updateKin);
124 }
126  std::vector<biorbd::utils::Vector3d>& musclePointsInGlobal,
127  biorbd::utils::Matrix &jacoPointsInGlobal){
128  // Update de la position des insertions et origines
129  m_position->updateKinematics(musclePointsInGlobal,jacoPointsInGlobal,*m_characteristics,nullptr);
130 }
132  std::vector<biorbd::utils::Vector3d>& musclePointsInGlobal,
133  biorbd::utils::Matrix &jacoPointsInGlobal,
135 {
136  // Update de la position des insertions et origines
137  m_position->updateKinematics(musclePointsInGlobal,jacoPointsInGlobal,*m_characteristics,&Qdot);
138 }
139 
141  const biorbd::muscles::Geometry &positions)
142 {
143  *m_position = positions;
144 }
146  return *m_position;
147 }
148 
149 const biorbd::utils::Scalar& biorbd::muscles::Muscle::length(
152  int updateKin)
153 {
154  if (updateKin != 0) {
155  m_position->updateKinematics(
156  model,*m_characteristics,*m_pathChanger,&Q,nullptr,updateKin);
157  }
158 
159  return position().length();
160 }
161 
162 const biorbd::utils::Scalar& biorbd::muscles::Muscle::musculoTendonLength(
165  int updateKin)
166 {
167  if (updateKin != 0) {
168  m_position->updateKinematics(
169  m,*m_characteristics,*m_pathChanger,&Q,nullptr,updateKin);
170  }
171 
172  return m_position->musculoTendonLength();
173 }
174 
175 const biorbd::utils::Scalar& biorbd::muscles::Muscle::velocity(
179  bool updateKin)
180 {
181  if (updateKin) {
182  m_position->updateKinematics(
183  model,*m_characteristics,*m_pathChanger,&Q,&Qdot);
184  }
185 
186  return m_position->velocity();
187 }
188 
189 const biorbd::utils::Scalar& biorbd::muscles::Muscle::activationDot(
190  const biorbd::muscles::State& state,
191  bool alreadyNormalized) const
192 {
193  std::shared_ptr<biorbd::muscles::StateDynamics> state_copy =
194  std::dynamic_pointer_cast<biorbd::muscles::StateDynamics>(m_state);
196  state_copy != nullptr,
197  "The muscle " + name() + " is not a dynamic muscle");
198  return state_copy->timeDerivativeActivation(
199  state, characteristics(), alreadyNormalized);
200 }
201 
203 {
204  *m_force = getForceFromActivation(emg);
205 }
206 
207 const std::vector<biorbd::utils::Vector3d>& biorbd::muscles::Muscle::musclesPointsInGlobal(
210 {
211  m_position->updateKinematics(model,*m_characteristics,*m_pathChanger,&Q,nullptr);
212 
213  return musclesPointsInGlobal();
214 }
215 
216 const std::vector<biorbd::utils::Vector3d> &biorbd::muscles::Muscle::musclesPointsInGlobal() const
217 {
218  return m_position->musclesPointsInGlobal();
219 }
220 
222  const biorbd::utils::Scalar& forceMax)
223 {
224  m_characteristics->setForceIsoMax(forceMax);
225 }
226 
228  const biorbd::muscles::Characteristics &characteristics)
229 {
230  *m_characteristics = characteristics;
231 }
233 {
234  return *m_characteristics;
235 }
236 
237 // Get and set
239  const biorbd::muscles::State &emg)
240 {
241  if (emg.type() == biorbd::muscles::STATE_TYPE::BUCHANAN){
242  m_state = std::make_shared<biorbd::muscles::StateDynamicsBuchanan>(biorbd::muscles::StateDynamicsBuchanan());
243  }
244  else if (emg.type() == biorbd::muscles::STATE_TYPE::DE_GROOTE){
245  m_state = std::make_shared<biorbd::muscles::StateDynamicsDeGroote>(biorbd::muscles::StateDynamicsDeGroote());
246  }
247  else if (emg.type() == biorbd::muscles::STATE_TYPE::DYNAMIC){
248  m_state = std::make_shared<biorbd::muscles::StateDynamics>(biorbd::muscles::StateDynamics());
249  }
250  else
251  biorbd::utils::Error::raise(biorbd::utils::String(biorbd::muscles::STATE_TYPE_toStr(emg.type())) + " is not a valid type for setState");
252  *m_state = emg;
253 }
255 {
256  return *m_state;
257 }
259 {
260  return *m_state;
261 }
biorbd::muscles::Muscle::setPosition
void setPosition(const biorbd::muscles::Geometry &positions)
Set the position of all the points attached to the muscle (0 being the origin)
Definition: Muscle.cpp:140
biorbd::muscles::Muscle::computeForce
virtual void computeForce(const biorbd::muscles::State &emg)
Computer the forces from a specific emg.
Definition: Muscle.cpp:202
biorbd::muscles::Muscle::m_state
std::shared_ptr< biorbd::muscles::State > m_state
The dynamic state.
Definition: Muscle.h:286
biorbd::muscles::Muscle::setState
void setState(const biorbd::muscles::State &emg)
Set the dynamic state.
Definition: Muscle.cpp:238
biorbd::muscles::StateDynamicsDeGroote
EMG with the capability to compute the time derivative.
Definition: StateDynamicsDeGroote.h:13
biorbd::muscles::PathModifiers::nbWraps
unsigned int nbWraps() const
Return the total number of wrapping objects in the set.
Definition: PathModifiers.cpp:61
biorbd::muscles::Compound
Class compound is a very generic definition of what a muscle is. It should be the base class of every...
Definition: Compound.h:30
biorbd::muscles::Muscle::position
const biorbd::muscles::Geometry & position() const
Return the position of all the points attached to the muscle (0 being the origin)
Definition: Muscle.cpp:145
biorbd::muscles::Muscle::setCharacteristics
void setCharacteristics(const biorbd::muscles::Characteristics &characteristics)
Set the muscle characteristics.
Definition: Muscle.cpp:227
biorbd::muscles::StateDynamicsBuchanan
Time derivative of activation as described by Buchanan (https://www.sciencedirect....
Definition: StateDynamicsBuchanan.h:13
biorbd::muscles::State
EMG holder to interact with the muscle.
Definition: State.h:16
biorbd::muscles::Muscle::musclesPointsInGlobal
const std::vector< biorbd::utils::Vector3d > & musclesPointsInGlobal() const
Return the previously computed muscle points in global reference frame.
Definition: Muscle.cpp:216
biorbd::muscles::Muscle::m_position
std::shared_ptr< biorbd::muscles::Geometry > m_position
The position of all the nodes of the muscle (0 being the origin and last being insertion.
Definition: Muscle.h:284
biorbd::rigidbody::GeneralizedCoordinates
Class GeneralizedCoordinates.
Definition: GeneralizedCoordinates.h:15
biorbd::muscles::Muscle::characteristics
const biorbd::muscles::Characteristics & characteristics() const
Return the muscle characteristics.
Definition: Muscle.cpp:232
biorbd::muscles::Geometry
Class Geometry of the muscle.
Definition: Geometry.h:30
biorbd::muscles::State::type
biorbd::muscles::STATE_TYPE type() const
Return the state type.
Definition: State.cpp:132
biorbd::utils::Error::raise
static void raise(const biorbd::utils::String &message)
Throw an error message.
Definition: Error.cpp:4
biorbd::muscles::Muscle::activationDot
const biorbd::utils::Scalar & activationDot(const biorbd::muscles::State &state, bool alreadyNormalized=false) const
Return the activation time derivative.
Definition: Muscle.cpp:189
biorbd::muscles::Compound::DeepCopy
void DeepCopy(const biorbd::muscles::Compound &other)
Deep copy of a compound.
Definition: Compound.cpp:65
biorbd::muscles::Muscle::~Muscle
virtual ~Muscle()
Destroy class properly.
Definition: Muscle.cpp:95
biorbd::muscles::Muscle::DeepCopy
void DeepCopy(const biorbd::muscles::Muscle &other)
Deep copy of a muscle in new muscle.
Definition: Muscle.cpp:100
biorbd::rigidbody::Joints
This is the core of the musculoskeletal model in biorbd.
Definition: Joints.h:40
biorbd::muscles::Muscle::length
const biorbd::utils::Scalar & length(biorbd::rigidbody::Joints &model, const biorbd::rigidbody::GeneralizedCoordinates &Q, int updateKin=2)
Get the length of the muscle.
Definition: Muscle.cpp:149
biorbd::muscles::Muscle::updateOrientations
void updateOrientations(biorbd::rigidbody::Joints &model, const biorbd::rigidbody::GeneralizedCoordinates &Q, int updateKin=2)
Update the position of the origin and insertion positions of the muscle.
Definition: Muscle.cpp:108
biorbd::muscles::Muscle::setForceIsoMax
void setForceIsoMax(const biorbd::utils::Scalar &forceMax)
Set the maximal isometric force.
Definition: Muscle.cpp:221
biorbd::muscles::PathModifiers
Holder of all the path modifiers of a muscle.
Definition: PathModifiers.h:18
biorbd::utils::Matrix
A wrapper for the Eigen::MatrixXd.
Definition: Matrix.h:21
biorbd::muscles::Muscle::musculoTendonLength
const biorbd::utils::Scalar & musculoTendonLength(biorbd::rigidbody::Joints &model, const biorbd::rigidbody::GeneralizedCoordinates &Q, int updateKin=2)
Return the musculo tendon length.
Definition: Muscle.cpp:162
biorbd::muscles::Muscle::m_characteristics
std::shared_ptr< biorbd::muscles::Characteristics > m_characteristics
The muscle characteristics.
Definition: Muscle.h:285
biorbd::utils::String
Wrapper around the std::string class with augmented functionality.
Definition: String.h:17
biorbd::muscles::Muscle::state
const biorbd::muscles::State & state() const
Return the dynamic state.
Definition: Muscle.cpp:254
biorbd::muscles::StateDynamics
EMG with the capability to compute the time derivative.
Definition: StateDynamics.h:14
biorbd::muscles::Muscle::Muscle
Muscle()
Construct a muscle.
Definition: Muscle.cpp:15
biorbd::muscles::Characteristics
Class Holds that muscle characteristics.
Definition: Characteristics.h:17
biorbd::rigidbody::GeneralizedVelocity
Class GeneralizedVelocity.
Definition: GeneralizedVelocity.h:15
biorbd::muscles::Muscle
Base class of all muscle.
Definition: Muscle.h:23
biorbd::muscles::Muscle::velocity
const biorbd::utils::Scalar & velocity(biorbd::rigidbody::Joints &model, const biorbd::rigidbody::GeneralizedCoordinates &Q, const biorbd::rigidbody::GeneralizedVelocity &Qdot, bool updateKin=true)
Return the velocity of the muscle.
Definition: Muscle.cpp:175
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