The topics covered in this section include:


JointReaction is an OpenSim Analysis for calculating resultant forces and moments at joint.  Specifically, it calculates the joint forces and moments transferred between consecutive bodies as a result of all loads acting on the model. These forces and moments correspond to the internal loads carried by the joint structure. These loads represent the contributions of all un-modeled joint structures that would produce the desired joint kinematics, such as cartilage contact and any omitted ligaments. The reaction load acts at the joint center (mobilizer frame) of both the parent and child bodies. The loads can be reported and expressed in either the child, parent, or ground frames. The default behavior is to express the force on the child in the ground frame. For more detailed description of the method implementation see Tibiofemoral Contact Force during Crouch Gait (Steele et al, in review).

In this section, we provide a conceptual review of the inputs and outputs for a JointReaction Analysis along with a set of troubleshooting tips and best practices. Running an Analysis like JointReaction is covered in detail in the How to Use the Analysis Tool section.


Inputs Specific to JointReaction:

  1. joint_names: List of the names of the joints of interest. JointReaction reports loads for only listed joints that exist in the model. Joint names may be repeated any number of times to allow reporting on different bodies or with respect to different reference frames. Using the keyword 'all' reports the loads for all joints in the model. Default is 'all'.
  2. apply_on_bodies: List of the body (parent or child) on which the corresponding reaction occurred. If the array has only one entry, that selection is applied to all joints specified in joint_names. The default is 'child'.
  3. express_in_frame: List of the frames (ground, parent, or child) in which the corresponding reaction is expressed. If the array has only one entry, that selection is applied to all joints specified in joint_names.
  4. forces_file: The name of a file containing forces storage. If a file name is provided, the applied forces for all actuators will be constructed from the forces_file instead of from the states. This option should be used to calculate joint loads from static optimization results.


JointReaction prints results to one storage file with the suffix "_ReactionLoads.sto". This file contains rows of time-stamped data containing the 3 force and 3 moment vector components of the reaction load at each joint specified. Each data column label includes all information about how the load is applied and expressed. Specifically, the form is 
< joint name >on<body>in<frame>_<component>. 

For example, the column containing the z-component of hip force occurring on the femur and expressed in the femur frame would be labeled "hip_on_femur_in_femur_FX" while the y-component of the knee moment occurring on the tibia and expressed in the ground frame would have the label "knee_on_tibia_in_ground_MY". 

Best Practices and Troubleshooting Tips

  1. If JointReaction doesn't recognize a specified joint, body, or frame name, it will perform its default action. The overall default action is to report the loads on all joints as applied to the joint's child body and expressed in the ground reference frame. 
  2. Consistency of modeling inputs to the Analyze tool: The validity of the joint loads depends on modeling assumptions and correct modeling practices. JointReaction is very sensitive to the consistency of all inputs that define a dynamic trial, including the following inputs to the Analyze Tool: <model_file>, <replace_force_set>, <force_set_files>, <states_file>, <coordinates_file>, <speeds_file>, <lowpass_cutoff_frequency_for_coordinates>,<external_loads_file>, <external_loads_model_kinematics_file>, <lowpass_cuttoff_frequency_for_load_kinematics>
  3. If any of these files are not associated with the same dynamic trial, the system of accelerations and forces will not be consistent. Therefore, JointReaction will calculate incorrect joint loads. 
  4. Special Types of Forces: Certain types of forces and actuators, called SpringGeneralizedForce, CoordinateLimitForce, and CoordinateActuator, are associated with specific degrees of freedom and treated as part of the joint structure. This means that any contribution from these components will be treated as part of the resultant loads reported by JointReaction instead of body forces. As an example, consider a reserve actuator on the hip joint of a gait model. If this reserve actuator is defined as a CoordinateActuator, its contribution is treated as a residual force provided by the joint and therefore will be added to the resultant load at the hip. However, if the hip reserve is defined as a TorqueActuator, its torque will be treated as a motor external to the joint and attached between the pelvis and femur. Therefore, its torque will not be added to the reported resultant load at the hip.

Joint Reactions vs Inverse Dynamics

Users should be aware of the differences between Inverse Dynamics calculations and Joint Reaction calculations:

  • Inverse Dynamics calculates the net generalized forces at all degrees of freedom in the model. These generalized forces only account for the model motion and applied external forces.  Inverse Dynamics ignores the contribution of muscles, motors, and all other actuators when calculating new generalized forces at each joint.  
  • The JointReaction analysis calculates the resultant forces and moments the joint structure caries in response to all motions and forces in the model, including muscles, motors, and all other actuators.  

To illustrate the difference, let's consider the hip joint, which is modeled as a ball and socket and actuated by muscles. This joint allows three rotations, but prohibits translations.

  • Inverse Dynamics will report the net torques (generalized forces for the hip) that the muscles must overcome. 
  • JointReaction will report the vector of compressive forces that the hip caries to prevent translation of the ball through the socket.  JointReaction will report zero for all hip torques because the ball and socket can not produce torques or resist rotation. The only exception would occur if Coordinate Limit Forces or Coordinate Actuators were applied at the hip.  These are interpreted as part of the joint structure that act along the generalized coordinate direction, and JointReaction will include their contribution as part of the resultant joint load.  


Next: Probes