Biorbd
StateDynamics.cpp
1 #define BIORBD_API_EXPORTS
2 #include "Muscles/StateDynamics.h"
3 
4 #include "Utils/Error.h"
5 #include "Utils/String.h"
6 #include "Muscles/Characteristics.h"
7 
9  const biorbd::utils::Scalar& excitation,
10  const biorbd::utils::Scalar& activation) :
11  biorbd::muscles::State(excitation,activation),
12  m_previousExcitation(std::make_shared<biorbd::utils::Scalar>(0)),
13  m_previousActivation(std::make_shared<biorbd::utils::Scalar>(0)),
14  m_activationDot(std::make_shared<biorbd::utils::Scalar>(0))
15 {
16  setType();
17 }
18 
20  const biorbd::muscles::StateDynamics &other) :
21  biorbd::muscles::State(other),
22  m_previousExcitation(other.m_previousExcitation),
23  m_previousActivation(other.m_previousActivation),
24  m_activationDot(other.m_activationDot)
25 {
26 
27 }
28 
30 {
31  //dtor
32 }
33 
35 {
37  copy.DeepCopy(*this);
38  return copy;
39 }
40 
42 {
44  *m_excitationNorm = *other.m_excitationNorm;
45  *m_previousExcitation = *other.m_previousExcitation;
46  *m_previousActivation = *other.m_previousActivation;
47  *m_activationDot = *other.m_activationDot;
48 }
49 
50 
52  const biorbd::muscles::State& emg,
53  const biorbd::muscles::Characteristics& characteristics,
54  bool alreadyNormalized){
55  return timeDerivativeActivation(emg.excitation(), emg.activation(), characteristics, alreadyNormalized);
56 }
57 
58 
60  const biorbd::utils::Scalar& excitation,
61  const biorbd::utils::Scalar& activation,
62  const biorbd::muscles::Characteristics &characteristics,
63  bool alreadyNormalized){
64  setExcitation(excitation);
65  setActivation(activation);
66  return timeDerivativeActivation(characteristics, alreadyNormalized);
67 }
68 
70  const biorbd::muscles::Characteristics &characteristics,
71  bool alreadyNormalized){
72  // Implémentation de la fonction da/dt = (u-a)/GeneralizedTorque(u,a)
73  // ou GeneralizedTorque(u,a) = t_act(0.5+1.5*a) is u>a et GeneralizedTorque(u,a)=t_deact(0.5+1.5*a) sinon
74 #ifdef BIORBD_USE_CASADI_MATH
75  *m_activation = casadi::MX::if_else(
76  casadi::MX::lt(*m_activation, characteristics.minActivation()),
77  characteristics.minActivation(), *m_activation);
78  *m_excitation = casadi::MX::if_else(
79  casadi::MX::lt(*m_excitation, characteristics.minActivation()),
80  characteristics.minActivation(), *m_excitation);
81 #else
82  if (*m_activation < characteristics.minActivation())
83  *m_activation = characteristics.minActivation();
84 
85  if (*m_excitation < characteristics.minActivation())
86  *m_excitation = characteristics.minActivation();
87 #endif
88 
89 
90 
91 // see doi:10.1016/j.humov.2011.08.006
92 // see doi:10.1016/S0021-9290(03)00010-1
93 
94 
95 // http://simtk-confluence.stanford.edu:8080/display/OpenSim/First-Order+Activation+Dynamics
96 
97  biorbd::utils::Scalar num;
98  if (alreadyNormalized)
99  num = *m_excitation - *m_activation; // numérateur
100  else
101  num = normalizeExcitation(characteristics.stateMax())- *m_activation; // numérateur
102 
103  biorbd::utils::Scalar denom; // dénominateur
104 #ifdef BIORBD_USE_CASADI_MATH
105  denom = casadi::MX::if_else(
106  casadi::MX::gt(num, 0),
107  characteristics.torqueActivation() * (0.5+1.5* *m_activation),
108  characteristics.torqueDeactivation() / (0.5+1.5* *m_activation));
109 #else
110  if (num>0)
111  denom = characteristics.torqueActivation() * (0.5+1.5* *m_activation);
112  else
113  denom = characteristics.torqueDeactivation() / (0.5+1.5* *m_activation);
114 #endif
115  *m_activationDot = num/denom;
116 
117  return *m_activationDot;
118 }
119 
121 {
122  return *m_activationDot;
123 }
124 
126  const biorbd::utils::Scalar& val,
127  bool turnOffWarnings) {
128  *m_previousExcitation = *m_excitation;
129  biorbd::muscles::State::setExcitation(val, turnOffWarnings);
130 }
131 
132 const biorbd::utils::Scalar& biorbd::muscles::StateDynamics::previousExcitation() const
133 {
134  return *m_previousExcitation;
135 }
136 
138  const biorbd::utils::Scalar& val,
139  bool turnOffWarnings) {
140  *m_previousActivation = *m_activation;
141  biorbd::muscles::State::setActivation(val, turnOffWarnings);
142 }
143 
144 const biorbd::utils::Scalar& biorbd::muscles::StateDynamics::previousActivation() const
145 {
146  return *m_previousActivation;
147 }
148 
150 {
151  *m_stateType = biorbd::muscles::STATE_TYPE::DYNAMIC;
152 }
biorbd::muscles::StateDynamics::setActivation
virtual void setActivation(const biorbd::utils::Scalar &val, bool turnOffWarnings=false)
Set the muscle activation.
Definition: StateDynamics.cpp:137
biorbd::muscles::StateDynamics::m_previousActivation
std::shared_ptr< biorbd::utils::Scalar > m_previousActivation
The previous activation.
Definition: StateDynamics.h:134
biorbd::muscles::State::m_excitationNorm
std::shared_ptr< biorbd::utils::Scalar > m_excitationNorm
The normalized excitation.
Definition: State.h:129
biorbd::muscles::Characteristics::minActivation
const biorbd::utils::Scalar & minActivation() const
Return the minimal activation of the muscle.
Definition: Characteristics.cpp:146
biorbd::muscles::StateDynamics::DeepCopy
biorbd::muscles::StateDynamics DeepCopy() const
Deep copy of state dynamics.
Definition: StateDynamics.cpp:34
biorbd::muscles::State
EMG holder to interact with the muscle.
Definition: State.h:16
biorbd::muscles::StateDynamics::StateDynamics
StateDynamics(const biorbd::utils::Scalar &excitation=0, const biorbd::utils::Scalar &activation=0)
Construct the state dynamics.
Definition: StateDynamics.cpp:8
biorbd::muscles::State::DeepCopy
biorbd::muscles::State DeepCopy() const
Deep copy of state.
Definition: State.cpp:32
biorbd::muscles::Characteristics::torqueActivation
const biorbd::utils::Scalar & torqueActivation() const
Return the time activation constant.
Definition: Characteristics.cpp:156
biorbd::muscles::State::activation
const biorbd::utils::Scalar & activation() const
Return the muscle activation.
Definition: State.cpp:127
biorbd::muscles::StateDynamics::m_activationDot
std::shared_ptr< biorbd::utils::Scalar > m_activationDot
The activation velocity.
Definition: StateDynamics.h:135
biorbd::muscles::StateDynamics::setType
virtual void setType()
Set the type to simple_state.
Definition: StateDynamics.cpp:149
biorbd::muscles::State::excitation
const biorbd::utils::Scalar & excitation() const
Return the muscle excitation.
Definition: State.cpp:66
biorbd::muscles::Characteristics::stateMax
const biorbd::muscles::State & stateMax() const
Return the maximal excitation and activation of the muscle.
Definition: Characteristics.cpp:176
biorbd::muscles::StateDynamics::previousActivation
const biorbd::utils::Scalar & previousActivation() const
Return the previous activation.
Definition: StateDynamics.cpp:144
biorbd::muscles::StateDynamics::setExcitation
virtual void setExcitation(const biorbd::utils::Scalar &val, bool turnOffWarnings=false)
Set the muscle excitation.
Definition: StateDynamics.cpp:125
biorbd::muscles::Characteristics::torqueDeactivation
const biorbd::utils::Scalar & torqueDeactivation() const
Return the time deactivation constant.
Definition: Characteristics.cpp:166
biorbd::muscles::State::setActivation
virtual void setActivation(const biorbd::utils::Scalar &val, bool turnOffWarnings=false)
Set the muscle activation.
Definition: State.cpp:98
biorbd::muscles::StateDynamics::timeDerivativeActivation
virtual const biorbd::utils::Scalar & timeDerivativeActivation()
Return the previously computed activation time derivative.
Definition: StateDynamics.cpp:120
biorbd::muscles::StateDynamics
EMG with the capability to compute the time derivative.
Definition: StateDynamics.h:14
biorbd::muscles::StateDynamics::previousExcitation
const biorbd::utils::Scalar & previousExcitation() const
Return the previous activation.
Definition: StateDynamics.cpp:132
biorbd::muscles::Characteristics
Class Holds that muscle characteristics.
Definition: Characteristics.h:17
biorbd::muscles::StateDynamics::~StateDynamics
virtual ~StateDynamics()
Destroy class properly.
Definition: StateDynamics.cpp:29
biorbd::muscles::State::setExcitation
virtual void setExcitation(const biorbd::utils::Scalar &val, bool turnOffWarnings=false)
Set the muscle excitation.
Definition: State.cpp:47
biorbd::muscles::StateDynamics::m_previousExcitation
std::shared_ptr< biorbd::utils::Scalar > m_previousExcitation
The previous excitation.
Definition: StateDynamics.h:133