231 lines (192 with data), 9.0 kB
//This is the calibration1 file, it will calibrate all muscle in the leg in
//a neutral position (all joint angles in the drivers are zero)
//The subsequent calibrations 2 and 3 will overwrite some of the values
//obtained in this study
AnyFolder LegCalAnkle =
{
AnyComponentDefinition obj = {};
AnyFolder &Pelvis = ...BodyModel.Trunk.SegmentsLumbar.PelvisSeg;
AnyFolder &Sacrum = ...BodyModel.Trunk.SegmentsLumbar.SacrumSeg;
// Segments needed for the Psoas Major muscles
AnyFolder &SegmentsLumbar = ...BodyModel.Trunk.SegmentsLumbar;
AnyFolder &Thorax = ...BodyModel.Trunk.SegmentsThorax.ThoraxSeg;
AnyFolder &LegSegSide = .SideHumanFolderRef.Leg.Seg;
AnyFolder &LegJointsSide = .SideHumanFolderRef.Leg.Jnt;
AnyFolder &TrunkJoints = ...BodyModel.Trunk.JointsLumbar;
AnyFolder &MusCalSide = .SideHumanFolderRef.Leg.Mus;
// Ankle position variables // PlantarFlexion - SubtalarEversion
AnyFloat PlantarFlexion = { 45, 0} * pi/180;
AnyFloat SubtalarEversion = { 0, 20} * pi/180;
AnyFloat DorsiFlexion = { -20, 0} * pi/180;
AnyFloat SubtalarInversion = { 0, -30} * pi/180;
AnyFloat KneeFlexed = { 155} * pi/180;
AnyFloat KneeExtended = { -3} * pi/180;
AnyFloat AnklePositions = flatten(repmat(2,{
PlantarFlexion[0],
SubtalarEversion[0],
DorsiFlexion[0],
SubtalarInversion[0]
}'));
AnyFloat SubtalarPositions = flatten(repmat(2,{
PlantarFlexion[1],
SubtalarEversion[1],
DorsiFlexion[1],
SubtalarInversion[1]
}'));
AnyFloat KneePositions = flatten({repmat(4,KneeFlexed),repmat(4,KneeExtended)});
AnyFixedRefFrame ground =
{
AnyRefNode node =
{
ARel=..Pelvis.Axes0;
sRel=..Pelvis.r0;
};
};
AnyKinEq ThoraxFix =
{
AnyKinMeasure& PelvisThoraxExtension = ....BodyModel.Interface.Trunk.PelvisThoraxExtension;
AnyKinMeasure& PelvisThoraxLateralBending = ....BodyModel.Interface.Trunk.PelvisThoraxLateralBending;
AnyKinMeasure& PelvisThoraxRotation = ....BodyModel.Interface.Trunk.PelvisThoraxRotation;
};
AnyKinEq PelvisFix =
{
AnyKinLinear Lin =
{
AnyRefFrame &ground = ..ground.node;
AnyRefFrame &Pelvis = .....BodyModel.Trunk.SegmentsLumbar.PelvisSeg;
};
AnyKinRotational Rot =
{
Type = RotAxesAngles;
AnyRefFrame &ground = ..ground.node;
AnyRefFrame &Pelvis = .....BodyModel.Trunk.SegmentsLumbar.PelvisSeg;
};
};
AnyKinEqInterPolDriver Hip =
{
AnyKinRotational &Spherical = ..SideInterfaceFolderRef.HipFlexion.HipMeasure;
Type = PiecewiseLinear;
T = {0.0, 1.0};
Data = {{0, 0},
{0, 0},
{0, 0}}*pi/180;
Reaction.Type = {Off, Off, Off};
};
AnyKinEqInterPolDriver Knee =
{
AnyKinMeasure& Hinge = ..SideInterfaceFolderRef.KneeFlexion;
Type = PiecewiseLinear;
T = linspace(0,1,SizesOf(Data)[1]);
Data = {.KneePositions}; // ? degrees knee flexion
Reaction.Type = {Off};
};
#if BM_FOOT_MODEL == _FOOT_MODEL_DEFAULT_
AnyKinEqInterPolDriver Ankle =
{
AnyKinMeasure& Hinge = ..SideInterfaceFolderRef.AnklePlantarFlexion;
Type = PiecewiseLinear;
T = linspace(0,1,SizesOf(Data)[1]);
Data = {.AnklePositions};
Reaction.Type = {Off};
};
AnyKinEqInterPolDriver SubTalar =
{
AnyKinMeasure& Hinge = ..SideInterfaceFolderRef.SubTalarEversion;
Type = PiecewiseLinear;
T = linspace(0,1,SizesOf(Data)[1]);
Data = {.SubtalarPositions};
Reaction.Type = {Off};
};
#endif
AnyString MusPrefix = CompleteNameOf(&.SideHumanFolderRef.Leg.Mus);
AnyObjectPtrArray TibialisAnteriorMuscles = ObjSearch(MusPrefix+".TibialisAnterior*", "AnyMuscle");
AnyFloat TibialisAnteriorRmin = repmat(NumElemOf(TibialisAnteriorMuscles), ..RMin);
AnyFloat TibialisAnteriorRmax = repmat(NumElemOf(TibialisAnteriorMuscles), ..RMax);
AnyObjectPtrArray ExtensorDigitorumLongusMuscles = ObjSearch(MusPrefix+".ExtensorDigitorumLongus*", "AnyMuscle");
AnyFloat ExtensorDigitorumLongusRmin = repmat(NumElemOf(ExtensorDigitorumLongusMuscles), ..RMin);
AnyFloat ExtensorDigitorumLongusRmax = repmat(NumElemOf(ExtensorDigitorumLongusMuscles), ..RMax);
AnyObjectPtrArray ExtensorHallucisLongusMuscles = ObjSearch(MusPrefix+".ExtensorHallucisLongus*", "AnyMuscle");
AnyFloat ExtensorHallucisLongusRmin = repmat(NumElemOf(ExtensorHallucisLongusMuscles), ..RMin);
AnyFloat ExtensorHallucisLongusRmax = repmat(NumElemOf(ExtensorHallucisLongusMuscles), ..RMax);
AnyObjectPtrArray SoleusMuscles = ObjSearch(MusPrefix+".Soleus*", "AnyMuscle");
AnyFloat SoleusRmin = repmat(NumElemOf(SoleusMuscles), ..RMin);
AnyFloat SoleusRmax = repmat(NumElemOf(SoleusMuscles), ..RMax);
AnyObjectPtrArray TibialisPosteriorMuscles = ObjSearch(MusPrefix+".TibialisPosterior*", "AnyMuscle");
AnyFloat TibialisPosteriorRmin = repmat(NumElemOf(TibialisPosteriorMuscles), ..RMin);
AnyFloat TibialisPosteriorRmax = repmat(NumElemOf(TibialisPosteriorMuscles), ..RMax);
AnyObjectPtrArray FlexorDigitorumLongusMuscles = ObjSearch(MusPrefix+".FlexorDigitorumLongus*", "AnyMuscle");
AnyFloat FlexorDigitorumLongusRmin = repmat(NumElemOf(FlexorDigitorumLongusMuscles), ..RMin);
AnyFloat FlexorDigitorumLongusRmax = repmat(NumElemOf(FlexorDigitorumLongusMuscles), ..RMax);
AnyObjectPtrArray FlexorHallucisLongusMuscles = ObjSearch(MusPrefix+".FlexorHallucisLongus*", "AnyMuscle");
AnyFloat FlexorHallucisLongusRmin = repmat(NumElemOf(FlexorHallucisLongusMuscles), ..RMin);
AnyFloat FlexorHallucisLongusRmax = repmat(NumElemOf(FlexorHallucisLongusMuscles), ..RMax);
AnyObjectPtrArray PeroneusBrevisMuscles = ObjSearch(MusPrefix+".PeroneusBrevis*", "AnyMuscle");
AnyFloat PeroneusBrevisRmin = repmat(NumElemOf(PeroneusBrevisMuscles), ..RMin);
AnyFloat PeroneusBrevisRmax = repmat(NumElemOf(PeroneusBrevisMuscles), ..RMax);
AnyObjectPtrArray PeroneusLongusMuscles = ObjSearch(MusPrefix+".PeroneusLongus*", "AnyMuscle");
AnyFloat PeroneusLongusRmin = repmat(NumElemOf(PeroneusLongusMuscles), ..RMin);
AnyFloat PeroneusLongusRmax = repmat(NumElemOf(PeroneusLongusMuscles), ..RMax);
AnyObjectPtrArray PeroneusTertiusMuscles = ObjSearch(MusPrefix+".PeroneusTertius*", "AnyMuscle");
AnyFloat PeroneusTertiusRmin = repmat(NumElemOf(PeroneusTertiusMuscles), ..RMin);
AnyFloat PeroneusTertiusRmax = repmat(NumElemOf(PeroneusTertiusMuscles), ..RMax);
// Two-joint muscles
AnyObjectPtrArray GastrocnemiusMuscles = ObjSearch(MusPrefix+".Gastrocnemius*", "AnyMuscle");
AnyFloat GastrocnemiusRmin = repmat(NumElemOf(GastrocnemiusMuscles), ..RMin);
AnyFloat GastrocnemiusRmax = repmat(NumElemOf(GastrocnemiusMuscles), ..RMax);
AnyObjectPtrArray PlantarisMuscles = ObjSearch(MusPrefix+".Plantaris*", "AnyMuscle");
AnyFloat PlantarisRmin = repmat(NumElemOf(PlantarisMuscles), ..RMin);
AnyFloat PlantarisRmax = repmat(NumElemOf(PlantarisMuscles), ..RMax);
};
// The study: Operations to be performed on the model
AnyBodyCalibrationStudy LegCalibrationStudyAnkle =
{
AnyFolder &ref=.LegCalAnkle;
nStep = 8;
FiberAndTendonLengthAdjustment.CalibrateTendonAtMaxForceOnOff = On;
Kinematics.SmallStepAssumptionOnOff = Off;
InitialConditions.SmallStepAssumptionOnOff = Off;
Kinematics.PosAnalysisOnlyOnOff = On;
InitialConditions.PosAnalysisOnlyOnOff = On;
MuscleArr = arrcat(arrcat(
ref.TibialisAnteriorMuscles,
ref.ExtensorDigitorumLongusMuscles,
ref.ExtensorHallucisLongusMuscles,
ref.SoleusMuscles,
ref.TibialisPosteriorMuscles,
ref.FlexorDigitorumLongusMuscles,
ref.FlexorHallucisLongusMuscles,
ref.PeroneusBrevisMuscles,
ref.PeroneusLongusMuscles,
ref.PeroneusTertiusMuscles),
ref.GastrocnemiusMuscles,
ref.PlantarisMuscles
);
RminMuscleFiber = arrcat(arrcat(
ref.TibialisAnteriorRmin,
ref.ExtensorDigitorumLongusRmin,
ref.ExtensorHallucisLongusRmin,
ref.SoleusRmin,
ref.TibialisPosteriorRmin,
ref.FlexorDigitorumLongusRmin,
ref.FlexorHallucisLongusRmin,
ref.PeroneusBrevisRmin,
ref.PeroneusLongusRmin,
ref.PeroneusTertiusRmin),
ref.GastrocnemiusRmin,
ref.PlantarisRmin
);
RmaxMuscleFiber = arrcat(arrcat(
ref.TibialisAnteriorRmax,
ref.ExtensorDigitorumLongusRmax,
ref.ExtensorHallucisLongusRmax,
ref.SoleusRmax,
ref.TibialisPosteriorRmax,
ref.FlexorDigitorumLongusRmax,
ref.FlexorHallucisLongusRmax,
ref.PeroneusBrevisRmax,
ref.PeroneusLongusRmax,
ref.PeroneusTertiusRmax),
ref.GastrocnemiusRmax,
ref.PlantarisRmax
);
};