[38ba34]: / Body / AAUHuman / Arm / Calibration / ElbowCal.any

Download this file

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
  );
  
  
  
};