1 #define BIORBD_API_EXPORTS
2 #include "Actuators/Actuators.h"
5 #include "Utils/Error.h"
6 #include "RigidBody/GeneralizedTorque.h"
7 #include "RigidBody/GeneralizedCoordinates.h"
8 #include "RigidBody/GeneralizedVelocity.h"
9 #include "RigidBody/Joints.h"
10 #include "Actuators/Actuator.h"
11 #include "Actuators/ActuatorGauss3p.h"
12 #include "Actuators/ActuatorGauss6p.h"
13 #include "Actuators/ActuatorConstant.h"
14 #include "Actuators/ActuatorLinear.h"
17 m_all(std::make_shared<std::vector<std::pair<std::shared_ptr<biorbd::actuator::
Actuator>, std::shared_ptr<biorbd::actuator::
Actuator>>>>()),
18 m_isDofSet(std::make_shared<std::vector<bool>>(1)),
19 m_isClose(std::make_shared<bool>(false))
21 (*m_isDofSet)[0] =
false;
27 m_isDofSet(other.m_isDofSet),
28 m_isClose(other.m_isClose)
41 m_all->resize(other.
m_all->size());
42 for (
unsigned int i=0; i<other.
m_all->size(); ++i){
43 if ((*other.
m_all)[i].first->type() == biorbd::actuator::TYPE::CONSTANT)
44 (*m_all)[i].first = std::make_shared<biorbd::actuator::ActuatorConstant>(
46 else if ((*other.
m_all)[i].first->type() == biorbd::actuator::TYPE::LINEAR)
47 (*m_all)[i].first = std::make_shared<biorbd::actuator::ActuatorLinear>(
49 else if ((*other.
m_all)[i].first->type() == biorbd::actuator::TYPE::GAUSS3P)
50 (*m_all)[i].first = std::make_shared<biorbd::actuator::ActuatorGauss3p>(
52 else if ((*other.
m_all)[i].first->type() == biorbd::actuator::TYPE::GAUSS6P)
53 (*m_all)[i].first = std::make_shared<biorbd::actuator::ActuatorGauss6p>(
57 biorbd::actuator::TYPE_toStr((*other.
m_all)[i].first->type()))
59 if ((*other.
m_all)[i].second->type() == biorbd::actuator::TYPE::CONSTANT)
60 (*m_all)[i].second = std::make_shared<biorbd::actuator::ActuatorConstant>(
62 else if ((*other.
m_all)[i].second->type() == biorbd::actuator::TYPE::LINEAR)
63 (*m_all)[i].second = std::make_shared<biorbd::actuator::ActuatorLinear>(
65 else if ((*other.
m_all)[i].second->type() == biorbd::actuator::TYPE::GAUSS3P)
66 (*m_all)[i].second = std::make_shared<biorbd::actuator::ActuatorGauss3p>(
68 else if ((*other.
m_all)[i].second->type() == biorbd::actuator::TYPE::GAUSS6P)
69 (*m_all)[i].second = std::make_shared<biorbd::actuator::ActuatorGauss6p>(
73 biorbd::actuator::TYPE_toStr((*other.
m_all)[i].second->type()))
77 for (
unsigned int i=0; i<other.
m_isDofSet->size(); ++i)
85 !*m_isClose,
"You can't add actuator after closing the model");
93 act.
index()<model.
nbDof(),
"Sent index is out of dof range");
97 unsigned int idx(act.
index());
101 if (idx >= m_all->size()){
102 m_all->resize(idx+1);
103 m_isDofSet->resize((idx+1)*2,
false);
107 if (act.
type() == biorbd::actuator::TYPE::CONSTANT){
110 (*m_isDofSet)[idx*2] =
true;
114 (*m_isDofSet)[idx*2+1] =
true;
118 else if (act.
type() == biorbd::actuator::TYPE::LINEAR){
121 (*m_isDofSet)[idx*2] =
true;
125 (*m_isDofSet)[idx*2+1] =
true;
129 else if (act.
type() == biorbd::actuator::TYPE::GAUSS3P){
132 (*m_isDofSet)[idx*2] =
true;
136 (*m_isDofSet)[idx*2+1] =
true;
140 else if (act.
type() == biorbd::actuator::TYPE::GAUSS6P){
143 (*m_isDofSet)[idx*2] =
true;
147 (*m_isDofSet)[idx*2+1] =
true;
162 model.
nbDof()==m_all->size(),
163 "All dof must have their actuators set");
165 for (
unsigned int i=0; i<m_all->size()*2; ++i)
167 "All DoF must have their actuators set "
168 "before closing the model");
173 const std::pair<std::shared_ptr<biorbd::actuator::Actuator>,
174 std::shared_ptr<biorbd::actuator::Actuator>>&
178 return (*m_all)[dof];
184 const std::pair<std::shared_ptr<biorbd::actuator::Actuator>, std::shared_ptr<biorbd::actuator::Actuator>>&
195 return static_cast<unsigned int>(m_all->size());
205 for (
unsigned int i=0; i<Qdot.size(); ++i){
206 #ifdef BIORBD_USE_CASADI_MATH
207 QdotResigned(i) = casadi::MX::if_else(
208 casadi::MX::lt(activation(i), 0),
211 if (activation(i)<0){
212 QdotResigned(i) = -Qdot(i);
219 torqueMax(activation,Q,QdotResigned));
222 for (
unsigned int i=0; i<GeneralizedTorque.size(); ++i)
223 GeneralizedTorque(i) = GeneralizedTorque(i) * activation(i);
225 return GeneralizedTorque;
229 std::pair<biorbd::rigidbody::GeneralizedTorque, biorbd::rigidbody::GeneralizedTorque>
239 std::pair<biorbd::rigidbody::GeneralizedTorque, biorbd::rigidbody::GeneralizedTorque> maxGeneralizedTorque_all =
242 for (
unsigned int i=0; i<model.
nbDof(); ++i){
243 std::pair<std::shared_ptr<Actuator>, std::shared_ptr<Actuator>> GeneralizedTorque_tp(actuator(i));
244 for (
unsigned p=0; p<2; ++p){
246 if (std::dynamic_pointer_cast<ActuatorGauss3p> (GeneralizedTorque_tp.first))
247 maxGeneralizedTorque_all.first[i] = std::static_pointer_cast<ActuatorGauss3p> (GeneralizedTorque_tp.first)->torqueMax(Q, Qdot);
248 else if (std::dynamic_pointer_cast<ActuatorConstant> (GeneralizedTorque_tp.first))
249 maxGeneralizedTorque_all.first[i] = std::static_pointer_cast<ActuatorConstant> (GeneralizedTorque_tp.first)->torqueMax();
250 else if (std::dynamic_pointer_cast<ActuatorLinear> (GeneralizedTorque_tp.first))
251 maxGeneralizedTorque_all.first[i] = std::static_pointer_cast<ActuatorLinear> (GeneralizedTorque_tp.first)->torqueMax(Q);
252 else if (std::dynamic_pointer_cast<ActuatorGauss6p> (GeneralizedTorque_tp.first))
253 maxGeneralizedTorque_all.first[i] = std::static_pointer_cast<ActuatorGauss6p> (GeneralizedTorque_tp.first)->torqueMax(Q, Qdot);
257 if (std::dynamic_pointer_cast<ActuatorGauss3p> (GeneralizedTorque_tp.second))
258 maxGeneralizedTorque_all.second[i] = std::static_pointer_cast<ActuatorGauss3p> (GeneralizedTorque_tp.second)->torqueMax(Q, Qdot);
259 else if (std::dynamic_pointer_cast<ActuatorConstant> (GeneralizedTorque_tp.second))
260 maxGeneralizedTorque_all.second[i] = std::static_pointer_cast<ActuatorConstant> (GeneralizedTorque_tp.second)->torqueMax();
261 else if (std::dynamic_pointer_cast<ActuatorLinear> (GeneralizedTorque_tp.second))
262 maxGeneralizedTorque_all.second[i] = std::static_pointer_cast<ActuatorLinear> (GeneralizedTorque_tp.second)->torqueMax(Q);
263 else if (std::dynamic_pointer_cast<ActuatorGauss6p> (GeneralizedTorque_tp.second))
264 maxGeneralizedTorque_all.second[i] = std::static_pointer_cast<ActuatorGauss6p> (GeneralizedTorque_tp.second)->torqueMax(Q, Qdot);
270 return maxGeneralizedTorque_all;
286 for (
unsigned int i=0; i<model.
nbDof(); ++i){
287 #ifdef BIORBD_USE_CASADI_MATH
288 maxGeneralizedTorque_all[i] = casadi::MX::if_else(
289 casadi::MX::ge(activation(i, 0), 0),
290 getTorqueMaxDirection(actuator(i).first, Q, Qdot),
291 getTorqueMaxDirection(actuator(i).second, Q, Qdot));
293 if (activation[i] >= 0)
294 maxGeneralizedTorque_all[i] = getTorqueMaxDirection(actuator(i).first, Q, Qdot);
296 maxGeneralizedTorque_all[i] = getTorqueMaxDirection(actuator(i).second, Q, Qdot);
300 return maxGeneralizedTorque_all;
304 const std::shared_ptr<biorbd::actuator::Actuator> actuator,
308 if (std::dynamic_pointer_cast<ActuatorGauss3p> (actuator))
309 return std::static_pointer_cast<ActuatorGauss3p> (actuator)->torqueMax(Q, Qdot);
310 else if (std::dynamic_pointer_cast<ActuatorConstant> (actuator))
311 return std::static_pointer_cast<ActuatorConstant> (actuator)->torqueMax();
312 else if (std::dynamic_pointer_cast<ActuatorLinear> (actuator))
313 return std::static_pointer_cast<ActuatorLinear> (actuator)->torqueMax(Q);
314 else if (std::dynamic_pointer_cast<ActuatorGauss6p> (actuator))
315 return std::static_pointer_cast<ActuatorGauss6p> (actuator)->torqueMax(Q, Qdot);