Scripting with Matlab
- 1 Setting up your Matlab Scripting Environment
- 2 Loading OpenSim Libraries
- 3 Finding the Methods Available for a Class in the OpenSim Libraries
- 4 Utilities
- 5 Example Scripts
- 6 Reading in and Writing Data to File
- 7 Adding Geometry Paths to Matlab
- 8 Using a model's "Lists" through iterators
- 9 Using PropertyHelper to set Property values for plugin classes
- 10 Show OpenSim's log messages in the Matlab Command Window
- 11 Additional information
- 12 Troubleshooting
Setting up your Matlab Scripting Environment
These instructions assume that you've already installed OpenSim version 4.0 or later (see Installation Guide for more info). As noted above, OpenSim 4.0 requires 64-bit Matlab.
Launch MATLAB. If you're using Windows and you have OpenSim 3.x configured with Matlab, make sure to "Run as administrator" (available by right-clicking the MATLAB application in the start menu, etc.).
Change your Current Folder to the OpenSim Matlab Scripts directory. On Windows, by default, this is C:/Users/<username>/Documents/OpenSim/4.0/Code/Matlab.
Run the configureOpenSim.m file from the current folder. The script will prompt you to choose your OpenSim installation directory (we will refer to this as OPENSIM_INSTALL_DIR). On Windows, by default, this is C:/OpenSim 4.0.
When the script finishes, you should see a dialog box notifying you if the script succeeded. If the script did not succeed, read the output in the command window for more information.
Windows users: ensure that the OPENSIM_INSTALL_DIR/bin directory (e.g., C:/OpenSim 4.0/bin) appears in your system PATH environment variable, and that it appears before any other OpenSim installations you may have on your PATH. The steps to set your path are shown in the animated image below. Double click the image to zoom in. Or see here for additional help on setting your PATH environment variable.
Restart MATLAB; the OpenSim libraries will not be recognized until doing so.
Test that everything is configured correctly: In the command window, run the following:
Test that OpenSim is properly configured with MATLAB
>>> org.opensim.modeling.opensimCommon.GetVersion() % This should print the version of OpenSim that you've configured with MATLABThe configureOpenSim.m file will detect any installations of OpenSim that were previously configured with MATLAB, and will "remove" them from MATLAB (the other OpenSim installations are not deleted, they are simply no longer configured with MATLAB). The configureOpenSim.m file also backs up any changes it makes to MATLAB configuration files.
Loading OpenSim Libraries
Once you have set up the OpenSim-Matlab environment you must import the OpenSim libraries to be able to have access to the OpenSim classes. Since imported libraries are not Global variables, you must import the libraries at the beginning of all scripts or functions that use OpenSim classes. This included nested functions or classes.
To Load the OpenSim Libraries in Matlab
>> import org.opensim.modeling.* % Import OpenSim LibrariesFinding the Methods Available for a Class in the OpenSim Libraries
Often, it is difficult to know exactly what methods are available for an OpenSim class (e.g., Model, Muscle) and so using the API Documentation regularly will be useful. However, you can very quickly get a list of the available methods and the interfaces to those methods by using the built-in Matlab functions methods and methodsview().
methods() will output a list of all the methods available for a given OpenSim class to the MATLAB command window. Below is an example of methods you can call on the Model class. A list of methods is printed to the command window (cut off here since the list is very long).
View all methods in an OpenSim class
>> methods(Model)
Methods for class Model:
LoadOpenSimLibrary getDefaultSubsystem notifyAll
Model getDescription overrideAllActuators
PrintPropertyInfo getDiscreteVariableValue postScale
RegisterType getDisplayHints preScale
RenameType getDocumentFileName print
SafeCopy getDocumentFileVersion printBasicInfo
addAnalysis getFilePath printComponentsMatching
addBody getForceSet printControlStorage
addComponent getForceSubsystem printDetailedInfo
addConstraint getForceUnits printInputInfo
addContactGeometry getFrameList printOutputInfo
addController getFunctionClassNames printSocketInfo
addForce getGravity printSubcomponentInfo
addJoint getGravityForce readObjectFromXMLNodeOrFile
... ... ...
methodsview() is useful to get a list of the methods and the method signatures (arguments, return type) for an OpenSim class. When calling methodsview(), a Matlab pop-up window will be generated that shows the method names, the arguments you can input, and the return type.
View all method signatures in an OpenSim class
>> myModel = Model()
>> methodsview(myModel)
Tab-completion can be used to get quick access to a method name and is most useful when you know the method name (or the first few letters of the method name). In the GIF below, the tab key is pressed after "myModel." is typed to open the tab-completion window.
Utilities
OpenSim provides utility functions for some common tasks. If you have installed OpenSim, these scripts are located in the resources directory (e.g., C:/Users/<username>/Documents/OpenSim/4.0/Code/Matlab/Utilities).
File Name(s) | Description |
|---|---|
osimC3D.m | Import data from a C3D file to OpenSim Tables. See the c3dExport.m example below for a use case. |
osimTableFromStruct.m | Convert between an OpenSim Table and Matlab Struct. These utilities convert between OpenSim TimeSeriesTables (a new storage format from OpenSIm 4.0 for time series data, details below) and Matlab Structs. Be aware that any metadata in your Table will be lost when you convert to a Matlab Struct. |
osimVec3FromArray.m | Convert between an OpenSim Vec3 and a Matlab Array.
|
osimList2MatlabCell.m | Get a Matlab cell array populated with an OpenSim's Model's list (e.g., Body). See the section "Using a model's "Lists" through iterators" below for more details and usage. |
Example Scripts
If you have installed OpenSim, these scripts are located in the resources directory (e.g., C:/Users/<username>/Documents/OpenSim/4.0/Code/Matlab).
File Name(s) | Description |
|---|---|
c3dExport.m | Load a C3D file into OpenSim Tables and write out the marker and force data to corresponding .trc and .mot files. |
OpenSimCreateTugOfWarModel.m | Generate a simple tug of war model, run a simulation, and visualize the results. |
prescribeMotionInModel.m | Create an OpenSim model with coordinates prescribed according to an input motion file. It uses a helper function defined in the script createPrescribedMotionModel. |
setupAndRunAnalyzeBatchExample.m | Generate OpenSim Setup Files for the Analyze>MuscleAnalysis tool and runs the Analyze tool. You must run setupAndRunIKBatchExample first to generate the motion files used in this example. |
setupAndRunIKBatchExample.m | Run multiple inverse kinematics trials for the model Subject01 located in the subfolder "testData/subject01". User must specify the results directory (e.g. "IKResults"), the .osim model (e.g. "subject01_gait2392_scaled.osim"), and the .trc files (e.g. in folder "MarkerData"). To see the results, load the model and IK output in the GUI. |
simpleOptimizerExample.m | Run a simple optimization to find the elbow flexion angle where the moment arm of the biceps femoris short head is maximized. |
strengthScaler.m | Functionthat loads a model and itsmuscles,then creates a new model where all muscles are scaled by a common scale factor. Takes 3 inputs: 1) the path and name of an existing OpenSim model, 2) the path and name of the new model to be outputted, and 3) the scale factor. If no input model names are given, the user is prompted to choose a model to scale and all muscle strengths are doubled. |
wiringInputsAndOutputsWithTableReporter.m | Create a Reporter and wire the Inputs and Outputs necessary to report the system's center of mass. |