# ground reaction force

Hi,

i am unsure about the meaning of the code and the intepretation of the results of Right and LeftFootReaction of the StandingModel (AMMRV1.5), just default static standing.

``````
AnyReacForce RightFootReaction = {
AnyKinRotational rot = {
AnySeg &ref1=..LegR.Seg.Foot;
AnyFixedRefFrame &ref2 = ....EnvironmentModel.GlobalRef;
Type = RotVector;
AngVelOnOff = On;
};

AnyKinLinear RightFootLinMeasure = {
AnySeg &ref1=..LegR.Seg.Foot;
AnyFixedRefFrame &ref2 = ....EnvironmentModel.GlobalRef;
};

};
``````

I understand that AnyKinRotational and AnyKinLinear are measures and that in the AnyReacForce folder forces and moments are transformed to the GlobalRef coord system. But where is the driver that keeps the feet located on the ground, i. e. that creates the ground reaction force? The segment LegR.Seg.Foot is a segment and no force that could be transformed…

Second question: RightFootReaction is about {…, …, -130, …, -380, …}
-380 is the weight from halve of the body mass, but -130? Is this a moment of 130Nm of the foot to the ground? Doesn’t this moment mean that the reaction force of the foot is 130Nm/380N = 342mm anterior to the global coord system? But the CoM driver keeps the mass directly at {0,0,0}. Where does this high moment come from?

Thanks for any enlightenment,

Thomaz

Hi Thomaz,

Those reaction forces(moments) should be understood that the forces(moments) will be acting to the second referred frame and its scalar values will be represented with respect to the first referred frame.

Then if you see the code, the forces and moments will be acting to the global reference frame from the foot. That’s the reason why the sign of the force is negative.

The reason why you can see the non-zero moment is that the relative location of GlobalRef from foot segment is not the location of center of pressure where the residual (twisting) moment is minimized.

If you can refer the following page then you can calculate the location of COP using this forces and moments.
http://www.kwon3d.com/theory/grf/cop.html

And of course, the location of COP under the foot will be changed according to the movement of human. That’s the reason why this model had to use two fixed frames to transfer forces and moments easily.

Best regards,
Moonki

update (found with the help of A. Nolte):

Although somehow written in the documentation some explanations for users who may need them later:

AnyReacForce creates loads (forces and moments) to create global equilibrium of the complete system, i. e. sum of all forces (and moments) including AnyReacForces are zero.

The loads are created between each two frames, provided in the kinematics, i. e. between Foot and the GlobalRef.

Output force direction of AnyReacForce is in the coord system which is included in AnyReacForce kinematics. In the current example it is in global coord system because Ref parameter of AnyKinLinear is -1 per default. The forces are however acting at the foot, which has its origin about -0.45 m (behind) from the GlobalRef.

Do you agree with this, Moonki?

Still there is the problem, with the high moment about z (128 Nm) existing in both feet. As the AnyReacForces (Fy is about 373 N for each foot) act at the anteriorly located origin of the feet, some of the moment can be explained by this offset (of -0.45 m). But according to the link and to my own calculations the CoP is still about 0.1 m behind the GlobalRef. Why is it not at x=0 as the CoMDriver drives the CoM to x=0?

Thanks and kind regards,

Thomaz

Update:

As i did not get any further help yet, i tried to debug my problem myself now. I applied an AnyForce3D and an AnyMoment3D to the foot. I used the output from AnyReacForce for this. After this, AnyReacForce must be and really is zero, but:

I had to apply the force in global coordinates and the moments in local coordinates. That means the output from AnyReacForce is partly in global and partly in local coordinates. The application point is at the foot.

That is somehow confusing.

After transforming the local reaction moments in global ones, the moment around global z is exactly the z component of the cross product of global reaction force and (globally measured) distance between foot and global coord system, meaning that CoP is really below the CoM of the complete StandingModel.

Perhaps i misunderstood you, Moonki, but you said that the reaction forces(moments) act at the second reference frame and their values are given in the first. I found out, they are acting at the first (foot). With respect to forces they act in the global system because AnyKinLinear.Ref=-1 (default) which means global. With respect to moments they act in local coordinate system (I don’t know why).

Kind regards,

Thomaz

Dear Thomaz,

First, I attached the modified version of StandingModel for you.

1. As you know, the meaning of AnyReacForce is dependent on the type of kinematic measures which are used for that AnyReacForce object.
In this case, AnyKinLinear is defined between the foot segment and the GlobalRef so the meaning of the reaction force is in global.
But for moments from AnyKinRotational objects, I recommend you not to use these values directly because there are several types of AnyKinRotational objects such as RotAxesAngels, PlanarAngles, RotVector, DirCosines and EulerParam.
So you(also I) can make some mistakes for evaluating moments from this AnyReacForce if we use some different types of AnyKinRotational.

2. So for your purpose, I strongly recommend you to use ‘AnyForceMomentMeasure2’ class to evaluate the net effect of forces and moments at your point of interest.
So I tried to prepare those in the ‘RightLegTDDrives.any’ and ‘LeftLegTDDrivers.any’ files for you.
Here is the piece of the code which I made for these files:

``````AnyFolder RightFootCOP =
{
AnyForceMomentMeasure2 FootReacForceMeasure2 =
{
AnyForceBase& Reac = ..RightFootReaction ;
AnyRefFrame& target = ....EnvironmentModel.GlobalRef;
AnySeg& seg = ..LegR.Seg.Foot;
};

AnyVar Fx = FootReacForceMeasure2.F[0];
AnyVar Fy = FootReacForceMeasure2.F[1];
AnyVar Fz = FootReacForceMeasure2.F[2];

AnyVar Mx = FootReacForceMeasure2.M[0];
AnyVar My = FootReacForceMeasure2.M[1];
AnyVar Mz = FootReacForceMeasure2.M[2];

AnyVar Fy_new = iffun(gtfun(abs(Fy), 0.0), Fy, Fy+1e10); // avoid of dividing by zero Fy

AnyVar COP_x = Mz / Fy_new;
AnyVar COP_z = -Mx / Fy_new;
AnyVar COP_y = 0.0;
AnyVar Ty = My - COP_z * Fx + COP_x * Fz;

AnyRefFrame& GlobalRef = ...EnvironmentModel.GlobalRef;

GlobalRef =
{
AnyDrawSphere Draw_COP_Right =
{
RGB = {0, 1, 0};
ScaleXYZ = 0.02*{1, 1, 1};
Position = {..COP_x, ..COP_y, ..COP_z};
Opacity = 0.5;
};
AnyDrawLine Draw_GRF_Right =
{
p0 = {..COP_x, ..COP_y, ..COP_z};
p1 = p0 + {..Fx, ..Fy, ..Fz} * 0.01;
Line =
{
Thickness = 0.01;
RGB = {1, 0, 0};
End.Style = Line3DCapStyleArrow ;
};
};
};
};
``````
1. In this model, I also added a new file which is called ‘Human_COM.any’ file. This file contains the center of mass of human. And there is one more AnyForceMomentMeasure2 object which measures the effect of the foot reaction forces on the center of mass. Then you can see that the sum of these two foot reactions will give only vertical force to the center of mass of the human.

I hope that this model and explanation will be helpful to all your questions.

Best regards,
Moonki

Thanks, Moonki,
for your time, effort, and hints!

Kind regards,

Thomaz

hello, Thomaz and mkJung.

``````   AnyReacForce RightFootReaction = {
AnyKinRotational rot = {
AnySeg &ref1=..LegR.Seg.Foot;
AnyFixedRefFrame &ref2 = ....EnvironmentModel.GlobalRef;
Type = RotVector;
AngVelOnOff = On;
};

AnyKinLinear RightFootLinMeasure = {
AnySeg &ref1=..LegR.Seg.Foot;
AnyFixedRefFrame &ref2 = ....EnvironmentModel.GlobalRef;
};
``````

};

``For this reaction, this is pair of forces working againt foot and environment. May I suppose that the working point is the globalRef for both the environment and the foot, but the axis for moment measurement is foot position? I just wonder which point the reaction is working at.``

Hi,

Yes it is. Your guess is right.

Working point(target point) is the second reference frame.
And the scalar expression will be based on the orientation of the first reference frame.

Best regards,
Moonki