...
Starting with OpenSim 4.0, C3D reading and conversion into OpenSim formats is available. Currently, use of C3D reading is limited to C++ and scripting and we will be working to support direct C3D reading in the GUI in future releases. The easiest way to use OpenSim to read your C3D data is through the Matlab interface. Once you have setup OpenSim use in Matlab, you can read C3D files and write marker and force data to .trc and .mot file formats, easily.
Starting with OpenSim 4.2, OpenSim defaults to using ezc3d (https://github.com/pyomeca/ezc3d) to parse c3d files.
Note |
---|
Prior to OpenSim version 4.2, C3DFileAdapter only supports supported reading Type-2 Force plates (AMTI & Bertec) . If you have a and not Type-3 (Kistler), or any other type, please consider donating your C3D files of forceplate data to the OpenSim project. To contribute C3D files, please email opensim@stanford.edu.however this limitation has been lifted with the use of ezC3D in version 4.2 and moving forward. Please contact the support of ezc3d project above if you run into issues using it. |
Table of Contents | ||
---|---|---|
|
...
- read a C3D file containing markers and forces,
- get some information about the data (rate, number of markers, and number of forces),
- rotate the data, and
then write the markers to a .trc file, and the forces to a .mot file.
Expand Code Block language java title Export C3D Matlab %% Load OpenSim libs import org.opensim.modeling.* %% Get the path to a C3D file [filename, path] = uigetfile('*.c3d'); c3dpath = fullfile(path,filename); %% Construct an opensimC3D object with input c3d path % Constructor takes full path to c3d file and an integer for forceplate % representation in output forces file (0 = electrical center, 1 = COP). c3d = osimC3D(c3dpath,useCenterOfPressureAsMomentsPoint); %% Get some stats... % Get the number of marker trajectories nTrajectories = c3d.getNumTrajectories(); % Get the marker data rate rMakers = c3d.getRate_marker(); % Get the number of forces nForces = c3d.getNumForces(); % Get the force data rate rForces = c3d.getRate_force(); % Get Start and end time t0 = c3d.getStartTime(); tn = c3d.getEndTime(); %% Rotate the data c3d.rotateData('x',-90) %% Get the c3d in different forms % Get OpenSim tables markerTable = c3d.getTable_markers(); forceTable = c3d.getTable_forces(); % Get as Matlab Structures [markerStruct forceStruct] = c3d.getAsStructs(); %% Convert COP (mm to m) and Moments (Nmm to Nm) if convertLengthUnits c3d.convertMillimeters2Meters(); end %% Write the marker and force data to file % Define output file names basename = strtok(filename,'.'); markersFilename = strcat(basename,'_markers.trc'); switch useCenterOfPressureAsMomentsPoint case 0 forcesFilename = strcat(basename,'_forces_EC.mot'); case 1 forcesFilename = strcat(basename,'_forces_COP.mot'); end % Write marker data to trc file. c3d.writeTRC(markersFilename); % Write force data to mot file. c3d.writeMOT(forcesFilename);
Reading C3D files through Python and C++
...
Example code for using the C3DFileAdapter in C++ is found below. This code is part of a test script that runs the C3D reader and checks for correct valueswrites the resulting tables to files.
OpenSim 4.4
Expand |
---|
Converting Force, COP, and NaNs
...
|
Importing Force Data: COP and NaNs
When you import your force data, you can use the origin of the force plate or center of pressure (COP) to express the forces. The C3DFileAdapter includes an input parameter (ForceLocation) that allows you to choose OriginOfForcePlate or CenterOfPressure. Using the COP is helpful for visualization, but can lead to NaN values. In particular, when the force values go to zero, the COP value is undefined (NaN). This is problematic during Inverse Dynamics analysis as you will get all NaN values for the output moments. This is because OpenSim splines the force and COP data before computing joint moments and don't know how to deal with NaN valuesthe splines are undefined in the presence of NaNs for your input data. If you find that your mot files are containing NaNs for COPs after conversion, you don't necessarily have to perform additional computations to remove the NaNs. The C3DFileAdapter includes an input parameter that determines how the forces are represented, so you can use the appropriate input parameter to have the forces and moments represented at the origin of the plate, rather than as a COP. This negates any chance for NaNs being included in your forces OriginOfForcePlate flag when you import your C3D data.
Panel | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
Next: Tools for Preparing Motion Data Previous: Storage (.sto) Files Home: Preparing Your Data |
...