AnyForceMomentMeasure2 in the spine


I am playing with the SpineFixationWithForceDependentKinematics example, and interested in knowing the lumbar spine joint moments provided by the muscles. I will only simulate isometric cases where the posture of the model is set and joints do not move in time. What is the easiest way to do this? Is it also possible to access to the moment contribution of individual fascicles?

I checked the Muscle_Moment_Measure_example.any example. However, it is not clear to me that which fascicles and segments I should include for a certain joint, as the musculature in the spine is very complex. Could someone help me with that?

One thing came into my mind was to set the reactions ON for these joints, and add AnyReacForce object to read these moments. However, I am not sure how accurate will be the solution in such a complex model, and beside, it will probably not be possible to see individual fascicle contribution in this case.

Kind regards,

Hi Riza,

You can exclude all the muscles from the human body and introduce artificial muscle to the joints of interest. The condition - the upper body should not be connected to the environment, but I guess it not the case for you.

This way these artificial muscles will have to carry exactly the same loads as all other muscles in the body, except it will be a summed up value rather than a whole bunch of individual muscles.

Kind regards,

Hi Pavel,

Thank you for your answer. By artificial muscles, I assume you meant the Reaction definition of the drivers? As far as I know, when we set Reactions on, it means that all the torque required for a motion will be provided by the driver itself. But in this case, it is not possible to see the contribution of each fascicle. Is there any other way to do this?

There is one more thing I would like to ask in this post. When I want to model the mechanical effect of a segment(s)-without defining the segment-, say skull, I simply add the gravity force (AnyForce3D) because of the mass of my segment. Due to flexion movement, this force will create moment in the model. Do I also need to add this moment to the model or AnyBody calculates it automatically whenever there is a force defined? I know that when we define segments, we do not need to model their moments, but the system calculates it for equilibrium, and I wonder if it is the same for external forces we define.

I mean defining a muscle based on the rotational kinematic measure for your joint. But if you want the individual contributions - there is not other way, but to go manually or semi-manually. The problem is that there is more than just the spine muscles that contribute to the moment - it is also abdominal muscles and muscles spanning over to the lower extremities, for example.

I would probably go by grouping, for example, Erector Spinae muscles and define an AnyForceMomentMeasure2 for them, then for Multifidi, etc. You might be able to use the ObjSearch and ObjSearchRecursive functions for that. But at least to find the names.

Do I understand it correct that you want to add some mass to the skull, possibly with some offset?

You could use the following class and F component to define your mass.

AnyForce3D <ObjectName> = 
      //RefFrames = ; // your ref. frame here, that connects to the head
      //Surfaces = ;
      //KinMeasureArr = {..Linear, ..Linear, ..Linear};
      //KinMeasureIndexArr = {0, 1, 2};
      //F = {0, 0, 0};
      //Flocal = {0, 0, 0};
      AnyRefFrame &<Insert name0> = <Insert object reference (or full object definition)>;

Hope this helps.

I am not sure what exactly you meant with an artificial muscle. I guess you meant something like adding only one powerful muscle to each joint for driving the joint, which compensate the effect of all the muscles in the model? Reactions in the driver definitions should be Off in this case right? Could you please tell me more about it?

I think grouping of muscles could work. In this case, I will get the fascicle names for a certain muscle type and issue the code below.

AnyForceMomentMeasure2 MomentMeasure = 
      // This the point of interest, it should therefore be the joint
      // center of rotation.
      // Notice that by default the resulting moment is given in global
      // coordinate system. If you want the moment in the local joint 
      // coordinate system you will have to use coordinates transformation.
      AnyRefFrame &Ref = .GlobalRef;
      AnySeg &Seg = .Seg;
      AnyFolder &Mus1 = .Mus1;

Then say I want to know the contribution of Mus1 at a L1L2 Joint. In this case my segment will be only L1 or L1 and L2 together? And, repeat the same for other fascicles.

About adding a force, I did not mean adding mass to the skull. Let me rephrase my question. My intention is to represent the skull segment without actually defining the segment. (This is not for SpineFixation… model, but for another model.) Therefore, I should add a force to represent its weight according to your code. Okay, but what about the moment that this force will produce during a motion. Should I also add it in addition to the force or AnyBody will calculate and apply it for me depending on its moment arm? Please see attached picture.

Hi Riza,

  1. An artifical muscle - you can simply create a muscle based on your own kinematic measure, which could be translational or rotational or a combination. You could use some constant strength - the solver will compute how much of the force is needed to balance this particular configuration. The forces/muscles do not drive anything unless you have FDK DoFs in the system.


AnyKinRotational rotx = {
AnyRefFrame &rf1 = ...
AnyRefFrame &rf2 = ...
  AnyMuscleModel MusMDL ={F0=2000.0;};
  AnyGeneralMuscle rotx_pos ={ AnyKinMeasureOrg &ref= .rotx; ForceDirection =1; AnyMuscleModel &ref2=.MusMDL;};
  AnyGeneralMuscle rotx_neg ={ AnyKinMeasureOrg &ref= .rotx; ForceDirection =-1; AnyMuscleModel &ref2=.MusMDL;};

Please note that I add muscles in both directions.

  1. Depends on what you want exactly:

    AnyForceMomentMeasure2 Test1 = {
      AnyForceBase &muscle = Main.HumanModel.BodyModel.Trunk.MusclesSpineRight.ErectorSpinae.LTptT9S4;
      AnyRefFrame &rf1 = Main.HumanModel.BodyModel.Trunk.SegmentsLumbar.L5Seg.L4L5JntNode;
      AnySeg &Seg = Main.HumanModel.BodyModel.Trunk.SegmentsLumbar.L5Seg;

    AnyForceMomentMeasure2 Test2 = {
      AnyForceBase &muscle = Main.HumanModel.BodyModel.Trunk.MusclesSpineRight.ErectorSpinae.LTptT9S4;
      AnyRefFrame &rf1 = Main.HumanModel.BodyModel.Trunk.SegmentsLumbar.L4Seg.L4L5JntNode;
      AnySeg &Seg = Main.HumanModel.BodyModel.Trunk.SegmentsLumbar.L4Seg;

    AnyForceMomentMeasure2 TestAll = {
      AnyForceBase &muscle = Main.HumanModel.BodyModel.Trunk.MusclesSpineRight.ErectorSpinae.LTptT9S4;
      AnyRefFrame &rf1 = Main.HumanModel.BodyModel.Trunk.SegmentsLumbar.L4Seg.L4L5JntNode;
      AnyRefFrame &rf2 = Main.HumanModel.BodyModel.Trunk.SegmentsLumbar.L5Seg.L4L5JntNode;
      AnySeg &Seg1 = Main.HumanModel.BodyModel.Trunk.SegmentsLumbar.L4Seg;
      AnySeg &Seg2 = Main.HumanModel.BodyModel.Trunk.SegmentsLumbar.L5Seg;

You can see individual contribution or combined, and make as many measures as you want. Test1.F+Test2.F=TestAll.F.
Feel free to try different options and see what you get as a result. You can always insert those measures in simpler models that run fast.

  1. Yes, of course, computes automatically. Both options are ok - easiest is to add the segment :wink:


Thank you Pavel! I will try your suggestions.

Kind regards,