From 40d58125547859595952004a23fd06e2aa6cb35b Mon Sep 17 00:00:00 2001 From: bke Date: Thu, 19 Dec 2024 13:58:10 +0100 Subject: [PATCH 1/7] 2par iteration 2 --- .../ArmData1.1/ArmModelMuscleParameters.any | 2 +- .../BodyModel.BodyPartsSetup.any | 2 +- .../BodyModel.ClassTemplates.any | 27 ++ .../GenericBodyModel/BodyModel.constants.any | 2 + .../BodyModel.defaults.preprocess.any | 15 + .../CalibrationStudy.ClassTemplates.any | 110 +++++++ .../GenericBodyModel/Calibration/RValues.any | 12 + .../Calibration/RangeOfMotionDefinition.any | 85 ++++++ .../GenericBodyModel/CalibrationSequence.any | 39 ++- .../Documentation/BodyModel.parameters.any | 2 +- .../Calibration/2ParLeftCalStudies.any | 192 +++++++++++++ .../Calibration/2ParRightCalStudies.any | 269 ++++++++++++++++++ .../LegTLEM/TLEM2.2/ModelMuscleParameters.any | 2 +- .../TLEM1.2/ModelMuscleParameters.any | 2 +- .../TrunkModelMuscleParameters.any | 2 +- Body/AAUHuman/bm-parameters.toml | 9 +- Tests/Calibration/libdef.any | 1 + .../test_2par_cal_default_symmetric.any | 0 .../test_calibration_lowerbody.any | 150 ++++++++++ .../test_calibration_upperbody.any | 0 Tests/test_calibration_lowerbody.any | 93 ------ 21 files changed, 909 insertions(+), 107 deletions(-) create mode 100644 Body/AAUHuman/BodyModels/GenericBodyModel/BodyModel.ClassTemplates.any create mode 100644 Body/AAUHuman/BodyModels/GenericBodyModel/Calibration/CalibrationStudy.ClassTemplates.any create mode 100644 Body/AAUHuman/BodyModels/GenericBodyModel/Calibration/RValues.any create mode 100644 Body/AAUHuman/BodyModels/GenericBodyModel/Calibration/RangeOfMotionDefinition.any create mode 100644 Body/AAUHuman/LegTLEM/Calibration/2ParLeftCalStudies.any create mode 100644 Body/AAUHuman/LegTLEM/Calibration/2ParRightCalStudies.any create mode 100644 Tests/Calibration/libdef.any create mode 100644 Tests/Calibration/test_2par_cal_default_symmetric.any create mode 100644 Tests/Calibration/test_calibration_lowerbody.any rename Tests/{ => Calibration}/test_calibration_upperbody.any (100%) delete mode 100644 Tests/test_calibration_lowerbody.any diff --git a/Body/AAUHuman/Arm/ArmData1.1/ArmModelMuscleParameters.any b/Body/AAUHuman/Arm/ArmData1.1/ArmModelMuscleParameters.any index 32cc367f2..d5ee2da0c 100644 --- a/Body/AAUHuman/Arm/ArmData1.1/ArmModelMuscleParameters.any +++ b/Body/AAUHuman/Arm/ArmData1.1/ArmModelMuscleParameters.any @@ -63,7 +63,7 @@ #define _TENDON_LENGTH_DESIGNVAR(x) (x) #define _FIBER_LENGTH_DESIGNVAR(x) DesignVar(x) #endif -#if BM_CALIBRATION_TYPE == _CALIBRATION_TYPE_2PAR_ +#if (BM_CALIBRATION_TYPE == _CALIBRATION_TYPE_2PAR_) | (BM_CALIBRATION_TYPE == _EXPERIMENTAL_CALIBRATION_TYPE_2PAR_) #define _TENDON_LENGTH_DESIGNVAR(x) (x) #define _FIBER_LENGTH_DESIGNVAR(x) (x) #endif diff --git a/Body/AAUHuman/BodyModels/GenericBodyModel/BodyModel.BodyPartsSetup.any b/Body/AAUHuman/BodyModels/GenericBodyModel/BodyModel.BodyPartsSetup.any index 131ead996..83df0b9e0 100644 --- a/Body/AAUHuman/BodyModels/GenericBodyModel/BodyModel.BodyPartsSetup.any +++ b/Body/AAUHuman/BodyModels/GenericBodyModel/BodyModel.BodyPartsSetup.any @@ -88,7 +88,7 @@ // // Muscle Calibration related logic // -#if BM_CALIBRATION_TYPE == _CALIBRATION_TYPE_2PAR_ & BM_TRUNK_CERVICAL_RHYTHM == OFF +#if (BM_CALIBRATION_TYPE == _CALIBRATION_TYPE_2PAR_) | (BM_CALIBRATION_TYPE == _EXPERIMENTAL_CALIBRATION_TYPE_2PAR_) & BM_TRUNK_CERVICAL_RHYTHM == OFF AnyInt bm_cervical_rhythm_notice1= notice(0, strformat("\n"+ "------------------------------------------------------------------------------------------------------\n"+ diff --git a/Body/AAUHuman/BodyModels/GenericBodyModel/BodyModel.ClassTemplates.any b/Body/AAUHuman/BodyModels/GenericBodyModel/BodyModel.ClassTemplates.any new file mode 100644 index 000000000..34fe67010 --- /dev/null +++ b/Body/AAUHuman/BodyModels/GenericBodyModel/BodyModel.ClassTemplates.any @@ -0,0 +1,27 @@ +/** + Class Template for providing the folder structure of the body model +*/ +#class_template BodyModelFolderStructure() { + AnyFolder Trunk = { + AnyFolder Right = {}; + AnyFolder Left = {}; + }; + AnyFolder Right = { + AnyFolder ShoulderArm = {}; + AnyFolder Leg = { + AnyFolder Hip = {}; + AnyFolder Knee = {}; + AnyFolder Ankle = {}; + AnyFolder SubTalar = {}; + }; + }; + AnyFolder Left = { + AnyFolder ShoulderArm = {}; + AnyFolder Leg = { + AnyFolder Hip = {}; + AnyFolder Knee = {}; + AnyFolder Ankle = {}; + AnyFolder SubTalar = {}; + }; + }; +}; \ No newline at end of file diff --git a/Body/AAUHuman/BodyModels/GenericBodyModel/BodyModel.constants.any b/Body/AAUHuman/BodyModels/GenericBodyModel/BodyModel.constants.any index 67ba46b21..b0ac6d50f 100644 --- a/Body/AAUHuman/BodyModels/GenericBodyModel/BodyModel.constants.any +++ b/Body/AAUHuman/BodyModels/GenericBodyModel/BodyModel.constants.any @@ -120,6 +120,8 @@ #define _CALIBRATION_TYPE_2PAR_ 2 +#define _EXPERIMENTAL_CALIBRATION_TYPE_2PAR_ 3 + #define _CALIBRATION_TYPE_CUSTOM_ 0 #define CONST_MUSCLES_NONE 0 diff --git a/Body/AAUHuman/BodyModels/GenericBodyModel/BodyModel.defaults.preprocess.any b/Body/AAUHuman/BodyModels/GenericBodyModel/BodyModel.defaults.preprocess.any index 7a6400ec4..1a4949cdd 100644 --- a/Body/AAUHuman/BodyModels/GenericBodyModel/BodyModel.defaults.preprocess.any +++ b/Body/AAUHuman/BodyModels/GenericBodyModel/BodyModel.defaults.preprocess.any @@ -230,6 +230,21 @@ #endif +#ifdef BM_CALIBRATION_TYPE +#if BM_CALIBRATION_TYPE == _EXPERIMENTAL_CALIBRATION_TYPE_2PAR_ +#ifdef BM_LEG_MODEL +#if BM_LEG_MODEL == _LEG_MODEL_TLEM1_ + AnyInt not_implemented_calibration_for_TLEM1 = warn(0, strformat("\n"+ + "------------------------------------------------------------------------------------------------------\n"+ + " The Experimental 2-parameter calibration routine (BM_CALIBRATION_TYPE == _EXPERIMENTAL_CALIBRATION_TYPE_2PAR_ \n"+ + " is not compatible with The Twente Lower Extremity Model v.1 (TLEM1). \n"+ + " Please use the TLEM 2 (which is default or set: #define BM_LEG_MODEL _LEG_MODEL_TLEM2_) \n"+ + "-------------------------------------------------------------------------------------------------------")); +#endif +#endif +#endif +#endif + diff --git a/Body/AAUHuman/BodyModels/GenericBodyModel/Calibration/CalibrationStudy.ClassTemplates.any b/Body/AAUHuman/BodyModels/GenericBodyModel/Calibration/CalibrationStudy.ClassTemplates.any new file mode 100644 index 000000000..01039d516 --- /dev/null +++ b/Body/AAUHuman/BodyModels/GenericBodyModel/Calibration/CalibrationStudy.ClassTemplates.any @@ -0,0 +1,110 @@ +/** + Class template for creating a model that can be used to calibrate the legs +*/ +#class_template LegCalibrationModel(Side, BodyModelRef) { + AnyComponentDefinition CDef = {}; + + #var AnyFloat HipPositions; + #var AnyFloat KneePositions; + #var AnyFloat AnklePositions; + #var AnyFloat SubTalarPositions; + + AnyFolder &Pelvis = BodyModelRef.Trunk.Segments.PelvisSeg; + AnyFolder &Sacrum = BodyModelRef.Trunk.Segments.SacrumSeg; + AnyFolder &Thorax = BodyModelRef.Trunk.Segments.ThoraxSeg; + + AnySeg &L1 = BodyModelRef.Trunk.Segments.L1Seg; + AnySeg &L2 = BodyModelRef.Trunk.Segments.L2Seg; + AnySeg &L3 = BodyModelRef.Trunk.Segments.L3Seg; + AnySeg &L4 = BodyModelRef.Trunk.Segments.L4Seg; + AnySeg &L5 = BodyModelRef.Trunk.Segments.L5Seg; + + AnyFolder &LumbarJoints = BodyModelRef.Trunk.Joints.Lumbar; + + AnyFolder &LegSegments = BodyModelRef.Side.Leg.Seg; + AnyFolder &LegJoints = BodyModelRef.Side.Leg.Jnt; + + AnyFolder &Muscles = BodyModelRef.Side.Leg.Mus; + + // Constraints + AnyFixedRefFrame ground = { + AnyRefNode node = { + ARel = ..Pelvis.Axes0; + sRel = ..Pelvis.r0; + }; + }; + + AnyKinEq ThoraxFix = { + AnyKinMeasure& PelvisThoraxExtension = BodyModelRef.Interface.Trunk.PelvisThoraxExtension; + AnyKinMeasure& PelvisThoraxLateralBending = BodyModelRef.Interface.Trunk.PelvisThoraxLateralBending; + AnyKinMeasure& PelvisThoraxRotation = BodyModelRef.Interface.Trunk.PelvisThoraxRotation; + }; + + AnyKinEq PelvisFix = { + AnyKinLinear Lin = { + AnyRefFrame &ground = ..ground.node; + AnyRefFrame &Pelvis = ..Pelvis; + }; + AnyKinRotational Rot = { + Type = RotAxesAngles; + AnyRefFrame &ground = ..ground.node; + AnyRefFrame &Pelvis = ..Pelvis; + }; + }; + + AnyKinEqInterPolDriver Hip = { + AnyKinRotational &Spherical = .BodyModelRef.Interface.Side.HipFlexion.HipMeasure; + Type = PiecewiseLinear; + T = linspace(0,1,SizesOf(Data)[1]); + Data = .HipPositions * pi/180; + Reaction.Type = {Off, Off, Off}; + }; + + AnyKinEqInterPolDriver Knee = { + AnyKinMeasure& Hinge = .BodyModelRef.Interface.Side.KneeFlexion; + Type = PiecewiseLinear; + T = linspace(0,1,SizesOf(Data)[1]); + Data = {.KneePositions} * pi/180; + Reaction.Type = {Off}; + }; + + AnyKinEqInterPolDriver Ankle = { + AnyKinMeasure& Hinge = .BodyModelRef.Interface.Side.AnklePlantarFlexion; + Type = PiecewiseLinear; + T = linspace(0,1,SizesOf(Data)[1]); + Data = {.AnklePositions} * pi/180; + Reaction.Type = {Off}; + }; + + AnyKinEqInterPolDriver SubTalar = { + AnyKinMeasure& Hinge = .BodyModelRef.Interface.Side.SubTalarEversion; + Type = PiecewiseLinear; + T = linspace(0,1,SizesOf(Data)[1]); + Data = {.SubTalarPositions} * pi/180; + Reaction.Type = {Off}; + }; +}; + + +/** + Class template for creating calibrationstudies with same settings + */ +#class_template LegCalibrationStudy( + __CLASS__ = AnyBodyCalibrationStudy, + BodyModelRef, + Side, +) { + // Study settings + FiberAndTendonLengthAdjustment.CalibrateTendonAtMaxForceOnOff = Off; + Kinematics.SmallStepAssumptionOnOff = Off; + InitialConditions.SmallStepAssumptionOnOff = Off; + Kinematics.PosAnalysisOnlyOnOff = On; + InitialConditions.PosAnalysisOnlyOnOff = On; + + LegCalibrationModel ModelRef(Side=Side, BodyModelRef=BodyModelRef) = { + HipPositions = .HipPositions; + KneePositions = .KneePositions; + AnklePositions = .AnklePositions; + SubTalarPositions = .SubTalarPositions; + }; +}; diff --git a/Body/AAUHuman/BodyModels/GenericBodyModel/Calibration/RValues.any b/Body/AAUHuman/BodyModels/GenericBodyModel/Calibration/RValues.any new file mode 100644 index 000000000..4e499262c --- /dev/null +++ b/Body/AAUHuman/BodyModels/GenericBodyModel/Calibration/RValues.any @@ -0,0 +1,12 @@ +/** + Folder containing different R values (ratios of muscle fiber length to optimal fiber + length) for different purposes. +*/ +AnyFolder RValues = { + AnyFloat RMinNoMuscleForce = 0.5; + AnyFloat RMinDefault = 0.6; + + AnyFloat RMaxDefault = 1.2; + AnyFloat RMaxActiveStretching = 1.3; + AnyFloat RMaxPassiveForceEqualToFMax = 1.5; +}; \ No newline at end of file diff --git a/Body/AAUHuman/BodyModels/GenericBodyModel/Calibration/RangeOfMotionDefinition.any b/Body/AAUHuman/BodyModels/GenericBodyModel/Calibration/RangeOfMotionDefinition.any new file mode 100644 index 000000000..6bd5c2349 --- /dev/null +++ b/Body/AAUHuman/BodyModels/GenericBodyModel/Calibration/RangeOfMotionDefinition.any @@ -0,0 +1,85 @@ +/** + Folder containing the range of motion for the joints in the body model. The folder + also contains Predefined Positions for each joint. Can be used by calibration + studies. Hip positions are {Flexion/Extension, Abduction/Adduction, + Internal/External Rotation} angles Knee positions are {Flexion/Extension} angles + Ankle positions are {Plantar/Dorsi flexion, Inversion/Eversion} angles +*/ +BodyModelFolderStructure RangeOfMotion() = { + Right.Leg.Hip = { + // TODO: bke - TBC DO we want more levels for the degree of freedom? + // Hip.ExternalRotation = {AnyFloat Min, AnyFloat Max}; ?? + AnyVar MaxExternalRotationAngle ??= 30; + AnyVar MaxInternalRotationAngle ??= -30; + AnyVar MaxAdductionAngle ??= -15; + AnyVar MaxAdductionInExtensionAngle ??= -10; + AnyVar MaxAbductionAngle ??= 40; + AnyVar MaxFlexionAngle ??= 120; + AnyVar MaxExtensionAngle ??= -20; + AnyVar MaxExtensionInAdductionAngle ??= -10; + AnyVar MaxFlexionInAbductionAngle ??= 90; + AnyVar MinFlexionInAdduction ??= 5; + + // Hip positions + AnyFloat Neutral ??= { 0, 0, 0 }; + AnyFloat InternallyRotated ??= { 0, 0, MaxInternalRotationAngle }; + AnyFloat ExternallyRotated ??= { 0, 0, MaxExternalRotationAngle }; + AnyFloat Adduction ??= { MinFlexionInAdduction, MaxAdductionAngle, 0}; + AnyFloat Flexed ??= { MaxFlexionAngle, 0, 0}; + AnyFloat FlexedAndAdducted ??= { MaxFlexionAngle, MaxAdductionAngle, 0}; + AnyFloat FlexedAndAbducted ??= { MaxFlexionInAbductionAngle, MaxAbductionAngle, 0}; + AnyFloat Extended ??= { MaxExtensionAngle, 0, 0}; + AnyFloat ExtendedAndAdducted ??= { MaxExtensionInAdductionAngle, MaxAdductionInExtensionAngle, 0}; + AnyFloat AbductedAndExternallyRotated ??= {0, MaxAbductionAngle, MaxExternalRotationAngle}; + }; + + Right.Leg.Knee = { + AnyVar MaxFlexionAngle ??= 130; + AnyVar MaxExtensionAngle ??= -3; + }; + + Right.Leg.Ankle = { + AnyVar MaxPlantarFlexionAngle ??= 45; + AnyVar MaxDorsiFlexionAngle ??= -20; + AnyVar MaxInversionAngle ??= 15; + AnyVar MaxEversionAngle ??= -20; + }; + + // Left side is by default a mirror of the right side + Left.Leg.Hip = { + AnyVar MaxExternalRotationAngle ??= ...Right.Leg.Hip.MaxExternalRotationAngle; + AnyVar MaxInternalRotationAngle ??= ...Right.Leg.Hip.MaxInternalRotationAngle; + AnyVar MaxAdductionAngle ??= ...Right.Leg.Hip.MaxAdductionAngle; + AnyVar MaxAdductionInExtensionAngle ??= ...Right.Leg.Hip.MaxAdductionInExtensionAngle; + AnyVar MaxAbductionAngle ??= ...Right.Leg.Hip.MaxAbductionAngle; + AnyVar MaxFlexionAngle ??= ...Right.Leg.Hip.MaxFlexionAngle; + AnyVar MaxExtensionAngle ??= ...Right.Leg.Hip.MaxExtensionAngle; + AnyVar MaxExtensionInAdductionAngle ??= ...Right.Leg.Hip.MaxExtensionInAdductionAngle; + AnyVar MaxFlexionInAbductionAngle ??= ...Right.Leg.Hip.MaxFlexionInAbductionAngle; + AnyVar MinFlexionInAdduction ??= ...Right.Leg.Hip.MinFlexionInAdduction; + + // Hip positions + AnyFloat Neutral ??= ...Right.Leg.Hip.Neutral; + AnyFloat InternallyRotated ??= ...Right.Leg.Hip.InternallyRotated; + AnyFloat ExternallyRotated ??= ...Right.Leg.Hip.ExternallyRotated; + AnyFloat Adduction ??= ...Right.Leg.Hip.Adduction; + AnyFloat Flexed ??= ...Right.Leg.Hip.Flexed; + AnyFloat FlexedAndAdducted ??= ...Right.Leg.Hip.FlexedAndAdducted; + AnyFloat FlexedAndAbducted ??= ...Right.Leg.Hip.FlexedAndAbducted; + AnyFloat Extended ??= ...Right.Leg.Hip.Extended; + AnyFloat ExtendedAndAdducted ??= ...Right.Leg.Hip.ExtendedAndAdducted; + AnyFloat AbductedAndExternallyRotated ??= ...Right.Leg.Hip.AbductedAndExternallyRotated; +}; + + Left.Leg.Knee = { + AnyVar MaxFlexionAngle ??= ...Right.Leg.Knee.MaxFlexionAngle; + AnyVar MaxExtensionAngle ??= ...Right.Leg.Knee.MaxExtensionAngle; + }; + + Left.Leg.Ankle = { + AnyVar MaxPlantarFlexionAngle ??= ...Right.Leg.Ankle.MaxPlantarFlexionAngle; + AnyVar MaxDorsiFlexionAngle ??= ...Right.Leg.Ankle.MaxDorsiFlexionAngle; + AnyVar MaxInversionAngle ??= ...Right.Leg.Ankle.MaxInversionAngle; + AnyVar MaxEversionAngle ??= ...Right.Leg.Ankle.MaxEversionAngle; + }; +}; \ No newline at end of file diff --git a/Body/AAUHuman/BodyModels/GenericBodyModel/CalibrationSequence.any b/Body/AAUHuman/BodyModels/GenericBodyModel/CalibrationSequence.any index c32d6232e..b000aeb10 100644 --- a/Body/AAUHuman/BodyModels/GenericBodyModel/CalibrationSequence.any +++ b/Body/AAUHuman/BodyModels/GenericBodyModel/CalibrationSequence.any @@ -1,10 +1,22 @@ -//This file controls which calibrations to be made on the model +//This file controls which calibrations to be made on the model +#include "Calibration/CalibrationStudy.ClassTemplates.any" +#include "BodyModel.ClassTemplates.any" + AnyFolder Calibration={ AnyComponentDefinition obj = {}; #if BM_CALIBRATION_TYPE == _CALIBRATION_TYPE_2PAR_ - AnyFloat RMin = DesignVar(0.5); ///< Muscle fiber length's ratio to the optimal fiber length at the lower extreme for the given range of motion. - AnyFloat RMax = DesignVar(1.0); ///< Muscle fiber length's ratio to the optimal fiber length at the upper extreme for the given range of motion. + AnyFloat RMin = DesignVar(0.5); ///< Muscle fiber length's ratio to the optimal fiber length at the lower extreme for the given range of motion. + AnyFloat RMax = DesignVar(1.0); ///< Muscle fiber length's ratio to the optimal fiber length at the upper extreme for the given range of motion. + #endif + + #if BM_CALIBRATION_TYPE ==_EXPERIMENTAL_CALIBRATION_TYPE_2PAR_ + + + #include "Calibration/RValues.any" + #include "Calibration/RangeOfMotionDefinition.any" + + #endif #if BM_LEG_RIGHT & BM_LEG_MODEL_IS_TLEM & (BM_LEG_MUSCLES_RIGHT == _MUSCLES_3E_HILL_) @@ -18,6 +30,9 @@ AnyFolder Calibration={ }; #include "/Calibration/CalibrationSequenceRight2Par.any" #endif + #if (BM_CALIBRATION_TYPE == _EXPERIMENTAL_CALIBRATION_TYPE_2PAR_) & (BM_LEG_MODEL != _LEG_MODEL_TLEM1_) + #include "/Calibration/2ParRightCalStudies.any" + #endif #if BM_CALIBRATION_TYPE == _CALIBRATION_TYPE_CUSTOM_ // Allow user to implement their own calibration #endif @@ -34,6 +49,9 @@ AnyFolder Calibration={ }; #include "/Calibration/CalibrationSequenceLeft2Par.any" #endif + #if (BM_CALIBRATION_TYPE == _EXPERIMENTAL_CALIBRATION_TYPE_2PAR_) & (BM_LEG_MODEL != _LEG_MODEL_TLEM1_) + #include "/Calibration/2ParLeftCalStudies.any" + #endif #if BM_CALIBRATION_TYPE == _CALIBRATION_TYPE_CUSTOM_ // Allow user to implement their own calibration #endif @@ -65,6 +83,10 @@ AnyFolder Calibration={ // 2Par PEFactor will be set here #include "../../Arm/Calibration/CalibrationSequenceRight2Par.any" #endif + #if BM_CALIBRATION_TYPE == _EXPERIMENTAL_CALIBRATION_TYPE_2PAR_ + // 2Par PEFactor will be set here + #include "../../Arm/Calibration/CalibrationSequenceRight2Par.any" + #endif #if BM_CALIBRATION_TYPE == _CALIBRATION_TYPE_CUSTOM_ // Allow user to implement their own calibration #endif @@ -78,6 +100,10 @@ AnyFolder Calibration={ // 2Par PEFactor will be set here #include "../../Arm/Calibration/CalibrationSequenceLeft2Par.any" #endif + #if BM_CALIBRATION_TYPE == _EXPERIMENTAL_CALIBRATION_TYPE_2PAR_ + // 2Par PEFactor will be set here + #include "../../Arm/Calibration/CalibrationSequenceLeft2Par.any" + #endif #if BM_CALIBRATION_TYPE == _CALIBRATION_TYPE_CUSTOM_ // Allow user to implement their own calibration #endif @@ -91,6 +117,10 @@ AnyFolder Calibration={ // 2Par PEFactor will be set here #include "../../Trunk/Calibration/MuscleCalibrationSequence2Par.any" #endif + #if BM_CALIBRATION_TYPE == _EXPERIMENTAL_CALIBRATION_TYPE_2PAR_ + // 2Par PEFactor will be set here + #include "../../Trunk/Calibration/MuscleCalibrationSequence2Par.any" + #endif #if BM_CALIBRATION_TYPE == _CALIBRATION_TYPE_CUSTOM_ // Allow user to implement their own calibration #endif @@ -104,10 +134,7 @@ AnyFolder Calibration={ #endif #endif - AnyOperationSequence CalibrationSequence ={ AnyOperationDummy PlaceHolderOpr = {}; }; - - }; diff --git a/Body/AAUHuman/Documentation/BodyModel.parameters.any b/Body/AAUHuman/Documentation/BodyModel.parameters.any index 39e3827fb..fdfd0b32d 100644 --- a/Body/AAUHuman/Documentation/BodyModel.parameters.any +++ b/Body/AAUHuman/Documentation/BodyModel.parameters.any @@ -276,7 +276,7 @@ // Parameter to choose type of muscle tendon calibration // #define BM_CALIBRATION_TYPE _CALIBRATION_TYPE_1PAR_ -// Possible values: _CALIBRATION_TYPE_1PAR_, _CALIBRATION_TYPE_2PAR_, _CALIBRATION_TYPE_CUSTOM_, +// Possible values: _CALIBRATION_TYPE_1PAR_, _CALIBRATION_TYPE_2PAR_, _EXPERIMENTAL_CALIBRATION_TYPE_2PAR_, _CALIBRATION_TYPE_CUSTOM_, // Switch for the mannequin driver being active or not diff --git a/Body/AAUHuman/LegTLEM/Calibration/2ParLeftCalStudies.any b/Body/AAUHuman/LegTLEM/Calibration/2ParLeftCalStudies.any new file mode 100644 index 000000000..335b3daa0 --- /dev/null +++ b/Body/AAUHuman/LegTLEM/Calibration/2ParLeftCalStudies.any @@ -0,0 +1,192 @@ +LegCalibrationStudy LegCalibration1Left( + BodyModelRef=Main.HumanModel.BodyModel, + Side=Left, +) = { + nStep = SizesOf(HipPositions)[1]; + + MuscleArr = ObjSearch( + &..BodyModel.Left.Leg.Mus, + { + "AdductorMagnus*.*", + "AdductorLongus*.*", + "AdductorBrevis*.*", + "Pectineus.*", + "Gracilis.*", + }, + "AnyMuscle" + ); + + RminMuscleFiber = repmat(NumElemOf(MuscleArr), .RValues.RMinDefault); + RmaxMuscleFiber = repmat(NumElemOf(MuscleArr), .RValues.RMaxDefault); + + AnyFloat HipPositions = .LegCalibration1Right.HipPositions; + AnyFloat KneePositions = .LegCalibration1Right.KneePositions; + AnyFloat AnklePositions = .LegCalibration1Right.AnklePositions; + AnyFloat SubTalarPositions = .LegCalibration1Right.SubTalarPositions; +}; + + +LegCalibrationStudy LegCalibration2Left( + BodyModelRef=Main.HumanModel.BodyModel, + Side=Left, +) = { + nStep = SizesOf(HipPositions)[1]; + + MuscleArr = ObjSearch( + &..BodyModel.Left.Leg.Mus, + { + "Gluteus*.*", + "Piriformis.*", + "Gemellus.*", + "Obturator*.*", + "QuadratusFem*.*", + }, + "AnyMuscle" + ); + + RminMuscleFiber = repmat(NumElemOf(MuscleArr), .RValues.RMinDefault); + RmaxMuscleFiber = repmat(NumElemOf(MuscleArr), .RValues.RMaxDefault); + + AnyFloat HipPositions = .LegCalibration2Right.HipPositions; + AnyFloat KneePositions = .LegCalibration2Right.KneePositions; + AnyFloat AnklePositions = .LegCalibration2Right.AnklePositions; + AnyFloat SubTalarPositions = .LegCalibration2Right.SubTalarPositions; +}; + +LegCalibrationStudy LegCalibration3Left( + BodyModelRef=Main.HumanModel.BodyModel, + Side=Left, +) = { + nStep = SizesOf(HipPositions)[1]; + + MuscleArr = ObjSearch( + &..BodyModel.Left.Leg.Mus, + { + "Iliacus*.*", + }, + "AnyMuscle" + ); + + RminMuscleFiber = repmat(NumElemOf(MuscleArr), .RValues.RMinDefault); + RmaxMuscleFiber = repmat(NumElemOf(MuscleArr), .RValues.RMaxDefault); + + AnyFloat HipPositions = .LegCalibration3Right.HipPositions; + AnyFloat KneePositions = .LegCalibration3Right.KneePositions; + AnyFloat AnklePositions = .LegCalibration3Right.AnklePositions; + AnyFloat SubTalarPositions = .LegCalibration3Right.SubTalarPositions; +}; + +LegCalibrationStudy LegCalibration4Left( + BodyModelRef=Main.HumanModel.BodyModel, + Side=Left, +) = { + nStep = SizesOf(HipPositions)[1]; + + MuscleArr = ObjSearch( + &..BodyModel.Left.Leg.Mus, + { + "TensorFasciaeLatae.*", + }, + "AnyMuscle" + ); + + RminMuscleFiber = repmat(NumElemOf(MuscleArr), .RValues.RMinDefault); + RmaxMuscleFiber = repmat(NumElemOf(MuscleArr), .RValues.RMaxDefault); + + AnyFloat HipPositions = .LegCalibration4Right.HipPositions; + AnyFloat KneePositions = .LegCalibration4Right.KneePositions; + AnyFloat AnklePositions = .LegCalibration4Right.AnklePositions; + AnyFloat SubTalarPositions = .LegCalibration4Right.SubTalarPositions; +}; + +LegCalibrationStudy LegCalibration5Left( + BodyModelRef=Main.HumanModel.BodyModel, + Side=Left, +) = { + nStep = SizesOf(HipPositions)[1]; + + MuscleArr = ObjSearch( + &..BodyModel.Left.Leg.Mus, + { + "RectusFem*.*", + "BicepsFem*.*", + "Semitend*.*", + "Semimem*.*", + "Sartorius.*", + }, + "AnyMuscle" + ); + + RminMuscleFiber = repmat(NumElemOf(MuscleArr), .RValues.RMinDefault); + RmaxMuscleFiber = repmat(NumElemOf(MuscleArr), .RValues.RMaxDefault); + + AnyFloat HipPositions = .LegCalibration5Right.HipPositions; + AnyFloat KneePositions = .LegCalibration5Right.KneePositions; + AnyFloat AnklePositions = .LegCalibration5Right.AnklePositions; + AnyFloat SubTalarPositions = .LegCalibration5Right.SubTalarPositions; +}; + +LegCalibrationStudy LegCalibration6Left( + BodyModelRef=Main.HumanModel.BodyModel, + Side=Left, +) = { + nStep = SizesOf(HipPositions)[1]; + + MuscleArr = ObjSearch( + &..BodyModel.Left.Leg.Mus, + { + "Vastus*.*", + "Popliteus.*", + }, + "AnyMuscle" + ); + + RminMuscleFiber = repmat(NumElemOf(MuscleArr), .RValues.RMinDefault); + RmaxMuscleFiber = repmat(NumElemOf(MuscleArr), .RValues.RMaxDefault); + + AnyFloat HipPositions = .LegCalibration6Right.HipPositions; + AnyFloat KneePositions = .LegCalibration6Right.KneePositions; + AnyFloat AnklePositions = .LegCalibration6Right.AnklePositions; + AnyFloat SubTalarPositions = .LegCalibration6Right.SubTalarPositions; +}; + +LegCalibrationStudy LegCalibration7Left( + BodyModelRef=Main.HumanModel.BodyModel, + Side=Left, +) = { + nStep = SizesOf(HipPositions)[1]; + + MuscleArr = ObjSearch( + &..BodyModel.Left.Leg.Mus, + { + "Tibialis*.*", + "ExtensorDigi*.*", + "ExtensorHall*.*", + "Soleus*.*", + "FlexorDigi*.*", + "FlexorHall*.*", + "Peroneus*.*", + "Plantaris.*", + "Gastroc*.*", + }, + "AnyMuscle" + ); + + RminMuscleFiber = repmat(NumElemOf(MuscleArr), .RValues.RMinDefault); + RmaxMuscleFiber = repmat(NumElemOf(MuscleArr), .RValues.RMaxDefault); + + AnyFloat HipPositions = .LegCalibration7Right.HipPositions; + AnyFloat KneePositions = .LegCalibration7Right.KneePositions; + AnyFloat AnklePositions = .LegCalibration7Right.AnklePositions; + AnyFloat SubTalarPositions = .LegCalibration7Right.SubTalarPositions; +}; + +CalibrationSequence = { + AnyOperation &Cal1Left = .LegCalibration1Left.FiberAndTendonLengthAdjustment; + AnyOperation &Cal2Left = .LegCalibration2Left.FiberAndTendonLengthAdjustment; + AnyOperation &Cal3Left = .LegCalibration3Left.FiberAndTendonLengthAdjustment; + AnyOperation &Cal4Left = .LegCalibration4Left.FiberAndTendonLengthAdjustment; + AnyOperation &Cal5Left = .LegCalibration5Left.FiberAndTendonLengthAdjustment; + AnyOperation &Cal6Left = .LegCalibration6Left.FiberAndTendonLengthAdjustment; + AnyOperation &Cal7Left = .LegCalibration7Left.FiberAndTendonLengthAdjustment; +}; \ No newline at end of file diff --git a/Body/AAUHuman/LegTLEM/Calibration/2ParRightCalStudies.any b/Body/AAUHuman/LegTLEM/Calibration/2ParRightCalStudies.any new file mode 100644 index 000000000..2fc400673 --- /dev/null +++ b/Body/AAUHuman/LegTLEM/Calibration/2ParRightCalStudies.any @@ -0,0 +1,269 @@ +LegCalibrationStudy LegCalibration1Right( + BodyModelRef=Main.HumanModel.BodyModel, + Side=Right, +) = { + nStep = SizesOf(HipPositions)[1]; + + MuscleArr = ObjSearch( + &..BodyModel.Right.Leg.Mus, + { + "AdductorMagnus*.*", + "AdductorLongus*.*", + "AdductorBrevis*.*", + "Pectineus.*", + "Gracilis.*", + }, + "AnyMuscle" + ); + + RminMuscleFiber = repmat(NumElemOf(MuscleArr), .RValues.RMinDefault); + RmaxMuscleFiber = repmat(NumElemOf(MuscleArr), .RValues.RMaxDefault); + + AnyInt nPos = round(SizesOf(HipPositions)[1] / 2); + AnyFloat HipPositions = repmat(1,2,{ + .RangeOfMotion.Right.Leg.Hip.InternallyRotated, + .RangeOfMotion.Right.Leg.Hip.Adduction, + .RangeOfMotion.Right.Leg.Hip.AbductedAndExternallyRotated, + .RangeOfMotion.Right.Leg.Hip.FlexedAndAdducted, + .RangeOfMotion.Right.Leg.Hip.FlexedAndAbducted, + .RangeOfMotion.Right.Leg.Hip.ExtendedAndAdducted, + }'); + AnyFloat KneePositions = flatten({ + repmat(nPos, .RangeOfMotion.Right.Leg.Knee.MaxFlexionAngle), + repmat(nPos, .RangeOfMotion.Right.Leg.Knee.MaxExtensionAngle) + }); + AnyFloat AnklePositions = zeros(nPos * 2); + AnyFloat SubTalarPositions = zeros(nPos * 2); +}; + +LegCalibrationStudy LegCalibration2Right( + BodyModelRef=Main.HumanModel.BodyModel, + Side=Right, +) = { + nStep = SizesOf(HipPositions)[1]; + + MuscleArr = ObjSearch( + &..BodyModel.Right.Leg.Mus, + { + "Gluteus*.*", + "Piriformis.*", + "Gemellus.*", + "Obturator*.*", + "QuadratusFem*.*", + }, + "AnyMuscle" + ); + + RminMuscleFiber = repmat(NumElemOf(MuscleArr), .RValues.RMinDefault); + RmaxMuscleFiber = repmat(NumElemOf(MuscleArr), .RValues.RMaxDefault); + + AnyInt nPos = round(SizesOf(HipPositions)[1] / 2); + AnyFloat HipPositions = repmat(1,2,{ + .RangeOfMotion.Right.Leg.Hip.InternallyRotated, + .RangeOfMotion.Right.Leg.Hip.Adduction, + .RangeOfMotion.Right.Leg.Hip.FlexedAndAdducted, + .RangeOfMotion.Right.Leg.Hip.Flexed, + .RangeOfMotion.Right.Leg.Hip.FlexedAndAbducted, + .RangeOfMotion.Right.Leg.Hip.AbductedAndExternallyRotated, + .RangeOfMotion.Right.Leg.Hip.Extended, + .RangeOfMotion.Right.Leg.Hip.ExtendedAndAdducted, + .RangeOfMotion.Right.Leg.Hip.ExternallyRotated, + }'); + AnyFloat KneePositions = flatten({ + repmat(nPos, .RangeOfMotion.Right.Leg.Knee.MaxFlexionAngle), + repmat(nPos, .RangeOfMotion.Right.Leg.Knee.MaxExtensionAngle) + }); + AnyFloat AnklePositions = zeros(nPos * 2); + AnyFloat SubTalarPositions = zeros(nPos * 2); +}; + +LegCalibrationStudy LegCalibration3Right( + BodyModelRef=Main.HumanModel.BodyModel, + Side=Right, +) = { + nStep = SizesOf(HipPositions)[1]; + + MuscleArr = ObjSearch( + &..BodyModel.Right.Leg.Mus, + { + "Iliacus*.*", + }, + "AnyMuscle" + ); + + RminMuscleFiber = repmat(NumElemOf(MuscleArr), .RValues.RMinDefault); + RmaxMuscleFiber = repmat(NumElemOf(MuscleArr), .RValues.RMaxDefault); + + AnyInt nPos = round(SizesOf(HipPositions)[1] / 2); + AnyFloat HipPositions = repmat(1,2,{ + .RangeOfMotion.Right.Leg.Hip.FlexedAndAdducted, + .RangeOfMotion.Right.Leg.Hip.Flexed, + .RangeOfMotion.Right.Leg.Hip.Extended, + .RangeOfMotion.Right.Leg.Hip.ExtendedAndAdducted, + }'); + AnyFloat KneePositions = flatten({ + repmat(nPos, .RangeOfMotion.Right.Leg.Knee.MaxFlexionAngle), + repmat(nPos, .RangeOfMotion.Right.Leg.Knee.MaxExtensionAngle) + }); + AnyFloat AnklePositions = zeros(nPos * 2); + AnyFloat SubTalarPositions = zeros(nPos * 2); +}; + +LegCalibrationStudy LegCalibration4Right( + BodyModelRef=Main.HumanModel.BodyModel, + Side=Right, +) = { + nStep = SizesOf(HipPositions)[1]; + + MuscleArr = ObjSearch( + &..BodyModel.Right.Leg.Mus, + { + "TensorFasciaeLatae.*", + }, + "AnyMuscle" + ); + + RminMuscleFiber = repmat(NumElemOf(MuscleArr), .RValues.RMinDefault); + RmaxMuscleFiber = repmat(NumElemOf(MuscleArr), .RValues.RMaxDefault); + + AnyInt nPos = round(SizesOf(HipPositions)[1] / 2); + AnyFloat HipPositions = repmat(1,2,{ + .RangeOfMotion.Right.Leg.Hip.InternallyRotated, + .RangeOfMotion.Right.Leg.Hip.Adduction, + .RangeOfMotion.Right.Leg.Hip.AbductedAndExternallyRotated, + .RangeOfMotion.Right.Leg.Hip.ExtendedAndAdducted, + .RangeOfMotion.Right.Leg.Hip.Extended, + .RangeOfMotion.Right.Leg.Hip.ExternallyRotated, + }'); + AnyFloat KneePositions = flatten({ + repmat(nPos, .RangeOfMotion.Right.Leg.Knee.MaxFlexionAngle), + repmat(nPos, .RangeOfMotion.Right.Leg.Knee.MaxExtensionAngle) + }); + AnyFloat AnklePositions = zeros(nPos * 2); + AnyFloat SubTalarPositions = zeros(nPos * 2); +}; + +LegCalibrationStudy LegCalibration5Right( + BodyModelRef=Main.HumanModel.BodyModel, + Side=Right, +) = { + nStep = SizesOf(HipPositions)[1]; + + MuscleArr = ObjSearch( + &..BodyModel.Right.Leg.Mus, + { + "RectusFem*.*", + "BicepsFem*.*", + "Semitend*.*", + "Semimem*.*", + "Sartorius.*", + }, + "AnyMuscle" + ); + + RminMuscleFiber = repmat(NumElemOf(MuscleArr), .RValues.RMinDefault); + RmaxMuscleFiber = repmat(NumElemOf(MuscleArr), .RValues.RMaxDefault); + + AnyInt nPos = round(SizesOf(HipPositions)[1] / 2); + AnyFloat HipPositions = repmat(1,2,{ + .RangeOfMotion.Right.Leg.Hip.FlexedAndAdducted, + .RangeOfMotion.Right.Leg.Hip.FlexedAndAbducted, + .RangeOfMotion.Right.Leg.Hip.AbductedAndExternallyRotated, + .RangeOfMotion.Right.Leg.Hip.Extended, + .RangeOfMotion.Right.Leg.Hip.ExtendedAndAdducted, + .RangeOfMotion.Right.Leg.Hip.ExternallyRotated, + }'); + AnyFloat KneePositions = flatten({ + repmat(nPos, .RangeOfMotion.Right.Leg.Knee.MaxFlexionAngle), + repmat(nPos, .RangeOfMotion.Right.Leg.Knee.MaxExtensionAngle) + }); + AnyFloat AnklePositions = zeros(nPos * 2); + AnyFloat SubTalarPositions = zeros(nPos * 2); +}; + +LegCalibrationStudy LegCalibration6Right( + BodyModelRef=Main.HumanModel.BodyModel, + Side=Right, +) = { + nStep = SizesOf(HipPositions)[1]; + + MuscleArr = ObjSearch( + &..BodyModel.Right.Leg.Mus, + { + "Vastus*.*", + "Popliteus.*", + }, + "AnyMuscle" + ); + + RminMuscleFiber = repmat(NumElemOf(MuscleArr), .RValues.RMinDefault); + RmaxMuscleFiber = repmat(NumElemOf(MuscleArr), .RValues.RMaxDefault); + + AnyInt nPos = round(SizesOf(HipPositions)[1] / 2); + AnyFloat HipPositions = repmat(1,2,{ + .RangeOfMotion.Right.Leg.Hip.Neutral, + .RangeOfMotion.Right.Leg.Hip.FlexedAndAdducted, + .RangeOfMotion.Right.Leg.Hip.Extended, + }'); + AnyFloat KneePositions = flatten({ + repmat(nPos, .RangeOfMotion.Right.Leg.Knee.MaxFlexionAngle), + repmat(nPos, .RangeOfMotion.Right.Leg.Knee.MaxExtensionAngle) + }); + AnyFloat AnklePositions = zeros(nPos * 2); + AnyFloat SubTalarPositions = zeros(nPos * 2); +}; + +LegCalibrationStudy LegCalibration7Right( + BodyModelRef=Main.HumanModel.BodyModel, + Side=Right, +) = { + nStep = SizesOf(HipPositions)[1]; + + MuscleArr = ObjSearch( + &..BodyModel.Right.Leg.Mus, + { + "Tibialis*.*", + "ExtensorDigi*.*", + "ExtensorHall*.*", + "Soleus*.*", + "FlexorDigi*.*", + "FlexorHall*.*", + "Peroneus*.*", + "Plantaris.*", + "Gastroc*.*", + }, + "AnyMuscle" + ); + + RminMuscleFiber = repmat(NumElemOf(MuscleArr), .RValues.RMinDefault); + RmaxMuscleFiber = repmat(NumElemOf(MuscleArr), .RValues.RMaxDefault); + + AnyInt nPos = round(NumElemOf(AnklePositions) / 2); + AnyFloat HipPositions = zeros(3, nPos * 2); + AnyFloat KneePositions = flatten({ + repmat(nPos, .RangeOfMotion.Right.Leg.Knee.MaxFlexionAngle), + repmat(nPos, .RangeOfMotion.Right.Leg.Knee.MaxExtensionAngle) + }); + AnyFloat AnklePositions = flatten(repmat(2, { + .RangeOfMotion.Right.Leg.Ankle.MaxPlantarFlexionAngle, + 0, + .RangeOfMotion.Right.Leg.Ankle.MaxDorsiFlexionAngle, + 0, + }')); + AnyFloat SubTalarPositions = flatten(repmat(2, { + 0, + .RangeOfMotion.Right.Leg.Ankle.MaxInversionAngle, + 0, + .RangeOfMotion.Right.Leg.Ankle.MaxEversionAngle, + }')); +}; + +CalibrationSequence = { + AnyOperation &Cal1Right = .LegCalibration1Right.FiberAndTendonLengthAdjustment; + AnyOperation &Cal2Right = .LegCalibration2Right.FiberAndTendonLengthAdjustment; + AnyOperation &Cal3Right = .LegCalibration3Right.FiberAndTendonLengthAdjustment; + AnyOperation &Cal4Right = .LegCalibration4Right.FiberAndTendonLengthAdjustment; + AnyOperation &Cal5Right = .LegCalibration5Right.FiberAndTendonLengthAdjustment; + AnyOperation &Cal6Right = .LegCalibration6Right.FiberAndTendonLengthAdjustment; + AnyOperation &Cal7Right = .LegCalibration7Right.FiberAndTendonLengthAdjustment; +}; \ No newline at end of file diff --git a/Body/AAUHuman/LegTLEM/TLEM2.2/ModelMuscleParameters.any b/Body/AAUHuman/LegTLEM/TLEM2.2/ModelMuscleParameters.any index e4bd7df99..f78b83ef6 100644 --- a/Body/AAUHuman/LegTLEM/TLEM2.2/ModelMuscleParameters.any +++ b/Body/AAUHuman/LegTLEM/TLEM2.2/ModelMuscleParameters.any @@ -31,7 +31,7 @@ #define _TENDON_LENGTH_DESIGNVAR(x) (x) #define _FIBER_LENGTH_DESIGNVAR(x) DesignVar(x) #endif -#if BM_CALIBRATION_TYPE == _CALIBRATION_TYPE_2PAR_ +#if BM_CALIBRATION_TYPE == _CALIBRATION_TYPE_2PAR_ | BM_CALIBRATION_TYPE == _EXPERIMENTAL_CALIBRATION_TYPE_2PAR_ #define _TENDON_LENGTH_DESIGNVAR(x) (x) #define _FIBER_LENGTH_DESIGNVAR(x) (x) #endif diff --git a/Body/AAUHuman/LegTLEM1/TLEM1.2/ModelMuscleParameters.any b/Body/AAUHuman/LegTLEM1/TLEM1.2/ModelMuscleParameters.any index 1eabc89ef..ff688f661 100644 --- a/Body/AAUHuman/LegTLEM1/TLEM1.2/ModelMuscleParameters.any +++ b/Body/AAUHuman/LegTLEM1/TLEM1.2/ModelMuscleParameters.any @@ -31,7 +31,7 @@ #define _TENDON_LENGTH_DESIGNVAR(x) (x) #define _FIBER_LENGTH_DESIGNVAR(x) DesignVar(x) #endif -#if BM_CALIBRATION_TYPE == _CALIBRATION_TYPE_2PAR_ +#if BM_CALIBRATION_TYPE == _CALIBRATION_TYPE_2PAR_ | BM_CALIBRATION_TYPE == _EXPERIMENTAL_CALIBRATION_TYPE_2PAR_ #define _TENDON_LENGTH_DESIGNVAR(x) (x) #define _FIBER_LENGTH_DESIGNVAR(x) (x) #endif diff --git a/Body/AAUHuman/Trunk/TrunkData1.1/TrunkModelMuscleParameters.any b/Body/AAUHuman/Trunk/TrunkData1.1/TrunkModelMuscleParameters.any index 335542038..fa53ebd1d 100644 --- a/Body/AAUHuman/Trunk/TrunkData1.1/TrunkModelMuscleParameters.any +++ b/Body/AAUHuman/Trunk/TrunkData1.1/TrunkModelMuscleParameters.any @@ -15,7 +15,7 @@ #define _TENDON_LENGTH_DESIGNVAR(x) (x) #define _FIBER_LENGTH_DESIGNVAR(x) DesignVar(x) #endif -#if BM_CALIBRATION_TYPE == _CALIBRATION_TYPE_2PAR_ +#if BM_CALIBRATION_TYPE == _CALIBRATION_TYPE_2PAR_ | BM_CALIBRATION_TYPE == _EXPERIMENTAL_CALIBRATION_TYPE_2PAR_ #define _TENDON_LENGTH_DESIGNVAR(x) (x) #define _FIBER_LENGTH_DESIGNVAR(x) (x) #endif diff --git a/Body/AAUHuman/bm-parameters.toml b/Body/AAUHuman/bm-parameters.toml index 99c86dfb0..57d79b1a2 100644 --- a/Body/AAUHuman/bm-parameters.toml +++ b/Body/AAUHuman/bm-parameters.toml @@ -327,10 +327,15 @@ default = "2" valuetype = "integer" descr = "Constant to use 2 parameter muscle tendon calibration" +[constants._EXPERIMENTAL_CALIBRATION_TYPE_2PAR_] +default = "3" +valuetype = "integer" +descr = "Constant to use the experimenrtal 2 parameter muscle tendon calibration" + [constants._CALIBRATION_TYPE_CUSTOM_] default = "0" valuetype = "integer" -descr = "Use custom calibration. I.e. diables calibration so the user can add their own code." +descr = "Use custom calibration. I.e. disables calibration so the user can add their own code." [constants.CONST_MUSCLES_NONE] deprecated = "true" @@ -910,7 +915,7 @@ opt = [ "_MORPH_TRUNK_TO_LEG_", "_MORPH_LEG_TO_TRUNK_", "_MORPH_NONE_",] default = "_CALIBRATION_TYPE_1PAR_" valuetype = "integer" descr = "Parameter to choose type of muscle tendon calibration" -opt = [ "_CALIBRATION_TYPE_1PAR_", "_CALIBRATION_TYPE_2PAR_", "_CALIBRATION_TYPE_CUSTOM_",] +opt = [ "_CALIBRATION_TYPE_1PAR_", "_CALIBRATION_TYPE_2PAR_", "_EXPERIMENTAL_CALIBRATION_TYPE_2PAR_", "_CALIBRATION_TYPE_CUSTOM_",] [parameters.BM_MANNEQUIN_DRIVER_PELVIS_POS_X] default = "BM_MANNEQUIN_DRIVER_DEFAULT" diff --git a/Tests/Calibration/libdef.any b/Tests/Calibration/libdef.any new file mode 100644 index 000000000..4cc217305 --- /dev/null +++ b/Tests/Calibration/libdef.any @@ -0,0 +1 @@ +#include "../libdef.any" diff --git a/Tests/Calibration/test_2par_cal_default_symmetric.any b/Tests/Calibration/test_2par_cal_default_symmetric.any new file mode 100644 index 000000000..e69de29bb diff --git a/Tests/Calibration/test_calibration_lowerbody.any b/Tests/Calibration/test_calibration_lowerbody.any new file mode 100644 index 000000000..8f83d3d2e --- /dev/null +++ b/Tests/Calibration/test_calibration_lowerbody.any @@ -0,0 +1,150 @@ +//define = ( +// [ +// {'BM_LEG_MODEL':'_LEG_MODEL_TLEM1_'}, +// {'BM_LEG_MODEL':'_LEG_MODEL_TLEM2_'}, +// {'BM_LEG_MODEL':'_LEG_MODEL_LEG_'}, +// ], +// [ +// {'BM_CALIBRATION_TYPE':'1'}, +// {'BM_CALIBRATION_TYPE':'2'}, +// {'BM_CALIBRATION_TYPE':'3'}, +// ] +//) +//ignore_errors = ['Currently, no room for tendon'] +//fatal_warnings = [ +// "Penetration of surface", +// "The tendon/fiber length was calibrated but with issues", +//] + +#include "libdef.any" + +#ifndef TEST_NAME +#define BM_LEG_MODEL 2 +#define BM_CALIBRATION_TYPE 3 +#define TEST_NAME "test_calibration_lowerbody.any_1" +#endif + + +#define BM_SCALING _SCALING_NONE_ +// comment +#define BM_LEG_TRUNK_INTERFACE _MORPH_TRUNK_TO_LEG_ + +#define BM_LEG_MUSCLES_RIGHT _MUSCLES_3E_HILL_ +#define BM_LEG_LEFT OFF +#define BM_ARM_RIGHT OFF +#define BM_ARM_LEFT OFF + +#if BM_CALIBRATION_TYPE == 3 +#define BM_MANNEQUIN_DRIVER_HIP_FLEXION_RIGHT OFF +#endif + + +Main = +{ + + #include "/HumanModel.any" + + AnyOperation& RunTest = Main.HumanModel.Calibration.CalibrationSequence; + + #if BM_CALIBRATION_TYPE == 3 + AnyBodyStudy PostCalibrationStudy = { + nStep = 100; + Gravity = {0, 0, 0}; + InverseDynamics.Criterion.UpperBoundOnOff = Off; + AnyFolder &Model = Main.HumanModel.BodyModelWithDefaultDrivers; + + AnyFixedRefFrame ground = { + AnyRefNode node = { + ARel = Main.HumanModel.BodyModel.Trunk.Segments.PelvisSeg.Axes0; + sRel = Main.HumanModel.BodyModel.Trunk.Segments.PelvisSeg.r0; + }; + }; + + AnyKinEq ThoraxFix = { + AnyKinMeasure& PelvisThoraxExtension = Main.HumanModel.BodyModel.Interface.Trunk.PelvisThoraxExtension; + AnyKinMeasure& PelvisThoraxLateralBending = Main.HumanModel.BodyModel.Interface.Trunk.PelvisThoraxLateralBending; + AnyKinMeasure& PelvisThoraxRotation = Main.HumanModel.BodyModel.Interface.Trunk.PelvisThoraxRotation; + }; + + AnyKinEq PelvisFix = { + AnyKinLinear Lin = { + AnyRefFrame &ground = ..ground.node; + AnyRefFrame &Pelvis = Main.HumanModel.BodyModel.Trunk.Segments.PelvisSeg; + }; + AnyKinRotational Rot = { + Type = RotAxesAngles; + AnyRefFrame &ground = ..ground.node; + AnyRefFrame &Pelvis = Main.HumanModel.BodyModel.Trunk.Segments.PelvisSeg; + }; + }; + + AnyKinEqInterPolDriver Hip = { + AnyKinMeasure &measure = Main.HumanModel.BodyModel.Interface.Right.HipFlexion; + Type = PiecewiseLinear; + T = linspace(0,1,.nStep); + Data = { + linspace( + Main.HumanModel.Calibration.RangeOfMotion.Right.Leg.Hip.MaxExtensionAngle, + Main.HumanModel.Calibration.RangeOfMotion.Right.Leg.Hip.MaxFlexionAngle, + .nStep + ) * pi/180 + }; + Reaction.Type = {Off}; + }; + }; + #endif +}; + + + + +/* + +# Test Documentation: + +The test framework pytest is used to run tests. + +Test files are identified by prefixing `test_` to the file names. Such files +will be collected automatically by the Pytest framework. + +To run the test type the following at the command prompt: + +> pytest + + +## Test specifications + +The first part of the `test_xxx.any` can include specifications for the test framework. +Things such as define and part statements or certain errors to ignore. + +The specification section must be commented with //. The test will execute that part of +the file as python code. So the code must be valid python code except for the leading // + + +### Specifying define statements: + +The following specifications are supported: + +* define +* path +* expected_errors +* ignore_errors +* expect_errors + + +// Note. Since this test example include a main file from another +// application it also alters the ANYBODY_PATH_MAINFILEDIR and +// ANYBODY_PATH_MAINFILE preprocessor flags. +// +// If these flags are important to the model they must be mocked by the +// test framework. This can be done by adding the following test directives +// to the top of the test file. + + +## + +//path = {'ANYBODY_PATH_MAINFILEDIR':'../Application/Examples/StandingModel', +// 'ANYBODY_PATH_MAINFILE':'../Application/Examples/StandingModel/StandingModel.Main.any' } +// + +*/ diff --git a/Tests/test_calibration_upperbody.any b/Tests/Calibration/test_calibration_upperbody.any similarity index 100% rename from Tests/test_calibration_upperbody.any rename to Tests/Calibration/test_calibration_upperbody.any diff --git a/Tests/test_calibration_lowerbody.any b/Tests/test_calibration_lowerbody.any deleted file mode 100644 index 0fe81930b..000000000 --- a/Tests/test_calibration_lowerbody.any +++ /dev/null @@ -1,93 +0,0 @@ -//define = ( -// [ -// {'BM_LEG_MODEL':'_LEG_MODEL_TLEM1_'}, -// {'BM_LEG_MODEL':'_LEG_MODEL_TLEM2_'}, -// {'BM_LEG_MODEL':'_LEG_MODEL_LEG_'}, -// ], -// [ -// {'BM_CALIBRATION_TYPE':'1'}, -// {'BM_CALIBRATION_TYPE':'2'}, -// ] -//) -//ignore_errors = ['Currently, no room for tendon'] - -#include "libdef.any" - -#ifndef TEST_NAME - #define BM_LEG_MODEL 1 - #define BM_CALIBRATION_TYPE 2 - #define TEST_NAME "test_calibration_lowerbody.any_1" -#endif - - -#define BM_SCALING _SCALING_NONE_ -// -#define BM_LEG_TRUNK_INTERFACE _MORPH_TRUNK_TO_LEG_ - -#define BM_LEG_MUSCLES_RIGHT _MUSCLES_3E_HILL_ -#define BM_LEG_LEFT OFF -#define BM_ARM_RIGHT OFF -#define BM_ARM_LEFT OFF - - -Main = -{ - - #include "/HumanModel.any" - - AnyOperation& RunTest = Main.HumanModel.Calibration.CalibrationSequence; -}; - - - - -/* - -# Test Documentation: - -The test framework pytest is used to run tests. - -Test files are identified by prefixing `test_` to the file names. Such files -will be collected automatically by the Pytest framework. - -To run the test type the following at the command prompt: - -> pytest - - -## Test specifications - -The first part of the `test_xxx.any` can include specifications for the test framework. -Things such as define and part statements or certain errors to ignore. - -The specification section must be commented with //. The test will execute that part of -the file as python code. So the code must be valid python code except for the leading // - - -### Specifying define statements: - -The following specifications are supported: - -* define -* path -* expected_errors -* ignore_errors -* expect_errors - - -// Note. Since this test example include a main file from another -// application it also alters the ANYBODY_PATH_MAINFILEDIR and -// ANYBODY_PATH_MAINFILE preprocessor flags. -// -// If these flags are important to the model they must be mocked by the -// test framework. This can be done by adding the following test directives -// to the top of the test file. - - -## - -//path = {'ANYBODY_PATH_MAINFILEDIR':'../Application/Examples/StandingModel', -// 'ANYBODY_PATH_MAINFILE':'../Application/Examples/StandingModel/StandingModel.Main.any' } -// - -*/ \ No newline at end of file From 41d3e26c84eca27c02a33d7c7ecaf12adcf63120 Mon Sep 17 00:00:00 2001 From: bke Date: Thu, 2 Jan 2025 12:51:38 +0100 Subject: [PATCH 2/7] add neutral angles --- .../GenericBodyModel/Calibration/RangeOfMotionDefinition.any | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Body/AAUHuman/BodyModels/GenericBodyModel/Calibration/RangeOfMotionDefinition.any b/Body/AAUHuman/BodyModels/GenericBodyModel/Calibration/RangeOfMotionDefinition.any index 6bd5c2349..062b6bc56 100644 --- a/Body/AAUHuman/BodyModels/GenericBodyModel/Calibration/RangeOfMotionDefinition.any +++ b/Body/AAUHuman/BodyModels/GenericBodyModel/Calibration/RangeOfMotionDefinition.any @@ -34,11 +34,13 @@ BodyModelFolderStructure RangeOfMotion() = { }; Right.Leg.Knee = { + AnyVar Neutral ??= 0; AnyVar MaxFlexionAngle ??= 130; AnyVar MaxExtensionAngle ??= -3; }; Right.Leg.Ankle = { + AnyVar Neutral ??= 0; AnyVar MaxPlantarFlexionAngle ??= 45; AnyVar MaxDorsiFlexionAngle ??= -20; AnyVar MaxInversionAngle ??= 15; @@ -72,11 +74,13 @@ BodyModelFolderStructure RangeOfMotion() = { }; Left.Leg.Knee = { + AnyVar Neutral ??= ...Right.Leg.Knee.Neutral; AnyVar MaxFlexionAngle ??= ...Right.Leg.Knee.MaxFlexionAngle; AnyVar MaxExtensionAngle ??= ...Right.Leg.Knee.MaxExtensionAngle; }; Left.Leg.Ankle = { + AnyVar Neutral ??= ...Right.Leg.Ankle.Neutral; AnyVar MaxPlantarFlexionAngle ??= ...Right.Leg.Ankle.MaxPlantarFlexionAngle; AnyVar MaxDorsiFlexionAngle ??= ...Right.Leg.Ankle.MaxDorsiFlexionAngle; AnyVar MaxInversionAngle ??= ...Right.Leg.Ankle.MaxInversionAngle; From 71980272c4a1529f108b919cbce831552fae4963 Mon Sep 17 00:00:00 2001 From: bke Date: Thu, 2 Jan 2025 14:03:39 +0100 Subject: [PATCH 3/7] refactor positions matrices to be pointers and allow users to open in tree. add warning when npos does not match nstep --- .../CalibrationStudy.ClassTemplates.any | 25 +- .../Calibration/2ParLeftCalStudies.any | 70 +++--- .../Calibration/2ParRightCalStudies.any | 213 +++++++++--------- .../test_calibration_lowerbody.any | 4 +- 4 files changed, 162 insertions(+), 150 deletions(-) diff --git a/Body/AAUHuman/BodyModels/GenericBodyModel/Calibration/CalibrationStudy.ClassTemplates.any b/Body/AAUHuman/BodyModels/GenericBodyModel/Calibration/CalibrationStudy.ClassTemplates.any index 01039d516..920ef34b0 100644 --- a/Body/AAUHuman/BodyModels/GenericBodyModel/Calibration/CalibrationStudy.ClassTemplates.any +++ b/Body/AAUHuman/BodyModels/GenericBodyModel/Calibration/CalibrationStudy.ClassTemplates.any @@ -4,10 +4,10 @@ #class_template LegCalibrationModel(Side, BodyModelRef) { AnyComponentDefinition CDef = {}; - #var AnyFloat HipPositions; - #var AnyFloat KneePositions; - #var AnyFloat AnklePositions; - #var AnyFloat SubTalarPositions; + #var AnyObjectPtr HipPositions; + #var AnyObjectPtr KneePositions; + #var AnyObjectPtr AnklePositions; + #var AnyObjectPtr SubTalarPositions; AnyFolder &Pelvis = BodyModelRef.Trunk.Segments.PelvisSeg; AnyFolder &Sacrum = BodyModelRef.Trunk.Segments.SacrumSeg; @@ -56,32 +56,40 @@ AnyKinRotational &Spherical = .BodyModelRef.Interface.Side.HipFlexion.HipMeasure; Type = PiecewiseLinear; T = linspace(0,1,SizesOf(Data)[1]); - Data = .HipPositions * pi/180; + Data = Obj2Num(.HipPositions)' * pi/180; Reaction.Type = {Off, Off, Off}; + AnyInt expect_nPos_to_match_nStep = warn(eqfun(NumElemOf(T), ..nStep), strformat("The number of calibration positions (Data) in the: " + NameOf(ObjGetParent(0)) + " driver does not match the number of positions (nStep) in the study.")); + }; AnyKinEqInterPolDriver Knee = { AnyKinMeasure& Hinge = .BodyModelRef.Interface.Side.KneeFlexion; Type = PiecewiseLinear; T = linspace(0,1,SizesOf(Data)[1]); - Data = {.KneePositions} * pi/180; + Data = {Obj2Num(.KneePositions)} * pi/180; Reaction.Type = {Off}; + AnyInt expect_nPos_to_match_nStep = warn(eqfun(NumElemOf(T), ..nStep), strformat("The number of calibration positions (Data) in the: " + NameOf(ObjGetParent(0)) + " driver does not match the number of positions (nStep) in the study.")); + }; AnyKinEqInterPolDriver Ankle = { AnyKinMeasure& Hinge = .BodyModelRef.Interface.Side.AnklePlantarFlexion; Type = PiecewiseLinear; T = linspace(0,1,SizesOf(Data)[1]); - Data = {.AnklePositions} * pi/180; + Data = {Obj2Num(.AnklePositions)} * pi/180; Reaction.Type = {Off}; + AnyInt expect_nPos_to_match_nStep = warn(eqfun(NumElemOf(T), ..nStep), strformat("The number of calibration positions (Data) in the: " + NameOf(ObjGetParent(0)) + " driver does not match the number of positions (nStep) in the study.")); + }; AnyKinEqInterPolDriver SubTalar = { AnyKinMeasure& Hinge = .BodyModelRef.Interface.Side.SubTalarEversion; Type = PiecewiseLinear; T = linspace(0,1,SizesOf(Data)[1]); - Data = {.SubTalarPositions} * pi/180; + Data = {Obj2Num(.SubTalarPositions)} * pi/180; Reaction.Type = {Off}; + AnyInt expect_nPos_to_match_nStep = warn(eqfun(NumElemOf(T), ..nStep), strformat("The number of calibration positions (Data) in the: " + NameOf(ObjGetParent(0)) + " driver does not match the number of positions (nStep) in the study.")); + }; }; @@ -108,3 +116,4 @@ SubTalarPositions = .SubTalarPositions; }; }; + diff --git a/Body/AAUHuman/LegTLEM/Calibration/2ParLeftCalStudies.any b/Body/AAUHuman/LegTLEM/Calibration/2ParLeftCalStudies.any index 335b3daa0..232adf897 100644 --- a/Body/AAUHuman/LegTLEM/Calibration/2ParLeftCalStudies.any +++ b/Body/AAUHuman/LegTLEM/Calibration/2ParLeftCalStudies.any @@ -2,7 +2,7 @@ LegCalibrationStudy LegCalibration1Left( BodyModelRef=Main.HumanModel.BodyModel, Side=Left, ) = { - nStep = SizesOf(HipPositions)[1]; + nStep = .LegCalibration1Right.nStep; MuscleArr = ObjSearch( &..BodyModel.Left.Leg.Mus, @@ -19,10 +19,10 @@ LegCalibrationStudy LegCalibration1Left( RminMuscleFiber = repmat(NumElemOf(MuscleArr), .RValues.RMinDefault); RmaxMuscleFiber = repmat(NumElemOf(MuscleArr), .RValues.RMaxDefault); - AnyFloat HipPositions = .LegCalibration1Right.HipPositions; - AnyFloat KneePositions = .LegCalibration1Right.KneePositions; - AnyFloat AnklePositions = .LegCalibration1Right.AnklePositions; - AnyFloat SubTalarPositions = .LegCalibration1Right.SubTalarPositions; + AnyObjectPtrArray HipPositions = .LegCalibration1Right.HipPositions; + AnyObjectPtrArray KneePositions = .LegCalibration1Right.KneePositions; + AnyObjectPtrArray AnklePositions = .LegCalibration1Right.AnklePositions; + AnyObjectPtrArray SubTalarPositions = .LegCalibration1Right.SubTalarPositions; }; @@ -30,7 +30,7 @@ LegCalibrationStudy LegCalibration2Left( BodyModelRef=Main.HumanModel.BodyModel, Side=Left, ) = { - nStep = SizesOf(HipPositions)[1]; + nStep = .LegCalibration2Right.nStep; MuscleArr = ObjSearch( &..BodyModel.Left.Leg.Mus, @@ -47,17 +47,17 @@ LegCalibrationStudy LegCalibration2Left( RminMuscleFiber = repmat(NumElemOf(MuscleArr), .RValues.RMinDefault); RmaxMuscleFiber = repmat(NumElemOf(MuscleArr), .RValues.RMaxDefault); - AnyFloat HipPositions = .LegCalibration2Right.HipPositions; - AnyFloat KneePositions = .LegCalibration2Right.KneePositions; - AnyFloat AnklePositions = .LegCalibration2Right.AnklePositions; - AnyFloat SubTalarPositions = .LegCalibration2Right.SubTalarPositions; + AnyObjectPtrArray HipPositions = .LegCalibration2Right.HipPositions; + AnyObjectPtrArray KneePositions = .LegCalibration2Right.KneePositions; + AnyObjectPtrArray AnklePositions = .LegCalibration2Right.AnklePositions; + AnyObjectPtrArray SubTalarPositions = .LegCalibration2Right.SubTalarPositions; }; LegCalibrationStudy LegCalibration3Left( BodyModelRef=Main.HumanModel.BodyModel, Side=Left, ) = { - nStep = SizesOf(HipPositions)[1]; + nStep = .LegCalibration3Right.nStep; MuscleArr = ObjSearch( &..BodyModel.Left.Leg.Mus, @@ -70,17 +70,17 @@ LegCalibrationStudy LegCalibration3Left( RminMuscleFiber = repmat(NumElemOf(MuscleArr), .RValues.RMinDefault); RmaxMuscleFiber = repmat(NumElemOf(MuscleArr), .RValues.RMaxDefault); - AnyFloat HipPositions = .LegCalibration3Right.HipPositions; - AnyFloat KneePositions = .LegCalibration3Right.KneePositions; - AnyFloat AnklePositions = .LegCalibration3Right.AnklePositions; - AnyFloat SubTalarPositions = .LegCalibration3Right.SubTalarPositions; + AnyObjectPtrArray HipPositions = .LegCalibration3Right.HipPositions; + AnyObjectPtrArray KneePositions = .LegCalibration3Right.KneePositions; + AnyObjectPtrArray AnklePositions = .LegCalibration3Right.AnklePositions; + AnyObjectPtrArray SubTalarPositions = .LegCalibration3Right.SubTalarPositions; }; LegCalibrationStudy LegCalibration4Left( BodyModelRef=Main.HumanModel.BodyModel, Side=Left, ) = { - nStep = SizesOf(HipPositions)[1]; + nStep = .LegCalibration4Right.nStep; MuscleArr = ObjSearch( &..BodyModel.Left.Leg.Mus, @@ -93,17 +93,17 @@ LegCalibrationStudy LegCalibration4Left( RminMuscleFiber = repmat(NumElemOf(MuscleArr), .RValues.RMinDefault); RmaxMuscleFiber = repmat(NumElemOf(MuscleArr), .RValues.RMaxDefault); - AnyFloat HipPositions = .LegCalibration4Right.HipPositions; - AnyFloat KneePositions = .LegCalibration4Right.KneePositions; - AnyFloat AnklePositions = .LegCalibration4Right.AnklePositions; - AnyFloat SubTalarPositions = .LegCalibration4Right.SubTalarPositions; + AnyObjectPtrArray HipPositions = .LegCalibration4Right.HipPositions; + AnyObjectPtrArray KneePositions = .LegCalibration4Right.KneePositions; + AnyObjectPtrArray AnklePositions = .LegCalibration4Right.AnklePositions; + AnyObjectPtrArray SubTalarPositions = .LegCalibration4Right.SubTalarPositions; }; LegCalibrationStudy LegCalibration5Left( BodyModelRef=Main.HumanModel.BodyModel, Side=Left, ) = { - nStep = SizesOf(HipPositions)[1]; + nStep = .LegCalibration5Right.nStep; MuscleArr = ObjSearch( &..BodyModel.Left.Leg.Mus, @@ -120,17 +120,17 @@ LegCalibrationStudy LegCalibration5Left( RminMuscleFiber = repmat(NumElemOf(MuscleArr), .RValues.RMinDefault); RmaxMuscleFiber = repmat(NumElemOf(MuscleArr), .RValues.RMaxDefault); - AnyFloat HipPositions = .LegCalibration5Right.HipPositions; - AnyFloat KneePositions = .LegCalibration5Right.KneePositions; - AnyFloat AnklePositions = .LegCalibration5Right.AnklePositions; - AnyFloat SubTalarPositions = .LegCalibration5Right.SubTalarPositions; + AnyObjectPtrArray HipPositions = .LegCalibration5Right.HipPositions; + AnyObjectPtrArray KneePositions = .LegCalibration5Right.KneePositions; + AnyObjectPtrArray AnklePositions = .LegCalibration5Right.AnklePositions; + AnyObjectPtrArray SubTalarPositions = .LegCalibration5Right.SubTalarPositions; }; LegCalibrationStudy LegCalibration6Left( BodyModelRef=Main.HumanModel.BodyModel, Side=Left, ) = { - nStep = SizesOf(HipPositions)[1]; + nStep = .LegCalibration6Right.nStep; MuscleArr = ObjSearch( &..BodyModel.Left.Leg.Mus, @@ -144,17 +144,17 @@ LegCalibrationStudy LegCalibration6Left( RminMuscleFiber = repmat(NumElemOf(MuscleArr), .RValues.RMinDefault); RmaxMuscleFiber = repmat(NumElemOf(MuscleArr), .RValues.RMaxDefault); - AnyFloat HipPositions = .LegCalibration6Right.HipPositions; - AnyFloat KneePositions = .LegCalibration6Right.KneePositions; - AnyFloat AnklePositions = .LegCalibration6Right.AnklePositions; - AnyFloat SubTalarPositions = .LegCalibration6Right.SubTalarPositions; + AnyObjectPtrArray HipPositions = .LegCalibration6Right.HipPositions; + AnyObjectPtrArray KneePositions = .LegCalibration6Right.KneePositions; + AnyObjectPtrArray AnklePositions = .LegCalibration6Right.AnklePositions; + AnyObjectPtrArray SubTalarPositions = .LegCalibration6Right.SubTalarPositions; }; LegCalibrationStudy LegCalibration7Left( BodyModelRef=Main.HumanModel.BodyModel, Side=Left, ) = { - nStep = SizesOf(HipPositions)[1]; + nStep = .LegCalibration7Right.nStep; MuscleArr = ObjSearch( &..BodyModel.Left.Leg.Mus, @@ -175,10 +175,10 @@ LegCalibrationStudy LegCalibration7Left( RminMuscleFiber = repmat(NumElemOf(MuscleArr), .RValues.RMinDefault); RmaxMuscleFiber = repmat(NumElemOf(MuscleArr), .RValues.RMaxDefault); - AnyFloat HipPositions = .LegCalibration7Right.HipPositions; - AnyFloat KneePositions = .LegCalibration7Right.KneePositions; - AnyFloat AnklePositions = .LegCalibration7Right.AnklePositions; - AnyFloat SubTalarPositions = .LegCalibration7Right.SubTalarPositions; + AnyObjectPtrArray HipPositions = .LegCalibration7Right.HipPositions; + AnyObjectPtrArray KneePositions = .LegCalibration7Right.KneePositions; + AnyObjectPtrArray AnklePositions = .LegCalibration7Right.AnklePositions; + AnyObjectPtrArray SubTalarPositions = .LegCalibration7Right.SubTalarPositions; }; CalibrationSequence = { diff --git a/Body/AAUHuman/LegTLEM/Calibration/2ParRightCalStudies.any b/Body/AAUHuman/LegTLEM/Calibration/2ParRightCalStudies.any index 2fc400673..93ee540fa 100644 --- a/Body/AAUHuman/LegTLEM/Calibration/2ParRightCalStudies.any +++ b/Body/AAUHuman/LegTLEM/Calibration/2ParRightCalStudies.any @@ -2,7 +2,7 @@ LegCalibrationStudy LegCalibration1Right( BodyModelRef=Main.HumanModel.BodyModel, Side=Right, ) = { - nStep = SizesOf(HipPositions)[1]; + nStep = nPos; MuscleArr = ObjSearch( &..BodyModel.Right.Leg.Mus, @@ -19,28 +19,29 @@ LegCalibrationStudy LegCalibration1Right( RminMuscleFiber = repmat(NumElemOf(MuscleArr), .RValues.RMinDefault); RmaxMuscleFiber = repmat(NumElemOf(MuscleArr), .RValues.RMaxDefault); - AnyInt nPos = round(SizesOf(HipPositions)[1] / 2); - AnyFloat HipPositions = repmat(1,2,{ - .RangeOfMotion.Right.Leg.Hip.InternallyRotated, - .RangeOfMotion.Right.Leg.Hip.Adduction, - .RangeOfMotion.Right.Leg.Hip.AbductedAndExternallyRotated, - .RangeOfMotion.Right.Leg.Hip.FlexedAndAdducted, - .RangeOfMotion.Right.Leg.Hip.FlexedAndAbducted, - .RangeOfMotion.Right.Leg.Hip.ExtendedAndAdducted, - }'); - AnyFloat KneePositions = flatten({ - repmat(nPos, .RangeOfMotion.Right.Leg.Knee.MaxFlexionAngle), - repmat(nPos, .RangeOfMotion.Right.Leg.Knee.MaxExtensionAngle) + AnyInt nPos = NumElemOf(HipPositions); + AnyObjectPtrArray HipPositions = repmat(2,{ + &.RangeOfMotion.Right.Leg.Hip.InternallyRotated, + &.RangeOfMotion.Right.Leg.Hip.Adduction, + &.RangeOfMotion.Right.Leg.Hip.AbductedAndExternallyRotated, + &.RangeOfMotion.Right.Leg.Hip.FlexedAndAdducted, + &.RangeOfMotion.Right.Leg.Hip.FlexedAndAbducted, + &.RangeOfMotion.Right.Leg.Hip.ExtendedAndAdducted, }); - AnyFloat AnklePositions = zeros(nPos * 2); - AnyFloat SubTalarPositions = zeros(nPos * 2); + + AnyObjectPtrArray KneePositions = flatten({ + repmat(round(nPos/2), &.RangeOfMotion.Right.Leg.Knee.MaxFlexionAngle), + repmat(round(nPos/2), &.RangeOfMotion.Right.Leg.Knee.MaxExtensionAngle) + }); + AnyObjectPtrArray AnklePositions = repmat(nPos, &.RangeOfMotion.Right.Leg.Ankle.Neutral); + AnyObjectPtrArray SubTalarPositions = repmat(nPos, &.RangeOfMotion.Right.Leg.Ankle.Neutral); }; LegCalibrationStudy LegCalibration2Right( BodyModelRef=Main.HumanModel.BodyModel, Side=Right, ) = { - nStep = SizesOf(HipPositions)[1]; + nStep = nPos; MuscleArr = ObjSearch( &..BodyModel.Right.Leg.Mus, @@ -57,31 +58,31 @@ LegCalibrationStudy LegCalibration2Right( RminMuscleFiber = repmat(NumElemOf(MuscleArr), .RValues.RMinDefault); RmaxMuscleFiber = repmat(NumElemOf(MuscleArr), .RValues.RMaxDefault); - AnyInt nPos = round(SizesOf(HipPositions)[1] / 2); - AnyFloat HipPositions = repmat(1,2,{ - .RangeOfMotion.Right.Leg.Hip.InternallyRotated, - .RangeOfMotion.Right.Leg.Hip.Adduction, - .RangeOfMotion.Right.Leg.Hip.FlexedAndAdducted, - .RangeOfMotion.Right.Leg.Hip.Flexed, - .RangeOfMotion.Right.Leg.Hip.FlexedAndAbducted, - .RangeOfMotion.Right.Leg.Hip.AbductedAndExternallyRotated, - .RangeOfMotion.Right.Leg.Hip.Extended, - .RangeOfMotion.Right.Leg.Hip.ExtendedAndAdducted, - .RangeOfMotion.Right.Leg.Hip.ExternallyRotated, - }'); - AnyFloat KneePositions = flatten({ - repmat(nPos, .RangeOfMotion.Right.Leg.Knee.MaxFlexionAngle), - repmat(nPos, .RangeOfMotion.Right.Leg.Knee.MaxExtensionAngle) + AnyInt nPos = NumElemOf(HipPositions); + AnyObjectPtrArray HipPositions = repmat(2,{ + &.RangeOfMotion.Right.Leg.Hip.InternallyRotated, + &.RangeOfMotion.Right.Leg.Hip.Adduction, + &.RangeOfMotion.Right.Leg.Hip.FlexedAndAdducted, + &.RangeOfMotion.Right.Leg.Hip.Flexed, + &.RangeOfMotion.Right.Leg.Hip.FlexedAndAbducted, + &.RangeOfMotion.Right.Leg.Hip.AbductedAndExternallyRotated, + &.RangeOfMotion.Right.Leg.Hip.Extended, + &.RangeOfMotion.Right.Leg.Hip.ExtendedAndAdducted, + &.RangeOfMotion.Right.Leg.Hip.ExternallyRotated, }); - AnyFloat AnklePositions = zeros(nPos * 2); - AnyFloat SubTalarPositions = zeros(nPos * 2); + AnyObjectPtrArray KneePositions = flatten({ + repmat(round(nPos/2), &.RangeOfMotion.Right.Leg.Knee.MaxFlexionAngle), + repmat(round(nPos/2), &.RangeOfMotion.Right.Leg.Knee.MaxExtensionAngle) + }); + AnyObjectPtrArray AnklePositions = repmat(nPos, &.RangeOfMotion.Right.Leg.Ankle.Neutral); + AnyObjectPtrArray SubTalarPositions = repmat(nPos, &.RangeOfMotion.Right.Leg.Ankle.Neutral); }; LegCalibrationStudy LegCalibration3Right( BodyModelRef=Main.HumanModel.BodyModel, Side=Right, ) = { - nStep = SizesOf(HipPositions)[1]; + nStep = nPos; MuscleArr = ObjSearch( &..BodyModel.Right.Leg.Mus, @@ -94,26 +95,26 @@ LegCalibrationStudy LegCalibration3Right( RminMuscleFiber = repmat(NumElemOf(MuscleArr), .RValues.RMinDefault); RmaxMuscleFiber = repmat(NumElemOf(MuscleArr), .RValues.RMaxDefault); - AnyInt nPos = round(SizesOf(HipPositions)[1] / 2); - AnyFloat HipPositions = repmat(1,2,{ - .RangeOfMotion.Right.Leg.Hip.FlexedAndAdducted, - .RangeOfMotion.Right.Leg.Hip.Flexed, - .RangeOfMotion.Right.Leg.Hip.Extended, - .RangeOfMotion.Right.Leg.Hip.ExtendedAndAdducted, - }'); - AnyFloat KneePositions = flatten({ - repmat(nPos, .RangeOfMotion.Right.Leg.Knee.MaxFlexionAngle), - repmat(nPos, .RangeOfMotion.Right.Leg.Knee.MaxExtensionAngle) + AnyInt nPos = NumElemOf(HipPositions); + AnyObjectPtrArray HipPositions = repmat(2,{ + &.RangeOfMotion.Right.Leg.Hip.FlexedAndAdducted, + &.RangeOfMotion.Right.Leg.Hip.Flexed, + &.RangeOfMotion.Right.Leg.Hip.Extended, + &.RangeOfMotion.Right.Leg.Hip.ExtendedAndAdducted, + }); + AnyObjectPtrArray KneePositions = flatten({ + repmat(round(nPos/2), &.RangeOfMotion.Right.Leg.Knee.MaxFlexionAngle), + repmat(round(nPos/2), &.RangeOfMotion.Right.Leg.Knee.MaxExtensionAngle) }); - AnyFloat AnklePositions = zeros(nPos * 2); - AnyFloat SubTalarPositions = zeros(nPos * 2); + AnyObjectPtrArray AnklePositions = repmat(nPos, &.RangeOfMotion.Right.Leg.Ankle.Neutral); + AnyObjectPtrArray SubTalarPositions = repmat(nPos, &.RangeOfMotion.Right.Leg.Ankle.Neutral); }; LegCalibrationStudy LegCalibration4Right( BodyModelRef=Main.HumanModel.BodyModel, Side=Right, ) = { - nStep = SizesOf(HipPositions)[1]; + nStep = nPos; MuscleArr = ObjSearch( &..BodyModel.Right.Leg.Mus, @@ -126,28 +127,28 @@ LegCalibrationStudy LegCalibration4Right( RminMuscleFiber = repmat(NumElemOf(MuscleArr), .RValues.RMinDefault); RmaxMuscleFiber = repmat(NumElemOf(MuscleArr), .RValues.RMaxDefault); - AnyInt nPos = round(SizesOf(HipPositions)[1] / 2); - AnyFloat HipPositions = repmat(1,2,{ - .RangeOfMotion.Right.Leg.Hip.InternallyRotated, - .RangeOfMotion.Right.Leg.Hip.Adduction, - .RangeOfMotion.Right.Leg.Hip.AbductedAndExternallyRotated, - .RangeOfMotion.Right.Leg.Hip.ExtendedAndAdducted, - .RangeOfMotion.Right.Leg.Hip.Extended, - .RangeOfMotion.Right.Leg.Hip.ExternallyRotated, - }'); - AnyFloat KneePositions = flatten({ - repmat(nPos, .RangeOfMotion.Right.Leg.Knee.MaxFlexionAngle), - repmat(nPos, .RangeOfMotion.Right.Leg.Knee.MaxExtensionAngle) + AnyInt nPos = NumElemOf(HipPositions); + AnyObjectPtrArray HipPositions = repmat(2,{ + &.RangeOfMotion.Right.Leg.Hip.InternallyRotated, + &.RangeOfMotion.Right.Leg.Hip.Adduction, + &.RangeOfMotion.Right.Leg.Hip.AbductedAndExternallyRotated, + &.RangeOfMotion.Right.Leg.Hip.ExtendedAndAdducted, + &.RangeOfMotion.Right.Leg.Hip.Extended, + &.RangeOfMotion.Right.Leg.Hip.ExternallyRotated, }); - AnyFloat AnklePositions = zeros(nPos * 2); - AnyFloat SubTalarPositions = zeros(nPos * 2); + AnyObjectPtrArray KneePositions = flatten({ + repmat(round(nPos/2), &.RangeOfMotion.Right.Leg.Knee.MaxFlexionAngle), + repmat(round(nPos/2), &.RangeOfMotion.Right.Leg.Knee.MaxExtensionAngle) + }); + AnyObjectPtrArray AnklePositions = repmat(nPos, &.RangeOfMotion.Right.Leg.Ankle.Neutral); + AnyObjectPtrArray SubTalarPositions = repmat(nPos, &.RangeOfMotion.Right.Leg.Ankle.Neutral); }; LegCalibrationStudy LegCalibration5Right( BodyModelRef=Main.HumanModel.BodyModel, Side=Right, ) = { - nStep = SizesOf(HipPositions)[1]; + nStep = nPos; MuscleArr = ObjSearch( &..BodyModel.Right.Leg.Mus, @@ -164,28 +165,28 @@ LegCalibrationStudy LegCalibration5Right( RminMuscleFiber = repmat(NumElemOf(MuscleArr), .RValues.RMinDefault); RmaxMuscleFiber = repmat(NumElemOf(MuscleArr), .RValues.RMaxDefault); - AnyInt nPos = round(SizesOf(HipPositions)[1] / 2); - AnyFloat HipPositions = repmat(1,2,{ - .RangeOfMotion.Right.Leg.Hip.FlexedAndAdducted, - .RangeOfMotion.Right.Leg.Hip.FlexedAndAbducted, - .RangeOfMotion.Right.Leg.Hip.AbductedAndExternallyRotated, - .RangeOfMotion.Right.Leg.Hip.Extended, - .RangeOfMotion.Right.Leg.Hip.ExtendedAndAdducted, - .RangeOfMotion.Right.Leg.Hip.ExternallyRotated, - }'); - AnyFloat KneePositions = flatten({ - repmat(nPos, .RangeOfMotion.Right.Leg.Knee.MaxFlexionAngle), - repmat(nPos, .RangeOfMotion.Right.Leg.Knee.MaxExtensionAngle) + AnyInt nPos = NumElemOf(HipPositions); + AnyObjectPtrArray HipPositions = repmat(2,{ + &.RangeOfMotion.Right.Leg.Hip.FlexedAndAdducted, + &.RangeOfMotion.Right.Leg.Hip.FlexedAndAbducted, + &.RangeOfMotion.Right.Leg.Hip.AbductedAndExternallyRotated, + &.RangeOfMotion.Right.Leg.Hip.Extended, + &.RangeOfMotion.Right.Leg.Hip.ExtendedAndAdducted, + &.RangeOfMotion.Right.Leg.Hip.ExternallyRotated, + }); + AnyObjectPtrArray KneePositions = flatten({ + repmat(round(nPos/2), &.RangeOfMotion.Right.Leg.Knee.MaxFlexionAngle), + repmat(round(nPos/2), &.RangeOfMotion.Right.Leg.Knee.MaxExtensionAngle) }); - AnyFloat AnklePositions = zeros(nPos * 2); - AnyFloat SubTalarPositions = zeros(nPos * 2); + AnyObjectPtrArray AnklePositions = repmat(nPos, &.RangeOfMotion.Right.Leg.Ankle.Neutral); + AnyObjectPtrArray SubTalarPositions = repmat(nPos, &.RangeOfMotion.Right.Leg.Ankle.Neutral); }; LegCalibrationStudy LegCalibration6Right( BodyModelRef=Main.HumanModel.BodyModel, Side=Right, ) = { - nStep = SizesOf(HipPositions)[1]; + nStep = nPos; MuscleArr = ObjSearch( &..BodyModel.Right.Leg.Mus, @@ -199,25 +200,25 @@ LegCalibrationStudy LegCalibration6Right( RminMuscleFiber = repmat(NumElemOf(MuscleArr), .RValues.RMinDefault); RmaxMuscleFiber = repmat(NumElemOf(MuscleArr), .RValues.RMaxDefault); - AnyInt nPos = round(SizesOf(HipPositions)[1] / 2); - AnyFloat HipPositions = repmat(1,2,{ - .RangeOfMotion.Right.Leg.Hip.Neutral, - .RangeOfMotion.Right.Leg.Hip.FlexedAndAdducted, - .RangeOfMotion.Right.Leg.Hip.Extended, - }'); - AnyFloat KneePositions = flatten({ - repmat(nPos, .RangeOfMotion.Right.Leg.Knee.MaxFlexionAngle), - repmat(nPos, .RangeOfMotion.Right.Leg.Knee.MaxExtensionAngle) + AnyInt nPos = NumElemOf(HipPositions); + AnyObjectPtrArray HipPositions = repmat(2,{ + &.RangeOfMotion.Right.Leg.Hip.Neutral, + &.RangeOfMotion.Right.Leg.Hip.FlexedAndAdducted, + &.RangeOfMotion.Right.Leg.Hip.Extended, + }); + AnyObjectPtrArray KneePositions = flatten({ + repmat(round(nPos/2), &.RangeOfMotion.Right.Leg.Knee.MaxFlexionAngle), + repmat(round(nPos/2), &.RangeOfMotion.Right.Leg.Knee.MaxExtensionAngle) }); - AnyFloat AnklePositions = zeros(nPos * 2); - AnyFloat SubTalarPositions = zeros(nPos * 2); + AnyObjectPtrArray AnklePositions = repmat(nPos, &.RangeOfMotion.Right.Leg.Ankle.Neutral); + AnyObjectPtrArray SubTalarPositions = repmat(nPos, &.RangeOfMotion.Right.Leg.Ankle.Neutral); }; LegCalibrationStudy LegCalibration7Right( BodyModelRef=Main.HumanModel.BodyModel, Side=Right, ) = { - nStep = SizesOf(HipPositions)[1]; + nStep = nPos; MuscleArr = ObjSearch( &..BodyModel.Right.Leg.Mus, @@ -238,24 +239,24 @@ LegCalibrationStudy LegCalibration7Right( RminMuscleFiber = repmat(NumElemOf(MuscleArr), .RValues.RMinDefault); RmaxMuscleFiber = repmat(NumElemOf(MuscleArr), .RValues.RMaxDefault); - AnyInt nPos = round(NumElemOf(AnklePositions) / 2); - AnyFloat HipPositions = zeros(3, nPos * 2); - AnyFloat KneePositions = flatten({ - repmat(nPos, .RangeOfMotion.Right.Leg.Knee.MaxFlexionAngle), - repmat(nPos, .RangeOfMotion.Right.Leg.Knee.MaxExtensionAngle) + AnyInt nPos = NumElemOf(AnklePositions); + AnyObjectPtrArray HipPositions = repmat(nPos, &.RangeOfMotion.Right.Leg.Hip.Neutral); + AnyObjectPtrArray KneePositions = flatten({ + repmat(round(nPos/2), &.RangeOfMotion.Right.Leg.Knee.MaxFlexionAngle), + repmat(round(nPos/2), &.RangeOfMotion.Right.Leg.Knee.MaxExtensionAngle) }); - AnyFloat AnklePositions = flatten(repmat(2, { - .RangeOfMotion.Right.Leg.Ankle.MaxPlantarFlexionAngle, - 0, - .RangeOfMotion.Right.Leg.Ankle.MaxDorsiFlexionAngle, - 0, - }')); - AnyFloat SubTalarPositions = flatten(repmat(2, { - 0, - .RangeOfMotion.Right.Leg.Ankle.MaxInversionAngle, - 0, - .RangeOfMotion.Right.Leg.Ankle.MaxEversionAngle, - }')); + AnyObjectPtrArray AnklePositions = flatten(repmat(2, { + &.RangeOfMotion.Right.Leg.Ankle.MaxPlantarFlexionAngle, + &.RangeOfMotion.Right.Leg.Ankle.Neutral, + &.RangeOfMotion.Right.Leg.Ankle.MaxDorsiFlexionAngle, + &.RangeOfMotion.Right.Leg.Ankle.Neutral, + })); + AnyObjectPtrArray SubTalarPositions = flatten(repmat(2, { + &.RangeOfMotion.Right.Leg.Ankle.Neutral, + &.RangeOfMotion.Right.Leg.Ankle.MaxInversionAngle, + &.RangeOfMotion.Right.Leg.Ankle.Neutral, + &.RangeOfMotion.Right.Leg.Ankle.MaxEversionAngle, + })); }; CalibrationSequence = { diff --git a/Tests/Calibration/test_calibration_lowerbody.any b/Tests/Calibration/test_calibration_lowerbody.any index 8f83d3d2e..12875cd89 100644 --- a/Tests/Calibration/test_calibration_lowerbody.any +++ b/Tests/Calibration/test_calibration_lowerbody.any @@ -30,7 +30,9 @@ #define BM_LEG_TRUNK_INTERFACE _MORPH_TRUNK_TO_LEG_ #define BM_LEG_MUSCLES_RIGHT _MUSCLES_3E_HILL_ -#define BM_LEG_LEFT OFF + +#define BM_LEG_MUSCLES_LEFT _MUSCLES_3E_HILL_ +#define BM_LEG_LEFT ON #define BM_ARM_RIGHT OFF #define BM_ARM_LEFT OFF From 8efbb31a26085570535da70201d8993023193bc7 Mon Sep 17 00:00:00 2001 From: bke Date: Wed, 8 Jan 2025 10:04:41 +0100 Subject: [PATCH 4/7] add abduction pos --- .../GenericBodyModel/Calibration/RangeOfMotionDefinition.any | 1 + 1 file changed, 1 insertion(+) diff --git a/Body/AAUHuman/BodyModels/GenericBodyModel/Calibration/RangeOfMotionDefinition.any b/Body/AAUHuman/BodyModels/GenericBodyModel/Calibration/RangeOfMotionDefinition.any index 062b6bc56..7cbd8a450 100644 --- a/Body/AAUHuman/BodyModels/GenericBodyModel/Calibration/RangeOfMotionDefinition.any +++ b/Body/AAUHuman/BodyModels/GenericBodyModel/Calibration/RangeOfMotionDefinition.any @@ -25,6 +25,7 @@ BodyModelFolderStructure RangeOfMotion() = { AnyFloat InternallyRotated ??= { 0, 0, MaxInternalRotationAngle }; AnyFloat ExternallyRotated ??= { 0, 0, MaxExternalRotationAngle }; AnyFloat Adduction ??= { MinFlexionInAdduction, MaxAdductionAngle, 0}; + AnyFloat Abduction ??= { 0, MaxAbductionAngle, 0}; AnyFloat Flexed ??= { MaxFlexionAngle, 0, 0}; AnyFloat FlexedAndAdducted ??= { MaxFlexionAngle, MaxAdductionAngle, 0}; AnyFloat FlexedAndAbducted ??= { MaxFlexionInAbductionAngle, MaxAbductionAngle, 0}; From 1bef0a8c43f409347fe2b09494c106a3abe8e95c Mon Sep 17 00:00:00 2001 From: bke Date: Wed, 8 Jan 2025 10:05:05 +0100 Subject: [PATCH 5/7] refactor studies to avoid lower leg calibration errors --- .../Calibration/2ParLeftCalStudies.any | 72 +++++++++-------- .../Calibration/2ParRightCalStudies.any | 79 ++++++++++--------- 2 files changed, 81 insertions(+), 70 deletions(-) diff --git a/Body/AAUHuman/LegTLEM/Calibration/2ParLeftCalStudies.any b/Body/AAUHuman/LegTLEM/Calibration/2ParLeftCalStudies.any index 232adf897..f9cbf1e24 100644 --- a/Body/AAUHuman/LegTLEM/Calibration/2ParLeftCalStudies.any +++ b/Body/AAUHuman/LegTLEM/Calibration/2ParLeftCalStudies.any @@ -8,10 +8,11 @@ LegCalibrationStudy LegCalibration1Left( &..BodyModel.Left.Leg.Mus, { "AdductorMagnus*.*", - "AdductorLongus*.*", + "AdductorLong*.*", "AdductorBrevis*.*", "Pectineus.*", "Gracilis.*", + "TensorFasciaeLatae.*", }, "AnyMuscle" ); @@ -60,9 +61,10 @@ LegCalibrationStudy LegCalibration3Left( nStep = .LegCalibration3Right.nStep; MuscleArr = ObjSearch( - &..BodyModel.Left.Leg.Mus, + {&..BodyModel.Left.Leg.Mus, &..BodyModel.Trunk.Muscles.Left,}, { "Iliacus*.*", + "PsoasMajor*.*", }, "AnyMuscle" ); @@ -76,35 +78,13 @@ LegCalibrationStudy LegCalibration3Left( AnyObjectPtrArray SubTalarPositions = .LegCalibration3Right.SubTalarPositions; }; + LegCalibrationStudy LegCalibration4Left( BodyModelRef=Main.HumanModel.BodyModel, Side=Left, ) = { nStep = .LegCalibration4Right.nStep; - MuscleArr = ObjSearch( - &..BodyModel.Left.Leg.Mus, - { - "TensorFasciaeLatae.*", - }, - "AnyMuscle" - ); - - RminMuscleFiber = repmat(NumElemOf(MuscleArr), .RValues.RMinDefault); - RmaxMuscleFiber = repmat(NumElemOf(MuscleArr), .RValues.RMaxDefault); - - AnyObjectPtrArray HipPositions = .LegCalibration4Right.HipPositions; - AnyObjectPtrArray KneePositions = .LegCalibration4Right.KneePositions; - AnyObjectPtrArray AnklePositions = .LegCalibration4Right.AnklePositions; - AnyObjectPtrArray SubTalarPositions = .LegCalibration4Right.SubTalarPositions; -}; - -LegCalibrationStudy LegCalibration5Left( - BodyModelRef=Main.HumanModel.BodyModel, - Side=Left, -) = { - nStep = .LegCalibration5Right.nStep; - MuscleArr = ObjSearch( &..BodyModel.Left.Leg.Mus, { @@ -120,13 +100,13 @@ LegCalibrationStudy LegCalibration5Left( RminMuscleFiber = repmat(NumElemOf(MuscleArr), .RValues.RMinDefault); RmaxMuscleFiber = repmat(NumElemOf(MuscleArr), .RValues.RMaxDefault); - AnyObjectPtrArray HipPositions = .LegCalibration5Right.HipPositions; - AnyObjectPtrArray KneePositions = .LegCalibration5Right.KneePositions; - AnyObjectPtrArray AnklePositions = .LegCalibration5Right.AnklePositions; - AnyObjectPtrArray SubTalarPositions = .LegCalibration5Right.SubTalarPositions; + AnyObjectPtrArray HipPositions = .LegCalibration4Right.HipPositions; + AnyObjectPtrArray KneePositions = .LegCalibration4Right.KneePositions; + AnyObjectPtrArray AnklePositions = .LegCalibration4Right.AnklePositions; + AnyObjectPtrArray SubTalarPositions = .LegCalibration4Right.SubTalarPositions; }; -LegCalibrationStudy LegCalibration6Left( +LegCalibrationStudy LegCalibration5Left( BodyModelRef=Main.HumanModel.BodyModel, Side=Left, ) = { @@ -150,7 +130,7 @@ LegCalibrationStudy LegCalibration6Left( AnyObjectPtrArray SubTalarPositions = .LegCalibration6Right.SubTalarPositions; }; -LegCalibrationStudy LegCalibration7Left( +LegCalibrationStudy LegCalibration6Left( BodyModelRef=Main.HumanModel.BodyModel, Side=Left, ) = { @@ -159,16 +139,16 @@ LegCalibrationStudy LegCalibration7Left( MuscleArr = ObjSearch( &..BodyModel.Left.Leg.Mus, { - "Tibialis*.*", + "TibialisAnt*.*", + "TibialisPosteriorMed*.*", "ExtensorDigi*.*", "ExtensorHall*.*", - "Soleus*.*", "FlexorDigi*.*", "FlexorHall*.*", "Peroneus*.*", "Plantaris.*", "Gastroc*.*", - }, + }, "AnyMuscle" ); @@ -181,6 +161,30 @@ LegCalibrationStudy LegCalibration7Left( AnyObjectPtrArray SubTalarPositions = .LegCalibration7Right.SubTalarPositions; }; +LegCalibrationStudy LegCalibration7Left( + BodyModelRef = Main.HumanModel.BodyModel, + Side = Left, +) = { + nStep = .LegCalibration8Right.nStep; + + MuscleArr = ObjSearch( + &..BodyModel.Left.Leg.Mus, + { + "TibialisPosteriorLat*.*", + "Soleus*.*", + }, + "AnyMuscle" + ); + + RminMuscleFiber = repmat(NumElemOf(MuscleArr), 1.0); + RmaxMuscleFiber = repmat(NumElemOf(MuscleArr), 1.2); + + AnyObjectPtrArray HipPositions = .LegCalibration8Right.HipPositions; + AnyObjectPtrArray KneePositions = .LegCalibration8Right.KneePositions; + AnyObjectPtrArray AnklePositions = .LegCalibration8Right.AnklePositions; + AnyObjectPtrArray SubTalarPositions = .LegCalibration8Right.SubTalarPositions; +}; + CalibrationSequence = { AnyOperation &Cal1Left = .LegCalibration1Left.FiberAndTendonLengthAdjustment; AnyOperation &Cal2Left = .LegCalibration2Left.FiberAndTendonLengthAdjustment; diff --git a/Body/AAUHuman/LegTLEM/Calibration/2ParRightCalStudies.any b/Body/AAUHuman/LegTLEM/Calibration/2ParRightCalStudies.any index 93ee540fa..9c4d2fcd3 100644 --- a/Body/AAUHuman/LegTLEM/Calibration/2ParRightCalStudies.any +++ b/Body/AAUHuman/LegTLEM/Calibration/2ParRightCalStudies.any @@ -8,10 +8,11 @@ LegCalibrationStudy LegCalibration1Right( &..BodyModel.Right.Leg.Mus, { "AdductorMagnus*.*", - "AdductorLongus*.*", + "AdductorLong*.*", "AdductorBrevis*.*", "Pectineus.*", "Gracilis.*", + "TensorFasciaeLatae.*", }, "AnyMuscle" ); @@ -23,6 +24,7 @@ LegCalibrationStudy LegCalibration1Right( AnyObjectPtrArray HipPositions = repmat(2,{ &.RangeOfMotion.Right.Leg.Hip.InternallyRotated, &.RangeOfMotion.Right.Leg.Hip.Adduction, + &.RangeOfMotion.Right.Leg.Hip.Abduction, &.RangeOfMotion.Right.Leg.Hip.AbductedAndExternallyRotated, &.RangeOfMotion.Right.Leg.Hip.FlexedAndAdducted, &.RangeOfMotion.Right.Leg.Hip.FlexedAndAbducted, @@ -85,9 +87,10 @@ LegCalibrationStudy LegCalibration3Right( nStep = nPos; MuscleArr = ObjSearch( - &..BodyModel.Right.Leg.Mus, + {&..BodyModel.Right.Leg.Mus, &..BodyModel.Trunk.Muscles.Right,}, { "Iliacus*.*", + "Psoas*.*", }, "AnyMuscle" ); @@ -119,7 +122,11 @@ LegCalibrationStudy LegCalibration4Right( MuscleArr = ObjSearch( &..BodyModel.Right.Leg.Mus, { - "TensorFasciaeLatae.*", + "RectusFem*.*", + "BicepsFem*.*", + "Semitend*.*", + "Semimem*.*", + "Sartorius.*", }, "AnyMuscle" ); @@ -129,11 +136,11 @@ LegCalibrationStudy LegCalibration4Right( AnyInt nPos = NumElemOf(HipPositions); AnyObjectPtrArray HipPositions = repmat(2,{ - &.RangeOfMotion.Right.Leg.Hip.InternallyRotated, - &.RangeOfMotion.Right.Leg.Hip.Adduction, + &.RangeOfMotion.Right.Leg.Hip.FlexedAndAdducted, + &.RangeOfMotion.Right.Leg.Hip.FlexedAndAbducted, &.RangeOfMotion.Right.Leg.Hip.AbductedAndExternallyRotated, - &.RangeOfMotion.Right.Leg.Hip.ExtendedAndAdducted, &.RangeOfMotion.Right.Leg.Hip.Extended, + &.RangeOfMotion.Right.Leg.Hip.ExtendedAndAdducted, &.RangeOfMotion.Right.Leg.Hip.ExternallyRotated, }); AnyObjectPtrArray KneePositions = flatten({ @@ -153,11 +160,8 @@ LegCalibrationStudy LegCalibration5Right( MuscleArr = ObjSearch( &..BodyModel.Right.Leg.Mus, { - "RectusFem*.*", - "BicepsFem*.*", - "Semitend*.*", - "Semimem*.*", - "Sartorius.*", + "Vastus*.*", + "Popliteus.*", }, "AnyMuscle" ); @@ -167,12 +171,9 @@ LegCalibrationStudy LegCalibration5Right( AnyInt nPos = NumElemOf(HipPositions); AnyObjectPtrArray HipPositions = repmat(2,{ + &.RangeOfMotion.Right.Leg.Hip.Neutral, &.RangeOfMotion.Right.Leg.Hip.FlexedAndAdducted, - &.RangeOfMotion.Right.Leg.Hip.FlexedAndAbducted, - &.RangeOfMotion.Right.Leg.Hip.AbductedAndExternallyRotated, &.RangeOfMotion.Right.Leg.Hip.Extended, - &.RangeOfMotion.Right.Leg.Hip.ExtendedAndAdducted, - &.RangeOfMotion.Right.Leg.Hip.ExternallyRotated, }); AnyObjectPtrArray KneePositions = flatten({ repmat(round(nPos/2), &.RangeOfMotion.Right.Leg.Knee.MaxFlexionAngle), @@ -191,8 +192,15 @@ LegCalibrationStudy LegCalibration6Right( MuscleArr = ObjSearch( &..BodyModel.Right.Leg.Mus, { - "Vastus*.*", - "Popliteus.*", + "TibialisAnt*.*", + "TibialisPosteriorMed*.*", + "ExtensorDigi*.*", + "ExtensorHall*.*", + "FlexorDigi*.*", + "FlexorHall*.*", + "Peroneus*.*", + "Plantaris.*", + "Gastroc*.*", }, "AnyMuscle" ); @@ -200,18 +208,24 @@ LegCalibrationStudy LegCalibration6Right( RminMuscleFiber = repmat(NumElemOf(MuscleArr), .RValues.RMinDefault); RmaxMuscleFiber = repmat(NumElemOf(MuscleArr), .RValues.RMaxDefault); - AnyInt nPos = NumElemOf(HipPositions); - AnyObjectPtrArray HipPositions = repmat(2,{ - &.RangeOfMotion.Right.Leg.Hip.Neutral, - &.RangeOfMotion.Right.Leg.Hip.FlexedAndAdducted, - &.RangeOfMotion.Right.Leg.Hip.Extended, - }); + AnyInt nPos = NumElemOf(AnklePositions); + AnyObjectPtrArray HipPositions = repmat(nPos, &.RangeOfMotion.Right.Leg.Hip.Neutral); AnyObjectPtrArray KneePositions = flatten({ repmat(round(nPos/2), &.RangeOfMotion.Right.Leg.Knee.MaxFlexionAngle), repmat(round(nPos/2), &.RangeOfMotion.Right.Leg.Knee.MaxExtensionAngle) }); - AnyObjectPtrArray AnklePositions = repmat(nPos, &.RangeOfMotion.Right.Leg.Ankle.Neutral); - AnyObjectPtrArray SubTalarPositions = repmat(nPos, &.RangeOfMotion.Right.Leg.Ankle.Neutral); + AnyObjectPtrArray AnklePositions = flatten(repmat(2, { + &.RangeOfMotion.Right.Leg.Ankle.MaxPlantarFlexionAngle, + &.RangeOfMotion.Right.Leg.Ankle.Neutral, + &.RangeOfMotion.Right.Leg.Ankle.MaxDorsiFlexionAngle, + &.RangeOfMotion.Right.Leg.Ankle.Neutral, + })); + AnyObjectPtrArray SubTalarPositions = flatten(repmat(2, { + &.RangeOfMotion.Right.Leg.Ankle.Neutral, + &.RangeOfMotion.Right.Leg.Ankle.MaxInversionAngle, + &.RangeOfMotion.Right.Leg.Ankle.Neutral, + &.RangeOfMotion.Right.Leg.Ankle.MaxEversionAngle, + })); }; LegCalibrationStudy LegCalibration7Right( @@ -223,21 +237,14 @@ LegCalibrationStudy LegCalibration7Right( MuscleArr = ObjSearch( &..BodyModel.Right.Leg.Mus, { - "Tibialis*.*", - "ExtensorDigi*.*", - "ExtensorHall*.*", + "TibialisPosteriorLat*.*", "Soleus*.*", - "FlexorDigi*.*", - "FlexorHall*.*", - "Peroneus*.*", - "Plantaris.*", - "Gastroc*.*", }, "AnyMuscle" ); - RminMuscleFiber = repmat(NumElemOf(MuscleArr), .RValues.RMinDefault); - RmaxMuscleFiber = repmat(NumElemOf(MuscleArr), .RValues.RMaxDefault); + RminMuscleFiber = repmat(NumElemOf(MuscleArr), 1.0); + RmaxMuscleFiber = repmat(NumElemOf(MuscleArr), 1.2); AnyInt nPos = NumElemOf(AnklePositions); AnyObjectPtrArray HipPositions = repmat(nPos, &.RangeOfMotion.Right.Leg.Hip.Neutral); @@ -266,5 +273,5 @@ CalibrationSequence = { AnyOperation &Cal4Right = .LegCalibration4Right.FiberAndTendonLengthAdjustment; AnyOperation &Cal5Right = .LegCalibration5Right.FiberAndTendonLengthAdjustment; AnyOperation &Cal6Right = .LegCalibration6Right.FiberAndTendonLengthAdjustment; - AnyOperation &Cal7Right = .LegCalibration7Right.FiberAndTendonLengthAdjustment; + AnyOperation &Cal7Right = .LegCalibration7Right.FiberAndTendonLengthAdjustment; }; \ No newline at end of file From 8ce9113585f400706f966087369e42955ab03a6a Mon Sep 17 00:00:00 2001 From: bke Date: Wed, 8 Jan 2025 10:05:18 +0100 Subject: [PATCH 6/7] expand RoM studies for new cal method --- .../test_calibration_lowerbody.any | 112 ++++++++++++++++-- 1 file changed, 100 insertions(+), 12 deletions(-) diff --git a/Tests/Calibration/test_calibration_lowerbody.any b/Tests/Calibration/test_calibration_lowerbody.any index 12875cd89..b8b0355ed 100644 --- a/Tests/Calibration/test_calibration_lowerbody.any +++ b/Tests/Calibration/test_calibration_lowerbody.any @@ -13,7 +13,6 @@ //ignore_errors = ['Currently, no room for tendon'] //fatal_warnings = [ // "Penetration of surface", -// "The tendon/fiber length was calibrated but with issues", //] #include "libdef.any" @@ -31,26 +30,35 @@ #define BM_LEG_MUSCLES_RIGHT _MUSCLES_3E_HILL_ -#define BM_LEG_MUSCLES_LEFT _MUSCLES_3E_HILL_ -#define BM_LEG_LEFT ON +#define BM_LEG_LEFT OFF #define BM_ARM_RIGHT OFF #define BM_ARM_LEFT OFF -#if BM_CALIBRATION_TYPE == 3 -#define BM_MANNEQUIN_DRIVER_HIP_FLEXION_RIGHT OFF -#endif - Main = { #include "/HumanModel.any" - AnyOperation& RunTest = Main.HumanModel.Calibration.CalibrationSequence; + AnyOperation& RunTest = RunAnalysis; + AnyOperationSequence RunAnalysis = { + AnyOperation& Calibration = Main.HumanModel.Calibration.CalibrationSequence; + + #if (BM_CALIBRATION_TYPE == 3) & (BM_LEG_MODEL == _LEG_MODEL_TLEM2_) + AnyOperation& HipFlexExtRoM = Main.HipFlexExtRoM.InverseDynamics; + AnyOperation& HipAddAbdRoM = Main.HipAddAbdRoM.InverseDynamics; + AnyOperation& HipRotRoM = Main.HipRotRoM.InverseDynamics; + AnyOperation& KneeFlexExtRoM = Main.KneeFlexExtRoM.InverseDynamics; + AnyOperation& AnkleFlexRoM = Main.AnkleFlexRoM.InverseDynamics; + AnyOperation& AnkleEverInverRoM = Main.AnkleEverInverRoM.InverseDynamics; + #endif + }; - #if BM_CALIBRATION_TYPE == 3 - AnyBodyStudy PostCalibrationStudy = { - nStep = 100; + /// Template to create a study for the leg - user must provide a driver. + #class_template RoMStudy(__CLASS__ = AnyBodyStudy) { + Kinematics.SolverType = KinSolOverDeterminate; + InitialConditions.SolverType = Kinematics.SolverType; + nStep = 5; Gravity = {0, 0, 0}; InverseDynamics.Criterion.UpperBoundOnOff = Off; AnyFolder &Model = Main.HumanModel.BodyModelWithDefaultDrivers; @@ -79,7 +87,11 @@ Main = AnyRefFrame &Pelvis = Main.HumanModel.BodyModel.Trunk.Segments.PelvisSeg; }; }; - + }; + + + #if BM_CALIBRATION_TYPE == 3 + RoMStudy HipFlexExtRoM() = { AnyKinEqInterPolDriver Hip = { AnyKinMeasure &measure = Main.HumanModel.BodyModel.Interface.Right.HipFlexion; Type = PiecewiseLinear; @@ -94,6 +106,82 @@ Main = Reaction.Type = {Off}; }; }; + RoMStudy HipAddAbdRoM() = { + AnyKinEqInterPolDriver Hip = { + AnyKinMeasure &measure = Main.HumanModel.BodyModel.Interface.Right.HipAbduction; + Type = PiecewiseLinear; + T = linspace(0,1,.nStep); + Data = { + linspace( + Main.HumanModel.Calibration.RangeOfMotion.Right.Leg.Hip.MaxAdductionAngle, + Main.HumanModel.Calibration.RangeOfMotion.Right.Leg.Hip.MaxAbductionAngle, + .nStep + ) * pi/180 + }; + Reaction.Type = {Off}; + }; + }; + RoMStudy HipRotRoM() = { + AnyKinEqInterPolDriver Hip = { + AnyKinMeasure &measure = Main.HumanModel.BodyModel.Interface.Right.HipExternalRotation; + Type = PiecewiseLinear; + T = linspace(0,1,.nStep); + Data = { + linspace( + Main.HumanModel.Calibration.RangeOfMotion.Right.Leg.Hip.MaxExternalRotationAngle, + Main.HumanModel.Calibration.RangeOfMotion.Right.Leg.Hip.MaxInternalRotationAngle, + .nStep + ) * pi/180 + }; + Reaction.Type = {Off}; + }; + }; + RoMStudy KneeFlexExtRoM() = { + AnyKinEqInterPolDriver Knee = { + AnyKinMeasure &measure = Main.HumanModel.BodyModel.Interface.Right.KneeFlexion; + Type = PiecewiseLinear; + T = linspace(0,1,.nStep); + Data = { + linspace( + Main.HumanModel.Calibration.RangeOfMotion.Right.Leg.Knee.MaxExtensionAngle, + Main.HumanModel.Calibration.RangeOfMotion.Right.Leg.Knee.MaxFlexionAngle, + .nStep + ) * pi/180 + }; + Reaction.Type = {Off}; + }; + }; + RoMStudy AnkleFlexRoM() = { + AnyKinEqInterPolDriver Ankle = { + AnyKinMeasure &measure = Main.HumanModel.BodyModel.Interface.Right.AnklePlantarFlexion; + Type = PiecewiseLinear; + T = linspace(0,1,.nStep); + Data = { + linspace( + Main.HumanModel.Calibration.RangeOfMotion.Right.Leg.Ankle.MaxPlantarFlexionAngle, + Main.HumanModel.Calibration.RangeOfMotion.Right.Leg.Ankle.MaxDorsiFlexionAngle, + .nStep + ) * pi/180 + }; + Reaction.Type = {Off}; + }; + }; + RoMStudy AnkleEverInverRoM() = { + AnyKinEqInterPolDriver Ankle = { + AnyKinMeasure &measure = Main.HumanModel.BodyModel.Interface.Right.SubTalarEversion; + Type = PiecewiseLinear; + T = linspace(0,1,.nStep); + Data = { + linspace( + Main.HumanModel.Calibration.RangeOfMotion.Right.Leg.Ankle.MaxEversionAngle, + Main.HumanModel.Calibration.RangeOfMotion.Right.Leg.Ankle.MaxInversionAngle, + .nStep + ) * pi/180 + }; + Reaction.Type = {Off}; + }; + }; + #endif }; From 925a8d29817a0234d0a5c13849479a9b8ca4b583 Mon Sep 17 00:00:00 2001 From: bke Date: Wed, 8 Jan 2025 14:18:22 +0100 Subject: [PATCH 7/7] fix wrong conditional logic --- Tests/Calibration/test_calibration_lowerbody.any | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/Calibration/test_calibration_lowerbody.any b/Tests/Calibration/test_calibration_lowerbody.any index b8b0355ed..27f219f41 100644 --- a/Tests/Calibration/test_calibration_lowerbody.any +++ b/Tests/Calibration/test_calibration_lowerbody.any @@ -90,7 +90,7 @@ Main = }; - #if BM_CALIBRATION_TYPE == 3 + #if (BM_CALIBRATION_TYPE == 3) & (BM_LEG_MODEL == _LEG_MODEL_TLEM2_) RoMStudy HipFlexExtRoM() = { AnyKinEqInterPolDriver Hip = { AnyKinMeasure &measure = Main.HumanModel.BodyModel.Interface.Right.HipFlexion;