Computation of ground reaction forces during stairs climbing

Hi everyone,

I would like to ask you for help. I would like to run inverse dynamic computations for c3d data of a person during stairs climbing. The problem is that those data do not have force plates data, only marker positions. I was planning to use AnyBody function ConditionalContactFootPlaneClass.any in order to compute ground reaction forces. I would like to know if this approach could be suitable for such an application. In case of yes I would like to know how could I define ground surface which would look like stairs. If someone had similar problem could you please share your solution with me? Thank you very much.


Hi Jovana,

You can indeed use the “ConditionalContactFootPlaneClass.any” class to create such a ground contact model. The simplest way to create stairs would be to define an AnyFixedRefFrame object with an appropriate origin. This object would be the BaseObject for your ConditionalContactFootPlaneClass.

You could use an STL file to visualize the stair surface. For example, the “Seat.stl” file found in “…\AMMR\Application\Examples\AirlinePassenger\Input” could be rescaled to match your stair dimensions.

Once you have the basic simulation framework running, if you desire more contact points with the ground you could do the following. Create a copy of “ConditionalContactFootPlaneClass.any”, rename the class and add more TargetObjects to the code. You would have to manually define these additional contact nodes on the foot segment, elsewhere in your AnyScript code.

Hope this helps!
AnyBody Support

Hi Ananth,

thank you very much for your useful advices. I finally managed to simulate stairs climbing!!! :smiley:
I have a few more more questions related with the topic. Any help would be much appreciated :slight_smile:

I was looking at lower limbs joint torques I got during the simulation and compared them with the ones reported in the literature. The curves in the literature are more “smooth”, especially for torque values of ankle joints. In addition a few times during the simulation I got message “Overloaded muscle configuration”. Do you have some advice how could I improve the quality of the results? So far I tried to do so by defining more contact nodes (at MetatarsalJoint1Node, MetatarsalJoint3Node MetatarsalJoint5Node, BigToeNode, ExtensorDigitorumLongus1Node, ExtensorDigitorumLongus3Node, FlexorHallucisLongusViaNode7, FlexorHallucisLongusViaNode8, FlexorDigitorumLongusViaNode7 and FlexorDigitorumLongusViaNode8).

How could I modify the “Seat.stl” to better fit dimensions of my stairs? Could I change the shape of targeted surface used in “ConditionalContactFootPlaneClass.any” from circle to rectangular one?

Thank you very much,

Dear Jovana,

Apologies for the late reply as I had been travelling last week! Great news that you got the stair climbing running :slight_smile:

As for the issue with the noisy joint torques, I’m not sure if adding more contact nodes would necessarily solve the problem. Since the predicted GRF values are such that they balance out the inertial and gravity loads. So you could start by checking how smooth your kinematics are.

For the overloaded muscles, it’s very likely to arise at the muscles actuating the ground-pelvis connection. Their strength values are set to a very small value of around 10N/10Nm (for translational and rotational DOFs), because it’s merely assisting and not a physically realistic force that we want to keep to a minimum. If you check your results and if these muscles are being overloaded by only a small degree, it should not be a cause for concern.

To create a rectangular contact surface, start by making a renamed copy of the “ContactSurfaceLinPush.any” file and the class it contains (make sure the new file is found by your AnyScript code). Here you have a few lines of code defining the ‘UserDefinedMeasure’ and ‘RadiusMeasure’. Instead of a defining a radius measure, you could directly use the contents of kinematic measures ‘LinMeasureOrg1’ and ‘LinMeasureOrg2’ in the conditional statement for ‘UserDefinedStrengthFunction’ which decides whether a contact points lies within the contact volume. Instead of the currently programmed cylindrical, use the dimensions of your force plate to define the bounds of a rectangular prism.

Modify the dimensions of the stl file by defining the ScaleXYZ member of the AnyDrawSTL class. Hope this helps.

AnyBody Support

Thank you very much Ananth for your help!!!