FootPlateConditionalContact#
Creates a GRF prediction force plate
#include "<AMMR_TOOLS>\GRFPrediction/FootPlateConditionalContact.any"`
#FootPlateConditionalContact#
The class template generates the conditional-contact code which links the foot to the ground.
The class needs a few important arguments: The ground plane (PLATE_BASE_FRAME)
is a reference system where the ground plane is located.
Together with arguments NORMAL_DIRECTION this specifies the surface the model
is walking on. Another important argument is the NODES_FOLDER, which is a
folder that contains all the contacts points.
The contact points can be created manually, but to avoid this we use another
class-template (CreateFootContactNodes25) to create the nodes automatically.
As the name says it creates 25 nodes in the foot coordinate system. This part is
specific to the model implementation. One could also imagine class-templates
that produce a higher number of nodes or nodes in positions that corresponds to
particular shoes or on other body parts.
Example
The following example is from the model repository.
FootPlateConditionalContact GRF_Prediction_Right (
NORMAL_DIRECTION = "Y",
NUMBER_OF_NODES = 25,
NODES_FOLDER = FootNodes,
SHOW_TRIGGER_VOLUME = ON,
PLATE_BASE_FRAME = Main.EnvironmentModel.GlobalRef
) =
{
CreateFootContactNodes25 FootNodes (
foot_ref = Main.HumanModel.BodyModel.Right.Leg.Seg.Foot
) = {};
Settings.LimitDistHigh = 0.015; // Vertical height
};
Full signature
FootPlateConditionalContact <ObjectName>(
NORMAL_DIRECTION="Z",
NUMBER_OF_NODES=1,
PLATE_BASE_FRAME=Main.EnvironmentModel.GlobalRef,
SHOW_TRIGGER_VOLUME=0,
GLOBAL_REF=Main.EnvironmentModel.GlobalRef,
) = {
NODES_FOLDER = {
AnyRefFrame Node## = <...>; (NUMBER_OF_NODES)
};
};
Arguments
- __CLASS__:
AnyFolder
- NORMAL_DIRECTION:
Defines the normal direction of the ground plane the in
PLATE_BASE_FRAMEcoordinate system. (Default: “Z”)
- NUMBER_OF_NODES:
The number of contact nodes to expect within
NODE_BASE_FRAME(Default: 1)
- PLATE_BASE_FRAME:
Is a AnyRefFrame object where the ground planes is attached. (Default: Main.EnvironmentModel.GlobalRef)
- SHOW_TRIGGER_VOLUME:
Visualize the volume where contacts may be triggered. (Default: 0)
- GLOBAL_REF:
The global reference. This must be set if the global reference is not
Main.EnvironmentModel.GlobalRef(Default: Main.EnvironmentModel.GlobalRef)
Expected members
NODES_FOLDER = {
AnyRefFrame Node## = <...>; (NUMBER_OF_NODES)
};
A number of AnyRefFrame objects used for the contact detection.
Optional initialization members
Settings.LimitDistLow = DesignVar(-0.10);
- class type:
AnyVar
Lower bound of the contact detection volume.
Settings.LimitDistHigh = DesignVar(0.04);
- class type:
AnyVar
Upper bound of the contact detection volume.
Settings.LimitVelHigh = DesignVar(0.8);
- class type:
AnyVar
Velocity threshold for contact detection.
Settings.Radius = DesignVar(1000);
- class type:
AnyVar
The size of the contact detection area.
Settings.Strength = DesignVar(200);
- class type:
AnyVar
Strength of the contact elements.
Settings.FrictionCoefficient = DesignVar(0.5);
- class type:
AnyVar
Friction coefficient of the contact elements. This adds limits to the amount of friction force which can be recruited.
Settings.ForceVectorDrawScaleFactor = DesignVar(0.0005);
- class type:
AnyVar
Scale factor for the drawing of the GRF force vector.
Settings.GroundVelocity = {0, 0, 0};
- class type:
AnyVec3
The ground velocity in the global reference system.
NODES_FOLDER.y = .OnOff;
- class type:
Opacit
A number of AnyRefFrame objects used for the contact detection.
AnyRefFrame Node## = <…>; (NUMBER_OF_NODES)
–>Code for calculating COP #include “FootPlateConditionalContact_ForceMomentMeasure.any” ForceMomentMeasure_multiple ForceMomentMeasure_Auto(NODES = NUMBER_OF_NODES ) = {};
AnyVar Fx = ForceMomentMeasure_Auto.Fx_On_Human; AnyVar Fy = ForceMomentMeasure_Auto.Fy_On_Human; AnyVar Fz = ForceMomentMeasure_Auto.Fz_On_Human; AnyVar Mx = ForceMomentMeasure_Auto.Mx_On_Human; AnyVar My = ForceMomentMeasure_Auto.My_On_Human; AnyVar Mz = ForceMomentMeasure_Auto.Mz_On_Human;
#if NORMAL_DIRECTION == “X” AnyVar Fxx =iffun(gtfun(abs(Fx),0.0), Fx, Fx+1e10); AnyVar Rx = 0; AnyVar Ry = -Mz/Fxx; AnyVar Rz = My/Fxx; AnyVar OnOff = iffun(gtfun(abs(Fx), 10.0), 1.0, 0.0); #endif
#if NORMAL_DIRECTION == “Y” AnyVar Fyy =iffun(gtfun(abs(Fy),0.0), Fy, Fy+1e10); AnyVar Rx = Mz/Fyy; AnyVar Ry = 0; AnyVar Rz = -Mx/Fyy; AnyVar OnOff = iffun(gtfun(abs(Fy), 10.0), 1.0, 0.0); #endif
#if NORMAL_DIRECTION == “Z” AnyVar Fzz =iffun(gtfun(abs(Fz),0.0), Fz, Fz+1e10); AnyVar Rx = -My/Fzz; AnyVar Ry = Mx/Fzz; AnyVar Rz = 0; AnySwitch OnOff = iffun(gtfun(abs(Fz), 10.0), 1, 0); AnyIntVar OnOff = iffun(gtfun(abs(Fz), 10.0), 1, 0) ; #endif
AnyFloat RGlobal = transf3D({Rx,Ry,Rz},&PlateBaseFrame); AnyFloat FGlobal = {Fx,Fy,Fz}*PlateBaseFrame.Axes’; GRF_line. AnyDrawLine GRF_line= { AnyRefFrame & ref = .PlateBaseFrame; p0 = { .Rx, .Ry, .Rz}; p1 = p0 + 0.001 * {.Fx, .Fy, .Fz} ; Line.Thickness = 0.01; Line.RGB = {1, 0, 0}; GlobalCoord=Off;