where are the lumbar vertebrae reference frames?!?

Dear AnyBody support,

I’m dealing with the Human standing model (from AMMR->Application->Templates v.1.6.3 and AnyBody v.6.0.4).

Specifically, I’m investigating the orientation of the lumbar vertebrae during a simple thorax flexion motion (-10 deg/sec defined in

Mannequin.any at PostureVel->PelvisThoraxExtension, and no other poture positions or velocities modified).

Focusing for example on L5, I made visible the L5 reference system, the L5 segment and the center of the reference frame (L5Seg.r0), by

inserting the following code in “SegmentsLumbar.any”:

AnySeg L5Seg = {

AnyDrawRefFrame drw={ScaleXYZ = 0.1*{1,1,1};};
AnyDrawSeg DrwSeg = {InertiaScale = 0.5;Opacity = 0.7;};
AnyRefNode r0_node = {
sRel = .r0;
AnyDrawNode drw={
RGB ={0,0,0};
ScaleXYZ=0.01*{1,1,1};
};
};// r0_node

}; //L5Seg

As you can see in the attached pictures (muscles, pelvis and arms not shown), the vertebral reference frame results not centered in the L5 segment (the sphere overlapped to the L5 vertebral surface), but is fixed at a given point placed behind (the same happens for the other vertebrae…). I understand that this depends on the CoM shift (sCoM = Scale({0.051, 0.009, 0.000000}). However, it is not oriented according to the displayed L5 vertebral surface and seems not rotated around the ‘z’ axis.
To this regard, exporting the L5 surface and inspecting the corresponding mesh, results that the L5 mesh is actually rotated by default around the ‘z’ axis. This means that in the initial condition, although the surfaces of the lumbar vertebrae “appear” rotated providing lumbar lordosis, actually their reference frames are oriented all in the same manner with no initial flexion-extension… (meaning no lordosis angle!?).

This happens both at initial condition (picture1) and along the extension movement up to the end (picture2).

In addition, L5Seg.r0 results upon the head! (see picture3) instead being in the center of the L5 reference frame (and then of L5 segment…).

Can you please clarify the reasons of these mismatching? Am I making any mistake??

Many thanks in advance,
Tito.

Hi Tito,

I am not quite sure I understood your message, but will try to explain:

r0 - value is a position wrt. global ref. frame of L5 on loading (not initial conditions), meaning it is 1+ meter something. When you define a nested node in L5, it will be constructed wrt. to the segmental ref. frame, which makes it okay to be above the head.

Secondly, all trunk entities are defined in the same coordinate system, which are somewhere around sacrum. It does not mean that the lumbar spine has no lordosis, it just means that at 0 degrees flexion/extension the model will have the lordosis of the dataset. All components of the lumbar spine are then driven through the local reference frames (joint nodes) - rotation is happening about them.

Hope this helps. If not - could you try explaining what you want to achieve?

Kind regards,
Pavel

Thanks Pavel,

I understand the mistake I made about r0.

But sincerely I still don’t understand the issue about the orientation of the vertebrae.

Running the model without flexion, just seeing what happens in standing, I investigate e.g. the reaction force at L4L5 joint. What I find (as expected) is that the joint reaction force in local coordinates (Fout) is equal to F_global*Axes0 where Axes0 is the cosine matrix of L5 segment and F_global is the reaction in global coordinates (F, in RefFrameOutput).

I would expect that the y component of Fout interprets the axial compression acting on the L5 upper endplate, but the y axis of the L5 segment is parallel to Y global, visually different from the orientation of the L5 upper endplate (arond 20°?).

Which is the correct interpretation?

Thanks,
Tito

Tito,

It will in the reference frame of the first node in the joint definition.
I would recommend to use AnyForceMomentMeasure2 class to define the reaction force in the ref. frame of your choice. Please see the manual and here is a small example how it can be done:

AnyForceMomentMeasure2 AnkleNetMomentMuscle = {
  AnyRefNode &ref=..Seg.Shank.AnkleJoint.RotNode; // ref frame of interest
  AnySeg &seg=..Seg.Foot;      
  AnyForce &ForceOut = ...myForceToRecompute;  // make a reference to the reaction force object here here
  
      AnyVec3 Mlocal=M*ref.Axes;
      AnyVar MPlantarFlexion=Mlocal[2];
      AnyVar MEversionFlexion=Mlocal[1];
      
 };
};

I would recommend to use the same joint node position, but define ARel to align it with one of the endplates.

Kind regards,
Pavel

Thanks Pavel,

the code you suggested is just another way to obtain Fout and F again.

If I understood correctly, you suggested to set ARel in the definition of L4L5JointNode. I tryed as follows in “SegmentsLumbar.any” by imposing flexion around ‘z’ axis of 20 degrees (as visually inferred about L5):

AnyRefNode L5SacrumJntNode = {…

AnyFloat angle=-20*pi/180;
AnyRefNode L4L5JntNode = {
sRel = .Scale({0.050,0.027,0.0}); // not modified as suggested

  ARel= {
    {cos(.angle),-sin(.angle), 0},
    {sin(.angle),cos(.angle), 0},
    {0.000000, 0.000000, 1.000000}}; 

But the result is that L4 is more flexed and the resulting F and Fout are then different from the previous values. Did I misunderstand your suggestion?

I think that the easiest way to obtain the correct axial vertebral compression is to choose Fout and then account for the additional default flexion of L5.

However, I think that this issue is of primary importance for researchers investigating intervertebral loads and should be highlighted and maybe specifically explained in the AnyBody tutorial where appropriate.
To this regard, I ask you if is possible to change the title of the present thread in “How to correctly compute intervertebral lumbar loads”.

Regards,
Tito

Tito,

You almost got me right. I suggested to make a second reference frame, which would share the sRel, but ARel will defined according to your preference.


AnyRefNode L4L5JntNode = {sRel=....};

AnyRefNode OutputRefFrame = {

sRel = .L4L5JntNode.sRel;
AnyFloat angle=-20*pi/180;
ARel= {
{cos(.angle),-sin(.angle), 0},
{sin(.angle),cos(.angle), 0},
{0.000000, 0.000000, 1.000000}}; 
};

And I suggested to compute an ARel in such way that it would make the 2 ref. frame axes to be parallel to the inferior endplate. To make sure that it is a compression direction. It is possible to use a variation of RotMat function, which uses 3 points to compute an ARel. Please see ref. manual for more.

Kind regards,
Pavel