1 #define BIORBD_API_EXPORTS
2 #include "Actuators/ActuatorGauss3p.h"
4 #include "Utils/Error.h"
5 #include "RigidBody/GeneralizedCoordinates.h"
6 #include "RigidBody/GeneralizedVelocity.h"
10 m_k(std::make_shared<biorbd::utils::Scalar>(4.3)),
11 m_Tmax(std::make_shared<biorbd::utils::Scalar>(0)),
12 m_T0(std::make_shared<biorbd::utils::Scalar>(0)),
13 m_wmax(std::make_shared<biorbd::utils::Scalar>(0)),
14 m_wc(std::make_shared<biorbd::utils::Scalar>(0)),
15 m_amax(std::make_shared<biorbd::utils::Scalar>(1.0)),
16 m_amin(std::make_shared<biorbd::utils::Scalar>(0)),
17 m_wr(std::make_shared<biorbd::utils::Scalar>(0)),
18 m_w1(std::make_shared<biorbd::utils::Scalar>(0)),
19 m_r(std::make_shared<biorbd::utils::Scalar>(0)),
20 m_qopt(std::make_shared<biorbd::utils::Scalar>(0))
45 const biorbd::utils::Scalar& Tmax,
46 const biorbd::utils::Scalar& T0,
47 const biorbd::utils::Scalar& wmax,
48 const biorbd::utils::Scalar& wc,
49 const biorbd::utils::Scalar& amin,
50 const biorbd::utils::Scalar& wr,
51 const biorbd::utils::Scalar& w1,
52 const biorbd::utils::Scalar& r,
53 const biorbd::utils::Scalar& qopt,
54 unsigned int dofIdx) :
55 biorbd::actuator::
Actuator(direction, dofIdx),
56 m_k(std::make_shared<biorbd::utils::Scalar>(4.3)),
57 m_Tmax(std::make_shared<biorbd::utils::Scalar>(Tmax)),
58 m_T0(std::make_shared<biorbd::utils::Scalar>(T0)),
59 m_wmax(std::make_shared<biorbd::utils::Scalar>(wmax)),
60 m_wc(std::make_shared<biorbd::utils::Scalar>(wc)),
61 m_amax(std::make_shared<biorbd::utils::Scalar>(1.0)),
62 m_amin(std::make_shared<biorbd::utils::Scalar>(amin)),
63 m_wr(std::make_shared<biorbd::utils::Scalar>(wr)),
64 m_w1(std::make_shared<biorbd::utils::Scalar>(w1)),
65 m_r(std::make_shared<biorbd::utils::Scalar>(r)),
66 m_qopt(std::make_shared<biorbd::utils::Scalar>(qopt))
73 const biorbd::utils::Scalar& Tmax,
74 const biorbd::utils::Scalar& T0,
75 const biorbd::utils::Scalar& wmax,
76 const biorbd::utils::Scalar& wc,
77 const biorbd::utils::Scalar& amin,
78 const biorbd::utils::Scalar& wr,
79 const biorbd::utils::Scalar& w1,
80 const biorbd::utils::Scalar& r,
81 const biorbd::utils::Scalar& qopt,
84 biorbd::actuator::
Actuator(direction, dofIdx, jointName),
85 m_k(std::make_shared<biorbd::utils::Scalar>(4.3)),
86 m_Tmax(std::make_shared<biorbd::utils::Scalar>(Tmax)),
87 m_T0(std::make_shared<biorbd::utils::Scalar>(T0)),
88 m_wmax(std::make_shared<biorbd::utils::Scalar>(wmax)),
89 m_wc(std::make_shared<biorbd::utils::Scalar>(wc)),
90 m_amax(std::make_shared<biorbd::utils::Scalar>(1.0)),
91 m_amin(std::make_shared<biorbd::utils::Scalar>(amin)),
92 m_wr(std::make_shared<biorbd::utils::Scalar>(wr)),
93 m_w1(std::make_shared<biorbd::utils::Scalar>(w1)),
94 m_r(std::make_shared<biorbd::utils::Scalar>(r)),
95 m_qopt(std::make_shared<biorbd::utils::Scalar>(qopt))
132 "torqueMax for ActuatorGauss3p must be called with Q and Qdot");
138 biorbd::utils::Scalar pos(Q[*m_dofIdx] * 180/M_PI);
139 biorbd::utils::Scalar speed(Qdot[*m_dofIdx] * 180/M_PI);
142 biorbd::utils::Scalar Tc = *m_T0 * *m_wc / *m_wmax;
143 biorbd::utils::Scalar C = Tc * (*m_wmax + *m_wc);
144 biorbd::utils::Scalar we =
145 ( (*m_Tmax - *m_T0) * *m_wmax * *m_wc )
146 / ( *m_k * *m_T0 * (*m_wmax + *m_wc) );
147 biorbd::utils::Scalar E = -( *m_Tmax - *m_T0 ) * we;
149 biorbd::utils::Scalar Tw;
150 #ifdef BIORBD_USE_CASADI_MATH
151 Tw = casadi::MX::if_else(casadi::MX::ge(speed, 0),
152 C / ( *m_wc + speed ) - Tc,
153 E / ( we - speed ) + *m_Tmax);
156 Tw = C / ( *m_wc + speed ) - Tc;
158 Tw = E / ( we - speed ) + *m_Tmax;
163 biorbd::utils::Scalar A =
164 *m_amin + ( *m_amax - *m_amin )
165 / ( 1 + biorbd::utils::Scalar(exp( -(speed - *m_w1) / *m_wr )) );
168 biorbd::utils::Scalar Ta = exp( -(*m_qopt - pos) * (*m_qopt - pos) / (2 * *m_r * *m_r) );
176 *m_type = biorbd::actuator::TYPE::GAUSS3P;