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