[38ba34]: / Body / AAUHuman / Arm / ArtificialRakeForDeltoidMuscle.any

Download this file

263 lines (216 with data), 9.9 kB

/**This is the artificial rake used for the wrapping of the deltiod muscle the rake prevent that the deltoid muscle slides
around in a uncontrolled way on the humerus head */
AnyFolder ArtificialRake ={
  
  AnySeg DeltoidMuscleConnector ={
   
    AnyMat33  As= {
      {...Sign*...Seg.Humerus.Axes0[0][0],...Sign*...Seg.Humerus.Axes0[0][1],...Sign*...Seg.Humerus.Axes0[0][2]},
      {...Sign*...Seg.Humerus.Axes0[1][0],...Sign*...Seg.Humerus.Axes0[1][1],...Sign*...Seg.Humerus.Axes0[1][2]},
      {...Seg.Humerus.Axes0[2][0],...Seg.Humerus.Axes0[2][1],...Seg.Humerus.Axes0[2][2]}
    };

    r0=...Seg.Humerus.r0;  
    Axes0=As;
    
    AnyFunTransform3D &ScaleScapula=...Scaling.Scapula.ScaleFunction;
    AnyFunTransform3D &Scale=...Scaling.Humerus.ScaleFunction;
    
    AnyVar RadiusStd=0.038;  //This is the standard radius of the rake
    
    //Next to points are used for controlling the scaling of the rake they are located with 90 deg spacing
    AnyRefNode P1={
      sRel=.Scale(.StartPoint+{....Sign*-.RadiusStd*cos(pi),.offset,.RadiusStd*sin(pi)});   
    };
    AnyRefNode P2={
      sRel=.Scale(.StartPoint+{....Sign*-.RadiusStd*cos(....Sign*-0.5*pi),.offset,.RadiusStd*sin(....Sign*-0.5*pi)});   
    };      
    AnyVar R1=((P1.sRel[0])^2+(P1.sRel[1])^2+(P1.sRel[2])^2)^0.5;   //Radius found using point P1
    AnyVar R2=((P2.sRel[0])^2+(P2.sRel[1])^2+(P2.sRel[2])^2)^0.5; //Radius found using point P2
    
    //This is the scaled radius calculated using the average radius of R1 and R2 
    AnyVar radius=0.5*(R1+R2);  
    
    Mass=0;
    Jii={0.0,0.0,0.0};
    
    AnyVar no=12;
    AnyVar angspace=...Sign*30*pi/180;
    AnyVar startangle =...Sign*-300*pi/180; 
   
    AnyVec3 StartPoint={0.0,0.0,0.0};
    AnyVar offset=-0.0;
    AnyVec3 DrwRadius =0*{0.005,0.005,0.005};
    AnyVec3 DrwRGB = {47/256,131/256,80/256};  //AnyBody standard green
   
    AnyRefNode DeltoidVia1={
      sRel=.StartPoint+{....Sign*-.radius*cos(.startangle+.angspace*1),.offset,.radius*sin(.startangle+.angspace*1)}
      +....Sign*{-0.015,-0.0125,0.005}*.radius/.RadiusStd;
      AnyDrawNode node  = {RGB=..DrwRGB; ScaleXYZ=..DrwRadius;};
    };
    AnyRefNode DeltoidVia2={
      sRel=.StartPoint+{....Sign*-.radius*cos(.startangle+.angspace*2),.offset,.radius*sin(.startangle+.angspace*2)}
      +....Sign*{-0.01,-0.003,0.005}*.radius/.RadiusStd;    
      AnyDrawNode node  ={RGB=..DrwRGB; ScaleXYZ=..DrwRadius;};
    };
    AnyRefNode DeltoidVia3={
      sRel=.StartPoint+{....Sign*-.radius*cos(.startangle+.angspace*3),.offset,.radius*sin(.startangle+.angspace*3)}
      +....Sign*{0.0,0.005,0.00}*.radius/.RadiusStd;       
      AnyDrawNode node  ={RGB=..DrwRGB; ScaleXYZ=..DrwRadius;};
    };
    AnyRefNode DeltoidVia4={
      sRel=.StartPoint+{....Sign*-.radius*cos(.startangle+.angspace*4),.offset,.radius*sin(.startangle+.angspace*4)}
      +....Sign*{0.0,0.0075,0.00}*.radius/.RadiusStd;        
      AnyDrawNode node  ={RGB=..DrwRGB; ScaleXYZ=..DrwRadius;};
    };
    AnyRefNode DeltoidVia5={
      sRel=.StartPoint+{....Sign*-.radius*cos(.startangle+.angspace*5),.offset,.radius*sin(.startangle+.angspace*5)}
      +....Sign*{0.0,0.01,0.00}*.radius/.RadiusStd;    
      AnyDrawNode node  ={RGB=..DrwRGB; ScaleXYZ=..DrwRadius;};
    };
    AnyRefNode DeltoidVia6={
      sRel=.StartPoint+{....Sign*-.radius*cos(.startangle+.angspace*6),.offset,.radius*sin(.startangle+.angspace*6)}
      +....Sign*{0.0+0.004,0.01,0.00}*.radius/.RadiusStd;        
      AnyDrawNode node  ={RGB=..DrwRGB; ScaleXYZ=..DrwRadius;};
    }; 
    
    
    AnyVar angspace2=...Sign*13*pi/180;
    AnyVar startangle2 =...Sign*-185*pi/180; 
    
    AnyRefNode DeltoidVia7={
      sRel=.StartPoint+{....Sign*-.radius*cos(.startangle2+.angspace2*7),.offset,.radius*sin(.startangle2+.angspace2*7)}
      +....Sign*{-0.00+0.01,-0.0035+0.01,-0.00-0.001} ;        
      AnyDrawNode node  ={RGB=..DrwRGB; ScaleXYZ=..DrwRadius;};
    };
    AnyRefNode DeltoidVia8={
      sRel=.StartPoint+{....Sign*-.radius*cos(.startangle2+.angspace2*8),.offset,.radius*sin(.startangle2+.angspace2*8)}
      +....Sign*{-0.00+0.010,-0.005+0.0075,-0.002-0.002} ;    
      AnyDrawNode node  ={RGB=..DrwRGB; ScaleXYZ=..DrwRadius;};
    };
    AnyRefNode DeltoidVia9={
      sRel=.StartPoint+{....Sign*-.radius*cos(.startangle2+.angspace2*9),.offset,.radius*sin(.startangle2+.angspace2*9)}
      +....Sign*{-0.00+0.011,-0.006+0.005,-0.005-0.003};
      
      AnyDrawNode node  ={RGB=..DrwRGB; ScaleXYZ=..DrwRadius;};
    };
    AnyRefNode DeltoidVia10={
      sRel=.StartPoint+{....Sign*-.radius*cos(.startangle2+.angspace2*10),.offset,.radius*sin(.startangle2+.angspace2*10)}
      +....Sign*{-0.002+0.010,-0.007+0.003,-0.008-0.003};    
      AnyDrawNode node  ={RGB=..DrwRGB; ScaleXYZ=..DrwRadius;};
    };
    AnyRefNode DeltoidVia11={
      sRel=.StartPoint+{....Sign*-.radius*cos(.startangle2+.angspace2*11),.offset,.radius*sin(.startangle2+.angspace2*11)}
      +....Sign*{-0.007+0.011,-0.007,-0.014-0.004}*.radius/.RadiusStd;
      AnyDrawNode node  ={RGB=..DrwRGB; ScaleXYZ=..DrwRadius;};
    };
    AnyRefNode DeltoidVia12={
      sRel=.StartPoint+{....Sign*-.radius*cos(.startangle2+.angspace2*12),.offset,.radius*sin(.startangle2+.angspace2*12)}
      +....Sign*{-0.012+0.012,-0.012,-0.018-0.004}*.radius/.RadiusStd;
      AnyDrawNode node  ={RGB=..DrwRGB; ScaleXYZ=..DrwRadius;};
    };
  };
  
  AnySeg DeltoidMuscleRotControlSeg ={
    Mass=0.00;
    Jii={0.0,0.0,0.0};
    AnyFolder NeutralPositionOnThorax = {
      AnyMat33 DeltoidMuscleConnector_Axes = {
        {....Sign*-0.021288,....Sign* -0.139315, ....Sign*-0.990019}, 
        {....Sign*0.142582,....Sign*   0.979699, ....Sign*-0.140929},
        {0.989554, -0.144159, -0.000992}};
      AnyMat33 Pelvis_Axes  = {{1.000000, 0.000000, 0.000000}, {-0.000000, 1.000000, -0.000000}, {-0.000000, 0.000000, 1.000000}};
      AnyMat33 ARel=DeltoidMuscleConnector_Axes'*Pelvis_Axes;
    };
    
    AnyMat33  As= .....Trunk.SegmentsRibCage.SternumSeg.Axes0*NeutralPositionOnThorax.ARel';
    r0=...Seg.Humerus.DeltoidConnectorCenter.sRel*...Seg.Humerus.Axes0'+...Seg.Humerus.r0;  
    Axes0={{As[0][0],As[0][1],As[0][2]},
      {As[1][0],As[1][1],As[1][2]},
      {As[2][0],As[2][1],As[2][2]}};
  };
  
  AnySphericalJoint DeltoidMuscleConnectorJnt ={
    AnyRefNode &ref1=...Seg.Humerus.DeltoidConnectorCenter ;
    AnySeg &ref2=.DeltoidMuscleRotControlSeg; 
  };
  
  AnyFolder &Scapula=..Seg.Scapula;
 
  Scapula={
    AnyRefNode gh_rotated={
      sRel=.gh.sRel;
      ARel={{....Sign*1,0,0},{0,1,0},{0,0,....Sign*1}};
    };
  };
  
  AnyFolder &Humerus =..Seg.Humerus;
  Humerus={
    AnyRefNode gh_rotated={
      sRel=.gh.sRel;
      ARel={{1,0,0},{0,....Sign*1,0},{0,0,....Sign*1}};
    };
  };
  
  
  AnyKinRotational HumerusScapulaRot={
    AnyRefNode &ref2=.Scapula.gh_rotated; 
    AnyRefNode &ref1=.Humerus.gh_rotated;
    Type = RotVector;
  };
  
  AnyKinRotational HumerusDeltoidMuscleConnectorRot={
    AnyRefNode &ref1=.Scapula.gh_rotated;
    AnySeg &ref2=.DeltoidMuscleRotControlSeg; 
    Type =RotVector;
  };
  
  AnyKinMeasureLinComb LinComb = {
    AnyKinMeasure& u1 = .HumerusScapulaRot;
    AnyKinMeasure& u2 = .HumerusDeltoidMuscleConnectorRot;
    OutDim = 3;
    Coef={
      {0.3,0,0,-1,0,0},
      {0,0.05,0,0,-1,0}, //this one controls the rotaion around the long axis og humerus
      {0,0,0.3,0,0,-1}
    };      
  }; // Measure
  
  //This is not an engine no muscles are attached to the control segment
  //and the deltoidmuscleconnector segment is only driven kinematically 
  //all reactions are swithed off
  AnyKinEqSimpleDriver LinCombDrv={
    AnyKinMeasureLinComb &ref=.LinComb ;
    DriverPos={0,0,0};
    DriverVel={0,0,0};
    Reaction.Type={Off,Off,Off};  
  };
  
  AnyRevoluteJoint DeltoidRevoluteJoint={
    Axis=y;
    AnyRefFrame &ref1=.DeltoidMuscleRotControlSeg; 
    AnyRefFrame &ref2=.DeltoidMuscleConnector; 
    Constraints.Reaction.Type={On,On,On,On,On};
  };
  
  AnyReacForce DeltoidRevoluteJointReactionForce={
    AnyRevoluteJoint &ref=.DeltoidRevoluteJoint;
  };
  
  AnyKinRotational DeltoidMuscleConnectorHumerusRot={
    AnyRefFrame &ref1 = .Humerus;
    AnyRefFrame &ref2 = .DeltoidMuscleRotControlSeg; 
    Type=RotVector;
  };
  
  AnyReacForce DeltoidMuscleConnectorReactionForce={
    AnyKinRotational &ref2=.DeltoidMuscleConnectorHumerusRot;
  };
  
  /*
  This way of driving the rake has some disadvantages
  especially for flexion extension..
  
  AnyKinMeasureLinComb LinComb2 = {
  
  AnyKinPLine ScapulaDeltoidMuscleConnector5={
  AnyRefNode &ref1 =..Scapula.MuscleConnectorPlaneNode;
  AnyRefNode &ref2 = ..DeltoidMuscleConnector.DeltoidVia5;
  AnyDrawPLine drw={Thickness=0.0035;RGB={82/256,85/256,111/256};};
  };
  AnyKinPLine ScapulaDeltoidMuscleConnector9={
  AnyRefNode &ref1 =..Scapula.MuscleConnectorPlaneNode;
  AnyRefNode &ref2 = ..DeltoidMuscleConnector.DeltoidVia9;
  AnyDrawPLine drw={Thickness=0.0035;RGB={82/256,85/256,111/256};};
  };
  Coef={{0.5,-0.5}};
  }; 
  
  
  AnyKinEqSimpleDriver LinCom2Drv={ 
  AnyKinMeasureLinComb &ref=.LinComb2;
  DriverPos={0};
  DriverVel={0};
  Reaction.Type={0};
  };*/
  
  
  AnyKinRotational ScapulaDeltoidMuscleConnectorRot={
    AnyRefFrame &ref1=.DeltoidMuscleRotControlSeg; 
    AnySeg &ref2 = .DeltoidMuscleConnector;
    Type=RotVector; 
  };
  
  AnyKinMeasureOrg ScapulaDeltoidMuscleConnectorRotY={
    AnyKinRotational &ref=.ScapulaDeltoidMuscleConnectorRot;
    MeasureOrganizer ={1};
  };
  
  AnyKinEqSimpleDriver LinCom2Drv={ 
    AnyKinMeasure& ref=.ScapulaDeltoidMuscleConnectorRotY;
    DriverPos={-0.1};  
    DriverVel={0};
    Reaction.Type={Off};
  };
  
  
  
};