Description
Hi all,
After a long delay... I have the ligament model working and ready for input. Still needs some cleanup.
https://github.com/clnsmith/wisco_opensim/blob/master/plugin/WISCO_Ligament.cpp
https://github.com/clnsmith/wisco_opensim/blob/master/plugin/WISCO_Ligament.h
A lot of the comments in those files are from the previous OpenSim 3.3 version and need updating.
Here is a document with a general overview of the ligament model (again implementation details need updating):
https://github.com/clnsmith/wisco_opensim/blob/master/documentation/UWLigamentUserGuide.pdf
There are two main parameters that must be selected for each ligament strand: Linear Stiffness and slack length. Linear stiffness is pretty straight forward (currently must be defined in N/strain, would be nice to add an option for N/mm).
There are three ways that would be useful to be able to define slack length:
slack_length: input the actual slack length of the ligament
reference_strain: input the strain in the ligament when the model is posed at the default coordinates (this is nice for scaling because it remains constant and then a new slack length can be computed for the scaled geometries). This is what we currently use for nearly everything, common in multibody knee model literature.
reference_force: input the force in the ligament when the model is posed at the default coordinates. This is nice for surgical simulations (ACL reconstruction etc) where pretension (ligament force at a certain flexion angle) is something the surgeon sets.
These options are implemented as optional properties: "slack_length", "reference_force", and "reference_strain". Another property "defining_slack_length_property" determines which one of the three options are used by the model. There is also a method "equilibriateSlackLengthProperties(state)" that will compute the other two options from the defining_slack_length_property.
I have written some simple tests for the ligament here:
https://github.com/clnsmith/wisco_opensim/tree/master/tests/testWISCOLigament
Currently it tests for the force at multiple strains/strain rates and checks that energy is conserved in a simple block hanging from a ligament simulation.
Aside from cleanup, the last major thing I can think of to implement is scaling. Right now it just has whatever scaling methods were in the OpenSim Ligament class that I started from.