358 lines (299 with data), 13.3 kB
AnyFolder ElbowCal ={
AnyComponentDefinition obj = {};
AnyFolder &ThoraxSegs = ...BodyModel.Trunk.SegmentsThorax;
AnyFolder &CervicalSegs = ...BodyModel.Trunk.SegmentsCervicalSpine;
AnyFolder &LumbarSegs = ...BodyModel.Trunk.SegmentsLumbar;
AnyFolder &LumbarSpineJoints = ...BodyModel.Trunk.JointsLumbar;
AnyFolder &LumbarCervicalJoints = ...BodyModel.Trunk.JointsCervicalSpine;
AnyFolder &SegSideCal = .SideHumanFolderRef.ShoulderArm.Seg;
AnyFolder &JointsSideCal = .SideHumanFolderRef.ShoulderArm.Jnt;
AnyFolder &MusCalSide = .SideHumanFolderRef.ShoulderArm.Mus;
AnyFolder &MusParCalSide = .SideHumanFolderRef.ShoulderArm.MuscleModels;
AnyFixedRefFrame ground = {
AnyRefNode node = {
ARel=.....BodyModel.Trunk.SegmentsThorax.ThoraxSeg.Axes0;
sRel=.....BodyModel.Trunk.SegmentsThorax.ThoraxSeg.r0;
};
};
AnySphericalJoint ThoraxGround={
AnyRefFrame &Ground = .ground.node;
AnyRefFrame &Sacrum= ....BodyModel.Trunk.SegmentsThorax.ThoraxSeg;
};
AnyKinEqSimpleDriver ThoraxGroundDriver = {
AnySphericalJoint &Jnt = .ThoraxGround;
DriverPos = {0,0,0};
DriverVel = {0,0,0};
Reaction.Type = {Off,Off,Off};
};
#if BM_ARM_SHOULDER_RHYTHM == ON
#include "ExcludeShoulderRhythm.any"
#endif
AnyFloat Neutral = { 0, 0, 0, -23, 12} * pi/180;
AnyFloat ElbowExtended = { 0, 0, 0, -23, 12} * pi/180;
AnyFloat ElbowFlexed = { 0, 0, 0, -23, 12} * pi/180;
AnyFloat ElbowPronation = { 0, 0, 0, -23, 12} * pi/180;
AnyFloat ElbowSupination = { 0, 0, 0, -23, 12} * pi/180;
AnyFloat ShoulderStretch = { 90,120, 0, 5, 20} * pi/180;
AnyFloat PectoralisStretch = { 90,-10, 90, -23, 20} * pi/180;
AnyFloat ElbowFlexPosData = { 0,150, 90, 90, 0, 0} * pi/180;
AnyFloat ElbowProPosData = { 0, 0,-90, 90, 0, 0} * pi/180;
AnyFloat GHPosData = repmat(1,{
ElbowExtended,
ElbowFlexed,
ElbowPronation,
ElbowSupination,
ShoulderStretch,
PectoralisStretch
}');
//Neck driver
AnyKinEqSimpleDriver NeckJntDriver = {
AnyKinMeasure& fe = ....BodyModel.Interface.Trunk.SkullThoraxFlexion;
AnyKinMeasure& ar = ....BodyModel.Interface.Trunk.SkullThoraxRotation;
AnyKinMeasure& lb = ....BodyModel.Interface.Trunk.SkullThoraxLateralBending;
DriverPos = pi/180*{0,0,0};
DriverVel = pi/180*{0,0,0};
Reaction.Type = {Off, Off, Off};
};
AnyKinEqSimpleDriver ThoraxDriver ={
AnyKinMeasure& Ref3 = ....BodyModel.Interface.Trunk.PelvisThoraxRotation;
AnyKinMeasure& Ref1 = ....BodyModel.Interface.Trunk.PelvisThoraxExtension;
AnyKinMeasure& Ref2 = ....BodyModel.Interface.Trunk.PelvisThoraxLateralBending;
DriverPos = pi/180*{0,0,0};
DriverVel = pi/180*{0,0,0};
Reaction.Type = {On,On,On};
};
AnyKinEqSimpleDriver WristFlexionDriver ={
AnyKinMeasure& WF = ..SideInterfaceFolderRef.WristFlexion;
DriverPos = {0}*pi/180;
DriverVel = {0};
Reaction.Type={On};
};
AnyKinEqSimpleDriver WristAbductionDriver ={
AnyKinMeasure& WA = ..SideInterfaceFolderRef.WristAbduction;
DriverPos = {0}*pi/180;
DriverVel = {0};
Reaction.Type={On};
};
AnyKinEqInterPolDriver FEDriver ={
AnyKinMeasure& FE = ..SideInterfaceFolderRef.ElbowFlexion;
Type = PiecewiseLinear;
T = linspace(0,1,SizesOf(Data)[1]);
Data = {.ElbowFlexPosData};
Reaction.Type = {Off};
};
AnyKinEqInterPolDriver PSDriver ={
AnyKinMeasure& PS = ..SideInterfaceFolderRef.ElbowPronation;
Type = PiecewiseLinear;
T = linspace(0,1,SizesOf(Data)[1]);
Data = {.ElbowProPosData};
Reaction.Type = {Off};
};
AnyKinEqInterPolDriver GHDriver ={
AnyKinMeasure& GHAbduction = ..SideInterfaceFolderRef.GlenohumeralAbduction;
AnyKinMeasure& GHFlexion = ..SideInterfaceFolderRef.GlenohumeralFlexion;
AnyKinMeasure& GHExtRot = ..SideInterfaceFolderRef.GlenohumeralExternalRotation;
AnyKinMeasure& SCProtraction = ..SideInterfaceFolderRef.SternoClavicularProtraction;
AnyKinMeasure& SCElevation = ..SideInterfaceFolderRef.SternoClavicularElevation;
Type = PiecewiseLinear;
T = linspace(0,1,SizesOf(Data)[1]);
Data = .GHPosData;
Reaction.Type = repmat(nDim,{Off});
};
//---------------------------------------------------------------------
//Finger drivers
#if BM_ARM_DETAILED_HAND
//finger1
AnyKinEqSimpleDriver CMC1Flexion={
AnyRevoluteJoint &ref= ..SideHumanFolderRef.ShoulderArm.Seg.Hand.Finger1.Jnt.CMCFlexion;
DriverPos={0}*pi/180;
DriverVel={0};
};
AnyKinEqSimpleDriver CMC1Abduction={
AnyRevoluteJoint &ref= ..SideHumanFolderRef.ShoulderArm.Seg.Hand.Finger1.Jnt.CMCAbduction;
DriverPos={0}*pi/180;
DriverVel={0};
};
AnyKinEqSimpleDriver MCP1Flexion=
{
AnyRevoluteJoint &ref=..SideHumanFolderRef.ShoulderArm.Seg.Hand.Finger1.Jnt.MCPFlexion;
DriverPos={0}*pi/180;
DriverVel={0};
};
AnyKinEqSimpleDriver MCP1Abduction=
{
AnyRevoluteJoint &ref=..SideHumanFolderRef.ShoulderArm.Seg.Hand.Finger1.Jnt.MCPAbduction;
DriverPos={0}*pi/180;
DriverVel={0};
};
AnyKinEqSimpleDriver DIP1={
AnyRevoluteJoint &ref= ..SideHumanFolderRef.ShoulderArm.Seg.Hand.Finger1.Jnt.DIP;
DriverPos={0}*pi/180;
DriverVel={0};
};
// finger2
// AnyKinEqSimpleDriver CMC2={
// AnyUniversalJoint &ref= ..SideHumanFolderRef.ShoulderArm.Seg.Hand.Finger2.Jnt.CMC;
// DriverPos={0,0};
// DriverVel={0,0};
// };
AnyKinEqSimpleDriver MCP2={
AnyRevoluteJoint &ref= ..SideHumanFolderRef.ShoulderArm.Seg.Hand.Finger2.Jnt.MCP;
DriverPos={0}*pi/180;
DriverVel={0};
};
AnyKinEqSimpleDriver PIP2={
AnyRevoluteJoint &ref= ..SideHumanFolderRef.ShoulderArm.Seg.Hand.Finger2.Jnt.PIP;
DriverPos={0}*pi/180;
DriverVel={0};
};
AnyKinEqSimpleDriver DIP2={
AnyRevoluteJoint &ref= ..SideHumanFolderRef.ShoulderArm.Seg.Hand.Finger2.Jnt.DIP;
DriverPos={0};
DriverVel={0};
};
// finger3
// AnyKinEqSimpleDriver CMC3={
// AnyUniversalJoint &ref= ..SideHumanFolderRef.ShoulderArm.Seg.Hand.Finger3.Jnt.CMC;
// DriverPos={0,0};
// DriverVel={0,0};
// };
AnyKinEqSimpleDriver MCP3={
AnyRevoluteJoint &ref= ..SideHumanFolderRef.ShoulderArm.Seg.Hand.Finger3.Jnt.MCP;
DriverPos={0}*pi/180;
DriverVel={0};
};
AnyKinEqSimpleDriver PIP3={
AnyRevoluteJoint &ref= ..SideHumanFolderRef.ShoulderArm.Seg.Hand.Finger3.Jnt.PIP;
DriverPos={0}*pi/180;
DriverVel={0};
};
AnyKinEqSimpleDriver DIP3={
AnyRevoluteJoint &ref= ..SideHumanFolderRef.ShoulderArm.Seg.Hand.Finger3.Jnt.DIP;
DriverPos={0};
DriverVel={0};
};
//finger4
// AnyKinEqSimpleDriver CMC4={
// AnyUniversalJoint &ref= ..SideHumanFolderRef.ShoulderArm.Seg.Hand.Finger4.Jnt.CMC;
// DriverPos={0,0}*pi/180;
// DriverVel={0,0};
// };
AnyKinEqSimpleDriver MCP4={
AnyRevoluteJoint &ref= ..SideHumanFolderRef.ShoulderArm.Seg.Hand.Finger4.Jnt.MCP;
DriverPos={0}*pi/180;
DriverVel={0};
};
AnyKinEqSimpleDriver PIP4={
AnyRevoluteJoint &ref= ..SideHumanFolderRef.ShoulderArm.Seg.Hand.Finger4.Jnt.PIP;
DriverPos={0}*pi/180;
DriverVel={0};
};
AnyKinEqSimpleDriver DIP4={
AnyRevoluteJoint &ref= ..SideHumanFolderRef.ShoulderArm.Seg.Hand.Finger4.Jnt.DIP;
DriverPos={0}*pi/180;
DriverVel={0};
};
// finger5
// AnyKinEqSimpleDriver CMC5={
// AnyUniversalJoint &ref= ..SideHumanFolderRef.ShoulderArm.Seg.Hand.Finger5.Jnt.CMC;
// DriverPos={0,0};
// DriverVel={0,0};
// };
AnyKinEqSimpleDriver MCP5={
AnyRevoluteJoint &ref= ..SideHumanFolderRef.ShoulderArm.Seg.Hand.Finger5.Jnt.MCP;
DriverPos={0}*pi/180;
DriverVel={0};
};
AnyKinEqSimpleDriver PIP5={
AnyRevoluteJoint &ref= ..SideHumanFolderRef.ShoulderArm.Seg.Hand.Finger5.Jnt.PIP;
DriverPos={0}*pi/180;
DriverVel={0};
};
AnyKinEqSimpleDriver DIP5={
AnyRevoluteJoint &ref= ..SideHumanFolderRef.ShoulderArm.Seg.Hand.Finger5.Jnt.DIP;
DriverPos={0};
DriverVel={0};
};
#endif
AnyString MusPrefix = CompleteNameOf(&.SideHumanFolderRef.ShoulderArm.Mus);
AnyObjectPtrArray biceps_brachii_caput_breveMuscles = ObjSearch(MusPrefix+".biceps_brachii_caput_bre*", "AnyMuscle");
AnyFloat biceps_brachii_caput_breveRmin = repmat(NumElemOf(biceps_brachii_caput_breveMuscles), ..RMin);
AnyFloat biceps_brachii_caput_breveRmax = repmat(NumElemOf(biceps_brachii_caput_breveMuscles), ..RMax);
AnyObjectPtrArray biceps_brachii_caput_longumMuscles = ObjSearch(MusPrefix+".biceps_brachii_caput_long*", "AnyMuscle");
AnyFloat biceps_brachii_caput_longumRmin = repmat(NumElemOf(biceps_brachii_caput_longumMuscles), ..RMin);
AnyFloat biceps_brachii_caput_longumRmax = repmat(NumElemOf(biceps_brachii_caput_longumMuscles), ..RMax);
AnyObjectPtrArray BrachialisMuscles = ObjSearch(MusPrefix+".Brachialis*", "AnyMuscle");
AnyFloat BrachialisRmin = repmat(NumElemOf(BrachialisMuscles), ..RMin);
AnyFloat BrachialisRmax = repmat(NumElemOf(BrachialisMuscles), ..RMax);
AnyObjectPtrArray TricepsMuscles = ObjSearch(MusPrefix+".Triceps*", "AnyMuscle");
AnyFloat TricepsRmin = repmat(NumElemOf(TricepsMuscles), ..RMin);
AnyFloat TricepsRmax = repmat(NumElemOf(TricepsMuscles), ..RMax);
AnyObjectPtrArray Brach_radMuscles = ObjSearch(MusPrefix+".Brach_rad*", "AnyMuscle");
AnyFloat Brach_radRmin = repmat(NumElemOf(Brach_radMuscles), ..RMin);
AnyFloat Brach_radRmax = repmat(NumElemOf(Brach_radMuscles), ..RMax);
AnyObjectPtrArray AnconeusMuscles = ObjSearch(MusPrefix+".Anconeus*", "AnyMuscle");
AnyFloat AnconeusRmin = repmat(NumElemOf(AnconeusMuscles), ..RMin);
AnyFloat AnconeusRmax = repmat(NumElemOf(AnconeusMuscles), ..RMax);
AnyObjectPtrArray Pronator_teres_caput_humeralMuscles = ObjSearch(MusPrefix+".Pronator_teres_caput_humeral*", "AnyMuscle");
AnyFloat Pronator_teres_caput_humeralRmin = repmat(NumElemOf(Pronator_teres_caput_humeralMuscles), ..RMin);
AnyFloat Pronator_teres_caput_humeralRmax = repmat(NumElemOf(Pronator_teres_caput_humeralMuscles), ..RMax);
AnyObjectPtrArray Pronator_teres_caput_ulnareMuscles = ObjSearch(MusPrefix+".Pronator_teres_caput_ulnare*", "AnyMuscle");
AnyFloat Pronator_teres_caput_ulnareRmin = repmat(NumElemOf(Pronator_teres_caput_ulnareMuscles), ..RMin);
AnyFloat Pronator_teres_caput_ulnareRmax = repmat(NumElemOf(Pronator_teres_caput_ulnareMuscles), ..RMax);
AnyObjectPtrArray Supinator_humerusMuscles = ObjSearch(MusPrefix+".Supinator_humerus*", "AnyMuscle");
AnyFloat Supinator_humerusRmin = repmat(NumElemOf(Supinator_humerusMuscles), ..RMin);
AnyFloat Supinator_humerusRmax = repmat(NumElemOf(Supinator_humerusMuscles), ..RMax);
AnyObjectPtrArray Supinator_ulnaMuscles = ObjSearch(MusPrefix+".Supinator_ulna*", "AnyMuscle");
AnyFloat Supinator_ulnaRmin = repmat(NumElemOf(Supinator_ulnaMuscles), ..RMin);
AnyFloat Supinator_ulnaRmax = repmat(NumElemOf(Supinator_ulnaMuscles), ..RMax);
AnyObjectPtrArray Pron_quadrMuscles = ObjSearch(MusPrefix+".Pron_quadr*", "AnyMuscle");
AnyFloat Pron_quadrRmin = repmat(NumElemOf(Pron_quadrMuscles), ..RMin);
AnyFloat Pron_quadrRmax = repmat(NumElemOf(Pron_quadrMuscles), ..RMax);
};
// The study: Operations to be performed on the model
AnyBodyCalibrationStudy ArmCalibrationStudyElbow = {
AnyFolder &ref=.ElbowCal;
nStep = SizesOf(ref.GHPosData)[1];
Kinematics.SmallStepAssumptionOnOff = Off;
Kinematics.PosAnalysisOnlyOnOff = On;
InitialConditions.PosAnalysisOnlyOnOff = On;
MuscleArr = arrcat(arrcat(
ref.biceps_brachii_caput_breveMuscles,
ref.biceps_brachii_caput_longumMuscles,
ref.BrachialisMuscles,
ref.TricepsMuscles,
ref.Brach_radMuscles,
ref.AnconeusMuscles,
ref.Pronator_teres_caput_humeralMuscles,
ref.Pronator_teres_caput_ulnareMuscles,
ref.Supinator_humerusMuscles,
ref.Supinator_ulnaMuscles),
ref.Pron_quadrMuscles
);
RminMuscleFiber = arrcat(arrcat(
ref.biceps_brachii_caput_breveRmin,
ref.biceps_brachii_caput_longumRmin,
ref.BrachialisRmin,
ref.TricepsRmin,
ref.Brach_radRmin,
ref.AnconeusRmin,
ref.Pronator_teres_caput_humeralRmin,
ref.Pronator_teres_caput_ulnareRmin,
ref.Supinator_humerusRmin,
ref.Supinator_ulnaRmin),
ref.Pron_quadrRmin
);
RmaxMuscleFiber = arrcat(arrcat(
ref.biceps_brachii_caput_breveRmax,
ref.biceps_brachii_caput_longumRmax,
ref.BrachialisRmax,
ref.TricepsRmax,
ref.Brach_radRmax,
ref.AnconeusRmax,
ref.Pronator_teres_caput_humeralRmax,
ref.Pronator_teres_caput_ulnareRmax,
ref.Supinator_humerusRmax,
ref.Supinator_ulnaRmax),
ref.Pron_quadrRmax
);
};