Page 1 of 1
Adjusting ExternalForces through Matlab scripting interface
Posted: Fri Jul 14, 2017 7:43 am
by pavlossilv
Hello all,
I am transitioning to scripting with Matlab to accees the OpenSim API. I am trying to "rewrite" a forward dynamics pipeline I had running in Matlab that just wrote xml setup files and passsed them to OpenSim.
I have managed to set up the model and adjust it as I like, as well as set up the FDtool. However I am struggling to get my head around a couple of concepts.
1) When we want to apply a time varying external force (eg. grf or impact force) do we add it to the model or the FDtool? From what I understand we add it to the model but I cannot get it to work with PerscribedForce, ExternalLoads or ExternalForce. The force data that I am trying to pass to the script is from an external file so it maybe that I am not entering correctly as a opensim-Vector. The reason I want to get the force data into the script is so that I can change different parrameters (eg. point of application, magnitude and direction...) programmatically. Should I just do this separately outside OpenSim environment?
2)When setting up the FDTool is it necessary to pass a general .xml FD setup file?
Thank you for your help!!
Best regards,
Pavlos
Re: Adjusting ExternalForces through Matlab scripting interface
Posted: Sat Jul 15, 2017 10:01 pm
by tkuchida
When we want to apply a time varying external force (eg. grf or impact force) do we add it to the model or the FDtool?
Have you tried
setExternalLoadsFileName() (
https://simtk.org/api_docs/opensim/api_ ... 180eb1d0e7)?
When setting up the FDTool is it necessary to pass a general .xml FD setup file?
No, in MATLAB you should be able to do the following:
Code: Select all
import org.opensim.modeling.*;
fwdtool = ForwardTool();
See the doxygen documentation for ForwardTool (
https://simtk.org/api_docs/opensim/api_ ... dTool.html) which inherits from AbstractTool (
https://simtk.org/api_docs/opensim/api_ ... tTool.html).
Re: Adjusting ExternalForces through Matlab scripting interface
Posted: Mon Jul 17, 2017 6:09 am
by pavlossilv
Hello Tom,
Thank you for your help, I managed to get it working without the initial forward dynamics (FD) setup file.
The fdTool now applies the forces to the model but will not apply the muscle controllers' file I have specified when I call the tool through Matlab. Furthermore, the values in the output ..._contols file of the simulation are all zeros. However when I run the simulation through the GUI with the same forward dynamics setup file, that I create in Matlab and pass to the fdTool, it applies the controllers?! I have not been able to figure this out. I have noticed that in .xml FD set up files there is an anable_controller tag which I cannot find in the API.
Code: Select all
<ControllerSet name="Controllers">
<objects>
<ControlSetController name="">
<enable_controller>ALL</enable_controller>
<controls_file>C:\Users\User\Documents\Pavlos\UniversityofBath\Year4\FYP\Modelling\Simulation_Inputs\Controllers\controls_FR03A00_FL200_EX200.sto</controls_file>
</ControlSetController>
</objects>
</ControllerSet>
My FD setup in Matlab is below:
Code: Select all
fdTool = ForwardTool(); %setUpFile
fdTool.setName(simName);
fdTool.setModel(model);
fdTool.setModelFilename(NewModelFile);
fdTool.setStartTime(timeStart);
fdTool.setFinalTime(timeEnd);
%fdTool.setUseSpecifiedDt(1);
fdTool.setErrorTolerance(errorTol);
fdTool.setMaximumNumberOfSteps(maxIntergratorSteps);
fdTool.setMinDT(minStepSize);
fdTool.setMaxDT(maxStepSize);
fdTool.setOutputPrecision(outputPrecision);
fdTool.setSolveForEquilibrium(1);
fdTool.setControlsFileName(FDControlsFile);
fdTool.setExternalLoadsFileName(grfFile);
%fdTool.setToolOwnsModel(1);
%fdTool.setPrintResultFiles(1);
fdTool.setResultsDir([mainDir 'Outputs\API\Results\'])
fdTool.print([mainDir 'Outputs\API\FDSetUpFiles\' simName '.xml']);
fdTool.run();
Thank you for your help again!
Best regards,
Pavlos
Re: Adjusting ExternalForces through Matlab scripting interface
Posted: Mon Jul 17, 2017 1:37 pm
by tkuchida
Please post example files so I can investigate.
Re: Adjusting ExternalForces through Matlab scripting interface
Posted: Tue Jul 18, 2017 1:35 am
by pavlossilv
Thank you again Tom,
Example force file
Controls file
Model and Matlab script (Bushings are for future use please ignore parameter values)
FD setup file
Best regards,
Pavlos
Re: Adjusting ExternalForces through Matlab scripting interface
Posted: Tue Jul 18, 2017 5:01 am
by tkuchida
The fdTool now applies the forces to the model but will not apply the muscle controllers' file I have specified when I call the tool through Matlab.
It isn't clear (to me, at least) why
fdTool.setControlsFileName() isn't working; I've opened an issue on GitHub to investigate (
https://github.com/opensim-org/opensim-core/issues/1832). In the meantime, you can use the following two-line workaround:
Code: Select all
pc = PrescribedController('controls_FR03A00_FL200_EX200.sto'); %Add these two lines...
model.addController(pc);
state = model.initSystem(); %...before this line in your script.
This workaround will add the controller to the model before it's passed to
ForwardTool.
Re: Adjusting ExternalForces through Matlab scripting interface
Posted: Tue Jul 18, 2017 10:28 am
by pavlossilv
Thank you Tom,
Works well now! Thank you for your help over this!
One last question regarding this:
Is it preferable to add the control file to the ForwardDynamics tool or Prescribe it to the model as you have done?
Best regards,
Pavlos
Re: Adjusting ExternalForces through Matlab scripting interface
Posted: Tue Jul 18, 2017 10:44 am
by tkuchida
Is it preferable to add the control file to the ForwardDynamics tool or Prescribe it to the model as you have done?
There should be no difference in performance;
setControlsFileName() just ends up adding a controller to the model anyway. Actually, the PrescribedController approach gives you more flexibility because you can specify the interpolation method.
Re: Adjusting ExternalForces through Matlab scripting interface
Posted: Wed Jul 19, 2017 1:11 am
by pavlossilv
Thank you for all your help Tom, much appreciated!!