MomentMeasure

Hi,

can you please tell me what exactly the three variables per joint are? I would be happy if you could describe each of them (NetMomentMuscle, ReactionMoment, NetMoment) on its own and also - if there is one - their relationship.

Thanks in advance,

Patrick

Okay, only now I looked into the LegMoments.any and found this, which is what assumend but expressed as a nice definition:

NetMoments will measure the moments and forces supplied by the muscles spanning these and on top of these moments and forces the forces and moments from the constraints in the joints will be added. The resulting forces and moments are equal to the to total moments and forces which could replace both the muscles spanning the joint and the joints reactions.

NetMomentMuscle will measure ONLY the moments and forces supplied by the muscles spanning these joint and not the moments and forces which from the constraints in the joints. The resulting forces and moments are equal to the to total moments and forces which are supplied by the muscles.

(I added some plural s’s).

I guess the ReactionMoments are self-explanatory.

1 Like

Somehow this explanation doesn’t work:
The NetMoments are much smaller than the ReactionMoments and the MuscleMoments. To me it seems like the ReactionMoments are some kind of combination of the NetMoments and the MuscleMoments where the NetMoments are something like the forces and moments you get by the free body diagram.

Could you please try to explain those the parameters to me?

Hi Patrick,

Maybe you know already very well about the AnyScript code about this moment measure. But let’s review here again.

AnyForceMomentMeasure2 KneeNetMomentMuscle = {
  AnyRefNode &ref = ..Seg.Thigh.KneeJoint.RotNode;
  AnySeg &seg1=..Seg.Shank;      
  AnySeg &seg2=..Seg.Foot;  
  AnySeg &seg3=..Seg.Talus;

  AnyReacForce &jnt=..Jnt.PatellaMovement.Reaction;

  #include  "LegMuscleNames.any"

  AnyVec3 Mlocal=M*ref.Axes;
  AnyVar MKneeFlexion=Mlocal[2];
};

AnyForceMomentMeasure2 KneeNetMoment = {
  AnyRefNode &ref1 = ..Seg.Thigh.KneeJoint.RotNode;
  AnySeg &seg1=..Seg.Shank;      
  AnySeg &seg2=..Seg.Foot; 
  AnySeg &seg3=..Seg.Talus;
  
  AnyReacForce &jnt1=..Jnt.Knee.Constraints.Reaction;
  AnyReacForce &jnt2=..Jnt.Ankle.Constraints.Reaction;
  AnyReacForce &jnt3=..Jnt.SubTalar.Constraints.Reaction;
  AnyReacForce &jnt4=..Jnt.PatellaMovement.Reaction;
};

AnyForceMomentMeasure KneeJointReactionMoments = 
{
  AnyForceBase &Force = ..Jnt.Knee.Constraints.Reaction;
  AnyRefFrame &Thighknee = ..Seg.Thigh.KneeJoint;
  AnyVec3 Mlocal = M*Thighknee.Axes;
};

As you guess, both KneeNetMomentMuscle and KneeNetMoment are a kind of free body diagram calculation.
The only difference is that KneeNetMomentMuscle only considers muscle forces and KneeNetMoment considers both muscle forces and joint reaction forces. Thus, those two values are different.
If you can run inverse dynamics using some other software such as VICON NEXUS, then it will be interesting for you to compare this KneeNetMoment value with the VICON NEXUS knee moment value.

The purpose of KneeJointReactionMoments is just to see the reaction moments at the joint.
That’s the reason why it only considers knee joint reaction force.
As you know, our standard knee is a revolute joint.
So there should be no reaction moments at the rotational degree of freedom of the revolute joint.
That’s the reason why Mlocal[2] value of KneeJointReactionMoments should be always zero.

If you see the ‘RightLegSimpleMuscleSelectedOutput.any’ file,

      /// Lateral positive
      AnyVar Knee_MedioLateralForce = ....Right.Leg.Jnt.Knee.Constraints.Reaction.Fout[2];
      /// Proximal positive
      AnyVar Knee_ProximoDistalForce = ....Right.Leg.Jnt.Knee.Constraints.Reaction.Fout[1];
      /// Anterior positive
      AnyVar Knee_AnteroPosteriorForce = ....Right.Leg.Jnt.Knee.Constraints.Reaction.Fout[0];
      /// Internal positive
      AnyVar Knee_AxialMoment = ....Right.Leg.MomentMeasure.KneeJointReactionMoments.Mlocal[1];
      /// Internal positive
      AnyVar Knee_LateralMoment = ....Right.Leg.MomentMeasure.KneeJointReactionMoments.Mlocal[0];
      // Thigh.KneeJoint ref

The reason why we need this KneeJointReactionMoments is that AnyRevoluteJoint uses ‘PlanarAngles’ type of AnyKinRotational object.
So the reaction moment value from PlanarAngles type is not as same as our physical understanding of joint reaction moments.
That’s the reason why we need this KneeJointReactionMoments to get the ‘proper’ value for your research.

I hope this may help you.

Best regards,
Moonki

1 Like

Hello Moonki,

I was reading this thread and have a follow-up question to help my understanding. If I choose to use Output.BodyModel.Left.Leg.MomentMeasure.KneeNetMoment.M as my moment measure, would those moments be in the global reference frame or the local reference frame of the knee?

Also, if I want to calculate knee joint power in the knee’s local coordinate system, would I then be able to multiply the above moment to an AnyKinRotational object that measures the angular velocity of the knee with Orientation.AngVelOnOff set to On and receive power calculated with respect to the knee’s local coordinate system? Is angular velocity in this case measured in rad/s or in deg/s?

Thank You,
Taylor

Dear Talyor,

  1. If you see the descriptions of the classes such as ‘AnyForceMomentMeasure’ or ‘AnyForceMomentMeasure2’, the you will see that the outputs such as ‘F’ or ‘M’ will be represented in the global coordinate system.

  2. So, it will be useful to put some new lines inside to convert those global F and M into local values:

AnyVec3 Flocal=F*ref.Axes;
AnyVec3 Mlocal=M*ref.Axes;
  1. If you want to calculate the knee joint power in its local coordinate system,
    you are right so you need to make the multiplication between the knee joint local moment and the knee joint local velocity. And all the angular velocities in AnyBody is represented in radian per second.

I hope this may be helpful to you.

Best regards,
Moonki

1 Like