Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

The standard file format for Motion Capture and the biomechanics community is C3D. C3D is a flexible format that can store marker, forces, forceplate, EMG, and event data. Despite being very flexible, data on C3D files are stored as binary and requires specialized readers to access. To read more information on the C3D file format, we encourage you to visit the C3D.org to learn more. 

From OpenSim 4.0 API includes methods for reading C3D data into OpenSim formatted files. The OpenSim C3DFileAdapter() class uses a forked version of Arnaud Barre's BTK package. Use of the C3DFileAdapter , C3D reading and conversion into OpenSim formats are available. Currently, use of C3D reading is limited to C++ and scripting with example code belowand we will be working to make GUI C3D reading native in future releases. The easiest way of using OpenSim to read 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

Reading C3D files through Matlab

...

osimC3D

We have included a Matlab side class that can be used to perform some common operations, such as rotating data, converting data into Matlab data types, and writing marker and force data to OpenSim file format. The Matlab file can be found in your resources directory /Code/Matlab/c3dExportUtilities/osimC3D.m.  

C3DFileAdapter()

To use the OpenSim classes directly, follow the code below. This code will give you OpenSim Times Series Tables for both markers and forcesAn example of using the osimC3D function is (expandable) below. Here we read a C3D file containing markers and forces, get some information about the data (rate, number of markers, number of forces), rotate the data, write the markers to a .trc file, and the forces to a .mot file. 

Expand

Reading C3D files through Python and C++

Some example code for using C3DFileAdapter through Python can be found below. This code is part of a test script that runs the C3D reader and writes data marker and force data to a storage (.sto) file

Expand
Expand
Code Block
%% Read C3D into memory
% Import OpenSim Library
import org.opensim.modeling.*
 
% Instantiate a C3DFileAdapter()
c3dAdapter = C3DFileAdapter();
% Read c3d data
data = c3dAdapter.read('walking2.c3d');
% Get a TimesSeriesTable with all the marker Data
markers = data.get('markers');
% Get a TimeSeriesTable with all the Force Data
forces = data.get('forces');

osimC3D

We have included a Matlab side class that can be used to perform some common operations, such as rotating data, converting data into Matlab data types, and writing marker and force data to OpenSim file format. The Matlab file can be found in your resources directory /Code/Matlab/Utilities/osimC3D.m

...

Some example code for using C3DFileAdapter through Python can be found below. 

def test_C3DFileAdapter(self):
        try:
            adapter = osim.C3DFileAdapter()
        except AttributeError:
            # C3D support not available. OpenSim was not compiled with BTK.
            return
        tables = adapter.read(os.path.join(test_dir, 'walking2.c3d'), 0)
        markers = tables['markers']
        forces = tables['forces']
         
        tables = adapter.read(os.path.join(test_dir, 'walking5.c3d'), 1)
 
        # Marker data read from C3D.
        markers = tables['markers']
      
        # Flatten marker data.
        markersFlat = markers.flatten()
      
        # Make sure flattenned marker data is writable/readable to/from file.
        markersFilename = 'markers.sto'
        stoAdapter = osim.STOFileAdapter()
        stoAdapter.write(markersFlat, markersFilename)
        markersDouble = stoAdapter.read(markersFilename)
      
        # Forces data read from C3d.
        forces = tables['forces']
        fpCalMats = forces.getTableMetaDataVectorMatrix("CalibrationMatrices")
        fpCorners = forces.getTableMetaDataVectorMatrix("Corners")
        fpOrigins = forces.getTableMetaDataVectorMatrix("Origins")
      
        # Flatten forces data.
        forcesFlat = forces.flatten()
      
        # Make sure flattenned forces data is writable/readable to/from file.
        forcesFilename = 'forces.sto'
        stoAdapter.write(forcesFlat, forcesFilename)
        forcesDouble = stoAdapter.read(forcesFilename)
      
        # Clean up.
        os.remove(markersFilename)
        os.remove(forcesFilename)

 

 

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 values. 

Expand

 

 

Panel
borderColorgray
bgColorwhite
borderWidth5
borderStylesolid

Next: Scaling

Previous: Tools for Preparing Motion Data 

Home: Preparing Your Data

...