The functional joint calculation has been adapted from:
SchwartzMH, Rozumalski A (2005) A new method for estimating joint parameters from motion data. Journal of Biomechanics, 38, 107-116
The calculation of a functional joint requires movement of one segment relative to another segment. The algorithm (see below) searches for a point (or for a one degree of freedom joint, an axis) that is stationary relative to the 2 segments (or 2 sets of markers).
For joints modeled with 3 degrees of freedom, a movement trial in which the joint has modest range of motion about all three axes of rotation should be used for computing the functional joint. The movement should have sufficient range of motion that the computation statistics produce a reasonable stationary point, but the range of motion should not be too large because soft tissue artifact (e.g. movement of markers relative to the underlying skeleton) should be minimized. Our experience is that 20 degrees range of motion is usually sufficient to compute a stationary point reliably.
Several cycles of movement should be included in the motion, but it isn't clear exactly how many cycles there should be. We recommend more than 5 cycles, but users should experiment with their own data setups because the optimal number of cycles depends on many issues, including the joint tested, and the amount of soft tissue artifact present in the data.
The movement trial used is "contrived" specifically for the purpose of computing the functional joint. It should not be assumed that any movement (e.g. a walking trial) is sufficient. This "functional joint" trial should be separate from the movement data trials.
Begon M, Monnet T, Lacouture P (2007) Effects of movement for estimating the hip joint center. Gait and Posture 25, 353-359
Specify a segment coordinate system in which the motion capture data
is to be resolved, and into which the landmark represented. For the case
of the hip joint center, for example, the pelvis is considered a stationary
coordinate system.
Specify the motion capture markers attached to the moving segment. For
the case of the hip joint center, markers attached to the thigh are used.
Algorithm
For all combinations of 3 frames (a,b,c) of data from the moving trial
Compute Finite Helical Axis (A) for frames a and b.
Compute Finite Helical Axis (B) for frames a and c.
Compute Finite Helical Axis (C) for frames b and c.Use only helical axes for which the amount of rotation is greater than a minimum value (e.g. 5 degrees).
Compute the intersection of Axes A & B
Compute the intersection of Axes A & C
Compute the intersection of Axes B & C
With "real" data there is rarely an intersection of the two Finite Helical Axes.
Compute the intersection as a line segment hat is the shortest route between the two axes. The "intersection" is the mid-point of this straight line.
This intersection is considered one estimate of the joint center (eg a candidate joint center).
All candidate joint centers are added to a "candidate array". This candidate array gets very big very quickly because the number of permutations grows dramatically with the number of frames considered.
The joint center returned is the mode of the set of candidates. The 3D mode is challenging to compute, so Visual3D estimates the mode.
In principle Visual3D would use all candidates, but this is often impractical, so Visual3D samples the candidate array randomly. The number of candidates selected is ann option defined by the user.
The mode is computed as follows:
Compute the mean value of all candidates
Specify a sphere surrounding this location (the size of the initial sphere is an option defined by the user). A fairly big number is used typically, but the actual value hasn't been found to be particularly important)
While() the number of candidates is greater than 500 (defined by the user)
The "candidate array" is reduced by removing all candidates that are not in the interior of this sphere.
Compute the median value of each component of the remaining candidates
Reduce the radius of the sphere (the percent decrease is an option defined by the user)
End While()
When only 500 candidates remain, the function joint is defined as the mean value of these remaining candidates.
Note: The number of combinations gets very big very quickly and can easily crash the system if the user isn't careful. An option exists to select a subset of combinations at random (e.g. 2,000,000 combinations) as a representative sample.