219 lines (179 with data), 8.6 kB
#ifndef MOCAP_INPUT_DATA_TYPE
#define MOCAP_INPUT_DATA_TYPE "C3D"
#endif
#ifndef MOCAP_C3D_DATA_PATH
#path MOCAP_C3D_DATA_PATH "<MOCAP_PATH_MAINFILEDIR>"
#endif
#ifndef MOCAP_CREATE_PARAMETER_ID_SHORTCUT
#if MOCAP_INPUT_DATA_TYPE == "BVH"
#define MOCAP_CREATE_PARAMETER_ID_SHORTCUT 0
#else
#define MOCAP_CREATE_PARAMETER_ID_SHORTCUT 1
#endif
#endif
// Prefix which can be used by the application to distinques trials
#ifndef MOCAP_OUTPUT_FILENAME_PREFIX
#define MOCAP_OUTPUT_FILENAME_PREFIX ""
#endif
// Extra prefix which is used by the test framework to avoid overwriting
// the orignal files when running automated tests of the AnyMoCap.
#ifndef MOCAP_TEST_FILENAME_PREFIX
#define MOCAP_TEST_FILENAME_PREFIX ""
#endif
#ifndef BODY_MODEL_CONFIG_FILE
#path BODY_MODEL_CONFIG_FILE "ExampleFiles/BodyModelConfig_FullBody.any"
#endif
#ifndef MOCAP_EXTRA_DRIVERS_FILE
#path MOCAP_EXTRA_DRIVERS_FILE "ExampleFiles/ExtraDrivers_PlugInGait.any"
#endif
#ifndef MOCAP_MARKER_PROTOCOL_FILE
#path MOCAP_MARKER_PROTOCOL_FILE "ExampleFiles/MarkerProtocol_PlugInGait.any"
// HACK workaround add a dummy designvar when the model is loaded without
// markers
Main.Studies.ParameterIdentification = {AnyDesVar dummy = {Val = 0;};};
#endif
#ifndef MOCAP_USE_GRF_PREDICTION
#define MOCAP_USE_GRF_PREDICTION OFF
#endif
#ifndef MOCAP_FILTER_JOINT_ANGLES
#define MOCAP_FILTER_JOINT_ANGLES OFF
#endif
#ifndef MOCAP_HUMAN_GROUND_RESIDUALS
#if (MOCAP_USE_GRF_PREDICTION == ON)
#define MOCAP_HUMAN_GROUND_RESIDUALS "PelvisWeak"
#else
#define MOCAP_HUMAN_GROUND_RESIDUALS "Pelvis"
#endif
#endif
#if (MOCAP_USE_GRF_PREDICTION == ON) & (MOCAP_HUMAN_GROUND_RESIDUALS != "PelvisWeak")
AnyMessage AnyMoCap_msg1=
{
TriggerPreProcess = 1;
Type = MSG_Error;
Message = strformat("Do NOT manually define value for MOCAP_HUMAN_GROUND_RESIDUALS when using GRF prediction");
};
#endif
#if MOCAP_INPUT_DATA_TYPE == "C3D"
C3DFileData = {
AnyFolder config_warnings = {
AnyInt filter_transients_warning = warn(
orfun(
andfun(
ltfun(
Main.ModelSetup.C3DFileData.Header.FirstFrameNo/Main.ModelSetup.C3DFileData.Header.VideoFrameRate + 0.04,
Main.Studies.MarkerTracking.tArray[0]
),
gtfun(
Main.ModelSetup.C3DFileData.Header.LastFrameNo/Main.ModelSetup.C3DFileData.Header.VideoFrameRate - 0.04,
Main.Studies.MarkerTracking.tArray[0]
)
),
orfun(
ltfun(
(Main.ModelSetup.C3DFileData.Header.LastFrameNo-Main.ModelSetup.C3DFileData.Header.FirstFrameNo)
/Main.ModelSetup.C3DFileData.Header.VideoFrameRate,
0.1
),
orfun(eqfun(Main.ModelSetup.TrialSpecificData.nStep, 1), eqfun(Main.ModelSetup.C3DFileData.MarkerFilterIndex, -1))
)
),
strformat("\n"+
"------------------------------------------------------------------------------------------------------\n"+
" The tStart/tEnd are very close to the start/end times of the data in the C3D file. \n"+
" This can cause inaccurate kinematics at the very start/end of the simulation due to \n"+
" low-pass filter transients. Consider changing the start/end times of the simulation. \n"+
"-------------------------------------------------------------------------------------------------------\n"));
AnyMessage short_c3d_file_warning1 =
{
Type = MSG_Warning;
TriggerPreProcess = andfun(
ltfun(
Main.ModelSetup.C3DFileData.Header.LastFrameNo-Main.ModelSetup.C3DFileData.Header.FirstFrameNo+1,
8
),
gtfun(
Main.ModelSetup.C3DFileData.Header.LastFrameNo-Main.ModelSetup.C3DFileData.Header.FirstFrameNo+1,
1
)
);
Message = strformat("\n"+
"------------------------------------------------------------------------------------------------------\n"+
" The number of frames in the C3D files is less than 8. This causes problems with both lowpass filters\n"+
" and b-spline interpolation. \n"+
" \n"+
" Note: It is still possible to use C3D files with exactly one frame if low-pass filters are disabled.\n"+
"-------------------------------------------------------------------------------------------------------\n");
};
AnyMessage short_c3d_file_warning2 =
{
Type = MSG_Warning;
TriggerConst = andfun(
gteqfun(Main.ModelSetup.C3DFileData.MarkerFilterIndex,0),
eqfun(Main.ModelSetup.C3DFileData.Header.LastFrameNo-Main.ModelSetup.C3DFileData.Header.FirstFrameNo+1, 1)
);
Message = strformat("\n"+
"------------------------------------------------------------------------------------------------------\n"+
" Marker filters must be disabled when using files with only a single frame.\n"+
" I.e. set: ``C3DFileData.MarkerFilterIndex = -1;``\n"+
"-------------------------------------------------------------------------------------------------------\n");
};
};
};
#endif
#ifndef MOCAP_FORCE_PLATE_FILE
#path MOCAP_FORCE_PLATE_FILE "ExampleFiles/ForcePlates_Type2.any"
#endif
//IF the AnyMoCapModel is loaded directly: add a example c3d file
#if ANYBODY_FILENAME_MAINFILE == "AnyMoCapModel.any" & MOCAP_NAME_MAINFILEDIR == "Model"
Main.ModelSetup.TrialSpecificData.TrialFileName = "C3D_ExampleFile";
#endif
#ifndef MOCAP_C3DSETTINGS
#path MOCAP_C3DSETTINGS "C3DSettings.any"
#endif
#ifndef MOCAP_BVHSETTINGS
#path MOCAP_BVHSETTINGS "BVHSettings.any"
#endif
#ifndef BM_CONFIG_VALUES
#define BM_CONFIG_VALUES ON
#endif
Macros =
{
AnyFolder AnyMoCapWarnings =
{
AnySwitchVar filter_analog_zero_phase_warning = warn(
GET_INT_DEFAULT("Main.ModelSetup.C3DFileData.LowPassFilter.FilterForwardBackwardOnOff", 1),
strformat("\n"+
"------------------------------------------------------------------------------------------------------\n"+
" C3DFileData.LowPassFilter.FilterForwardBackwardOnOff is set to Off. This is probably not wanted \n"+
" since it causes a group delay in the force data. Consider switching this setting to On \n"+
"-------------------------------------------------------------------------------------------------------\n")
);
AnySwitchVar filter_marker_zero_phase_warning = warn(
GET_INT_DEFAULT("Main.ModelSetup.C3DFileData.Filter.FilterForwardBackwardOnOff", 1),
strformat("\n"+
"------------------------------------------------------------------------------------------------------\n"+
" C3DFileData.Filter.FilterForwardBackwardOnOff is set to Off. This is probably not wanted \n"+
" since it causes a group delay in the marker data. Consider switching this setting to On.\n"+
"-------------------------------------------------------------------------------------------------------\n")
);
#ifndef MOCAP_DISABLE_GRAVITY_CHECK
AnyVec3 GravityDirection = Main.Studies.InverseDynamicStudy.Gravity/vnorm(Main.Studies.InverseDynamicStudy.Gravity);
AnyObjectPtrArray ptrForcePlateDir = DesignVar(ObjSearchRecursive("Main.EnvironmentModel.ForcePlates","*.Corners.DownDirection"));
AnyInt nFP = NumElemOf(ptrForcePlateDir);
// Difference between forceplate down directions and gravity
// This is implemented a bit complicated to handle the case of no forceplates
AnyFloat GravityDiff = reshape(flatten(Obj2Num(ptrForcePlateDir)),{3, nFP})
- reshape(repmat(nFP, GravityDirection),{3, nFP});
AnyFloat AbsDiff = max( arrcat( abs(flatten(GravityDiff)), {0.0}));
AnySwitchVar Gravity_direction = warn(ltfun(AbsDiff, 0.5),
strformat("\n"+
"------------------------------------------------------------------------------------------------------\n"+
" Gravity appears inconsistant with one or more of the force plates. This might be an error. \n"+
" \n"+
" Please check that Main.ModelSetup.LabSpecificData.Gravity is specified correctly. \n"+
" Set ``#define MOCAP_DISABLE_GRAVITY_CHECK`` to suppress this check. \n"+
"-------------------------------------------------------------------------------------------------------\n")
);
#endif
};
};