Announcement

Collapse
No announcement yet.

summary of replies RE:software for calculating joint angles

Collapse
This topic is closed.
X
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • summary of replies RE:software for calculating joint angles

    Thanks to all that responded to my queries. It has been a while since I posted to Biomch-L and the response was quite overwhelming. I had more than 30 responses within 24 hours to sending the query. Given the specifics of my situation (I am helping out another lab that would like to continue to collect more data with PhaseSpace and have ongoing software to analyze it), I have decided to concentrate on two options for now:

    BodyMech, a Matlab open source package
    http://www.bodymech.nl/

    and

    KineMat, a Matlab toolbox

    http://isbweb.org/software/movanal/kinemat/index.html



    The text of most of the replies are pasted below. I did not include some duplicate postings.
    take care,
    df


    Dan Ferris, Ph.D.
    Associate Professor
    Division of Kinesiology
    Department of Biomedical Engineering
    Department of Physical Medicine and Rehabilitation
    University of Michigan
    http://www-personal.umich.edu/~ferrisdp/

    currently on sabbatical at:
    Institute for Neural Computation
    UC San Diego
    (858) 534-9662

    ferrisdp@umich.edu




    MaxMate is a fairly straight forward excel based program that does just
    what you're looking for.

    http://www.innovision-systems.com/Products-MaxMATE.aspx











    http://isbweb.org/software/movanal/kinemat/index.html







    ­­­
    http://www.bodymech.nl/ - free matlab program/code that might give you what you need+ good documentation.




    You may have received better responses from your BIOMCH-L query, but I do have a code that I developed during graduate school. I used it to determine the 3 clinical translations and 3 clinical rotations (described by grood-suntay, JBME 1983) for a lab experiment I conducted as the TA. The input I used was from imaging software that computed the time-dependent Cartesian dimensions of markers rigidly attached to the femur and tibia of a bovine knee. Kinematic blocks with 3 markers were attached to both the femur and tibia. A coordinate system was embedded in the femur and tibia (via digitizer) and the rotations/translations were computed between the embedded systems. A photo of the setup can be seen in one of our publications (Lujan et al. JBME, 2007).



    In the biomechanics class I TA'd, the students had to answer questions on the code, therefore in the main program I'm sending you (gsuntay_solution.m), there are lots of comments and questions. The other .m files are subfunctions. If you want to run the program, I provided a zip file with all the programs and input from a class experiment where I flexed a bovine knee. Just put all the zipped files in the same folder, open gsuntay_ta.m and hit "run".





    I think the code you are seeking is dependent on exactly how many markers
    you have and where they are placed - these things affect how the vectors of
    the local reference frames are defined. There is a relatively easy method
    for these calculations described by Vaughan et al. in, "Dynamics of Human
    Gait," which can be freely downloaded from the link below (see Appendix B,
    pp. 94-96 for joint angles). If you don't find code that you can just plug
    in, the Vaughan et al. book might be a helpful reference for writing some
    code yourself.

    http://www.kiboho.co.za/GaitCD/gaitbook.htm





    have a look at the International Shoulder Group site
    (www.internationalshouldergroup.org). There should be software
    available for the calculation of local coordinate systems. Otherwise,
    I do have .m files that will do the job. I will get in touch with the
    ISG webmaster to make sure that they become available through that site.





    Visual 3D is a nice tool to calculate joint kinematics from raw
    tracked data.





    Is Christoph Reinschmit's (sp??) code still posted to the ISB web site?
    We've used that in the past... I needs some fiddling to work with specific situations (different marker sets, etc.) but it otherwise seems to work pretty well.





    That sounds like it was an electromagnetic system. Correct? Do you know what make/model? Each manufacturer can spit out different info. Or perhaps you already know exactly what info is in the files? I'm guessing it would be x,y,z components of the vector that points to the local frame from the global. The rotations are probably a sequence of angles but we need to know the axes of rotation and the order of rotations. Some systems spit out rotation matrices directly. With this information you can determine the position and orientation of each marker relative to the global ref. frame.



    Also, one must assume the markers were rigidly fixed to each segment. You then need to know what was the position and orientation of the marker's fixed location relative to the local axes of the segment. So, if you know where the segment was relative to the marker, and you know where the marker was in the global, then you know where the segment was in the global.



    If I'm saying things you already knew, I apologize. But, I'm afraid that if you have nothing more than some output data files, it not be sufficient information.





    I just wrote this little script to check the output of another
    simulation. Input are skin marker coordinates (markers only on lower
    limbs), and output are joint angles for hip, knee and ankle as well as
    the rotation matrices between anatomical coordinate systems (which you
    probably don't need).
    Reading other people's code is often quite difficult, but maybe it helps.





    I am a grad student at the University of Pittsburgh and I am pretty familiar with calculating joint angles using Matlab. This is the method I employ:



    Step 1. Calculate anatomical coordinate systems with the long axis of the segment aligned with the y-axis. For the lower leg I would align the y axis from the Ankle joint center to the Knee joint center. For the upper leg I would align the y axis from the knee joint center to the hip joint center. Then I would use other markers to calculate two more vectors. Using the vector cross porducts, gives three direction vectors. These three vectors {x, y, z} make up the rotation matrix from global coordinates to the anatomical coordinate system.



    Step 2: Determine the joint angle using Euler decomposition. Determine the rotation matrix between the two joint segments (i.e, thigh with respect to shank). From this rotation matrix decompose the angles to determine the included joint angle.



    If you need more help just let me know and I should be able to send you some code.







    That is an unusual data format, looks more like animation data.



    If you know the exact meaning of the rotation parameters in your data, you can transform those into rotation matrices, calculate R1*inv(R2) to get orientation of one bone relative to the other, and then decompose that into standard Grood-Suntay joint angles (the Rxyzsolve etc. functions in Kinemat).



    The ISB website has scripts and functions based on the SVD function in matlab and the Joint Coordinate System style of Euler rotations. Although I think these days you need to be a member to access them. I did download them before this happend so if you would like them I can forward them next week when I return to work.

    Absolute angles can be calculated with the built in functions atan or atan2, and relative angles can be calculated by the cosine law or similiar which is acos[(a^2+b^2-c^2)/2ab] in matlab. 'a and b' are lengths of lines joining proximal and distal joints to the joint of interest, 'c' is the length of a line between the proximal and distal joints.





    when calculating angles from 2D marker co-ordinates, I did the following, which may help you:

    1. calculate segment lengths using marker co-ordinates for two adjacent segments
    2. use these as vector lengths
    3. take the arc-cosine of the dot product of these two vectors to give you joint angle - you can output this as either degrees or radians.

    there's a fair amount of literature available on how to calculate angle using dot product





    please have a look at our open source software project Bodymech

    www.bodymech.nl

    It has been a while since the last update.
    There is no of the shelf full body model,
    (we're working on that as well)
    but you can configure it to your own needs





    if you're a member of ISB all the code can be downloaded after logging into the website (www.isbweb.org). You just need to acknowledge the source when using any of this code.





    if you want I have a code only for upper arm but it dipens on
    where do you want to put markers.
    Also you can find this explanation in my paper about carrying angle
    evaluation of the elbow joint. This work is published in J Shoulder
    and Elbow Joint Surgery





    Matlab is an excellent tool for calculating joint angles from marker cartesian coordinates. I have been working with this software and I really like it. What exactly do you need?





    If the data you have include yaw, tilt and roll for each marker
    relative to a fixed origin, and each marker is fixed to a segment, are
    these values not equivalent to the segment angles? I'm not terribly
    familiar with active marker system, but it would seem the marker data
    already has the data you are looking for.





    I've written matlab code in the past for calculating joint angles, so I might be able to help you out with your application.





    You need three markers per segment to calculate 3D angles. Sometimes
    with less than three you can calculate missing markers based on
    markers on adjacent segments. With one marker per segment I don't see
    any way of doing this. You may be able to calculate 2D angles with
    this data set. To do this the markers would need to be set up at
    joint centers like what would typically done in a 2D system. If the
    markers are just arbitrarily placed on each segment, this will not be
    possible. To calculate the 2D angles you would just need to project
    the coordinates of the markers onto the plane that the subjects are
    walking in. This is trivial if the direction the subjects are
    walking is coincident with one of the axes of the global coordinate
    system. i.e. if the subjects are walking in the x direction and y is
    vertical just ignore the z direction. If they are not coincident i.e.
    they are walking partly in x partly in z, then you need to define the
    plane and project the coordinates into that plane.

    One thought. I'm not familiar with the phase space system. I have
    used the optotrak system.
    At times we used a single marker carrier per segment but each marker
    carrier had four markers. If each of your "markers" is actually three
    or more markers, then you can calculate 3D kinematics. You need
    landmark digitization data to transform the data to anatomically
    relevant coordinate systems. If this is the case, I do have some code
    that uses the kinmat toolbox that others have mentioned. My code is
    quite customized (and probably not very readable but might provide
    a useful framework. In a nutshell you use soder.m to calculate
    transformation matrices between markers at different timepoints, use
    the digitization data to transform markers to anatomical coordinate
    systems, multiply the transfomation matrices together then use
    something like rxyzsolv.m to calculate euler angles.





    My 'Joint angles vs. orientation angles' webpage
    (http://kwon3d.com/theory/euler/jangle.html ) explains how to compute the
    joint angle from the relative orientation angle of a distal segment to the
    proximal.

    In your case, you will have to obtain the orientation matrices of the
    segments from the yaw, tilt, and roll angles provided by Phasespace and
    compute the relative orientation matrices of the segments to their
    respective proximal segments first.

    Let me know if you cannot find a a good solution. I may be able to come up
    with a spreadsheet-based program. Does Phasespace provide 3x3 orientation
    matrix of the sensor? it will be a lot easier to use than the angles.





    My 'Joint angles vs. orientation angles' webpage
    (http://kwon3d.com/theory/euler/jangle.html ) explains how to compute the
    joint angle from the relative orientation angle of a distal segment to the
    proximal.

    In your case, you will have to obtain the orientation matrices of the
    segments from the yaw, tilt, and roll angles provided by Phasespace and
    compute the relative orientation matrices of the segments to their
    respective proximal segments first.

    Let me know if you cannot find a a good solution. I may be able to come up
    with a spreadsheet-based program. Does Phasespace provide 3x3 orientation
    matrix of the sensor? it will be a lot easier to use than the angles.





    you can try to use Scilab environment (http://www.scilab.org
    ). It is similar to commercial software Matlab,
    but it is for free! You can import your data and then use some kinematic
    transformations to get what you want. There are many books published on
    this topic. You can use for this purpose method of a "transformation
    matrices" described by Craig (CRAIG, J.J. /Introduction to Robotics
    Mechanics and Control/. Second Edition, 1989. Addison Wesley Longman)





    The International Shoulder Group has some code on their website to do
    this. The code will not give you the joint angles in the ISB standards
    (Wu, et al, 2002, Wu, et al, 2005); instead, it gives you the joint
    angles in a coordinate system that is rotated by 90 about the Y-axis.
    There are also other differences (shoulder joint's origin is defined
    differently between the two).

    In our lab we have been using some custom written MATLAB code to get the
    shoulder and elbow joint angles (as defined in the ISB papers cited
    above).





    ______

    ______________________________________________
Working...
X