@@ -284,36 +284,36 @@ biorbd::rigidbody::GeneralizedTorque biorbd::actuator::Actuators::torqueMax(
284284 biorbd::rigidbody::GeneralizedTorque maxGeneralizedTorque_all (model);
285285
286286 for (unsigned int i=0 ; i<model.nbDof (); ++i){
287- std::shared_ptr<Actuator> GeneralizedTorque_tp;
288-
289287#ifdef BIORBD_USE_CASADI_MATH
290- casadi::MX useFirst = casadi::MX::if_else (
291- casadi::MX::ge (activation[i], 0 ),
292- 1 , 0 );
293- if (!useFirst.is_zero ()){
294- GeneralizedTorque_tp = actuator (i).first ;
295- } else {
296- GeneralizedTorque_tp = actuator (i).second ;
297- }
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));
298292#else
299293 if (activation[i] >= 0 ) // First
300- GeneralizedTorque_tp = actuator (i).first ;
294+ maxGeneralizedTorque_all[i] = getTorqueMaxDirection ( actuator (i).first , Q, Qdot) ;
301295 else
302- GeneralizedTorque_tp = actuator (i).second ;
296+ maxGeneralizedTorque_all[i] = getTorqueMaxDirection ( actuator (i).second , Q, Qdot) ;
303297#endif
304-
305- if (std::dynamic_pointer_cast<ActuatorGauss3p> (GeneralizedTorque_tp))
306- maxGeneralizedTorque_all[i] = std::static_pointer_cast<ActuatorGauss3p> (GeneralizedTorque_tp)->torqueMax (Q, Qdot);
307- else if (std::dynamic_pointer_cast<ActuatorConstant> (GeneralizedTorque_tp))
308- maxGeneralizedTorque_all[i] = std::static_pointer_cast<ActuatorConstant> (GeneralizedTorque_tp)->torqueMax ();
309- else if (std::dynamic_pointer_cast<ActuatorLinear> (GeneralizedTorque_tp))
310- maxGeneralizedTorque_all[i] = std::static_pointer_cast<ActuatorLinear> (GeneralizedTorque_tp)->torqueMax (Q);
311- else if (std::dynamic_pointer_cast<ActuatorGauss6p> (GeneralizedTorque_tp))
312- maxGeneralizedTorque_all[i] = std::static_pointer_cast<ActuatorGauss6p> (GeneralizedTorque_tp)->torqueMax (Q, Qdot);
313- else
314- biorbd::utils::Error::raise (" Wrong type (should never get here because of previous safety)" );
315-
316298 }
317299
318300 return maxGeneralizedTorque_all;
319301}
302+
303+ biorbd::utils::Scalar biorbd::actuator::Actuators::getTorqueMaxDirection (
304+ const std::shared_ptr<biorbd::actuator::Actuator> actuator,
305+ const biorbd::rigidbody::GeneralizedCoordinates& Q,
306+ const biorbd::rigidbody::GeneralizedVelocity& Qdot) const
307+ {
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);
316+ else
317+ biorbd::utils::Error::raise (" Wrong type (should never get here because of previous safety)" );
318+
319+ }
0 commit comments