.. DO NOT EDIT. .. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. .. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: .. "auto_examples/pyshoe_2019.py" .. LINE NUMBERS ARE GIVEN BELOW. .. only:: html .. note:: :class: sphx-glr-download-link-note Click :ref:`here ` to download the full example code .. rst-class:: sphx-glr-example-title .. _sphx_glr_auto_examples_pyshoe_2019.py: PyShoe2019 - Indoor Navigation with foot-mounted inertial sensors ================================================================= The PyShoe dataset [1]_ contains multiple trials with spatial reference for longer trials. This makes it perfect to benchmark trajectory reconstruction algorithms. However, it does not contain any temporal marker or stride reference. General information ------------------- The dataset was recorded with a LORD MicroStrain 3DM-GX5-25 IMU sensor. A single IMU node was attached on the top of the right shoe. On loading, we transform the data to the coordinate system of the gaitmap coordinate system as shown below .. figure:: /images/coordinate_systems/coordinate_transform_microstrain_instep_pyshoe.svg :alt: coordinate system definition :figclass: align-center The data is split into three parts: - Vicon: Individual trials recorded with a Vicon motion capture system as reference - Hallway: Multiple longer walking/running trials recorded with specific landmarks as positional reference along the trial - Stairs: Multiple trials from a single participant recorded with a stair climbing task For each part of the data we provide a separate dataset class. .. [1] Wagstaff, Brandon, Valentin Peretroukhin, and Jonathan Kelly. “Robust Data-Driven Zero-Velocity Detection for Foot-Mounted Inertial Navigation.” IEEE Sensors Journal 20, no. 2 (January 15, 2020): 957–67. https://doi.org/10.1109/JSEN.2019.2944412. .. GENERATED FROM PYTHON SOURCE LINES 35-41 .. warning:: For this example to work, you need to have a global config set containing the path to the dataset. Check the `README.md` for more information. Vicon Dataset ------------- First we will create a simple instance of the dataset class. .. GENERATED FROM PYTHON SOURCE LINES 41-46 .. code-block:: default from gaitmap_datasets.pyshoe_2019 import PyShoe2019Vicon dataset = PyShoe2019Vicon() dataset .. raw:: html

PyShoe2019Vicon [56 groups/rows]

trial
0 2017-12-15-18-01-18
1 2017-11-27-11-12-18
2 2017-11-27-11-13-41
3 2017-11-22-11-22-46
4 2017-11-22-11-49-29
5 2017-11-22-11-44-47
6 2017-12-15-17-59-19
7 2017-11-22-11-22-03
8 2017-11-22-11-38-45
9 2017-11-27-11-11-24
10 2017-11-27-11-24-07
11 2017-11-22-11-36-45
12 2017-11-22-11-39-47
13 2017-11-22-11-51-23
14 2017-11-22-11-27-30
15 2018-02-09-11-18-04
16 2017-11-27-11-13-10
17 2018-02-09-11-32-01
18 2017-11-27-11-14-03
19 2018-02-09-11-16-53
20 2018-02-09-11-19-39
21 2017-11-27-11-19-16
22 2017-12-15-17-59-50
23 2018-02-22-10-10-56
24 2017-11-22-11-48-35
25 2017-11-22-11-49-03
26 2017-11-27-11-18-11
27 2017-11-22-11-52-02
28 2017-11-27-11-17-28
29 2017-11-27-11-22-22
30 2018-02-09-11-22-01
31 2018-02-22-10-09-36
32 2017-11-22-11-37-47
33 2017-11-22-11-28-39
34 2017-11-22-11-28-03
35 2017-11-27-11-12-44
36 2017-11-22-11-26-46
37 2017-12-15-18-03-05
38 2017-11-27-11-23-18
39 2017-11-22-11-35-59
40 2017-12-15-18-01-51
41 2017-11-22-11-25-20
42 2017-11-27-11-25-12
43 2017-11-22-11-26-05
44 2017-11-22-11-30-14
45 2017-12-15-18-00-40
46 2017-11-27-11-11-53
47 2017-11-27-11-14-52
48 2017-11-22-11-40-44
49 2018-02-22-10-10-29
50 2017-11-22-11-50-42
51 2017-12-15-18-00-13
52 2017-11-22-11-23-25
53 2018-02-09-11-29-43
54 2017-12-15-18-02-28
55 2018-02-22-10-08-52


.. GENERATED FROM PYTHON SOURCE LINES 47-52 Based on the index you can select individual trials. Note, that some of the trials contain running/shuffling or backward walking. However, the dataset authors do not provide a label for that (https://github.com/utiasSTARS/pyshoe/issues/11). If it is important to you to only consider trials containing movements of a specific type, you need to manually check the raw data and guess based on that. .. GENERATED FROM PYTHON SOURCE LINES 52-54 .. code-block:: default trial = dataset.get_subset(trial="2017-11-22-11-22-03") .. GENERATED FROM PYTHON SOURCE LINES 55-59 When we have selected a single trial, we can access the data. The data is stored in a pandas DataFrame, where each row corresponds to a single time step. Note, that the dataset only contains data from a single IMU attached to the right shoe. We still provide the data as a "nested" dataframe, where the outermost level corresponds to the foot. .. GENERATED FROM PYTHON SOURCE LINES 59-62 .. code-block:: default imu_data = trial.data imu_data .. raw:: html
sensor right_sensor
axis acc_x acc_y acc_z gyr_x gyr_y gyr_z
time [s]
0.005191 -2.781892 -0.299658 9.352644 0.227405 -0.706740 0.485781
0.010160 -2.841245 -0.315210 9.339815 0.207448 0.063552 -0.090120
0.015174 -2.821833 -0.278027 9.385390 0.940303 0.466289 0.586400
0.020134 -2.854676 -0.298270 9.383124 0.341406 0.091222 0.328716
0.025084 -2.879035 -0.242348 9.389574 0.631465 0.462962 -0.334062
... ... ... ... ... ... ...
32.429850 -2.601544 -0.585042 9.421066 0.256404 -0.408682 0.334698
32.434979 -2.639347 -0.582814 9.398733 0.384274 0.751468 -0.036125
32.440075 -2.631892 -0.585243 9.393909 -1.039280 0.817331 -0.120867
32.444980 -2.669842 -0.585144 9.419175 0.161355 0.875428 -0.333420
32.449892 -2.620204 -0.579081 9.422248 -0.996577 1.384654 0.173012

6490 rows × 6 columns



.. GENERATED FROM PYTHON SOURCE LINES 63-64 The mocap marker data is also stored in a pandas DataFrame and the marker is placed directly on the sensor. .. GENERATED FROM PYTHON SOURCE LINES 64-67 .. code-block:: default mocap_data = trial.marker_position_ mocap_data .. raw:: html
sensor right_sensor
direction x y z
time [s]
0.005191 -27.581452 63.427551 125.979013
0.010160 -27.600539 63.421317 126.002191
0.015174 -27.600539 63.421317 126.002191
0.020134 -27.599742 63.405152 125.977403
0.025084 -27.555421 63.640739 126.079271
... ... ... ...
32.429850 -34.302266 2.244311 122.834868
32.434979 -34.333242 2.226604 122.793186
32.440075 -34.323351 2.185406 122.843320
32.444980 -34.325223 2.169762 122.815674
32.449892 -34.279827 2.199983 122.776791

6490 rows × 3 columns



.. GENERATED FROM PYTHON SOURCE LINES 68-70 Both data types are recorded at 200 Hz and are synchronized. This means we can plot them in an aligned way without any modifications. .. GENERATED FROM PYTHON SOURCE LINES 70-84 .. code-block:: default import matplotlib.pyplot as plt fig, axs = plt.subplots(3, 1, sharex=True) imu_data["right_sensor"].filter(like="acc").plot(ax=axs[0]) imu_data["right_sensor"].filter(like="gyr").plot(ax=axs[1]) mocap_data["right_sensor"].plot(ax=axs[2]) axs[2].set_xlabel("Time [s]") axs[2].set_ylabel("Position [m]") axs[1].set_ylabel("Gyro [deg/s]") axs[0].set_ylabel("Acc [m/s^2]") fig.tight_layout() fig.show() .. image-sg:: /auto_examples/images/sphx_glr_pyshoe_2019_001.png :alt: pyshoe 2019 :srcset: /auto_examples/images/sphx_glr_pyshoe_2019_001.png :class: sphx-glr-single-img .. GENERATED FROM PYTHON SOURCE LINES 85-90 Hallway Dataset --------------- First we will create a simple instance of the dataset class. We can see that the dataset contains trials from multiple participants with the three trial types (walking, running, combined). .. GENERATED FROM PYTHON SOURCE LINES 90-95 .. code-block:: default from gaitmap_datasets.pyshoe_2019 import PyShoe2019Hallway dataset = PyShoe2019Hallway() dataset .. raw:: html

PyShoe2019Hallway [38 groups/rows]

participant type trial
0 p3 walk 2018-04-10-15-25-02
1 p3 walk 2018-04-10-15-18-40
2 p2 walk 2018-04-11-19-42-05
3 p2 walk 2018-04-11-19-49-39
4 p4 walk 2018-04-11-15-26-05
5 p4 walk 2018-04-11-15-20-30
6 p1 walk 2018-04-11-10-46-37
7 p1 walk 2018-04-11-10-39-53
8 p0 walk 2018-04-10-14-04-36
9 p0 walk 2018-04-07-15-39-07
10 p0 walk 2018-04-07-15-42-42
11 p3 comb 2018-04-10-15-37-06
12 p3 comb 2018-04-10-15-31-18
13 p2 comb 2018-04-11-20-02-58
14 p2 comb 2018-04-11-19-56-12
15 p4 comb 2018-04-11-15-36-03
16 p4 comb 2018-04-11-15-31-34
17 p1 comb 2018-04-11-10-59-05
18 p1 comb 2018-04-11-10-53-28
19 p0 comb 2018-04-09-10-53-15
20 p0 comb 2018-04-09-10-24-18
21 p0 comb 2018-04-09-11-03-28
22 p0 comb 2018-04-09-11-07-05
23 p0 comb 2018-04-09-10-56-09
24 p0 comb 2018-04-09-11-00-12
25 p3 run 2018-04-10-15-22-44
26 p3 run 2018-04-10-15-29-20
27 p2 run 2018-04-11-19-47-16
28 p2 run 2018-04-11-19-54-02
29 p4 run 2018-04-11-15-24-01
30 p4 run 2018-04-11-15-29-42
31 p1 run 2018-04-11-10-51-02
32 p1 run 2018-04-11-10-44-34
33 p0 run 2018-04-09-10-31-05
34 p0 run 2018-04-09-10-21-01
35 p0 run 2018-04-16-13-46-32
36 p0 run 2018-04-16-11-37-48
37 p0 run 2018-04-10-14-08-29


.. GENERATED FROM PYTHON SOURCE LINES 96-98 We can select arbitrary subsets of the data. For example, we can select all combined (running+walking) trials of a specific participant. .. GENERATED FROM PYTHON SOURCE LINES 98-101 .. code-block:: default subset = dataset.get_subset(participant="p1", type="comb") subset .. raw:: html

PyShoe2019Hallway [2 groups/rows]

participant type trial
0 p1 comb 2018-04-11-10-59-05
1 p1 comb 2018-04-11-10-53-28


.. GENERATED FROM PYTHON SOURCE LINES 102-103 When we have selected a single trial, we can access the data. .. GENERATED FROM PYTHON SOURCE LINES 103-106 .. code-block:: default trial = subset[0] trial .. raw:: html

PyShoe2019Hallway [1 groups/rows]

participant type trial
0 p1 comb 2018-04-11-10-59-05


.. GENERATED FROM PYTHON SOURCE LINES 107-108 We can access the IMU data as before. .. GENERATED FROM PYTHON SOURCE LINES 108-111 .. code-block:: default imu_data = trial.data imu_data .. raw:: html
sensor right_sensor
axis acc_x acc_y acc_z gyr_x gyr_y gyr_z
time [s]
0.005149 -4.590975 4.374997 7.437768 0.448315 0.189880 0.417674
0.010360 -4.544281 4.373245 7.510326 0.299517 0.177923 0.289822
0.015975 -4.540386 4.391929 7.457896 0.233851 0.169668 0.185347
0.016173 -4.584002 4.351857 7.462299 0.215938 0.148307 0.105725
0.020918 -4.611207 4.384323 7.468820 0.053287 0.018772 0.133610
... ... ... ... ... ... ...
287.435578 -4.865076 4.539700 7.210635 0.286556 0.288634 0.009507
287.440897 -4.839256 4.545354 7.210913 0.283526 0.272317 0.029565
287.445866 -4.893078 4.548808 7.172363 0.186191 0.141298 0.113512
287.451062 -4.847052 4.542258 7.177924 0.157011 0.151041 0.118710
287.456193 -4.847890 4.602775 7.157774 0.136902 0.098196 0.151553

57491 rows × 6 columns



.. GENERATED FROM PYTHON SOURCE LINES 112-113 The reference position is only provided for individual points along the trial. .. GENERATED FROM PYTHON SOURCE LINES 113-116 .. code-block:: default reference = trial.position_reference_ reference .. raw:: html
sensor right_sensor
direction x y z
time [s]
8.282805 0.000000 0.000000 0.000000
17.575982 -0.028122 10.070310 0.045138
31.179760 15.212801 10.027737 0.015693
119.851323 31.064606 10.009687 0.018403
136.169768 49.617972 11.036337 0.063391
151.923731 49.586710 28.185467 0.085439
165.107195 49.586710 43.048866 0.140000
179.220718 49.586710 58.590090 0.221820
194.378116 49.586710 43.048866 0.140000
208.105069 49.586710 28.185467 0.085439
224.395774 49.617972 11.036337 0.063391
241.569288 31.064606 10.009687 0.018403
256.481009 15.212801 10.027737 0.015693
269.811253 -0.028122 10.070310 0.045138
280.424826 0.000000 0.000000 0.000000


.. GENERATED FROM PYTHON SOURCE LINES 117-120 The index of the reference corresponds to timestamps in the IMU data. Hence, we can easily get the IMU data for the time points of the reference (or the position, once we have calculated it based on the IMU data). .. GENERATED FROM PYTHON SOURCE LINES 120-122 .. code-block:: default imu_data.loc[reference.index] .. raw:: html
sensor right_sensor
axis acc_x acc_y acc_z gyr_x gyr_y gyr_z
time [s]
8.282805 -4.496491 4.253400 7.412974 29.790430 32.970402 -9.761967
17.575982 -4.776118 4.659799 7.333980 -11.914205 0.801795 -8.811063
31.179760 -4.989060 4.365822 7.425811 8.321191 13.408360 -4.438745
119.851323 -4.807809 4.710577 7.425576 7.896716 11.902532 -5.582264
136.169768 -5.055169 3.813725 7.553582 3.564295 1.834236 2.327311
151.923731 -4.469937 4.358171 7.634457 2.966452 10.305689 -7.623919
165.107195 -4.533692 4.353279 7.669889 7.478448 7.827342 -0.394508
179.220718 -4.839216 4.395577 7.574844 -8.672488 -4.053169 -4.078138
194.378116 -4.372919 4.784847 7.529003 -5.934276 6.279567 -7.534290
208.105069 -4.657144 4.509208 7.326108 -0.939665 8.969255 -6.471187
224.395774 -4.782296 4.156237 7.608356 -5.762303 5.037054 -8.894644
241.569288 -4.496109 4.155525 7.856090 3.373532 6.504419 -3.857418
256.481009 -4.659771 4.991015 7.000360 15.608949 52.334545 -30.418329
269.811253 -6.076867 1.637763 7.649946 -38.121038 -7.439257 -18.199075
280.424826 -4.531105 5.201338 6.754158 -1.063248 -1.165655 3.970324


.. GENERATED FROM PYTHON SOURCE LINES 123-124 Below we plot all the data together. .. GENERATED FROM PYTHON SOURCE LINES 124-136 .. code-block:: default fig, axs = plt.subplots(3, 1, sharex=True) imu_data["right_sensor"].filter(like="acc").plot(ax=axs[0]) imu_data["right_sensor"].filter(like="gyr").plot(ax=axs[1]) reference["right_sensor"].plot(ax=axs[2], style="o") axs[2].set_ylabel("Position [m]") axs[1].set_ylabel("Gyro [deg/s]") axs[0].set_ylabel("Acc [m/s^2]") fig.tight_layout() fig.show() .. image-sg:: /auto_examples/images/sphx_glr_pyshoe_2019_002.png :alt: pyshoe 2019 :srcset: /auto_examples/images/sphx_glr_pyshoe_2019_002.png :class: sphx-glr-single-img .. GENERATED FROM PYTHON SOURCE LINES 137-145 Stairs Dataset -------------- The dataset contains trails of a participant walking different number of levels of stairs in starcase. For each number of stairs one trail exists that starts with the participant walking down and then back up ( `first_direction="down"`) and one trial that starts with the participant walking up and then back down ( `first_direction="up"`). First we will create a simple instance of the dataset class. .. GENERATED FROM PYTHON SOURCE LINES 145-150 .. code-block:: default from gaitmap_datasets.pyshoe_2019 import PyShoe2019Stairs dataset = PyShoe2019Stairs() dataset .. raw:: html

PyShoe2019Stairs [8 groups/rows]

n_levels first_direction trial
0 8 up 2018-08-11-13-31-07-up-8
1 4 up 2018-08-11-14-10-37-up-4
2 4 down 2018-08-11-14-27-26-down-4
3 2 up 2018-08-11-14-15-16-up-2
4 8 down 2018-08-11-14-20-21-down-8
5 6 down 2018-08-11-14-24-15-down-6
6 6 up 2018-08-11-14-07-34-up-6
7 2 down 2018-08-11-14-31-07-down-2


.. GENERATED FROM PYTHON SOURCE LINES 151-153 We can simply select either the trials starting with going down the up or down trials. .. GENERATED FROM PYTHON SOURCE LINES 153-156 .. code-block:: default subset = dataset.get_subset(first_direction="down") subset .. raw:: html

PyShoe2019Stairs [4 groups/rows]

n_levels first_direction trial
0 4 down 2018-08-11-14-27-26-down-4
1 8 down 2018-08-11-14-20-21-down-8
2 6 down 2018-08-11-14-24-15-down-6
3 2 down 2018-08-11-14-31-07-down-2


.. GENERATED FROM PYTHON SOURCE LINES 157-158 When we have selected a single trial, we can access the data. .. GENERATED FROM PYTHON SOURCE LINES 158-161 .. code-block:: default trial = subset.get_subset(n_levels="6") trial .. raw:: html

PyShoe2019Stairs [1 groups/rows]

n_levels first_direction trial
0 6 down 2018-08-11-14-24-15-down-6


.. GENERATED FROM PYTHON SOURCE LINES 162-163 We can access the IMU data as before. .. GENERATED FROM PYTHON SOURCE LINES 163-166 .. code-block:: default imu_data = trial.data imu_data .. raw:: html
sensor right_sensor
axis acc_x acc_y acc_z gyr_x gyr_y gyr_z
time [s]
0.005208 -0.822558 4.476494 8.648929 -0.480159 0.368659 0.008838
0.010548 -0.825832 4.495879 8.630640 -0.567628 0.320375 0.086155
0.015669 -0.835436 4.468421 8.603162 -0.546395 0.376312 0.091157
0.020823 -0.832943 4.481061 8.640306 -0.651113 0.359915 0.039598
0.025965 -0.793898 4.492451 8.655291 -0.671351 0.438643 0.178911
... ... ... ... ... ... ...
111.475393 -0.910722 4.394284 8.681709 0.105375 -0.058603 0.083301
111.480583 -0.941793 4.378661 8.652824 0.122981 -0.003054 -0.005066
111.485680 -0.963584 4.405440 8.653285 0.081241 -0.085321 0.022283
111.490844 -0.924065 4.375131 8.686098 0.161671 -0.108651 0.012238
111.495891 -0.913383 4.400737 8.725246 0.071880 -0.117503 0.099150

22299 rows × 6 columns



.. GENERATED FROM PYTHON SOURCE LINES 167-169 As with the hallway dataset the reference position is only provided for individual points along the trial. Further, as the reference is derived from the stair geometry, reference only exist for the z-axis. .. GENERATED FROM PYTHON SOURCE LINES 169-172 .. code-block:: default reference = trial.position_reference_ reference .. raw:: html
sensor right_sensor
direction z
time [s]
0.005208 0.000
8.346160 -2.057
17.920212 -4.114
26.741772 -6.171
36.641167 -8.228
45.039189 -10.285
53.406863 -12.342
63.202737 -10.285
72.240978 -8.228
81.027286 -6.171
89.735355 -4.114
100.411463 -2.057
109.918265 0.000


.. GENERATED FROM PYTHON SOURCE LINES 173-174 Below we plot all the data together. .. GENERATED FROM PYTHON SOURCE LINES 174-185 .. code-block:: default fig, axs = plt.subplots(3, 1, sharex=True) imu_data["right_sensor"].filter(like="acc").plot(ax=axs[0]) imu_data["right_sensor"].filter(like="gyr").plot(ax=axs[1]) reference["right_sensor"].plot(ax=axs[2], style="o") axs[2].set_ylabel("Position [m]") axs[1].set_ylabel("Gyro [deg/s]") axs[0].set_ylabel("Acc [m/s^2]") fig.tight_layout() fig.show() .. image-sg:: /auto_examples/images/sphx_glr_pyshoe_2019_003.png :alt: pyshoe 2019 :srcset: /auto_examples/images/sphx_glr_pyshoe_2019_003.png :class: sphx-glr-single-img .. rst-class:: sphx-glr-timing **Total running time of the script:** ( 0 minutes 11.348 seconds) **Estimated memory usage:** 30 MB .. _sphx_glr_download_auto_examples_pyshoe_2019.py: .. only:: html .. container:: sphx-glr-footer sphx-glr-footer-example .. container:: sphx-glr-download sphx-glr-download-python :download:`Download Python source code: pyshoe_2019.py ` .. container:: sphx-glr-download sphx-glr-download-jupyter :download:`Download Jupyter notebook: pyshoe_2019.ipynb ` .. only:: html .. rst-class:: sphx-glr-signature `Gallery generated by Sphinx-Gallery `_