Hi everyone,
I know what static optimization does, which artifacts it requires and how it is executed using the OpenSim GUI.
However, I have no idea how to run it using the API via C++. There are many C++ and Python
examples but as far as I know none covers static optimization. Is there any minimal working example?
Particularly, I wonder how to specify the motion trajectories, the external GRFs and add them to the SO-Object.
Thanks & best regards
Felix
Running StaticOptimization from C++
- Felix Laufer
- Posts: 4
- Joined: Wed Aug 29, 2018 12:34 am
- Dimitar Stanev
- Posts: 1096
- Joined: Fri Jan 31, 2014 5:14 am
Re: Running StaticOptimization from C++
Hi,
This is the code that I use with OpenSim 3.3 and Python:
There are some minor differences between v3.3 and v4.0 and I didn't had time to migrate my scripts yet.
https://github.com/opensim-org/opensim-core/issues/2076
This is the code that I use with OpenSim 3.3 and Python:
Code: Select all
def perform_so(model_file, ik_file, grf_file, grf_xml, reserve_actuators,
results_dir):
"""Performs Static Optimization using OpenSim.
Parameters
----------
model_file: str
OpenSim model (.osim)
ik_file: str
kinematics calculated from Inverse Kinematics
grf_file: str
the ground reaction forces
grf_xml: str
xml description containing how to apply the GRF forces
reserve_actuators: str
path to the reserve actuator .xml file
results_dir: str
directory to store the results
"""
# model
model = opensim.Model(model_file)
# prepare external forces xml file
name = os.path.basename(grf_file)[:-8]
external_loads = opensim.ExternalLoads(model, grf_xml)
external_loads.setExternalLoadsModelKinematicsFileName(ik_file)
external_loads.setDataFileName(grf_file)
external_loads.setLowpassCutoffFrequencyForLoadKinematics(6)
external_loads.printToXML(results_dir + name + '.xml')
# add reserve actuators
force_set = opensim.ForceSet(model, reserve_actuators)
force_set.setMemoryOwner(False) # model will be the owner
for i in range(0, force_set.getSize()):
model.updForceSet().append(force_set.get(i))
# construct static optimization
motion = opensim.Storage(ik_file)
static_optimization = opensim.StaticOptimization()
static_optimization.setStartTime(motion.getFirstTime())
static_optimization.setEndTime(motion.getLastTime())
static_optimization.setUseModelForceSet(True)
static_optimization.setUseMusclePhysiology(True)
static_optimization.setActivationExponent(2)
static_optimization.setConvergenceCriterion(0.0001)
static_optimization.setMaxIterations(100)
# model.addAnalysis(static_optimization)
model.updAnalysisSet().adoptAndAppend(static_optimization)
# analysis
analysis = opensim.AnalyzeTool(model)
analysis.setName(name)
analysis.setModel(model)
analysis.setInitialTime(motion.getFirstTime())
analysis.setFinalTime(motion.getLastTime())
analysis.setLowpassCutoffFrequency(6)
analysis.setCoordinatesFileName(ik_file)
analysis.setExternalLoadsFileName(results_dir + name + '.xml')
analysis.setLoadModelAndInput(True)
analysis.setResultsDir(results_dir)
analysis.run()
so_force_file = results_dir + name + '_StaticOptimization_force.sto'
so_activations_file = results_dir + name + \
'_StaticOptimization_activation.sto'
return (so_force_file, so_activations_file)
https://github.com/opensim-org/opensim-core/issues/2076
- Felix Laufer
- Posts: 4
- Joined: Wed Aug 29, 2018 12:34 am
Re: Running StaticOptimization from C++
Great! Thank you very much!