Spinal Vertebral Segment Displacement

Hello AnyBody community,

I have recently started using AnyBody for my research project on the cervical spinal vertebra. I am using C3D MoCap file data to drive the Plug-in Gait Simple with GRF Prediction model from AMMR for a number of movements for my research. So far, it has been a success :slight_smile:

Could anyone point out to me which part of the Studies that I should get if I want to see the vertebral translation and rotational displacement (with respect to the vertebral below/above) when the body moves?

I have several other questions that I would like to be answered but I will post it here one by one so I could run the simulation and solve it before I move on to the next. I really appreciate if anyone could shine a light to me on this.

Thank you very much.

Kind regards,
Faizal

Hi Faizal,

Welcome! You can find this folder in the Model Tree: Main.HumanModel.BodyModel.Interface.Trunk.Spine. or the same folder in [YourStudy].Output.BodyModel.Interface.Spine.
It contains all the information about motion in the spinal column. Please check, for example, C7C6.Pos - it will contain relevant rotations.

You can also define your own output kinematic measure, for example, angle between endplates in a joint by using AnyKinRotational measure. Please read our Ref. Manual for more information.

Kind regards,
Pavel

Hi Pavel,

Thank you for your answer.

I had a look at the folder that you mentioned and found the Object Description. I presumed the vertebral translation and rotational displacements will be either:-

Main.HumanModel.BodyModel.Trunk.JointsCervicalSpine.C7C6Jnt.Linear
Main.HumanModel.BodyModel.Trunk.JointsCervicalSpine.C7C6Jnt.Orientation

or

Main.Studies.InverseDynamicStudy.Output.BodyModel.Trunk.JointsCervicalSpine.C7C6Jnt.Constraints.Linear.Pos
Main.Studies.InverseDynamicStudy.Output.BodyModel.Trunk.JointsCervicalSpine.C7C6Jnt.Constraints.Orientation.Pos

Also, correct me if I am wrong, the units for Linear is in metre and for rotation is in radian?

Also, I presumed the Linear and Orientation will be based on the segment below it. Because when I had a look at C7C6Jnt, I saw the lines:

Main.HumanModel.BodyModel.Trunk.JointsCervicalSpine.C7C6Jnt.Linear.RefFrameOutput.RefFrameArr = {Main.HumanModel.BodyModel.Trunk.SegmentsCervicalSpine.C7Seg.C7C6JntNode,

and

Main.HumanModel.BodyModel.Trunk.JointsCervicalSpine.C7C6Jnt.Orientation.RefFrameOutput.RefFrameArr = {Main.HumanModel.BodyModel.Trunk.SegmentsCervicalSpine.C7Seg.C7C6JntNode,

I hope you could verify my understanding.

Thank you very much.

Faizal

Hi Faizal,

Yes, to units.

And yes to linear/rotational measures - the actual values will be in .Pos variables. The definition of rotation will depend on how this joint/kinematic measure was created, i.e. which ref. frame was specified first in the construction (you can navigate to the joint definition and see yourself).But in case of the cervical spine all joints are defined wrt. the lower one.

Depending on how exactly you setup your model - you may see some translations or not. If you are using the default kinematic rhythm - then you should not see any translations and expect a behavior of the joint as rotating about the instantaneous center of rotation.

Regards,
Pavel

Hi Pavel,

Thank you again for the response. The information has been helpful.

Further to my question on the topic of displacement, am I correct that if I want to use FDK to get the translational displacement of the vertebrae, I will have to switch off the cervical kinematic rhythm before the FDK can be applied?

Will the simulation be able to compute individual vertebra's rotational displacement as well if the kinematic rhythm is being switched off (since I am only switching on ForceDepKin for translational displacement)?

I also have been advised that it is possible that I could use a 'soft' rhythm, so it would only govern the DOFs which is not controlled by FDK (as I only interested in anteroposterior and mediolateral translation displacement for FDK in C3/4 to C6/7). Will this be the best way forward?

Thank you.

Kind regards,
Faizal

Hi Faizal,

You don't need to switch off the rhythm if you want to model the translations as FDK - you just need to change the constraint type to be FDK for those DoFs that are in question. The rhythm controls rotations, but the translations are constrained in the joints.

But the question is how much it makes sense to have translational DoFs to be FDK without having rotations as well. You assumed a certain behavior for rotations, but want to find what happens to translations - in fact, they are very codependent and i would probably recommend FDK on both types at the same time.

Please be aware that the disc stiffnesses and ligaments are not present for the neck - you would need to define them before you can run FDK.

Kind regards,
Pavel

Hi Pavel,

Yes, your recommendation actually crossed my mind too before I posted the earlier post. However, based on my previous reading in the forum, it is important to have the 'principal motion' to not have the FDK function switched on in order to have the 'starting guess' for the FDK to function. I also (selfishly) would like to reduce the computational time step. Hence, that is why I have arrived the decision to have FDK only AP/ML movements only and let the rotational movements remained with the default settings. I am only expecting the AP/ML movements to be fractionally small from the rotational DoF. Please do advice.
[I am looking at at least 8 different 'activities of daily living' to be recorded on MoCap and to be simulated on AnyBody model (crossing roads, drinking etc). So, this sounded as if I need to have FDK to be tailored according how the principal movement is going to be.]

I also was contemplating whether I should just change all the (interested joints) to have 6 DOF on its own instead of using the FDK function. But I do not have any drivers/additional markers to drive the individual vertebra's movement other than the C7 (and 4 head markers). [I initially thought of adding 2 additional markers on C3 and C5 with kinematic rhythm split into C0/C3, C3/C5, C5/C7 for the reason I explained in the previous post. But abandoned this idea as I was advised that the additional markers will not be able to track the micro motion in the cervical spine.] Please advice if abandoning this idea is justified.

Kind regards,
Faizal

Basically information about major rotations is needed for cases like the knee joint modeling. But in your case you have information from the markers on the relative motion of the skull-neck-thorax region, where you need to find motion in individual joints. Those will be governed by the stiffness in each joint. But you could, of course, simplify your job by making assumption that the rhythm works as it should and there is no motion in compression direction - if this is justifiable for your purposes, then fantastic. In reality the motion may be quite complex with pivoting about facet joints and other bony contact induced behavior. But this again would require quite accurate bone surfaces for modeling contact.

Extra markers will indeed not make the motion of the neck more accurate - there is quite some motion of the skin and marker positions will quite likely contain artefacts.

Kind regards,
Pavel

Hi Pavel,

Thanks for the explanation, it really shines the light the reason behind your suggestion. Perhaps, I should explain my research background a little bit.

My PhD research is to investigate the wear of the cervical disc implant under the loads and motions that represent activities of daily living. This is a two-part project where the first part is to gather subject-derived data of cervical spine biomechanics using the motion capture technique where the loads and motions will be calculated from those activities. These data will be fed into the second part of the project where it will be used as input parameters for the spine wear simulators.

From the MoCap, I plan to gather information on:-

  1. joint reaction force between C3 to C7 vertebrae (extracted from 'Selected Output' folder),
  2. joint moment between C3 to C7 (but this is impossible with AnyBody model, according to my reading from the forum/tutorials),
  3. the linear displacements of C3 to C7 (the issue that is currently being discussed), and
  4. the angular displacements of C3 to C7 (answered in the second post of this thread).

As the spine wear simulator has 5 DoF, I decided to prioritise AP and ML displacement (not that superior/inferior displacement does not happen) on top of the 3 rotational movements as the input for the machine. Plus, I will have the superior/inferior joint reaction force as the main input for the spinal loading on the spine wear simulator which would render superior/inferior displacement insignificant (I think).

And I also totally understand when you say that the translational movement is co-dependent on rotational too. I am, however, more interested in the quantity of the translation movement that is happening (albeit at a minuscule distant) than the quality of movement. Given the kinematic rhythm is robust enough to simulate the rotational displacement of the vertebrae, if the rotational movement values from FDK will only have a small discrepancy with a negligible margin of error from rotational movement values from kinematics rhythm, I'd rather stick to kinematic rhythm. Let me know of your view on this as I am still new to rigid-body modelling.

As for joint stiffness, I plan to incorporate this numerically (instead of geometrically), taking into account the disc stiffness, ligaments, and facet joints as per thoracic/ribcage modelling from Ignasiak et al. (doi: 10.1016/j.jbiomech.2015.10.010.).

Kind regards,
Faizal

Hi Faizal,

I will start by saying that I actually do not know best strategy in this case, but I will share my thoughts.

Your task comes down to computing most accurate kinematics then, which would, in turn, lead to accurate dynamics. The rhythm, as far as I remember, will evenly distribute angles between vertebrae for the neck region. It is definitely an assumption. Maybe this would lead not to the most accurate solution, but applying a non-specific stiffness from the literature might be another assumption, which could lead to the same level, if not larger, inaccuracies. Maybe it makes sense to evaluate which method or assumptions to choose by quantifying error against either some sort of reference, X-ray images or FEA models:

  • Soft kinematics on translations and rotations (these would depend on chosen weights per dof)
  • FDK on translations + hard rhythm (these would depend on chosen stiffnesses and rhythm coefficients)
  • FDK on all degrees of freedom (dependent on stiffness)

My guess would be that people with different disc properties and vertebral geometry would bend neck different. Or in other words, say, for the same neck flexion angle distribution of the angles may be different for different subjects.

Another approach would be to refer to a previous study and choose the same strategy in case results were validated.

Kind regards,
Pavel

Hi Pavel,

I think the three suggestions that you made are very reasonable. And I would like to run some simulations with all the three settings using my preliminary MoCap data.

Am I correct that the these settings should be set in JointsCervical.any files from "AMMR.v2.2.3-Demo\Body\AAUHuman\Trunk" folder?

And the changes should be according to the steps outlined in FDK tutorials https://anyscript.org/tutorials/ForceDependentKinematics/lesson2.html (with the appropriate stiffness for the cervical spinal joints)?

Kind regards,
Faizal

Hi Faizal,

Yes to FDK, but you could also check how the lumbar spine disc stiffnesses and ligaments are defined.

Regarding where to make changes - ideally you would not want to change the repository as it would not be correct to refer to a particular version of AMMR anymore.

Most of the changes can be done without modifying the AMMR code. You can change the joint type using code, for example:

Main.HumanModel.BodyModel.Trunk.JointsCervicalSpine.C1C0Jnt.Constraints.CType = {Soft, Soft, Soft, Soft, Soft};

You may want to remove the cervical spine rhythm (#define BM_TRUNK_CERVICAL_RHYTHM OFF) and add a new using the code similar to this:

Kind regards,
Pavel

Hi Pavel,

Thank you for highlighting about the change approach.

Another thing that I would like to ask (before run the simulation with FDK) is about the joint reaction force in cervical spine in the superior/inferior direction where I found that the value is too low. For example, in walking trial the highest JRF value is 24N. Do you think this has to do with the model has not got any disc stiffness?

As I described in the first post, I used Plug-in Gait Simple with GRF Prediction model for my simulation.

Kind regards,
Faizal

I am not sure why you have low forces. But it looks like you may not have neck muscles switched on.

#define BM_TRUNK_CERVICAL_MUSCLES ON

P.

The muscles were turned on as "MUSCLES_SIMPLE" initially. But it still has the same results when I changed it to "ON".

Main = {

  #define BM_SCALING _SCALING_LENGTHMASSFAT_
  
  #ifndef BM_LEG_MODEL
  #define BM_LEG_MODEL _LEG_MODEL_TLEM2_
  #endif
  
//  #define BM_ARM_MUSCLES_LEFT ON //not stated in simulated file; default is OFF
//  #define BM_ARM_MUSCLES_RIGHT ON //not stated in simulated file; default is OFF
  #define BM_ARM_SHOULDER_RHYTHM ON
  #define BM_TRUNK_CERVICAL_MUSCLES ON
// #define BM_TRUNK_CERVICAL_MUSCLES _MUSCLES_SIMPLE_ //originally set
  #define BM_TRUNK_CERVICAL_DISC_STIFNESS _DISC_STIFFNESS_LINEAR_
  #define BM_TRUNK_LUMBAR_DISC_STIFNESS _DISC_STIFFNESS_LINEAR_
  #define BM_TRUNK_CERVICAL_LIGAMENTS ON
  #define BM_TRUNK_LUMBAR_LIGAMENTS ON

F

Faizal,

I just tried running one of your models (Subject Pilot Test 3 FK\FK_DP1\FullBody_GRFPrediction.main.any"):


And i see that orientation of the global ref.. frame is actually wrong. You have gravity acting in -Y direction, but your model is oriented differently. But even with wrong settings values were more than 24N.

Try looking at these variables:

Pavel

Hi Pavel,

I have changed both the cervical and lumbar disc stiffness from linear to non-linear before you ran it and I also found the joint reaction force values has improved.

I supposed as you say, the (assumed) disc stiffness will play a major role in the accuracy.

As for orientation of the frame, I have changed the orientation of the gravity as per suggestion in the forum and here. It still however remain unchanged. Is there any other way for me to change this (as I have tried looking around the forum for GRF Prediction re-orientation but to no avail)?

Let me know.

Thank you.

F

Faizal,

You would need to change orientation in 2 places:

  1. LabSpecificData.Any: Gravity = 9.81*{0,0,-1};
  2. ForcePlates_GRFPrediction.any: NORMAL_DIRECTION = "Z" - for both forces plates. The screenshot suggests you did it for one of the plates, not the second.

But then there is another problem - you don't have any support forces from the seat. Meaning that GRF prediction is wrong anyway. If I were you I would switch off legs from the analysis and add a reaction force between pelvis and the world. This would also speed the analysis.

  1. You can switch the legs off in the BodyModelConfig_FullBody.any:
    #define BM_LEG_RIGHT OFF
    #define BM_LEG_LEFT OFF
  2. delete leg markers from the MarketProtocol.
  3. Add AnyReacForce instead of GRFP ForcePlates.

I tried pushing this configuration to your repository, but I do not have access.

Regards,
Pavel

Hi Pavel,

Sorry for leaving this for awhile. I have captured several new mocap data to improve the simulation during that time which need further analysis.

I have some questions which might sound stupid.

  1. Since I am only interested with the JRF and the kinematics of the cervical vertebrae, would it affect significantly if I were to switch off the muscles on the legs and the use 'simple leg' type?
  2. Some of the activities I am capturing involving external environment like sitting on a chair or picking up a shopping bag from the floor (with a constant mass/load for all subjects). What is the minimum that I need to do for this given my interest is only the JRF and kinematics of the cervical vertebrae. e.g. Do I need to put a marker on these external objects and create an object in the Environment? I am using Plug-in_Gait MultiTrialStandingRef model from AMMR.

Kind regards,
Faizal

Hi Faizal,

Here are some answers:
1: If your are only concerned in the JRF in the cervical i think you are correct that the legs will contribute much. The difference will not be zero, since taking off muscles would replace these with joint actuators with different strengths than the muscles. To be sure i would try to make a comparison.

2: That is a good question. Concerning loads applied to the arm these will be important, there are two ways... Simply apply a constant force AnyForce3D to the hand, or create an object for the item being lifted, connected it to the hands, track its motion. Concerning force from chair, by default the model will have "hand of god" on the pelvis so this might be enough in this case.

Best regards
Søren

1 Like