The Optotrak Toolbox: Sample programs.

Volker Franz, University of Tübingen, Germany

Each example shows first the Matlab-code and second the code you would need to perform the same actions using the C-programming language. You can see two things: (a) the Matlab code using the Optotrak Toolbox is much shorter and more efficient than C (b) it is nevertheless a 1-to-1 translation of the relevant C-commands. Please select the sample you want to view:

View Matlab-file and C-file on this page Matlab-file C-file
sample1 sample1.m sample1.c
sample2 sample2.m sample2.c
sample5 sample5.m sample5.c
sample7 sample7.m sample7.c
sample8 sample8.m sample8.c
sample9 sample9.m sample9.c
sample10 sample10.m sample10.c
sample20 sample20.m sample20.c

Matlab-code for sample9:

 
%Name:             SAMPLE9.M

%Description:

%    OPTOTRAK Sample Program #9.

%    1.  Load the system of transputers with the appropriate
%        transputer programs.
%    2.  Initiate communications with the transputer system.
%    3.  Set the optional processing flags to do on-host 3D conversions
%        and 6D transformations.
%    4.  Load the appropriate camera parameters.
%    5.  Set up an OPTOTRAK collection.
%    6.  Add a rigid body to the OPTOTRAK System tracking list
%        using a .RIG file.
%    7.  Activate the IRED markers.
%    8.  Request/receive/display 10 frames of rigid body transformations.
%    9.  De-activate the IRED markers.
%   10.  Disconnect the PC application program from the transputer
%        system.

%Just to be on the save side, we first reset all Matlab functions:
clear functions

%Settings for Optotrak collection:
coll.NumMarkers      =6;          %Number of markers in the collection.         
coll.FrameFrequency  =50 ;        %Frequency to collect data frames at.          
coll.MarkerFrequency =2500;       %Marker frequency for marker maximum on-time. 
coll.Threshold       =30;         %Dynamic or Static Threshold value to use.    
coll.MinimumGain     =160;        %Minimum gain code amplification to use.      
coll.StreamData      =1;          %Stream mode for the data buffers.            
coll.DutyCycle       =0.4;        %Mar  if(OptotrakDeActivateMarkers())optoNDIerror();
coll.Voltage         =7.5;        %Voltage to use when turning on markers.      
coll.CollectionTime  =5;          %Number of seconds of data to collect.        
coll.PreTriggerTime  =0;          %Number of seconds to pre-trigger data by.    
coll.Flags={'OPTOTRAK_BUFFER_RAW_FLAG'};

%Settings for identifying the rigid bodies:
NumRigids = 1;
RBfileset.RigidBodyIndex = 1; %Index associated with this rigid body.
RBfileset.StartMarker    = 1; %First marker in the rigid body
RBfileset.RigFile        = 'plate';%RIG file containing rigid body coordinates

%Set optional processing flags (this overides the settings in OPTOTRAK.INI).
optotrak('OptotrakSetProcessingFlags',{'OPTO_LIB_POLL_REAL_DATA',
                    'OPTO_CONVERT_ON_HOST',
                    'OPTO_RIGID_ON_HOST'});

%Load the system of transputers.
optotrak('TransputerLoadSystem','system');

%Wait one second to let the system finish loading.
pause(1);

%Initialize the transputer system.
optotrak('TransputerInitializeSystem',{'OPTO_LOG_ERRORS_FLAG'})

%Load the standard camera parameters.
optotrak('OptotrakLoadCameraParameters','standard');

%Set up a collection for the OPTOTRAK.
optotrak('OptotrakSetupCollection',coll);

% Add a rigid body for tracking to the OPTOTRAK system from a .RIG file.
%todo: allow empty flags!!!
optotrak('RigidBodyAddFromFile',RBfileset);

%Wait one second to let the camera adjust.
pause(1);

%Activate the markers.
optotrak('OptotrakActivateMarkers')

%Get and display 10 frames of rigid body data.
fprintf('Rigid Body Data Display\n');
for FrameCnt = 1:10
  %Get a frame of data.
  data=optotrak('DataGetLatestTransforms',coll.NumMarkers,NumRigids);

  % Print out the data:
  fprintf('\n');
  fprintf('Frame Number: %8u\n',data.FrameNumber);
  fprintf('Transforms  : %8u\n',data.NumRigids);
  fprintf('Flags       :   0x%04x\n',data.Flags);
  for RigidCnt = 1:data.NumRigids
    fprintf('Rigid Body %u\n',RigidCnt);
    fprintf('%s\n',data.Rigids{RigidCnt}.TransformError);
    fprintf('XT = %8.2f YT = %8.2f ZT = %8.2f\n',...
            data.Rigids{RigidCnt}.Trans(1),...
            data.Rigids{RigidCnt}.Trans(2),...
            data.Rigids{RigidCnt}.Trans(3));
    fprintf('Y  = %8.2f P  = %8.2f R  = %8.2f\n',...
            data.Rigids{RigidCnt}.RotEuler(1),...
            data.Rigids{RigidCnt}.RotEuler(2),...
            data.Rigids{RigidCnt}.RotEuler(3));
  end
end

%De-activate the markers.
optotrak('OptotrakDeActivateMarkers')

%Shutdown the transputer message passing system.
optotrak('TransputerShutdownSystem')

%Exit the program.
fprintf('\nProgram execution complete.\n');

Corresponding C-code for sample9:

/*****************************************************************
Name:             SAMPLE9.C

Description:

    OPTOTRAK Sample Program #9.

    1.  Load the system of transputers with the appropriate
        transputer programs.
    2.  Initiate communications with the transputer system.
    3.  Set the optional processing flags to do on-host 3D conversions
        and 6D transformations.
    4.  Load the appropriate camera parameters.
    5.  Set up an OPTOTRAK collection.
    6.  Add a rigid body to the OPTOTRAK System tracking list
        using a .RIG file.
    7.  Activate the IRED markers.
    8.  Request/receive/display 10 frames of rigid body transformations.
    9.  De-activate the IRED markers.
   10.  Disconnect the PC application program from the transputer
        system.

*****************************************************************/

/*****************************************************************
C Library Files Included
*****************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#ifdef _MSC_VER
void sleep( unsigned int uSec );
#elif __BORLANDC__
#include <dos.h>
#elif __WATCOMC__
#include <dos.h>
#endif

/*****************************************************************
ND Library Files Included
*****************************************************************/
#include "ndtypes.h"
#include "ndpack.h"
#include "ndopto.h"

/*****************************************************************
Defines:
*****************************************************************/

#define NUM_MARKERS     6
#define FRAME_RATE      (float)50.0
#define COLLECTION_TIME (float)5.0

/*
 * Constants for identifying the rigid bodies.
 */
#define NUM_RIGID_BODIES    1
#define RIGID_BODY_ID       0

/*****************************************************************
Static Structures and Types:
*****************************************************************/

/*
 * Type definition to retrieve and access rigid body transformation
 * data.
 */
typedef struct RigidBodyDataStruct
{
    struct OptotrakRigidStruct  pRigidData[ NUM_RIGID_BODIES];
    Position3d                  p3dData[ NUM_MARKERS];
} RigidBodyDataType;

/*****************************************************************
Name:               main

Input Values:
    int
        argc        :Number of command line parameters.
    unsigned char
        *argv[]     :Pointer array to each parameter.

Output Values:
    None.

Return Value:
    None.

Description:

    Main program routine performs all steps listed in the above
    program description.

*****************************************************************/
void main( int argc, unsigned char *argv[] )
{
    unsigned int
        uFlags,
        uElements,
        uFrameCnt,
        uRigidCnt,
        uFrameNumber;
    RigidBodyDataType
        RigidBodyData;
    char
        szNDErrorString[MAX_ERROR_STRING_LENGTH + 1];

    /*
     * Set optional processing flags (this overides the settings in OPTOTRAK.INI).
     */
    if( OptotrakSetProcessingFlags( OPTO_LIB_POLL_REAL_DATA |
                                    OPTO_CONVERT_ON_HOST |
                                    OPTO_RIGID_ON_HOST ) )
    {
        goto ERROR_EXIT;
    } /* if */

    /*
     * Load the system of transputers.
     */
    if( TransputerLoadSystem( "system" ) )
    {
        goto ERROR_EXIT;
    } /* if */

    /*
     * Wait one second to let the system finish loading.
     */
    sleep( 1 );

    /*
     * Initialize the transputer system.
     */
    if( TransputerInitializeSystem( OPTO_LOG_ERRORS_FLAG ) )
    {
        goto ERROR_EXIT;
    } /* if */

    /*
     * Load the standard camera parameters.
     */
    if( OptotrakLoadCameraParameters( "standard" ) )
    {
        goto ERROR_EXIT;
    } /* if */

    /*
     * Set up a collection for the OPTOTRAK.
     */
    if( OptotrakSetupCollection(
            NUM_MARKERS,        /* Number of markers in the collection. */
            FRAME_RATE,         /* Frequency to collect data frames at. */
            (float)2500.0,      /* Marker frequency for marker maximum on-time. */
            30,                 /* Dynamic or Static Threshold value to use. */
            160,                /* Minimum gain code amplification to use. */
            1,                  /* Stream mode for the data buffers. */
            (float)0.4,         /* Marker Duty Cycle to use. */
            (float)7.5,         /* Voltage to use when turning on markers. */
            COLLECTION_TIME,    /* Number of seconds of data to collect. */
            (float)0.0,         /* Number of seconds to pre-trigger data by. */
            OPTOTRAK_BUFFER_RAW_FLAG ) )
    {
        goto ERROR_EXIT;
    } /* if */

    /*
     * Add a rigid body for tracking to the OPTOTRAK system from a .RIG file.
     */
    if( RigidBodyAddFromFile(
            RIGID_BODY_ID,  /* ID associated with this rigid body.*/
            1,              /* First marker in the rigid body.*/
            "plate",        /* RIG file containing rigid body coordinates.*/
            0 ) )           /* Flags. */
    {
        goto ERROR_EXIT;
    } /* if */

    /*
     * Wait one second to let the camera adjust.
     */
    sleep( 1 );

    /*
     * Activate the markers.
     */
    if( OptotrakActivateMarkers() )
    {
        goto ERROR_EXIT;
    } /* if */

    /*
     * Get and display ten frames of rigid body data.
     */
    fprintf( stdout, "Rigid Body Data Display\n" );
    for( uFrameCnt = 0; uFrameCnt < 10; ++uFrameCnt )
    {
        /*
         * Get a frame of data.
         */
        if( DataGetLatestTransforms( &uFrameNumber, &uElements, &uFlags,
                                     &RigidBodyData ) )
        {
            goto ERROR_EXIT;
        } /* if */

        /*
         * Check the returned flags member for improper transforms.
         */
        if( RigidBodyData.pRigidData->flags & OPTOTRAK_UNDETERMINED_FLAG )
        {
            fprintf( stdout, "\nUndetermined transform!" );
            if( RigidBodyData.pRigidData->flags & OPTOTRAK_RIGID_ERR_MKR_SPREAD )
            {
                fprintf( stdout, " Marker spread error." );
            } /* if */
            continue;
        } /* if */

        /*
         * Print out the valid data.
         */
        fprintf( stdout, "\n" );
        fprintf( stdout, "Frame Number: %8u\n", uFrameNumber );
        fprintf( stdout, "Transforms  : %8u\n", uElements );
        fprintf( stdout, "Flags       :   0x%04x\n", uFlags );
        for( uRigidCnt = 0; uRigidCnt < uElements; ++uRigidCnt )
        {
            fprintf( stdout, "Rigid Body %u\n",
                     RigidBodyData.pRigidData[ uRigidCnt].RigidId );
            fprintf( stdout, "XT = %8.2f YT = %8.2f ZT = %8.2f\n",
                     RigidBodyData.pRigidData[ uRigidCnt].transformation.
                         euler.translation.x,
                     RigidBodyData.pRigidData[ uRigidCnt].transformation.
                         euler.translation.y,
                     RigidBodyData.pRigidData[ uRigidCnt].transformation.
                         euler.translation.z );
            fprintf( stdout, "Y  = %8.2f P  = %8.2f R  = %8.2f\n",
                     RigidBodyData.pRigidData[ uRigidCnt].transformation.
                         euler.rotation.yaw,
                     RigidBodyData.pRigidData[ uRigidCnt].transformation.
                         euler.rotation.pitch,
                     RigidBodyData.pRigidData[ uRigidCnt].transformation.
                         euler.rotation.roll );
        } /* for */
    } /* for */

    /*
     * De-activate the markers.
     */
    if( OptotrakDeActivateMarkers() )
    {
        goto ERROR_EXIT;
    } /* if */

    /*
     * Shutdown the transputer message passing system.
     */
    if( TransputerShutdownSystem() )
    {
        goto ERROR_EXIT;
    } /* if */

    /*
     * Exit the program.
     */
    fprintf( stdout, "\nProgram execution complete.\n" );
    exit( 0 );

ERROR_EXIT:
    if( OptotrakGetErrorString( szNDErrorString,
                                MAX_ERROR_STRING_LENGTH + 1 ) == 0 )
    {
        fprintf( stdout, szNDErrorString );
    } /* if */
    OptotrakDeActivateMarkers();
    TransputerShutdownSystem();
    exit( 1 );

} /* main */