The purpose of this document is to outline the Coordinate System used by, and Kinematic Outputs generated from, Uplift Capture. Although we outline some technical aspects of the system, the purpose of this document was not to provide an encompassing technical overview of how Uplift Capture exports 3D biomechanical data from two iPhones.
Defining our Global Coordinate System
Before outlining the kinematic outputs, it is essential to first outline the Global Coordinate System (GCS) of the biomechanical data. First, we’ll outline the “original” GCS used internally for the computer vision data. Then, we’ll outline the “External” GCS that is included in the csv exports (i.e., what you receive in Webhooks or by clicking “Download Kinematics Data” in the visualizer).
Our “original” GCS is shown in Figure 1 below:
Figure 1. Our “original” Global Coordinate System (GCS). The global origin is situated in the top left of the primary camera. The X-axis points to the right in the video, the Y-axis points downwards in the video, and the Z-axis points “into” the video.
However, since most biomechanical analyses assume a vertical axis pointing “up”, our data exports are rotated 180 degrees about the global X-axis. Then, we translate the origin to the average (with outliers removed) position of the left hip joint center of the capture. Thus, our “External” GCS (i.e., the GCS in the data exports) is shown in Figure 2 below:
Figure 2. Visual depiction of the Global Coordinate System (GCS) of Uplift Labs’ kinematic outputs. The global origin is located in the average (outliers removed) position of the left hip joint center throughout the session. The X-axis points relatively to the right in the video captured by the primary camera, the Y-axis points vertically, and the Z-axis points “back” towards the primary camera.
In summary, our Y-axis points vertically in our data exports, but the X-axis and Z-axis are dependent on the positioning of the primary camera. Depending on your applications, you may want to rotate your GCS so a particular axis points (roughly) to a particular object (e.g., the Z-axis pointing towards the mound during a swing). If this is something you are interested in, please contact the Uplift Team for more information about how to perform this transformation.
Defining our Kinematic Outputs
Uplift Labs provides two main sources of information. In any recorded session, we report the position of key joint centers, angles, and angular velocities of several joints.
Joint Center Data
Our models currently track 65 total keypoints, but export 28 keypoints to the user (23 tracked, 5 derived; the 42 additional keypoints are all on the hands and are undergoing additional testing before we export them to our users). The 23 tracked and 5 derived keypoints are shown below in Figure 3:
Figure 3. Visual depiction of our tracked and derived keypoints. Note that keypoint 27, the midHead keypoint, is not shown as it would be located directly behind the nose keypoint [0] in this example.
The joint center location data in our exports are the marker trajectories computed from our Inverse Kinematics solver. Thus, segment lengths will be “constrained” (i.e., will not meaningfully change lengths) throughout the motion trial.
Joint Angle Data
In addition to our keypoint data, we also export joint angle and angular velocity data. Before outlining the various angles we compute, it will be important to first highlight the two main ways we define a joint angle in our data exports (note: if you have a formal education in biomechanics, you can probably skip ahead to the “Our Joint Angle Exports” section below).
What is a joint angle?
There are two main ways that we compute joint angles using Uplift Capture. The first is called a cosine angle, which is simply the angle between two vectors. One example of a cosine angle that we compute are ankle dorsiflexion angles. This angle can be visualized by drawing one line (vector) from the ankle to the mid toe and another line (vector) from the ankle to the knee:
[insert visual here]
and then computing the angle between these two lines (vectors).
Other joints, such as the shoulder, are instead computed using Euler Angles. The mathematics are beyond the scope of this document, but instead of creating two vectors and computing a single angle, we instead create two Local Coordinate Systems (LCSs), define the rotation matrix between the “child” segment (usually the distal segment) and the “parent” segment (usually the proximal segment), and then decompose this matrix into rotations about 3 axes (i.e., X, Y, and Z). For a visual explanation of Euler angles, please see this linked video (click here). For example, when computing shoulder angles, we are decomposing the rotation matrix that defines the transformation from the Trunk’s LCS to the Upper Arm’s LCS. By decomposing these rotations in a specific order (outlined by the International Society of Biomechanics), we know that these angles will roughly correspond to the anatomical definitions of shoulder internal/external rotation, ab/adduction, flexion/extension, and so on (note that Euler angles computed with most motion capture systems are only approximations of the joint motions outlined in anatomy textbooks).
Our Joint Angle Exports
Listed below are the specific joint angles that we export, by default, during any recorded session. Note that we only show the joint angles in the table below (except for global segment velocities used in the kinematic sequence). Joint velocities are appended with an _velocity naming convention in our data exports. For variables specified as “Euler”, note that angular velocities are computed by differentiating the rotation matrices whereas variables specified as “3D” are computed via finite differences of the joint angle.
Name | Visual Explanation | Text Explanation |
head_extension |
| Head Extension relative to the trunk (Euler) |
head_lateral_flexion_clockwise |
| Head lateral flexion relative to the trunk (Euler) |
head_twist_clockwise |
| Head rotation relative to the trunk (Euler) |
trunk_lateral_flexion_to_right |
| Trunk lateral rotation with reference to the pelvis (Euler) |
trunk_twist_clockwise |
| Trunk rotation with reference to the pelvis (Euler) |
right_shoulder_flexion |
| Upper arm flexion relative to the trunk (Euler) |
right_shoulder_adduction |
| Upper arm adduction relative to the trunk (Euler) |
right_shoulder_external_rotation |
| Upper arm external rotation relative to the trunk (Euler) |
right_shoulder_horizontal_adduction |
| Upper arm horizontal adduction relative to the trunk (Euler) |
right_elbow_flexion |
| Lower arm flexion relative to the upper arm (3D) |
right_hip_flexion_with_respect_to_trunk |
| Thigh flexion relative to the trunk (Euler) |
right_hip_adduction_with_respect_to_trunk |
| Thigh adduction relative to the trunk (Euler) |
right_hip_internal_rotation_with_respect_to_trunk |
| Internal rotation of the thigh relative to the trunk (Euler) |
right_hip_adduction_with_respect_to_pelvis |
| Thigh adduction relative to the pelvis (Euler) |
right_hip_internal_rotation_with_respect_to_pelvis |
| Internal rotation of the thigh relative to the pelvis (Euler) |
right_knee_extension |
| Shank flexion relative to the thigh (Euler) |
right_knee_varus |
| Shank varus relative to the thigh (Euler) |
right_knee_internal_rotation |
| Shank internal rotation relative to the thigh (Euler) |
right_ankle_dorsiflexion |
| Ankle flexion relative to shank (3D) |
pelvis_rotational_velocity_with_respect_to_ground |
| Rotational velocity of the pelvis segment relative to the GCS (Velocity) |
trunk_rotational_velocity_with_respect_to_ground |
| Rotational velocity of the trunk segment relative to the GCS (Velocity) |
right_arm_rotational_velocity_with_respect_to_ground |
| Rotational velocity of the upper arm segment relative to the GCS (Velocity) |
Interacting With This Data
There are two main ways for users to interact with our data. The first is through our reports we generate for certain activities and movements. The second is through our csv exports.
Activity Reports
For select activities, data computed from our pipelines is aggregated into a single summary report. Please see _____ for some example summary reports.
Outlining our CSV Exports
In addition to our joint center and angle data, our csv exports also provide additional information about a session, such as:
Athlete name
Athlete id
Session id
Org id
Capture time (the time, in seconds, since the Unix epoch, which is January 1, 1970, 00:00:00 UTC)
Frames per second (fps)
Activity tag
Movement tag
Handedness
Footedness
QA tag (defaults to 1 except for certain activities and movements where the Uplift Team has built a dedicated QA process- a good “hint” as to whether our team has created a dedicated QA process is if there are additional events and metrics included in the export)
Time (in seconds)
Frame (number)
Any additional events and metrics based on the activity and movement selected (e.g., baseball pitching will also export a string containing the kinematic sequence ordering under the column kinematic_sequence_order)
These data exports provide the user with the flexibility to ingest the data to conduct their own bespoke analyses that we may not yet support.