--- a +++ b/Application/Examples/PedalDemo/Model/JointsAndDrivers.any @@ -0,0 +1,137 @@ +/// This folder contains the joints between the model and the environment. +AnyFolder Joints = { + + // Aliases for convenient referencing + AnyFolder &JntPos=..Mannequin.Posture; + AnyFolder &JntVel=..Mannequin.PostureVel; + + AnySphericalJoint FootPedal = { + AnyRefNode &Pedal = Main.Model.MyPedal.EnvironmentModel.Pedal.FootNode; + AnyRefNode &Foot = Main.HumanModel.BodyModel.Right.Leg.Seg.Foot.FootBall; + }; + + AnySphericalJoint FootFloor = { + AnyRefNode &Floor = Main.Model.MyPedal.EnvironmentModel.GlobalRef.LeftFoot; + AnyRefFrame &Foot = Main.HumanModel.BodyModel.Left.Leg.Seg.Foot.FootBall; + }; + + AnyKinEq LatSupport = { + AnyKinLinear KneePos = { + AnyFixedRefFrame &Ground = Main.Model.MyPedal.EnvironmentModel.GlobalRef; + AnyRefNode &Knee = Main.HumanModel.BodyModel.Right.Leg.Seg.Thigh.KneeJoint; + }; + MeasureOrganizer = {2}; // Only the z direction + Reaction.Type={Off}; + }; +}; + +/// Drivers between the human body and the environment. +AnyFolder Drivers = { + AnyFolder &JntPos=..Mannequin.Posture; + AnyFolder &JntVel=..Mannequin.PostureVel; + + AnyKinEqSimpleDriver Pedal = { + AnyRevoluteJoint &Hinge = Main.Model.MyPedal.EnvironmentModel.HingeJoint; + DriverPos = {100*pi/180}; + DriverVel = {45*pi/180}; + Reaction.Type={Off}; + }; + + //Ankle driver + AnyKinEqSimpleDriver AnkleDriverRight={ + AnyKinMeasure& ref1=...BodyModel.Interface.Right.AnklePlantarFlexion; + #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.AnklePlantarFlexion,.JntPos.Right.SubTalarEversion}; + DriverVel=pi/180*{.JntVel.Right.AnklePlantarFlexion,.JntVel.Right.SubTalarEversion}; + + Reaction.Type={Off,Off}; + }; + //Ankle driver + AnyKinEqSimpleDriver AnkleDriverLeft={ + AnyKinMeasure& ref1=...BodyModel.Interface.Left.AnklePlantarFlexion; + #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.AnklePlantarFlexion,.JntPos.Left.SubTalarEversion}; + DriverVel=pi/180*{.JntVel.Left.AnklePlantarFlexion,.JntVel.Left.SubTalarEversion}; + Reaction.Type={Off, Off}; + }; + + AnyKinEqSimpleDriver LeftLatSupport = { + AnyKinLinear KneePos = { + AnyFixedRefFrame &Ground = Main.Model.MyPedal.EnvironmentModel.GlobalRef; + AnyRefNode &Knee = Main.HumanModel.BodyModel.Left.Leg.Seg.Thigh.KneeJoint; + }; + MeasureOrganizer = {2}; // Only the z direction + Reaction.Type={Off}; + DriverPos = {-0.20}; + DriverVel = {0}; + }; + + /// Driver controlling and fixing the pelvis position wrt GlobalRef + AnyKinEqSimpleDriver PelvisGroundDriver ={ + AnyKinLinear lin = { + AnyFixedRefFrame &ref1 =Main.Model.MyPedal.EnvironmentModel.GlobalRef; + AnySeg &ref2 =....BodyModel.Trunk.SegmentsLumbar.PelvisSeg; + }; + AnyKinRotational rot = { + AnyFixedRefFrame &ref1 =Main.Model.MyPedal.EnvironmentModel.GlobalRef; + AnySeg &ref2 =....BodyModel.Trunk.SegmentsLumbar.PelvisSeg; + Type=RotAxesAngles; + }; + DriverPos={ + .JntPos.PelvisPosX, + .JntPos.PelvisPosY, + .JntPos.PelvisPosZ, + pi/180*.JntPos.PelvisRotZ, + pi/180*.JntPos.PelvisRotY, + pi/180*.JntPos.PelvisRotX + }; + DriverVel={ + .JntVel.PelvisPosX, + .JntVel.PelvisPosY, + .JntVel.PelvisPosZ, + pi/180*.JntVel.PelvisRotX, + pi/180*.JntVel.PelvisRotY, + pi/180*.JntVel.PelvisRotZ + }; + Reaction.Type={On,On,On,On,On,On}; + }; + + + //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,Off}; + }; + +};