392 lines (332 with data), 15.4 kB
AnyFolder ShoulderCal ={
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;
// GH Abd GH Flex GH ext SC Pro SC Elev
AnyFloat Abduction = { 178, 0, 0, -35, 40} * pi/180;
AnyFloat ExternalRotation ={ 89, 0, 89, -36, 15} * pi/180;
AnyFloat InternalRotation = { 89, 0, -70, -23, 15} * pi/180;
AnyFloat HorizontalFlexion = { 89, 120, 0, 10, 9} * pi/180;
AnyFloat Adduction = { -44, 25, -25, 15, -5} * pi/180;
AnyFloat VertivalExtension = { 0, -50, 0, -28, 0} * pi/180;
AnyFloat VerticalFlexion = { 0, 160, -15, -10, 35} * pi/180;
AnyFloat ElbowFlexPosData = {0,90,90,0,0,0,0} * pi/180;
AnyFloat GHPosData = repmat(1,{
Abduction,
ExternalRotation,
InternalRotation,
HorizontalFlexion,
Adduction,
Neutral,
VertivalExtension,
VerticalFlexion
}');
//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 = {0.0, 1.0};
Data = {{30,30}}*pi/180;
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 coracobrachialisMuscles = ObjSearch(MusPrefix+".coracobrachialis*", "AnyMuscle");
AnyFloat coracobrachialisRmin = repmat(NumElemOf(coracobrachialisMuscles), ..RMin);
AnyFloat coracobrachialisRmax = repmat(NumElemOf(coracobrachialisMuscles), ..RMax);
#if BM_ARM_DELTOID_WRAPPING == _DELTOID_WRAPPING_RAKE_
AnyObjectPtrArray deltoideus_scapularMuscles = ObjSearch(MusPrefix+".deltoideus_scapular*", "AnyMuscle");
#else
AnyObjectPtrArray deltoideus_scapularMuscles = arrcat(
ObjSearch(MusPrefix+".deltoideus_posterior*", "AnyMuscle"),
ObjSearch(MusPrefix+".deltoideus_lateral*", "AnyMuscle")
);
#endif
AnyFloat deltoideus_scapularRmin = repmat(NumElemOf(deltoideus_scapularMuscles), ..RMin);
AnyFloat deltoideus_scapularRmax = repmat(NumElemOf(deltoideus_scapularMuscles), ..RMax);
#if BM_ARM_DELTOID_WRAPPING == _DELTOID_WRAPPING_RAKE_
AnyObjectPtrArray deltoideus_clavicularMuscles = ObjSearch(MusPrefix+".deltoideus_clavicular*", "AnyMuscle");
#else
AnyObjectPtrArray deltoideus_clavicularMuscles = ObjSearch(MusPrefix+".deltoideus_anterior*", "AnyMuscle");
#endif
AnyFloat deltoideus_clavicularRmin = repmat(NumElemOf(deltoideus_clavicularMuscles), ..RMin);
AnyFloat deltoideus_clavicularRmax = repmat(NumElemOf(deltoideus_clavicularMuscles), ..RMax);
AnyObjectPtrArray infraspinatusMuscles = ObjSearch(MusPrefix+".infraspinatus*", "AnyMuscle");
AnyFloat infraspinatusRmin = repmat(NumElemOf(infraspinatusMuscles), ..RMin);
AnyFloat infraspinatusRmax = repmat(NumElemOf(infraspinatusMuscles), ..RMax);
AnyObjectPtrArray pectoralis_major_thoracicMuscles = ObjSearch(MusPrefix+".pectoralis_major_thoracic*", "AnyMuscle");
AnyFloat pectoralis_major_thoracicRmin = repmat(NumElemOf(pectoralis_major_thoracicMuscles), ..RMin);
AnyFloat pectoralis_major_thoracicRmax = repmat(NumElemOf(pectoralis_major_thoracicMuscles), ..RMax);
AnyObjectPtrArray pectoralis_major_clavicularMuscles = ObjSearch(MusPrefix+".pectoralis_major_clavicular*", "AnyMuscle");
AnyFloat pectoralis_major_clavicularRmin = repmat(NumElemOf(pectoralis_major_clavicularMuscles), ..RMin);
AnyFloat pectoralis_major_clavicularRmax = repmat(NumElemOf(pectoralis_major_clavicularMuscles), ..RMax);
AnyObjectPtrArray pectoralis_minorMuscles = ObjSearch(MusPrefix+".pectoralis_minor*", "AnyMuscle");
AnyFloat pectoralis_minorRmin = repmat(NumElemOf(pectoralis_minorMuscles), ..RMin);
AnyFloat pectoralis_minorRmax = repmat(NumElemOf(pectoralis_minorMuscles), ..RMax);
AnyObjectPtrArray rhomboideusMuscles = ObjSearch(MusPrefix+".rhomboideus*", "AnyMuscle");
AnyFloat rhomboideusRmin = repmat(NumElemOf(rhomboideusMuscles), ..RMin);
AnyFloat rhomboideusRmax = repmat(NumElemOf(rhomboideusMuscles), ..RMax);
AnyObjectPtrArray serratus_anteriorMuscles = ObjSearch(MusPrefix+".serratus_anterior*", "AnyMuscle");
AnyFloat serratus_anteriorRmin = repmat(NumElemOf(serratus_anteriorMuscles), ..RMin);
AnyFloat serratus_anteriorRmax = repmat(NumElemOf(serratus_anteriorMuscles), ..RMax);
AnyObjectPtrArray subscapularisMuscles = ObjSearch(MusPrefix+".subscapularis*", "AnyMuscle");
AnyFloat subscapularisRmin = repmat(NumElemOf(subscapularisMuscles), ..RMin);
AnyFloat subscapularisRmax = repmat(NumElemOf(subscapularisMuscles), ..RMax);
AnyObjectPtrArray supraspinatusMuscles = ObjSearch(MusPrefix+".supraspinatus*", "AnyMuscle");
AnyFloat supraspinatusRmin = repmat(NumElemOf(supraspinatusMuscles), ..RMin);
AnyFloat supraspinatusRmax = repmat(NumElemOf(supraspinatusMuscles), ..RMax);
AnyObjectPtrArray teres_majorMuscles = ObjSearch(MusPrefix+".teres_major*", "AnyMuscle");
AnyFloat teres_majorRmin = repmat(NumElemOf(teres_majorMuscles), ..RMin);
AnyFloat teres_majorRmax = repmat(NumElemOf(teres_majorMuscles), ..RMax);
AnyObjectPtrArray teres_minorMuscles = ObjSearch(MusPrefix+".teres_minor*", "AnyMuscle");
AnyFloat teres_minorRmin = repmat(NumElemOf(teres_minorMuscles), ..RMin);
AnyFloat teres_minorRmax = repmat(NumElemOf(teres_minorMuscles), ..RMax);
AnyObjectPtrArray trapezius_scapularMuscles = ObjSearch(MusPrefix+".trapezius_scapular*", "AnyMuscle");
AnyFloat trapezius_scapularRmin = repmat(NumElemOf(trapezius_scapularMuscles), ..RMin);
AnyFloat trapezius_scapularRmax = repmat(NumElemOf(trapezius_scapularMuscles), ..RMax);
};
// The study: Operations to be performed on the model
AnyBodyCalibrationStudy ArmCalibrationStudyShoulder = {
AnyFolder &ref=.ShoulderCal;
nStep = SizesOf(ref.GHPosData)[1]*6;
FiberAndTendonLengthAdjustment.CalibrateTendonAtMaxForceOnOff = On;
Kinematics.SmallStepAssumptionOnOff = On;
Kinematics.PosAnalysisOnlyOnOff = On;
InitialConditions.PosAnalysisOnlyOnOff = On;
MuscleArr = arrcat(arrcat(
ref.coracobrachialisMuscles,
ref.deltoideus_scapularMuscles,
ref.deltoideus_clavicularMuscles,
ref.infraspinatusMuscles,
ref.pectoralis_major_thoracicMuscles,
ref.pectoralis_major_clavicularMuscles,
ref.pectoralis_minorMuscles,
ref.rhomboideusMuscles,
ref.serratus_anteriorMuscles),
ref.subscapularisMuscles,
ref.supraspinatusMuscles,
ref.teres_majorMuscles,
ref.teres_minorMuscles,
ref.trapezius_scapularMuscles
);
RminMuscleFiber = arrcat(arrcat(
ref.coracobrachialisRmin,
ref.deltoideus_scapularRmin,
ref.deltoideus_clavicularRmin,
ref.infraspinatusRmin,
ref.pectoralis_major_thoracicRmin,
ref.pectoralis_major_clavicularRmin,
ref.pectoralis_minorRmin,
ref.rhomboideusRmin,
ref.serratus_anteriorRmin),
ref.subscapularisRmin,
ref.supraspinatusRmin,
ref.teres_majorRmin,
ref.teres_minorRmin,
ref.trapezius_scapularRmin
);
RmaxMuscleFiber = arrcat(arrcat(
ref.coracobrachialisRmax,
ref.deltoideus_scapularRmax,
ref.deltoideus_clavicularRmax,
ref.infraspinatusRmax,
ref.pectoralis_major_thoracicRmax,
ref.pectoralis_major_clavicularRmax,
ref.pectoralis_minorRmax,
ref.rhomboideusRmax,
ref.serratus_anteriorRmax),
ref.subscapularisRmax,
ref.supraspinatusRmax,
ref.teres_majorRmax,
ref.teres_minorRmax,
ref.trapezius_scapularRmax
);
};