Biomechanical analysis of vertical jumps

Marcos Duarte

A vertical jump is the act of raising (in the vertical direction) the body center of gravity using your own muscle forces and jumping into the air.

Center of gravity

Center of gravity or center of mass is a measure of the average location in space of the body considering all body segments, their mass and their position.
From Mechanics, the exact definitions of these quantities are:

  • Center of mass (CM): The center of mass (or barycenter) is the unique point at the center of a distribution of mass in space that has the property that the weighted position vectors relative to this point sum to zero. SI unit: $m$ (vector).
  • Center of gravity (CG): Center of gravity is the point in an object around which the resultant torque due to gravity forces vanishes. Near the surface of the earth, where the gravity acts downward as a parallel force field, the center of gravity and the center of mass are the same. SI unit: $m$ (vector).

The mathematical definition for the center of mass or center of gravity of a system with N objects (or particles), each with mass $m_i$ and position $r_i$ is:

$$ \begin{array}{l l} \mathbf{r}_{cm} = \frac{1}{M}\sum_{i=1}^N m_{i}\mathbf{r}_i \quad\quad \text{where} \quad M = \sum_{i=1}^N m_{i} \\ \mathbf{r}_{cg} = \frac{1}{Mg}\sum_{i=1}^N m_{i}g_{i}\mathbf{r}_i \quad \text{where} \quad Mg = \sum_{i=1}^N m_{i}g_{i} \end{array} $$

If we consider $g$ constant:

$$ \begin{array}{l l} \mathbf{r}_{cg} = \frac{g}{Mg}\sum_{i=1}^N m_{i} \: \mathbf{r}_i = \frac{1}{M}\sum_{i=1}^N m_{i}\:\mathbf{r}_i \\ \\ \mathbf{r}_{cg} = \mathbf{r}_{cm} \end{array} $$

This means that how much a person jumps is measured by the displacement of his or her center of gravity, and not by how much the feet was raised in space. For instance, the following youtube video entitled "Highest Vertical jump 62 inches" (157.5 cm!) shows a great vertical jump, but in fact its height is 'just' half of that:

In [1]:
from IPython.display import YouTubeVideo

So, the true measurement of the height of a vertical jump is the displacement of the center of gravity in the vertical direction. The problem is that to measure the center of gravity position is usually too complex because we would have to estimate the position of each body segment.
Instead, there are alternative methods with varying degrees of accuracy for measuring the height of vertical jump (see here for a list):

  • Sargent Jump Test. How high you can reach an object.
  • Flight time measurement. From Newton's laws of motion, the height of a jump is related to the flight time under controlled conditions. One can measure the flight time using a contact mat, light sensor, accelerometer, video (the number of frames the jumper is in the air), attaching a cable to the jumper's waist and measuring the displacement of this cable, etc.
  • Force plate measurements. A device called force plate which measures the forces applied on the ground as a function of time can be used to measure the flight time or using the vertical force data to find the displacement of the center of gravity using Newton's laws of motion.

Measurement of the jump height from flight time

We can estimate the height of a jump measuring for how long the jumper stayed in the air during the jump (flight time). At the vertical direction and ignoring the air resistance, the only external force that acts on the body in the air is the (constant) gravitational force, with magnitude $P = -mg$, where $g$ is the acceleration of gravity (about $9.8 m/s^2$ on the surface of the Earth). Using the equation of motion for a body with constant acceleration, the height of the center of gravity of a body in the air at a certain time is:

$$ h(t) = h_0 + v_0t - \frac{gt^2}{2} $$

At the maximum height ($h$, the jump height), the vertical velocity of the body is zero. We can take use this property to calculate the jump height from the time of falling:

$$ h = \frac{gt_{fall}^2}{2} $$

Because the time of falling is equal to the time of rising, $t_{flight} = t_{rise} + t_{fall} = 2t_{fall}$, the jump height as a function of the flight time is:

$$ h = \frac{gt_{\text{flight}}^2}{8} $$

This simple equation is the principle of measurement of the jump height ny an instrument that measures the time the feet is not in contact with ground (using a pressure mat or a photocell sensor). There are even shoes using this principle of measurement:

In [2]:

However, the flight time, measured as the time without contact with the ground, during a jump is not necessarily equal to the flight time of the body center of gravity (which is the measure we need to estimate the actual height jump). For example, if the jumper flexes knees and hips at the landing phase, the measured flight time will be larger but not the flight time of the body center of gravity. Because that, a more accurate method is to use a force plate as we will see now.

Measurement of the jump height using a force plate

Let's draw the free body diagram for a person performing a jump:

Vertical jump FBD
A person during the propulsion phase of jumping and the corresponding free body diagram drawn for the center of mass. GRF(t) is the time-varying ground reaction force.

So, according to the Euler's version of the Newton's second law (for the motion of the body center of mass), the dynamics (as a function of time) for the body center of mass during a jump is given by:

$$ GRF(t) - mg = ma(t) $$

Where $GRF(t)$ is the ground reaction force applied by the ground on the jumper, $m$ is the subjec mass, and $a(t)$ the center of mass acceleration.

To measure the ground reaction force we can employ a force plate (a.k.a. force platform). A force plate is an electro-mechanical instrument to measure the forces applied on it. A force plate is like a sophisticated, and very expensive, balance scale that can measure the instantaneous forces applied (as a function of time) and depending on the force plate, can also measure the point of application of the resultant vertical force and the horizontal force components.

Usually the force plate is placed on the floor and we are interested not in the force applied on the force plate, but in its reaction, the force that the force plate applied on the jumper, which, according to Newton's third law of motion, has the same magnitude and line of action but opposite direction. Because of that, usually the forces measured by the force plate are referred as ground reaction forces.

Here is a plot of the vertical component of the ground reaction force measured with a force plate during a vertical jump with contermovement:

In [3]:
# Import the necessary libraries
from __future__ import division, print_function
import numpy as np
from scipy.integrate import cumtrapz
import matplotlib.pyplot as plt
%matplotlib inline
In [4]:
# load data file
GRFv = np.loadtxt('./../data/GRFZjump.txt', skiprows=0, unpack=False)
# sampling frequency (Hz)
freq = 600.0
time = np.arange(0, len(GRFv)/freq, 1/freq)
# gravitational acceleration, m/s2
g = 9.8
# subject's mass
m = np.mean(GRFv[0:freq/10])/g
# plot GRF data
fig, ax = plt.subplots(1, 1, figsize=(9, 3))
ax.plot(time, GRFv, 'b', linewidth='2')
# plot subject's weight
ax.plot([time[0], time[-1]], [m*g, m*g], 'k', linewidth='1')
ax.set_xlabel('Time [s]', fontsize=16)
ax.set_ylabel('Vertical GRF [N]', fontsize=16)
ax.set_xticks(np.arange(time[0], time[-1], .2))

This graph of the vertical component of the ground reaction force shown above has very interesting things:

  1. At the beginning the jumper was standing still and the GRF is equal to the jumper's body weight;
  2. After the jumper started the movement to jump there is a phase where GRF is lower than the body weight even with the jumper completely on the ground;
  3. The GRF increases to about two times the body weight while the jumper is still on the ground;
  4. When the jumper is in the air is clearly indicated by the zero values of GRF;
  5. After landing the GRF reaches a peak of about six times the jumper's body weight.

These are all interesting things but we will discuss only some of them next.
We can detect the takeoff and landing instants by detecting the first and last time GRF is under a certain threshold (close to zero):

In [5]:
# make sure GRFv has no offset
GRFv -= np.min(GRFv)

limiar = 10

inds = np.where(GRFv < limiar)
i1 = inds[0][0]
i2 = inds[0][-1]
print('Takeoff instant (s): ', time[i1])
print('Landing instant (s): ', time[i2])
Takeoff instant (s):  0.906666666667
Landing instant (s):  1.32333333333

The jump height can be calculated from these instants using the kinematic expression:

In [6]:
h = g*(time[i2]-time[i1])**2/8
print('Jump height (m): ', h)
Jump height (m):  0.212673611111

We can detect the beginning of movement by detecting when GRFv starts to go below the body weight:

In [7]:
inds = np.where(GRFv < 0.95*m*g)
i0 = inds[0][0]
print('Jump start (s): ', time[i0])
Jump start (s):  0.188333333333

Jump height from the impulse measurement

We know that the mechanical impulse is equal to the change in linear momentum of a body, which for a body with constant mass is simply the body mass times the change in velocity. For a time-varying force, the impulse is:

$$ \mathbf{J} = \int_{t_0}^{t_f} \mathbf{F}(t) \mathrm{d}t = m [\mathbf{v}_{t_f} - \mathbf{v}_{t_0}] $$

For the analysis of a vertical jump, in the vertical direction $F(t) = GRF(t) - mg$ and $F(t)$ is discrete in time (sampled at intervals $\Delta t$):

$$ J = \sum_{t_0}^{t_f} F(t)\Delta t = m [v_{t_f} - v_{t_0}] $$

For a jump starting from a rest position, the initial velocity is zero. This means that the change in velocity is equal to the final velocity (at the moment of takeoff). Therefore, we can calculate the final velocity of the propulsion phase as:

$$ \begin{array}{l l} \sum_{t_0}^{t_f} F(t)\Delta t = m[v_f-0] \implies \\ v_f = \frac{\sum_{t_0}^{t_f} F(t)\Delta t}{m} \end{array} $$

This final velocity is the initial velocity of the aerial phase of the jump.
If we know the initial velocity of the jump, it's straightforward to calculate the jump height, for example, using the Torricelli's equation:

$$ v_f^2 = v_0^2 - 2gh $$

Where $v_i$ and $v_f$ are the initial and final velocities and $h$ is the change in the position of the body center of gravity (the height of the vertical jump) and we considered just the first part of the jump, the upward phase.

From Mechanics we know that the velocities at takeoff and at landing are equal in magnitude and that the time of the upward phase is equal to the time of the donward phase of this ballistic flight.

For the upward phase of the vertical jump:

$$ \begin{array}{l l} 0 = v_0^2 - 2gh \implies \\ h = \frac{v_0^2}{2g} \end{array} $$

We could also have calculated the jump height from the velocity using the principle of conservation of the mechanical energy. The sum of the potential and kinetic energies at the instants beginning of the jump ($t_0$) and highest point of the jump trajectory ($t_{hmax}$) are equal:

$$ mgh(t_0) + \frac{mv^2(t_0)}{2} = mgh(t_{hmax}) + \frac{mv^2(t_{hmax})}{2} $$$$ 0 + \frac{mv^2(t_0)}{2} = mgh(t_{hmax}) + 0 $$$$ h(t_{hmax}) = \frac{v^2(t_0)}{2g} $$

Same expression as before.

Kinetic analysis of a vertical jump

The force plate can also be used to calculate other mechanical variables to characterize the subject's performance (see Dowling and Vamos 1993) for a list of such variables). For example,

Resultant vertical force on the subject:

$$F(t) = GRF(t) - mg$$

Vertical acceleration of the center of mass:

$$ a(t) = \frac{F(t)}{m} $$

Vertical velocity of the center of mass (initial velocity equals zero):

$$ v(t) = \sum_{t_0}^{t_f} a(t) \Delta t $$

Vertical displacement of the center of mass (initial displacement equals zero):

$$ h(t) = \sum_{t_0}^{t_f} v(t) \Delta t $$

Power due to the vertical force:

$$ P(t) = GRF(t)v(t) $$

Note that we used the vertical ground reaction force for the calculation of mechanical power, not the resultant force on the body, to represent the total power the jumper is producing.

Let's work with the ground reaction foce data from a vertical jump and calculate such quantities.
For now, let's ignore the landing and focus on the propulsion phase of the jump.

In [8]:
time = time[i0:i1+1] - time[i0]
# resultant vertical force
F = GRFv[i0:i1+1] - m*g
# vertical acceleration of the center of mass
a = F/m
# vertical velocity of the center of mass
v = cumtrapz(a, dx=1/freq, initial=0)
# vertical displacement of the center of mass
h = cumtrapz(v, dx=1/freq, initial=0)
# power due to the vertical force (GRFv)
P = (F+m*g)*v

And here are the plots for these quantities:

In [9]:
fig, ax = plt.subplots(5, 1, sharex=True, squeeze=True, figsize=(6, 6))
ax[0].plot(time, F, 'b', linewidth='2', label='Force')
ax[1].plot(time, a, 'b', linewidth='2', label='Acceleration')
ax[2].plot(time, v, 'b', linewidth='2', label='Velocity')
ax[3].plot(time, h, 'b', linewidth='2', label='Displacement')
ax[4].plot(time, P, 'b', linewidth='2', label='Power')
ax[4].set_xlabel('Time [$s$]', fontsize=14)
ax[4].set_xticks(np.arange(time[0], time[-1], .1))
ax[4].set_xlim([time[0], time[-1]])
ylabel = ['F [$N$]', 'a [$m/s^2$]', 'v [$m/s$]', 'h [$m$]', 'P [$W$]']
for (axi, ylabeli) in zip(ax, ylabel):
    axi.plot([time[0], time[-1]], [0, 0], 'k', linewidth='1')
    axi.set_ylabel(ylabeli, fontsize=14)
    axi.text(.03, .75, axi.get_legend_handles_labels()[1][0],
             transform=axi.transAxes, fontsize=14)
    axi.yaxis.set_label_coords(-.1, 0.5)

Looking at these graphs, we can see that the instant where the jumper has the lowest position is approximately at 0.44 s, where the velocity is also zero. Up to this instant the jumper was moving down (countermovement phase) and from this instant on the jumper starts to rise until loses contact with the ground. This instant also indicates when the power starts to be positive. Looking at the graph of the force, the total area under the curve (the impulse) up to this instant should be zero because if the jumper started at rest and came to zero velocity again, the impulse is zero.

This turning point is used to indicate the change from eccentric (negative power) to concentric (positive power) phase of the jump. Although this instant was detected based on the movement of the center of mass, this roughly indicates the change in the net muscle activation in the body to perform the jump.

Let's visualize these phases in the plots:

In [10]:
inds = np.where(v > 0)
iec = inds[0][0]
print('Instant of the lowest position (s): ', time[iec])
Instant of the lowest position (s):  0.438333333333
In [11]:
fig, ax = plt.subplots(1, 2, sharex=True, squeeze=True, figsize=(9, 4))
ax[0].plot(time, F+m*g, 'b', linewidth='2')
ax[0].plot([time[0], time[-1]], [m*g, m*g], 'k', linewidth='1')
ax[0].fill_between(time[0:iec], F[0:iec]+m*g, m*g, color=[1, 0, 0, .2])
ax[0].fill_between(time[iec:-1], F[iec:-1]+m*g, m*g, color=[0, 1, 0, .2])
ax[0].plot([], [], linewidth=10, color=[1, 0, 0, .2], label='Eccentric')
ax[0].plot([], [], linewidth=10, color=[0, 1, 0, .2], label='Concentric')
ax[0].legend(frameon=False, loc='upper left', fontsize=12)
ax[0].set_ylabel('Vertical GRF [$N$]', fontsize=14)
ax[0].set_xlabel('Time [$s$]', fontsize=14)
ax[1].plot(time, P, 'b', linewidth='2')
ax[1].plot([time[0], time[-1]], [0, 0], 'k', linewidth='1')
ax[1].fill_between(time[0:iec], P[0:iec], color=[1, 0, 0, .2])
ax[1].fill_between(time[iec:-1], P[iec:-1], color=[0, 1, 0, .2])
ax[1].set_ylabel('Power [$W$]', fontsize=14)
ax[1].set_xlabel('Time [$s$]', fontsize=14)
ax[1].set_xticks(np.arange(time[0], time[-1], .1))
ax[1].set_xlim([time[0], time[-1]])


  1. The mechanical work ($W$) by the vertical force is defined as:
    $$ W = \int_{h_0}^{h_f} F(h) \mathrm{d}h $$
    Which can also be calculated as the variation in the kinetic energy or the integral of mechanical power:
    $$ W = \Delta E_K = \int_{t_0}^{t_f} P(t) \mathrm{d}t $$
    a) Use the data of the vertical jump in this text to plot the graph for the ground reaction force versus displacement and calculate the mechanical work produced in the eccemtric and concentric phases and in the entire jump using the two methods.

  2. For the dataset in this text, calculate all the variables described in Dowling JJ, Vamos L (1993).