[bfdf16]: / Application / Examples / StandingLift / Model / JointsAndDrivers.any

Download this file

498 lines (411 with data), 17.2 kB

/**    Drivers for a box lift model: This is like the standing model, except

- There is a box present in the model (+ 6 dofs)
- The box cannot rotate about x, y and z (- 3 dofs)
- The box is driven in 3 spatial coords (-3 dofs)
- The hands are now connected to the box by spherical jnts (-6 dofs)
- GH rotation is no longer driven (+ 2 dofs)
- GH abduction is no longer driven (+ 2 dofs)
- GH Flextion/extension is no longer drven (+ 2 dofs)
- Elbow flexion/extension is no longer driven (+2 dofs)
- Elbow lateral position is driven (-2 dofs)

John Rasmussen, March 10, 2005.
*/
AnyFolder Joints = {
  
  
  AnyKinEqSimpleDriver RHBoxDriver = {
    AnyRevoluteJoint RHBox = {
      AnyRefNode &Box = Main.Model.EnvironmentModel.Box.Right;
      AnySeg &Hand = ....BodyModel.Right.ShoulderArm.Seg.Glove;
      Axis = z;
      Constraints.Reaction.Type={Off,Off,Off,Off,Off};
    };
    DriverPos = {-15}*pi/180;
    DriverVel = {0};
    Reaction.Type = {Off};
    
  };
  AnyKinEqSimpleDriver LHBoxDriver = {
    AnyRevoluteJoint LHBox = {
      AnyRefNode &Box = Main.Model.EnvironmentModel.Box.Left;
      AnySeg &Hand = Main.Model.BodyModel.Left.ShoulderArm.Seg.Glove;
      Axis = z;
      Constraints.Reaction.Type={Off,Off,Off,Off,Off};
    };
    DriverPos = {-15}*pi/180;
    DriverVel = {0};
    Reaction.Type = {Off};
  };
  
  AnyReacForce RHBoxRot ={
    AnyKinRotational Rot = {
      AnyRefNode &Box = Main.Model.EnvironmentModel.Box.Right;
      AnySeg &Hand = Main.Model.BodyModel.Right.ShoulderArm.Seg.Glove;
      Type=RotVector;  };
  };
  
  AnyReacForce LHBoxRot={
    AnyKinRotational Rot = {
      AnyRefNode &Box = Main.Model.EnvironmentModel.Box.Left;
      AnySeg &Hand = Main.Model.BodyModel.Left.ShoulderArm.Seg.Glove;
      Type=RotVector;
      
    };
  };
  
  
  AnyVar FrictionStrength=200;
  AnyVar Strength =4000;
  
  AnyFolder HandSupportLeft = {
    AnyRefNode &StartNode = Main.Model.EnvironmentModel.Box.Left2;
    AnySeg &EndNode = Main.Model.BodyModel.Left.ShoulderArm.Seg.Glove;    //The terms push and pull are determined wrt. the coordinate system of the StartNode!
    
    AnyVector StrengthOfReactionsLin = {.FrictionStrength,.FrictionStrength,.Strength,.FrictionStrength,.FrictionStrength,.FrictionStrength}; //List of strengths for the linear muscles
    AnyFolder &DrawRef=Main.DrawSettings;
    AnyVar ScaleFactor =0.5;
    #include "<ANYBODY_PATH_MODELUTILS>/Reactions/XPush.any"
    #include "<ANYBODY_PATH_MODELUTILS>/Reactions/XPull.any"
    #include "<ANYBODY_PATH_MODELUTILS>/Reactions/YPush.any"
    #include "<ANYBODY_PATH_MODELUTILS>/Reactions/YPull.any"
    //#include "<ANYBODY_PATH_MODELUTILS>/Reactions/ZPush.any" 
    #include "<ANYBODY_PATH_MODELUTILS>/Reactions/ZPull.any" 
    
  };
  
  AnyFolder HandSupportRight = {
    AnyRefNode &StartNode = Main.Model.EnvironmentModel.Box.Right2;
    
    AnySeg &EndNode = Main.Model.BodyModel.Right.ShoulderArm.Seg.Glove;    //The terms push and pull are determined wrt. the coordinate system of the StartNode!
    
    AnyVector StrengthOfReactionsLin = {.FrictionStrength,.FrictionStrength,.Strength,.FrictionStrength,.FrictionStrength,.FrictionStrength}; //List of strengths for the linear muscles
    AnyFolder &DrawRef=Main.DrawSettings;
    AnyVar ScaleFactor =0.5;
    #include "<ANYBODY_PATH_MODELUTILS>/Reactions/XPush.any"
    #include "<ANYBODY_PATH_MODELUTILS>/Reactions/XPull.any"
    #include "<ANYBODY_PATH_MODELUTILS>/Reactions/YPush.any"
    #include "<ANYBODY_PATH_MODELUTILS>/Reactions/YPull.any"
    #include "<ANYBODY_PATH_MODELUTILS>/Reactions/ZPush.any" 
    //#include "<ANYBODY_PATH_MODELUTILS>/Reactions/ZPull.any" 
    
  };
};

AnyFolder Drivers = {
  
  // Aliases for convenient referencing
  AnyFolder &JntPos=..Mannequin.Posture;  
  AnyFolder &JntVel=..Mannequin.PostureVel;  
  AnyFolder &Thorax = ..BodyModel.Trunk.SegmentsThorax.ThoraxSeg;
  AnyFolder &LegR = ..BodyModel.Right.Leg;
  AnyFolder &LegL = ..BodyModel.Left.Leg;
  AnyFolder &RefHM = Main.Model.BodyModel;
  AnyFolder &ref=Main.Model.BodyModel.Trunk;
  
  
  
  AnyKinEqSimpleDriver BoxRot = {
    AnyKinRotational Rot = {
      Type = RotAxesAngles;
      AnyFixedRefFrame &ground = Main.Model.EnvironmentModel.GlobalRef;
      AnySeg &box = Main.Model.EnvironmentModel.Box;
    };
    MeasureOrganizer = {0,1,2};
    DriverPos = {0,0,0};
    DriverVel = {0,0,0};
    Reaction.Type = {Off,Off,Off};
  };
  
  AnyKinEqInterPolDriver Box = {
    AnyKinLinear pos = {
      AnyFixedRefFrame &ground = Main.Model.EnvironmentModel.GlobalRef;
      AnySeg &box = Main.Model.EnvironmentModel.Box;
    };
    Type = Bspline;
    T = Main.Study.tEnd*{0,1,2,3}/2.99;
    Data = {
      { 0.35, 0.35, 0.35, 0.35},
      { 1.2,  1.25, 1.25, 1.25},
      {-0.1, -0.0, 0.0, 0.1}
    };
    Reaction.Type = {Off,Off,Off};
  };
  
  
  
  // Position the Ankles right above the z axis
  AnyKinEqSimpleDriver RAnkleX = {
    AnyKinLinear AnklePos = {
      AnyFixedRefFrame &Ground = Main.Model.EnvironmentModel.GlobalRef;
      #if BM_LEG_MODEL == _LEG_MODEL_LEG_
        AnyRefNode &Ankle = ..LegR.Seg.Foot.AnkleJoint;
      #else
        AnyRefNode &Ankle = ..LegR.Seg.Talus.AnkleJoint;      
      #endif
    };
    MeasureOrganizer = {0};  // Only the x coordinate
    DriverPos = {0.0};
    DriverVel = {0.0};
    Reaction.Type = {Off};
  };
  
  AnyKinEqSimpleDriver LAnkleX ={
    AnyKinLinear AnklePos = {
      AnyFixedRefFrame &Ground = Main.Model.EnvironmentModel.GlobalRef;
      #if BM_LEG_MODEL == _LEG_MODEL_LEG_
        AnyRefNode &Ankle = ..LegL.Seg.Foot.AnkleJoint;
      #else
        AnyRefNode &Ankle = ..LegL.Seg.Talus.AnkleJoint;      
      #endif
    };
    MeasureOrganizer = {0};  // Only the x coordinate
    DriverPos = {0.0};
    DriverVel = {0.0};
    Reaction.Type = {Off};
  };
  
  //Constrain the collective CoM to be right above the GlobalRef
  AnyKinEqSimpleDriver CoMDriver = {
    AnyKinCoM CoM = {
      AnyFolder &Body = Main.Model.BodyModel;
      AnyFolder &Environment = Main.Model.EnvironmentModel;      
    };
    MeasureOrganizer = {0,2};  // Only the x and z directions
    DriverPos = {0.1, -0.05};
    DriverVel = {0.0, 0.1};
    Reaction.Type = {Off,Off};
  };  
  
  //Constrain the feet to be symmetrical about the xy plane
  AnyKinEqSimpleDriver FeetXDriver = {
    AnyKinCoM CoM = {
      AnySeg &rf = Main.Model.BodyModel.Right.Leg.Seg.Foot;
      AnySeg &ff = Main.Model.BodyModel.Left.Leg.Seg.Foot;
    };
    MeasureOrganizer = {2};  // Only the z direction
    DriverPos = {0};
    DriverVel = {0};
    Reaction.Type = {Off};  // Carried by friction muscles.
  };
  
  
  // ************************************
  // Drivers for the spine
  // ************************************
  
  //Neck driver 
  AnyKinEqSimpleDriver NeckJntDriver = {
    AnyKinMeasure& lb = ...BodyModel.Interface.Trunk.SkullThoraxLateralBending;
    AnyKinMeasure& ar = ...BodyModel.Interface.Trunk.SkullThoraxRotation;
    AnyKinMeasure& fe = ...BodyModel.Interface.Trunk.SkullThoraxFlexion;
    DriverPos = pi/180*{.JntPos.NeckLateralBending, .JntPos.NeckRotation, -1*.JntPos.NeckExtension};
    DriverVel = pi/180*{.JntVel.NeckLateralBending, .JntVel.NeckRotation, -1*.JntVel.NeckExtension};
    Reaction.Type = {Off, Off, Off};
  };
  
  //Thorax pelvis rotation driver
  AnyKinEqSimpleDriver PostureDriver ={
    //AnyKinMeasure& Ref2 = ...BodyModel.Interface.Trunk.PelvisThoraxLateralBending;        
    AnyKinMeasure& Ref3 = ...BodyModel.Interface.Trunk.PelvisThoraxRotation;   
    AnyKinMeasure& Ref1 = ...BodyModel.Interface.Trunk.PelvisThoraxExtension;
    
    DriverPos = pi/180*{
      //    .JntPos.PelvisThoraxLateralBending,
      .JntPos.PelvisThoraxRotation,
      .JntPos.PelvisThoraxExtension
    };
    DriverVel = pi/180*{
      //JntVel.PelvisThoraxLateralBending,
      .JntVel.PelvisThoraxRotation,
      .JntVel.PelvisThoraxExtension
    };
    Reaction.Type = {Off,Off};  
  };  
  
  
  // ************************************
  // Drivers for the right arm
  // ************************************
  
  
  //Sterno clavicular joint driver
  AnyKinEqSimpleDriver SCDriverRight ={
    AnyKinMeasure& ref1 =...BodyModel.Interface.Right.SternoClavicularProtraction;
    AnyKinMeasure& ref2 =...BodyModel.Interface.Right.SternoClavicularElevation;
    DriverPos = pi/180*{
      .JntPos.Right.SternoClavicularProtraction,
      .JntPos.Right.SternoClavicularElevation
    };
    DriverVel = {
      .JntVel.Right.SternoClavicularProtraction,
      .JntVel.Right.SternoClavicularElevation
    };
    Reaction.Type={Off,Off};
  };
  
  
  //Wrist driver 
  AnyKinEqSimpleDriver WristDriverRight ={
    // AnyKinMeasure& ref1 =...BodyModel.Interface.Right.WristFlexion;
    AnyKinMeasure& ref2 =...BodyModel.Interface.Right.WristAbduction;
    DriverPos = pi/180*{         .JntPos.Right.WristAbduction       };
    DriverVel = pi/180*{         .JntVel.Right.WristAbduction       };
    Reaction.Type={Off};
  };
  
  // ************************************
  // Drivers for the left arm
  // ************************************
  
  //Sterno clavicular joint driver
  AnyKinEqSimpleDriver SCDriverLeft ={
    AnyKinMeasure& ref1 =...BodyModel.Interface.Left.SternoClavicularProtraction;
    AnyKinMeasure& ref2 =...BodyModel.Interface.Left.SternoClavicularElevation;
    
    DriverPos = pi/180*{
      .JntPos.Left.SternoClavicularProtraction,
      .JntPos.Left.SternoClavicularElevation
    };
    
    DriverVel = pi/180*{
      .JntVel.Left.SternoClavicularProtraction,
      .JntVel.Left.SternoClavicularElevation
    };
    
    Reaction.Type={Off,Off};
  };
  
  
  
  
  //Wrist driver
  AnyKinEqSimpleDriver WristDriverLeft ={
    //  AnyKinMeasure& ref1 =...BodyModel.Interface.Left.WristFlexion;
    AnyKinMeasure& ref2 =...BodyModel.Interface.Left.WristAbduction;
    DriverPos = pi/180*{
      //  .JntPos.Left.WristFlexion,
      .JntPos.Left.WristAbduction
    };
    
    DriverVel = pi/180*{
      //.JntVel.Left.WristFlexion,
      .JntVel.Left.WristAbduction
    };
    Reaction.Type={Off};
  };
  
  
  
  // ************************************
  // Drivers for the right leg
  // ************************************
  
  //Hip driver 
  AnyKinEqSimpleDriver HipDriverRight={
    AnyKinMeasure& ref1 =...BodyModel.Interface.Right.HipFlexion;
    AnyKinMeasure& ref2 =...BodyModel.Interface.Right.HipExternalRotation;
    AnyKinMeasure& ref3 =...BodyModel.Interface.Right.HipAbduction;
    DriverPos= pi/180*{
      .JntPos.Right.HipFlexion,
      .JntPos.Right.HipExternalRotation,
      .JntPos.Right.HipAbduction
    };    
    DriverVel = pi/180*{
      .JntVel.Right.HipFlexion,
      .JntVel.Right.HipExternalRotation,
      .JntVel.Right.HipAbduction
    };    
    Reaction.Type={Off,Off,Off};
    
  };
  
  //Knee driver
  AnyKinEqSimpleDriver KneeDriverRight={
    AnyKinMeasureOrg  &Knee = ...BodyModel.Interface.Right.KneeFlexion;
    DriverPos=pi/180*{.JntPos.Right.KneeFlexion};  
    DriverVel = pi/180*{.JntVel.Right.KneeFlexion};  
    Reaction.Type={Off};
  };
  
  //Ankle driver
  AnyKinEqSimpleDriver AnkleDriverRight={
    #if BM_LEG_MODEL == _LEG_MODEL_LEG_
      AnyKinMeasure& ref2=...BodyModel.Interface.Right.AnkleEversion;
    #else
      AnyKinMeasure& ref2=...BodyModel.Interface.Right.SubTalarEversion;
    #endif
    DriverPos = pi/180*{      .JntPos.Right.SubTalarEversion    };  
    DriverVel=pi/180*{      .JntVel.Right.SubTalarEversion    };  
    Reaction.Type={Off};
  };
  
  
  
  
  // ************************************
  // Drivers for the left leg
  // ************************************
  
  //Hip driver 
  AnyKinEqSimpleDriver HipDriverLeft={
    AnyKinMeasure& ref1 =...BodyModel.Interface.Left.HipFlexion;
    AnyKinMeasure& ref2 =...BodyModel.Interface.Left.HipExternalRotation;
    AnyKinMeasure& ref3 =...BodyModel.Interface.Left.HipAbduction;
    DriverPos= pi/180*{
      .JntPos.Left.HipFlexion,
      .JntPos.Left.HipExternalRotation,
      .JntPos.Left.HipAbduction
    };    
    DriverVel = pi/180*{
      .JntVel.Left.HipFlexion,
      .JntVel.Left.HipExternalRotation,
      .JntVel.Left.HipAbduction
    };    
    Reaction.Type={Off,Off,Off};
    
  };
  
  //Knee driver
  AnyKinEqSimpleDriver KneeDriverLeft={
    AnyKinMeasureOrg  &Knee = ...BodyModel.Interface.Left.KneeFlexion;
    DriverPos=pi/180*{.JntPos.Left.KneeFlexion};  
    DriverVel = pi/180*{.JntVel.Left.KneeFlexion};  
    Reaction.Type={Off};
  };
  
  //Ankle driver
  AnyKinEqSimpleDriver AnkleDriverLeft={
    #if BM_LEG_MODEL == _LEG_MODEL_LEG_
      AnyKinMeasure& ref2=...BodyModel.Interface.Left.AnkleEversion;
    #else
      AnyKinMeasure& ref2=...BodyModel.Interface.Left.SubTalarEversion;
    #endif
    
    DriverPos = pi/180*{      .JntPos.Left.SubTalarEversion    };  
    DriverVel=pi/180*{      .JntVel.Left.SubTalarEversion    };  
    Reaction.Type={Off};
  };
  
  
  
  // Place the right toe and heel on the ground
  AnyKinEq RToeGroundConstraint ={
    AnyKinLinear ToePos = {
      AnyFixedRefFrame &Ground = Main.Model.EnvironmentModel.GlobalRef;
      AnyRefNode &Ball = Main.Model.BodyModel.Right.Leg.Seg.Foot.ToeJoint;
    };
    MeasureOrganizer = {1};  // Only the y coordinate
    Reaction.Type={Off};
  };
  
  AnyKinEqSimpleDriver RHeelGroundConstraint ={
    AnyKinLinear HeelPos = {
      AnyFixedRefFrame &Ground = Main.Model.EnvironmentModel.GlobalRef;
      AnyRefNode &Ball = Main.Model.BodyModel.Right.Leg.Seg.Foot.HeelJoint;
    };
    MeasureOrganizer = {1};  // Only the y coordinate
    DriverPos = {0.0};
    DriverVel = {0.0};
    Reaction.Type = {Off};   // Provide ground reaction forces
  };
  
  // Place the left toe and heel on the ground
  AnyKinEq LToeGroundConstraint ={
    AnyKinLinear ToePos = {
      AnyFixedRefFrame &Ground = Main.Model.EnvironmentModel.GlobalRef;
      AnyRefNode &Ball = Main.Model.BodyModel.Left.Leg.Seg.Foot.ToeJoint;
    };
    MeasureOrganizer = {1};  // Only the y coordinate
    Reaction.Type={Off};
  };
  
  AnyKinEqSimpleDriver LHeelGroundConstraint ={
    AnyKinLinear HeelPos = {
      AnyFixedRefFrame &Ground = Main.Model.EnvironmentModel.GlobalRef;
      AnyRefNode &Ball = Main.Model.BodyModel.Left.Leg.Seg.Foot.HeelJoint;
    };
    MeasureOrganizer = {1};  // Only the y coordinate
    DriverPos = {0.0};
    DriverVel =  {0.0};
    Reaction.Type = {Off};  // Do not Provide ground reaction
  };  
  
  
  
  AnyFolder ConditionalContact={
    
    /*
    ConditionalContactFootPlaneClass (
    BaseObject = //Object which delivers the forces
    Foot = //Reference to the foot segment where 3 forces are applied 
    DisplayTriggerVolume = //Draw the cylinder around the Base node where the contact is active
    DisplayTargetNode = //Draw the Target node
    ) = {
    UserDefinedLimitLow = //low limit for the strength measure function, if the distance measured along Direction[0] is below this val. the strength will be zero (negative)
    UserDefinedLimitHigh = //high limit for the strength measure function, if the distance measured along Direction[0] is above this val. the strength will be zero
    UserDefinedRadiusLimit = //high limit for the strength measure function, if the radius measured along the plane with Direction[0] as normal is above this val. the strength will be zero
    Strength = //strength of muscles
    StaticFrictionCoefficient = //Friction coefficient
    NormalDirection = //The axis (X, Y or Z) corresponding to the normal direction
    FrictionDirection1 = //The axis (X, Y or Z) corresponding to the first friction direction
    FrictionDirection2 = //The axis (X, Y or Z) corresponding to the second friction direction
    };
    */
    
    ConditionalContactFootPlaneClass LeftFootSupport (
    BaseObject = Main.Model.EnvironmentModel.GlobalRef,
    Foot = ..LegL.Seg.Foot,
    DisplayTriggerVolume = 1,
    DisplayTargetNode =1
    ) = {
      UserDefinedLimitLow = -0.05;
      UserDefinedLimitHigh = 0.05;
      UserDefinedRadiusLimit = 0.4;
      Strength = 2000;
      StaticFrictionCoefficient = 0.8;
      NormalDirection = Y;
      FrictionDirection1 = X;
      FrictionDirection2 = Z;
    };
    
    
    ConditionalContactFootPlaneClass RightFootSupport (
    BaseObject = Main.Model.EnvironmentModel.GlobalRef,
    Foot = ..LegR.Seg.Foot,
    DisplayTriggerVolume = 0,
    DisplayTargetNode =1
    ) = {
      UserDefinedLimitLow = -0.05;
      UserDefinedLimitHigh = 0.05;
      UserDefinedRadiusLimit = 0.4;
      Strength = 2000;
      StaticFrictionCoefficient = 0.8;
      NormalDirection = Y;
      FrictionDirection1 = X;
      FrictionDirection2 = Z;
    };
    
  };   
  
  
  
  
  
};//Drivers