My question is about the implementation of the scapula and clavicle motions in the “JntSR.any”, from the data of de Groot (2001). Did you make any validation of this kinematics ? Does the kinematics is reliable in all the elevation plane such as flexion, because I tried it in flexion up to 150°, but the lateral rotation of the scapula does not seems physiological. Maybe it needs some adjustments ?
The rhythm has been implemented with a linear regresion of experimental data. So it fits well enough for a moderate range of motion, but larger motions (like the 150 deg flexion you tried) may show a difference with the real shoulder. A non-linear rhythm would give a better fit but it is not available in the system.
We will probably put some documentation online about the shoulder rhythm implementation. Keep an eye for it.
The coefficients of de Groot were found for angles up to 150 deg. Why not using them up to this angle, even if they are for a linear regression ? What would be the maximum allowable angle for the mid range ? (70, 90, 120 ?)
Moreover, after implementing the abduction, some parts of the latissimus dorsi lead to an error: “Unexpected exception in the library OOSol : OOSol exception : MISSING MESSAGE.” I know it is related to the SPLine and the Elliptic shape used to simulate the rib cage. However, how do I correct this without affecting the model ? I tried to increase the SPLine.StringMesh, but it doesn’t work. For the moment, I converted them to ViaPoint muscles, but I would eventually want them to work as ShortestPath muscles.
I looked again at the curves and you are right that de Groot regression should be valid enough up to 150 degrees. It was a long time i didn’t see it and i had the idea that at such angles the linear regression and the experimental curve were begining to diverge. But it is not the case.
So as we used the exact coeffcients from de Groot the scapula motion should be ok. It tried the flexion and it doesn’t seem so bad to me.
For the muscle error try to display all the surfaces they wrap on and during the simulation look for anything suspicious (wrapping on edges, on the wrong side of the surface, etc…). That could be the cause.
Ok good. Did you implemented any movement that would represent a risky movement for the stability of the shoulder, i.e. a movement that would sollicitate the GH joint much ? I’m looking for that kind of movement because I want to test the hypothesis that the humeral anatomical discrepencies among individuals could make a difference in the prediction of shoulder instability. Do you have any suggestion ?
For the wrapping latissimus dorsi, I don’t see anything, but I think this is because of the new JntSR implementation. Can you test it on your side and see if you have any similar problem ?
I don’t know exactly which movements are the most risky for the shoulder. I guess high abduction and flexion would solicitate the joint quite a lot.
I tried the 150 deg flexion and i got the same SPLine error for the latissimus dorsi. As you say it seems related to the rhythm and the rib cage ellipsoid. However i didn’t find the exact cause yet. I’ll tell you when i find more about it.
I guess that’s a part of the improvement that you have to make in the present shoulder model.
I was thinking about a future improvement that would really improve the realism of the muscle modelling. My idea would be to link muscles divisions between them, in such a way that they would not slide on the wrapping surface but would rather form a rigid (or at least a bit compliant) muscle bundle. Such improvement would require to set a perpendicular distance between the divisions with a kinematic constraint. Thus, it would allow to get rid of some via points (e.g. deltoid muscle) and to simulate more efficiently the contact surfaces. I have no idea how to simulate that, because I don’t know how the wrapping muscles are handled and created in the model. Does the discretization points related to the StringMesh could be used for this purpose ?
I know that the idea sounds a bit crazy but I’m sure that it would be more realistic. Let me know you point of view about this !
You are totally right that it would improve the realism of the model. We thought about it already but as you guessed the problem is the implementation. We cannot just constrain a distance between PLines.
So for the moment the only way we found is what was done with the deltoid muscles: adding an artificial segment with via points.
I’m looking forward to see this new feature maybe some day. For the lattissimus dorsi, it is recruited only at the beginning of the movement in my simulation. Thus, I switched it to a ViaPoint muscle. I think that it will not affect the recruitment that much.
How did you set your axis sequence for the AnyKinematicRotational that drive the forward flexion motion ? I think it was the reason why I get a non-physiological shoulder rhythm !?! If I put the Y-X’-Y’’ sequence, it works as long as I avoid the gimbal lock by setting the external rotation to approximately 20 degrees. Did you use the same sequence ? If not, how did you proceed ?
I am driving the humerus flexion and abduction with kinematic measures defined in the interface, with the GHDriverRight of the FreePostureHandSR model:
That is how the rhythm was designed to work. Maybe you could send your model (the one you say that produce a non-physiological result) so i can see exactly how you drive it and what is the non-physiological result you get.
So your sequence is the one in the interface (X-Z-Y). That doesn’t make sense if you want to set the “elevation plane / flexion” value to a constant value and control the external rotation ! I tried to drive the flexion from 0 to 150 while leaving the abduction to zero and it gave the non-physiological kinematics.
Using the sequence Y-X-Y gives much better results and I can control the three rotations as I want, as long as I avoid the gimbal lock.
Type=RotAxesAngles;
// The original definition
// Axis1=x;
// Axis2=z;
// Axis3=y;
// My definition
Axis1=y; // plane of elevation like in de Groot 2001
Axis2=x; // Elevation
Axis3=y; // external rotation
It is right that i can’t get the same scapula motion as you during pure flexion (or elevation in the sagital plane with your sequence). However the main problem of the Y X Y sequence is the gimbal lock. We cannot prevent users from setting 0 deg of elevation. And it is not acceptable for us to have a general model that locks each time they do it, because many will simply not know why and get annoyed over the model failling to solve this simple position.
It is a long time ago but as far as i recall that was the reason to keep the X Z Y sequence (already used to drive the arm before the shoulder rhythm).
Also i think it is only this particular movement (flexion with 0 abduction) that is discutable because when using XZY it is seen as having no elevation in term of input for de Groot’s scapula equations. Therefore some scapula elevation is probably missing here.
So until we found the right way and the time to improve it we will keep it as it is in the public repository. Of course you are welcome to modify it in your own version if it fits your application.
OK I understand. However, in order to take full advantage of these coefficient (e.g. elevation in multiple plans), I guess that you would have to use the same definition they used, which I think is Y-X-Y relative to the thorax. At least, I would recommend that you add a comment in the “JntSR.any” that would inform the users about this issue. From my point of view, it is better to know in advance rather than to search !!
Moreover, in order to resolve the issue, would it be possible to convert the kinematics from RotAxesAngles definition to EulerAngles ?
Also, you found the axial rotation of the clavicle by iteration. Why not just use the linkage of the coracoclavicular and the acromioclavicular joint ligaments as constraints ? In the study of Ludewig (2009) J Bone Joint Surg Am. 91(2):378-389, they say that this rotation is driven by this linkage because no muscle that crosses the sternoclavicular joint can produce this axial rotation.
You are right that some comments in the file would be good. I’ll make a note of it for the next release.
About the Euler Angles, do you mean to change the type from RotAxesAngles to EulerParam (Euler parameters)? Because if i remenber well what we call Euler Angles is just another specific sequence of the RotAxesAngles type, Z-X-Z i think, and that probably will give the same kind of problems.
I didn’t know about the paper you mentioned. It sounds quite interesting and we can surely do something with it. But we don’t have much time now and it will have to wait for later. Thank you for all you good ideas.
If I simulate an abduction with the Scapulohumeral rhythm and look at the shoulder in the horizontal view (XZ), I feel that the scapula is really misaligned with the humerus. If I remove the protraction and put back the TS contact, it get a more physiological kinematics.
So I think that you should consider using the TS node constraint instead of the scapulothoracic protraction, in order to obtain a more physiological kinematics.
Did you perform this verification when you implemented the scapulohumeral rhythm ?
Moreover, given the new scapulohumeral rhythm, would it be a good idea to add a calibration of the deltoid at a higher abduction angle (let’s say 150°) ?
If you have some pictures to illustrates your point it would be quite helpfull. When i try pure abduction with the model i don’t see that it is really misaligned… so i just want to be sure that we see the same thing.
The problem is that we have no data except DeGroot’s equations to tell us how this rhythm should look like. So after implementing those equations the check on wether the motion is correct or not is more based on personal judment rather than objective evidence.
For the calibration i think the humerus position should stay the same. You this represents the position with the higher strength, and the rhythm shouldn’t change that. The important thing is that the rhythm is used in the calibration when included in the model.
Please look at the animation that I have attached. You will see that there is a difference between implementing the TS constraint or the protraction of the scapula. However, none of these constraints gives a plausible kinematics throughout the motion. With the TS constraint, the scapula penetrates the thorax near the end of the movement and with the protraction, the TS node goes far from the thorax near the end of the movement.
So I don’t know what is the best kinematics to use.
Probably none of the two solutions is perfect. Again we are lacking more data on this rhythm, and i don’t know more than you which solution is the best. I am not even sure that the TS node should be in permanent contact with the rib cage. The subscapularis muscles below the scapula could very well push it a little away from the rib cage when they contract for example.
My personal opinion is that we should stick to DeGroot’s equations for now, until we have more or better information.
But it would also be interesting to know if one or the other configuration gives clearly better results for the muscle activation. That could a criteria. If you have any feed back on this it is of course welcome.
Also keep in mind that the equations have been linearized from the experimental measurements, so it is likely that at the end of the range of motion the calculated position is a little off compared to the real one.
You are right. None of these are perfect. Your point about the pushing force from the contraction of the subscapularis makes sense.
From my point of view, the shape of the artificial rake may also give some information about the validity of the scapula rotations, especially its lateral rotation.