Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions include/InternalForces/Muscles/StaticOptimization.h
Original file line number Diff line number Diff line change
Expand Up @@ -186,6 +186,19 @@ class BIORBD_API StaticOptimization {
///
utils::Vector finalSolution(unsigned int index);

///
/// \brief Return the final residuals
/// \return The final residuals
///
std::vector<utils::Vector> finalResidual();

///
/// \brief Return the final residuals at a specific index
/// \return The final residuals at a specific index
///
utils::Vector finalResidual(unsigned int index);


protected:
Model& m_model; ///< A reference to the model
bool m_useResidualTorque; ///< To use residual torque
Expand Down
6 changes: 4 additions & 2 deletions src/InternalForces/Muscles/HillDeGrooteType.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -103,8 +103,10 @@ void internal_forces::muscles::HillDeGrooteType::computeFvCE() {
utils::Scalar d2 = -8.149;
utils::Scalar d3 = -0.374;
utils::Scalar d4 = 0.886;
utils::Scalar norm_v =
m_position->velocity() / this->characteristics().maxShorteningSpeed();
utils::Scalar v = m_position->velocity();

utils::Scalar norm_v = v / (characteristics().optimalLength() *
this->characteristics().maxShorteningSpeed());

*m_FvCE = d1 * std::log(
(d2 * norm_v + d3) +
Expand Down
36 changes: 36 additions & 0 deletions src/InternalForces/Muscles/StaticOptimization.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -276,3 +276,39 @@ utils::Vector internal_forces::muscles::StaticOptimization::finalSolution(
}
return res;
}

std::vector<utils::Vector>
internal_forces::muscles::StaticOptimization::finalResidual() {
std::vector<utils::Vector> res;
if (!m_alreadyRun) {
utils::Error::raise(
"Problem has not been run through the optimization process "
"yet, you should optimize it first to get "
"the residual solution");
} else {
for (unsigned int i = 0; i < m_allQ.size(); ++i) {
res.push_back(
static_cast<internal_forces::muscles::StaticOptimizationIpopt*>(
Ipopt::GetRawPtr(m_staticOptimProblem[i]))
->finalResidual());
}
}
return res;
}

utils::Vector
internal_forces::muscles::StaticOptimization::finalResidual(unsigned int index) {
utils::Vector res;
if (!m_alreadyRun) {
utils::Error::raise(
"Problem has not been run through the optimization process "
"yet, you should optimize it first to get "
"the residual solution");
} else {
res = static_cast<internal_forces::muscles::StaticOptimizationIpopt*>(
Ipopt::GetRawPtr(m_staticOptimProblem[index]))
->finalResidual();
}
return res;
}

14 changes: 7 additions & 7 deletions test/test_muscles.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1284,9 +1284,9 @@ TEST(hillDeGrooteTypeActive, unitTest) {
SCALAR_TO_DOUBLE(force, hillDeGrooteType.force(emg));
EXPECT_NEAR(flce, 0.92953865278129677, requiredPrecision);
EXPECT_NEAR(flpe, 0., requiredPrecision);
EXPECT_NEAR(fvce, 1.001970264039421, requiredPrecision);
EXPECT_NEAR(fvce, 0.99966505861454702, requiredPrecision);
EXPECT_NEAR(damping, 0., requiredPrecision);
EXPECT_NEAR(force, 405.66755612256657, requiredPrecision);
EXPECT_NEAR(force, 404.734247935057, requiredPrecision);
}
{
Model model(modelPathForMuscleForce);
Expand Down Expand Up @@ -1772,9 +1772,9 @@ TEST(hillDeGrooteType, unitTest) {
SCALAR_TO_DOUBLE(force, hillDeGrooteType.force(emg));
EXPECT_NEAR(flce, 0.92953865278129677, requiredPrecision);
EXPECT_NEAR(flpe, 0.022596966416076593, requiredPrecision);
EXPECT_NEAR(fvce, 1.001970264039421, requiredPrecision);
EXPECT_NEAR(fvce, 0.99966505861454702, requiredPrecision);
EXPECT_NEAR(damping, 0, requiredPrecision);
EXPECT_NEAR(force, 415.50989081475285, requiredPrecision);
EXPECT_NEAR(force, 414.57658262724328, requiredPrecision);
}
{
Model model(modelPathForMuscleForce);
Expand Down Expand Up @@ -2959,7 +2959,7 @@ TEST(MuscleForce, force) {
std::vector<double> ExpectedForce(
{165.19678913804927,
178.49448510433558,
90.97584591669964,
90.789184279197713,
92.59497473343656,
74.287046497422935,
198.53590160321016});
Expand All @@ -2982,7 +2982,7 @@ TEST(MuscleForce, torqueFromMuscles) {
}

rigidbody::GeneralizedTorque Tau(model);
std::vector<double> TauExpected({-11.018675667414932, -1.7483464272594329});
std::vector<double> TauExpected({-10.986834246856635, -1.7872663180818087});
Tau = model.muscularJointTorque(states, Q, Qdot);
for (unsigned int i = 0; i < Tau.size(); ++i) {
SCALAR_TO_DOUBLE(val, Tau(i));
Expand All @@ -2991,7 +2991,7 @@ TEST(MuscleForce, torqueFromMuscles) {

rigidbody::GeneralizedAcceleration Qddot =
model.ForwardDynamics(Q, Qdot, Tau);
std::vector<double> QddotExpected({-47.946292142243109, 56.344108470462629});
std::vector<double> QddotExpected({-47.412753236836856, 54.927407050792368});
for (unsigned int i = 0; i < Qddot.size(); ++i) {
SCALAR_TO_DOUBLE(val, Qddot(i));
EXPECT_NEAR(val, QddotExpected[i], requiredPrecision);
Expand Down