# Body segment parameters¶

Marcos Duarte
Laboratory of Biomechanics and Motor Control
Federal University of ABC, Brazil

"Le proporzioni del corpo umano secondo Vitruvio", also known as the Vitruvian Man, drawing by Leonardo da Vinci circa 1490 based on the work of Marcus Vitruvius Pollio (1st century BC), depicting a man in supposedly ideal human proportions (image from Wikipedia).

In fact, Leonardo's drawing does not follow the proportions according Vitruvius, but rather the proportions he found after his own anthropometrical studies of the human body. Leonardo was unable to fit a human body inside a circle and a square with the same center, one of the Vitruvius' claims.

This is a remarkable historical evidence of not complying with established common knowledge and relying on experimental data for acquiring knowledge about nature, a tour de force for the scientific method.

## Estimation of body segment parameters¶

Body segment parameters (BSP) of the human body, such as length, area, volume, mass, density, center of mass, moment of inertia, and center of volume, are fundamental for the application of mechanics to the understanding of human movement. Anthropometry is the field concerned with the study of such measurements of the human body. Frequently, one cannot measure most of these parameters of each segment of an individual and these quantities are estimated by indirect methods. The main indirect methods are based in data of cadavers (e.g. Dempster's model), body image scanning of living subjects (e.g., Zatsiorsky-Seluyanov's model), and geometric measurements (e.g., Hanavan's model).

For reviews available online of the different methods employed in the estimation of BSP, see Drills et al. (1964) and Bjørnstrup (1995).

Let's look on how to estimate some of the BSP using the anthropometric model of Dempster (1955) with some parameters adapted by Winter (2009) and the model of Zatsiorsky and Seluyanov (Zatsiorsky, 2002), from now on, Zatsiorsky, with parameters adjusted by de Leva (1996). There is at least one Python library for the calculation of human body segment parameters, see Dembia et al. (2014), it implements the Yeadon human inertia geometric model, but we will not use it here.

For a table with BSP values, also referred as anthropometric table, typically:

• The mass of each segment is given as fraction of the total body mass.
• The center of mass (CM) position in the sagittal plane of each segment is given as fraction of the segment length with respect to the proximal or distal joint position.
• The radius of gyration (Rg) around the transverse axis (rotation at the sagittal plane) and around other axes of each segment is given as fraction of the segment length with respect to (w.r.t.) the center of mass or w.r.t. the proximal or w.r.t. the distal joint position.

For a formal description of these parameters, see the notebook Center of Mass and Moment of Inertia.

In [15]:
# Import the necessary libraries
import numpy as np
import pandas as pd
from IPython.display import display, Math, Latex
%matplotlib inline
import matplotlib.pyplot as plt
pd.set_option('max_colwidth', 100)


### Dempster's model adapted by Winter¶

In [2]:
BSP_Dmarks = pd.read_csv('./../data/BSPlandmarks_Dempster.txt', sep='\t')
display(Latex('BSP segments from Dempster\'s model adapted by Winter (2009):'))
display(BSP_Dmarks)

BSP segments from Dempster's model adapted by Winter (2009):
Segment Definition
0 Hand Wrist axis/knuckle II middle finger
1 Forearm Elbow axis/ulnar styloid
2 Upper arm Glenohumeral axis/elbow axis
3 Forearm and hand Elbow axis/ulnar styloid
4 Total arm Glenohumeral joint/ulnar styloid
6 Leg Femoral condyles/medial malleolus
7 Thigh Greater trochanter/femoral condyles
8 Foot and leg Femoral condyles/medial malleolus
9 Total leg Greater trochanter/medial malleolus
10 Head and neck C7-T1 and 1st rib/ear canal
11 Shoulder mass Sternoclavicular joint/glenohumeral
12 Thorax C7-T1/T12-L1 and diaphragm
13 Abdomen T12-L1/L4-L5
14 Pelvis L4-L5/greater trochanter
15 Thorax and abdomen C7-T1/L4-L5
16 Abdomen and pelvis T12-L1/greater trochanter
17 Trunk Greater trochanter/glenohumeral joint
18 Trunk head neck Greater trochanter/glenohumeral joint
19 Head, arms, and trunk (HAT) Greater trochanter/glenohumeral joint
20 HAT Greater trochanter/mid rib
In [3]:
bsp_D = pd.read_csv('./../data/BSP_DempsterWinter.txt', index_col=0, sep='\t')
display(Latex('BSP values from Dempster\'s model adapted by Winter (2009):'))
display(bsp_D)

BSP values from Dempster's model adapted by Winter (2009):
Definition Mass CM prox CM dist Rg CM Rg prox Rg dist
Segment
Hand WJC-KNU2 0.0060 0.506 0.494 0.297 0.587 0.577
Forearm EJC-STYL 0.0160 0.430 0.570 0.303 0.526 0.647
Upper arm SJC-EJC 0.0280 0.436 0.564 0.322 0.542 0.645
Forearm hand EJC-STYL 0.0220 0.682 0.318 0.468 0.827 0.565
Total arm SJC-STYL 0.0500 0.530 0.470 0.368 0.645 0.596
Foot LMAL-MT2 0.0145 0.500 0.500 0.475 0.690 0.690
Leg KJC-MMAL 0.0465 0.433 0.567 0.302 0.528 0.643
Thigh GTR-KJC 0.1000 0.433 0.567 0.323 0.540 0.653
Head neck C7T1-RIB1EAR 0.0810 1.000 0.000 0.495 0.116 NaN
Thorax C7T1-T12L1-DIAP 0.2160 0.820 0.180 NaN NaN NaN
Abdomen T12L1-GTR 0.1390 0.440 0.560 NaN NaN NaN
Pelvis L4L5-GTR 0.1420 0.105 0.895 NaN NaN NaN
Trunk GTR-SJC 0.4970 0.500 0.500 NaN NaN NaN
Trunk head neck GTR-SJC 0.5780 0.660 0.340 0.503 0.830 0.607
HAT GTR-SJC 0.6780 0.626 0.374 0.496 0.798 0.621
Foot leg KJC-MMAL 0.0610 0.606 0.394 0.416 0.735 0.572
Total leg GTR-MMAL 0.1610 0.447 0.553 0.326 0.560 0.650
Thorax abdomen C7T1-L4L5 0.3550 0.630 0.370 NaN NaN NaN
Abdomen pelvis T12L1-GTR 0.2810 0.270 0.730 NaN NaN NaN

### Zatsiorsky's model adjusted by de Leva¶

The segments defined in the Zatsiorsky's model (Zatsiorsky, 2002) adjusted by de Leva (1996) are illustrated in the next figure.

In [4]:
BSP_Zmarks = pd.read_csv('./../data/BSPlandmarks_ZdeLeva.txt', sep='\t')
display(Latex('BSP landmarks from Zatsiorsky\'s model adjusted by de Leva (1996):'))
display(BSP_Zmarks)

BSP landmarks from Zatsiorsky's model adjusted by de Leva (1996):
Landmark Name Abbreviation Description
0 Acromion ACRO Most lateral point on the lateral edge of the acromial process of the scapula
1 Acropodion TTIP Tip of longest toe
2 Bispinous breadth BB Distance between two ASIS
3 Cervicale CERV Superior tip of the spine of the 7th certical vertebra
4 Dactylion (3rd) DAC3 Tip of 3 rd digit
5 Gonion GONI Most lateral point on the posterior angle of mandible
6 Iliospinale ASIS Inferior point of one of the anterior superior iliac spines
7 Malleoli MMAL, LMAL Medial and lateral bony projections of the malleolus
8 Metacarpale (3rd) MET3 Distal palpable point on the metacarpal of the 3rd digit on the dorsal hand
9 Mid-gonion MIDG Point midway between 2 gonion
10 Mid-hip MIDH Point midway between 2 hip joint centers
11 Mid-shoulder MIDS Point midway between 2 shoulder joint centers
12 Omphalion OMPH Center of navel
13 Pternion HEEL Posterior point of the heel
15 Sphyrion (tibia) TSPH Distal tip of the tibia – distal to medial malleolus
16 Sphyrion fibulare FSPH Distal tip of the fibula – distal to lateral malleolus
17 Stylion RSTY Distal dip of the styloid process of the radius
18 Suprasternale SUPR Most caudal point on the jugular notch on the sternum
19 Tibiale (medial) MTIB Most proximal point on the medial superior border of the head of the tibia
20 Tibiale laterale LTIB Most proximal point on the lateral superior border of the head of the fibula
21 Trochanterion TROC Superior border on the greater trochanter of the femur
22 Vertex VERT Uppermost part of the head
23 Xiphion XYPH Lowermost end of the sternum
In [5]:
bsp_Zf = pd.read_csv('./../data/BSPfemale_ZdeLeva.txt', index_col=0, sep='\t')
display(Latex('BSP female values from Zatsiorsky\'s model adjusted by de Leva (1996):'))
display(bsp_Zf)

BSP female values from Zatsiorsky's model adjusted by de Leva (1996):
Endpoints Mass CM Long Rg Sag Rg Trans Rg Long
Segment
Head VERT-MIDG 0.0668 0.5894 0.330 0.359 0.318
Trunk SUPR-MIDH 0.4257 0.4151 0.357 0.339 0.171
Upper trunk SUPR-XYPH 0.1545 0.2077 0.746 0.502 0.718
Middle trunk XYPH-OMPH 0.1465 0.4512 0.433 0.354 0.415
Lower trunk OMPH-MIDH 0.1247 0.4920 0.433 0.402 0.444
Upper arm SJC-EJC 0.0255 0.5754 0.278 0.260 0.148
Forearm EJC-WJC 0.0138 0.4559 0.261 0.257 0.094
Hand WJC-MET3 0.0056 0.7474 0.531 0.454 0.335
Thigh HJC-KJC 0.1478 0.3612 0.369 0.364 0.162
Shank KJC-AJC 0.0481 0.4352 0.267 0.263 0.092
Foot HEEL-TTIP 0.0129 0.4014 0.299 0.279 0.139
Head 2 VERT-CERV 0.0668 0.4841 0.271 0.295 0.261
Trunk 2 CERV-MIDH 0.4257 0.4964 0.307 0.292 0.147
Trunk 3 MIDS-MIDH 0.4257 0.3782 0.379 0.361 0.182
Upper trunk 2 CERV-XYPH 0.1545 0.5050 0.466 0.314 0.449
Forearm 2 EJC-STYL 0.0138 0.4592 0.263 0.259 0.095
Hand 2 WJC-DAC3 0.0056 0.3427 0.244 0.208 0.154
Hand 3 STYL-DAC3 0.0056 0.3502 0.241 0.206 0.152
Hand 4 STYL-MET3 0.0056 0.7534 0.519 0.443 0.327
Shank 2 KJC-LMAL 0.0481 0.4416 0.271 0.267 0.093
Shank 3 KJC-SPHY 0.0481 0.4481 0.275 0.271 0.094
In [6]:
bsp_Zm = pd.read_csv('./../data/BSPmale_ZdeLeva.txt', index_col=0, sep='\t')
display(Latex('BSP male values from Zatsiorsky\'s model adjusted by de Leva (1996):'))
display(bsp_Zm)

BSP male values from Zatsiorsky's model adjusted by de Leva (1996):
Endpoints Mass CM Long Rg Sag Rg Trans Rg Long
Segment
Head VERT-MIDG 0.0694 0.5976 0.362 0.376 0.312
Trunk SUPR-MIDH 0.4346 0.4486 0.372 0.347 0.191
Upper trunk SUPR-XYPH 0.1596 0.2999 0.716 0.454 0.659
Middle trunk XYPH-OMPH 0.1633 0.4502 0.482 0.383 0.468
Lower trunk OMPH-MIDH 0.1117 0.6115 0.615 0.551 0.587
Upper arm SJC-EJC 0.0271 0.5772 0.285 0.269 0.158
Forearm EJC-WJC 0.0162 0.4574 0.276 0.265 0.121
Hand WJC-MET3 0.0061 0.7900 0.628 0.513 0.401
Thigh HJC-KJC 0.1416 0.4095 0.329 0.329 0.149
Shank KJC-AJC 0.0433 0.4395 0.251 0.246 0.102
Foot HEEL-TTIP 0.0137 0.4415 0.257 0.245 0.124
Head 2 VERT-CERV 0.0694 0.5002 0.303 0.315 0.261
Trunk 2 CERV-MIDH 0.4346 0.5138 0.328 0.306 0.169
Trunk 3 MIDS-MIDH 0.4346 0.4310 0.384 0.358 0.197
Upper trunk 2 CERV-XYPH 0.1596 0.5066 0.505 0.320 0.465
Forearm 2 EJC-STYL 0.0162 0.4608 0.278 0.267 0.122
Hand 2 WJC-DAC3 0.0061 0.3624 0.288 0.235 0.184
Hand 3 STYL-DAC3 0.0061 0.3691 0.285 0.233 0.182
Hand 4 STYL-MET3 0.0061 0.7948 0.614 0.502 0.392
Shank 2 KJC-LMAL 0.0433 0.4459 0.255 0.249 0.103
Shank 3 KJC-SPHY 0.0433 0.4524 0.258 0.253 0.105

### Differences between the anthropometric models from Dempster and Zatsiorsky¶

The anthropometric models from Dempster and Zatsiorsky are different in many aspects; regarding the subjetcs investigated in the studies, Dempster's model is based on the data of 8 cadavers of older male individuals (but two of the individuals were of unknown age) analyzed in the United States. Zatsiorsky's model is based on image scanning of 100 young men and 15 young women, at the time all students of a military school in the former Soviet Union.

The difference between models for some segments is large (see table below): the mass fraction of the thigh segment for Zatsiorsky's model is more than 40% larger than for the Dempster's model, inversely, the trunk segment has about 15% lower mass fraction for Zatisorsky's model. Also, note that some of the segments don't have the same definition in the two models.

In [7]:
m_D = bsp_D.loc[['Foot', 'Leg', 'Thigh', 'Pelvis', 'Abdomen', 'Thorax', 'Trunk',
'Upper arm', 'Forearm', 'Hand', 'Head neck'], 'Mass']
m_Zf = bsp_Zf.loc[['Foot', 'Shank', 'Thigh', 'Lower trunk', 'Middle trunk', 'Upper trunk',
'Trunk', 'Upper arm', 'Forearm', 'Hand', 'Head'], 'Mass']
m_Zm = bsp_Zm.loc[['Foot', 'Shank', 'Thigh', 'Lower trunk', 'Middle trunk', 'Upper trunk',
'Trunk', 'Upper arm', 'Forearm', 'Hand', 'Head'], 'Mass']
m_D.index = m_Zf.index  # because of different names for some segments

display(Latex("Mass fraction difference (in %) of Zatsiorsky's model w.r.t. Dempster's model"))
d = pd.DataFrame({'Females': np.around(100 * (m_Zf - m_D) / m_D), \
'Males': np.around(100 * (m_Zm - m_D) / m_D)})
display(d)

Mass fraction difference (in %) of Zatsiorsky's model w.r.t. Dempster's model
Females Males
Segment
Foot -11.0 -6.0
Shank 3.0 -7.0
Thigh 48.0 42.0
Lower trunk -12.0 -21.0
Middle trunk 5.0 17.0
Upper trunk -28.0 -26.0
Trunk -14.0 -13.0
Upper arm -9.0 -3.0
Forearm -14.0 1.0
Hand -7.0 2.0

## Center of mass¶

See the notebook Center of Mass and Moment of Inertia for a description of center of mass.

Using the data of the body segment parameters table, the center of mass of a single segment $i$ is (see figure below):

$$r_{i} = r_{i,p} + \text{bsp[i,cmp]} \cdot (r_{i,d}-r_{i,p}) \label{}$$

Where $r_{i,p}$ and $\:r_{i,d}$ are the positions of the proximal and distal landmarks used to define the $i$ segment.
Note that $r$ is a vector and may have more than one dimension. The equation for the center of mass is valid in each direction and the calculations are performed independently in each direction. In addition, there is no need to include the mass of the segment in the equation above; the mass of the segment is used only when there is more than one segment.

For example, given the following coordinates ($x, y$) for the MT2, ankle, knee and hip joints:

In [8]:
r = np.array([[101.1, 1.3], [84.9, 11.0], [86.4, 54.9], [72.1, 92.8]])/100
display(np.around(r, 3))

array([[1.011, 0.013],
[0.849, 0.11 ],
[0.864, 0.549],
[0.721, 0.928]])

The position of the center of mass of each segment and of the lower limb are:

In [9]:
M = bsp_D.loc[['Foot', 'Leg', 'Thigh'], 'Mass'].sum()
rcm_foot  = r[1] + bsp_D.loc['Foot', 'CM prox']*(r[0]-r[1])
rcm_leg   = r[2] + bsp_D.loc['Leg',  'CM prox']*(r[1]-r[2])
rcm_thigh = r[3] + bsp_D.loc['Thigh','CM prox']*(r[2]-r[3])
rcm = (bsp_D.loc['Foot','Mass']*rcm_foot + bsp_D.loc['Leg','Mass']*rcm_leg + \
bsp_D.loc['Thigh','Mass']*rcm_thigh)/M
print('Foot CM: ', np.around(rcm_foot, 3), 'm')
print('Leg CM: ', np.around(rcm_leg, 3), 'm')
print('Thigh CM: ', np.around(rcm_thigh, 3), 'm')
print('Lower limb CM: ', np.around(rcm, 3), 'm')

Foot CM:  [0.93  0.062] m
Leg CM:  [0.858 0.359] m
Thigh CM:  [0.783 0.764] m
Lower limb CM:  [0.818 0.584] m


And here is a geometric representation of part of these calculations:

In [10]:
plt.rc('axes',  labelsize=14, linewidth=1.5)
plt.rc('xtick', labelsize=14)
plt.rc('ytick', labelsize=14)
plt.rc('lines', markersize=8)
hfig, hax = plt.subplots(1, 1, figsize=(10, 5))

# bones and joints
plt.plot(r[:,0], r[:,1], 'b-')
plt.plot(r[:,0], r[:,1], 'ko', label='joint')
# center of mass of each segment
plt.plot(rcm_foot[0], rcm_foot[1], 'go', label='segment center of mass')
plt.plot(rcm_leg[0], rcm_leg[1], 'go', rcm_thigh[0], rcm_thigh[1], 'go')
# total center of mass
plt.plot(rcm[0], rcm[1], 'ro', label='total center of mass')
hax.legend(frameon=False, loc='upper left', fontsize=12, numpoints=1)
plt.arrow(0, 0, r[3,0], r[3,1], color='b', head_width=0.02, overhang=.5, fc="k", ec="k",
plt.arrow(r[3,0], r[3,1], rcm_thigh[0] - r [3,0], rcm_thigh[1] - r[3,1], head_width=0.02,
plt.arrow(0, 0, rcm_thigh[0], rcm_thigh[1], head_width=0.02, overhang=.5, fc="g", ec="g",
plt.text(0.30, .5, '$\mathbf{r}_{thigh,p}$', rotation=38, fontsize=16)
plt.text(0.77, .85, '$bsp_{thigh,cmp}*(\mathbf{r}_{i,d}-\mathbf{r}_{i,p})$',
fontsize=16, color='b')
plt.text(0.15, .05,
'$\mathbf{r}_{thigh,cm}=\mathbf{r}_{i,p}+bsp_{i,cmp}*' + '(\mathbf{r}_{i,d}-\mathbf{r}_{i,p})$',
rotation=25, fontsize=16, color='g')
hax.set_xlim(0,1.1)
hax.set_ylim(0,1.05)
hax.set_xlabel('x [m]')
hax.set_ylabel('y [m]')
hax.set_title('Determination of center of mass', fontsize=16)
hax.grid()


## Moment of inertia¶

See the notebook Center of Mass and Moment of Inertia for a description of moment of inertia and radius of gyration.

The radius of gyration (as a fraction of the segment length) is the quantity that is given in the table of body segment parameters. Because of that, we don't need to sum each element of mass of the segment to calculate its moment of inertia; we just need to take the mass of the segment times the radius or gyration squared.

Using the body segment parameters, the moment of inertia of a single segment $i$ rotating around its own center of mass is (see figure below):

$$I_{i,cm} = M \cdot \text{bsp[i,mass]} \cdot \left(\text{bsp[i,rgcm]} \cdot ||r_{i,d}-r_{i,p}||\right)^2 \label{}$$

Where $M$ is the total body mass of the subject and $||r_{i,d}-r_{i,p}||$ is the length of the segment $i$.

For example, the moment of inertia of each segment of the lower limb around each corresponding segment center of mass considering the coordinates (x, y) for the MT2, ankle, knee and hip joints given above are:

In [11]:
norm = np.linalg.norm
M = 100  # body mass
Icm_foot = M*bsp_D.loc['Foot', 'Mass']*((bsp_D.loc['Foot', 'Rg CM']*norm(r[0]-r[1]))**2)
Icm_leg = M*bsp_D.loc['Leg',  'Mass']*((bsp_D.loc['Leg',  'Rg CM']*norm(r[1]-r[2]))**2)
Icm_thigh = M*bsp_D.loc['Thigh','Mass']*((bsp_D.loc['Thigh','Rg CM']*norm(r[2]-r[3]))**2)
print('Icm foot: ', np.around(Icm_foot, 3), 'kgm2')
print('Icm leg: ', np.around(Icm_leg, 3), 'kgm2')
print('Icm thigh: ', np.around(Icm_thigh, 3), 'kgm2')

Icm foot:  0.012 kgm2
Icm leg:  0.082 kgm2
Icm thigh:  0.171 kgm2


### Parallel axis theorem¶

See the notebook Center of Mass and Moment of Inertia for a description of parallel axis theorem.

For example, using the parallel axis theorem the moment of inertia of the lower limb around its center of mass is:

In [12]:
Icmll = (Icm_foot  + M*bsp_D.loc['Foot', 'Mass']*norm(rcm-rcm_foot )**2 + \
Icm_leg   + M*bsp_D.loc['Leg',  'Mass']*norm(rcm-rcm_leg  )**2 + \
Icm_thigh + M*bsp_D.loc['Thigh','Mass']*norm(rcm-rcm_thigh)**2)

print('Icm lower limb: ', np.around(Icmll, 3), 'kgm2')

Icm lower limb:  1.257 kgm2


To calculate the moment of inertia of the lower limb around the hip, we use again the parallel axis theorem:

In [13]:
Ihipll = (Icm_foot  + M*bsp_D.loc['Foot', 'Mass']*norm(r[3]-rcm_foot )**2 + \
Icm_leg   + M*bsp_D.loc['Leg',  'Mass']*norm(r[3]-rcm_leg  )**2 + \
Icm_thigh + M*bsp_D.loc['Thigh','Mass']*norm(r[3]-rcm_thigh)**2)

print('Ihip lower limb: ', np.around(Ihipll, 3), 'kgm2')

Ihip lower limb:  3.317 kgm2


Note that for the correct use of the parallel axis theorem we have to input the moment of inertia around the center of mass of each body. For example, we CAN NOT calculate the moment of inertia around the hip with the moment of inertia of the entire lower limb:

In [14]:
# THIS IS WRONG:
I = (Icm_foot  + M*bsp_D.loc['Foot', 'Mass']*norm(r[3]-rcm)**2 + \
Icm_leg   + M*bsp_D.loc['Leg',  'Mass']*norm(r[3]-rcm)**2 + \
Icm_thigh + M*bsp_D.loc['Thigh','Mass']*norm(r[3]-rcm)**2)

print('Icm lower limb: ', np.around(I, 3), 'kgm2. THIS IS WRONG!')

Icm lower limb:  2.324 kgm2. THIS IS WRONG!


## Center of buoyancy¶

Center of buoyancy is the center of the volume of water which the submerged part of an object displaces. Center of buoyancy is to center of volume as center of gravity is to center of mass.

For the human body submerged in water, because different parts of the body have different densities, the center of buoyancy is at a different place than the center of gravity, see for example Yanai and Wilson (2008).

## Problems¶

1. Take a picture at the frontal plane of somebody standing on one foot on tiptoes with the arms and the other leg abducted at the horizontal.

1. Estimate the body center of mass of this person. Hint: for simplicity, consider the center of mass of each segment to be located at the middle of the segment and measure these positions using a image digitizer, e.g., WebPlotDigitizer.
2. If the person is almost standing still, through which part of the body a vertical line through the center of mass should necessarily pass? Have you obtained this result? Comment on possible differences between the expected and obtained results.
2. Consider the kinematic data from table A.1 of the Winter's book (Winter, 2009) used in problem 2 of the notebook Angular kinematics in a plane (2D).

1. Calculate the center of mass position for each segment and for the whole body (beware that no data are given for the head and arms segments) using the Dempster's and Zatsiorsky's models.
2. Perform these calculations also for the moment of inertia (of each segment and of the whole body around the corresponding centers of mass).
3. Consider the following positions of markers placed on a leg (described in the laboratory coordinate system with coordinates $x, y, z$ in cm, the $x$ axis points forward and the $y$ axes points upward): lateral malleolus (lm = [2.92, 10.10, 18.85]), medial malleolus (mm = [2.71, 10.22, 26.52]), fibular head (fh = [5.05, 41.90, 15.41]), and medial condyle (mc = [8.29, 41.88, 26.52]). Define the ankle joint center as the centroid between the lm and mm markers and the knee joint center as the centroid between the fh and mc markers (same data as in problem 1 of the notebook Rigid-body transformations (3D)). Consider that the principal axes of the leg are aligned with the axes of the respective anatomical coordinate system.

1. Determine the center of mass position of the leg at the anatomical and laboratory coordinate systems.
2. Determine the inertia tensor of the leg for a rotation around its proximal joint and around its center of mass.