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

Download this file

276 lines (234 with data), 9.7 kB

/**This is the calibration file it will calibrate the pectoralis muscle
in the article  "Esitmation of musculotendon properties in the human upperlimb"
Grian A. Garner, Marcus G. Pandy
Annals biomedical engineering Vol. 31, pp.207-220, 2003
it has been found that the latissimus dorsi muscle have limited strength 
at short operation length whereas the strength is high for large operation lengths
90 deg abduction  
*/
AnyFolder ArmCal3 ={
  AnyComponentDefinition obj = {};  
  
  AnyFolder &ThoraxSegs =  ...BodyModel.Trunk.SegmentsThorax;
  AnyFolder &LumbarSegs =  ...BodyModel.Trunk.SegmentsLumbar;
  AnyFolder &CervicalSegs =  ...BodyModel.Trunk.SegmentsCervicalSpine;
  AnyFolder &LumbarSpineJoints =  ...BodyModel.Trunk.JointsLumbar;
  AnyFolder &LumbarCervicalJoints =  ...BodyModel.Trunk.JointsCervicalSpine;

  //if pectoralis is included these objects are needed 
  AnyFolder &Cylinder=  .SideHumanFolderRef.ShoulderArm.Mus.Pectoralis_minor2_cyl.Cylinder;

  AnyFolder &SegSideCal = .SideHumanFolderRef.ShoulderArm.Seg;
  AnyFolder &JointsSideCal = .SideHumanFolderRef.ShoulderArm.Jnt;
  
  #if BM_ARM_DELTOID_WRAPPING == _DELTOID_WRAPPING_RAKE_
  AnyFolder& DeltoidRakeRef = .SideHumanFolderRef.ShoulderArm.Mus.ArtificialRake;
  #else
  AnyFolder& DeltoidWrappingPosteriorRef = .SideHumanFolderRef.ShoulderArm.Mus.DeltoidWrappingPosterior;
  AnyFolder& DeltoidWrappingLateralRef = .SideHumanFolderRef.ShoulderArm.Mus.DeltoidWrappingLateral;
  AnyFolder& DeltoidWrappingAnteriorRef = .SideHumanFolderRef.ShoulderArm.Mus.DeltoidWrappingAnterior;
  #endif
  
  AnyFolder& LastissimusWrappingRef = .SideHumanFolderRef.ShoulderArm.Mus.LatissimusDorsiWrapping;
  
  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}; 
  };
  
  
  AnyKinEqSimpleDriver NeckJntDriver = {
    AnyKinMeasure& lb = ....BodyModel.Interface.Trunk.SkullThoraxLateralBending;
    AnyKinMeasure& ar = ....BodyModel.Interface.Trunk.SkullThoraxRotation;
    AnyKinMeasure& fe = ....BodyModel.Interface.Trunk.SkullThoraxFlexion;
    DriverPos = {0,0,0};
    DriverVel = {0,0,0};
    Reaction.Type = {On,On,On};
  };
  
  AnyKinEqSimpleDriver ThoraxDriver ={
    AnyKinMeasure& Ref2 = ....BodyModel.Interface.Trunk.PelvisThoraxLateralBending;        
    AnyKinMeasure& Ref3 = ....BodyModel.Interface.Trunk.PelvisThoraxRotation;   
    AnyKinMeasure& Ref1 = ....BodyModel.Interface.Trunk.PelvisThoraxExtension;
    DriverPos = pi/180*{0,0,0};
    DriverVel = pi/180*{0,0,0};
    Reaction.Type = {On,On,On};  
  };
  
  #if !BM_ARM_SHOULDER_RHYTHM
  AnyKinEqSimpleDriver SCDriver ={
    AnyKinMeasureOrg SC_measure = {
      AnyKinMeasure& ref = ...SideInterfaceFolderRef.SternoClavicularProtraction.SCRot;
      MeasureOrganizer = {0,1};
    };
    DriverPos = {-0.6338205, 0.2559457};
    DriverVel = {-0.0,-0.0};
    Reaction.Type={Off,Off};
  };
  #endif
  
  //This joint is not used in the  mannequin as the is set to a default pos.
  AnyKinEqSimpleDriver WristDriver ={
    AnyKinMeasure& WF = ..SideInterfaceFolderRef.WristFlexion;
    AnyKinMeasure& WA = ..SideInterfaceFolderRef.WristAbduction;
    DriverPos = {0,0};
    DriverVel = {0,0};
    Reaction.Type={On,On};
  };
  
  AnyKinEqSimpleDriver FEDriver ={
    AnyKinMeasure& FE = ..SideInterfaceFolderRef.ElbowFlexion;
    DriverPos = {90*pi/180};  
    DriverVel = {0};
    Reaction.Type = {Off};  
  };
  
  AnyKinEqSimpleDriver PSDriver ={
    AnyKinMeasure& PS = ..SideInterfaceFolderRef.ElbowPronation;
    DriverPos = {-90*pi/180};  
    DriverVel = pi/180*{ 0.0 };
    Reaction.Type = {Off};  
  };
  
  AnyKinEqSimpleDriver GHDriver ={
    AnyKinRotational &GHRotR = ..SideInterfaceFolderRef.GlenohumeralFlexion.GHMeasure;
    DriverPos = pi/180*{90.0,0,0.0 };  
    DriverVel = {0,0,0};
    Reaction.Type = {Off,Off,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_brachiiMuscles = ObjSearch(MusPrefix+".biceps_brachii*", "AnyMuscle");
  AnyObjectPtrArray pectoralis_major_clavicularMuscles = ObjSearch(MusPrefix+".pectoralis_major_clavicular*", "AnyMuscle");
  AnyObjectPtrArray pectoralis_major_thoracicMuscles = ObjSearch(MusPrefix+".pectoralis_major_thoracic*", "AnyMuscle");
  AnyObjectPtrArray teres_majorMuscles = ObjSearch(MusPrefix+".teres_major*", "AnyMuscle");
  AnyObjectPtrArray teres_minorMuscles = ObjSearch(MusPrefix+".teres_minor*", "AnyMuscle");
  
};

// The study: Operations to be performed on the model
AnyBodyCalibrationStudy ArmCalibrationStudy3 = {
  AnyFolder &ref=.ArmCal3; 
  nStep = 1;
  MuscleArr = arrcat(
      ref.biceps_brachiiMuscles,
      ref.pectoralis_major_clavicularMuscles,
      ref.pectoralis_major_thoracicMuscles,
      ref.teres_majorMuscles,
      ref.teres_minorMuscles
  );
  Kinematics.KinematicTol = 1e-07;
  Kinematics.SmallStepAssumptionOnOff = Off;
  InitialConditions.PosAnalysisOnlyOnOff = On;
  Kinematics.PosAnalysisOnlyOnOff = On;
};