[38ba34]: / Tools / ModelUtilities / FrictionContactMuscles / ContactSurfaceLinPush.any

Download this file

364 lines (306 with data), 13.4 kB

AnyFolder Push ={
  AnyComponentDefinition obj = {};
  AnyKinLinear LinS={
    Ref=0;
    AnyRefFrame &BaseObject=..BaseObject;
    AnyRefFrame &StrengthObject=..StrengthObject;
  };
  
  
  AnyKinMeasureOrg LinMeasureOrg0 ={
    AnyKinLinear &ref=.LinS;
    MeasureOrganizer={..Direction[0]};
  };
  
  AnyKinMeasureOrg LinMeasureOrg1 ={
    AnyKinLinear &ref=.LinS;
    MeasureOrganizer={..Direction[1]};
  };
  
  AnyKinMeasureOrg LinMeasureOrg2 ={
    AnyKinLinear &ref=.LinS;
    MeasureOrganizer={..Direction[2]};
  };
  
  
  AnyVar UserDefinedMeasure=LinMeasureOrg0.Pos[0];
  AnyVar RadiusMeasure=sqrt(LinMeasureOrg1.Pos[0]^2+LinMeasureOrg2.Pos[0]^2);
  
  
  AnyIntVar LowerThanHighLimit = ltfun(UserDefinedMeasure,.UserDefinedLimitHigh);
  AnyIntVar GreaterThanLowLimit = gtfun(UserDefinedMeasure,.UserDefinedLimitLow);
  AnyIntVar LowerThanRadiusLimit = ltfun(RadiusMeasure,.UserDefinedRadiusLimit);
  
  AnyVar UserDefinedStrengthFunction= iffun( andfun(andfun(LowerThanHighLimit,GreaterThanLowLimit),LowerThanRadiusLimit),.Strength,0.0);
  
  
  //create the directions vectors 
  AnyVec3 NormalVector={ 
    iffun(.Direction[0]-0,0,1),
    iffun(.Direction[0]-1,0,1),
    iffun(.Direction[0]-2,0,1)};
  
  AnyVec3 FrictionVector1={ 
    iffun(.Direction[1]-0,0,1),
    iffun(.Direction[1]-1,0,1),
    iffun(.Direction[1]-2,0,1)};
  
  AnyVec3 FrictionVector2={ 
    iffun(.Direction[2]-0,0,1),
    iffun(.Direction[2]-1,0,1),
    iffun(.Direction[2]-2,0,1)};
  
  AnyMuscleModelUsr1 ContactMuscleModel=   {
    F0 = 0.000000;
    S = .UserDefinedStrengthFunction;
  };        
  
  AnyMuscleModelUsr1 ContactMuscleModel1=   {
    F0 = 0.000000;
    S = .UserDefinedStrengthFunction;
  };        
  
  AnyMuscleModelUsr1 ContactMuscleModel2=   {
    F0 = 0.000000;
    S = .UserDefinedStrengthFunction;
  };        
  
  
  AnyKinLinear Lin={
    AnyRefFrame &Box =..BaseObject;
    AnyRefFrame &Hand = ..TargetObject;
    Ref=0;
  };
  
  
  
  AnyFolder Direction0Muscle ={
    AnyRecruitedActuator NormalDirectionMuscle={
      AnyKinMeasureOrg NormalDir={
        AnyKinLinear &ref=...Lin;
        MeasureOrganizer={....Direction[0]}; //always pick first element
      };
      Strength = ..UserDefinedStrengthFunction;
      Type = NonNegative;
      SET_DEFAULT_ACTUATOR_VOLUME;
       
    };
    
    AnyForceMomentMeasure NetMuscleEffect =
    {
      AnyForceBase& mus = .NormalDirectionMuscle;
      AnyRefFrame& TargetObject = ...TargetObject;
    };
    AnyVec3 NetMuscleEffect_Force_Local = NetMuscleEffect.F * ..BaseObject.Axes;
    
  };
  
  AnyFolder Direction01Muscle={
    AnyFolder Push={
      AnyKinMeasureOrg NormalDir={
        AnyKinLinear &ref=...Lin;
        MeasureOrganizer={....Direction[0]}; //always pick first element
      };
      AnyKinMeasureOrg FrictionDir={
        AnyKinLinear &ref=...Lin;
        MeasureOrganizer={....Direction[1]}; // pick second element
      };
      AnyKinMeasureLinComb LinCombinationMeasure ={
        AnyKinMeasure& u1=.NormalDir;
        AnyKinMeasure& u2=.FrictionDir; 
        OutDim = 1;
        Coef={
          {1,....StaticFrictionCoefficient}
        };     
      };
      
      AnyRecruitedActuator FrictionMuscle={
        //       AnyKinMeasure& ref1=.FrictionDir;
        AnyKinMeasureLinComb &ref1=.LinCombinationMeasure;
        Strength = ...UserDefinedStrengthFunction;
        Type = NonNegative;
        SET_DEFAULT_ACTUATOR_VOLUME;
         
      };
      
      AnyForceMomentMeasure NetMuscleEffect =
      {
        AnyForceBase& mus = .FrictionMuscle;
        AnyRefFrame& TargetObject = ....TargetObject;
      };      
      AnyVec3 NetMuscleEffect_Force_Local = NetMuscleEffect.F * ...BaseObject.Axes;
      
    };//Push
    
    AnyFolder Pull={
      AnyKinMeasureOrg NormalDir={
        AnyKinLinear &ref=...Lin;
        MeasureOrganizer={....Direction[0]}; //always pick first element
      };
      AnyKinMeasureOrg FrictionDir={
        AnyKinLinear &ref=...Lin;
        MeasureOrganizer={....Direction[1]}; // pick second element
      };
      AnyKinMeasureLinComb LinCombinationMeasure ={
        AnyKinMeasure& u1=.NormalDir;
        AnyKinMeasure& u2=.FrictionDir; 
        OutDim = 1;
        Coef={
          {-1,....StaticFrictionCoefficient}
        };     
      };
      
      AnyRecruitedActuator FrictionMuscle={
        AnyKinMeasureLinComb &ref1=.LinCombinationMeasure;
        //        AnyKinMeasure& ref1=.FrictionDir;
        Strength = ...UserDefinedStrengthFunction;
        Type = NonPositive;
        SET_DEFAULT_ACTUATOR_VOLUME;
         
      };
      
      AnyForceMomentMeasure NetMuscleEffect =
      {
        AnyForceBase& mus = .FrictionMuscle;
        AnyRefFrame& TargetObject = ....TargetObject;
      };
      AnyVec3 NetMuscleEffect_Force_Local = NetMuscleEffect.F * ...BaseObject.Axes;
    };//Pull
  };
  
  AnyFolder Direction02Muscle={
    AnyFolder Push={
      AnyKinMeasureOrg NormalDir={
        AnyKinLinear &ref=...Lin;
        MeasureOrganizer={....Direction[0]}; //always pick first element
      };
      AnyKinMeasureOrg FrictionDir={
        AnyKinLinear &ref=...Lin;
        MeasureOrganizer={....Direction[2]}; // pick last element
      };
      AnyKinMeasureLinComb LinCombinationMeasure ={
        AnyKinMeasure& u1=.NormalDir;
        AnyKinMeasure& u2=.FrictionDir;    
        OutDim = 1;
        Coef={
          {1,....StaticFrictionCoefficient}
        };     
      };
      
      AnyRecruitedActuator FrictionMuscle={
        AnyKinMeasureLinComb &ref1=.LinCombinationMeasure;
        //AnyKinMeasure& ref1=.FrictionDir;
        
        Strength = ...UserDefinedStrengthFunction;
        Type = NonNegative;
        SET_DEFAULT_ACTUATOR_VOLUME;
         
      };
      
      AnyForceMomentMeasure NetMuscleEffect =
      {
        AnyForceBase& mus = .FrictionMuscle;
        AnyRefFrame& TargetObject = ....TargetObject;
      };
      AnyVec3 NetMuscleEffect_Force_Local = NetMuscleEffect.F * ...BaseObject.Axes;
      
    };//Push
    
    AnyFolder Pull={
      AnyKinMeasureOrg NormalDir={
        AnyKinLinear &ref=...Lin;
        MeasureOrganizer={....Direction[0]}; //always pick first element
      };
      AnyKinMeasureOrg FrictionDir={
        AnyKinLinear &ref=...Lin;
        MeasureOrganizer={....Direction[2]}; // pick last element
      };
      AnyKinMeasureLinComb LinCombinationMeasure ={
        AnyKinMeasure& u1=.NormalDir;
        AnyKinMeasure& u2=.FrictionDir;    
        OutDim = 1;
        Coef={
          {-1,....StaticFrictionCoefficient}
        };
      };
      
      AnyRecruitedActuator FrictionMuscle={
        AnyKinMeasureLinComb &ref1=.LinCombinationMeasure;
        //        AnyKinMeasure& ref1=.FrictionDir;
        Strength = ...UserDefinedStrengthFunction;
        Type = NonPositive;
        SET_DEFAULT_ACTUATOR_VOLUME;
         
      };
      
      AnyForceMomentMeasure NetMuscleEffect =
      {
        AnyForceBase& mus = .FrictionMuscle;
        AnyRefFrame& TargetObject = ....TargetObject;
      };
      AnyVec3 NetMuscleEffect_Force_Local = NetMuscleEffect.F * ...BaseObject.Axes;
      
    };//Pull
    
  };
  
  AnyDrawVector DrawNormalForce =     
  {
    AnyRefFrame &ref=..TargetObject;
    Vec =..ScaleFactor*..DrawRef.DrawSettingsSupport.Lin.ScaleFactor*.NormalForceVec_Global;
    
    PointAway = Off;
    DrawCoord = Off;
    GlobalCoord = On;
    
    Line.RGB = ..DrawRef.DrawSettingsSupport.Lin.RGB;
    Line.Thickness = ..DrawRef.DrawSettingsSupport.Lin.Thickness;
    Line.End.Thickness = 2*..DrawRef.DrawSettingsSupport.Lin.Thickness;  
    Line.End.Length = 4*..DrawRef.DrawSettingsSupport.Lin.Thickness;
    
  };
  
  AnyDrawVector DrawFrictionForce =     
  {  
    AnyRefFrame &ref=..TargetObject;
    Vec =..ScaleFactor*..DrawRef.DrawSettingsSupport.Lin.ScaleFactor*.FrictionForceVec_Global;
    
    PointAway = Off;
    DrawCoord = Off;
    GlobalCoord = On;
    
    Line.RGB = ..DrawRef.DrawSettingsSupport.Lin.RGB;
    Line.Thickness = ..DrawRef.DrawSettingsSupport.Lin.Thickness;
    Line.End.Thickness = 2*..DrawRef.DrawSettingsSupport.Lin.Thickness;  
    Line.End.Length = 4*..DrawRef.DrawSettingsSupport.Lin.Thickness;
  };
  
  //Resultant force calculation w.r.t either local or global reference systems
  AnyVec3 TotalForceVec_Global = 
  Direction0Muscle.NetMuscleEffect.F + 
  Direction01Muscle.Push.NetMuscleEffect.F + 
  Direction01Muscle.Pull.NetMuscleEffect.F +
  Direction02Muscle.Push.NetMuscleEffect.F +
  Direction02Muscle.Pull.NetMuscleEffect.F ;
  
  AnyVec3 TotalForceVec_Local = TotalForceVec_Global * .BaseObject.Axes;
  
  AnyVec3 NormalForceVec_Local = (TotalForceVec_Local* NormalVector') * NormalVector ;
  AnyVec3 FrictionForceVec1_Local = (TotalForceVec_Local* FrictionVector1') * FrictionVector1;
  AnyVec3 FrictionForceVec2_Local = (TotalForceVec_Local* FrictionVector2') * FrictionVector2;
  AnyVec3 FrictionForceVec_Local = FrictionForceVec1_Local + FrictionForceVec2_Local;
  AnyVec3 NormalForceVec_Global = NormalForceVec_Local * .BaseObject.Axes';
  AnyVec3 FrictionForceVec_Global = FrictionForceVec_Local * .BaseObject.Axes';
  
  AnyVec3 NormalForceVec = NormalForceVec_Global;
  AnyVar NormalForceScalar = vnorm(NormalForceVec);
  AnyVec3 NormalForceVec2 = NormalForceVec;
  AnyVar NormalForceScalar2 = NormalForceScalar ;
  AnyVec3 FrictionForceVec = FrictionForceVec_Global ;
  AnyVar FrictionForceScalar = vnorm(FrictionForceVec) ;
  
  //--> Old code for calculating the normal and the friction forces. Let's keep these for a while.
  //  AnyVec3 NormalForceVec = DrawNormalForce.Vec/(.ScaleFactor*.DrawRef.DrawSettingsSupport.Lin.ScaleFactor);
  //  AnyVar NormalForceScalar = (NormalForceVec[0]^2+NormalForceVec[1]^2+NormalForceVec[2]^2)^0.5;
  //  AnyVec3 NormalForceVec2 = NormalForceValue.NormalForceVector/(.ScaleFactor*.DrawRef.DrawSettingsSupport.Lin.ScaleFactor);
  //  AnyVar NormalForceScalar2 = (NormalForceVec2[0]^2+NormalForceVec2[1]^2+NormalForceVec2[2]^2)^0.5;
  //  AnyVec3 FrictionForceVec = DrawFrictionForce.Vec/(.ScaleFactor*.DrawRef.DrawSettingsSupport.Lin.ScaleFactor);
  //  AnyVar FrictionForceScalar = (FrictionForceVec[0]^2+FrictionForceVec[1]^2+FrictionForceVec[2]^2)^0.5;  
  //  AnyDrawVector DrawNormalForce =     {
  //    AnyRefFrame &ref=..TargetObject;
  //    AnyVar Strength=   iffun(.ContactMuscleModel.S,.ContactMuscleModel.S,0.00001);
  //    Vec =..ScaleFactor*..DrawRef.DrawSettingsSupport.Lin.ScaleFactor*(
  //    .NormalVector*.Direction0Muscle.NormalDirectionMuscle.Fout[0]*..BaseObject.Axes'
  //    +.NormalVector*.Direction01Muscle.Push.FrictionMuscle.Fout[0]*..BaseObject.Axes'
  //    +.NormalVector*.Direction02Muscle.Push.FrictionMuscle.Fout[0]*..BaseObject.Axes'
  //    +.NormalVector*.Direction01Muscle.Pull.FrictionMuscle.Fout[0]*..BaseObject.Axes'
  //    +.NormalVector*.Direction02Muscle.Pull.FrictionMuscle.Fout[0]*..BaseObject.Axes');
  //    AnyVar lenght=Strength*(2-(1-Strength/sqrt(Strength^2)));
  //    
  //    PointAway = Off;
  //    DrawCoord = Off;
  //    
  //    Line.RGB = ..DrawRef.DrawSettingsSupport.Lin.RGB;
  //    Line.Thickness = ..DrawRef.DrawSettingsSupport.Lin.Thickness;
  //    Line.End.Thickness = 2*..DrawRef.DrawSettingsSupport.Lin.Thickness;  
  //    Line.End.Length = 4*..DrawRef.DrawSettingsSupport.Lin.Thickness;
  //    
  //  };
  //  
  //  AnyFolder NormalForceValue =     {
  //    AnyRefFrame &ref=..TargetObject;
  //    AnyVar Strength=   iffun(.ContactMuscleModel.S,.ContactMuscleModel.S,0.00001);
  //    AnyVec3 NormalForceVector =..ScaleFactor*..DrawRef.DrawSettingsSupport.Lin.ScaleFactor*(
  //    .NormalVector*.Direction0Muscle.NormalDirectionMuscle.Fout[0]*..BaseObject.Axes'
  //    +.NormalVector*.Direction01Muscle.Push.FrictionMuscle.Fout[0]*..BaseObject.Axes'
  //    +.NormalVector*.Direction02Muscle.Push.FrictionMuscle.Fout[0]*..BaseObject.Axes'
  //    +.NormalVector*.Direction01Muscle.Pull.FrictionMuscle.Fout[0]*..BaseObject.Axes'
  //    +.NormalVector*.Direction02Muscle.Pull.FrictionMuscle.Fout[0]*..BaseObject.Axes');
  //    AnyVar lenght=Strength*(2-(1-Strength/sqrt(Strength^2)));
  //    
  //    
  //  };
  //
  //  AnyDrawVector DrawFrictionForce =     
  //  {  
  //    AnyRefFrame &ref=..TargetObject;
  //    
  //    Vec =..ScaleFactor*..DrawRef.DrawSettingsSupport.Lin.ScaleFactor*..StaticFrictionCoefficient*(
  //    .FrictionVector1*.Direction01Muscle.Push.FrictionMuscle.Fout[0]
  //    -.FrictionVector1*.Direction01Muscle.Pull.FrictionMuscle.Fout[0]
  //    +.FrictionVector2*.Direction02Muscle.Push.FrictionMuscle.Fout[0]
  //    -.FrictionVector2*.Direction02Muscle.Pull.FrictionMuscle.Fout[0])*..BaseObject.Axes';
  //    
  //    PointAway = Off;
  //    DrawCoord = Off;
  //    
  //    Line.RGB = ..DrawRef.DrawSettingsSupport.Lin.RGB;
  //    Line.Thickness = ..DrawRef.DrawSettingsSupport.Lin.Thickness;
  //    Line.End.Thickness = 2*..DrawRef.DrawSettingsSupport.Lin.Thickness;  
  //    Line.End.Length = 4*..DrawRef.DrawSettingsSupport.Lin.Thickness;
  //  };
  //<-- Old code  
};