I am working with the OpenSim neck model through the Matlab API. The neck model has 24 mobilities (8 joints, each with 3 rotational DOF). There are 18 coordinate coupler constraints, leaving 6 generalized coordinates (lower c-spine pitch2, roll2, yaw2; upper c-spine pitch1, roll1, yaw1).
I am trying to understand the effect of the coordinate coupler constraints on my calculation of the wrench forces at the head. Imagine that the skull is rigidly attached to a load cell so that it is a static problem. The generalized joint torques required to apply the wrench at the head can be calculated using the transpose of the Jacobian (torques = J^T * wrench). These joint torques are created by the muscle moment arms multiplied by muscle forces (torques = R * Fa * a). I get the Jacobian, moment arm matrix, and muscle force multipliers from OpenSim through the Matlab API and do my computations in Matlab.
When I inspect the moment arm matrix, I notice that muscles that cross only 2 joints of the lower cervical spine have moment arms about all the mobilizers that are coupled to those joints, including joints that the muscle does not cross. I found this paper by Sherman et al https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4404026 , (I know you are on this forum!) that explains how coupler constraints are used in moment arm calculations. What I am having a harder time wrapping my head around is how this will impact my wrench calculations.
I am interested in the relative contributions of the deep, segmental(-ish) muscles (such as m1 and m2) compared to the superficial, multi-segmental muscles (like m5) and how weakness of a particular muscle group might affect the feasible torque space and muscle activation patterns. I want the model to be as simple as possible without losing the redundancy gives these muscle groups different functions.
To make my question easier to understand, I drew a simplified model below that considers only the sagittal plane. Each of the five lower cervical joints (T1-C7, C6-7, C5-6, C3-4, and C2-3) are kinematically constrained as functions of the generalized coordinate pitch2 (q2) and the upper cervical joints (C1-C2 and Skull-C1) are kinematically constrained as functions of the generalized coordinate pitch1 (q1).
Figure 1. Neck model in sagittal plane with coupler coordinate constraints
Consider the muscles (m1, m2, m3, m4, and m5) from Figure 1. The muscle m1 crosses only the C6-7 and C5-6 joints, but due to the coordinate coupler constraints, the moment arm matrix applies an apparent moment arm about the T1-C7, C4-5, C3-4, and C2-3 joints. Am I correct that m1, m2, and m3 could essentially be grouped into an equivalent muscle m1 in Figure 2, where I have simplified down to just 2 joints? Does the coupling artificially inflate the 'strength' of m1 in Figure 1 (in terms of its affect on the wrench at the head)?
Figure 2. Simplified to 2 joints without coupling
While the constraints help me place the model in a kinematically realistic pose, I wonder if it makes the interpretation more difficult for a static wrench calculation.
Thank you for any advice.
Rab
Understanding coupler coordinate constraints in the OpenSim neck model
- Rebecca Abbott
- Posts: 12
- Joined: Wed Sep 26, 2012 12:09 pm
- Michael Sherman
- Posts: 806
- Joined: Fri Apr 01, 2005 6:05 pm
Re: Understanding coupler coordinate constraints in the OpenSim neck model
Hi, Rab. I have to say I don't know the answer to your question. But it seems like a great research topic! The question is really whether the existing neck model is suitable for your purposes.
Coupler constraints are a kind of shortcut in the model that allows convenient encoding of observed coupling behavior in a physically-consistent way (in the sense of energy conservation, Newton's third law, etc.) but not necessarily in a biologically-consistent way. A coupler constraint is like a little gearbox that attaches one dof to another -- while that is a perfectly reasonable mechanical device, it is not the actual mechanism by which that coupling occurs. (I presume that has to do with properties of the materials surrounding the cervical spine, but could I suppose be due to coordinated muscle activation?)
The physical nature of the couplers means that any energy required to deform the neck must come from the muscles (couplers don't inject any power). However, that doesn't mean that a muscle would produce the same wrench in this model as in the biological system, unless the biological muscle produces the same motion as the muscle+couplers does in the model. Does it?
Sorry I can't answer more definitively. Possible Ajay Seth or Tom Uchida might be able to provide more insight.
Best regards and good luck,
Sherm
Coupler constraints are a kind of shortcut in the model that allows convenient encoding of observed coupling behavior in a physically-consistent way (in the sense of energy conservation, Newton's third law, etc.) but not necessarily in a biologically-consistent way. A coupler constraint is like a little gearbox that attaches one dof to another -- while that is a perfectly reasonable mechanical device, it is not the actual mechanism by which that coupling occurs. (I presume that has to do with properties of the materials surrounding the cervical spine, but could I suppose be due to coordinated muscle activation?)
The physical nature of the couplers means that any energy required to deform the neck must come from the muscles (couplers don't inject any power). However, that doesn't mean that a muscle would produce the same wrench in this model as in the biological system, unless the biological muscle produces the same motion as the muscle+couplers does in the model. Does it?
Sorry I can't answer more definitively. Possible Ajay Seth or Tom Uchida might be able to provide more insight.
Best regards and good luck,
Sherm
- Pavlos Silvestros
- Posts: 43
- Joined: Sun Oct 16, 2016 4:10 am
Re: Understanding coupler coordinate constraints in the OpenSim neck model
Hi Rab,
I also use a neck model for my research and have been able to extract moment arm information for muscles spanning the individual/dependent coordinates (aux7jnt_r1... etc.). The way I was able to get the information for each independent coordinate was to acquire my kinematics initially by using a model that contained the coupler constraints (pitch 1/2 etc.). The output motion file that is generated contains the values for the individual (dependent) coordinates of each cervical joint. I then have a second model that has the coordinate coupler constraints removed with each joint and coordinate renamed accordingly in the .osim file. To this model you can pass/prescribe the motion calculated from your IK or FD .mot file (from the model with the constraints) and have the same motion in the two models. As you now the constraints have served their purpose in helping to calculate the kinematics (in the first model) you can run further analyses with the model that doesn't include them (ID, muscle analyses).
Depending on how you extract your moment arm information this "new model" will allow you to identify the muscles that cross the specific internal (aux7jnt_r1... etc.) coordinates. The method I use is to basically loops through the coordinates of interest and extracts the muscles crossing those coordinates. How do you extract the moment arm matrix is it from a specific API method?
Hope this is of some help, if you think it does I can share my versions of my model with you.
Cheers,
Pavlos
I also use a neck model for my research and have been able to extract moment arm information for muscles spanning the individual/dependent coordinates (aux7jnt_r1... etc.). The way I was able to get the information for each independent coordinate was to acquire my kinematics initially by using a model that contained the coupler constraints (pitch 1/2 etc.). The output motion file that is generated contains the values for the individual (dependent) coordinates of each cervical joint. I then have a second model that has the coordinate coupler constraints removed with each joint and coordinate renamed accordingly in the .osim file. To this model you can pass/prescribe the motion calculated from your IK or FD .mot file (from the model with the constraints) and have the same motion in the two models. As you now the constraints have served their purpose in helping to calculate the kinematics (in the first model) you can run further analyses with the model that doesn't include them (ID, muscle analyses).
Depending on how you extract your moment arm information this "new model" will allow you to identify the muscles that cross the specific internal (aux7jnt_r1... etc.) coordinates. The method I use is to basically loops through the coordinates of interest and extracts the muscles crossing those coordinates. How do you extract the moment arm matrix is it from a specific API method?
Hope this is of some help, if you think it does I can share my versions of my model with you.
Cheers,
Pavlos
- Rebecca Abbott
- Posts: 12
- Joined: Wed Sep 26, 2012 12:09 pm
Re: Understanding coupler coordinate constraints in the OpenSim neck model
Hi Sherm,
Thank you for your response! The coupling that occurs physiologically is probably a combination of muscle coordination and ligaments/passive components. I imagine that the coupler constraints would be more representative of these passive components. However, I am specifically interested in the muscle coordination, so the coupler constraints may mask these effects.
I have a question from your paper. You refer to enforcement of joint torques by 'workless transmission elements' in relation to enforcement of the coupler constraints. That made me think that energy was not conserved. Did I interpret that wrong?
Pavlov - Thank you! That approach makes sense. Then you get realistic kinematics and but then avoid the coupling for the dynamics. I have also tried removing the constraints, but then you have 24 independent coordinates, which is it's own headache! Figuring out how to best simplify the model without losing the important components is a difficult problem.
I have written some Matlab scripts to extract the moment arm matrix, Jacobian, and other parameters from OpenSim. I also can programmatically enforce or not enforce the coupler constraints. I am also happy to share code with you if you are interested. Here is a snippet of how I get my moment arm matrix:
I think I will move forward without the coupler constraints for now. It was helpful to hear that you came to a similar conclusion.
Thanks!
Rab
Thank you for your response! The coupling that occurs physiologically is probably a combination of muscle coordination and ligaments/passive components. I imagine that the coupler constraints would be more representative of these passive components. However, I am specifically interested in the muscle coordination, so the coupler constraints may mask these effects.
I have a question from your paper. You refer to enforcement of joint torques by 'workless transmission elements' in relation to enforcement of the coupler constraints. That made me think that energy was not conserved. Did I interpret that wrong?
Pavlov - Thank you! That approach makes sense. Then you get realistic kinematics and but then avoid the coupling for the dynamics. I have also tried removing the constraints, but then you have 24 independent coordinates, which is it's own headache! Figuring out how to best simplify the model without losing the important components is a difficult problem.
I have written some Matlab scripts to extract the moment arm matrix, Jacobian, and other parameters from OpenSim. I also can programmatically enforce or not enforce the coupler constraints. I am also happy to share code with you if you are interested. Here is a snippet of how I get my moment arm matrix:
Code: Select all
osimModel = Model(model_path);
state = osimModel.initSystem();
muscles = osimModel.getMuscles();
coord_list = osimModel.getCoordinateSet; %all coordinates (not just independent)
nCoords = osimModel.getNumCoordinates;
R = zeros(nCoords, nMuscles);
for mm = 1 : nMuscles
muscle = muscles.get(mm-1);
for jj = 1 : nCoords
joint = osimModel.updCoordinateSet().get(jj-1); %all coords
% Get moment arms for given posture
Rjm = muscle.computeMomentArm(state, joint); % temporarily assigned as R
R(jj,mm) = Rjm;
end
end
Thanks!
Rab