|
Each example shows first the Matlab-code
and second the code you would
need to perform the same actions using the C-programming
language. 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 */
|
|