From 6cf80341770e0980e52481c8c5764e60f0ee971a Mon Sep 17 00:00:00 2001 From: Robert Ennis Date: Fri, 26 Jul 2024 19:57:46 +0200 Subject: [PATCH 01/54] push imu transformations alpha labs article for review --- alpha-lab/cards.json | 10 + alpha-lab/imu-transformations/index.md | 299 +++++++++++++++++++++++++ 2 files changed, 309 insertions(+) create mode 100644 alpha-lab/imu-transformations/index.md diff --git a/alpha-lab/cards.json b/alpha-lab/cards.json index 780507724..38b816834 100644 --- a/alpha-lab/cards.json +++ b/alpha-lab/cards.json @@ -148,5 +148,15 @@ }, "image": "/alpha-lab/tag-aligner.webp", "category": "Gaze Mapping" + }, + { + "title": "IMU Coordinate System Snippets", + "details": "Use values from the IMU to express your data in a world reference frame.", + "link": { + "text": "View", + "href": "/alpha-lab/imu-transformations/" + }, + "image": "/alpha-lab/imu-transformations.webp", + "category": "Coordinate Systems" } ] diff --git a/alpha-lab/imu-transformations/index.md b/alpha-lab/imu-transformations/index.md new file mode 100644 index 000000000..570a5bec6 --- /dev/null +++ b/alpha-lab/imu-transformations/index.md @@ -0,0 +1,299 @@ +--- +title: "IMU Coordinate System Snippets" +description: "Use values from the IMU to express your data in a world reference frame." +permalink: /alpha-lab/imu-transformations/ +meta: + - name: twitter:card + content: summary + - name: twitter:image + content: "https://i.ytimg.com/vi/nt_zNSBMJWI/maxresdefault.jpg" + - name: twitter:player + content: "https://www.youtube.com/embed/jag9EQB7840" + - name: twitter:width + content: "1280" + - name: twitter:height + content: "720" + - property: og:image + content: "https://i.ytimg.com/vi/nt_zNSBMJWI/maxresdefault.jpg" +tags: [Neon, Cloud] +--- + + + +# IMU Coordinate System Snippets + + + + + +::: tip +Compare IMU and gaze data in the same coordinate system to better understand how people coordinate head and eye movements. +::: + +Here, we will provide some code snippets that can assist when analyzing the IMU data from Neon. + +We will use Python with the NumPy and SciPy packages for the code snippets below. Let’s start by loading those: + +```python +import numpy as np +from scipy.spatial.transform import Rotation as R +``` + +First, it is important to understand how the IMU data should be interpreted. The [orientation readings of the calibrated IMU](https://docs.pupil-labs.com/neon/data-collection/data-streams/#movement-imu-data) are specified with respect to magnetic North and gravity: + +- Y axis = vector pointing towards magnetic North. + - Rotations about this axis are called “roll” and range from -180 to +180 degrees. Wearing Neon normally and sitting or standing upright roughly corresponds to a roll of 0 degrees. Rightward head tilt is positive roll; leftward head tilt is negative roll. +- Z axis = vector pointing upwards, opposite to the direction of gravity. + - Rotations about this axis are called “yaw” and range from -180 to +180 degrees. When the IMU is calibrated, a Neon module oriented at magnetic North corresponds to a yaw of 0 degrees. Leftward head turn is positive yaw; rightward head turn is negative yaw. +- X axis = cross-product of Y and Z, which is a vector pointing rightwards. + - Rotations about this axis are called “pitch” and range from -90 to +90 degrees. Wearing Neon normally and sitting or standing upright roughly corresponds to a pitch of 0 degrees. Backward head tilt is positive pitch; forward head tilt is negative pitch + +This coordinate system is known as the “global reference frame”. Here, we will refer to it as the world coordinate system. To be very exact, it is distinct from the IMU coordinate system. As the Neon module rotates, the IMU coordinate system rotates with it. The IMU actually measures the rotational difference between its coordinate system and the world coordinate system. + +The gyroscope values give the rotational velocity of roll, yaw, and pitch in degrees/s (i.e., they provide the change over time of each of these quantities). + +Note that Neon can sit differently on each wearer’s face, such that the headset is not necessarily in line with the naso-occiptal plane. For example, if the wearer is looking at magnetic North, the IMU might still report some deviation from neural orientation. + +Now that we have laid out the relationship between the IMU and world coordinate systems, we can do some useful transformations. + +## Obtain IMU heading vectors + +An alternate representation of IMU data is a heading vector that points outwards from the center of the IMU. Neutral orientation of the IMU would correspond to a heading vector that points at magnetic North and that is oriented perpendicular to gravity. + +Note that a neutral IMU heading vector is unlikely to be perfectly aligned with the floor. + +:::: details Code +```python +def imu_heading_in_world(imu_quaternions): + """ + Construct heading vectors from the IMU's quaternion values. + + Inputs: + - imu_quaternions (Nx4 np.array): A timeseries of quaternions + from Neon's IMU stream. + + Returns: + - headings_in_world (Nx3 np.array): A timeseries of IMU heading vectors + in the world coordinate system. + """ + + # We start by specifying the direction of a neutral heading vector + # in the IMU's coordinate system. + heading_neutral_in_imu_coords = np.array([0.0, 1.0, 0.0]) + + # This array contains a timeseries of transformation matrices, + # as calculated from the IMU's timeseries of quaternions values. + # Each of these matrices sends points in the IMU coordinate system to their + # corresponding coordinates in the world coordinate system. + imu_to_world = R.from_quat(imu_quaternions).as_matrix() + + # We now apply each transformation matrix to the neutral IMU heading vector + # to obtain a timeseries of heading vectors in the world coordinate system. + headings_in_world = imu_to_world @ heading_neutral_in_imu_coords + + return headings_in_world +``` +:::: + +## Transform IMU acceleration data to world coordinates + +We stated above that the Z axis of the world coordinate system is a vector pointing directly upwards, opposite gravity. However, the Z component of the IMU acceleration data points downwards, such that if you are standing on Earth, then positive acceleration values mean that you are accelerating towards the center of the Earth. The X and Y axes are the same and shared between the orientation and acceleration data provided by the IMU. The function below will transform the acceleration data to the world coordinate system described above. + +:::: details Code +```python +def imu_acceleration_in_world(accelerations_imu): + """ + Transform the IMU's acceleration values to the world coordinate system. + + Inputs: + - accelerations_imu (Nx3 np.array): Timeseries of acceleration data + from the IMU, where columns are in the order: accel_x, accel_y, accel_z. + + Returns: + - accelerations_world (Nx3 np.array): Timeseries of acceleration data, + expressed in the world coordinate system. + """ + + accelerations_world = accelerations_imu.copy() + accelerations_world[2] *= -1.0 + + return accelerations_world +``` +:::: + +## Represent IMU and Gaze Data in the Same Coordinate System + +Neon simultaneously records gaze and IMU data, making it possible to study the relationship between head and eye movements. + +To facilitate comparison of gaze and head rotations, it can sometimes be easier to represent them in the same coordinate system. The coordinates of gaze are specified with respect to the scene camera coordinate system and the function below, `gaze_scene_to_world`, uses data from the IMU to transform gaze to the world coordinate system. + +::: tip +💡 Reminder: The world coordinate system is defined by the direction away from the center of gravity, as well as the direction towards magnetic North. +::: + +:::: details Code +```python +def gaze_scene_to_world(gaze_elevations, gaze_azimuths, imu_quaternions): + """ + Transform a 3D gaze ray to the world coordinate system. + + Note that the gaze data and the IMU quaternion should be sampled + at the same timestamps. You can linearly interpolate the IMU data + to ensure this. + + The origin of the IMU coordinate system is the same as the + origin of the world coordinate system. + + This function makes use of the spherical_to_cartesian function, + defined below, that converts 3D gaze rays from spherical coordinates + to Cartesian coordinates. + + Inputs: + - gaze_elevations (Nx1 np.array): A timeseries of gaze elevations (degrees), + specified in the scene camera coordinate system. + - gaze_azimuths (Nx1 np.array): A timeseries of gaze azimuths (degrees), + specified in the scene camera coordinate system. + - imu_quaternions (Nx4 np.array): A timeseries of quaternion values + from Neon's IMU. + + Returns: + - gazes_in_world (Nx3 np.array): A timeseries of 3D Cartesian gaze + unit vectors, specified in the world coordinate system. + """ + + # The IMU and scene camera coordinate systems have a fixed + # 102 degree rotation offset. + imu_scene_rotation_diff = np.deg2rad(-90 - 12) + + # This matrix takes points in the scene camera coordinate + # system and returns their corresponding coordinates in the + # IMU coordinate system. + scene_to_imu = np.array( + [ + [1.0, 0.0, 0.0], + [ + 0.0, + np.cos(imu_scene_rotation_diff), + -np.sin(imu_scene_rotation_diff), + ], + [ + 0.0, + np.sin(imu_scene_rotation_diff), + np.cos(imu_scene_rotation_diff), + ], + ] + ) + + # Neon provides 3D gaze in spherical coordinates by default, + # so first transform the gaze data from spherical coordinates + # to Cartesian coordinates. + cart_gazes_in_scene = spherical_to_cartesian(gaze_elevations, gaze_azimuths) + + # Apply the transformation from the scene camera to the IMU coordinate system. + gazes_in_imu = scene_to_imu @ cart_gazes_in_scene + + # This array contains a timeseries of transformation matrices, + # as calculated from the IMU's timeseries of quaternions values. + # Each of these matrices sends points in the IMU coordinate system to their + # corresponding coordinates in the world coordinate system. + imu_to_world_matrices = R.from_quat(imu_quaternions).as_matrix() + + # Apply the transformations from the IMU to the world coordinate system. + gazes_in_world = [imu_to_world @ gaze for imu_to_world, gaze in zip(imu_to_world_matrices, gazes_in_imu.T)] + + return np.array(gazes_in_world) + + +def spherical_to_cartesian(elevations, azimuths): + """ + Convert Neon's spherical representation of 3D gaze to Cartesian coordinates. + + Inputs: + - elevations (Nx1 np.array): A timeseries of gaze elevations (degrees), + specified in the scene camera coordinate system. + - azimuths (Nx1 np.array): A timeseries of gaze azimuths (degrees), + specified in the scene camera coordinate system. + + Returns: + - cartesian_unit_vectors (Nx3 np.array): A timeseries of gaze unit + vectors, in Cartesian coordinates, specified in the scene camera + coordinate system. + """ + + elevations_rad = np.deg2rad(elevations) + azimuths_rad = np.deg2rad(azimuths) + + # Elevation of 0 in Neon system corresponds to Y = 0, but + # an elevation of 0 in traditional spherical coordinates would + # correspond to Y = 1, so first we convert elevation to the + # more traditional format. + elevations_rad = elevations_rad + np.pi / 2 + + # Azimuth of 0 in Neon system corresponds to X = 0, but + # an azimuth of 0 in traditional spherical coordinates would + # correspond to X = 1. Also, azimuth to the right in Neon is + # more positive, whereas it is more negative in traditional spherical coordiantes. + # So, first we convert azimuth to the more traditional format. + azimuths_rad = -azimuths_rad + np.pi / 2 + + cartesian_unit_vectors = np.array([ + np.sin(elevations_rad) * np.cos(azimuths_rad), + np.cos(elevations_rad), + np.sin(elevations_rad) * np.sin(azimuths_rad), + ]) + + return cartesian_unit_vectors +``` +:::: + +## Analysis example + +Below is a brief example of running these commands on values from Pupil Cloud. + +:::: details Code +```python +import pandas as pd + +gaze = pd.read_csv("gaze.csv") +imu = pd.read_csv("imu.csv") + +gaze_ts = gaze["timestamp [ns]"] +imu_ts = imu["timestamp [ns]"] + +# We have more gaze datapoints (sampled at 200Hz) than +# IMU datapoints (sampled at 110Hz), so linearly interpolate +# the IMU datapoints to be congruent with gaze. +quats_x_resampled = np.interp(gaze_ts, imu_ts, imu["quaternion x"]) +quats_y_resampled = np.interp(gaze_ts, imu_ts, imu["quaternion y"]) +quats_z_resampled = np.interp(gaze_ts, imu_ts, imu["quaternion z"]) +quats_w_resampled = np.interp(gaze_ts, imu_ts, imu["quaternion w"]) + +quaternions_resampled = np.vstack( + [quats_x_resampled, quats_y_resampled, quats_z_resampled, quats_w_resampled] +).T + +accels_x_resampled = np.interp(gaze_ts, imu_ts, imu["acceleration x [G]"]) +accels_y_resampled = np.interp(gaze_ts, imu_ts, imu["acceleration y [G]"]) +accels_z_resampled = np.interp(gaze_ts, imu_ts, imu["acceleration z [G]"]) + +accelerations_resampled = np.vstack( + [accels_x_resampled, accels_y_resampled, accels_z_resampled] +).T + +# Now, we can apply the functions. + +imu_headings = imu_heading_in_world(quaternions_resampled) +world_gazes = gaze_scene_to_world( + gaze["elevation [deg]"], + gaze["azimuth [deg]"], + quaternions_resampled, +) +world_accelerations = imu_acceleration_in_world(accelerations_resampled) +``` +:::: + +::: tip +Need assistance with aligning your AprilTags or applying the transformations to your Reference Image Mapper recordings? Or do you have something more custom in mind? Reach out to us via email at [info@pupil-labs.com](mailto:info@pupil-labs.com), on our [Discord server](https://pupil-labs.com/chat/), or visit our [Support Page](https://pupil-labs.com/products/support/) for dedicated support options. +::: \ No newline at end of file From 2fa58eb604d2e158bf288cff042d21e93b200aea Mon Sep 17 00:00:00 2001 From: Robert Ennis Date: Fri, 26 Jul 2024 20:26:27 +0200 Subject: [PATCH 02/54] use terminology for matrix application that is in line with math literature --- alpha-lab/imu-transformations/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/alpha-lab/imu-transformations/index.md b/alpha-lab/imu-transformations/index.md index 570a5bec6..0c5c27ca5 100644 --- a/alpha-lab/imu-transformations/index.md +++ b/alpha-lab/imu-transformations/index.md @@ -167,8 +167,8 @@ def gaze_scene_to_world(gaze_elevations, gaze_azimuths, imu_quaternions): # 102 degree rotation offset. imu_scene_rotation_diff = np.deg2rad(-90 - 12) - # This matrix takes points in the scene camera coordinate - # system and returns their corresponding coordinates in the + # This matrix send points in the scene camera coordinate + # system to their corresponding coordinates in the # IMU coordinate system. scene_to_imu = np.array( [ From 3e9d5bba85d148a13fb402a7a1775d8b59479815 Mon Sep 17 00:00:00 2001 From: Robert Ennis Date: Fri, 26 Jul 2024 20:28:38 +0200 Subject: [PATCH 03/54] make it easier for users to learn why it is "-90 - 12" for scene->to->imu --- alpha-lab/imu-transformations/index.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/alpha-lab/imu-transformations/index.md b/alpha-lab/imu-transformations/index.md index 0c5c27ca5..7a52248ca 100644 --- a/alpha-lab/imu-transformations/index.md +++ b/alpha-lab/imu-transformations/index.md @@ -165,6 +165,8 @@ def gaze_scene_to_world(gaze_elevations, gaze_azimuths, imu_quaternions): # The IMU and scene camera coordinate systems have a fixed # 102 degree rotation offset. + # See: + # https://docs.pupil-labs.com/neon/data-collection/data-streams/#movement-imu-data imu_scene_rotation_diff = np.deg2rad(-90 - 12) # This matrix send points in the scene camera coordinate From 81efe892110b43bcfa7e8216d0c2d094c9a688c7 Mon Sep 17 00:00:00 2001 From: Robert Ennis Date: Tue, 13 Aug 2024 00:32:57 +0200 Subject: [PATCH 04/54] incorporate latest changes, add supporting images --- .../imu-pitch-yaw-roll-black.png | Bin 0 -> 183939 bytes alpha-lab/imu-transformations/index.md | 155 ++++++++++-------- alpha-lab/public/imu-transformations.webp | Bin 0 -> 78386 bytes 3 files changed, 91 insertions(+), 64 deletions(-) create mode 100644 alpha-lab/imu-transformations/imu-pitch-yaw-roll-black.png create mode 100644 alpha-lab/public/imu-transformations.webp diff --git a/alpha-lab/imu-transformations/imu-pitch-yaw-roll-black.png b/alpha-lab/imu-transformations/imu-pitch-yaw-roll-black.png new file mode 100644 index 0000000000000000000000000000000000000000..f35c581a607379eeb7babdc5a871b8b6941fc135 GIT binary patch literal 183939 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

;$ih}>U1Cm^TsBdXajxfuEIWI z5hNq8uo{JQ_(oe<4flZU`2hn7Hy6h{thzzEs~Aei4`I&fN*Ui#5qy0aH(LO!S<`3P zie6EKO0n_p`XB5{KCtZ20!CnX=WDl^n6E^z6Mgh!Ho!^$Y_Q@{>JtoZzOf#)L4ia~ z&j4brsCW?nTs5R`$&jyAF-J)&`?cS38Zbi*f8O-{fQs_E-I|&A-+gbDmEzfrh7MuW^)6FcegFGsf0wyw4JPk+2`$pz}nYYdA&%=-)7`DeWa+jTI9R$~ysC)wTC#GsvJEl`KfJoE z1Ft*wKCh*9SN9PU46MrW+l$qASO|DxA^D!>vODU{1jq66vm+FH=ru3Z& zG0vsf%z9zDXOc>($LOHVq;%NE@cL0Tla4(__vPxNku5JAQsnmyA60n$8KwlR|(}544Uu&Jv9?UKfpr zoT{kw-R6s$9=oIA7YHfMDa4H;KW{J>>>eOTlmmQ7rGj4m4aFo8<15zL#mo547 zvI3n2;ywCGHpLYpCy1GRA8dI;q#!LvaZ=!2@ zpu`E0NXB_1n-1?>qegONLBl9Qe@dVWNKSj&4~AI_m1xT_fpL z2d2-vjzv;{EHpz_zou0p$d>UsQDRkAtsoZvxZnkIWqnct-)A8TSq^bq8s%LaTQTzk zj5ch@p%()RQG*6B18m~C4CTGt79myaX`H3*luhe~MZ8rbPT+Va9PiRs&UzGOqVRN< zL@2T!qQkNMZZhEKfM*ZH`4G&XUfKp}avmIov1b>NG_8 zOM)hzlhbq+nxcDDcSt4nVj39|ey8tH5c+m|Rfc q(0~7j;QNn!f`YvsJ^tTiPFP!5{;Q0+|2G$T{mwbLI+i%xdiD=xZt))g literal 0 HcmV?d00001 diff --git a/alpha-lab/imu-transformations/index.md b/alpha-lab/imu-transformations/index.md index 7a52248ca..1e40f49a0 100644 --- a/alpha-lab/imu-transformations/index.md +++ b/alpha-lab/imu-transformations/index.md @@ -6,15 +6,15 @@ meta: - name: twitter:card content: summary - name: twitter:image - content: "https://i.ytimg.com/vi/nt_zNSBMJWI/maxresdefault.jpg" + content: "https://i.ytimg.com/vi/DMvmCpCL1ZQ/maxresdefault.jpg" - name: twitter:player - content: "https://www.youtube.com/embed/jag9EQB7840" + content: "https://www.youtube.com/embed/DMvmCpCL1ZQ" - name: twitter:width content: "1280" - name: twitter:height content: "720" - property: og:image - content: "https://i.ytimg.com/vi/nt_zNSBMJWI/maxresdefault.jpg" + content: "https://i.ytimg.com/vi/DMvmCpCL1ZQ/maxresdefault.jpg" tags: [Neon, Cloud] --- @@ -32,7 +32,7 @@ import TagLinks from '@components/TagLinks.vue' Compare IMU and gaze data in the same coordinate system to better understand how people coordinate head and eye movements. ::: -Here, we will provide some code snippets that can assist when analyzing the IMU data from Neon. +Neon comes equipped with an IMU that can be used to determine head pose. Here, we will provide some code snippets that can assist when analyzing the IMU data from Neon. We will use Python with the NumPy and SciPy packages for the code snippets below. Let’s start by loading those: @@ -50,17 +50,29 @@ First, it is important to understand how the IMU data should be interpreted. The - X axis = cross-product of Y and Z, which is a vector pointing rightwards. - Rotations about this axis are called “pitch” and range from -90 to +90 degrees. Wearing Neon normally and sitting or standing upright roughly corresponds to a pitch of 0 degrees. Backward head tilt is positive pitch; forward head tilt is negative pitch -This coordinate system is known as the “global reference frame”. Here, we will refer to it as the world coordinate system. To be very exact, it is distinct from the IMU coordinate system. As the Neon module rotates, the IMU coordinate system rotates with it. The IMU actually measures the rotational difference between its coordinate system and the world coordinate system. +![Diagram of the three Euler orientation angles measured by Neon's IMU](./imu-pitch-yaw-roll-black.png) + +This coordinate system is known as the “global reference frame”. Here, we will refer to it as the world coordinate system. To be very exact, it is distinct from the IMU coordinate system - as the Neon module rotates, the IMU coordinate system rotates with it. The IMU actually measures the rotational difference between its coordinate system and the world coordinate system. + +::: tip +💡 Note that Neon can sit differently on each wearer’s face, such that the headset is not necessarily in line with the naso-occipital plane. For example, if the wearer is looking at magnetic North, the IMU might still report some deviation from neural orientation. +::: The gyroscope values give the rotational velocity of roll, yaw, and pitch in degrees/s (i.e., they provide the change over time of each of these quantities). -Note that Neon can sit differently on each wearer’s face, such that the headset is not necessarily in line with the naso-occiptal plane. For example, if the wearer is looking at magnetic North, the IMU might still report some deviation from neural orientation. +The acceleration values measure translational (i.e., linear) acceleration, in terms of g-force (units of g), along the X, Y, and Z axes of the IMU’s coordinate system. That is, the reference frame for specifying acceleration values rotates with the IMU. + +::: tip +💡 Note that [g-force](https://en.wikipedia.org/wiki/G-force) is not the same as free-fall acceleration due to gravity. For example, if you are standing on the surface of the Earth, then the g-force is equal and opposite to gravity, keeping you at rest. In that case, if you were wearing Neon normally and standing or sitting upright, then acceleration along the Z axis would be +1g, while it would be 0g along the X and Y axes. +::: + +It can be helpful to also try out our IMU visualization utility, [plimu](https://github.com/pupil-labs/plimu). This can assist in understanding the IMU data and the various coordinate systems. Now that we have laid out the relationship between the IMU and world coordinate systems, we can do some useful transformations. ## Obtain IMU heading vectors -An alternate representation of IMU data is a heading vector that points outwards from the center of the IMU. Neutral orientation of the IMU would correspond to a heading vector that points at magnetic North and that is oriented perpendicular to gravity. +An alternate representation of IMU data is a heading vector that points outwards from the center of the IMU. Neutral orientation of the IMU would correspond to a heading vector that points at magnetic North and that is oriented perpendicular to the line of gravity. Note that a neutral IMU heading vector is unlikely to be perfectly aligned with the floor. @@ -71,12 +83,12 @@ def imu_heading_in_world(imu_quaternions): Construct heading vectors from the IMU's quaternion values. Inputs: - - imu_quaternions (Nx4 np.array): A timeseries of quaternions - from Neon's IMU stream. + - imu_quaternions (Nx4 np.array): A timeseries of quaternions + from Neon's IMU stream. Returns: - - headings_in_world (Nx3 np.array): A timeseries of IMU heading vectors - in the world coordinate system. + - headings_in_world (Nx3 np.array): A timeseries of IMU heading vectors + in the world coordinate system. """ # We start by specifying the direction of a neutral heading vector @@ -85,13 +97,14 @@ def imu_heading_in_world(imu_quaternions): # This array contains a timeseries of transformation matrices, # as calculated from the IMU's timeseries of quaternions values. - # Each of these matrices sends points in the IMU coordinate system to their - # corresponding coordinates in the world coordinate system. - imu_to_world = R.from_quat(imu_quaternions).as_matrix() + # Each of these matrices are used to transform points in the IMU + # coordinate system to their corresponding coordinates in the world + # coordinate system. + imu_to_world_matrices = R.from_quat(imu_quaternions).as_matrix() # We now apply each transformation matrix to the neutral IMU heading vector # to obtain a timeseries of heading vectors in the world coordinate system. - headings_in_world = imu_to_world @ heading_neutral_in_imu_coords + headings_in_world = imu_to_world_matrices @ heading_neutral_in_imu_coords return headings_in_world ``` @@ -99,27 +112,37 @@ def imu_heading_in_world(imu_quaternions): ## Transform IMU acceleration data to world coordinates -We stated above that the Z axis of the world coordinate system is a vector pointing directly upwards, opposite gravity. However, the Z component of the IMU acceleration data points downwards, such that if you are standing on Earth, then positive acceleration values mean that you are accelerating towards the center of the Earth. The X and Y axes are the same and shared between the orientation and acceleration data provided by the IMU. The function below will transform the acceleration data to the world coordinate system described above. +We mentioned above that the IMU’s acceleration data are specified with respect to the IMU’s coordinate system. Sometimes, it can be useful to have the acceleration data specified in the world coordinate system instead. The function below will perform this transformation. + +### :::: details Code ```python -def imu_acceleration_in_world(accelerations_imu): +def imu_acceleration_in_world(imu_accelerations, imu_quaternions): """ Transform the IMU's acceleration values to the world coordinate system. Inputs: - - accelerations_imu (Nx3 np.array): Timeseries of acceleration data - from the IMU, where columns are in the order: accel_x, accel_y, accel_z. + - accelerations_imu (Nx3 np.array): A timeseries of acceleration data + from the IMU, where columns are in the order: "acceleration x", + "acceleration y", "acceleration z". + - imu_quaternions (Nx4 np.array): A timeseries of quaternions + from Neon's IMU stream. Returns: - accelerations_world (Nx3 np.array): Timeseries of acceleration data, expressed in the world coordinate system. """ - accelerations_world = accelerations_imu.copy() - accelerations_world[2] *= -1.0 + # This array contains a timeseries of transformation matrices, + # as calculated from the IMU's timeseries of quaternions values. + # Each of these matrices sends points in the IMU coordinate system to their + # corresponding coordinates in the world coordinate system. + imu_to_world_matrices = R.from_quat(imu_quaternions).as_matrix() - return accelerations_world + accelerations_world = [imu_to_world @ imu_acceleration for imu_to_world, imu_acceleration in zip(imu_to_world_matrices, imu_accelerations)] + + return np.array(accelerations_world) ``` :::: @@ -145,6 +168,9 @@ def gaze_scene_to_world(gaze_elevations, gaze_azimuths, imu_quaternions): The origin of the IMU coordinate system is the same as the origin of the world coordinate system. + + The code in this function is adapted from the `plimu` visualization utility: + https://github.com/pupil-labs/plimu/blob/8b94302982363b203dddea2b15f43c6da60e787e/src/pupil_labs/plimu/visualizer.py#L274-L279 This function makes use of the spherical_to_cartesian function, defined below, that converts 3D gaze rays from spherical coordinates @@ -164,42 +190,41 @@ def gaze_scene_to_world(gaze_elevations, gaze_azimuths, imu_quaternions): """ # The IMU and scene camera coordinate systems have a fixed - # 102 degree rotation offset. - # See: + # 102 degree rotation offset. See: # https://docs.pupil-labs.com/neon/data-collection/data-streams/#movement-imu-data imu_scene_rotation_diff = np.deg2rad(-90 - 12) - # This matrix send points in the scene camera coordinate - # system to their corresponding coordinates in the - # IMU coordinate system. + # This matrix is used to transform points in the scene + # camera coordinate system to their corresponding coordinates + # in the IMU coordinate system. scene_to_imu = np.array( [ [1.0, 0.0, 0.0], [ - 0.0, - np.cos(imu_scene_rotation_diff), - -np.sin(imu_scene_rotation_diff), + 0.0, + np.cos(imu_scene_rotation_diff), + -np.sin(imu_scene_rotation_diff), ], [ - 0.0, - np.sin(imu_scene_rotation_diff), - np.cos(imu_scene_rotation_diff), + 0.0, + np.sin(imu_scene_rotation_diff), + np.cos(imu_scene_rotation_diff), ], ] ) # Neon provides 3D gaze in spherical coordinates by default, - # so first transform the gaze data from spherical coordinates + # so we first transform the gaze data from spherical coordinates # to Cartesian coordinates. cart_gazes_in_scene = spherical_to_cartesian(gaze_elevations, gaze_azimuths) # Apply the transformation from the scene camera to the IMU coordinate system. - gazes_in_imu = scene_to_imu @ cart_gazes_in_scene + gazes_in_imu = scene_to_imu @ cart_gazes_in_scene.T # This array contains a timeseries of transformation matrices, # as calculated from the IMU's timeseries of quaternions values. - # Each of these matrices sends points in the IMU coordinate system to their - # corresponding coordinates in the world coordinate system. + # Each of these matrices are used to transform points in the IMU coordinate + # system to their corresponding coordinates in the world coordinate system. imu_to_world_matrices = R.from_quat(imu_quaternions).as_matrix() # Apply the transformations from the IMU to the world coordinate system. @@ -223,7 +248,7 @@ def spherical_to_cartesian(elevations, azimuths): vectors, in Cartesian coordinates, specified in the scene camera coordinate system. """ - + elevations_rad = np.deg2rad(elevations) azimuths_rad = np.deg2rad(azimuths) @@ -231,21 +256,22 @@ def spherical_to_cartesian(elevations, azimuths): # an elevation of 0 in traditional spherical coordinates would # correspond to Y = 1, so first we convert elevation to the # more traditional format. - elevations_rad = elevations_rad + np.pi / 2 + elevations_rad += np.pi / 2 # Azimuth of 0 in Neon system corresponds to X = 0, but # an azimuth of 0 in traditional spherical coordinates would # correspond to X = 1. Also, azimuth to the right in Neon is # more positive, whereas it is more negative in traditional spherical coordiantes. # So, first we convert azimuth to the more traditional format. - azimuths_rad = -azimuths_rad + np.pi / 2 - + azimuths_rad *= -1.0 + azimuths_rad += np.pi / 2 + cartesian_unit_vectors = np.array([ np.sin(elevations_rad) * np.cos(azimuths_rad), np.cos(elevations_rad), np.sin(elevations_rad) * np.sin(azimuths_rad), - ]) - + ]).T + return cartesian_unit_vectors ``` :::: @@ -267,35 +293,36 @@ imu_ts = imu["timestamp [ns]"] # We have more gaze datapoints (sampled at 200Hz) than # IMU datapoints (sampled at 110Hz), so linearly interpolate # the IMU datapoints to be congruent with gaze. -quats_x_resampled = np.interp(gaze_ts, imu_ts, imu["quaternion x"]) -quats_y_resampled = np.interp(gaze_ts, imu_ts, imu["quaternion y"]) -quats_z_resampled = np.interp(gaze_ts, imu_ts, imu["quaternion z"]) -quats_w_resampled = np.interp(gaze_ts, imu_ts, imu["quaternion w"]) - -quaternions_resampled = np.vstack( - [quats_x_resampled, quats_y_resampled, quats_z_resampled, quats_w_resampled] -).T - -accels_x_resampled = np.interp(gaze_ts, imu_ts, imu["acceleration x [G]"]) -accels_y_resampled = np.interp(gaze_ts, imu_ts, imu["acceleration y [G]"]) -accels_z_resampled = np.interp(gaze_ts, imu_ts, imu["acceleration z [G]"]) - -accelerations_resampled = np.vstack( - [accels_x_resampled, accels_y_resampled, accels_z_resampled] -).T +quaternions_resampled = np.array([ + np.interp(gaze_ts, imu_ts, imu["quaternion x"]), + np.interp(gaze_ts, imu_ts, imu["quaternion y"]), + np.interp(gaze_ts, imu_ts, imu["quaternion z"]), + np.interp(gaze_ts, imu_ts, imu["quaternion w"]), +]).T + +accelerations_resampled = np.array([ + np.interp(gaze_ts, imu_ts, imu["acceleration x [g]"]), + np.interp(gaze_ts, imu_ts, imu["acceleration y [g]"]), + np.interp(gaze_ts, imu_ts, imu["acceleration z [g]"]), +]).T # Now, we can apply the functions. imu_headings = imu_heading_in_world(quaternions_resampled) + world_gazes = gaze_scene_to_world( - gaze["elevation [deg]"], - gaze["azimuth [deg]"], - quaternions_resampled, + gaze["elevation [deg]"], + gaze["azimuth [deg]"], + quaternions_resampled, +) + +world_accelerations = imu_acceleration_in_world( + accelerations_resampled, + quaternions_resampled, ) -world_accelerations = imu_acceleration_in_world(accelerations_resampled) ``` :::: ::: tip -Need assistance with aligning your AprilTags or applying the transformations to your Reference Image Mapper recordings? Or do you have something more custom in mind? Reach out to us via email at [info@pupil-labs.com](mailto:info@pupil-labs.com), on our [Discord server](https://pupil-labs.com/chat/), or visit our [Support Page](https://pupil-labs.com/products/support/) for dedicated support options. +Need assistance with the IMU code in this article? Or do you have something more custom in mind? Reach out to us via email at [info@pupil-labs.com](mailto:info@pupil-labs.com), on our [Discord server](https://pupil-labs.com/chat/), or visit our [Support Page](https://pupil-labs.com/products/support/) for dedicated support options. ::: \ No newline at end of file diff --git a/alpha-lab/public/imu-transformations.webp b/alpha-lab/public/imu-transformations.webp new file mode 100644 index 0000000000000000000000000000000000000000..14f10f5dec586207a9b7bd55151af937599dd727 GIT binary patch literal 78386 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

RyAqc&WhMp$>b3R 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%0DRs+u6s5R!$X0`5Ftd82Ex-X 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 Date: Tue, 13 Aug 2024 01:16:26 +0200 Subject: [PATCH 05/54] add eyestate_to_world function --- alpha-lab/imu-transformations/index.md | 117 +++++++++++++++++++++++++ 1 file changed, 117 insertions(+) diff --git a/alpha-lab/imu-transformations/index.md b/alpha-lab/imu-transformations/index.md index 1e40f49a0..f02b622f4 100644 --- a/alpha-lab/imu-transformations/index.md +++ b/alpha-lab/imu-transformations/index.md @@ -276,6 +276,103 @@ def spherical_to_cartesian(elevations, azimuths): ``` :::: +## Represent IMU and 3D Eyestate data in the same coordinate system + +The [3D eyestate estimates](https://docs.pupil-labs.com/neon/data-collection/data-streams/#_3d-eye-states) provided by Neon are aligned with the scene camera coordinate system. This means we can reuse elements of the `gaze_scene_to_world` function to reconstruct the pose of the eyes as a wearer rotates their head. Essentially, you would be representing eyestate in the world coordinate system of the IMU. + +The function below performs that transformation for you, returning eyeball centers and optical axes in the world coordinate system. + +:::: details Code +```python +def eyestate_to_world(eyeball_centers, optical_axes, imu_quaternions): + """ + Transforms 3D eyestate data to the world coordinate system of the IMU. + + Note that the 3D eyestate data and the IMU quaternions should be sampled + at the same timestamps. You can linearly interpolate the IMU data + to ensure this. + + The origin of the IMU coordinate system is the same as the + origin of the world coordinate system. + + The code in this function is adapted from the `plimu` visualization utility: + https://github.com/pupil-labs/plimu/blob/8b94302982363b203dddea2b15f43c6da60e787e/src/pupil_labs/plimu/visualizer.py#L274-L279 + + Inputs: + - eyeball_centers (Nx3 np.array): A timeseries of eyeball center + estimates (mm) for one eye, as provided by Neon's 3D eyestate data stream. + - optical_axes (Nx3 np.array): A timeseries of optical axis estimates + (3D unit vectors) for the same eye, as provided by Neon's 3D eyestate data stream. + - imu_quaternions (Nx4 np.array): A timeseries of quaternion values from + Neon's IMU. + + Returns: + - eyeball_centers_in_world (Nx3 np.array): A timeseries of eyeball center + estimates (mm) for one eye, transformed to the world coordinate system of the IMU. + - optical_axes_in_world (Nx3 np.array): A timeseries of optical axis estimates + (3D unit vectors) for the same eye, transformed to the world coordinate system of the IMU. + """ + + # The eyeball centers are specified in terms of their distance from + # the center of the scene camera, so to accurately convert them to + # world coordinates, we need the position of the scene camera in + # the IMU coordinate system. Here, we express that position + # in millimeters. + scene_camera_position_in_imu = np.array([[0.0, -3.996, -11.172]]) + + # The coordinate system of 3D eyestate is aligned with + # the coordinate system of the scene camera, so we can + # make use of the scene->to->IMU transformation procedure. + # + # The IMU and scene camera coordinate systems have a fixed + # 102 degree rotation offset. See here: + # https://docs.pupil-labs.com/neon/data-collection/data-streams/#movement-imu-data + imu_scene_rotation_diff = np.deg2rad(-90 - 12) + + # This matrix is used to transform points in the scene + # camera coordinate system to their corresponding coordinates + # in the IMU coordinate system. + scene_to_imu = np.array( + [ + [1.0, 0.0, 0.0], + [ + 0.0, + np.cos(imu_scene_rotation_diff), + -np.sin(imu_scene_rotation_diff), + ], + [ + 0.0, + np.sin(imu_scene_rotation_diff), + np.cos(imu_scene_rotation_diff), + ], + ] + ) + + # Convert the coordinates of the eyeball center and optical axes + # to the IMU coordinate system. + eyeball_centers_in_imu = scene_to_imu @ eyeball_centers.T + optical_axes_in_imu = scene_to_imu @ optical_axes.T + + # Take into account that the scene camera is offset from the IMU. + eyeball_centers_in_imu[0, :] += scene_cam_in_imu[0] + eyeball_centers_in_imu[1, :] += scene_cam_in_imu[1] + eyeball_centers_in_imu[2, :] += scene_cam_in_imu[2] + + # This array contains a timeseries of transformation matrices, + # as calculated from the IMU's timeseries of quaternions values. + # Each of these matrices are used to transform points in the IMU + # coordinate system to their corresponding coordinates in the world + # coordinate system. + imu_to_world_matrices = R.from_quat(imu_quaternions).as_matrix() + + # Apply the transformations from the IMU to the world coordinate system. + eyeball_centers_in_world = [imu_to_world @ eye_center for imu_to_world, eye_center in zip(imu_to_world_matrices, eyeball_centers_in_imu.T)] + optical_axes_in_world = [imu_to_world @ optical_axis for imu_to_world, optical_axis in zip(imu_to_world_matrices, optical_axes_in_imu.T)] + + return eyeball_centers_in_world, optical_axes_in_world +``` +:::: + ## Analysis example Below is a brief example of running these commands on values from Pupil Cloud. @@ -285,9 +382,11 @@ Below is a brief example of running these commands on values from Pupil Cloud. import pandas as pd gaze = pd.read_csv("gaze.csv") +eye3d = pd.read_csv("3d_eye_states.csv") imu = pd.read_csv("imu.csv") gaze_ts = gaze["timestamp [ns]"] +eye3d_ts = eye3d["timestamp [ns]"] imu_ts = imu["timestamp [ns]"] # We have more gaze datapoints (sampled at 200Hz) than @@ -306,6 +405,18 @@ accelerations_resampled = np.array([ np.interp(gaze_ts, imu_ts, imu["acceleration z [g]"]), ]).T +optical_axes_left = np.array([ + eye3d["optical axis left x"], + eye3d["optical axis left y"], + eye3d["optical axis left z"], +]).T + +eyeball_centers_left = np.array([ + eye3d["eyeball center left x [mm]"], + eye3d["eyeball center left y [mm]"], + eye3d["eyeball center left z [mm]"], +]).T + # Now, we can apply the functions. imu_headings = imu_heading_in_world(quaternions_resampled) @@ -316,6 +427,12 @@ world_gazes = gaze_scene_to_world( quaternions_resampled, ) +eye_centers_left_world, optical_axes_left_world = eyestate_to_world( + eyeball_centers_left, + optical_axes_left, + quaternions_resampled, +) + world_accelerations = imu_acceleration_in_world( accelerations_resampled, quaternions_resampled, From 8ea73ad44090302def074ad975f332029e67ea66 Mon Sep 17 00:00:00 2001 From: Robert Ennis Date: Thu, 15 Aug 2024 11:31:06 +0200 Subject: [PATCH 06/54] add cartesian_to_spherical_world function and some explanation; small cleanup based on test/validations --- alpha-lab/imu-transformations/index.md | 68 +++++++++++++++++++++++--- 1 file changed, 61 insertions(+), 7 deletions(-) diff --git a/alpha-lab/imu-transformations/index.md b/alpha-lab/imu-transformations/index.md index f02b622f4..668ba5db0 100644 --- a/alpha-lab/imu-transformations/index.md +++ b/alpha-lab/imu-transformations/index.md @@ -216,7 +216,7 @@ def gaze_scene_to_world(gaze_elevations, gaze_azimuths, imu_quaternions): # Neon provides 3D gaze in spherical coordinates by default, # so we first transform the gaze data from spherical coordinates # to Cartesian coordinates. - cart_gazes_in_scene = spherical_to_cartesian(gaze_elevations, gaze_azimuths) + cart_gazes_in_scene = spherical_to_cartesian_scene(gaze_elevations, gaze_azimuths) # Apply the transformation from the scene camera to the IMU coordinate system. gazes_in_imu = scene_to_imu @ cart_gazes_in_scene.T @@ -233,7 +233,7 @@ def gaze_scene_to_world(gaze_elevations, gaze_azimuths, imu_quaternions): return np.array(gazes_in_world) -def spherical_to_cartesian(elevations, azimuths): +def spherical_to_cartesian_scene(elevations, azimuths): """ Convert Neon's spherical representation of 3D gaze to Cartesian coordinates. @@ -318,7 +318,7 @@ def eyestate_to_world(eyeball_centers, optical_axes, imu_quaternions): # world coordinates, we need the position of the scene camera in # the IMU coordinate system. Here, we express that position # in millimeters. - scene_camera_position_in_imu = np.array([[0.0, -3.996, -11.172]]) + scene_camera_position_in_imu = np.array([0.0, -3.996, -11.172]) # The coordinate system of 3D eyestate is aligned with # the coordinate system of the scene camera, so we can @@ -354,9 +354,9 @@ def eyestate_to_world(eyeball_centers, optical_axes, imu_quaternions): optical_axes_in_imu = scene_to_imu @ optical_axes.T # Take into account that the scene camera is offset from the IMU. - eyeball_centers_in_imu[0, :] += scene_cam_in_imu[0] - eyeball_centers_in_imu[1, :] += scene_cam_in_imu[1] - eyeball_centers_in_imu[2, :] += scene_cam_in_imu[2] + eyeball_centers_in_imu[0, :] += scene_camera_position_in_imu[0] + eyeball_centers_in_imu[1, :] += scene_camera_position_in_imu[1] + eyeball_centers_in_imu[2, :] += scene_camera_position_in_imu[2] # This array contains a timeseries of transformation matrices, # as calculated from the IMU's timeseries of quaternions values. @@ -369,7 +369,59 @@ def eyestate_to_world(eyeball_centers, optical_axes, imu_quaternions): eyeball_centers_in_world = [imu_to_world @ eye_center for imu_to_world, eye_center in zip(imu_to_world_matrices, eyeball_centers_in_imu.T)] optical_axes_in_world = [imu_to_world @ optical_axis for imu_to_world, optical_axis in zip(imu_to_world_matrices, optical_axes_in_imu.T)] - return eyeball_centers_in_world, optical_axes_in_world + return np.array(eyeball_centers_in_world), np.array(optical_axes_in_world) +``` +:::: + +## Convert (Cartesian) world points to spherical coordinates + +When studying head orientation and gaze orientation as observers navigate a 3D environment, it can be useful to know how much these quantities deviate from pointing at a given landmark. For instance, you might want to know when someone’s gaze or heading deviates from pointing at the horizon. This can be simplified by representing data in spherical coordinates. The orientation values from the IMU are already in such a format. For the values returned by gaze_scene_to_world, the function below will do the necessary transformation. When wearing Neon normally, then an elevation and azimuth of 0 degrees corresponds to keeping your head neutral while gazing at the horizon. + +:::: details Code +```python +def cartesian_to_spherical_world(world_points_3d): + """ + Convert points 3D Cartesian world coordinates to spherical coordinates. + + The origin of world coordinate system is the same as the origin of the + IMU coordinate system. + + When wearing Neon normally, then an elevation and azimuth of 0 degrees corresponds to keeping your head neutral while gazing at the horizon. + + Inputs: + - world_points_3d (Nx3 np.array): A collection of 3D points in + Cartesian world coordinates. + + Returns: + - elevation (Nx1 np.array): The corresponding elevation value, in radians, + for each 3D world point (i.e., vertical rotation away from neutral orientation). + Note: neutral orientation = 0 elevation; orientation upwards is positive; + orientation downwards is negative. + - azimuth (Nx1 np.array): The corresponding azimuth value, in radians, for + each 3D world point (i.e., horizontal rotation away from neutral orientation). + Note: neutral orientation = 0 azimuth, orientation rightwards is negative; + orientation leftwards is positive. + """ + + x = world_points_3d[:, 0] + y = world_points_3d[:, 1] + z = world_points_3d[:, 2] + + radii = np.sqrt(x**2 + y**2 + z**2) + + elevation = -(np.arccos(z / radii) - np.pi / 2) + azimuth = np.arctan2(y, x) - np.pi/2 + + # Keep all azimuth values in the range of [-180, 180] to remain consistent + # with the yaw orientation values provided by the IMU + azimuth[azimuth < -np.pi] += 2 * np.pi + azimuth[azimuth > np.pi] -= 2 * np.pi + + # Convert from radians to degrees + elevation = np.rad2deg(elevation) + azimuth = np.rad2deg(azimuth) + + return elevation, azimuth ``` :::: @@ -437,6 +489,8 @@ world_accelerations = imu_acceleration_in_world( accelerations_resampled, quaternions_resampled, ) + +gaze_elevations_world, gaze_azimuths_world = cartesian_to_spherical_world(world_gazes) ``` :::: From 43a8e7dbc93fd82bedb1ab044e15eab9130818fa Mon Sep 17 00:00:00 2001 From: N-M-T Date: Fri, 16 Aug 2024 12:11:05 +0800 Subject: [PATCH 07/54] @n-m-t 's edits --- alpha-lab/.vitepress/config.mts | 6 ++ alpha-lab/cards.json | 4 +- alpha-lab/imu-transformations/index.md | 97 +++++++++++++++----------- 3 files changed, 64 insertions(+), 43 deletions(-) diff --git a/alpha-lab/.vitepress/config.mts b/alpha-lab/.vitepress/config.mts index e98080c8a..7d4e663fc 100644 --- a/alpha-lab/.vitepress/config.mts +++ b/alpha-lab/.vitepress/config.mts @@ -6,6 +6,12 @@ import { config as default_config, theme_config as default_theme_config } from " let theme_config_additions = { sidebar: [ { text: "Welcome", link: "/" }, + { + text: "Coordinate Systems", + items: [ + { text: "IMU Transformations", link: "/imu-transformations/" }, + ], + }, { text: "Gaze Mapping", items: [ diff --git a/alpha-lab/cards.json b/alpha-lab/cards.json index 38b816834..ed602bfed 100644 --- a/alpha-lab/cards.json +++ b/alpha-lab/cards.json @@ -150,8 +150,8 @@ "category": "Gaze Mapping" }, { - "title": "IMU Coordinate System Snippets", - "details": "Use values from the IMU to express your data in a world reference frame.", + "title": "IMU Transformations", + "details": "Transform IMU data into different representations and coordinate systems with these code snippets.", "link": { "text": "View", "href": "/alpha-lab/imu-transformations/" diff --git a/alpha-lab/imu-transformations/index.md b/alpha-lab/imu-transformations/index.md index 668ba5db0..aa3fba931 100644 --- a/alpha-lab/imu-transformations/index.md +++ b/alpha-lab/imu-transformations/index.md @@ -1,6 +1,6 @@ --- -title: "IMU Coordinate System Snippets" -description: "Use values from the IMU to express your data in a world reference frame." +title: "Transform IMU Data" +description: "Transform IMU data into different representations and coordinate systems." permalink: /alpha-lab/imu-transformations/ meta: - name: twitter:card @@ -22,59 +22,73 @@ tags: [Neon, Cloud] import TagLinks from '@components/TagLinks.vue' -# IMU Coordinate System Snippets +# IMU Transformations ::: tip -Compare IMU and gaze data in the same coordinate system to better understand how people coordinate head and eye movements. +Want to compare IMU and gaze data in the same coordinate system to better understand how people coordinate +head and eye movements? The transformation functions in this tutorial will show you how! ::: -Neon comes equipped with an IMU that can be used to determine head pose. Here, we will provide some code snippets that can assist when analyzing the IMU data from Neon. +This guide contains various transformation functions that can assist when analysing Neon's IMU data. -We will use Python with the NumPy and SciPy packages for the code snippets below. Let’s start by loading those: +First, it's important to understand how the IMU data should be interpreted. +The [orientation readings of the calibrated IMU](https://docs.pupil-labs.com/neon/data-collection/data-streams/#movement-imu-data) +are specified with respect to magnetic North and gravity. We will refer to this as the 'world coordinate system'. -```python -import numpy as np -from scipy.spatial.transform import Rotation as R -``` - -First, it is important to understand how the IMU data should be interpreted. The [orientation readings of the calibrated IMU](https://docs.pupil-labs.com/neon/data-collection/data-streams/#movement-imu-data) are specified with respect to magnetic North and gravity: +To be exact, the 'world coordinate system' is distinct from the 'IMU coordinate system' - as the Neon module rotates, +the IMU coordinate system rotates with it. The IMU actually measures the rotational difference between its coordinate +system and the world coordinate system. - Y axis = vector pointing towards magnetic North. - - Rotations about this axis are called “roll” and range from -180 to +180 degrees. Wearing Neon normally and sitting or standing upright roughly corresponds to a roll of 0 degrees. Rightward head tilt is positive roll; leftward head tilt is negative roll. + - Rotations about this axis are called “roll” and range from -180 to +180 degrees. Wearing Neon normally in an upright position roughly corresponds to a roll of 0 degrees. Rightward head tilt is positive roll; leftward head tilt is negative roll. - Z axis = vector pointing upwards, opposite to the direction of gravity. - Rotations about this axis are called “yaw” and range from -180 to +180 degrees. When the IMU is calibrated, a Neon module oriented at magnetic North corresponds to a yaw of 0 degrees. Leftward head turn is positive yaw; rightward head turn is negative yaw. - X axis = cross-product of Y and Z, which is a vector pointing rightwards. - - Rotations about this axis are called “pitch” and range from -90 to +90 degrees. Wearing Neon normally and sitting or standing upright roughly corresponds to a pitch of 0 degrees. Backward head tilt is positive pitch; forward head tilt is negative pitch + - Rotations about this axis are called “pitch” and range from -90 to +90 degrees. Wearing Neon normally in an upright position roughly corresponds to a pitch of 0 degrees. Backward head tilt is positive pitch; forward head tilt is negative pitch ![Diagram of the three Euler orientation angles measured by Neon's IMU](./imu-pitch-yaw-roll-black.png) -This coordinate system is known as the “global reference frame”. Here, we will refer to it as the world coordinate system. To be very exact, it is distinct from the IMU coordinate system - as the Neon module rotates, the IMU coordinate system rotates with it. The IMU actually measures the rotational difference between its coordinate system and the world coordinate system. - ::: tip -💡 Note that Neon can sit differently on each wearer’s face, such that the headset is not necessarily in line with the naso-occipital plane. For example, if the wearer is looking at magnetic North, the IMU might still report some deviation from neural orientation. +💡 Note that Neon can sit differently on each wearer’s face, such that the headset is not necessarily in +line with a given plane. For example, if the wearer is facing magnetic North, the IMU might +still report some deviation from neural orientation. ::: -The gyroscope values give the rotational velocity of roll, yaw, and pitch in degrees/s (i.e., they provide the change over time of each of these quantities). +The gyroscope values give the rotational velocity of roll, yaw, and pitch in degrees/s (i.e., they provide the change +over time of each of these quantities). + +The acceleration values measure translational (i.e., linear) acceleration, in terms of g-force (units of g), +along the X, Y, and Z axes of the IMU’s coordinate system. The reference frame for specifying acceleration values +rotates with the IMU. + -The acceleration values measure translational (i.e., linear) acceleration, in terms of g-force (units of g), along the X, Y, and Z axes of the IMU’s coordinate system. That is, the reference frame for specifying acceleration values rotates with the IMU. ::: tip -💡 Note that [g-force](https://en.wikipedia.org/wiki/G-force) is not the same as free-fall acceleration due to gravity. For example, if you are standing on the surface of the Earth, then the g-force is equal and opposite to gravity, keeping you at rest. In that case, if you were wearing Neon normally and standing or sitting upright, then acceleration along the Z axis would be +1g, while it would be 0g along the X and Y axes. +💡 [g-force](https://en.wikipedia.org/wiki/G-force) is not the same as free-fall acceleration due +to gravity. For example, if you are standing on the surface of the Earth, then the g-force is equal and +opposite to gravity, keeping you at rest. In that case, if you were wearing Neon normally in an upright position, then +acceleration along the Z axis would be +1g, while it would be 0g along the X and Y axes. ::: It can be helpful to also try out our IMU visualization utility, [plimu](https://github.com/pupil-labs/plimu). This can assist in understanding the IMU data and the various coordinate systems. -Now that we have laid out the relationship between the IMU and world coordinate systems, we can do some useful transformations. +Now that we have laid out the relationship between the IMU and world coordinate systems, and how to interpret the +readings, we can do some useful transformations. -## Obtain IMU heading vectors +We will use Python with the NumPy and SciPy packages for the code snippets below. Let’s start by importing those: -An alternate representation of IMU data is a heading vector that points outwards from the center of the IMU. Neutral orientation of the IMU would correspond to a heading vector that points at magnetic North and that is oriented perpendicular to the line of gravity. +```python +import numpy as np +from scipy.spatial.transform import Rotation as R +``` -Note that a neutral IMU heading vector is unlikely to be perfectly aligned with the floor. +## Obtain IMU Heading Vectors + +An alternate representation of IMU data is a heading vector that points outwards from the center of the IMU. Neutral orientation of the IMU would correspond to a heading vector that points at magnetic North and that is oriented perpendicular to the line of gravity. :::: details Code ```python @@ -110,7 +124,7 @@ def imu_heading_in_world(imu_quaternions): ``` :::: -## Transform IMU acceleration data to world coordinates +## Transform IMU Acceleration Data to World Coordinates We mentioned above that the IMU’s acceleration data are specified with respect to the IMU’s coordinate system. Sometimes, it can be useful to have the acceleration data specified in the world coordinate system instead. The function below will perform this transformation. @@ -148,13 +162,10 @@ def imu_acceleration_in_world(imu_accelerations, imu_quaternions): ## Represent IMU and Gaze Data in the Same Coordinate System -Neon simultaneously records gaze and IMU data, making it possible to study the relationship between head and eye movements. +Neon simultaneously records gaze and IMU data, making it possible to study the relationship between head and +eye movements. -To facilitate comparison of gaze and head rotations, it can sometimes be easier to represent them in the same coordinate system. The coordinates of gaze are specified with respect to the scene camera coordinate system and the function below, `gaze_scene_to_world`, uses data from the IMU to transform gaze to the world coordinate system. - -::: tip -💡 Reminder: The world coordinate system is defined by the direction away from the center of gravity, as well as the direction towards magnetic North. -::: +To facilitate the comparison, it can be useful to represent them in the same coordinate system. The coordinates of gaze are specified with respect to the scene camera coordinate system and the function below, `gaze_scene_to_world`, uses data from the IMU to transform gaze to the world coordinate system. :::: details Code ```python @@ -276,17 +287,17 @@ def spherical_to_cartesian_scene(elevations, azimuths): ``` :::: -## Represent IMU and 3D Eyestate data in the same coordinate system +## Represent IMU and 3D Eyestate in the Same Coordinate System -The [3D eyestate estimates](https://docs.pupil-labs.com/neon/data-collection/data-streams/#_3d-eye-states) provided by Neon are aligned with the scene camera coordinate system. This means we can reuse elements of the `gaze_scene_to_world` function to reconstruct the pose of the eyes as a wearer rotates their head. Essentially, you would be representing eyestate in the world coordinate system of the IMU. - -The function below performs that transformation for you, returning eyeball centers and optical axes in the world coordinate system. +The [3D eyestate estimates](https://docs.pupil-labs.com/neon/data-collection/data-streams/#_3d-eye-states) +provided by Neon are aligned with the scene camera coordinate system. This means we can reuse elements of +the `gaze_scene_to_world` function to reconstruct the pose of the eyes in the world coordinate system. :::: details Code ```python def eyestate_to_world(eyeball_centers, optical_axes, imu_quaternions): """ - Transforms 3D eyestate data to the world coordinate system of the IMU. + Transforms 3D eyestate data to the world coordinate system. Note that the 3D eyestate data and the IMU quaternions should be sampled at the same timestamps. You can linearly interpolate the IMU data @@ -373,9 +384,15 @@ def eyestate_to_world(eyeball_centers, optical_axes, imu_quaternions): ``` :::: -## Convert (Cartesian) world points to spherical coordinates +## Convert (Cartesian) World Points to Spherical Coordinates -When studying head orientation and gaze orientation as observers navigate a 3D environment, it can be useful to know how much these quantities deviate from pointing at a given landmark. For instance, you might want to know when someone’s gaze or heading deviates from pointing at the horizon. This can be simplified by representing data in spherical coordinates. The orientation values from the IMU are already in such a format. For the values returned by gaze_scene_to_world, the function below will do the necessary transformation. When wearing Neon normally, then an elevation and azimuth of 0 degrees corresponds to keeping your head neutral while gazing at the horizon. +When studying head orientation and gaze orientation as observers navigate a 3D environment, it can be useful +to know how much these quantities deviate from pointing at a given landmark. For instance, you might want to +know when someone’s gaze or heading deviates from pointing at the horizon. This can be simplified by +representing data in spherical coordinates. The orientation values from the IMU are already in such a format. +For the values returned by `gaze_scene_to_world`, the function below will do the necessary transformation. +When wearing Neon normally, then an elevation and azimuth of 0 degrees corresponds to keeping your head +neutral while gazing at the horizon. :::: details Code ```python @@ -427,12 +444,10 @@ def cartesian_to_spherical_world(world_points_3d): ## Analysis example -Below is a brief example of running these commands on values from Pupil Cloud. +Below is a brief example of how to run the functions on this page using IMU data downloaded from Pupil Cloud. :::: details Code ```python -import pandas as pd - gaze = pd.read_csv("gaze.csv") eye3d = pd.read_csv("3d_eye_states.csv") imu = pd.read_csv("imu.csv") From 6c5841dc839b45ec7d41621ed1b7e8d36af987d1 Mon Sep 17 00:00:00 2001 From: "Neil M. Thomas" Date: Fri, 16 Aug 2024 12:19:06 +0800 Subject: [PATCH 08/54] Update index.md --- alpha-lab/imu-transformations/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/alpha-lab/imu-transformations/index.md b/alpha-lab/imu-transformations/index.md index aa3fba931..1e407db5f 100644 --- a/alpha-lab/imu-transformations/index.md +++ b/alpha-lab/imu-transformations/index.md @@ -55,7 +55,7 @@ system and the world coordinate system. ::: tip 💡 Note that Neon can sit differently on each wearer’s face, such that the headset is not necessarily in line with a given plane. For example, if the wearer is facing magnetic North, the IMU might -still report some deviation from neural orientation. +still report some deviation from a neutral orientation. ::: The gyroscope values give the rotational velocity of roll, yaw, and pitch in degrees/s (i.e., they provide the change @@ -511,4 +511,4 @@ gaze_elevations_world, gaze_azimuths_world = cartesian_to_spherical_world(world_ ::: tip Need assistance with the IMU code in this article? Or do you have something more custom in mind? Reach out to us via email at [info@pupil-labs.com](mailto:info@pupil-labs.com), on our [Discord server](https://pupil-labs.com/chat/), or visit our [Support Page](https://pupil-labs.com/products/support/) for dedicated support options. -::: \ No newline at end of file +::: From 19a6d1fc764c2d79eee51319f9e20a75b78b112b Mon Sep 17 00:00:00 2001 From: "Neil M. Thomas" Date: Fri, 16 Aug 2024 13:09:22 +0800 Subject: [PATCH 09/54] Update index.md --- alpha-lab/imu-transformations/index.md | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/alpha-lab/imu-transformations/index.md b/alpha-lab/imu-transformations/index.md index 1e407db5f..e9cc8b5af 100644 --- a/alpha-lab/imu-transformations/index.md +++ b/alpha-lab/imu-transformations/index.md @@ -40,7 +40,7 @@ The [orientation readings of the calibrated IMU](https://docs.pupil-labs.com/neo are specified with respect to magnetic North and gravity. We will refer to this as the 'world coordinate system'. To be exact, the 'world coordinate system' is distinct from the 'IMU coordinate system' - as the Neon module rotates, -the IMU coordinate system rotates with it. The IMU actually measures the rotational difference between its coordinate +the IMU coordinate system rotates with it. The IMU's orientation readings actually specify the rotational difference between its coordinate system and the world coordinate system. - Y axis = vector pointing towards magnetic North. @@ -58,15 +58,13 @@ line with a given plane. For example, if the wearer is facing magnetic North, th still report some deviation from a neutral orientation. ::: -The gyroscope values give the rotational velocity of roll, yaw, and pitch in degrees/s (i.e., they provide the change -over time of each of these quantities). +The raw gyroscope values give the rotational velocity about the X, Y, and Z axes of the IMU’s coordinate system. Their units are degrees/s (i.e., they provide the change +over time of each of these quantities). The reference frame for specifying rotational velocities rotates with the IMU. -The acceleration values measure translational (i.e., linear) acceleration, in terms of g-force (units of g), +The raw acceleration values measure translational (i.e., linear) acceleration, in terms of g-force (units of g), along the X, Y, and Z axes of the IMU’s coordinate system. The reference frame for specifying acceleration values rotates with the IMU. - - ::: tip 💡 [g-force](https://en.wikipedia.org/wiki/G-force) is not the same as free-fall acceleration due to gravity. For example, if you are standing on the surface of the Earth, then the g-force is equal and From a860f452ce1f20e9df8eea95ee6e0a3d3fe97450 Mon Sep 17 00:00:00 2001 From: "Neil M. Thomas" Date: Fri, 16 Aug 2024 18:06:17 +0800 Subject: [PATCH 10/54] Add YT link --- alpha-lab/imu-transformations/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/alpha-lab/imu-transformations/index.md b/alpha-lab/imu-transformations/index.md index e9cc8b5af..54a42042d 100644 --- a/alpha-lab/imu-transformations/index.md +++ b/alpha-lab/imu-transformations/index.md @@ -26,7 +26,7 @@ import TagLinks from '@components/TagLinks.vue' - + ::: tip Want to compare IMU and gaze data in the same coordinate system to better understand how people coordinate From b499ddd7defd2893ee78cd40be14a1b28e355e54 Mon Sep 17 00:00:00 2001 From: "Neil M. Thomas" Date: Fri, 16 Aug 2024 18:21:08 +0800 Subject: [PATCH 11/54] Remove YT link --- alpha-lab/imu-transformations/index.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/alpha-lab/imu-transformations/index.md b/alpha-lab/imu-transformations/index.md index 54a42042d..7647ffc19 100644 --- a/alpha-lab/imu-transformations/index.md +++ b/alpha-lab/imu-transformations/index.md @@ -26,8 +26,6 @@ import TagLinks from '@components/TagLinks.vue' - - ::: tip Want to compare IMU and gaze data in the same coordinate system to better understand how people coordinate head and eye movements? The transformation functions in this tutorial will show you how! From 3ba910fd8035ab969fb9733999d27c259e6498c1 Mon Sep 17 00:00:00 2001 From: Robert Ennis Date: Mon, 19 Aug 2024 10:46:53 +0200 Subject: [PATCH 12/54] fix some typo's, clarify meaning of spherical coordinates in world system a bit better --- alpha-lab/imu-transformations/index.md | 47 ++++++++++++++------------ 1 file changed, 26 insertions(+), 21 deletions(-) diff --git a/alpha-lab/imu-transformations/index.md b/alpha-lab/imu-transformations/index.md index 7647ffc19..bfb8a421d 100644 --- a/alpha-lab/imu-transformations/index.md +++ b/alpha-lab/imu-transformations/index.md @@ -97,8 +97,8 @@ def imu_heading_in_world(imu_quaternions): from Neon's IMU stream. Returns: - - headings_in_world (Nx3 np.array): A timeseries of IMU heading vectors - in the world coordinate system. + - headings_in_world (Nx3 np.array): The corresponding timeseries of + IMU heading vectors in the world coordinate system. """ # We start by specifying the direction of a neutral heading vector @@ -140,8 +140,8 @@ def imu_acceleration_in_world(imu_accelerations, imu_quaternions): from Neon's IMU stream. Returns: - - accelerations_world (Nx3 np.array): Timeseries of acceleration data, - expressed in the world coordinate system. + - accelerations_world (Nx3 np.array): The corresponding timeseries of + acceleration data, expressed in the world coordinate system. """ # This array contains a timeseries of transformation matrices, @@ -179,7 +179,7 @@ def gaze_scene_to_world(gaze_elevations, gaze_azimuths, imu_quaternions): The code in this function is adapted from the `plimu` visualization utility: https://github.com/pupil-labs/plimu/blob/8b94302982363b203dddea2b15f43c6da60e787e/src/pupil_labs/plimu/visualizer.py#L274-L279 - This function makes use of the spherical_to_cartesian function, + This function makes use of the spherical_to_cartesian_scene function, defined below, that converts 3D gaze rays from spherical coordinates to Cartesian coordinates. @@ -192,8 +192,8 @@ def gaze_scene_to_world(gaze_elevations, gaze_azimuths, imu_quaternions): from Neon's IMU. Returns: - - gazes_in_world (Nx3 np.array): A timeseries of 3D Cartesian gaze - unit vectors, specified in the world coordinate system. + - gazes_in_world (Nx3 np.array): The corresponding timeseries of + 3D Cartesian gaze unit vectors, specified in the world coordinate system. """ # The IMU and scene camera coordinate systems have a fixed @@ -314,10 +314,12 @@ def eyestate_to_world(eyeball_centers, optical_axes, imu_quaternions): Neon's IMU. Returns: - - eyeball_centers_in_world (Nx3 np.array): A timeseries of eyeball center - estimates (mm) for one eye, transformed to the world coordinate system of the IMU. - - optical_axes_in_world (Nx3 np.array): A timeseries of optical axis estimates - (3D unit vectors) for the same eye, transformed to the world coordinate system of the IMU. + - eyeball_centers_in_world (Nx3 np.array): The corresponding timeseries of + eyeball center estimates (mm) for one eye, transformed to the world coordinate + system of the IMU. + - optical_axes_in_world (Nx3 np.array): The corresponding timeseries of optical + axis estimates (3D unit vectors) for the same eye, transformed to the world + coordinate system of the IMU. """ # The eyeball centers are specified in terms of their distance from @@ -325,7 +327,7 @@ def eyestate_to_world(eyeball_centers, optical_axes, imu_quaternions): # world coordinates, we need the position of the scene camera in # the IMU coordinate system. Here, we express that position # in millimeters. - scene_camera_position_in_imu = np.array([0.0, -3.996, -11.172]) + scene_camera_position_in_imu = np.array([0.0, -1.3, -6.62]) # The coordinate system of 3D eyestate is aligned with # the coordinate system of the scene camera, so we can @@ -385,10 +387,10 @@ def eyestate_to_world(eyeball_centers, optical_axes, imu_quaternions): When studying head orientation and gaze orientation as observers navigate a 3D environment, it can be useful to know how much these quantities deviate from pointing at a given landmark. For instance, you might want to know when someone’s gaze or heading deviates from pointing at the horizon. This can be simplified by -representing data in spherical coordinates. The orientation values from the IMU are already in such a format. +converting world points from Cartesian to spherical coordinates. The orientation values from the IMU are already in such a format. For the values returned by `gaze_scene_to_world`, the function below will do the necessary transformation. -When wearing Neon normally, then an elevation and azimuth of 0 degrees corresponds to keeping your head -neutral while gazing at the horizon. +When wearing Neon normally, then an elevation and azimuth of 0 degrees corresponds to a neutral orientation: +i.e., aimed at magnetic North and parallel to the horizon. :::: details Code ```python @@ -396,24 +398,25 @@ def cartesian_to_spherical_world(world_points_3d): """ Convert points 3D Cartesian world coordinates to spherical coordinates. - The origin of world coordinate system is the same as the origin of the + The origin of the world coordinate system is the same as the origin of the IMU coordinate system. - When wearing Neon normally, then an elevation and azimuth of 0 degrees corresponds to keeping your head neutral while gazing at the horizon. + When wearing Neon normally, then an elevation and azimuth of 0 degrees corresponds + to a neutral orientation: i.e., aimed at magnetic North and parallel to the horizon. Inputs: - world_points_3d (Nx3 np.array): A collection of 3D points in Cartesian world coordinates. Returns: - - elevation (Nx1 np.array): The corresponding elevation value, in radians, + - elevation (Nx1 np.array): The corresponding elevation value, in degrees, for each 3D world point (i.e., vertical rotation away from neutral orientation). Note: neutral orientation = 0 elevation; orientation upwards is positive; orientation downwards is negative. - - azimuth (Nx1 np.array): The corresponding azimuth value, in radians, for + - azimuth (Nx1 np.array): The corresponding azimuth value, in degrees, for each 3D world point (i.e., horizontal rotation away from neutral orientation). - Note: neutral orientation = 0 azimuth, orientation rightwards is negative; - orientation leftwards is positive. + Note: neutral orientation = 0 azimuth, orientation leftwards is positive; + orientation rightwards is negative. """ x = world_points_3d[:, 0] @@ -468,6 +471,8 @@ accelerations_resampled = np.array([ np.interp(gaze_ts, imu_ts, imu["acceleration z [g]"]), ]).T +# Put the eyestate data in a format that is compatible with +# the transformation functions from this article. optical_axes_left = np.array([ eye3d["optical axis left x"], eye3d["optical axis left y"], From ca541bac10425104e70c51a3dbc589849d122c96 Mon Sep 17 00:00:00 2001 From: Robert Ennis Date: Wed, 21 Aug 2024 08:48:27 +0200 Subject: [PATCH 13/54] try out code snippets vitepress extension --- alpha-lab/imu-transformations/index.md | 48 +++++-------------- .../pl_imu_transformations.py | 40 ++++++++++++++++ 2 files changed, 51 insertions(+), 37 deletions(-) create mode 100644 alpha-lab/imu-transformations/pl_imu_transformations.py diff --git a/alpha-lab/imu-transformations/index.md b/alpha-lab/imu-transformations/index.md index bfb8a421d..21e94ac8d 100644 --- a/alpha-lab/imu-transformations/index.md +++ b/alpha-lab/imu-transformations/index.md @@ -75,50 +75,24 @@ It can be helpful to also try out our IMU visualization utility, [plimu](https:/ Now that we have laid out the relationship between the IMU and world coordinate systems, and how to interpret the readings, we can do some useful transformations. -We will use Python with the NumPy and SciPy packages for the code snippets below. Let’s start by importing those: - -```python -import numpy as np -from scipy.spatial.transform import Rotation as R -``` - ## Obtain IMU Heading Vectors An alternate representation of IMU data is a heading vector that points outwards from the center of the IMU. Neutral orientation of the IMU would correspond to a heading vector that points at magnetic North and that is oriented perpendicular to the line of gravity. -:::: details Code -```python -def imu_heading_in_world(imu_quaternions): - """ - Construct heading vectors from the IMU's quaternion values. - - Inputs: - - imu_quaternions (Nx4 np.array): A timeseries of quaternions - from Neon's IMU stream. - - Returns: - - headings_in_world (Nx3 np.array): The corresponding timeseries of - IMU heading vectors in the world coordinate system. - """ +We start by specifying a neutral heading vector: - # We start by specifying the direction of a neutral heading vector - # in the IMU's coordinate system. - heading_neutral_in_imu_coords = np.array([0.0, 1.0, 0.0]) +<<< @/imu-transformations/pl_imu_transformations.py#neutral_heading - # This array contains a timeseries of transformation matrices, - # as calculated from the IMU's timeseries of quaternions values. - # Each of these matrices are used to transform points in the IMU - # coordinate system to their corresponding coordinates in the world - # coordinate system. - imu_to_world_matrices = R.from_quat(imu_quaternions).as_matrix() - - # We now apply each transformation matrix to the neutral IMU heading vector - # to obtain a timeseries of heading vectors in the world coordinate system. - headings_in_world = imu_to_world_matrices @ heading_neutral_in_imu_coords +Then, we can obtain a timeseries of transformation matrices, using the timeseries of quaternion values +obtained from the IMU. These matrices can be used to transform points the local IMU coordinate system +to the world coordinate system: - return headings_in_world -``` -:::: +<<< @/imu-transformations/pl_imu_transformations.py#imu_world_matrices + +Finally, we obtain a timeseries of heading vectors by applying each transformation matrix, in turn, +to the neutral heading vector: + +<<< @/imu-transformations/pl_imu_transformations.py#heading_in_world ## Transform IMU Acceleration Data to World Coordinates diff --git a/alpha-lab/imu-transformations/pl_imu_transformations.py b/alpha-lab/imu-transformations/pl_imu_transformations.py new file mode 100644 index 000000000..9e3bf0994 --- /dev/null +++ b/alpha-lab/imu-transformations/pl_imu_transformations.py @@ -0,0 +1,40 @@ +import numpy as np +from scipy.spatial.transform import Rotation as R + +def imu_heading_in_world(imu_quaternions): + """ + Construct heading vectors from the IMU's quaternion values. + + Inputs: + - imu_quaternions (Nx4 np.array): A timeseries of quaternions + from Neon's IMU stream. + + Returns: + - headings_in_world (Nx3 np.array): The corresponding timeseries of + IMU heading vectors in the world coordinate system. + """ + + # We start by specifying the direction of a neutral heading vector + # in the IMU's coordinate system. + # region neutral_heading + heading_neutral_in_imu_coords = np.array([0.0, 1.0, 0.0]) + # endregion neutral_heading + + # This array contains a timeseries of transformation matrices, + # as calculated from the IMU's timeseries of quaternions values. + # Each of these matrices are used to transform points in the IMU + # coordinate system to their corresponding coordinates in the world + # coordinate system. + # region imu_world_matrices + imu_to_world_matrices = R.from_quat(imu_quaternions).as_matrix() + # endregion imu_world_matrices + + # We now apply each transformation matrix to the neutral IMU heading vector + # to obtain a timeseries of heading vectors in the world coordinate system. + # region heading_in_world + headings_in_world = imu_to_world_matrices @ heading_neutral_in_imu_coords + # endregion heading_in_world + + return headings_in_world + + From ff08b4b8d6c7cde33c45c42792837de5de2bd04f Mon Sep 17 00:00:00 2001 From: Robert Ennis Date: Wed, 21 Aug 2024 10:03:01 +0200 Subject: [PATCH 14/54] test submodule + line specific code snippet import --- .gitmodules | 3 +++ alpha-lab/47303f69efcff77bd634c82c86612b84 | 1 + alpha-lab/imu-transformations/index.md | 2 +- 3 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 .gitmodules create mode 160000 alpha-lab/47303f69efcff77bd634c82c86612b84 diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 000000000..3f6be0d5a --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "alpha-lab/47303f69efcff77bd634c82c86612b84"] + path = alpha-lab/47303f69efcff77bd634c82c86612b84 + url = https://gist.github.com/47303f69efcff77bd634c82c86612b84.git diff --git a/alpha-lab/47303f69efcff77bd634c82c86612b84 b/alpha-lab/47303f69efcff77bd634c82c86612b84 new file mode 160000 index 000000000..542043d8a --- /dev/null +++ b/alpha-lab/47303f69efcff77bd634c82c86612b84 @@ -0,0 +1 @@ +Subproject commit 542043d8a4500ae908af6abe9846266a76bd1eeb diff --git a/alpha-lab/imu-transformations/index.md b/alpha-lab/imu-transformations/index.md index 21e94ac8d..314c98498 100644 --- a/alpha-lab/imu-transformations/index.md +++ b/alpha-lab/imu-transformations/index.md @@ -81,7 +81,7 @@ An alternate representation of IMU data is a heading vector that points outwards We start by specifying a neutral heading vector: -<<< @/imu-transformations/pl_imu_transformations.py#neutral_heading +<<< @/47303f69efcff77bd634c82c86612b84/pl_imu_transformations.py#L20 Then, we can obtain a timeseries of transformation matrices, using the timeseries of quaternion values obtained from the IMU. These matrices can be used to transform points the local IMU coordinate system From ec8dcb97cee3796c89c0842042ec393bdf3308cc Mon Sep 17 00:00:00 2001 From: Robert Ennis Date: Wed, 21 Aug 2024 11:45:07 +0200 Subject: [PATCH 15/54] test variants for "inlining" the code in the docs --- alpha-lab/imu-transformations/index.md | 192 +++++++----------- .../pl_imu_transformations.py | 12 +- 2 files changed, 72 insertions(+), 132 deletions(-) diff --git a/alpha-lab/imu-transformations/index.md b/alpha-lab/imu-transformations/index.md index 314c98498..82fa7f4b6 100644 --- a/alpha-lab/imu-transformations/index.md +++ b/alpha-lab/imu-transformations/index.md @@ -77,22 +77,41 @@ readings, we can do some useful transformations. ## Obtain IMU Heading Vectors -An alternate representation of IMU data is a heading vector that points outwards from the center of the IMU. Neutral orientation of the IMU would correspond to a heading vector that points at magnetic North and that is oriented perpendicular to the line of gravity. +An alternate representation of IMU data is a heading vector that points outwards from the center of the IMU. Neutral orientation of the IMU would correspond to a heading vector that points at magnetic North and that is oriented perpendicular to the line of gravity: -We start by specifying a neutral heading vector: +- **Rob Variant 1:** Write out scipy module reference in full: -<<< @/47303f69efcff77bd634c82c86612b84/pl_imu_transformations.py#L20 +```python +imu_neutral_heading = np.array([0.0, 1.0, 0.0]) +world_rotation_matrices = scipy.spatial.transform.Rotation.from_quat(imu_quaternions).as_matrix() +headings_in_world = world_rotation_matrices @ imu_neutral_heading +``` -Then, we can obtain a timeseries of transformation matrices, using the timeseries of quaternion values -obtained from the IMU. These matrices can be used to transform points the local IMU coordinate system -to the world coordinate system: +- **Rob Variant 2:** Show conventional way to import Rotation sub-module of scipy: -<<< @/imu-transformations/pl_imu_transformations.py#imu_world_matrices +```python +from scipy.spatial.transform import Rotation as R + +imu_neutral_heading = np.array([0.0, 1.0, 0.0]) +world_rotation_matrices = R.from_quat(imu_quaternions).as_matrix() +headings_in_world = world_rotation_matrices @ imu_neutral_heading +``` + +- **Rob Variant 3:** Just write the conventional way without showing the import: + +```python +imu_neutral_heading = np.array([0.0, 1.0, 0.0]) +world_rotation_matrices = R.from_quat(imu_quaternions).as_matrix() +headings_in_world = world_rotation_matrices @ imu_neutral_heading +``` -Finally, we obtain a timeseries of heading vectors by applying each transformation matrix, in turn, -to the neutral heading vector: +- **Rob Variant 4:** Do it as Python-esque pseudo-code: -<<< @/imu-transformations/pl_imu_transformations.py#heading_in_world +```python +imu_neutral_heading = np.array([0.0, 1.0, 0.0]) +world_rotation_matrices = rotation_matrices_from_quaternions(imu_quaternions) +headings_in_world = world_rotation_matrices @ imu_neutral_heading +``` ## Transform IMU Acceleration Data to World Coordinates @@ -137,125 +156,52 @@ eye movements. To facilitate the comparison, it can be useful to represent them in the same coordinate system. The coordinates of gaze are specified with respect to the scene camera coordinate system and the function below, `gaze_scene_to_world`, uses data from the IMU to transform gaze to the world coordinate system. -:::: details Code -```python -def gaze_scene_to_world(gaze_elevations, gaze_azimuths, imu_quaternions): - """ - Transform a 3D gaze ray to the world coordinate system. - - Note that the gaze data and the IMU quaternion should be sampled - at the same timestamps. You can linearly interpolate the IMU data - to ensure this. - - The origin of the IMU coordinate system is the same as the - origin of the world coordinate system. +The IMU and scene camera coordinate systems have [a fixed 102 degree rotation offset](https://docs.pupil-labs.com/neon/data-collection/data-streams/#movement-imu-data). Knowing this, we can build a matrix to transform points in the scene camera coordinate system to their corresponding coordinates in the IMU coordinate system: - The code in this function is adapted from the `plimu` visualization utility: - https://github.com/pupil-labs/plimu/blob/8b94302982363b203dddea2b15f43c6da60e787e/src/pupil_labs/plimu/visualizer.py#L274-L279 - - This function makes use of the spherical_to_cartesian_scene function, - defined below, that converts 3D gaze rays from spherical coordinates - to Cartesian coordinates. - - Inputs: - - gaze_elevations (Nx1 np.array): A timeseries of gaze elevations (degrees), - specified in the scene camera coordinate system. - - gaze_azimuths (Nx1 np.array): A timeseries of gaze azimuths (degrees), - specified in the scene camera coordinate system. - - imu_quaternions (Nx4 np.array): A timeseries of quaternion values - from Neon's IMU. - - Returns: - - gazes_in_world (Nx3 np.array): The corresponding timeseries of - 3D Cartesian gaze unit vectors, specified in the world coordinate system. - """ - - # The IMU and scene camera coordinate systems have a fixed - # 102 degree rotation offset. See: - # https://docs.pupil-labs.com/neon/data-collection/data-streams/#movement-imu-data - imu_scene_rotation_diff = np.deg2rad(-90 - 12) - - # This matrix is used to transform points in the scene - # camera coordinate system to their corresponding coordinates - # in the IMU coordinate system. - scene_to_imu = np.array( - [ - [1.0, 0.0, 0.0], - [ - 0.0, - np.cos(imu_scene_rotation_diff), - -np.sin(imu_scene_rotation_diff), - ], - [ - 0.0, - np.sin(imu_scene_rotation_diff), - np.cos(imu_scene_rotation_diff), - ], - ] - ) - - # Neon provides 3D gaze in spherical coordinates by default, - # so we first transform the gaze data from spherical coordinates - # to Cartesian coordinates. - cart_gazes_in_scene = spherical_to_cartesian_scene(gaze_elevations, gaze_azimuths) - - # Apply the transformation from the scene camera to the IMU coordinate system. - gazes_in_imu = scene_to_imu @ cart_gazes_in_scene.T - - # This array contains a timeseries of transformation matrices, - # as calculated from the IMU's timeseries of quaternions values. - # Each of these matrices are used to transform points in the IMU coordinate - # system to their corresponding coordinates in the world coordinate system. - imu_to_world_matrices = R.from_quat(imu_quaternions).as_matrix() - - # Apply the transformations from the IMU to the world coordinate system. - gazes_in_world = [imu_to_world @ gaze for imu_to_world, gaze in zip(imu_to_world_matrices, gazes_in_imu.T)] +``` +imu_scene_rotation_diff = deg2rad(-90 - 12) + +scene_to_imu = array( + [ + [1.0, 0.0, 0.0], + [ + 0.0, + cos(imu_scene_rotation_diff), + -sin(imu_scene_rotation_diff), + ], + [ + 0.0, + sin(imu_scene_rotation_diff), + cos(imu_scene_rotation_diff), + ], + ] +) +``` - return np.array(gazes_in_world) +Neon provides 3D gaze in spherical coordinates by default, so we first need to transform the gaze data from spherical coordinates to Cartesian coordinates. + +``` +cart_gazes_in_scene = spherical_to_cartesian_scene(gaze_elevations, gaze_azimuths) +``` +Now, we can apply the transformation from the scene camera to the IMU coordinate system: -def spherical_to_cartesian_scene(elevations, azimuths): - """ - Convert Neon's spherical representation of 3D gaze to Cartesian coordinates. - - Inputs: - - elevations (Nx1 np.array): A timeseries of gaze elevations (degrees), - specified in the scene camera coordinate system. - - azimuths (Nx1 np.array): A timeseries of gaze azimuths (degrees), - specified in the scene camera coordinate system. - - Returns: - - cartesian_unit_vectors (Nx3 np.array): A timeseries of gaze unit - vectors, in Cartesian coordinates, specified in the scene camera - coordinate system. - """ +``` +gazes_in_imu = scene_to_imu @ cart_gazes_in_scene.T +``` + +Using the timeseries of quaternion values from the IMU, we can construct a timeseries of transformation matrices. +Each of these matrices are used to transform points in the IMU coordinate system to their corresponding coordinates in the world coordinate system: - elevations_rad = np.deg2rad(elevations) - azimuths_rad = np.deg2rad(azimuths) - - # Elevation of 0 in Neon system corresponds to Y = 0, but - # an elevation of 0 in traditional spherical coordinates would - # correspond to Y = 1, so first we convert elevation to the - # more traditional format. - elevations_rad += np.pi / 2 - - # Azimuth of 0 in Neon system corresponds to X = 0, but - # an azimuth of 0 in traditional spherical coordinates would - # correspond to X = 1. Also, azimuth to the right in Neon is - # more positive, whereas it is more negative in traditional spherical coordiantes. - # So, first we convert azimuth to the more traditional format. - azimuths_rad *= -1.0 - azimuths_rad += np.pi / 2 - - cartesian_unit_vectors = np.array([ - np.sin(elevations_rad) * np.cos(azimuths_rad), - np.cos(elevations_rad), - np.sin(elevations_rad) * np.sin(azimuths_rad), - ]).T - - return cartesian_unit_vectors ``` -:::: +imu_to_world_matrices = rotation_matrices_from_quaternions(imu_quaternions) +``` + +Finally, we can apply the transformations from the IMU to the world coordinate system: + +``` +gazes_in_world = [imu_to_world @ gaze for imu_to_world, gaze in zip(imu_to_world_matrices, gazes_in_imu.T)] +``` ## Represent IMU and 3D Eyestate in the Same Coordinate System diff --git a/alpha-lab/imu-transformations/pl_imu_transformations.py b/alpha-lab/imu-transformations/pl_imu_transformations.py index 9e3bf0994..81987b13e 100644 --- a/alpha-lab/imu-transformations/pl_imu_transformations.py +++ b/alpha-lab/imu-transformations/pl_imu_transformations.py @@ -16,24 +16,18 @@ def imu_heading_in_world(imu_quaternions): # We start by specifying the direction of a neutral heading vector # in the IMU's coordinate system. - # region neutral_heading - heading_neutral_in_imu_coords = np.array([0.0, 1.0, 0.0]) - # endregion neutral_heading + imu_neutral_heading = np.array([0.0, 1.0, 0.0]) # This array contains a timeseries of transformation matrices, # as calculated from the IMU's timeseries of quaternions values. # Each of these matrices are used to transform points in the IMU # coordinate system to their corresponding coordinates in the world # coordinate system. - # region imu_world_matrices - imu_to_world_matrices = R.from_quat(imu_quaternions).as_matrix() - # endregion imu_world_matrices + world_rotation_matrices = R.from_quat(imu_quaternions).as_matrix() # We now apply each transformation matrix to the neutral IMU heading vector # to obtain a timeseries of heading vectors in the world coordinate system. - # region heading_in_world - headings_in_world = imu_to_world_matrices @ heading_neutral_in_imu_coords - # endregion heading_in_world + headings_in_world = world_rotation_matrices @ imu_neutral_heading return headings_in_world From 2e39a75dd4868b630a04fd0fb8f18edddb0c0d06 Mon Sep 17 00:00:00 2001 From: Robert Ennis Date: Wed, 21 Aug 2024 11:55:00 +0200 Subject: [PATCH 16/54] make scene_to_imu pseudo-code more compact --- alpha-lab/imu-transformations/index.md | 23 ++++------------------- 1 file changed, 4 insertions(+), 19 deletions(-) diff --git a/alpha-lab/imu-transformations/index.md b/alpha-lab/imu-transformations/index.md index 82fa7f4b6..b7de7b3c2 100644 --- a/alpha-lab/imu-transformations/index.md +++ b/alpha-lab/imu-transformations/index.md @@ -160,25 +160,10 @@ The IMU and scene camera coordinate systems have [a fixed 102 degree rotation of ``` imu_scene_rotation_diff = deg2rad(-90 - 12) - -scene_to_imu = array( - [ - [1.0, 0.0, 0.0], - [ - 0.0, - cos(imu_scene_rotation_diff), - -sin(imu_scene_rotation_diff), - ], - [ - 0.0, - sin(imu_scene_rotation_diff), - cos(imu_scene_rotation_diff), - ], - ] -) +scene_to_imu = yz_rotation_matrix_from_angle(imu_scene_rotation_diff) ``` -Neon provides 3D gaze in spherical coordinates by default, so we first need to transform the gaze data from spherical coordinates to Cartesian coordinates. +Neon provides 3D gaze in spherical coordinates by default, so next, we need to transform the gaze data from spherical coordinates to Cartesian coordinates. ``` cart_gazes_in_scene = spherical_to_cartesian_scene(gaze_elevations, gaze_azimuths) @@ -187,7 +172,7 @@ cart_gazes_in_scene = spherical_to_cartesian_scene(gaze_elevations, gaze_azimuth Now, we can apply the transformation from the scene camera to the IMU coordinate system: ``` -gazes_in_imu = scene_to_imu @ cart_gazes_in_scene.T +gazes_in_imu = scene_to_imu @ cart_gazes_in_scene ``` Using the timeseries of quaternion values from the IMU, we can construct a timeseries of transformation matrices. @@ -200,7 +185,7 @@ imu_to_world_matrices = rotation_matrices_from_quaternions(imu_quaternions) Finally, we can apply the transformations from the IMU to the world coordinate system: ``` -gazes_in_world = [imu_to_world @ gaze for imu_to_world, gaze in zip(imu_to_world_matrices, gazes_in_imu.T)] +gazes_in_world = [imu_to_world @ gaze for imu_to_world, gaze in zip(imu_to_world_matrices, gazes_in_imu)] ``` ## Represent IMU and 3D Eyestate in the Same Coordinate System From 156298fc580c877d0eef22e81e9f9cc3aecc38fa Mon Sep 17 00:00:00 2001 From: Robert Ennis Date: Wed, 21 Aug 2024 12:17:48 +0200 Subject: [PATCH 17/54] implement @mgg's codegroup and include approach --- alpha-lab/imu-transformations/index.md | 36 ++++--------------- .../pl_imu_transformations_no_comments.py | 8 +++++ 2 files changed, 15 insertions(+), 29 deletions(-) create mode 100644 alpha-lab/imu-transformations/pl_imu_transformations_no_comments.py diff --git a/alpha-lab/imu-transformations/index.md b/alpha-lab/imu-transformations/index.md index b7de7b3c2..3988a07e5 100644 --- a/alpha-lab/imu-transformations/index.md +++ b/alpha-lab/imu-transformations/index.md @@ -79,39 +79,17 @@ readings, we can do some useful transformations. An alternate representation of IMU data is a heading vector that points outwards from the center of the IMU. Neutral orientation of the IMU would correspond to a heading vector that points at magnetic North and that is oriented perpendicular to the line of gravity: -- **Rob Variant 1:** Write out scipy module reference in full: +::: code-group -```python -imu_neutral_heading = np.array([0.0, 1.0, 0.0]) -world_rotation_matrices = scipy.spatial.transform.Rotation.from_quat(imu_quaternions).as_matrix() -headings_in_world = world_rotation_matrices @ imu_neutral_heading +```python:line-numbers {16,23,27} [imu_heading_in_world()] + ``` -- **Rob Variant 2:** Show conventional way to import Rotation sub-module of scipy: - -```python -from scipy.spatial.transform import Rotation as R - -imu_neutral_heading = np.array([0.0, 1.0, 0.0]) -world_rotation_matrices = R.from_quat(imu_quaternions).as_matrix() -headings_in_world = world_rotation_matrices @ imu_neutral_heading -``` - -- **Rob Variant 3:** Just write the conventional way without showing the import: - -```python -imu_neutral_heading = np.array([0.0, 1.0, 0.0]) -world_rotation_matrices = R.from_quat(imu_quaternions).as_matrix() -headings_in_world = world_rotation_matrices @ imu_neutral_heading -``` - -- **Rob Variant 4:** Do it as Python-esque pseudo-code: - -```python -imu_neutral_heading = np.array([0.0, 1.0, 0.0]) -world_rotation_matrices = rotation_matrices_from_quaternions(imu_quaternions) -headings_in_world = world_rotation_matrices @ imu_neutral_heading +```python:line-numbers {18,25,29} [(with comments)] + ``` +::: + ## Transform IMU Acceleration Data to World Coordinates diff --git a/alpha-lab/imu-transformations/pl_imu_transformations_no_comments.py b/alpha-lab/imu-transformations/pl_imu_transformations_no_comments.py new file mode 100644 index 000000000..86bcd9236 --- /dev/null +++ b/alpha-lab/imu-transformations/pl_imu_transformations_no_comments.py @@ -0,0 +1,8 @@ +import numpy as np +from scipy.spatial.transform import Rotation as R + +def imu_heading_in_world(imu_quaternions): + imu_neutral_heading = np.array([0.0, 1.0, 0.0]) + world_rotation_matrices = R.from_quat(imu_quaternions).as_matrix() + headings_in_world = world_rotation_matrices @ imu_neutral_heading + return headings_in_world From 9d960348ef6ddbbe95205a6f07b15650ae872678 Mon Sep 17 00:00:00 2001 From: Robert Ennis Date: Wed, 21 Aug 2024 12:30:41 +0200 Subject: [PATCH 18/54] add gaze_scene_to_world to codegroup test --- alpha-lab/imu-transformations/index.md | 35 ++---- .../pl_imu_transformations.py | 119 ++++++++++++++++++ .../pl_imu_transformations_no_comments.py | 49 ++++++++ 3 files changed, 175 insertions(+), 28 deletions(-) diff --git a/alpha-lab/imu-transformations/index.md b/alpha-lab/imu-transformations/index.md index 3988a07e5..e98849031 100644 --- a/alpha-lab/imu-transformations/index.md +++ b/alpha-lab/imu-transformations/index.md @@ -81,7 +81,7 @@ An alternate representation of IMU data is a heading vector that points outwards ::: code-group -```python:line-numbers {16,23,27} [imu_heading_in_world()] +```python [imu_heading_in_world()] ``` @@ -134,37 +134,16 @@ eye movements. To facilitate the comparison, it can be useful to represent them in the same coordinate system. The coordinates of gaze are specified with respect to the scene camera coordinate system and the function below, `gaze_scene_to_world`, uses data from the IMU to transform gaze to the world coordinate system. -The IMU and scene camera coordinate systems have [a fixed 102 degree rotation offset](https://docs.pupil-labs.com/neon/data-collection/data-streams/#movement-imu-data). Knowing this, we can build a matrix to transform points in the scene camera coordinate system to their corresponding coordinates in the IMU coordinate system: - -``` -imu_scene_rotation_diff = deg2rad(-90 - 12) -scene_to_imu = yz_rotation_matrix_from_angle(imu_scene_rotation_diff) -``` - -Neon provides 3D gaze in spherical coordinates by default, so next, we need to transform the gaze data from spherical coordinates to Cartesian coordinates. - -``` -cart_gazes_in_scene = spherical_to_cartesian_scene(gaze_elevations, gaze_azimuths) -``` - -Now, we can apply the transformation from the scene camera to the IMU coordinate system: - -``` -gazes_in_imu = scene_to_imu @ cart_gazes_in_scene -``` - -Using the timeseries of quaternion values from the IMU, we can construct a timeseries of transformation matrices. -Each of these matrices are used to transform points in the IMU coordinate system to their corresponding coordinates in the world coordinate system: +::: code-group +```python [gaze_scene_to_world() & spherical_to_cartesian_scene()] + ``` -imu_to_world_matrices = rotation_matrices_from_quaternions(imu_quaternions) -``` - -Finally, we can apply the transformations from the IMU to the world coordinate system: +```python:line-numbers {34,39-53,58,61,67,70-75,94,95,101,108-119} [(with comments)] + ``` -gazes_in_world = [imu_to_world @ gaze for imu_to_world, gaze in zip(imu_to_world_matrices, gazes_in_imu)] -``` +::: ## Represent IMU and 3D Eyestate in the Same Coordinate System diff --git a/alpha-lab/imu-transformations/pl_imu_transformations.py b/alpha-lab/imu-transformations/pl_imu_transformations.py index 81987b13e..e3362e5a1 100644 --- a/alpha-lab/imu-transformations/pl_imu_transformations.py +++ b/alpha-lab/imu-transformations/pl_imu_transformations.py @@ -32,3 +32,122 @@ def imu_heading_in_world(imu_quaternions): return headings_in_world +def gaze_scene_to_world(gaze_elevations, gaze_azimuths, imu_quaternions): + """ + Transform a 3D gaze ray to the world coordinate system. + + Note that the gaze data and the IMU quaternion should be sampled + at the same timestamps. You can linearly interpolate the IMU data + to ensure this. + + The origin of the IMU coordinate system is the same as the + origin of the world coordinate system. + The code in this function is adapted from the `plimu` visualization utility: + https://github.com/pupil-labs/plimu/blob/8b94302982363b203dddea2b15f43c6da60e787e/src/pupil_labs/plimu/visualizer.py#L274-L279 + + This function makes use of the spherical_to_cartesian_scene function, + defined below, that converts 3D gaze rays from spherical coordinates + to Cartesian coordinates. + + Inputs: + - gaze_elevations (Nx1 np.array): A timeseries of gaze elevations (degrees), + specified in the scene camera coordinate system. + - gaze_azimuths (Nx1 np.array): A timeseries of gaze azimuths (degrees), + specified in the scene camera coordinate system. + - imu_quaternions (Nx4 np.array): A timeseries of quaternion values + from Neon's IMU. + + Returns: + - gazes_in_world (Nx3 np.array): The corresponding timeseries of + 3D Cartesian gaze unit vectors, specified in the world coordinate system. + """ + + # The IMU and scene camera coordinate systems have a fixed + # 102 degree rotation offset. See: + # https://docs.pupil-labs.com/neon/data-collection/data-streams/#movement-imu-data + imu_scene_rotation_diff = np.deg2rad(-90 - 12) + + # This matrix is used to transform points in the scene + # camera coordinate system to their corresponding coordinates + # in the IMU coordinate system. + scene_to_imu = np.array( + [ + [1.0, 0.0, 0.0], + [ + 0.0, + np.cos(imu_scene_rotation_diff), + -np.sin(imu_scene_rotation_diff), + ], + [ + 0.0, + np.sin(imu_scene_rotation_diff), + np.cos(imu_scene_rotation_diff), + ], + ] + ) + + # Neon provides 3D gaze in spherical coordinates by default, + # so we first transform the gaze data from spherical coordinates + # to Cartesian coordinates. + cart_gazes_in_scene = spherical_to_cartesian_scene(gaze_elevations, gaze_azimuths) + + # Apply the transformation from the scene camera to the IMU coordinate system. + gazes_in_imu = scene_to_imu @ cart_gazes_in_scene.T + + # This array contains a timeseries of transformation matrices, + # as calculated from the IMU's timeseries of quaternions values. + # Each of these matrices are used to transform points in the IMU coordinate + # system to their corresponding coordinates in the world coordinate system. + imu_to_world_matrices = R.from_quat(imu_quaternions).as_matrix() + + # Apply the transformations from the IMU to the world coordinate system. + gazes_in_world = [ + imu_to_world @ gaze + for imu_to_world, gaze in zip(imu_to_world_matrices, gazes_in_imu.T) + ] + + return np.array(gazes_in_world) + + +def spherical_to_cartesian_scene(elevations, azimuths): + """ + Convert Neon's spherical representation of 3D gaze to Cartesian coordinates. + + Inputs: + - elevations (Nx1 np.array): A timeseries of gaze elevations (degrees), + specified in the scene camera coordinate system. + - azimuths (Nx1 np.array): A timeseries of gaze azimuths (degrees), + specified in the scene camera coordinate system. + + Returns: + - cartesian_unit_vectors (Nx3 np.array): A timeseries of gaze unit + vectors, in Cartesian coordinates, specified in the scene camera + coordinate system. + """ + + elevations_rad = np.deg2rad(elevations) + azimuths_rad = np.deg2rad(azimuths) + + # Elevation of 0 in Neon system corresponds to Y = 0, but + # an elevation of 0 in traditional spherical coordinates would + # correspond to Y = 1, so first we convert elevation to the + # more traditional format. + elevations_rad += np.pi / 2 + + # Azimuth of 0 in Neon system corresponds to X = 0, but + # an azimuth of 0 in traditional spherical coordinates would + # correspond to X = 1. Also, azimuth to the right in Neon is + # more positive, whereas it is more negative in traditional spherical coordiantes. + # So, first we convert azimuth to the more traditional format. + azimuths_rad *= -1.0 + azimuths_rad += np.pi / 2 + + cartesian_unit_vectors = np.array( + [ + np.sin(elevations_rad) * np.cos(azimuths_rad), + np.cos(elevations_rad), + np.sin(elevations_rad) * np.sin(azimuths_rad), + ] + ).T + + return cartesian_unit_vectors diff --git a/alpha-lab/imu-transformations/pl_imu_transformations_no_comments.py b/alpha-lab/imu-transformations/pl_imu_transformations_no_comments.py index 86bcd9236..2af0fb828 100644 --- a/alpha-lab/imu-transformations/pl_imu_transformations_no_comments.py +++ b/alpha-lab/imu-transformations/pl_imu_transformations_no_comments.py @@ -6,3 +6,52 @@ def imu_heading_in_world(imu_quaternions): world_rotation_matrices = R.from_quat(imu_quaternions).as_matrix() headings_in_world = world_rotation_matrices @ imu_neutral_heading return headings_in_world + + +def gaze_scene_to_world(gaze_elevations, gaze_azimuths, imu_quaternions): + imu_scene_rotation_diff = np.deg2rad(-90 - 12) + scene_to_imu = np.array( + [ + [1.0, 0.0, 0.0], + [ + 0.0, + np.cos(imu_scene_rotation_diff), + -np.sin(imu_scene_rotation_diff), + ], + [ + 0.0, + np.sin(imu_scene_rotation_diff), + np.cos(imu_scene_rotation_diff), + ], + ] + ) + + cart_gazes_in_scene = spherical_to_cartesian_scene(gaze_elevations, gaze_azimuths) + gazes_in_imu = scene_to_imu @ cart_gazes_in_scene.T + imu_to_world_matrices = R.from_quat(imu_quaternions).as_matrix() + gazes_in_world = [ + imu_to_world @ gaze + for imu_to_world, gaze in zip(imu_to_world_matrices, gazes_in_imu.T) + ] + + return np.array(gazes_in_world) + + +def spherical_to_cartesian_scene(elevations, azimuths): + elevations_rad = np.deg2rad(elevations) + azimuths_rad = np.deg2rad(azimuths) + + elevations_rad += np.pi / 2 + + azimuths_rad *= -1.0 + azimuths_rad += np.pi / 2 + + cartesian_unit_vectors = np.array( + [ + np.sin(elevations_rad) * np.cos(azimuths_rad), + np.cos(elevations_rad), + np.sin(elevations_rad) * np.sin(azimuths_rad), + ] + ).T + + return cartesian_unit_vectors From b3ad60f49efb6bcccc332424d7423f68acd83e19 Mon Sep 17 00:00:00 2001 From: Robert Ennis Date: Wed, 21 Aug 2024 13:56:37 +0200 Subject: [PATCH 19/54] cleanup submodule & code snippet imports, make imu alpha lab opening text more concise --- .gitmodules | 4 +- alpha-lab/47303f69efcff77bd634c82c86612b84 | 1 - alpha-lab/imu-transformations/index.md | 245 +----------------- .../pl-imu-transformations | 1 + .../pl_imu_transformations.py | 153 ----------- .../pl_imu_transformations_no_comments.py | 57 ---- 6 files changed, 16 insertions(+), 445 deletions(-) delete mode 160000 alpha-lab/47303f69efcff77bd634c82c86612b84 create mode 160000 alpha-lab/imu-transformations/pl-imu-transformations delete mode 100644 alpha-lab/imu-transformations/pl_imu_transformations.py delete mode 100644 alpha-lab/imu-transformations/pl_imu_transformations_no_comments.py diff --git a/.gitmodules b/.gitmodules index 3f6be0d5a..32e785748 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,3 @@ -[submodule "alpha-lab/47303f69efcff77bd634c82c86612b84"] - path = alpha-lab/47303f69efcff77bd634c82c86612b84 +[submodule "alpha-lab/imu-transformations/pl-imu-transformations"] + path = alpha-lab/imu-transformations/pl-imu-transformations url = https://gist.github.com/47303f69efcff77bd634c82c86612b84.git diff --git a/alpha-lab/47303f69efcff77bd634c82c86612b84 b/alpha-lab/47303f69efcff77bd634c82c86612b84 deleted file mode 160000 index 542043d8a..000000000 --- a/alpha-lab/47303f69efcff77bd634c82c86612b84 +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 542043d8a4500ae908af6abe9846266a76bd1eeb diff --git a/alpha-lab/imu-transformations/index.md b/alpha-lab/imu-transformations/index.md index e98849031..e449d179d 100644 --- a/alpha-lab/imu-transformations/index.md +++ b/alpha-lab/imu-transformations/index.md @@ -33,216 +33,43 @@ head and eye movements? The transformation functions in this tutorial will show This guide contains various transformation functions that can assist when analysing Neon's IMU data. -First, it's important to understand how the IMU data should be interpreted. -The [orientation readings of the calibrated IMU](https://docs.pupil-labs.com/neon/data-collection/data-streams/#movement-imu-data) -are specified with respect to magnetic North and gravity. We will refer to this as the 'world coordinate system'. - -To be exact, the 'world coordinate system' is distinct from the 'IMU coordinate system' - as the Neon module rotates, -the IMU coordinate system rotates with it. The IMU's orientation readings actually specify the rotational difference between its coordinate -system and the world coordinate system. - -- Y axis = vector pointing towards magnetic North. - - Rotations about this axis are called “roll” and range from -180 to +180 degrees. Wearing Neon normally in an upright position roughly corresponds to a roll of 0 degrees. Rightward head tilt is positive roll; leftward head tilt is negative roll. -- Z axis = vector pointing upwards, opposite to the direction of gravity. - - Rotations about this axis are called “yaw” and range from -180 to +180 degrees. When the IMU is calibrated, a Neon module oriented at magnetic North corresponds to a yaw of 0 degrees. Leftward head turn is positive yaw; rightward head turn is negative yaw. -- X axis = cross-product of Y and Z, which is a vector pointing rightwards. - - Rotations about this axis are called “pitch” and range from -90 to +90 degrees. Wearing Neon normally in an upright position roughly corresponds to a pitch of 0 degrees. Backward head tilt is positive pitch; forward head tilt is negative pitch - -![Diagram of the three Euler orientation angles measured by Neon's IMU](./imu-pitch-yaw-roll-black.png) - -::: tip -💡 Note that Neon can sit differently on each wearer’s face, such that the headset is not necessarily in -line with a given plane. For example, if the wearer is facing magnetic North, the IMU might -still report some deviation from a neutral orientation. -::: - -The raw gyroscope values give the rotational velocity about the X, Y, and Z axes of the IMU’s coordinate system. Their units are degrees/s (i.e., they provide the change -over time of each of these quantities). The reference frame for specifying rotational velocities rotates with the IMU. - -The raw acceleration values measure translational (i.e., linear) acceleration, in terms of g-force (units of g), -along the X, Y, and Z axes of the IMU’s coordinate system. The reference frame for specifying acceleration values -rotates with the IMU. - -::: tip -💡 [g-force](https://en.wikipedia.org/wiki/G-force) is not the same as free-fall acceleration due -to gravity. For example, if you are standing on the surface of the Earth, then the g-force is equal and -opposite to gravity, keeping you at rest. In that case, if you were wearing Neon normally in an upright position, then -acceleration along the Z axis would be +1g, while it would be 0g along the X and Y axes. -::: - -It can be helpful to also try out our IMU visualization utility, [plimu](https://github.com/pupil-labs/plimu). This can assist in understanding the IMU data and the various coordinate systems. - -Now that we have laid out the relationship between the IMU and world coordinate systems, and how to interpret the -readings, we can do some useful transformations. +While working through this guide, it can be helpful to try out our IMU visualization utility, [plimu](https://github.com/pupil-labs/plimu). This can assist in understanding the IMU data and the various coordinate systems. ## Obtain IMU Heading Vectors An alternate representation of IMU data is a heading vector that points outwards from the center of the IMU. Neutral orientation of the IMU would correspond to a heading vector that points at magnetic North and that is oriented perpendicular to the line of gravity: -::: code-group - -```python [imu_heading_in_world()] - -``` - -```python:line-numbers {18,25,29} [(with comments)] - +```python + ``` -::: - ## Transform IMU Acceleration Data to World Coordinates -We mentioned above that the IMU’s acceleration data are specified with respect to the IMU’s coordinate system. Sometimes, it can be useful to have the acceleration data specified in the world coordinate system instead. The function below will perform this transformation. - -### +We mentioned above that the IMU’s acceleration data are specified with respect to the IMU’s coordinate system. Sometimes, it can be useful to have the acceleration data specified in the world coordinate system instead. The function below will perform this transformation: -:::: details Code ```python -def imu_acceleration_in_world(imu_accelerations, imu_quaternions): - """ - Transform the IMU's acceleration values to the world coordinate system. - - Inputs: - - accelerations_imu (Nx3 np.array): A timeseries of acceleration data - from the IMU, where columns are in the order: "acceleration x", - "acceleration y", "acceleration z". - - imu_quaternions (Nx4 np.array): A timeseries of quaternions - from Neon's IMU stream. - - Returns: - - accelerations_world (Nx3 np.array): The corresponding timeseries of - acceleration data, expressed in the world coordinate system. - """ - - # This array contains a timeseries of transformation matrices, - # as calculated from the IMU's timeseries of quaternions values. - # Each of these matrices sends points in the IMU coordinate system to their - # corresponding coordinates in the world coordinate system. - imu_to_world_matrices = R.from_quat(imu_quaternions).as_matrix() - - accelerations_world = [imu_to_world @ imu_acceleration for imu_to_world, imu_acceleration in zip(imu_to_world_matrices, imu_accelerations)] - - return np.array(accelerations_world) + ``` -:::: ## Represent IMU and Gaze Data in the Same Coordinate System -Neon simultaneously records gaze and IMU data, making it possible to study the relationship between head and -eye movements. +Neon simultaneously records gaze and IMU data, making it possible to study the relationship between head and eye movements. -To facilitate the comparison, it can be useful to represent them in the same coordinate system. The coordinates of gaze are specified with respect to the scene camera coordinate system and the function below, `gaze_scene_to_world`, uses data from the IMU to transform gaze to the world coordinate system. +To facilitate the comparison, it can be useful to represent them in the same coordinate system. The coordinates of gaze are specified with respect to the scene camera coordinate system and the function below, `gaze_scene_to_world`, uses data from the IMU to transform gaze to the world coordinate system: -::: code-group - -```python [gaze_scene_to_world() & spherical_to_cartesian_scene()] - -``` - -```python:line-numbers {34,39-53,58,61,67,70-75,94,95,101,108-119} [(with comments)] - +```python + ``` -::: ## Represent IMU and 3D Eyestate in the Same Coordinate System The [3D eyestate estimates](https://docs.pupil-labs.com/neon/data-collection/data-streams/#_3d-eye-states) provided by Neon are aligned with the scene camera coordinate system. This means we can reuse elements of -the `gaze_scene_to_world` function to reconstruct the pose of the eyes in the world coordinate system. +the `gaze_scene_to_world` function to reconstruct the pose of the eyes in the world coordinate system: -:::: details Code ```python -def eyestate_to_world(eyeball_centers, optical_axes, imu_quaternions): - """ - Transforms 3D eyestate data to the world coordinate system. - - Note that the 3D eyestate data and the IMU quaternions should be sampled - at the same timestamps. You can linearly interpolate the IMU data - to ensure this. - - The origin of the IMU coordinate system is the same as the - origin of the world coordinate system. - - The code in this function is adapted from the `plimu` visualization utility: - https://github.com/pupil-labs/plimu/blob/8b94302982363b203dddea2b15f43c6da60e787e/src/pupil_labs/plimu/visualizer.py#L274-L279 - - Inputs: - - eyeball_centers (Nx3 np.array): A timeseries of eyeball center - estimates (mm) for one eye, as provided by Neon's 3D eyestate data stream. - - optical_axes (Nx3 np.array): A timeseries of optical axis estimates - (3D unit vectors) for the same eye, as provided by Neon's 3D eyestate data stream. - - imu_quaternions (Nx4 np.array): A timeseries of quaternion values from - Neon's IMU. - - Returns: - - eyeball_centers_in_world (Nx3 np.array): The corresponding timeseries of - eyeball center estimates (mm) for one eye, transformed to the world coordinate - system of the IMU. - - optical_axes_in_world (Nx3 np.array): The corresponding timeseries of optical - axis estimates (3D unit vectors) for the same eye, transformed to the world - coordinate system of the IMU. - """ - - # The eyeball centers are specified in terms of their distance from - # the center of the scene camera, so to accurately convert them to - # world coordinates, we need the position of the scene camera in - # the IMU coordinate system. Here, we express that position - # in millimeters. - scene_camera_position_in_imu = np.array([0.0, -1.3, -6.62]) - - # The coordinate system of 3D eyestate is aligned with - # the coordinate system of the scene camera, so we can - # make use of the scene->to->IMU transformation procedure. - # - # The IMU and scene camera coordinate systems have a fixed - # 102 degree rotation offset. See here: - # https://docs.pupil-labs.com/neon/data-collection/data-streams/#movement-imu-data - imu_scene_rotation_diff = np.deg2rad(-90 - 12) - - # This matrix is used to transform points in the scene - # camera coordinate system to their corresponding coordinates - # in the IMU coordinate system. - scene_to_imu = np.array( - [ - [1.0, 0.0, 0.0], - [ - 0.0, - np.cos(imu_scene_rotation_diff), - -np.sin(imu_scene_rotation_diff), - ], - [ - 0.0, - np.sin(imu_scene_rotation_diff), - np.cos(imu_scene_rotation_diff), - ], - ] - ) - - # Convert the coordinates of the eyeball center and optical axes - # to the IMU coordinate system. - eyeball_centers_in_imu = scene_to_imu @ eyeball_centers.T - optical_axes_in_imu = scene_to_imu @ optical_axes.T - - # Take into account that the scene camera is offset from the IMU. - eyeball_centers_in_imu[0, :] += scene_camera_position_in_imu[0] - eyeball_centers_in_imu[1, :] += scene_camera_position_in_imu[1] - eyeball_centers_in_imu[2, :] += scene_camera_position_in_imu[2] - - # This array contains a timeseries of transformation matrices, - # as calculated from the IMU's timeseries of quaternions values. - # Each of these matrices are used to transform points in the IMU - # coordinate system to their corresponding coordinates in the world - # coordinate system. - imu_to_world_matrices = R.from_quat(imu_quaternions).as_matrix() - - # Apply the transformations from the IMU to the world coordinate system. - eyeball_centers_in_world = [imu_to_world @ eye_center for imu_to_world, eye_center in zip(imu_to_world_matrices, eyeball_centers_in_imu.T)] - optical_axes_in_world = [imu_to_world @ optical_axis for imu_to_world, optical_axis in zip(imu_to_world_matrices, optical_axes_in_imu.T)] - - return np.array(eyeball_centers_in_world), np.array(optical_axes_in_world) + ``` -:::: ## Convert (Cartesian) World Points to Spherical Coordinates @@ -254,60 +81,15 @@ For the values returned by `gaze_scene_to_world`, the function below will do th When wearing Neon normally, then an elevation and azimuth of 0 degrees corresponds to a neutral orientation: i.e., aimed at magnetic North and parallel to the horizon. -:::: details Code + ```python -def cartesian_to_spherical_world(world_points_3d): - """ - Convert points 3D Cartesian world coordinates to spherical coordinates. - - The origin of the world coordinate system is the same as the origin of the - IMU coordinate system. - - When wearing Neon normally, then an elevation and azimuth of 0 degrees corresponds - to a neutral orientation: i.e., aimed at magnetic North and parallel to the horizon. - - Inputs: - - world_points_3d (Nx3 np.array): A collection of 3D points in - Cartesian world coordinates. - - Returns: - - elevation (Nx1 np.array): The corresponding elevation value, in degrees, - for each 3D world point (i.e., vertical rotation away from neutral orientation). - Note: neutral orientation = 0 elevation; orientation upwards is positive; - orientation downwards is negative. - - azimuth (Nx1 np.array): The corresponding azimuth value, in degrees, for - each 3D world point (i.e., horizontal rotation away from neutral orientation). - Note: neutral orientation = 0 azimuth, orientation leftwards is positive; - orientation rightwards is negative. - """ - - x = world_points_3d[:, 0] - y = world_points_3d[:, 1] - z = world_points_3d[:, 2] - - radii = np.sqrt(x**2 + y**2 + z**2) - - elevation = -(np.arccos(z / radii) - np.pi / 2) - azimuth = np.arctan2(y, x) - np.pi/2 - - # Keep all azimuth values in the range of [-180, 180] to remain consistent - # with the yaw orientation values provided by the IMU - azimuth[azimuth < -np.pi] += 2 * np.pi - azimuth[azimuth > np.pi] -= 2 * np.pi - - # Convert from radians to degrees - elevation = np.rad2deg(elevation) - azimuth = np.rad2deg(azimuth) - - return elevation, azimuth + ``` -:::: ## Analysis example Below is a brief example of how to run the functions on this page using IMU data downloaded from Pupil Cloud. -:::: details Code ```python gaze = pd.read_csv("gaze.csv") eye3d = pd.read_csv("3d_eye_states.csv") @@ -370,7 +152,6 @@ world_accelerations = imu_acceleration_in_world( gaze_elevations_world, gaze_azimuths_world = cartesian_to_spherical_world(world_gazes) ``` -:::: ::: tip Need assistance with the IMU code in this article? Or do you have something more custom in mind? Reach out to us via email at [info@pupil-labs.com](mailto:info@pupil-labs.com), on our [Discord server](https://pupil-labs.com/chat/), or visit our [Support Page](https://pupil-labs.com/products/support/) for dedicated support options. diff --git a/alpha-lab/imu-transformations/pl-imu-transformations b/alpha-lab/imu-transformations/pl-imu-transformations new file mode 160000 index 000000000..0b702c0a7 --- /dev/null +++ b/alpha-lab/imu-transformations/pl-imu-transformations @@ -0,0 +1 @@ +Subproject commit 0b702c0a75efcb1b82321042e17a025cf9a639c9 diff --git a/alpha-lab/imu-transformations/pl_imu_transformations.py b/alpha-lab/imu-transformations/pl_imu_transformations.py deleted file mode 100644 index e3362e5a1..000000000 --- a/alpha-lab/imu-transformations/pl_imu_transformations.py +++ /dev/null @@ -1,153 +0,0 @@ -import numpy as np -from scipy.spatial.transform import Rotation as R - -def imu_heading_in_world(imu_quaternions): - """ - Construct heading vectors from the IMU's quaternion values. - - Inputs: - - imu_quaternions (Nx4 np.array): A timeseries of quaternions - from Neon's IMU stream. - - Returns: - - headings_in_world (Nx3 np.array): The corresponding timeseries of - IMU heading vectors in the world coordinate system. - """ - - # We start by specifying the direction of a neutral heading vector - # in the IMU's coordinate system. - imu_neutral_heading = np.array([0.0, 1.0, 0.0]) - - # This array contains a timeseries of transformation matrices, - # as calculated from the IMU's timeseries of quaternions values. - # Each of these matrices are used to transform points in the IMU - # coordinate system to their corresponding coordinates in the world - # coordinate system. - world_rotation_matrices = R.from_quat(imu_quaternions).as_matrix() - - # We now apply each transformation matrix to the neutral IMU heading vector - # to obtain a timeseries of heading vectors in the world coordinate system. - headings_in_world = world_rotation_matrices @ imu_neutral_heading - - return headings_in_world - - -def gaze_scene_to_world(gaze_elevations, gaze_azimuths, imu_quaternions): - """ - Transform a 3D gaze ray to the world coordinate system. - - Note that the gaze data and the IMU quaternion should be sampled - at the same timestamps. You can linearly interpolate the IMU data - to ensure this. - - The origin of the IMU coordinate system is the same as the - origin of the world coordinate system. - The code in this function is adapted from the `plimu` visualization utility: - https://github.com/pupil-labs/plimu/blob/8b94302982363b203dddea2b15f43c6da60e787e/src/pupil_labs/plimu/visualizer.py#L274-L279 - - This function makes use of the spherical_to_cartesian_scene function, - defined below, that converts 3D gaze rays from spherical coordinates - to Cartesian coordinates. - - Inputs: - - gaze_elevations (Nx1 np.array): A timeseries of gaze elevations (degrees), - specified in the scene camera coordinate system. - - gaze_azimuths (Nx1 np.array): A timeseries of gaze azimuths (degrees), - specified in the scene camera coordinate system. - - imu_quaternions (Nx4 np.array): A timeseries of quaternion values - from Neon's IMU. - - Returns: - - gazes_in_world (Nx3 np.array): The corresponding timeseries of - 3D Cartesian gaze unit vectors, specified in the world coordinate system. - """ - - # The IMU and scene camera coordinate systems have a fixed - # 102 degree rotation offset. See: - # https://docs.pupil-labs.com/neon/data-collection/data-streams/#movement-imu-data - imu_scene_rotation_diff = np.deg2rad(-90 - 12) - - # This matrix is used to transform points in the scene - # camera coordinate system to their corresponding coordinates - # in the IMU coordinate system. - scene_to_imu = np.array( - [ - [1.0, 0.0, 0.0], - [ - 0.0, - np.cos(imu_scene_rotation_diff), - -np.sin(imu_scene_rotation_diff), - ], - [ - 0.0, - np.sin(imu_scene_rotation_diff), - np.cos(imu_scene_rotation_diff), - ], - ] - ) - - # Neon provides 3D gaze in spherical coordinates by default, - # so we first transform the gaze data from spherical coordinates - # to Cartesian coordinates. - cart_gazes_in_scene = spherical_to_cartesian_scene(gaze_elevations, gaze_azimuths) - - # Apply the transformation from the scene camera to the IMU coordinate system. - gazes_in_imu = scene_to_imu @ cart_gazes_in_scene.T - - # This array contains a timeseries of transformation matrices, - # as calculated from the IMU's timeseries of quaternions values. - # Each of these matrices are used to transform points in the IMU coordinate - # system to their corresponding coordinates in the world coordinate system. - imu_to_world_matrices = R.from_quat(imu_quaternions).as_matrix() - - # Apply the transformations from the IMU to the world coordinate system. - gazes_in_world = [ - imu_to_world @ gaze - for imu_to_world, gaze in zip(imu_to_world_matrices, gazes_in_imu.T) - ] - - return np.array(gazes_in_world) - - -def spherical_to_cartesian_scene(elevations, azimuths): - """ - Convert Neon's spherical representation of 3D gaze to Cartesian coordinates. - - Inputs: - - elevations (Nx1 np.array): A timeseries of gaze elevations (degrees), - specified in the scene camera coordinate system. - - azimuths (Nx1 np.array): A timeseries of gaze azimuths (degrees), - specified in the scene camera coordinate system. - - Returns: - - cartesian_unit_vectors (Nx3 np.array): A timeseries of gaze unit - vectors, in Cartesian coordinates, specified in the scene camera - coordinate system. - """ - - elevations_rad = np.deg2rad(elevations) - azimuths_rad = np.deg2rad(azimuths) - - # Elevation of 0 in Neon system corresponds to Y = 0, but - # an elevation of 0 in traditional spherical coordinates would - # correspond to Y = 1, so first we convert elevation to the - # more traditional format. - elevations_rad += np.pi / 2 - - # Azimuth of 0 in Neon system corresponds to X = 0, but - # an azimuth of 0 in traditional spherical coordinates would - # correspond to X = 1. Also, azimuth to the right in Neon is - # more positive, whereas it is more negative in traditional spherical coordiantes. - # So, first we convert azimuth to the more traditional format. - azimuths_rad *= -1.0 - azimuths_rad += np.pi / 2 - - cartesian_unit_vectors = np.array( - [ - np.sin(elevations_rad) * np.cos(azimuths_rad), - np.cos(elevations_rad), - np.sin(elevations_rad) * np.sin(azimuths_rad), - ] - ).T - - return cartesian_unit_vectors diff --git a/alpha-lab/imu-transformations/pl_imu_transformations_no_comments.py b/alpha-lab/imu-transformations/pl_imu_transformations_no_comments.py deleted file mode 100644 index 2af0fb828..000000000 --- a/alpha-lab/imu-transformations/pl_imu_transformations_no_comments.py +++ /dev/null @@ -1,57 +0,0 @@ -import numpy as np -from scipy.spatial.transform import Rotation as R - -def imu_heading_in_world(imu_quaternions): - imu_neutral_heading = np.array([0.0, 1.0, 0.0]) - world_rotation_matrices = R.from_quat(imu_quaternions).as_matrix() - headings_in_world = world_rotation_matrices @ imu_neutral_heading - return headings_in_world - - -def gaze_scene_to_world(gaze_elevations, gaze_azimuths, imu_quaternions): - imu_scene_rotation_diff = np.deg2rad(-90 - 12) - scene_to_imu = np.array( - [ - [1.0, 0.0, 0.0], - [ - 0.0, - np.cos(imu_scene_rotation_diff), - -np.sin(imu_scene_rotation_diff), - ], - [ - 0.0, - np.sin(imu_scene_rotation_diff), - np.cos(imu_scene_rotation_diff), - ], - ] - ) - - cart_gazes_in_scene = spherical_to_cartesian_scene(gaze_elevations, gaze_azimuths) - gazes_in_imu = scene_to_imu @ cart_gazes_in_scene.T - imu_to_world_matrices = R.from_quat(imu_quaternions).as_matrix() - gazes_in_world = [ - imu_to_world @ gaze - for imu_to_world, gaze in zip(imu_to_world_matrices, gazes_in_imu.T) - ] - - return np.array(gazes_in_world) - - -def spherical_to_cartesian_scene(elevations, azimuths): - elevations_rad = np.deg2rad(elevations) - azimuths_rad = np.deg2rad(azimuths) - - elevations_rad += np.pi / 2 - - azimuths_rad *= -1.0 - azimuths_rad += np.pi / 2 - - cartesian_unit_vectors = np.array( - [ - np.sin(elevations_rad) * np.cos(azimuths_rad), - np.cos(elevations_rad), - np.sin(elevations_rad) * np.sin(azimuths_rad), - ] - ).T - - return cartesian_unit_vectors From cc8a873914078ca107392e5a97dc5003dd3298f4 Mon Sep 17 00:00:00 2001 From: Robert Ennis Date: Wed, 21 Aug 2024 14:12:33 +0200 Subject: [PATCH 20/54] small cleanup --- alpha-lab/imu-transformations/index.md | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/alpha-lab/imu-transformations/index.md b/alpha-lab/imu-transformations/index.md index e449d179d..2aa7c1648 100644 --- a/alpha-lab/imu-transformations/index.md +++ b/alpha-lab/imu-transformations/index.md @@ -75,7 +75,7 @@ the `gaze_scene_to_world` function to reconstruct the pose of the eyes in the wo When studying head orientation and gaze orientation as observers navigate a 3D environment, it can be useful to know how much these quantities deviate from pointing at a given landmark. For instance, you might want to -know when someone’s gaze or heading deviates from pointing at the horizon. This can be simplified by +know when someone’s gaze or heading deviates from parallel with the horizon. This can be simplified by converting world points from Cartesian to spherical coordinates. The orientation values from the IMU are already in such a format. For the values returned by `gaze_scene_to_world`, the function below will do the necessary transformation. When wearing Neon normally, then an elevation and azimuth of 0 degrees corresponds to a neutral orientation: @@ -96,7 +96,6 @@ eye3d = pd.read_csv("3d_eye_states.csv") imu = pd.read_csv("imu.csv") gaze_ts = gaze["timestamp [ns]"] -eye3d_ts = eye3d["timestamp [ns]"] imu_ts = imu["timestamp [ns]"] # We have more gaze datapoints (sampled at 200Hz) than @@ -133,6 +132,11 @@ eyeball_centers_left = np.array([ imu_headings = imu_heading_in_world(quaternions_resampled) +world_accelerations = imu_acceleration_in_world( + accelerations_resampled, + quaternions_resampled, +) + world_gazes = gaze_scene_to_world( gaze["elevation [deg]"], gaze["azimuth [deg]"], @@ -145,11 +149,6 @@ eye_centers_left_world, optical_axes_left_world = eyestate_to_world( quaternions_resampled, ) -world_accelerations = imu_acceleration_in_world( - accelerations_resampled, - quaternions_resampled, -) - gaze_elevations_world, gaze_azimuths_world = cartesian_to_spherical_world(world_gazes) ``` From 623274be1fb16ba148bbe7cdfad4b683c2106096 Mon Sep 17 00:00:00 2001 From: Robert Ennis Date: Wed, 21 Aug 2024 15:02:31 +0200 Subject: [PATCH 21/54] update github workflows to accomodate importing code snippets from a gist (as submodule) - relevant for IMU alpha lab and later articles --- .github/workflows/PR-checks.yml | 3 ++- .github/workflows/build-deploy-production.yml | 3 ++- .github/workflows/build-deploy-staging.yml | 3 ++- .github/workflows/build-only.yml | 3 ++- 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/.github/workflows/PR-checks.yml b/.github/workflows/PR-checks.yml index ec237fd3e..bab62093d 100644 --- a/.github/workflows/PR-checks.yml +++ b/.github/workflows/PR-checks.yml @@ -27,9 +27,10 @@ jobs: working-directory: ./${{ matrix.component }} run: npm install - - name: Copy node_modules + - name: Copy node_modules & init submodules shell: bash run: | + git submodule update --init --recursive cp -r ${{ matrix.component }}/node_modules . ls -la diff --git a/.github/workflows/build-deploy-production.yml b/.github/workflows/build-deploy-production.yml index 682612ab0..17aa6638a 100644 --- a/.github/workflows/build-deploy-production.yml +++ b/.github/workflows/build-deploy-production.yml @@ -122,9 +122,10 @@ jobs: run: npm install # Copy node modules to provide dependencies for shared components in root folder - - name: Copy node_modules + - name: Copy node_modules & init submodules shell: bash run: | + git submodule update --init --recursive cp -r alpha-lab/node_modules . ls -la diff --git a/.github/workflows/build-deploy-staging.yml b/.github/workflows/build-deploy-staging.yml index 92b61a2bf..4d425cee1 100644 --- a/.github/workflows/build-deploy-staging.yml +++ b/.github/workflows/build-deploy-staging.yml @@ -120,9 +120,10 @@ jobs: run: npm install # Copy node modules to provide dependencies for shared components in root folder - - name: Copy node_modules + - name: Copy node_modules & init submodules shell: bash run: | + git submodule update --init --recursive cp -r alpha-lab/node_modules . ls -la diff --git a/.github/workflows/build-only.yml b/.github/workflows/build-only.yml index cab837c5e..449e4244e 100644 --- a/.github/workflows/build-only.yml +++ b/.github/workflows/build-only.yml @@ -120,9 +120,10 @@ jobs: run: npm install # Copy node modules to provide dependencies for shared components in root folder - - name: Copy node_modules + - name: Copy node_modules & init submodules shell: bash run: | + git submodule update --init --recursive cp -r alpha-lab/node_modules . ls -la From b96ddb2a2d1063e5e7f3268ac888180690b660fe Mon Sep 17 00:00:00 2001 From: Robert Ennis Date: Thu, 22 Aug 2024 11:55:29 +0200 Subject: [PATCH 22/54] transition away from gist approach, restructure/compactify imu code, change structure of article accordingly --- .gitmodules | 3 - alpha-lab/imu-transformations/index.md | 204 ++++++++++++++++-- .../pl-imu-transformations | 1 - 3 files changed, 183 insertions(+), 25 deletions(-) delete mode 100644 .gitmodules delete mode 160000 alpha-lab/imu-transformations/pl-imu-transformations diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index 32e785748..000000000 --- a/.gitmodules +++ /dev/null @@ -1,3 +0,0 @@ -[submodule "alpha-lab/imu-transformations/pl-imu-transformations"] - path = alpha-lab/imu-transformations/pl-imu-transformations - url = https://gist.github.com/47303f69efcff77bd634c82c86612b84.git diff --git a/alpha-lab/imu-transformations/index.md b/alpha-lab/imu-transformations/index.md index 2aa7c1648..76f54de73 100644 --- a/alpha-lab/imu-transformations/index.md +++ b/alpha-lab/imu-transformations/index.md @@ -35,40 +35,173 @@ This guide contains various transformation functions that can assist when analys While working through this guide, it can be helpful to try out our IMU visualization utility, [plimu](https://github.com/pupil-labs/plimu). This can assist in understanding the IMU data and the various coordinate systems. +## Transforming to World Coordinates + +One of the key steps when dealing with the IMU is the transformation that take coordinates in the local IMU coordinate system to their corresponding coordinates in the world coordinate system. The quaternion values provided by the IMU can be used to convert between the two coordinate systems. The `transform_imu_to_world` function, defined below, applies the transformation and will be used throughout this article. + +```python +def transform_imu_to_world(imu_coordinates, imu_quaternions): + # This array contains a timeseries of transformation matrices, + # as calculated from the IMU's timeseries of quaternions values. + imu_to_world_matrices = R.from_quat(imu_quaternions).as_matrix() + + if len(imu_coordinates) == 1: + return imu_to_world_matrices @ imu_coordinates + else: + return np.array([ + imu_to_world @ imu_coord + for imu_to_world, imu_coord in zip( + imu_to_world_matrices, imu_coordinates + ) + ]) +``` + +Now that we have the `transform_imu_to_world` function, let's use it! + ## Obtain IMU Heading Vectors -An alternate representation of IMU data is a heading vector that points outwards from the center of the IMU. Neutral orientation of the IMU would correspond to a heading vector that points at magnetic North and that is oriented perpendicular to the line of gravity: +One representation of IMU orientation data is a heading vector that points outwards from the center of the IMU. Neutral orientation of the IMU would correspond to a heading vector that points at magnetic North and that is oriented perpendicular to the line of gravity: ```python - +heading_neutral_in_imu_coords = np.array([0.0, 1.0, 0.0]) +headings_in_world = transform_imu_to_world(heading_neutral_in_imu_coords, imu_quaternions) ``` - -## Transform IMU Acceleration Data to World Coordinates -We mentioned above that the IMU’s acceleration data are specified with respect to the IMU’s coordinate system. Sometimes, it can be useful to have the acceleration data specified in the world coordinate system instead. The function below will perform this transformation: +## Transform Acceleration Data to World Coordinates + +The IMU’s acceleration data are specified in IMU's local coordinate system. Sometimes, it can be useful to have the acceleration data specified in the world coordinate system instead: ```python - +accelerations_in_world = transform_imu_to_world(imu_accelerations, imu_quaternions) ``` -## Represent IMU and Gaze Data in the Same Coordinate System +## Transform Gaze Data to World Coordinates Neon simultaneously records gaze and IMU data, making it possible to study the relationship between head and eye movements. -To facilitate the comparison, it can be useful to represent them in the same coordinate system. The coordinates of gaze are specified with respect to the scene camera coordinate system and the function below, `gaze_scene_to_world`, uses data from the IMU to transform gaze to the world coordinate system: +To facilitate the comparison, it can be useful to represent them in the same coordinate system. The coordinates of gaze are specified with respect to the scene camera coordinate system and the function below, `gaze_scene_to_world`, uses data from the IMU to transform gaze to the world coordinate system. The `gaze_scene_to_world` function depends on the `transform_scene_to_imu` and `spherical_to_cartesian_scene`, which we define first. ```python - +def transform_scene_to_imu(coords_in_scene, translation = None): + # The IMU and scene camera coordinate systems have a fixed + # 102 degree rotation offset. See: + # https://docs.pupil-labs.com/neon/data-collection/data-streams/#movement-imu-data + imu_scene_rotation_diff = np.deg2rad(-102) + scene_to_imu = np.array( + [ + [1.0, 0.0, 0.0], + [ + 0.0, + np.cos(imu_scene_rotation_diff), + -np.sin(imu_scene_rotation_diff), + ], + [ + 0.0, + np.sin(imu_scene_rotation_diff), + np.cos(imu_scene_rotation_diff), + ], + ] + ) + + if translation: + scene_to_imu_homogeneous = np.zeros((4, 4)) + scene_to_imu_homogeneous[:3, :3] = scene_to_imu + scene_to_imu_homogeneous[:3, 3] = translation + + coords_in_scene_homogeneous = cv2.convertPointsToHomogeneous(coords_in_scene) + return cv2.convertPointsFromHomogeneous(scene_to_imu_homogeneous @ coords_in_scene_homogeneous) + else: + return scene_to_imu @ coords_in_scene + + +def spherical_to_cartesian_scene(elevations, azimuths): + """ + Convert Neon's spherical representation of 3D gaze to Cartesian coordinates. + """ + + elevations_rad = np.deg2rad(elevations) + azimuths_rad = np.deg2rad(azimuths) + + # Elevation of 0 in Neon system corresponds to Y = 0, but + # an elevation of 0 in traditional spherical coordinates would + # correspond to Y = 1, so we convert elevation to the + # more traditional format. + elevations_rad += np.pi / 2 + + # Azimuth of 0 in Neon system corresponds to X = 0, but + # an azimuth of 0 in traditional spherical coordinates would + # correspond to X = 1. Also, azimuth to the right in Neon is + # more positive, whereas it is more negative in traditional spherical coordiantes. + # So, we convert azimuth to the more traditional format. + azimuths_rad *= -1.0 + azimuths_rad += np.pi / 2 + + return np.array( + [ + np.sin(elevations_rad) * np.cos(azimuths_rad), + np.cos(elevations_rad), + np.sin(elevations_rad) * np.sin(azimuths_rad), + ] + ).T ``` -## Represent IMU and 3D Eyestate in the Same Coordinate System +Now, we have the tools to build the `gaze_scene_to_world` function. Note that the origin of the IMU coordinate system is the same as the origin of the world coordinate system.: -The [3D eyestate estimates](https://docs.pupil-labs.com/neon/data-collection/data-streams/#_3d-eye-states) -provided by Neon are aligned with the scene camera coordinate system. This means we can reuse elements of -the `gaze_scene_to_world` function to reconstruct the pose of the eyes in the world coordinate system: +```python +def gaze_scene_to_world(gaze_elevations, gaze_azimuths, imu_quaternions): + """ + Note that the gaze data and the IMU quaternions should be sampled + at the same timestamps. You can linearly interpolate the IMU data + to ensure this. + + The code in this function is adapted from the `plimu` visualization utility: + https://github.com/pupil-labs/plimu/blob/8b94302982363b203dddea2b15f43c6da60e787e/src/pupil_labs/plimu/visualizer.py#L274-L279 + + This function makes use of the spherical_to_cartesian_scene function, + defined below, that converts Neon's 3D gaze rays from spherical coordinates + to Cartesian coordinates. + """ + + cart_gazes_in_scene = spherical_to_cartesian_scene(gaze_elevations, gaze_azimuths) + gazes_in_imu = transform_scene_to_imu(cart_gazes_in_scene.T) + return imu_to_world(gazes_in_imu.T, imu_quaternions) +``` + +## Transform 3D Eyestate to World Coordinates + +The [3D eyestate estimates](https://docs.pupil-labs.com/neon/data-collection/data-streams/#_3d-eye-states) provided by Neon are aligned with the scene camera coordinate system. This means we can reuse elements of the `gaze_scene_to_world` function to reconstruct the pose of the eyes in the world coordinate system. Note that the origin of the IMU coordinate system is the same as the origin of the world coordinate system. ```python - +def eyestate_to_world(eyeball_centers, optical_axes, imu_quaternions): + """ + Note that the 3D eyestate data and the IMU quaternions should be sampled + at the same timestamps. You can linearly interpolate the IMU data + to ensure this. + + The code in this function is adapted from the `plimu` visualization utility: + https://github.com/pupil-labs/plimu/blob/8b94302982363b203dddea2b15f43c6da60e787e/src/pupil_labs/plimu/visualizer.py#L274-L279 + """ + + # The eyeball centers are specified in terms of their distance from + # the center of the scene camera, so to accurately convert them to + # world coordinates, we need the position of the scene camera in + # the IMU coordinate system. Here, we express that position + # in millimeters. + scene_camera_position_in_imu = np.array([0.0, -1.3, -6.62]) + + # The coordinate system of 3D eyestate is aligned with + # the coordinate system of the scene camera, so we can + # make use of the scene->to->IMU transformation procedure. + # + # We just need to take into account that the scene camera is + # offset from the IMU. + eyeball_centers_in_imu = transform_scene_to_imu(eyeball_centers.T, translation=scene_camera_position_in_imu) + optical_axes_in_imu = transform_scene_to_imu(optical_axes.T, translation=scene_camera_position_in_imu) + + eyeball_centers_in_world = imu_to_world(eyeball_centers_in_imu.T, imu_quaternions) + optical_axes_in_world = imu_to_world(optical_axes_in_imu.T, imu_quaternions) + + return eyeball_centers_in_world, optical_axes_in_world ``` ## Convert (Cartesian) World Points to Spherical Coordinates @@ -81,9 +214,40 @@ For the values returned by `gaze_scene_to_world`, the function below will do th When wearing Neon normally, then an elevation and azimuth of 0 degrees corresponds to a neutral orientation: i.e., aimed at magnetic North and parallel to the horizon. - ```python - +def cartesian_to_spherical_world(world_points_3d): + """ + Convert points in 3D Cartesian world coordinates to spherical coordinates. + + When wearing Neon normally, then an elevation and azimuth of 0 degrees corresponds + to a neutral orientation: i.e., aimed at magnetic North and parallel to the horizon. + + Note: + - For elevation: neutral orientation = 0 elevation; orientation upwards is positive; + orientation downwards is negative. + - For azimuth: neutral orientation = 0 azimuth, orientation leftwards is positive; + orientation rightwards is negative. + """ + + x = world_points_3d[:, 0] + y = world_points_3d[:, 1] + z = world_points_3d[:, 2] + + radii = np.sqrt(x**2 + y**2 + z**2) + + elevation = -(np.arccos(z / radii) - np.pi / 2) + azimuth = np.arctan2(y, x) - np.pi / 2 + + # Keep all azimuth values in the range of [-180, 180] to remain consistent + # with the yaw orientation values provided by the IMU + azimuth[azimuth < -np.pi] += 2 * np.pi + azimuth[azimuth > np.pi] -= 2 * np.pi + + # Convert from radians to degrees + elevation = np.rad2deg(elevation) + azimuth = np.rad2deg(azimuth) + + return elevation, azimuth ``` ## Analysis example @@ -130,12 +294,10 @@ eyeball_centers_left = np.array([ # Now, we can apply the functions. -imu_headings = imu_heading_in_world(quaternions_resampled) +heading_neutral_in_imu_coords = np.array([0.0, 1.0, 0.0]) +headings_in_world = transform_imu_to_world(heading_neutral_in_imu_coords, quaternions_resampled) -world_accelerations = imu_acceleration_in_world( - accelerations_resampled, - quaternions_resampled, -) +accelerations_in_world = transform_imu_to_world(accelerations_resampled, quaternions_resampled) world_gazes = gaze_scene_to_world( gaze["elevation [deg]"], diff --git a/alpha-lab/imu-transformations/pl-imu-transformations b/alpha-lab/imu-transformations/pl-imu-transformations deleted file mode 160000 index 0b702c0a7..000000000 --- a/alpha-lab/imu-transformations/pl-imu-transformations +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 0b702c0a75efcb1b82321042e17a025cf9a639c9 From 9c9c72ba083a709cd48aa6fbc2cf54faa92e8730 Mon Sep 17 00:00:00 2001 From: Robert Ennis Date: Thu, 22 Aug 2024 12:39:52 +0200 Subject: [PATCH 23/54] adapt text + code better to new format --- alpha-lab/imu-transformations/index.md | 230 +++++++++---------------- 1 file changed, 80 insertions(+), 150 deletions(-) diff --git a/alpha-lab/imu-transformations/index.md b/alpha-lab/imu-transformations/index.md index 76f54de73..6365d2d80 100644 --- a/alpha-lab/imu-transformations/index.md +++ b/alpha-lab/imu-transformations/index.md @@ -33,11 +33,13 @@ head and eye movements? The transformation functions in this tutorial will show This guide contains various transformation functions that can assist when analysing Neon's IMU data. -While working through this guide, it can be helpful to try out our IMU visualization utility, [plimu](https://github.com/pupil-labs/plimu). This can assist in understanding the IMU data and the various coordinate systems. +While working through this guide, it can be helpful to try out our IMU visualization utility, [plimu](https://github.com/pupil-labs/plimu). This can assist in understanding the IMU data and the various coordinate systems. For example, some of the code in this article is [adapted from it](https://github.com/pupil-labs/plimu/blob/8b94302982363b203dddea2b15f43c6da60e787e/src/pupil_labs/plimu/visualizer.py#L274-L279). -## Transforming to World Coordinates +## Transform to World Coordinates -One of the key steps when dealing with the IMU is the transformation that take coordinates in the local IMU coordinate system to their corresponding coordinates in the world coordinate system. The quaternion values provided by the IMU can be used to convert between the two coordinate systems. The `transform_imu_to_world` function, defined below, applies the transformation and will be used throughout this article. +One of the key steps when dealing with the IMU is the transformation that takes coordinates in the local IMU coordinate system to their corresponding coordinates in the world coordinate system. The quaternion values provided by the IMU can be used to convert between the two coordinate systems. The `transform_imu_to_world` function is defined below and will be used throughout this article. + +Note that the origin of the IMU coordinate system is the same as the origin of the world coordinate system. ```python def transform_imu_to_world(imu_coordinates, imu_quaternions): @@ -60,33 +62,40 @@ Now that we have the `transform_imu_to_world` function, let's use it! ## Obtain IMU Heading Vectors -One representation of IMU orientation data is a heading vector that points outwards from the center of the IMU. Neutral orientation of the IMU would correspond to a heading vector that points at magnetic North and that is oriented perpendicular to the line of gravity: +An alternative representation of IMU orientation data is a heading vector that points outwards from the center of the IMU. Neutral orientation of the IMU would correspond to a heading vector that points at magnetic North and that is oriented perpendicular to the line of gravity: ```python heading_neutral_in_imu_coords = np.array([0.0, 1.0, 0.0]) -headings_in_world = transform_imu_to_world(heading_neutral_in_imu_coords, imu_quaternions) +headings_in_world = transform_imu_to_world( + heading_neutral_in_imu_coords, + imu_quaternions, +) ``` -## Transform Acceleration Data to World Coordinates +## Acceleration in World -The IMU’s acceleration data are specified in IMU's local coordinate system. Sometimes, it can be useful to have the acceleration data specified in the world coordinate system instead: +The IMU’s acceleration data are specified in its local coordinate system. Sometimes, it can be useful to have the acceleration data specified in the world coordinate system instead: ```python -accelerations_in_world = transform_imu_to_world(imu_accelerations, imu_quaternions) +accelerations_in_world = transform_imu_to_world( + imu_accelerations, + imu_quaternions, +) ``` -## Transform Gaze Data to World Coordinates +## Gaze to World Coordinates Neon simultaneously records gaze and IMU data, making it possible to study the relationship between head and eye movements. -To facilitate the comparison, it can be useful to represent them in the same coordinate system. The coordinates of gaze are specified with respect to the scene camera coordinate system and the function below, `gaze_scene_to_world`, uses data from the IMU to transform gaze to the world coordinate system. The `gaze_scene_to_world` function depends on the `transform_scene_to_imu` and `spherical_to_cartesian_scene`, which we define first. +To facilitate the comparison, it can be useful to represent these data streams in the same coordinate system. An important step is accounting for [the fixed 102 degree rotation offset between the scene camera and IMU coordinate systems](https://docs.pupil-labs.com/neon/data-collection/data-streams/#movement-imu-data), as depicted below. + +![Diagrams showing the 102 degree rotation offset between the IMU and scene camera coordinate systems.](./imu-scene_camera_offset-black.jpg) + +We can use data from the IMU to transform gaze from scene camera coordinates to world coordinates. This is facilitated by the `transform_scene_to_imu` and `spherical_to_cartesian_scene` functions: ```python def transform_scene_to_imu(coords_in_scene, translation = None): - # The IMU and scene camera coordinate systems have a fixed - # 102 degree rotation offset. See: - # https://docs.pupil-labs.com/neon/data-collection/data-streams/#movement-imu-data - imu_scene_rotation_diff = np.deg2rad(-102) + imu_scene_rotation_diff = np.deg2rad(-90 - 12) scene_to_imu = np.array( [ [1.0, 0.0, 0.0], @@ -109,14 +118,16 @@ def transform_scene_to_imu(coords_in_scene, translation = None): scene_to_imu_homogeneous[:3, 3] = translation coords_in_scene_homogeneous = cv2.convertPointsToHomogeneous(coords_in_scene) - return cv2.convertPointsFromHomogeneous(scene_to_imu_homogeneous @ coords_in_scene_homogeneous) + return cv2.convertPointsFromHomogeneous( + scene_to_imu_homogeneous @ coords_in_scene_homogeneous + ) else: return scene_to_imu @ coords_in_scene def spherical_to_cartesian_scene(elevations, azimuths): """ - Convert Neon's spherical representation of 3D gaze to Cartesian coordinates. + Convert Neon's spherical representation of 3D gaze to Cartesian coordinates. """ elevations_rad = np.deg2rad(elevations) @@ -131,8 +142,9 @@ def spherical_to_cartesian_scene(elevations, azimuths): # Azimuth of 0 in Neon system corresponds to X = 0, but # an azimuth of 0 in traditional spherical coordinates would # correspond to X = 1. Also, azimuth to the right in Neon is - # more positive, whereas it is more negative in traditional spherical coordiantes. - # So, we convert azimuth to the more traditional format. + # more positive, whereas it is more negative in traditional + # spherical coordiantes. So, we convert azimuth to the more + # traditional format. azimuths_rad *= -1.0 azimuths_rad += np.pi / 2 @@ -145,88 +157,71 @@ def spherical_to_cartesian_scene(elevations, azimuths): ).T ``` -Now, we have the tools to build the `gaze_scene_to_world` function. Note that the origin of the IMU coordinate system is the same as the origin of the world coordinate system.: +Now we have the tools to convert gaze data to world coordinates: ```python -def gaze_scene_to_world(gaze_elevations, gaze_azimuths, imu_quaternions): - """ - Note that the gaze data and the IMU quaternions should be sampled - at the same timestamps. You can linearly interpolate the IMU data - to ensure this. +# The gaze data and the IMU quaternions should be sampled at the +# same timestamps. You can linearly interpolate the IMU data to +# ensure this. - The code in this function is adapted from the `plimu` visualization utility: - https://github.com/pupil-labs/plimu/blob/8b94302982363b203dddea2b15f43c6da60e787e/src/pupil_labs/plimu/visualizer.py#L274-L279 - - This function makes use of the spherical_to_cartesian_scene function, - defined below, that converts Neon's 3D gaze rays from spherical coordinates - to Cartesian coordinates. - """ - - cart_gazes_in_scene = spherical_to_cartesian_scene(gaze_elevations, gaze_azimuths) - gazes_in_imu = transform_scene_to_imu(cart_gazes_in_scene.T) - return imu_to_world(gazes_in_imu.T, imu_quaternions) +cart_gazes_in_scene = spherical_to_cartesian_scene(gaze_elevations, gaze_azimuths) +gazes_in_imu = transform_scene_to_imu(cart_gazes_in_scene.T) +gazes_in_world = transform_imu_to_world(gazes_in_imu.T, imu_quaternions) ``` -## Transform 3D Eyestate to World Coordinates +## Eyestate to World Coordinates -The [3D eyestate estimates](https://docs.pupil-labs.com/neon/data-collection/data-streams/#_3d-eye-states) provided by Neon are aligned with the scene camera coordinate system. This means we can reuse elements of the `gaze_scene_to_world` function to reconstruct the pose of the eyes in the world coordinate system. Note that the origin of the IMU coordinate system is the same as the origin of the world coordinate system. +The [3D eyestate estimates](https://docs.pupil-labs.com/neon/data-collection/data-streams/#_3d-eye-states) provided by Neon are aligned with the scene camera coordinate system. To reconstruct the pose of the eyes in the world coordinate system, we need to also consider that the scene camera coordinate system is positioned downwards and a bit back from the IMU: ```python -def eyestate_to_world(eyeball_centers, optical_axes, imu_quaternions): - """ - Note that the 3D eyestate data and the IMU quaternions should be sampled - at the same timestamps. You can linearly interpolate the IMU data - to ensure this. - - The code in this function is adapted from the `plimu` visualization utility: - https://github.com/pupil-labs/plimu/blob/8b94302982363b203dddea2b15f43c6da60e787e/src/pupil_labs/plimu/visualizer.py#L274-L279 - """ +# The 3D eyestate data and the IMU quaternions should be sampled +# at the same timestamps. You can linearly interpolate the IMU data +# to ensure this. + +# The eyeball centers are specified in terms of their distance from +# the center of the scene camera, so to accurately convert them to +# world coordinates, we need to account for the position of the +# scene camera in the IMU coordinate system. Here, we express that +# position in millimeters. +scene_camera_position_in_imu = np.array([0.0, -1.3, -6.62]) + +eyeball_centers_in_imu = transform_scene_to_imu( + eyeball_centers.T, + translation=scene_camera_position_in_imu, +) +eyeball_centers_in_world = transform_imu_to_world( + eyeball_centers_in_imu.T, + imu_quaternions, +) - # The eyeball centers are specified in terms of their distance from - # the center of the scene camera, so to accurately convert them to - # world coordinates, we need the position of the scene camera in - # the IMU coordinate system. Here, we express that position - # in millimeters. - scene_camera_position_in_imu = np.array([0.0, -1.3, -6.62]) - - # The coordinate system of 3D eyestate is aligned with - # the coordinate system of the scene camera, so we can - # make use of the scene->to->IMU transformation procedure. - # - # We just need to take into account that the scene camera is - # offset from the IMU. - eyeball_centers_in_imu = transform_scene_to_imu(eyeball_centers.T, translation=scene_camera_position_in_imu) - optical_axes_in_imu = transform_scene_to_imu(optical_axes.T, translation=scene_camera_position_in_imu) - - eyeball_centers_in_world = imu_to_world(eyeball_centers_in_imu.T, imu_quaternions) - optical_axes_in_world = imu_to_world(optical_axes_in_imu.T, imu_quaternions) - - return eyeball_centers_in_world, optical_axes_in_world +optical_axes_in_imu = transform_scene_to_imu( + optical_axes.T, + translation=scene_camera_position_in_imu, +) +optical_axes_in_world = transform_imu_to_world( + optical_axes_in_imu.T, + imu_quaternions +) ``` -## Convert (Cartesian) World Points to Spherical Coordinates +## World Spherical Coordinates -When studying head orientation and gaze orientation as observers navigate a 3D environment, it can be useful -to know how much these quantities deviate from pointing at a given landmark. For instance, you might want to -know when someone’s gaze or heading deviates from parallel with the horizon. This can be simplified by -converting world points from Cartesian to spherical coordinates. The orientation values from the IMU are already in such a format. -For the values returned by `gaze_scene_to_world`, the function below will do the necessary transformation. -When wearing Neon normally, then an elevation and azimuth of 0 degrees corresponds to a neutral orientation: -i.e., aimed at magnetic North and parallel to the horizon. +When studying head orientation and gaze orientation as observers navigate a 3D environment, it can be useful to know how much these quantities deviate from pointing at a given landmark or direction. For instance, you might want to know when someone’s gaze or heading deviates from parallel with the horizon. This can be simplified by converting world points from Cartesian to spherical coordinates. The orientation values from the IMU are already in such a format. For gaze data in world coordinates, the function below will do the necessary transformation. When wearing Neon normally, an elevation and azimuth of 0 degrees corresponds to a neutral orientation: i.e., aimed at magnetic North and parallel to the horizon. ```python def cartesian_to_spherical_world(world_points_3d): """ - Convert points in 3D Cartesian world coordinates to spherical coordinates. - - When wearing Neon normally, then an elevation and azimuth of 0 degrees corresponds - to a neutral orientation: i.e., aimed at magnetic North and parallel to the horizon. + Convert points in 3D Cartesian world coordinates to spherical coordinates. - Note: - - For elevation: neutral orientation = 0 elevation; orientation upwards is positive; - orientation downwards is negative. - - For azimuth: neutral orientation = 0 azimuth, orientation leftwards is positive; - orientation rightwards is negative. + For elevation: + - Neutral orientation = 0 (i.e., parallel with horizon) + - Upwards is positive + - Downwards is negative + + For azimuth: + - Neutral orientation = 0 (i.e., aligned with magnetic North) + - Leftwards is positive + - Rightwards is negative """ x = world_points_3d[:, 0] @@ -238,82 +233,17 @@ def cartesian_to_spherical_world(world_points_3d): elevation = -(np.arccos(z / radii) - np.pi / 2) azimuth = np.arctan2(y, x) - np.pi / 2 - # Keep all azimuth values in the range of [-180, 180] to remain consistent - # with the yaw orientation values provided by the IMU + # Keep all azimuth values in the range of [-180, 180] to remain + # consistent with the yaw orientation values provided by the IMU. azimuth[azimuth < -np.pi] += 2 * np.pi azimuth[azimuth > np.pi] -= 2 * np.pi - # Convert from radians to degrees elevation = np.rad2deg(elevation) azimuth = np.rad2deg(azimuth) return elevation, azimuth ``` -## Analysis example - -Below is a brief example of how to run the functions on this page using IMU data downloaded from Pupil Cloud. - -```python -gaze = pd.read_csv("gaze.csv") -eye3d = pd.read_csv("3d_eye_states.csv") -imu = pd.read_csv("imu.csv") - -gaze_ts = gaze["timestamp [ns]"] -imu_ts = imu["timestamp [ns]"] - -# We have more gaze datapoints (sampled at 200Hz) than -# IMU datapoints (sampled at 110Hz), so linearly interpolate -# the IMU datapoints to be congruent with gaze. -quaternions_resampled = np.array([ - np.interp(gaze_ts, imu_ts, imu["quaternion x"]), - np.interp(gaze_ts, imu_ts, imu["quaternion y"]), - np.interp(gaze_ts, imu_ts, imu["quaternion z"]), - np.interp(gaze_ts, imu_ts, imu["quaternion w"]), -]).T - -accelerations_resampled = np.array([ - np.interp(gaze_ts, imu_ts, imu["acceleration x [g]"]), - np.interp(gaze_ts, imu_ts, imu["acceleration y [g]"]), - np.interp(gaze_ts, imu_ts, imu["acceleration z [g]"]), -]).T - -# Put the eyestate data in a format that is compatible with -# the transformation functions from this article. -optical_axes_left = np.array([ - eye3d["optical axis left x"], - eye3d["optical axis left y"], - eye3d["optical axis left z"], -]).T - -eyeball_centers_left = np.array([ - eye3d["eyeball center left x [mm]"], - eye3d["eyeball center left y [mm]"], - eye3d["eyeball center left z [mm]"], -]).T - -# Now, we can apply the functions. - -heading_neutral_in_imu_coords = np.array([0.0, 1.0, 0.0]) -headings_in_world = transform_imu_to_world(heading_neutral_in_imu_coords, quaternions_resampled) - -accelerations_in_world = transform_imu_to_world(accelerations_resampled, quaternions_resampled) - -world_gazes = gaze_scene_to_world( - gaze["elevation [deg]"], - gaze["azimuth [deg]"], - quaternions_resampled, -) - -eye_centers_left_world, optical_axes_left_world = eyestate_to_world( - eyeball_centers_left, - optical_axes_left, - quaternions_resampled, -) - -gaze_elevations_world, gaze_azimuths_world = cartesian_to_spherical_world(world_gazes) -``` - ::: tip Need assistance with the IMU code in this article? Or do you have something more custom in mind? Reach out to us via email at [info@pupil-labs.com](mailto:info@pupil-labs.com), on our [Discord server](https://pupil-labs.com/chat/), or visit our [Support Page](https://pupil-labs.com/products/support/) for dedicated support options. ::: From d458968b7979541ae919c8db234df8b19ecc2a05 Mon Sep 17 00:00:00 2001 From: Robert Ennis Date: Thu, 22 Aug 2024 12:48:29 +0200 Subject: [PATCH 24/54] undo github actions submodule changes; add imu+scene diagram as png --- .github/workflows/PR-checks.yml | 3 +-- .github/workflows/build-deploy-production.yml | 3 +-- .github/workflows/build-deploy-staging.yml | 3 +-- .github/workflows/build-only.yml | 3 +-- .../imu-scene_camera_offset-black.png | Bin 0 -> 145548 bytes alpha-lab/imu-transformations/index.md | 2 +- 6 files changed, 5 insertions(+), 9 deletions(-) create mode 100644 alpha-lab/imu-transformations/imu-scene_camera_offset-black.png diff --git a/.github/workflows/PR-checks.yml b/.github/workflows/PR-checks.yml index bab62093d..ec237fd3e 100644 --- a/.github/workflows/PR-checks.yml +++ b/.github/workflows/PR-checks.yml @@ -27,10 +27,9 @@ jobs: working-directory: ./${{ matrix.component }} run: npm install - - name: Copy node_modules & init submodules + - name: Copy node_modules shell: bash run: | - git submodule update --init --recursive cp -r ${{ matrix.component }}/node_modules . ls -la diff --git a/.github/workflows/build-deploy-production.yml b/.github/workflows/build-deploy-production.yml index 17aa6638a..682612ab0 100644 --- a/.github/workflows/build-deploy-production.yml +++ b/.github/workflows/build-deploy-production.yml @@ -122,10 +122,9 @@ jobs: run: npm install # Copy node modules to provide dependencies for shared components in root folder - - name: Copy node_modules & init submodules + - name: Copy node_modules shell: bash run: | - git submodule update --init --recursive cp -r alpha-lab/node_modules . ls -la diff --git a/.github/workflows/build-deploy-staging.yml b/.github/workflows/build-deploy-staging.yml index 4d425cee1..92b61a2bf 100644 --- a/.github/workflows/build-deploy-staging.yml +++ b/.github/workflows/build-deploy-staging.yml @@ -120,10 +120,9 @@ jobs: run: npm install # Copy node modules to provide dependencies for shared components in root folder - - name: Copy node_modules & init submodules + - name: Copy node_modules shell: bash run: | - git submodule update --init --recursive cp -r alpha-lab/node_modules . ls -la diff --git a/.github/workflows/build-only.yml b/.github/workflows/build-only.yml index 449e4244e..cab837c5e 100644 --- a/.github/workflows/build-only.yml +++ b/.github/workflows/build-only.yml @@ -120,10 +120,9 @@ jobs: run: npm install # Copy node modules to provide dependencies for shared components in root folder - - name: Copy node_modules & init submodules + - name: Copy node_modules shell: bash run: | - git submodule update --init --recursive cp -r alpha-lab/node_modules . ls -la diff --git a/alpha-lab/imu-transformations/imu-scene_camera_offset-black.png b/alpha-lab/imu-transformations/imu-scene_camera_offset-black.png new file mode 100644 index 0000000000000000000000000000000000000000..808f96257312e2e3f806fc00e9676dfb7592586a GIT binary patch literal 145548 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


-s%pnEKG+%WvA0!+#a&Qk!&!r;`tieZ4G3-`&_k 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

;$ih}>U1Cm^TsBdXajxfuEIWI z5hNq8uo{JQ_(oe<4flZU`2hn7Hy6h{thzzEs~Aei4`I&fN*Ui#5qy0aH(LO!S<`3P zie6EKO0n_p`XB5{KCtZ20!CnX=WDl^n6E^z6Mgh!Ho!^$Y_Q@{>JtoZzOf#)L4ia~ z&j4brsCW?nTs5R`$&jyAF-J)&`?cS38Zbi*f8O-{fQs_E-I|&A-+gbDmEzfrh7MuW^)6FcegFGsf0wyw4JPk+2`$pz}nYYdA&%=-)7`DeWa+jTI9R$~ysC)wTC#GsvJEl`KfJoE z1Ft*wKCh*9SN9PU46MrW+l$qASO|DxA^D!>vODU{1jq66vm+FH=ru3Z& zG0vsf%z9zDXOc>($LOHVq;%NE@cL0Tla4(__vPxNku5JAQsnmyA60n$8KwlR|(}544Uu&Jv9?UKfpr zoT{kw-R6s$9=oIA7YHfMDa4H;KW{J>>>eOTlmmQ7rGj4m4aFo8<15zL#mo547 zvI3n2;ywCGHpLYpCy1GRA8dI;q#!LvaZ=!2@ zpu`E0NXB_1n-1?>qegONLBl9Qe@dVWNKSj&4~AI_m1xT_fpL z2d2-vjzv;{EHpz_zou0p$d>UsQDRkAtsoZvxZnkIWqnct-)A8TSq^bq8s%LaTQTzk zj5ch@p%()RQG*6B18m~C4CTGt79myaX`H3*luhe~MZ8rbPT+Va9PiRs&UzGOqVRN< zL@2T!qQkNMZZhEKfM*ZH`4G&XUfKp}avmIov1b>NG_8 zOM)hzlhbq+nxcDDcSt4nVj39|ey8tH5c+m|Rfc q(0~7j;QNn!f`YvsJ^tTiPFP!5{;Q0+|2G$T{mwbLI+i%xdiD=xZt))g literal 0 HcmV?d00001 diff --git a/neon/data-collection/data-streams/imu-scene_camera_offset-black.png b/neon/data-collection/data-streams/imu-scene_camera_offset-black.png new file mode 100644 index 0000000000000000000000000000000000000000..808f96257312e2e3f806fc00e9676dfb7592586a GIT binary patch literal 145548 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


-s%pnEKG+%WvA0!+#a&Qk!&!r;`tieZ4G3-`&_k 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 Zm*u}}eEN(4kcL1=iOGu=ix|B8e*pRP>CONE literal 0 HcmV?d00001 diff --git a/neon/data-collection/data-streams/index.md b/neon/data-collection/data-streams/index.md index bae4c18b2..dbb2b8a11 100644 --- a/neon/data-collection/data-streams/index.md +++ b/neon/data-collection/data-streams/index.md @@ -82,22 +82,34 @@ Audio recording is disabled in the Neon Companion app by default and can be enab ## Movement (IMU Data) Real-timePupil CloudNeon Player -The Neon module is equipped with a 9-DoF [inertial measurement unit](https://invensense.tdk.com/products/motion-tracking/9-axis/icm-20948/) (IMU) featuring an accelerometer, gyroscope, and magnetometer. The accelerometer and gyroscope measure linear acceleration and angular velocity, respectively, and are provided as raw values. +The Neon module is equipped with a 9-DoF [inertial measurement unit](https://invensense.tdk.com/products/motion-tracking/9-axis/icm-20948/) (IMU) featuring an accelerometer, gyroscope, and magnetometer. The accelerometer and gyroscope measure linear acceleration and angular velocity, respectively, and are provided as raw values. Acceleration is reported in terms of [g-force](https://en.wikipedia.org/wiki/G-force), which differs from free-fall acceleration due to gravity. For instance, when standing upright on Earth, acceleration along the Z-axis would be +1g, with 0g on the X and Y axes. -A fusion engine also combines these values with magnetometer readings to estimate the module's absolute orientation relative to magnetic north and gravity as a quaternion. Note that in order to obtain precise absolute yaw readings, the magnetometer needs to be [calibrated](/data-collection/calibrating-the-imu/). +A fusion engine also combines these values with magnetometer readings to estimate the module's absolute orientation in the world coordinate system as a quaternion: -The IMU is located in the top bar of the module and is sampled at 110 Hz. Its coordinate system is oriented with the x-axis pointing to the right, the y-axis pointing in front, and the z-axis pointing upwards. +- World y-axis: Points towards magnetic north. +- World z-axis: Points upwards, opposite gravity. +- World x-axis: Points rightwards, defined by the cross-product of Y and Z. + +Note that in order to obtain precise absolute yaw readings, the magnetometer needs to be [calibrated](/data-collection/calibrating-the-imu/). + +The IMU is located in the top bar of the module and is sampled at 110 Hz. Its local coordinate system is oriented with the x-axis pointing to the right, the y-axis pointing in front, and the z-axis pointing upwards. ![IMU Coordinate System](./imu-xyz-black.jpg) -When relating data from the IMU to things visible in the scene camera, it may be necessary to align their respective 3D coordinate systems. The IMU's coordinate system is rotated by 102° around the x-axis in relation to the scene camera's coordinate system. +When relating data from the IMU to things visible in the scene camera, it may be necessary to align their respective 3D coordinate systems. The IMU's coordinate system is rotated by 102° around the x-axis in relation to the scene camera's coordinate system. See our [IMU Transformations article](https://docs.pupil-labs.com/alpha-lab/imu-transformations/) for a guide. -![IMU Scene Camera](./imu-scene_camera-black.jpg) +![IMU Scene Camera](./imu-scene_camera_offset-black.png) ### Euler Angles -When exporting recordings from Pupil Cloud or Neon Player the IMU's orientation in Euler angles (i.e. roll, pitch, and yaw) is also available. +When exporting recordings from Pupil Cloud or Neon Player the IMU's orientation in Euler angles (i.e. pitch, yaw, and roll) is also available: + +- Pitch is defined as a rotation around the world x-axis with a value range of -90° to +90°. Wearing Neon upright and looking parallel to the horizon roughly corresponds to 0° pitch. Backward tilt is positive, forward is negative. +- Yaw is a rotation around the world z-axis with a value range of -180° to +180°. With a calibrated IMU, a yaw of 0° indicates alignment with magnetic north. Leftward turn is positive, rightward is negative. +- Roll is a rotations around the world y-axis with a value range of -180° to +180°. Wearing Neon upright with a neutral head pose roughly corresponds to a roll of 0°. Rightward tilt is positive, leftward is negative. -Pitch is defined as a rotation around the x-axis with a value range of -90° to +90°. Yaw and roll are rotations around the y- and z-axis, respectively, with value ranges of -180° to +180°. +::: tip +Neon may sit differently on each wearer’s face, causing deviations from a neutral orientation even when facing magnetic north. +::: -![IMU Pitch, Yaw, Roll](./imu-pitch_yaw_roll-black.jpg) +![IMU Pitch, Yaw, Roll](./imu-pitch-yaw-roll-black.png) From ba04e2d21b086e34118bce386223ea51aa47679a Mon Sep 17 00:00:00 2001 From: Robert Ennis Date: Mon, 2 Sep 2024 13:33:58 +0200 Subject: [PATCH 36/54] fix youtube preview link --- alpha-lab/imu-transformations/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/alpha-lab/imu-transformations/index.md b/alpha-lab/imu-transformations/index.md index a22152cc0..48a85f780 100644 --- a/alpha-lab/imu-transformations/index.md +++ b/alpha-lab/imu-transformations/index.md @@ -290,7 +290,7 @@ def cartesian_to_spherical_world(world_points_3d): Below, we present a video showing how some of the functions in this article where used to visualize different combinations of head and eye movements in world coordinates. The code for producing the visualization [can be found here](https://gist.github.com/rennis250/8a684ea1e2f92c79fa2104b7a0f30e20). - + ## Related content From 7f5a73f300500e743af460f093f8274e969baa52 Mon Sep 17 00:00:00 2001 From: Robert Ennis Date: Mon, 2 Sep 2024 13:57:12 +0200 Subject: [PATCH 37/54] formatting --- alpha-lab/imu-transformations/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/alpha-lab/imu-transformations/index.md b/alpha-lab/imu-transformations/index.md index 48a85f780..6eb35c8bc 100644 --- a/alpha-lab/imu-transformations/index.md +++ b/alpha-lab/imu-transformations/index.md @@ -59,7 +59,7 @@ def transform_imu_to_world(imu_coordinates, imu_quaternions): Now that we have the `transform_imu_to_world` function, let's use it! -## Obtain IMU Heading Vectors +### Obtain IMU Heading Vectors An alternative representation of IMU orientation data is a heading vector that points outwards from the center of the IMU. It can be useful to compare this heading vector with the 3D gaze vectors in world coordinates. @@ -73,7 +73,7 @@ def imu_heading_in_world(imu_quaternions): Neutral orientation of the IMU would correspond to a heading vector that points at magnetic North and that is oriented perpendicular to the line of gravity. -## IMU Acceleration in World +### IMU Acceleration in World The IMU’s acceleration data are specified in its local coordinate system. If you want to understand how the observer is accelerating through their environment, then it can be easier to have the acceleration data specified in the world coordinate system: From 57762e4a6a82aee9c2c7326b23ffffcd89828f39 Mon Sep 17 00:00:00 2001 From: Robert Ennis Date: Mon, 2 Sep 2024 14:07:09 +0200 Subject: [PATCH 38/54] formatting --- alpha-lab/imu-transformations/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/alpha-lab/imu-transformations/index.md b/alpha-lab/imu-transformations/index.md index 6eb35c8bc..846e37296 100644 --- a/alpha-lab/imu-transformations/index.md +++ b/alpha-lab/imu-transformations/index.md @@ -294,7 +294,7 @@ Below, we present a video showing how some of the functions in this article wher ## Related content -While working through this guide, it can be helpful to try out our IMU visualization utility, [plimu](https://github.com/pupil-labs/plimu). This can assist in understanding the IMU data and the various coordinate systems. For example, some of the code in this article is [adapted from it](https://github.com/pupil-labs/plimu/blob/8b94302982363b203dddea2b15f43c6da60e787e/src/pupil_labs/plimu/visualizer.py#L274-L279). +It can also be helpful to try out our IMU visualization utility, [plimu](https://github.com/pupil-labs/plimu). This can assist in understanding the IMU data and the various coordinate systems. For example, some of the code in this article is [adapted from it](https://github.com/pupil-labs/plimu/blob/8b94302982363b203dddea2b15f43c6da60e787e/src/pupil_labs/plimu/visualizer.py#L274-L279). ::: tip Need assistance with the IMU code in this article? Or do you have something more custom in mind? Reach out to us via email at [info@pupil-labs.com](mailto:info@pupil-labs.com), on our [Discord server](https://pupil-labs.com/chat/), or visit our [Support Page](https://pupil-labs.com/products/support/) for dedicated support options. From 47781974e64e70cd7cfe17f6e28a3b05ac674faa Mon Sep 17 00:00:00 2001 From: Robert Ennis Date: Mon, 2 Sep 2024 16:11:21 +0200 Subject: [PATCH 39/54] compress imu docs a bit, some tweaks for alpha labs article --- alpha-lab/imu-transformations/index.md | 2 +- neon/data-collection/data-streams/index.md | 10 ++-------- 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/alpha-lab/imu-transformations/index.md b/alpha-lab/imu-transformations/index.md index 846e37296..7090574f2 100644 --- a/alpha-lab/imu-transformations/index.md +++ b/alpha-lab/imu-transformations/index.md @@ -34,7 +34,7 @@ This guide contains various transformation functions that can assist when workin ## IMU to World Coordinates -One of the key steps when dealing with the IMU is the transformation that takes coordinates in the local IMU coordinate system to their corresponding coordinates in [the world coordinate system](http://docs.pupil-labs.com/neon/data-collection/data-streams/#movement-imu-data). The quaternion values provided by the IMU can be used to convert between the two coordinate systems. The `transform_imu_to_world` function, defined below, will be used throughout this article. +One of the key steps when working with IMU data is the transformation that takes coordinates in the local IMU coordinate system to their corresponding coordinates in [the world coordinate system](http://docs.pupil-labs.com/neon/data-collection/data-streams/#movement-imu-data). The quaternion values provided by the IMU can be used to convert between the two coordinate systems. The `transform_imu_to_world` function, defined below, will be used throughout this article. Note that the origin of the IMU coordinate system is the same as the origin of the world coordinate system. diff --git a/neon/data-collection/data-streams/index.md b/neon/data-collection/data-streams/index.md index dbb2b8a11..fb186441c 100644 --- a/neon/data-collection/data-streams/index.md +++ b/neon/data-collection/data-streams/index.md @@ -82,15 +82,9 @@ Audio recording is disabled in the Neon Companion app by default and can be enab ## Movement (IMU Data) Real-timePupil CloudNeon Player -The Neon module is equipped with a 9-DoF [inertial measurement unit](https://invensense.tdk.com/products/motion-tracking/9-axis/icm-20948/) (IMU) featuring an accelerometer, gyroscope, and magnetometer. The accelerometer and gyroscope measure linear acceleration and angular velocity, respectively, and are provided as raw values. Acceleration is reported in terms of [g-force](https://en.wikipedia.org/wiki/G-force), which differs from free-fall acceleration due to gravity. For instance, when standing upright on Earth, acceleration along the Z-axis would be +1g, with 0g on the X and Y axes. +The Neon module is equipped with a 9-DoF [inertial measurement unit](https://invensense.tdk.com/products/motion-tracking/9-axis/icm-20948/) (IMU) featuring an accelerometer, gyroscope, and magnetometer. The accelerometer and gyroscope measure linear acceleration and angular velocity, respectively, and are provided as raw values. -A fusion engine also combines these values with magnetometer readings to estimate the module's absolute orientation in the world coordinate system as a quaternion: - -- World y-axis: Points towards magnetic north. -- World z-axis: Points upwards, opposite gravity. -- World x-axis: Points rightwards, defined by the cross-product of Y and Z. - -Note that in order to obtain precise absolute yaw readings, the magnetometer needs to be [calibrated](/data-collection/calibrating-the-imu/). +A fusion engine also combines these values with magnetometer readings to estimate the module's absolute orientation relative to magnetic north (positive world y-axis), gravity (negative world z-axis), and a rightward pointing vector (positive world x-axis) as a quaternion. We refer to this as the world coordinate system. It is important to note that this is not the same as the local IMU coordinate system. The IMU is located in the top bar of the module and is sampled at 110 Hz. Its local coordinate system is oriented with the x-axis pointing to the right, the y-axis pointing in front, and the z-axis pointing upwards. From 2ab1b5352fd6e9fa917924671698af2c1d39760c Mon Sep 17 00:00:00 2001 From: Robert Ennis Date: Mon, 2 Sep 2024 16:25:54 +0200 Subject: [PATCH 40/54] add tip about pos/neg rotations --- neon/data-collection/data-streams/index.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/neon/data-collection/data-streams/index.md b/neon/data-collection/data-streams/index.md index fb186441c..7fdac4f17 100644 --- a/neon/data-collection/data-streams/index.md +++ b/neon/data-collection/data-streams/index.md @@ -94,6 +94,10 @@ When relating data from the IMU to things visible in the scene camera, it may be ![IMU Scene Camera](./imu-scene_camera_offset-black.png) +::: tip +Note that leftward rotations for the yaw values reported by the IMU are positive, whereas leftward rotations about the y-axis of the scene camera and 3D eye state coordinate systems are negative. +::: + ### Euler Angles When exporting recordings from Pupil Cloud or Neon Player the IMU's orientation in Euler angles (i.e. pitch, yaw, and roll) is also available: From 9b154a08bda1824d5d1a4e9f8310dc255951c9a3 Mon Sep 17 00:00:00 2001 From: Robert Ennis Date: Mon, 2 Sep 2024 16:29:34 +0200 Subject: [PATCH 41/54] compress tip about pos/neg leftward rotations --- neon/data-collection/data-streams/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/neon/data-collection/data-streams/index.md b/neon/data-collection/data-streams/index.md index 7fdac4f17..2e1bbbaf5 100644 --- a/neon/data-collection/data-streams/index.md +++ b/neon/data-collection/data-streams/index.md @@ -95,7 +95,7 @@ When relating data from the IMU to things visible in the scene camera, it may be ![IMU Scene Camera](./imu-scene_camera_offset-black.png) ::: tip -Note that leftward rotations for the yaw values reported by the IMU are positive, whereas leftward rotations about the y-axis of the scene camera and 3D eye state coordinate systems are negative. +Note that leftward rotations for the yaw values reported by the IMU are positive, whereas leftward rotations about the y-axis of the scene camera coordinate system are negative. ::: ### Euler Angles From 8817a78a9870434671b6e604e35360bea2cd37d5 Mon Sep 17 00:00:00 2001 From: Robert Ennis Date: Mon, 2 Sep 2024 16:55:11 +0200 Subject: [PATCH 42/54] find a better place for leftward pos/neg rotations --- neon/data-collection/data-streams/index.md | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/neon/data-collection/data-streams/index.md b/neon/data-collection/data-streams/index.md index 2e1bbbaf5..cb0945ae3 100644 --- a/neon/data-collection/data-streams/index.md +++ b/neon/data-collection/data-streams/index.md @@ -94,10 +94,6 @@ When relating data from the IMU to things visible in the scene camera, it may be ![IMU Scene Camera](./imu-scene_camera_offset-black.png) -::: tip -Note that leftward rotations for the yaw values reported by the IMU are positive, whereas leftward rotations about the y-axis of the scene camera coordinate system are negative. -::: - ### Euler Angles When exporting recordings from Pupil Cloud or Neon Player the IMU's orientation in Euler angles (i.e. pitch, yaw, and roll) is also available: @@ -107,7 +103,7 @@ When exporting recordings from Pupil Cloud or Neon Player the IMU's orientation - Roll is a rotations around the world y-axis with a value range of -180° to +180°. Wearing Neon upright with a neutral head pose roughly corresponds to a roll of 0°. Rightward tilt is positive, leftward is negative. ::: tip -Neon may sit differently on each wearer’s face, causing deviations from a neutral orientation even when facing magnetic north. +Neon may sit differently on each wearer’s face, causing deviations from a neutral orientation even when facing magnetic north. Also, leftward rotations for the yaw values reported by the IMU are positive, whereas leftward rotations about the y-axis of the scene camera coordinate system are negative. ::: ![IMU Pitch, Yaw, Roll](./imu-pitch-yaw-roll-black.png) From 38b8cf1539e90635327ee01255a84d69e36d4d6a Mon Sep 17 00:00:00 2001 From: Marc Tonsen Date: Tue, 3 Sep 2024 10:20:46 +0200 Subject: [PATCH 43/54] Iterated on content --- alpha-lab/imu-transformations/index.md | 142 ++++++------------------- 1 file changed, 30 insertions(+), 112 deletions(-) diff --git a/alpha-lab/imu-transformations/index.md b/alpha-lab/imu-transformations/index.md index 7090574f2..9425e1854 100644 --- a/alpha-lab/imu-transformations/index.md +++ b/alpha-lab/imu-transformations/index.md @@ -26,17 +26,13 @@ import TagLinks from '@components/TagLinks.vue' -::: tip -Want to compare IMU and gaze data in the same coordinate system to better understand how people coordinate head and eye movements? The transformation functions in this tutorial will show you how! -::: - -This guide contains various transformation functions that can assist when working with Neon's IMU data. +This guide contains various transformation functions that help with relating [Neon's IMU data](https://docs.pupil-labs.com/neon/data-collection/data-streams/#movement-imu-data) with other data streams. -## IMU to World Coordinates +## Rotation between the IMU and the World -One of the key steps when working with IMU data is the transformation that takes coordinates in the local IMU coordinate system to their corresponding coordinates in [the world coordinate system](http://docs.pupil-labs.com/neon/data-collection/data-streams/#movement-imu-data). The quaternion values provided by the IMU can be used to convert between the two coordinate systems. The `transform_imu_to_world` function, defined below, will be used throughout this article. +The IMU data includes a description of how the IMU is rotated in relation to the world. Concretely, the IMU data contains quaternions that define a rotation transformation between the [the world coordinate system](http://docs.pupil-labs.com/neon/data-collection/data-streams/#movement-imu-data) and the IMU's local coordinate system at different points in time. -Note that the origin of the IMU coordinate system is the same as the origin of the world coordinate system. +The `transform_imu_to_world` function below demonstrates how to use these quaternions to transform data from the IMU's local coordinate system to the world coordinate system. ```python from scipy.spatial.transform import Rotation as R @@ -57,11 +53,11 @@ def transform_imu_to_world(imu_coordinates, imu_quaternions): ]) ``` -Now that we have the `transform_imu_to_world` function, let's use it! +### Example: Heading Vectors in World Coordinates -### Obtain IMU Heading Vectors +The `transform_imu_to_world` function can be used to calculate heading vectors of the IMU in world coordinates. The heading vector essentially describes the direction the IMU is facing. If we imagine the IMU inside the Neon module while it is worn on sombody's head, the heading vector describes the direction the wearer's face is pointing. -An alternative representation of IMU orientation data is a heading vector that points outwards from the center of the IMU. It can be useful to compare this heading vector with the 3D gaze vectors in world coordinates. +The "forward-facing axis" is the y-axis, so we can calculate the heading vector by transforming the `(0, 1, 0)` vector. ```python def imu_heading_in_world(imu_quaternions): @@ -71,11 +67,13 @@ def imu_heading_in_world(imu_quaternions): ) ``` -Neutral orientation of the IMU would correspond to a heading vector that points at magnetic North and that is oriented perpendicular to the line of gravity. +::: tip +Neutral orientation (i.e. an identity rotation in the quaternion) of the IMU would correspond to a heading vector that points at magnetic North and that is oriented perpendicular to the line of gravity. +::: -### IMU Acceleration in World +### Example: Acceleration in World Coordinates -The IMU’s acceleration data are specified in its local coordinate system. If you want to understand how the observer is accelerating through their environment, then it can be easier to have the acceleration data specified in the world coordinate system: +The IMU’s translational acceleration data is given in the IMU's local coordinate system. To understand how the observer is accelerating through the world it can be helpful to transform the data into the world coordinate system: ```python accelerations_in_world = transform_imu_to_world( @@ -85,17 +83,16 @@ accelerations_in_world = transform_imu_to_world( ## Scene to World Coordinates -Neon simultaneously records data in the scene camera and IMU coordinate systems, making it possible to study the relationship between head and eye movements. +A lot of the data generated by Neon is provided in the scene camera's coordinate system, including e.g. gaze, fixation, and eye state data. This coordinate system is **not** equal to the IMU's coordinate system! There is a translation between them (simply because there is a physical distance between the camera and the IMU in the module) and also a rotation (because of how the scene camera's coordinate system is defined). -To facilitate the comparison, it can be useful to represent these data streams in the same coordinate system. An important step is accounting for [the fixed 102 degree rotation offset between the scene camera and IMU coordinate systems](https://docs.pupil-labs.com/neon/data-collection/data-streams/#movement-imu-data), as depicted below. +The rotation is a 102 degree rotation around the x-axis of the IMU coordinate system and the translation is along the vector `(0.0 mm, -1.3 mm, -6.62 mm)`. ![Diagrams showing the fixed 102 degree rotation offset between the IMU and scene camera coordinate systems.](./imu-scene_camera_offset-black.png) -We can use data from the IMU to transform gaze in scene camera coordinates to world coordinates. We proceed by building a `transform_scene_to_imu` function that handles the rotation between the two coordinate systems. It also accepts a `translation_in_imu` keyword argument to specify if points should be shifted in the IMU system. This will be relevant when converting 3D eyestate to world coordinates. - +We can define a `transform_scene_to_imu` function that handles the rotation between the two coordinate systems. ```python -def transform_scene_to_imu(coords_in_scene, translation_in_imu=np.zeros((3,))): +def transform_scene_to_imu(coords_in_scene, translation_in_imu=np.array([0.0, -1.3, -6.62])): imu_scene_rotation_diff = np.deg2rad(-90 - 12) scene_to_imu = np.array( [ @@ -122,27 +119,25 @@ def transform_scene_to_imu(coords_in_scene, translation_in_imu=np.zeros((3,))): return coords_in_imu.T ``` -Putting together the `transform_scene_to_imu` and `transform_imu_to_world` functions, we can build a composite `transform_scene_to_world` function: +Combining the `transform_scene_to_imu` function with the `transform_imu_to_world` function allows us to go all the way from scene camera coordinate system to world coordinate system ```python -def transform_scene_to_world(coords_in_scene, imu_quaternions, translation_in_imu=np.zeros((3,))): +def transform_scene_to_world(coords_in_scene, imu_quaternions, translation_in_imu=np.array([0.0, -1.3, -6.62])): coords_in_imu = transform_scene_to_imu(coords_in_scene, translation_in_imu) return transform_imu_to_world(coords_in_imu, imu_quaternions) ``` -You can now use this function to transform data in scene camera coordinates to world coordinates. Head to the [Application Example](#application-example) to see how! +### Example: Eyestate in World Coordinates -## Eyestate to World Coordinates +The `transform_scene_to_world` function allows us easily convert [eye state data](](https://docs.pupil-labs.com/neon/data-collection/data-streams/#_3d-eye-states)) given in scene camera coordinates to world coordinates. -The [3D eyestate estimates](https://docs.pupil-labs.com/neon/data-collection/data-streams/#_3d-eye-states) provided by Neon are aligned with the scene camera coordinate system. This means we can use the `transform_scene_to_world` function above to reconstruct the pose of the eyes in the world coordinate system. We just need to consider that the scene camera is displaced a bit from the IMU. -Since the eyeball center and optical axis values provided by the 3D eyestate estimates are intrinsically linked, we provide the `eyestate_to_world` function to simplify doing the conversions: +::: warning +Note, to do this right in practice you need to make sure you sample the quaternions and eye state data from the same timestamps. Since both data streams are generated independently and do not share the same set of timestamps, this is a challenge in itself. -```python -# The 3D eyestate data and the IMU quaternions should be sampled -# at the same timestamps. You can linearly interpolate the IMU data. -# See the Application Example: -# http://docs.pupil-labs.com/alpha-lab/imu-transformations/#application-example +We are glossing over this here, but one possible solution to this is interpolating the IMU data to match the timestamps of the eye state data, which is demonstrated [here](http://docs.pupil-labs.com/alpha-lab/imu-transformations/#application-example). +::: +```python def eyestate_to_world(eyeball_centers, optical_axes, imu_quaternions): """ The eyeball_centers and optical_axes inputs are for the same eye. @@ -165,9 +160,8 @@ def eyestate_to_world(eyeball_centers, optical_axes, imu_quaternions): return eyeball_centers_in_world, optical_axes_in_world ``` -## 3D Gaze to World Coordinates - -Neon provides 3D gaze data in [spherical coordinates (i.e., `azimuth/elevation [deg]`)](https://docs.pupil-labs.com/neon/data-collection/data-format/#gaze-csv). The `transform_scene_to_world` function above expects 3D Cartesian coordinates, so to convert spherical 3D gaze to world coordinates, we will need the `spherical_to_cartesian_scene` function: +### Example: 3D Gaze Direction in World Coordinates +Neon provides 3D gaze directions in [spherical coordinates (i.e., `azimuth/elevation [deg]`)](https://docs.pupil-labs.com/neon/data-collection/data-format/#gaze-csv). The `transform_scene_to_world` function above expects 3D Cartesian coordinates, so we need to convert the data first. ```python def spherical_to_cartesian_scene(elevations, azimuths): @@ -202,93 +196,17 @@ def spherical_to_cartesian_scene(elevations, azimuths): ).T ``` -Now we have the tools to convert 3D gaze data to world coordinates: +Now we can transform the data to world coordinates. Since we are dealing with 3D directions, rather than 3D points here, it does not make sense to apply the translation that we used in the `transform_scene_to_world` function above. We are thus setting it to zero here. ```python def gaze_3d_to_world(gaze_elevation, gaze_azimuth, imu_quaternions): cart_gazes_in_scene = spherical_to_cartesian_scene(gaze_elevation, gaze_azimuth) - return transform_scene_to_world(cart_gazes_in_scene, imu_quaternions) -``` - -## 2D Gaze to World Coordinates - -If you are starting from [the 2D gaze values in scene image coordinates (i.e., `gaze x/y [px]`)](https://docs.pupil-labs.com/neon/data-collection/data-format/#gaze-csv), then you will need to first [undistort](https://docs.pupil-labs.com/alpha-lab/undistort/) and unproject those points to obtain the corresponding 3D gaze vectors. Note that this requires [loading the scene camera calibration data](https://docs-staging.pupil-labs.com/alpha-lab/undistort/#reading-from-the-cloud-download-json-file). - -```python -def unproject_2d_gaze(gaze_points_2d, scene_camera_matrix, scene_distortion_coefficients): - """ - Transform the 2D gaze values from Neon to 3D gaze vectors. - """ - - gaze_points_2d_undist = cv2.undistortPoints(gaze_points_2d, scene_camera_matrix, scene_distortion_coefficients) - gaze_vectors_3d = cv2.convertPointsToHomogeneous(gaze_points_2d_undist) - gaze_vectors_3d /= np.linalg.norm(gaze_vectors_3d, axis=2)[:, np.newaxis] - - return gaze_vectors_3d -``` - -Then, we can use the functions from [the previous section](#3d-gaze-to-world-coordinates) to convert 2D gaze to 3D world coordinates: - -```python -# The gaze data and the IMU quaternions should be sampled at the -# same timestamps. You can linearly interpolate the IMU data to -# ensure this. -# See the Application Example: -# http://docs.pupil-labs.com/alpha-lab/imu-transformations/#application-example - -gaze_points_2d = gaze[["gaze x [px]", "gaze y [px]"]].to_numpy() -def gaze_2d_to_world(gaze_points_2d, scene_camera_matrix, scene_distortion_coefficients, imu_quaternions): - cart_gazes_in_scene = undistort_and_unproject( - gaze_points_2d, scene_camera_matrix, scene_distortion_coefficients - ) - return transform_scene_to_world( - cart_gazes_in_scene, imu_quaternions - ) -``` - -## World Spherical Coordinates - -When studying head orientation and gaze orientation as observers navigate a 3D environment, it can be useful to know how much these quantities deviate from pointing at a given landmark or direction. For instance, you might want to know when someone’s gaze or heading deviates from parallel with the horizon. This can be simplified by converting world points from Cartesian to spherical coordinates. The [Euler angles from the IMU](https://docs.pupil-labs.com/neon/data-collection/data-streams/#euler-angles) are already in a compatible format. For gaze data in world coordinates, the `cartesian_to_spherical_world` function below will do the necessary transformation. When wearing Neon normally, an elevation and azimuth of 0 degrees corresponds to a neutral orientation: i.e., aimed at magnetic North and parallel to the horizon. - -```python -def cartesian_to_spherical_world(world_points_3d): - """ - Convert points in 3D Cartesian world coordinates to spherical coordinates. - - For elevation: - - Neutral orientation = 0 (i.e., parallel with horizon) - - Upwards is positive - - Downwards is negative - - For azimuth: - - Neutral orientation = 0 (i.e., aligned with magnetic North) - - Leftwards is positive - - Rightwards is negative - """ - - x = world_points_3d[:, 0] - y = world_points_3d[:, 1] - z = world_points_3d[:, 2] - - radii = np.sqrt(x**2 + y**2 + z**2) - - elevation = -(np.arccos(z / radii) - np.pi / 2) - azimuth = np.arctan2(y, x) - np.pi / 2 - - # Keep all azimuth values in the range of [-180, 180] to remain - # consistent with the yaw orientation values provided by the IMU. - azimuth[azimuth < -np.pi] += 2 * np.pi - azimuth[azimuth > np.pi] -= 2 * np.pi - - elevation = np.rad2deg(elevation) - azimuth = np.rad2deg(azimuth) - - return elevation, azimuth + return transform_scene_to_world(cart_gazes_in_scene, imu_quaternions, translation_in_imu=np.zeros(3)) ``` ## Application Example -Below, we present a video showing how some of the functions in this article where used to visualize different combinations of head and eye movements in world coordinates. The code for producing the visualization [can be found here](https://gist.github.com/rennis250/8a684ea1e2f92c79fa2104b7a0f30e20). +Below, we present a video showing how some of the functions in this article were used to visualize different combinations of head and eye movements in world coordinates. The code for producing the visualization [can be found here](https://gist.github.com/rennis250/8a684ea1e2f92c79fa2104b7a0f30e20). From 548ae4d3e4ca9560e10c8e4fdc94f6037d3bb140 Mon Sep 17 00:00:00 2001 From: Robert Ennis Date: Tue, 3 Sep 2024 11:50:25 +0200 Subject: [PATCH 44/54] remove tip about neon positioning and leftward pos/neg rotations --- neon/data-collection/data-streams/index.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/neon/data-collection/data-streams/index.md b/neon/data-collection/data-streams/index.md index cb0945ae3..4c3312943 100644 --- a/neon/data-collection/data-streams/index.md +++ b/neon/data-collection/data-streams/index.md @@ -102,8 +102,4 @@ When exporting recordings from Pupil Cloud or Neon Player the IMU's orientation - Yaw is a rotation around the world z-axis with a value range of -180° to +180°. With a calibrated IMU, a yaw of 0° indicates alignment with magnetic north. Leftward turn is positive, rightward is negative. - Roll is a rotations around the world y-axis with a value range of -180° to +180°. Wearing Neon upright with a neutral head pose roughly corresponds to a roll of 0°. Rightward tilt is positive, leftward is negative. -::: tip -Neon may sit differently on each wearer’s face, causing deviations from a neutral orientation even when facing magnetic north. Also, leftward rotations for the yaw values reported by the IMU are positive, whereas leftward rotations about the y-axis of the scene camera coordinate system are negative. -::: - ![IMU Pitch, Yaw, Roll](./imu-pitch-yaw-roll-black.png) From 739440c3afde25074b003854a5767d2dd54ddcb3 Mon Sep 17 00:00:00 2001 From: Marc Tonsen Date: Tue, 3 Sep 2024 10:20:46 +0200 Subject: [PATCH 45/54] Iterated on content --- alpha-lab/imu-transformations/index.md | 142 ++++++------------------- 1 file changed, 30 insertions(+), 112 deletions(-) diff --git a/alpha-lab/imu-transformations/index.md b/alpha-lab/imu-transformations/index.md index 7090574f2..9425e1854 100644 --- a/alpha-lab/imu-transformations/index.md +++ b/alpha-lab/imu-transformations/index.md @@ -26,17 +26,13 @@ import TagLinks from '@components/TagLinks.vue' -::: tip -Want to compare IMU and gaze data in the same coordinate system to better understand how people coordinate head and eye movements? The transformation functions in this tutorial will show you how! -::: - -This guide contains various transformation functions that can assist when working with Neon's IMU data. +This guide contains various transformation functions that help with relating [Neon's IMU data](https://docs.pupil-labs.com/neon/data-collection/data-streams/#movement-imu-data) with other data streams. -## IMU to World Coordinates +## Rotation between the IMU and the World -One of the key steps when working with IMU data is the transformation that takes coordinates in the local IMU coordinate system to their corresponding coordinates in [the world coordinate system](http://docs.pupil-labs.com/neon/data-collection/data-streams/#movement-imu-data). The quaternion values provided by the IMU can be used to convert between the two coordinate systems. The `transform_imu_to_world` function, defined below, will be used throughout this article. +The IMU data includes a description of how the IMU is rotated in relation to the world. Concretely, the IMU data contains quaternions that define a rotation transformation between the [the world coordinate system](http://docs.pupil-labs.com/neon/data-collection/data-streams/#movement-imu-data) and the IMU's local coordinate system at different points in time. -Note that the origin of the IMU coordinate system is the same as the origin of the world coordinate system. +The `transform_imu_to_world` function below demonstrates how to use these quaternions to transform data from the IMU's local coordinate system to the world coordinate system. ```python from scipy.spatial.transform import Rotation as R @@ -57,11 +53,11 @@ def transform_imu_to_world(imu_coordinates, imu_quaternions): ]) ``` -Now that we have the `transform_imu_to_world` function, let's use it! +### Example: Heading Vectors in World Coordinates -### Obtain IMU Heading Vectors +The `transform_imu_to_world` function can be used to calculate heading vectors of the IMU in world coordinates. The heading vector essentially describes the direction the IMU is facing. If we imagine the IMU inside the Neon module while it is worn on sombody's head, the heading vector describes the direction the wearer's face is pointing. -An alternative representation of IMU orientation data is a heading vector that points outwards from the center of the IMU. It can be useful to compare this heading vector with the 3D gaze vectors in world coordinates. +The "forward-facing axis" is the y-axis, so we can calculate the heading vector by transforming the `(0, 1, 0)` vector. ```python def imu_heading_in_world(imu_quaternions): @@ -71,11 +67,13 @@ def imu_heading_in_world(imu_quaternions): ) ``` -Neutral orientation of the IMU would correspond to a heading vector that points at magnetic North and that is oriented perpendicular to the line of gravity. +::: tip +Neutral orientation (i.e. an identity rotation in the quaternion) of the IMU would correspond to a heading vector that points at magnetic North and that is oriented perpendicular to the line of gravity. +::: -### IMU Acceleration in World +### Example: Acceleration in World Coordinates -The IMU’s acceleration data are specified in its local coordinate system. If you want to understand how the observer is accelerating through their environment, then it can be easier to have the acceleration data specified in the world coordinate system: +The IMU’s translational acceleration data is given in the IMU's local coordinate system. To understand how the observer is accelerating through the world it can be helpful to transform the data into the world coordinate system: ```python accelerations_in_world = transform_imu_to_world( @@ -85,17 +83,16 @@ accelerations_in_world = transform_imu_to_world( ## Scene to World Coordinates -Neon simultaneously records data in the scene camera and IMU coordinate systems, making it possible to study the relationship between head and eye movements. +A lot of the data generated by Neon is provided in the scene camera's coordinate system, including e.g. gaze, fixation, and eye state data. This coordinate system is **not** equal to the IMU's coordinate system! There is a translation between them (simply because there is a physical distance between the camera and the IMU in the module) and also a rotation (because of how the scene camera's coordinate system is defined). -To facilitate the comparison, it can be useful to represent these data streams in the same coordinate system. An important step is accounting for [the fixed 102 degree rotation offset between the scene camera and IMU coordinate systems](https://docs.pupil-labs.com/neon/data-collection/data-streams/#movement-imu-data), as depicted below. +The rotation is a 102 degree rotation around the x-axis of the IMU coordinate system and the translation is along the vector `(0.0 mm, -1.3 mm, -6.62 mm)`. ![Diagrams showing the fixed 102 degree rotation offset between the IMU and scene camera coordinate systems.](./imu-scene_camera_offset-black.png) -We can use data from the IMU to transform gaze in scene camera coordinates to world coordinates. We proceed by building a `transform_scene_to_imu` function that handles the rotation between the two coordinate systems. It also accepts a `translation_in_imu` keyword argument to specify if points should be shifted in the IMU system. This will be relevant when converting 3D eyestate to world coordinates. - +We can define a `transform_scene_to_imu` function that handles the rotation between the two coordinate systems. ```python -def transform_scene_to_imu(coords_in_scene, translation_in_imu=np.zeros((3,))): +def transform_scene_to_imu(coords_in_scene, translation_in_imu=np.array([0.0, -1.3, -6.62])): imu_scene_rotation_diff = np.deg2rad(-90 - 12) scene_to_imu = np.array( [ @@ -122,27 +119,25 @@ def transform_scene_to_imu(coords_in_scene, translation_in_imu=np.zeros((3,))): return coords_in_imu.T ``` -Putting together the `transform_scene_to_imu` and `transform_imu_to_world` functions, we can build a composite `transform_scene_to_world` function: +Combining the `transform_scene_to_imu` function with the `transform_imu_to_world` function allows us to go all the way from scene camera coordinate system to world coordinate system ```python -def transform_scene_to_world(coords_in_scene, imu_quaternions, translation_in_imu=np.zeros((3,))): +def transform_scene_to_world(coords_in_scene, imu_quaternions, translation_in_imu=np.array([0.0, -1.3, -6.62])): coords_in_imu = transform_scene_to_imu(coords_in_scene, translation_in_imu) return transform_imu_to_world(coords_in_imu, imu_quaternions) ``` -You can now use this function to transform data in scene camera coordinates to world coordinates. Head to the [Application Example](#application-example) to see how! +### Example: Eyestate in World Coordinates -## Eyestate to World Coordinates +The `transform_scene_to_world` function allows us easily convert [eye state data](](https://docs.pupil-labs.com/neon/data-collection/data-streams/#_3d-eye-states)) given in scene camera coordinates to world coordinates. -The [3D eyestate estimates](https://docs.pupil-labs.com/neon/data-collection/data-streams/#_3d-eye-states) provided by Neon are aligned with the scene camera coordinate system. This means we can use the `transform_scene_to_world` function above to reconstruct the pose of the eyes in the world coordinate system. We just need to consider that the scene camera is displaced a bit from the IMU. -Since the eyeball center and optical axis values provided by the 3D eyestate estimates are intrinsically linked, we provide the `eyestate_to_world` function to simplify doing the conversions: +::: warning +Note, to do this right in practice you need to make sure you sample the quaternions and eye state data from the same timestamps. Since both data streams are generated independently and do not share the same set of timestamps, this is a challenge in itself. -```python -# The 3D eyestate data and the IMU quaternions should be sampled -# at the same timestamps. You can linearly interpolate the IMU data. -# See the Application Example: -# http://docs.pupil-labs.com/alpha-lab/imu-transformations/#application-example +We are glossing over this here, but one possible solution to this is interpolating the IMU data to match the timestamps of the eye state data, which is demonstrated [here](http://docs.pupil-labs.com/alpha-lab/imu-transformations/#application-example). +::: +```python def eyestate_to_world(eyeball_centers, optical_axes, imu_quaternions): """ The eyeball_centers and optical_axes inputs are for the same eye. @@ -165,9 +160,8 @@ def eyestate_to_world(eyeball_centers, optical_axes, imu_quaternions): return eyeball_centers_in_world, optical_axes_in_world ``` -## 3D Gaze to World Coordinates - -Neon provides 3D gaze data in [spherical coordinates (i.e., `azimuth/elevation [deg]`)](https://docs.pupil-labs.com/neon/data-collection/data-format/#gaze-csv). The `transform_scene_to_world` function above expects 3D Cartesian coordinates, so to convert spherical 3D gaze to world coordinates, we will need the `spherical_to_cartesian_scene` function: +### Example: 3D Gaze Direction in World Coordinates +Neon provides 3D gaze directions in [spherical coordinates (i.e., `azimuth/elevation [deg]`)](https://docs.pupil-labs.com/neon/data-collection/data-format/#gaze-csv). The `transform_scene_to_world` function above expects 3D Cartesian coordinates, so we need to convert the data first. ```python def spherical_to_cartesian_scene(elevations, azimuths): @@ -202,93 +196,17 @@ def spherical_to_cartesian_scene(elevations, azimuths): ).T ``` -Now we have the tools to convert 3D gaze data to world coordinates: +Now we can transform the data to world coordinates. Since we are dealing with 3D directions, rather than 3D points here, it does not make sense to apply the translation that we used in the `transform_scene_to_world` function above. We are thus setting it to zero here. ```python def gaze_3d_to_world(gaze_elevation, gaze_azimuth, imu_quaternions): cart_gazes_in_scene = spherical_to_cartesian_scene(gaze_elevation, gaze_azimuth) - return transform_scene_to_world(cart_gazes_in_scene, imu_quaternions) -``` - -## 2D Gaze to World Coordinates - -If you are starting from [the 2D gaze values in scene image coordinates (i.e., `gaze x/y [px]`)](https://docs.pupil-labs.com/neon/data-collection/data-format/#gaze-csv), then you will need to first [undistort](https://docs.pupil-labs.com/alpha-lab/undistort/) and unproject those points to obtain the corresponding 3D gaze vectors. Note that this requires [loading the scene camera calibration data](https://docs-staging.pupil-labs.com/alpha-lab/undistort/#reading-from-the-cloud-download-json-file). - -```python -def unproject_2d_gaze(gaze_points_2d, scene_camera_matrix, scene_distortion_coefficients): - """ - Transform the 2D gaze values from Neon to 3D gaze vectors. - """ - - gaze_points_2d_undist = cv2.undistortPoints(gaze_points_2d, scene_camera_matrix, scene_distortion_coefficients) - gaze_vectors_3d = cv2.convertPointsToHomogeneous(gaze_points_2d_undist) - gaze_vectors_3d /= np.linalg.norm(gaze_vectors_3d, axis=2)[:, np.newaxis] - - return gaze_vectors_3d -``` - -Then, we can use the functions from [the previous section](#3d-gaze-to-world-coordinates) to convert 2D gaze to 3D world coordinates: - -```python -# The gaze data and the IMU quaternions should be sampled at the -# same timestamps. You can linearly interpolate the IMU data to -# ensure this. -# See the Application Example: -# http://docs.pupil-labs.com/alpha-lab/imu-transformations/#application-example - -gaze_points_2d = gaze[["gaze x [px]", "gaze y [px]"]].to_numpy() -def gaze_2d_to_world(gaze_points_2d, scene_camera_matrix, scene_distortion_coefficients, imu_quaternions): - cart_gazes_in_scene = undistort_and_unproject( - gaze_points_2d, scene_camera_matrix, scene_distortion_coefficients - ) - return transform_scene_to_world( - cart_gazes_in_scene, imu_quaternions - ) -``` - -## World Spherical Coordinates - -When studying head orientation and gaze orientation as observers navigate a 3D environment, it can be useful to know how much these quantities deviate from pointing at a given landmark or direction. For instance, you might want to know when someone’s gaze or heading deviates from parallel with the horizon. This can be simplified by converting world points from Cartesian to spherical coordinates. The [Euler angles from the IMU](https://docs.pupil-labs.com/neon/data-collection/data-streams/#euler-angles) are already in a compatible format. For gaze data in world coordinates, the `cartesian_to_spherical_world` function below will do the necessary transformation. When wearing Neon normally, an elevation and azimuth of 0 degrees corresponds to a neutral orientation: i.e., aimed at magnetic North and parallel to the horizon. - -```python -def cartesian_to_spherical_world(world_points_3d): - """ - Convert points in 3D Cartesian world coordinates to spherical coordinates. - - For elevation: - - Neutral orientation = 0 (i.e., parallel with horizon) - - Upwards is positive - - Downwards is negative - - For azimuth: - - Neutral orientation = 0 (i.e., aligned with magnetic North) - - Leftwards is positive - - Rightwards is negative - """ - - x = world_points_3d[:, 0] - y = world_points_3d[:, 1] - z = world_points_3d[:, 2] - - radii = np.sqrt(x**2 + y**2 + z**2) - - elevation = -(np.arccos(z / radii) - np.pi / 2) - azimuth = np.arctan2(y, x) - np.pi / 2 - - # Keep all azimuth values in the range of [-180, 180] to remain - # consistent with the yaw orientation values provided by the IMU. - azimuth[azimuth < -np.pi] += 2 * np.pi - azimuth[azimuth > np.pi] -= 2 * np.pi - - elevation = np.rad2deg(elevation) - azimuth = np.rad2deg(azimuth) - - return elevation, azimuth + return transform_scene_to_world(cart_gazes_in_scene, imu_quaternions, translation_in_imu=np.zeros(3)) ``` ## Application Example -Below, we present a video showing how some of the functions in this article where used to visualize different combinations of head and eye movements in world coordinates. The code for producing the visualization [can be found here](https://gist.github.com/rennis250/8a684ea1e2f92c79fa2104b7a0f30e20). +Below, we present a video showing how some of the functions in this article were used to visualize different combinations of head and eye movements in world coordinates. The code for producing the visualization [can be found here](https://gist.github.com/rennis250/8a684ea1e2f92c79fa2104b7a0f30e20). From 42af1c1b51b669f9d7044349e07d0163ddc68fa3 Mon Sep 17 00:00:00 2001 From: Marc Tonsen Date: Tue, 3 Sep 2024 13:25:00 +0200 Subject: [PATCH 46/54] Bring back the spehrical world coordinates section --- alpha-lab/imu-transformations/index.md | 43 ++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/alpha-lab/imu-transformations/index.md b/alpha-lab/imu-transformations/index.md index 9425e1854..0628c1986 100644 --- a/alpha-lab/imu-transformations/index.md +++ b/alpha-lab/imu-transformations/index.md @@ -204,6 +204,49 @@ def gaze_3d_to_world(gaze_elevation, gaze_azimuth, imu_quaternions): return transform_scene_to_world(cart_gazes_in_scene, imu_quaternions, translation_in_imu=np.zeros(3)) ``` +## World Spherical Coordinates +Using the transformations introduced above, we can transform various data into cartesian world coordinates. For some things it is more intuitive to have the data in spherical coordinates though. For instance, you might want to know when someone’s gaze or heading deviates from parallel with the horizon, i.e. if they are looking/facing upwards or downwards. + +Converting data into spherical world coordinates makes these things obvious. When wearing Neon, an elevation and azimuth of 0 degrees corresponds to a neutral orientation: i.e., aimed at magnetic North and parallel to the horizon. A positive elevation corresponds to looking upwards, and a negative elevation corresponds to looking downwards. + +The [Euler angles from the IMU](https://docs.pupil-labs.com/neon/data-collection/data-streams/#euler-angles) are already in a compatible format. For gaze data in world coordinates, the `cartesian_to_spherical_world` function below will do the necessary transformation. + +```python +def cartesian_to_spherical_world(world_points_3d): + """ + Convert points in 3D Cartesian world coordinates to spherical coordinates. + + For elevation: + - Neutral orientation = 0 (i.e., parallel with horizon) + - Upwards is positive + - Downwards is negative + + For azimuth: + - Neutral orientation = 0 (i.e., aligned with magnetic North) + - Leftwards is positive + - Rightwards is negative + """ + + x = world_points_3d[:, 0] + y = world_points_3d[:, 1] + z = world_points_3d[:, 2] + + radii = np.sqrt(x**2 + y**2 + z**2) + + elevation = -(np.arccos(z / radii) - np.pi / 2) + azimuth = np.arctan2(y, x) - np.pi / 2 + + # Keep all azimuth values in the range of [-180, 180] to remain + # consistent with the yaw orientation values provided by the IMU. + azimuth[azimuth < -np.pi] += 2 * np.pi + azimuth[azimuth > np.pi] -= 2 * np.pi + + elevation = np.rad2deg(elevation) + azimuth = np.rad2deg(azimuth) + + return elevation, azimuth +``` + ## Application Example Below, we present a video showing how some of the functions in this article were used to visualize different combinations of head and eye movements in world coordinates. The code for producing the visualization [can be found here](https://gist.github.com/rennis250/8a684ea1e2f92c79fa2104b7a0f30e20). From 3c95c094c3087d270d80815e0c392c82f3505e22 Mon Sep 17 00:00:00 2001 From: Robert Ennis Date: Tue, 3 Sep 2024 14:30:17 +0200 Subject: [PATCH 47/54] transform_scene_to_world incorporates scene camera offset, so adapt eyestate_to_world to accomodate that --- alpha-lab/imu-transformations/index.md | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/alpha-lab/imu-transformations/index.md b/alpha-lab/imu-transformations/index.md index 0628c1986..6d4c80451 100644 --- a/alpha-lab/imu-transformations/index.md +++ b/alpha-lab/imu-transformations/index.md @@ -89,7 +89,7 @@ The rotation is a 102 degree rotation around the x-axis of the IMU coordinate sy ![Diagrams showing the fixed 102 degree rotation offset between the IMU and scene camera coordinate systems.](./imu-scene_camera_offset-black.png) -We can define a `transform_scene_to_imu` function that handles the rotation between the two coordinate systems. +We can define a `transform_scene_to_imu` function that handles the rotation between the two coordinate systems. ```python def transform_scene_to_imu(coords_in_scene, translation_in_imu=np.array([0.0, -1.3, -6.62])): @@ -146,15 +146,14 @@ def eyestate_to_world(eyeball_centers, optical_axes, imu_quaternions): # The eyeball centers are specified relative to the center of the scene # camera, so we need to account for the position of the scene camera in # the IMU coordinate system. Here, we express that position in millimeters. - scene_camera_position_in_imu = np.array([0.0, -1.3, -6.62]) eyeball_centers_in_world = transform_scene_to_world( - eyeball_centers, imu_quaternions, translation=scene_camera_position_in_imu + eyeball_centers, imu_quaternions ) # The optical axes are unit vectors originating at the eyeball centers, # so they should not be translated. optical_axes_in_world = transform_scene_to_world( - optical_axes, imu_quaternions + optical_axes, imu_quaternions, translation=np.zeros(3) ) return eyeball_centers_in_world, optical_axes_in_world From 273fae453bae0d84d0befa716106dc6133601f7b Mon Sep 17 00:00:00 2001 From: Marc Tonsen Date: Tue, 3 Sep 2024 14:45:08 +0200 Subject: [PATCH 48/54] Fix link --- alpha-lab/imu-transformations/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/alpha-lab/imu-transformations/index.md b/alpha-lab/imu-transformations/index.md index 6d4c80451..4370d8709 100644 --- a/alpha-lab/imu-transformations/index.md +++ b/alpha-lab/imu-transformations/index.md @@ -129,7 +129,7 @@ def transform_scene_to_world(coords_in_scene, imu_quaternions, translation_in_im ### Example: Eyestate in World Coordinates -The `transform_scene_to_world` function allows us easily convert [eye state data](](https://docs.pupil-labs.com/neon/data-collection/data-streams/#_3d-eye-states)) given in scene camera coordinates to world coordinates. +The `transform_scene_to_world` function allows us easily convert [eye state data](https://docs.pupil-labs.com/neon/data-collection/data-streams/#_3d-eye-states) given in scene camera coordinates to world coordinates. ::: warning Note, to do this right in practice you need to make sure you sample the quaternions and eye state data from the same timestamps. Since both data streams are generated independently and do not share the same set of timestamps, this is a challenge in itself. From e1fd6cb2a76c564384dd6d4ba758e24eacb40a6d Mon Sep 17 00:00:00 2001 From: Robert Ennis Date: Tue, 3 Sep 2024 16:06:15 +0200 Subject: [PATCH 49/54] remove audio from youtube video --- alpha-lab/imu-transformations/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/alpha-lab/imu-transformations/index.md b/alpha-lab/imu-transformations/index.md index 4370d8709..e4e3a242f 100644 --- a/alpha-lab/imu-transformations/index.md +++ b/alpha-lab/imu-transformations/index.md @@ -250,7 +250,7 @@ def cartesian_to_spherical_world(world_points_3d): Below, we present a video showing how some of the functions in this article were used to visualize different combinations of head and eye movements in world coordinates. The code for producing the visualization [can be found here](https://gist.github.com/rennis250/8a684ea1e2f92c79fa2104b7a0f30e20). - + ## Related content From 67bcd4ec858f32746cdbd0058873ec4ffed3a360 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miguel=20Garc=C3=ADa=20Garc=C3=ADa?= Date: Wed, 4 Sep 2024 08:48:06 +0200 Subject: [PATCH 50/54] data-format: Fixed typo on directly and slight improve the text. Modified https://arc.net/l/quote/nbgwfwmn to fix a typo on direclty --- neon/data-collection/data-format/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/neon/data-collection/data-format/index.md b/neon/data-collection/data-format/index.md index 67a625d6a..c7d263cc1 100644 --- a/neon/data-collection/data-format/index.md +++ b/neon/data-collection/data-format/index.md @@ -1,7 +1,7 @@ # Recording Format The page describes the data format when downloading Neon recordings from Pupil Cloud in the "Timeseries Data" and "Timeseries Data + Scene Video" formats. In this format the Data from the Neon Companion is augmented by adding gaze and eye state estimates whenever they had not been computed in realtime. Futhermore fixations and blink data as well as some IMU transformations are computed. -When downloading Native Recording Data from cloud or direclty [extracting it via usb from the companion device](/data-collection/transfer-recordings-via-usb/), use the [pl-neon-recording](https://github.com/pupil-labs/pl-neon-recording) python library to read and access the data. This data format will contain all video data as well as all data that had been computed in realtime on the companion device. +When downloading Native Recording Data from the Cloud or directly [extracting it via USB from the companion device](/data-collection/transfer-recordings-via-usb/), you can use the [pl-neon-recording](https://github.com/pupil-labs/pl-neon-recording) python library to read and access the data or load it onto [Neon Player](/neon-player). This data format will contain all video data as well as all data that has been computed in realtime on the companion device. ## Recording Folders From 1b432f9ce5fb8898f9c5102b7b191cd057d0f502 Mon Sep 17 00:00:00 2001 From: Robert Ennis Date: Wed, 4 Sep 2024 13:43:16 +0200 Subject: [PATCH 51/54] update youtube link --- alpha-lab/imu-transformations/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/alpha-lab/imu-transformations/index.md b/alpha-lab/imu-transformations/index.md index e4e3a242f..0d68833a6 100644 --- a/alpha-lab/imu-transformations/index.md +++ b/alpha-lab/imu-transformations/index.md @@ -250,7 +250,7 @@ def cartesian_to_spherical_world(world_points_3d): Below, we present a video showing how some of the functions in this article were used to visualize different combinations of head and eye movements in world coordinates. The code for producing the visualization [can be found here](https://gist.github.com/rennis250/8a684ea1e2f92c79fa2104b7a0f30e20). - + ## Related content From fdd9a4c75e4903561afa6b6a0ff3e4b96a68b412 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miguel=20Garc=C3=ADa=20Garc=C3=ADa?= Date: Wed, 4 Sep 2024 14:32:53 +0200 Subject: [PATCH 52/54] Fixed link --- neon/data-collection/data-format/index.md | 232 +++++++++++----------- 1 file changed, 115 insertions(+), 117 deletions(-) diff --git a/neon/data-collection/data-format/index.md b/neon/data-collection/data-format/index.md index c7d263cc1..7fe76fdfb 100644 --- a/neon/data-collection/data-format/index.md +++ b/neon/data-collection/data-format/index.md @@ -1,172 +1,170 @@ # Recording Format -The page describes the data format when downloading Neon recordings from Pupil Cloud in the "Timeseries Data" and "Timeseries Data + Scene Video" formats. In this format the Data from the Neon Companion is augmented by adding gaze and eye state estimates whenever they had not been computed in realtime. Futhermore fixations and blink data as well as some IMU transformations are computed. -When downloading Native Recording Data from the Cloud or directly [extracting it via USB from the companion device](/data-collection/transfer-recordings-via-usb/), you can use the [pl-neon-recording](https://github.com/pupil-labs/pl-neon-recording) python library to read and access the data or load it onto [Neon Player](/neon-player). This data format will contain all video data as well as all data that has been computed in realtime on the companion device. +The page describes the data format when downloading Neon recordings from Pupil Cloud in the "Timeseries Data" and "Timeseries Data + Scene Video" formats. In this format the Data from the Neon Companion is augmented by adding gaze and eye state estimates whenever they had not been computed in realtime. Futhermore fixations and blink data as well as some IMU transformations are computed. +When downloading Native Recording Data from the Cloud or directly [extracting it via USB from the companion device](/data-collection/transfer-recordings-via-usb/), you can use the [pl-neon-recording](https://github.com/pupil-labs/pl-neon-recording) python library to read and access the data or load it onto [Neon Player](/neon-player/). This data format will contain all video data as well as all data that has been computed in realtime on the companion device. ## Recording Folders + The export contains one folder per recording following this naming scheme: -```-``` +`-` The files included in every folder are described in the following. ## info.json -This file contains meta-information on the recording. +This file contains meta-information on the recording. -| Field | Description | -| ------------------------- | -------- | -| **android_device_id** | Unique identifier of the Android device used as Companion. | -| **android_device_model** | Model name of the Companion device. | -| **android_device_name** | Device name of the Companion device. | -| **app_version** | Version of the Neon Companion app used to make the recording. | -| **calib_version** | Version of the offset correction used by the Neon Companion app. | -| **data_format_version** | Version of the data format used by the Neon Companion app. | -| **duration** | Duration of the recording in nanoseconds| -| **firmware_version** | Version numbers of the firmware and FPGA. | -| **frame_id** | Number identifying the type of frame used for this recording. | -| **frame_name** | Name of the frame used for this recording. | -| **gaze_offset** | Gaze offset applied to this recording using the offset correction. Values are in pixels.| -| **module_serial_number** | Serial number of the Neon module used for the recording. This number is encoded in the QR code on the back of the Neon module. | -| **os_version** | Version of the Android OS that was installed on the recording Companion device. | -| **pipeline_version** | Version of the gaze estimation pipeline used by the Neon Companion app. | -| **recording_id** | Unique identifier of the recording. | -| **start_time** | Timestamp of when the recording was started. Given as UTC timestamp in nanoseconds. | -| **template_data** | Data regarding the selected template for the recording as well as the response values. | -| **wearer_id** | Unique identifier of the wearer selected for this recording. | -| **wearer_name** | Name of the wearer selected for this recording. | -| **workspace_id** | The ID of the Pupil Cloud workspace this recording has been assigned to. | - +| Field | Description | +| ------------------------ | ------------------------------------------------------------------------------------------------------------------------------ | +| **android_device_id** | Unique identifier of the Android device used as Companion. | +| **android_device_model** | Model name of the Companion device. | +| **android_device_name** | Device name of the Companion device. | +| **app_version** | Version of the Neon Companion app used to make the recording. | +| **calib_version** | Version of the offset correction used by the Neon Companion app. | +| **data_format_version** | Version of the data format used by the Neon Companion app. | +| **duration** | Duration of the recording in nanoseconds | +| **firmware_version** | Version numbers of the firmware and FPGA. | +| **frame_id** | Number identifying the type of frame used for this recording. | +| **frame_name** | Name of the frame used for this recording. | +| **gaze_offset** | Gaze offset applied to this recording using the offset correction. Values are in pixels. | +| **module_serial_number** | Serial number of the Neon module used for the recording. This number is encoded in the QR code on the back of the Neon module. | +| **os_version** | Version of the Android OS that was installed on the recording Companion device. | +| **pipeline_version** | Version of the gaze estimation pipeline used by the Neon Companion app. | +| **recording_id** | Unique identifier of the recording. | +| **start_time** | Timestamp of when the recording was started. Given as UTC timestamp in nanoseconds. | +| **template_data** | Data regarding the selected template for the recording as well as the response values. | +| **wearer_id** | Unique identifier of the wearer selected for this recording. | +| **wearer_name** | Name of the wearer selected for this recording. | +| **workspace_id** | The ID of the Pupil Cloud workspace this recording has been assigned to. | **Scene Video** Scene video is contained in a file following the following naming scheme: -```_

-
.mp4``` +`_
-
.mp4` ## scene_camera.json -This file contains the camera intrinsics of the used scene camera. The values are determined via calibration of every camera during manufacturing. - -| Field | Description | -| -------- | -------- | -| **camera_matrix** | The camera matrix of the scene camera. | -| **dist_coefs** | The distortion coefficients of the scene camera. The order of the values is `(k1, k2, p1, p2, k3, k4, k5, k6)` following [OpenCV's distortion model](https://docs.opencv.org/4.x/d9/d0c/group__calib3d.html#ga3207604e4b1a1758aa66acb6ed5aa65d). | -| **serial_number** | Serial number of Neon module used for the recording. This number is encoded in the QR code on the back of the Neon module. | -| **version** | The version of the intrinsics data format. | +This file contains the camera intrinsics of the used scene camera. The values are determined via calibration of every camera during manufacturing. +| Field | Description | +| ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| **camera_matrix** | The camera matrix of the scene camera. | +| **dist_coefs** | The distortion coefficients of the scene camera. The order of the values is `(k1, k2, p1, p2, k3, k4, k5, k6)` following [OpenCV's distortion model](https://docs.opencv.org/4.x/d9/d0c/group__calib3d.html#ga3207604e4b1a1758aa66acb6ed5aa65d). | +| **serial_number** | Serial number of Neon module used for the recording. This number is encoded in the QR code on the back of the Neon module. | +| **version** | The version of the intrinsics data format. | ## world_timestamps.csv + This file contains the timestamps of every world video frame. -| Field | Description | -| -------- | -------- | -| **section id** | Unique identifier of the corresponding section. | -| **recording id** | Unique identifier of the recording this sample belongs to. | +| Field | Description | +| ------------------ | -------------------------------------------------------------- | +| **section id** | Unique identifier of the corresponding section. | +| **recording id** | Unique identifier of the recording this sample belongs to. | | **timestamp [ns]** | UTC timestamp in nanoseconds of the corresponding world frame. | - ## events.csv -This file contains [event](/data-collection/events/) data for all recordings. It contains both event annotations from Pupil Cloud and real-time recording events. -| Field | Description | -| -------- | -------- | -| **recording id** | Unique identifier of the recording this event belongs to. | -| **timestamp [ns]** | UTC timestamp of the event. | -| **name** | Name of the event. | -| **type** | Type of the event. Possible values: cloud, recording | +This file contains [event](/data-collection/events/) data for all recordings. It contains both event annotations from Pupil Cloud and real-time recording events. +| Field | Description | +| ------------------ | --------------------------------------------------------- | +| **recording id** | Unique identifier of the recording this event belongs to. | +| **timestamp [ns]** | UTC timestamp of the event. | +| **name** | Name of the event. | +| **type** | Type of the event. Possible values: cloud, recording | ## gaze.csv -This file contains [gaze](/data-collection/data-streams/#gaze) data in world camera coordinates. - -| Field | Description | -| -------- | -------- | -| **section id** | Unique identifier of the corresponding section. | -| **recording id** | Unique identifier of the recording this sample belongs to. | -| **timestamp [ns]** | UTC timestamp in nanoseconds of the sample. Equal to the timestamp of the eye video frame this sample was generated with. | -| **gaze x [px]** | Float value representing the x-coordinate of the mapped gaze point in world camera pixel coordinates. -| **gaze y [px]** | Same as "gaze x [px]" but for the y-coordinate. | -| **worn** | These values indicate whether Neon has been worn by a subject at the respective point in time. `1.0` indicates that it has been worn, while `0.0` indicates that it has not been worn. | -| **fixation id** | If this gaze sample belongs to a fixation event, this is the corresponding id of the fixation. Otherwise, this field is empty. | -| **blink id** | If this gaze samples belongs to a blink event, this is the corresponding id of the blink. Otherwise this field is empty. | -| **azimuth [deg]** | The [azimuth](https://en.wikipedia.org/wiki/Horizontal_coordinate_system) of the gaze ray in relation to the scene camera in degrees. | -| **elevation [deg]** | The [elevation](https://en.wikipedia.org/wiki/Horizontal_coordinate_system) of the gaze ray in relation to the scene camera in degrees. | +This file contains [gaze](/data-collection/data-streams/#gaze) data in world camera coordinates. +| Field | Description | +| ----------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **section id** | Unique identifier of the corresponding section. | +| **recording id** | Unique identifier of the recording this sample belongs to. | +| **timestamp [ns]** | UTC timestamp in nanoseconds of the sample. Equal to the timestamp of the eye video frame this sample was generated with. | +| **gaze x [px]** | Float value representing the x-coordinate of the mapped gaze point in world camera pixel coordinates. | +| **gaze y [px]** | Same as "gaze x [px]" but for the y-coordinate. | +| **worn** | These values indicate whether Neon has been worn by a subject at the respective point in time. `1.0` indicates that it has been worn, while `0.0` indicates that it has not been worn. | +| **fixation id** | If this gaze sample belongs to a fixation event, this is the corresponding id of the fixation. Otherwise, this field is empty. | +| **blink id** | If this gaze samples belongs to a blink event, this is the corresponding id of the blink. Otherwise this field is empty. | +| **azimuth [deg]** | The [azimuth](https://en.wikipedia.org/wiki/Horizontal_coordinate_system) of the gaze ray in relation to the scene camera in degrees. | +| **elevation [deg]** | The [elevation](https://en.wikipedia.org/wiki/Horizontal_coordinate_system) of the gaze ray in relation to the scene camera in degrees. | ## fixations.csv + This file contains [fixations](/data-collection/data-streams/#fixations-saccades) detected in the gaze data stream. The corresponding gaze samples that belong to each fixation can be determined from the `gaze.csv` file using the `fixation id` field. - -| Field | Description | -| -------- | -------- | -| **section id** | Unique identifier of the corresponding section. | -| **recording id** | Unique identifier of the recording this sample belongs to. | -| **fixation id** | Identifier of the fixation. The counter starts at the beginning of the recording. | -| **start timestamp [ns]** | UTC timestamp in nanoseconds of the start of the fixation. | -| **end timestamp [ns]** | UTC timestamp in nanoseconds of the end of the fixation. | -| **duration [ms]** | Duration of the fixation in milliseconds. | -| **fixation x [px]** | Float value representing the x-coordinate of the fixation in world camera pixel coordinates. This position is the average of all gaze samples within the fixation. | -| **fixation y [px]** | Same as "fixation x [px]" but for the y-coordinate. | -| **azimuth [deg]** | The [azimuth](https://en.wikipedia.org/wiki/Horizontal_coordinate_system) of the gaze ray corresponding to the fixation location in relation to the scene camera in degrees. | -| **elevation [deg]** | The [elevation](https://en.wikipedia.org/wiki/Horizontal_coordinate_system) of the gaze ray corresponding to the fixation location in relation to the scene camera in degrees. | +| Field | Description | +| ---------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| **section id** | Unique identifier of the corresponding section. | +| **recording id** | Unique identifier of the recording this sample belongs to. | +| **fixation id** | Identifier of the fixation. The counter starts at the beginning of the recording. | +| **start timestamp [ns]** | UTC timestamp in nanoseconds of the start of the fixation. | +| **end timestamp [ns]** | UTC timestamp in nanoseconds of the end of the fixation. | +| **duration [ms]** | Duration of the fixation in milliseconds. | +| **fixation x [px]** | Float value representing the x-coordinate of the fixation in world camera pixel coordinates. This position is the average of all gaze samples within the fixation. | +| **fixation y [px]** | Same as "fixation x [px]" but for the y-coordinate. | +| **azimuth [deg]** | The [azimuth](https://en.wikipedia.org/wiki/Horizontal_coordinate_system) of the gaze ray corresponding to the fixation location in relation to the scene camera in degrees. | +| **elevation [deg]** | The [elevation](https://en.wikipedia.org/wiki/Horizontal_coordinate_system) of the gaze ray corresponding to the fixation location in relation to the scene camera in degrees. | ## saccades.csv -This file contains [saccades](/data-collection/data-streams/#fixations-saccades) detected by the fixation detector. +This file contains [saccades](/data-collection/data-streams/#fixations-saccades) detected by the fixation detector. -| Field | Description | -| -------- | -------- | -| **section id** | Unique identifier of the corresponding section. | -| **recording id** | Unique identifier of the recording this sample belongs to. | -| **saccade id** | Identifier of the saccade. The counter starts at the beginning of the recording. | -| **start timestamp [ns]** | UTC timestamp in nanoseconds of the start of the saccade. | -| **end timestamp [ns]** | UTC timestamp in nanoseconds of the end of the saccade. | -| **duration [ms]** | Duration of the saccade in milliseconds. | -| **amplitude [px]** | Float value representing the amplitude of the saccade in world camera pixel coordinates. | -| **amplitude [deg]** | Float value representing the amplitude of the saccade in degrees of visual angle. | +| Field | Description | +| ---------------------------------- | ------------------------------------------------------------------------------------------------------- | +| **section id** | Unique identifier of the corresponding section. | +| **recording id** | Unique identifier of the recording this sample belongs to. | +| **saccade id** | Identifier of the saccade. The counter starts at the beginning of the recording. | +| **start timestamp [ns]** | UTC timestamp in nanoseconds of the start of the saccade. | +| **end timestamp [ns]** | UTC timestamp in nanoseconds of the end of the saccade. | +| **duration [ms]** | Duration of the saccade in milliseconds. | +| **amplitude [px]** | Float value representing the amplitude of the saccade in world camera pixel coordinates. | +| **amplitude [deg]** | Float value representing the amplitude of the saccade in degrees of visual angle. | | **mean velocity [px/s]** | Float value representing the mean velocity of the saccade in world camera pixel coordinates per second. | | **peak velocity [px/s]** | Float value representing the peak velocity of the saccade in world camera pixel coordinates per second. | - ## 3d_eye_states.csv -This file contains [3D eye states](/data-collection/data-streams/#_3d-eye-states) as well as [pupil diameter](/data-collection/data-streams/#pupil-diameters) data. +This file contains [3D eye states](/data-collection/data-streams/#_3d-eye-states) as well as [pupil diameter](/data-collection/data-streams/#pupil-diameters) data. -| Field | Description | -| ------------------------- | -------- | -| **section id** | Unique identifier of the corresponding section. | -| **recording id** | Unique identifier of the recording this sample belongs to. | -| **timestamp [ns]** | UTC timestamp in nanoseconds of the sample. Equal to the timestamp of the eye video frame this sample was generated with. | -| **pupil diameter left [mm]** | Physical diameter of the pupil of the left eye. | -| **pupil diameter right [mm]** | Physical diameter of the pupil of the right eye. | -| **eye ball center left x [mm]**
**eye ball center left y [mm]**
**eye ball center left z [mm]**
**eye ball center right x [mm]**
**eye ball center right y [mm]**
**eye ball center right z [mm]** | Location of left and right eye ball centers in millimeters in relation to the scene camera of the Neon module. For details on the coordinate systems see [here](/data-collection/data-streams/#_3d-eye-states). | -| **optical axis left x**
**optical axis left y**
**optical axis left z**
**optical axis right x**
**optical axis right y**
**optical axis right z** | Directional vector describing the optical axis of the left and right eye, i.e. the vector pointing from eye ball center to pupil center of the respective eye. For details on the coordinate systems see [here](/data-collection/data-streams/#_3d-eye-states). | +| Field | Description | +| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **section id** | Unique identifier of the corresponding section. | +| **recording id** | Unique identifier of the recording this sample belongs to. | +| **timestamp [ns]** | UTC timestamp in nanoseconds of the sample. Equal to the timestamp of the eye video frame this sample was generated with. | +| **pupil diameter left [mm]** | Physical diameter of the pupil of the left eye. | +| **pupil diameter right [mm]** | Physical diameter of the pupil of the right eye. | +| **eye ball center left x [mm]**
**eye ball center left y [mm]**
**eye ball center left z [mm]**
**eye ball center right x [mm]**
**eye ball center right y [mm]**
**eye ball center right z [mm]** | Location of left and right eye ball centers in millimeters in relation to the scene camera of the Neon module. For details on the coordinate systems see [here](/data-collection/data-streams/#_3d-eye-states). | +| **optical axis left x**
**optical axis left y**
**optical axis left z**
**optical axis right x**
**optical axis right y**
**optical axis right z** | Directional vector describing the optical axis of the left and right eye, i.e. the vector pointing from eye ball center to pupil center of the respective eye. For details on the coordinate systems see [here](/data-collection/data-streams/#_3d-eye-states). | ## blinks.csv + This file contains [blinks](/data-collection/data-streams/#blinks) detected in the eye video. The corresponding gaze samples that belong to each blink can be determined from the `gaze.csv` file using the `blink id` field. - -| Field | Description | -| -------- | -------- | -| **section id** | Unique identifier of the corresponding section. | -| **recording id** | Unique identifier of the recording this sample belongs to. | -| **blink id** | Identifier of the blink. The counter starts at the beginning of the recording. | -| **start timestamp [ns]** | UTC timestamp in nanoseconds of the start of the blink. | -| **end timestamp [ns]** | UTC timestamp in nanoseconds of the end of the blink. | -| **duration [ms]** | Duration of the blink in milliseconds. | +| Field | Description | +| ---------------------------------- | ------------------------------------------------------------------------------ | +| **section id** | Unique identifier of the corresponding section. | +| **recording id** | Unique identifier of the recording this sample belongs to. | +| **blink id** | Identifier of the blink. The counter starts at the beginning of the recording. | +| **start timestamp [ns]** | UTC timestamp in nanoseconds of the start of the blink. | +| **end timestamp [ns]** | UTC timestamp in nanoseconds of the end of the blink. | +| **duration [ms]** | Duration of the blink in milliseconds. | ## imu.csv + This file contains data recorded by the integrated [IMU](/data-collection/data-streams/#movement-imu-data) (inertial measurement unit). -| Field | Description | -| -------- | -------- | -| **section id** | Unique identifier of the corresponding section. | -| **recording id** | Unique identifier of the recording this sample belongs to. | -| **timestamp [ns]** | UTC timestamp in nanoseconds of the sample. | -| **gyro x [deg/s]**
**gyro y [deg/s]**
**gyro z [deg/s]** | Rotation speed around x, y or z-axis respectively in degrees/s. | -| **acceleration x [g]**
**acceleration y [g]**
**acceleration z [g]** | Translational acceleration (in terms of [g-force](https://en.m.wikipedia.org/wiki/G-force)) along the x, y or z-axis respectively. Note `1 g = 9.80665 m/s^2`.| -| **roll [deg]** | Drift-free estimate of the roll (head tilt from side to side) in degrees. The output range is -180 to +180 degrees. Added in version 2 of this enrichment. | -| **pitch [deg]** | Drift-free estimate of the pitch (head tilt from front to back) in degrees. The output range is -90 to +90 degrees. Added in version 2 of this enrichment. | -| **yaw [deg]** | Drift-free estimate of the yaw (horizontal head rotation) in degrees. The output range is -180 to +180 degrees. Added in version 2 of this enrichment. | -| **quaternion w**
**quaternion x**
**quaternion y**
**quaternion z** | Quaternion describing the rotation of the Neon module. | +| Field | Description | +| -------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **section id** | Unique identifier of the corresponding section. | +| **recording id** | Unique identifier of the recording this sample belongs to. | +| **timestamp [ns]** | UTC timestamp in nanoseconds of the sample. | +| **gyro x [deg/s]**
**gyro y [deg/s]**
**gyro z [deg/s]** | Rotation speed around x, y or z-axis respectively in degrees/s. | +| **acceleration x [g]**
**acceleration y [g]**
**acceleration z [g]** | Translational acceleration (in terms of [g-force](https://en.m.wikipedia.org/wiki/G-force)) along the x, y or z-axis respectively. Note `1 g = 9.80665 m/s^2`. | +| **roll [deg]** | Drift-free estimate of the roll (head tilt from side to side) in degrees. The output range is -180 to +180 degrees. Added in version 2 of this enrichment. | +| **pitch [deg]** | Drift-free estimate of the pitch (head tilt from front to back) in degrees. The output range is -90 to +90 degrees. Added in version 2 of this enrichment. | +| **yaw [deg]** | Drift-free estimate of the yaw (horizontal head rotation) in degrees. The output range is -180 to +180 degrees. Added in version 2 of this enrichment. | +| **quaternion w**
**quaternion x**
**quaternion y**
**quaternion z** | Quaternion describing the rotation of the Neon module. | From babf8bd7a05feb6e49d41c6baf58141723ce5476 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miguel=20Garc=C3=ADa=20Garc=C3=ADa?= Date: Wed, 4 Sep 2024 14:33:38 +0200 Subject: [PATCH 53/54] Bump Node version to 22, as 18 is soon to be deprecated in GH Actions --- .github/workflows/PR-checks.yml | 6 +-- .github/workflows/build-deploy-production.yml | 51 +++++++++---------- .github/workflows/build-deploy-staging.yml | 46 ++++++++--------- .github/workflows/build-only.yml | 41 ++++++++------- 4 files changed, 71 insertions(+), 73 deletions(-) diff --git a/.github/workflows/PR-checks.yml b/.github/workflows/PR-checks.yml index ec237fd3e..115e0788c 100644 --- a/.github/workflows/PR-checks.yml +++ b/.github/workflows/PR-checks.yml @@ -9,7 +9,7 @@ on: jobs: build: - name: 📦 ${{ matrix.component }} build + name: 📦 ${{ matrix.component }} build runs-on: ubuntu-latest strategy: fail-fast: false @@ -21,7 +21,7 @@ jobs: - name: Use Node.js uses: actions/setup-node@v3 with: - node-version: 18 + node-version: 22 - name: Install dependencies working-directory: ./${{ matrix.component }} @@ -101,7 +101,7 @@ jobs: - uses: actions/checkout@v3 with: fetch-depth: 2 - - name: 'Check Grammar' + - name: "Check Grammar" id: cspell uses: streetsidesoftware/cspell-action@v5 with: diff --git a/.github/workflows/build-deploy-production.yml b/.github/workflows/build-deploy-production.yml index 682612ab0..2da959989 100644 --- a/.github/workflows/build-deploy-production.yml +++ b/.github/workflows/build-deploy-production.yml @@ -16,7 +16,7 @@ jobs: - name: Use Node.js uses: actions/setup-node@v3 with: - node-version: 18 + node-version: 22 - name: Install dependencies working-directory: ./neon @@ -32,13 +32,13 @@ jobs: - name: Make build working-directory: ./neon run: npm run docs:build - + - name: Upload uses: actions/upload-artifact@v3 with: name: neon path: neon/.vitepress/dist - + invisible: name: Build Invisible runs-on: ubuntu-latest @@ -49,12 +49,12 @@ jobs: - name: Use Node.js uses: actions/setup-node@v3 with: - node-version: 18 + node-version: 22 - name: Install dependencies working-directory: ./invisible run: npm install - + # Copy node modules to provide dependencies for shared components in root folder - name: Copy node_modules shell: bash @@ -65,13 +65,13 @@ jobs: - name: Make build working-directory: ./invisible run: npm run docs:build - + - name: Upload uses: actions/upload-artifact@v3 with: name: invisible path: invisible/.vitepress/dist - + core: name: Build Core runs-on: ubuntu-latest @@ -82,12 +82,12 @@ jobs: - name: Use Node.js uses: actions/setup-node@v3 with: - node-version: 18 + node-version: 22 - name: Install dependencies working-directory: ./core run: npm install - + # Copy node modules to provide dependencies for shared components in root folder - name: Copy node_modules shell: bash @@ -98,13 +98,13 @@ jobs: - name: Make build working-directory: ./core run: npm run docs:build - + - name: Upload uses: actions/upload-artifact@v3 with: name: core path: core/.vitepress/dist - + alpha-lab: name: Build Alpha Lab runs-on: ubuntu-latest @@ -115,12 +115,12 @@ jobs: - name: Use Node.js uses: actions/setup-node@v3 with: - node-version: 18 + node-version: 22 - name: Install dependencies working-directory: ./alpha-lab run: npm install - + # Copy node modules to provide dependencies for shared components in root folder - name: Copy node_modules shell: bash @@ -131,7 +131,7 @@ jobs: - name: Make build working-directory: ./alpha-lab run: npm run docs:build - + - name: Upload uses: actions/upload-artifact@v3 with: @@ -148,12 +148,12 @@ jobs: - name: Use Node.js uses: actions/setup-node@v3 with: - node-version: 18 + node-version: 22 - name: Install dependencies working-directory: ./landing-page run: npm install - + # Copy node modules to provide dependencies for shared components in root folder - name: Copy node_modules shell: bash @@ -164,19 +164,19 @@ jobs: - name: Make build working-directory: ./landing-page run: npm run docs:build - + - name: Upload uses: actions/upload-artifact@v3 with: name: landing-page path: landing-page/.vitepress/dist - + debugging-info: name: Upload debugging info runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v3 - name: Write commit SHA to gitcommit.txt shell: bash run: | @@ -203,13 +203,13 @@ jobs: shell: bash run: | du -ah . - + - name: Download gitcommit uses: actions/download-artifact@v3 with: name: gitcommit path: gitcommit.txt - + - name: Download Neon uses: actions/download-artifact@v3 with: @@ -221,13 +221,13 @@ jobs: with: name: invisible path: invisible/ - + - name: Download Core uses: actions/download-artifact@v3 with: name: core path: core/ - + - name: Download AlphaLab uses: actions/download-artifact@v3 with: @@ -248,7 +248,6 @@ jobs: remote_host: ${{ secrets.REMOTE_HOST}} remote_user: ${{ secrets.REMOTE_USER }} remote_key: ${{ secrets.DEPLOY_KEY }} - deploy-production: name: Deploy to production @@ -272,13 +271,13 @@ jobs: with: name: invisible path: invisible/ - + - name: Download Core uses: actions/download-artifact@v3 with: name: core path: core/ - + - name: Download AlphaLab uses: actions/download-artifact@v3 with: diff --git a/.github/workflows/build-deploy-staging.yml b/.github/workflows/build-deploy-staging.yml index 92b61a2bf..9b6fdf33b 100644 --- a/.github/workflows/build-deploy-staging.yml +++ b/.github/workflows/build-deploy-staging.yml @@ -14,7 +14,7 @@ jobs: - name: Use Node.js uses: actions/setup-node@v3 with: - node-version: 18 + node-version: 22 - name: Install dependencies working-directory: ./neon @@ -30,13 +30,13 @@ jobs: - name: Make build working-directory: ./neon run: npm run docs:build - + - name: Upload uses: actions/upload-artifact@v3 with: name: neon path: neon/.vitepress/dist - + invisible: name: Build Invisible runs-on: ubuntu-latest @@ -47,12 +47,12 @@ jobs: - name: Use Node.js uses: actions/setup-node@v3 with: - node-version: 18 + node-version: 22 - name: Install dependencies working-directory: ./invisible run: npm install - + # Copy node modules to provide dependencies for shared components in root folder - name: Copy node_modules shell: bash @@ -63,13 +63,13 @@ jobs: - name: Make build working-directory: ./invisible run: npm run docs:build - + - name: Upload uses: actions/upload-artifact@v3 with: name: invisible path: invisible/.vitepress/dist - + core: name: Build Core runs-on: ubuntu-latest @@ -80,12 +80,12 @@ jobs: - name: Use Node.js uses: actions/setup-node@v3 with: - node-version: 18 + node-version: 22 - name: Install dependencies working-directory: ./core run: npm install - + # Copy node modules to provide dependencies for shared components in root folder - name: Copy node_modules shell: bash @@ -96,13 +96,13 @@ jobs: - name: Make build working-directory: ./core run: npm run docs:build - + - name: Upload uses: actions/upload-artifact@v3 with: name: core path: core/.vitepress/dist - + alpha-lab: name: Build Alpha Lab runs-on: ubuntu-latest @@ -113,12 +113,12 @@ jobs: - name: Use Node.js uses: actions/setup-node@v3 with: - node-version: 18 + node-version: 22 - name: Install dependencies working-directory: ./alpha-lab run: npm install - + # Copy node modules to provide dependencies for shared components in root folder - name: Copy node_modules shell: bash @@ -129,7 +129,7 @@ jobs: - name: Make build working-directory: ./alpha-lab run: npm run docs:build - + - name: Upload uses: actions/upload-artifact@v3 with: @@ -146,12 +146,12 @@ jobs: - name: Use Node.js uses: actions/setup-node@v3 with: - node-version: 18 + node-version: 22 - name: Install dependencies working-directory: ./landing-page run: npm install - + # Copy node modules to provide dependencies for shared components in root folder - name: Copy node_modules shell: bash @@ -162,19 +162,19 @@ jobs: - name: Make build working-directory: ./landing-page run: npm run docs:build - + - name: Upload uses: actions/upload-artifact@v3 with: name: landing-page path: landing-page/.vitepress/dist - + debugging-info: name: Upload debugging info runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v3 - name: Write commit SHA to gitcommit.txt shell: bash run: | @@ -201,13 +201,13 @@ jobs: shell: bash run: | du -ah . - + - name: Download gitcommit uses: actions/download-artifact@v3 with: name: gitcommit path: gitcommit.txt - + - name: Download Neon uses: actions/download-artifact@v3 with: @@ -219,13 +219,13 @@ jobs: with: name: invisible path: invisible/ - + - name: Download Core uses: actions/download-artifact@v3 with: name: core path: core/ - + - name: Download AlphaLab uses: actions/download-artifact@v3 with: diff --git a/.github/workflows/build-only.yml b/.github/workflows/build-only.yml index cab837c5e..c587819f9 100644 --- a/.github/workflows/build-only.yml +++ b/.github/workflows/build-only.yml @@ -1,7 +1,6 @@ name: Build only -on: - pull_request +on: pull_request jobs: neon: @@ -14,7 +13,7 @@ jobs: - name: Use Node.js uses: actions/setup-node@v3 with: - node-version: 18 + node-version: 22 - name: Install dependencies working-directory: ./neon @@ -30,13 +29,13 @@ jobs: - name: Make build working-directory: ./neon run: npm run docs:build - + - name: Upload uses: actions/upload-artifact@v3 with: name: neon path: neon/.vitepress/dist - + invisible: name: Build Invisible runs-on: ubuntu-latest @@ -47,12 +46,12 @@ jobs: - name: Use Node.js uses: actions/setup-node@v3 with: - node-version: 18 + node-version: 22 - name: Install dependencies working-directory: ./invisible run: npm install - + # Copy node modules to provide dependencies for shared components in root folder - name: Copy node_modules shell: bash @@ -63,13 +62,13 @@ jobs: - name: Make build working-directory: ./invisible run: npm run docs:build - + - name: Upload uses: actions/upload-artifact@v3 with: name: invisible path: invisible/.vitepress/dist - + core: name: Build Core runs-on: ubuntu-latest @@ -80,12 +79,12 @@ jobs: - name: Use Node.js uses: actions/setup-node@v3 with: - node-version: 18 + node-version: 22 - name: Install dependencies working-directory: ./core run: npm install - + # Copy node modules to provide dependencies for shared components in root folder - name: Copy node_modules shell: bash @@ -96,13 +95,13 @@ jobs: - name: Make build working-directory: ./core run: npm run docs:build - + - name: Upload uses: actions/upload-artifact@v3 with: name: core path: core/.vitepress/dist - + alpha-lab: name: Build Alpha Lab runs-on: ubuntu-latest @@ -113,12 +112,12 @@ jobs: - name: Use Node.js uses: actions/setup-node@v3 with: - node-version: 18 + node-version: 22 - name: Install dependencies working-directory: ./alpha-lab run: npm install - + # Copy node modules to provide dependencies for shared components in root folder - name: Copy node_modules shell: bash @@ -129,7 +128,7 @@ jobs: - name: Make build working-directory: ./alpha-lab run: npm run docs:build - + - name: Upload uses: actions/upload-artifact@v3 with: @@ -146,12 +145,12 @@ jobs: - name: Use Node.js uses: actions/setup-node@v3 with: - node-version: 18 + node-version: 22 - name: Install dependencies working-directory: ./landing-page run: npm install - + # Copy node modules to provide dependencies for shared components in root folder - name: Copy node_modules shell: bash @@ -162,19 +161,19 @@ jobs: - name: Make build working-directory: ./landing-page run: npm run docs:build - + - name: Upload uses: actions/upload-artifact@v3 with: name: landing-page path: landing-page/.vitepress/dist - + debugging-info: name: Upload debugging info runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v3 - name: Write commit SHA to gitcommit.txt shell: bash run: | From 4d58143948c083d360093df7409c3a1e0e6b57e2 Mon Sep 17 00:00:00 2001 From: Robert Ennis Date: Thu, 5 Sep 2024 14:25:24 +0200 Subject: [PATCH 54/54] keep code example alongside the article --- .../imu_heading_visualization.ipynb | 549 ++++++++++++++++++ alpha-lab/imu-transformations/index.md | 4 +- 2 files changed, 552 insertions(+), 1 deletion(-) create mode 100644 alpha-lab/imu-transformations/imu_heading_visualization.ipynb diff --git a/alpha-lab/imu-transformations/imu_heading_visualization.ipynb b/alpha-lab/imu-transformations/imu_heading_visualization.ipynb new file mode 100644 index 000000000..d8eb6cf9f --- /dev/null +++ b/alpha-lab/imu-transformations/imu_heading_visualization.ipynb @@ -0,0 +1,549 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import json\n", + "\n", + "import cv2\n", + "import numpy as np\n", + "import pandas as pd\n", + "import matplotlib.pyplot as plt" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "from scipy.spatial.transform import Rotation as R\n", + "\n", + "\n", + "def transform_imu_to_world(imu_coordinates, imu_quaternions):\n", + " # This array contains a timeseries of transformation matrices,\n", + " # as calculated from the IMU's timeseries of quaternions values.\n", + " imu_to_world_matrices = R.from_quat(imu_quaternions).as_matrix()\n", + "\n", + " if np.ndim(imu_coordinates) == 1:\n", + " return imu_to_world_matrices @ imu_coordinates\n", + " else:\n", + " return np.array(\n", + " [\n", + " imu_to_world @ imu_coord\n", + " for imu_to_world, imu_coord in zip(\n", + " imu_to_world_matrices, imu_coordinates\n", + " )\n", + " ]\n", + " )\n", + "\n", + "\n", + "def transform_scene_to_imu(\n", + " coords_in_scene, translation_in_imu=np.array([0.0, -1.3, -6.62])\n", + "):\n", + " imu_scene_rotation_diff = np.deg2rad(-90 - 12)\n", + " scene_to_imu = np.array(\n", + " [\n", + " [1.0, 0.0, 0.0],\n", + " [\n", + " 0.0,\n", + " np.cos(imu_scene_rotation_diff),\n", + " -np.sin(imu_scene_rotation_diff),\n", + " ],\n", + " [\n", + " 0.0,\n", + " np.sin(imu_scene_rotation_diff),\n", + " np.cos(imu_scene_rotation_diff),\n", + " ],\n", + " ]\n", + " )\n", + "\n", + " coords_in_imu = scene_to_imu @ coords_in_scene.T\n", + "\n", + " coords_in_imu[0, :] += translation_in_imu[0]\n", + " coords_in_imu[1, :] += translation_in_imu[1]\n", + " coords_in_imu[2, :] += translation_in_imu[2]\n", + "\n", + " return coords_in_imu.T\n", + "\n", + "\n", + "def spherical_to_cartesian_scene(elevations, azimuths):\n", + " \"\"\"\n", + " Convert Neon's spherical representation of 3D gaze to Cartesian coordinates.\n", + " \"\"\"\n", + "\n", + " elevations_rad = np.deg2rad(elevations)\n", + " azimuths_rad = np.deg2rad(azimuths)\n", + "\n", + " # Elevation of 0 in Neon system corresponds to Y = 0, but\n", + " # an elevation of 0 in traditional spherical coordinates would\n", + " # correspond to Y = 1, so we convert elevation to the\n", + " # more traditional format.\n", + " elevations_rad += np.pi / 2\n", + "\n", + " # Azimuth of 0 in Neon system corresponds to X = 0, but\n", + " # an azimuth of 0 in traditional spherical coordinates would\n", + " # correspond to X = 1. Also, azimuth to the right in Neon is\n", + " # more positive, whereas it is more negative in traditional\n", + " # spherical coordiantes. So, we convert azimuth to the more\n", + " # traditional format.\n", + " azimuths_rad *= -1.0\n", + " azimuths_rad += np.pi / 2\n", + "\n", + " return np.array(\n", + " [\n", + " np.sin(elevations_rad) * np.cos(azimuths_rad),\n", + " np.cos(elevations_rad),\n", + " np.sin(elevations_rad) * np.sin(azimuths_rad),\n", + " ]\n", + " ).T\n", + "\n", + "\n", + "def transform_scene_to_world(\n", + " coords_in_scene, imu_quaternions, translation_in_imu=np.array([0.0, -1.3, -6.62])\n", + "):\n", + " coords_in_imu = transform_scene_to_imu(coords_in_scene, translation_in_imu)\n", + " return transform_imu_to_world(coords_in_imu, imu_quaternions)\n", + "\n", + "\n", + "def gaze_3d_to_world(gaze_elevation, gaze_azimuth, imu_quaternions):\n", + " cart_gazes_in_scene = spherical_to_cartesian_scene(gaze_elevation, gaze_azimuth)\n", + " return transform_scene_to_world(\n", + " cart_gazes_in_scene, imu_quaternions, translation_in_imu=np.zeros(3)\n", + " )\n", + "\n", + "\n", + "def imu_heading_in_world(imu_quaternions):\n", + " heading_neutral_in_imu_coords = np.array([0.0, 1.0, 0.0])\n", + " return transform_imu_to_world(heading_neutral_in_imu_coords, imu_quaternions)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "rec_dir = \"./2024-08-19_14-20-57-48fd6838/\"\n", + "\n", + "gaze = pd.read_csv(rec_dir + \"gaze.csv\")\n", + "eye3d = pd.read_csv(rec_dir + \"3d_eye_states.csv\")\n", + "imu = pd.read_csv(rec_dir + \"imu.csv\")\n", + "world = pd.read_csv(rec_dir + \"world_timestamps.csv\")\n", + "\n", + "gaze_ts = gaze[\"timestamp [ns]\"]\n", + "imu_ts = imu[\"timestamp [ns]\"]\n", + "world_ts = world[\"timestamp [ns]\"]\n", + "\n", + "info = []\n", + "with open(rec_dir + \"info.json\", \"r\") as f:\n", + " info = json.load(f)\n", + "\n", + "gaze[\"relative ts [s]\"] = (gaze_ts - info[\"start_time\"]) * 1e-9\n", + "imu[\"relative ts [s]\"] = (imu_ts - info[\"start_time\"]) * 1e-9\n", + "world[\"relative ts [s]\"] = (world_ts - info[\"start_time\"]) * 1e-9\n", + "\n", + "relative_demo_video_ts = np.arange(\n", + " world[\"relative ts [s]\"].iloc[200], world[\"relative ts [s]\"].iloc[-100], 1/30\n", + ")\n", + "\n", + "# We have more gaze datapoints (sampled at 200Hz) than\n", + "# IMU datapoints (sampled at 110Hz). We also need to sample values at the\n", + "# framerate of the visualization video that we will make, so linearly\n", + "# interpolate the IMU and gaze datapoints to be congruent with each other\n", + "# and the video render.\n", + "quaternions_resampled = np.array(\n", + " [\n", + " np.interp(relative_demo_video_ts, imu[\"relative ts [s]\"], imu[\"quaternion x\"]),\n", + " np.interp(relative_demo_video_ts, imu[\"relative ts [s]\"], imu[\"quaternion y\"]),\n", + " np.interp(relative_demo_video_ts, imu[\"relative ts [s]\"], imu[\"quaternion z\"]),\n", + " np.interp(relative_demo_video_ts, imu[\"relative ts [s]\"], imu[\"quaternion w\"]),\n", + " ]\n", + ").T\n", + "\n", + "gaze_elevation_resampled = np.interp(relative_demo_video_ts, gaze[\"relative ts [s]\"], gaze[\"elevation [deg]\"])\n", + "gaze_azimuth_resampled = np.interp(relative_demo_video_ts, gaze[\"relative ts [s]\"], gaze[\"azimuth [deg]\"])\n", + "\n", + "# Now, we can apply the functions.\n", + "\n", + "headings_in_world = imu_heading_in_world(quaternions_resampled)\n", + "\n", + "cart_gazes_in_world = gaze_3d_to_world(\n", + " gaze_elevation_resampled, gaze_azimuth_resampled, quaternions_resampled\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.animation as animation\n", + "\n", + "fig, axs = plt.subplots(1, 2, figsize=(10.5, 5))\n", + "\n", + "# Overhead visualization\n", + "\n", + "axs[0].axis(\"square\")\n", + "axs[0].set_aspect(\"equal\", adjustable=\"box\")\n", + "axs[0].set_xlim(-1.29, 1.29)\n", + "axs[0].set_ylim(-1.29, 1.29)\n", + "\n", + "axs[0].axis(\"off\")\n", + "\n", + "circle = plt.Circle((0, 0), 1.0, color=\"black\", fill=False)\n", + "axs[0].add_patch(circle)\n", + "\n", + "axs[0].text(0, 1.11, \"N\", ha=\"center\", va=\"bottom\", fontsize=\"xx-large\")\n", + "axs[0].text(0, -1.11, \"S\", ha=\"center\", va=\"top\", fontsize=\"xx-large\")\n", + "axs[0].text(1.11, 0, \"E\", ha=\"left\", va=\"center\", fontsize=\"xx-large\")\n", + "axs[0].text(-1.11, 0, \"W\", ha=\"right\", va=\"center\", fontsize=\"xx-large\")\n", + "\n", + "axs[0].plot([0, 0], [1.0, 1.08], color=\"black\")\n", + "axs[0].plot([0, 0], [-1.0, -1.08], color=\"black\")\n", + "axs[0].plot([1.0, 1.08], [0, 0], color=\"black\")\n", + "axs[0].plot([-1.0, -1.08], [0, 0], color=\"black\")\n", + "\n", + "heading_quiver_overhead = axs[0].quiver(\n", + " 0,\n", + " 0,\n", + " headings_in_world[0, 0],\n", + " headings_in_world[0, 1],\n", + " color=\"b\",\n", + " label=\"IMU Heading\",\n", + " scale=1,\n", + " scale_units=\"xy\",\n", + " angles=\"xy\",\n", + " width=0.01,\n", + ")\n", + "\n", + "gaze_quiver_overhead = axs[0].quiver(\n", + " 0,\n", + " 0,\n", + " cart_gazes_in_world[0, 0],\n", + " cart_gazes_in_world[0, 1],\n", + " color=\"r\",\n", + " label=\"Gaze vector\",\n", + " scale=1,\n", + " scale_units=\"xy\",\n", + " angles=\"xy\",\n", + " width=0.01,\n", + ")\n", + "\n", + "axs[0].legend(loc=\"lower right\", prop={\"size\": 11})\n", + "\n", + "axs[0].set_title(\"Heading and Gaze in World - Overhead\", fontsize=\"xx-large\")\n", + "\n", + "\n", + "# Side profile visualization\n", + "\n", + "axs[1].axis(\"square\")\n", + "axs[1].set_aspect(\"equal\", adjustable=\"box\")\n", + "axs[1].set_xlim(-1.29, 1.29)\n", + "axs[1].set_ylim(-1.29, 1.29)\n", + "\n", + "axs[1].axis(\"off\")\n", + "\n", + "circle = plt.Circle((0, 0), 1.0, color=\"black\", fill=False)\n", + "axs[1].add_patch(circle)\n", + "\n", + "axs[1].plot([0, 0], [1.0, 1.08], color=\"black\")\n", + "axs[1].plot([0, 0], [-1.0, -1.08], color=\"black\")\n", + "\n", + "axs[1].text(0, 1.11, \"Sky\", ha=\"center\", va=\"bottom\", fontsize=\"xx-large\")\n", + "axs[1].text(0, -1.11, \"Earth\", ha=\"center\", va=\"top\", fontsize=\"xx-large\")\n", + "\n", + "axs[1].hlines(0, -1.0, 1.0, color=\"black\", linestyle=\"--\")\n", + "\n", + "heading_quiver_sideprofile = axs[1].quiver(\n", + " 0,\n", + " 0,\n", + " headings_in_world[0, 1],\n", + " headings_in_world[0, 2],\n", + " color=\"b\",\n", + " scale=1,\n", + " scale_units=\"xy\",\n", + " angles=\"xy\",\n", + " width=0.01,\n", + ")\n", + "\n", + "gaze_quiver_sideprofile = axs[1].quiver(\n", + " 0,\n", + " 0,\n", + " cart_gazes_in_world[0, 1],\n", + " cart_gazes_in_world[0, 2],\n", + " color=\"r\",\n", + " scale=1,\n", + " scale_units=\"xy\",\n", + " angles=\"xy\",\n", + " width=0.01,\n", + ")\n", + "\n", + "axs[1].set_title(\"Heading and Gaze in World - Side-profile\", fontsize=\"xx-large\")\n", + "\n", + "\n", + "def update(frame):\n", + " global heading_quiver_overhead\n", + " heading_quiver_overhead.remove()\n", + " heading_quiver_overhead = axs[0].quiver(\n", + " 0,\n", + " 0,\n", + " headings_in_world[frame, 0],\n", + " headings_in_world[frame, 1],\n", + " color=\"b\",\n", + " label=\"IMU Heading\",\n", + " scale=1,\n", + " scale_units=\"xy\",\n", + " angles=\"xy\",\n", + " width=0.01,\n", + " )\n", + "\n", + " global gaze_quiver_overhead\n", + " gaze_quiver_overhead.remove()\n", + " gaze_quiver_overhead = axs[0].quiver(\n", + " 0,\n", + " 0,\n", + " cart_gazes_in_world[frame, 0],\n", + " cart_gazes_in_world[frame, 1],\n", + " color=\"r\",\n", + " label=\"Gaze vector\",\n", + " scale=1,\n", + " scale_units=\"xy\",\n", + " angles=\"xy\",\n", + " width=0.01,\n", + " )\n", + " \n", + " global heading_quiver_sideprofile\n", + " heading_quiver_sideprofile.remove()\n", + " heading_quiver_sideprofile = axs[1].quiver(\n", + " 0,\n", + " 0,\n", + " headings_in_world[frame, 1],\n", + " headings_in_world[frame, 2],\n", + " color=\"b\",\n", + " scale=1,\n", + " scale_units=\"xy\",\n", + " angles=\"xy\",\n", + " width=0.01,\n", + " )\n", + "\n", + " global gaze_quiver_sideprofile\n", + " gaze_quiver_sideprofile.remove()\n", + " gaze_quiver_sideprofile = axs[1].quiver(\n", + " 0,\n", + " 0,\n", + " cart_gazes_in_world[frame, 1],\n", + " cart_gazes_in_world[frame, 2],\n", + " color=\"r\",\n", + " scale=1,\n", + " scale_units=\"xy\",\n", + " angles=\"xy\",\n", + " width=0.01,\n", + " )\n", + "\n", + " return\n", + "\n", + "\n", + "fig.tight_layout()\n", + "\n", + "ani = animation.FuncAnimation(\n", + " fig=fig, func=update, frames=len(relative_demo_video_ts), interval=33.3333333333\n", + ")\n", + "ani.save(\"imu_heading.mp4\", writer=\"ffmpeg\")" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "gaze_left_start = 140\n", + "head_left_start = 315\n", + "gaze_head_left_start = 515\n", + "gaze_left_end = 255\n", + "head_left_end = 460\n", + "gaze_head_left_end = 650\n", + "\n", + "\n", + "gaze_right_start = 1201\n", + "head_right_start = 1364\n", + "gaze_head_right_start = 1614\n", + "gaze_right_end = 1325\n", + "head_right_end = 1560\n", + "gaze_head_right_end = 1762\n", + "\n", + "\n", + "gaze_up_start = 690\n", + "head_up_start = 850\n", + "gaze_head_up_start = 1030\n", + "gaze_up_end = 805\n", + "head_up_end = 1005\n", + "gaze_head_up_end = 1160\n", + "\n", + "\n", + "gaze_down_start = 1828\n", + "head_down_start = 2028\n", + "gaze_head_down_start = 2218\n", + "gaze_down_end = 1931\n", + "head_down_end = 2155\n", + "gaze_head_down_end = 2356\n", + "\n", + "\n", + "free_viewing_start = 2415\n", + "free_viewing_end = len(world_ts[200:-100]) - 1" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "# The gaze+eye overlay video was made with the pl-neon-recording library:\n", + "# https://github.com/pupil-labs/pl-neon-recording\n", + "import pupil_labs.neon_recording as nr\n", + "\n", + "native_rec_dir = \"./native_2024-08-19_14-20-57-48fd6838/\"\n", + "recording = nr.load(native_rec_dir)\n", + "\n", + "\n", + "def overlay_image(img, img_overlay, x, y):\n", + " \"\"\"Overlay `img_overlay` onto `img` at (x, y).\"\"\"\n", + "\n", + " # Image ranges\n", + " y1, y2 = max(0, y), min(img.shape[0], y + img_overlay.shape[0])\n", + " x1, x2 = max(0, x), min(img.shape[1], x + img_overlay.shape[1])\n", + "\n", + " # Overlay ranges\n", + " y1o, y2o = max(0, -y), min(img_overlay.shape[0], img.shape[0] - y)\n", + " x1o, x2o = max(0, -x), min(img_overlay.shape[1], img.shape[1] - x)\n", + "\n", + " if y1 >= y2 or x1 >= x2 or y1o >= y2o or x1o >= x2o:\n", + " return\n", + "\n", + " img_crop = img[y1:y2, x1:x2]\n", + " img_overlay_crop = img_overlay[y1o:y2o, x1o:x2o]\n", + " img_crop[:] = img_overlay_crop\n", + "\n", + "\n", + "def overlay_text(img, x, y, text=\"hello!\"):\n", + " text_background = np.zeros((110, 1600, 3), dtype=np.uint8)\n", + " text_background[:] = (255, 255, 255)\n", + "\n", + " overlay_image(img, text_background, 0, y-85)\n", + "\n", + " text_position = (x, y)\n", + " font = cv2.FONT_HERSHEY_SIMPLEX\n", + " font_scale = 3\n", + " color = (0, 0, 0)\n", + " thickness = 4\n", + " img = cv2.putText(img, text, text_position, font, font_scale, color, thickness)\n", + " return img\n", + "\n", + "\n", + "def make_overlaid_video(recording, output_video_path, fps=30):\n", + " video_writer = cv2.VideoWriter(\n", + " str(output_video_path),\n", + " cv2.VideoWriter_fourcc(*\"MJPG\"),\n", + " fps,\n", + " (recording.scene.width, recording.scene.height),\n", + " )\n", + "\n", + " output_timestamps = np.arange(\n", + " world_ts.iloc[200] * 1e-9,\n", + " world_ts.iloc[-100] * 1e-9,\n", + " 1 / 30,\n", + " )\n", + "\n", + " combined_data = zip(\n", + " recording.scene.sample(output_timestamps),\n", + " recording.eye.sample(output_timestamps),\n", + " recording.gaze.sample(output_timestamps),\n", + " )\n", + "\n", + " frame_idx = 0\n", + " for scene_frame, eye_frame, gaze_datum in combined_data:\n", + " frame_idx += 1\n", + " frame_pixels = scene_frame.bgr\n", + " eye_pixels = cv2.cvtColor(eye_frame.gray, cv2.COLOR_GRAY2BGR)\n", + " \n", + " frame_pixels = cv2.circle(\n", + " frame_pixels, (int(gaze_datum.x), int(gaze_datum.y)), 50, (0, 0, 255), 10\n", + " )\n", + "\n", + " overlay_image(frame_pixels, eye_pixels, 50, 50)\n", + " \n", + " if frame_idx >= gaze_left_start and frame_idx <= gaze_left_end:\n", + " frame_pixels = overlay_text(frame_pixels, 100, 1100, \"Gaze left\")\n", + " elif frame_idx >= head_left_start and frame_idx <= head_left_end:\n", + " frame_pixels = overlay_text(frame_pixels, 100, 1100, \"Head left\")\n", + " elif frame_idx >= gaze_head_left_start and frame_idx <= gaze_head_left_end:\n", + " frame_pixels = overlay_text(frame_pixels, 100, 1100, \"Gaze and head left\")\n", + " elif frame_idx >= gaze_right_start and frame_idx <= gaze_right_end:\n", + " frame_pixels = overlay_text(frame_pixels, 100, 1100, \"Gaze right\")\n", + " elif frame_idx >= head_right_start and frame_idx <= head_right_end:\n", + " frame_pixels = overlay_text(frame_pixels, 100, 1100, \"Head right\")\n", + " elif frame_idx >= gaze_head_right_start and frame_idx <= gaze_head_right_end:\n", + " frame_pixels = overlay_text(frame_pixels, 100, 1100, \"Gaze and head right\")\n", + " elif frame_idx >= gaze_up_start and frame_idx <= gaze_up_end:\n", + " frame_pixels = overlay_text(frame_pixels, 100, 1100, \"Gaze up\")\n", + " elif frame_idx >= head_up_start and frame_idx <= head_up_end:\n", + " frame_pixels = overlay_text(frame_pixels, 100, 1100, \"Head up\")\n", + " elif frame_idx >= gaze_head_up_start and frame_idx <= gaze_head_up_end:\n", + " frame_pixels = overlay_text(frame_pixels, 100, 1100, \"Gaze and head up\")\n", + " elif frame_idx >= gaze_down_start and frame_idx <= gaze_down_end:\n", + " frame_pixels = overlay_text(frame_pixels, 100, 1100, \"Gaze down\")\n", + " elif frame_idx >= head_down_start and frame_idx <= head_down_end:\n", + " frame_pixels = overlay_text(frame_pixels, 100, 1100, \"Head down\")\n", + " elif frame_idx >= gaze_head_down_start and frame_idx <= gaze_head_down_end:\n", + " frame_pixels = overlay_text(frame_pixels, 100, 1100, \"Gaze and head down\")\n", + " elif frame_idx >= free_viewing_start and frame_idx <= free_viewing_end:\n", + " frame_pixels = overlay_text(frame_pixels, 100, 1100, \"Free viewing\")\n", + " \n", + " video_writer.write(frame_pixels)\n", + "\n", + " video_writer.release()\n", + "\n", + "\n", + "make_overlaid_video(recording, \"eye-gaze-overlay-output-video.avi\")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": ".venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.8" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/alpha-lab/imu-transformations/index.md b/alpha-lab/imu-transformations/index.md index 0d68833a6..0d158e347 100644 --- a/alpha-lab/imu-transformations/index.md +++ b/alpha-lab/imu-transformations/index.md @@ -28,6 +28,8 @@ import TagLinks from '@components/TagLinks.vue' This guide contains various transformation functions that help with relating [Neon's IMU data](https://docs.pupil-labs.com/neon/data-collection/data-streams/#movement-imu-data) with other data streams. +As you work through this guide, you may want to check out the [Application Example](#application-example) to see the code in action. + ## Rotation between the IMU and the World The IMU data includes a description of how the IMU is rotated in relation to the world. Concretely, the IMU data contains quaternions that define a rotation transformation between the [the world coordinate system](http://docs.pupil-labs.com/neon/data-collection/data-streams/#movement-imu-data) and the IMU's local coordinate system at different points in time. @@ -248,7 +250,7 @@ def cartesian_to_spherical_world(world_points_3d): ## Application Example -Below, we present a video showing how some of the functions in this article were used to visualize different combinations of head and eye movements in world coordinates. The code for producing the visualization [can be found here](https://gist.github.com/rennis250/8a684ea1e2f92c79fa2104b7a0f30e20). +Below, we present a video showing how some of the functions in this article were used to visualize different combinations of head and eye movements in world coordinates. The code for producing the visualization [can be found here](https://github.com/pupil-labs/pupil-docs/tree/master/alpha-lab/imu-transformations/imu_heading_visualization.ipynb).

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 Zm*u}}eEN(4kcL1=iOGu=ix|B8e*pRP>CONE literal 0 HcmV?d00001 diff --git a/alpha-lab/imu-transformations/index.md b/alpha-lab/imu-transformations/index.md index 6365d2d80..d9f0de144 100644 --- a/alpha-lab/imu-transformations/index.md +++ b/alpha-lab/imu-transformations/index.md @@ -89,7 +89,7 @@ Neon simultaneously records gaze and IMU data, making it possible to study the r To facilitate the comparison, it can be useful to represent these data streams in the same coordinate system. An important step is accounting for [the fixed 102 degree rotation offset between the scene camera and IMU coordinate systems](https://docs.pupil-labs.com/neon/data-collection/data-streams/#movement-imu-data), as depicted below. -![Diagrams showing the 102 degree rotation offset between the IMU and scene camera coordinate systems.](./imu-scene_camera_offset-black.jpg) +![Diagrams showing the 102 degree rotation offset between the IMU and scene camera coordinate systems.](./imu-scene_camera_offset-black.png) We can use data from the IMU to transform gaze from scene camera coordinates to world coordinates. This is facilitated by the `transform_scene_to_imu` and `spherical_to_cartesian_scene` functions: From cf2a6fea5451e4e554328c8a257662bca95477bf Mon Sep 17 00:00:00 2001 From: Robert Ennis Date: Thu, 22 Aug 2024 13:00:12 +0200 Subject: [PATCH 25/54] tiny cleanup --- alpha-lab/imu-transformations/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/alpha-lab/imu-transformations/index.md b/alpha-lab/imu-transformations/index.md index d9f0de144..a143043eb 100644 --- a/alpha-lab/imu-transformations/index.md +++ b/alpha-lab/imu-transformations/index.md @@ -37,7 +37,7 @@ While working through this guide, it can be helpful to try out our IMU visualiza ## Transform to World Coordinates -One of the key steps when dealing with the IMU is the transformation that takes coordinates in the local IMU coordinate system to their corresponding coordinates in the world coordinate system. The quaternion values provided by the IMU can be used to convert between the two coordinate systems. The `transform_imu_to_world` function is defined below and will be used throughout this article. +One of the key steps when dealing with the IMU is the transformation that takes coordinates in the local IMU coordinate system to their corresponding coordinates in the world coordinate system. The quaternion values provided by the IMU can be used to convert between the two coordinate systems. The `transform_imu_to_world` function, defined below, will be used throughout this article. Note that the origin of the IMU coordinate system is the same as the origin of the world coordinate system. @@ -206,7 +206,7 @@ optical_axes_in_world = transform_imu_to_world( ## World Spherical Coordinates -When studying head orientation and gaze orientation as observers navigate a 3D environment, it can be useful to know how much these quantities deviate from pointing at a given landmark or direction. For instance, you might want to know when someone’s gaze or heading deviates from parallel with the horizon. This can be simplified by converting world points from Cartesian to spherical coordinates. The orientation values from the IMU are already in such a format. For gaze data in world coordinates, the function below will do the necessary transformation. When wearing Neon normally, an elevation and azimuth of 0 degrees corresponds to a neutral orientation: i.e., aimed at magnetic North and parallel to the horizon. +When studying head orientation and gaze orientation as observers navigate a 3D environment, it can be useful to know how much these quantities deviate from pointing at a given landmark or direction. For instance, you might want to know when someone’s gaze or heading deviates from parallel with the horizon. This can be simplified by converting world points from Cartesian to spherical coordinates. The [Euler angles from the IMU](https://docs.pupil-labs.com/neon/data-collection/data-streams/#euler-angles) are already in a compatible format. For gaze data in world coordinates, the `cartesian_to_spherical_world` function below will do the necessary transformation. When wearing Neon normally, an elevation and azimuth of 0 degrees corresponds to a neutral orientation: i.e., aimed at magnetic North and parallel to the horizon. ```python def cartesian_to_spherical_world(world_points_3d): From 01f3160e7488ef253ee253c05716fc993bd4c6d1 Mon Sep 17 00:00:00 2001 From: Robert Ennis Date: Thu, 22 Aug 2024 13:39:00 +0200 Subject: [PATCH 26/54] make R import from scipy clearer; fix small code typo --- alpha-lab/imu-transformations/index.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/alpha-lab/imu-transformations/index.md b/alpha-lab/imu-transformations/index.md index a143043eb..bf2a1662d 100644 --- a/alpha-lab/imu-transformations/index.md +++ b/alpha-lab/imu-transformations/index.md @@ -42,12 +42,14 @@ One of the key steps when dealing with the IMU is the transformation that takes Note that the origin of the IMU coordinate system is the same as the origin of the world coordinate system. ```python +from scipy.spatial.transform import Rotation as R + def transform_imu_to_world(imu_coordinates, imu_quaternions): # This array contains a timeseries of transformation matrices, # as calculated from the IMU's timeseries of quaternions values. imu_to_world_matrices = R.from_quat(imu_quaternions).as_matrix() - if len(imu_coordinates) == 1: + if np.ndim(imu_coordinates) == 1: return imu_to_world_matrices @ imu_coordinates else: return np.array([ From eb76bb4a89556badab01d1f6be8934eb0990ed4e Mon Sep 17 00:00:00 2001 From: Robert Ennis Date: Thu, 22 Aug 2024 13:54:31 +0200 Subject: [PATCH 27/54] tidy formatting a bit --- alpha-lab/imu-transformations/index.md | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/alpha-lab/imu-transformations/index.md b/alpha-lab/imu-transformations/index.md index bf2a1662d..1d7df53a5 100644 --- a/alpha-lab/imu-transformations/index.md +++ b/alpha-lab/imu-transformations/index.md @@ -69,8 +69,7 @@ An alternative representation of IMU orientation data is a heading vector that p ```python heading_neutral_in_imu_coords = np.array([0.0, 1.0, 0.0]) headings_in_world = transform_imu_to_world( - heading_neutral_in_imu_coords, - imu_quaternions, + heading_neutral_in_imu_coords, imu_quaternions, ) ``` @@ -80,8 +79,7 @@ The IMU’s acceleration data are specified in its local coordinate system. Some ```python accelerations_in_world = transform_imu_to_world( - imu_accelerations, - imu_quaternions, + imu_accelerations, imu_quaternions, ) ``` @@ -188,21 +186,17 @@ The [3D eyestate estimates](https://docs.pupil-labs.com/neon/data-collection/dat scene_camera_position_in_imu = np.array([0.0, -1.3, -6.62]) eyeball_centers_in_imu = transform_scene_to_imu( - eyeball_centers.T, - translation=scene_camera_position_in_imu, + eyeball_centers.T, translation=scene_camera_position_in_imu, ) eyeball_centers_in_world = transform_imu_to_world( - eyeball_centers_in_imu.T, - imu_quaternions, + eyeball_centers_in_imu.T, imu_quaternions, ) optical_axes_in_imu = transform_scene_to_imu( - optical_axes.T, - translation=scene_camera_position_in_imu, + optical_axes.T, translation=scene_camera_position_in_imu, ) optical_axes_in_world = transform_imu_to_world( - optical_axes_in_imu.T, - imu_quaternions + optical_axes_in_imu.T, imu_quaternions, ) ``` From 98342426deec756d5944d2c6c8291da8f2478300 Mon Sep 17 00:00:00 2001 From: Robert Ennis Date: Thu, 22 Aug 2024 15:11:36 +0200 Subject: [PATCH 28/54] fix homogeneous part of transform_scene_to_imu based on results of my test code --- alpha-lab/imu-transformations/index.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/alpha-lab/imu-transformations/index.md b/alpha-lab/imu-transformations/index.md index 1d7df53a5..685e753ba 100644 --- a/alpha-lab/imu-transformations/index.md +++ b/alpha-lab/imu-transformations/index.md @@ -117,10 +117,10 @@ def transform_scene_to_imu(coords_in_scene, translation = None): scene_to_imu_homogeneous[:3, :3] = scene_to_imu scene_to_imu_homogeneous[:3, 3] = translation - coords_in_scene_homogeneous = cv2.convertPointsToHomogeneous(coords_in_scene) - return cv2.convertPointsFromHomogeneous( - scene_to_imu_homogeneous @ coords_in_scene_homogeneous - ) + coords_in_scene_homogeneous = cv2.convertPointsToHomogeneous(coords_in_scene.T) + coords_in_imu_homogeneous = scene_to_imu_homogeneous @ coords_in_scene_homogeneous.reshape(-1, 4).T + coords_in_imu = cv2.convertPointsFromHomogeneous(coords_in_imu_homogeneous.T) + return coords_in_imu.reshape(-1, 3).T else: return scene_to_imu @ coords_in_scene @@ -193,7 +193,7 @@ eyeball_centers_in_world = transform_imu_to_world( ) optical_axes_in_imu = transform_scene_to_imu( - optical_axes.T, translation=scene_camera_position_in_imu, + optical_axes.T, ) optical_axes_in_world = transform_imu_to_world( optical_axes_in_imu.T, imu_quaternions, From c1b6182315337f41b038d077bafab3b7b0c7d211 Mon Sep 17 00:00:00 2001 From: Robert Ennis Date: Thu, 22 Aug 2024 16:56:38 +0200 Subject: [PATCH 29/54] further generalize + compress + simplify; re-tested new functions and they needed a tweak to work correctly again; they are back in a ready state --- alpha-lab/imu-transformations/index.md | 43 ++++++++++++++------------ 1 file changed, 23 insertions(+), 20 deletions(-) diff --git a/alpha-lab/imu-transformations/index.md b/alpha-lab/imu-transformations/index.md index 685e753ba..a1301ade6 100644 --- a/alpha-lab/imu-transformations/index.md +++ b/alpha-lab/imu-transformations/index.md @@ -94,7 +94,7 @@ To facilitate the comparison, it can be useful to represent these data streams i We can use data from the IMU to transform gaze from scene camera coordinates to world coordinates. This is facilitated by the `transform_scene_to_imu` and `spherical_to_cartesian_scene` functions: ```python -def transform_scene_to_imu(coords_in_scene, translation = None): +def transform_scene_to_imu(coords_in_scene, translation=None): imu_scene_rotation_diff = np.deg2rad(-90 - 12) scene_to_imu = np.array( [ @@ -112,17 +112,18 @@ def transform_scene_to_imu(coords_in_scene, translation = None): ] ) - if translation: + if translation is not None: scene_to_imu_homogeneous = np.zeros((4, 4)) scene_to_imu_homogeneous[:3, :3] = scene_to_imu scene_to_imu_homogeneous[:3, 3] = translation - coords_in_scene_homogeneous = cv2.convertPointsToHomogeneous(coords_in_scene.T) + coords_in_scene_homogeneous = cv2.convertPointsToHomogeneous(coords_in_scene) coords_in_imu_homogeneous = scene_to_imu_homogeneous @ coords_in_scene_homogeneous.reshape(-1, 4).T - coords_in_imu = cv2.convertPointsFromHomogeneous(coords_in_imu_homogeneous.T) - return coords_in_imu.reshape(-1, 3).T + coords_in_imu = cv2.convertPointsFromHomogeneous(coords_in_imu_homogeneous.T).reshape(-1, 3) else: - return scene_to_imu @ coords_in_scene + coords_in_imu = (scene_to_imu @ coords_in_scene.T).T + + return coords_in_imu def spherical_to_cartesian_scene(elevations, azimuths): @@ -157,7 +158,15 @@ def spherical_to_cartesian_scene(elevations, azimuths): ).T ``` -Now we have the tools to convert gaze data to world coordinates: +Putting these together, we can build a general `transform_scene_to_world` function: + +```python +def transform_scene_to_world(coords_in_scene, imu_quaternions, translation=None): + coords_in_imu = transform_scene_to_imu(coords_in_scene, translation) + return transform_imu_to_world(coords_in_imu, imu_quaternions) +``` + +Now we have the tools to convert 3D gaze data to world coordinates: ```python # The gaze data and the IMU quaternions should be sampled at the @@ -165,8 +174,7 @@ Now we have the tools to convert gaze data to world coordinates: # ensure this. cart_gazes_in_scene = spherical_to_cartesian_scene(gaze_elevations, gaze_azimuths) -gazes_in_imu = transform_scene_to_imu(cart_gazes_in_scene.T) -gazes_in_world = transform_imu_to_world(gazes_in_imu.T, imu_quaternions) +cart_gazes_in_world = transform_scene_to_world(cart_gazes_in_scene, imu_quaternions) ``` ## Eyestate to World Coordinates @@ -184,19 +192,14 @@ The [3D eyestate estimates](https://docs.pupil-labs.com/neon/data-collection/dat # scene camera in the IMU coordinate system. Here, we express that # position in millimeters. scene_camera_position_in_imu = np.array([0.0, -1.3, -6.62]) - -eyeball_centers_in_imu = transform_scene_to_imu( - eyeball_centers.T, translation=scene_camera_position_in_imu, -) -eyeball_centers_in_world = transform_imu_to_world( - eyeball_centers_in_imu.T, imu_quaternions, +eyeball_centers_in_world = transform_scene_to_world( + eyeball_centers, imu_quaternions, translation=scene_camera_position_in_imu, ) -optical_axes_in_imu = transform_scene_to_imu( - optical_axes.T, -) -optical_axes_in_world = transform_imu_to_world( - optical_axes_in_imu.T, imu_quaternions, +# The optical axes are unit vectors originating at the eyeball centers, +# so there is no need to translate them. +optical_axes_in_world = transform_scene_to_world( + optical_axes, imu_quaternions, ) ``` From 86962832bcd93feee93734bf8ec45f1afef16b5b Mon Sep 17 00:00:00 2001 From: Robert Ennis Date: Fri, 23 Aug 2024 00:23:08 +0200 Subject: [PATCH 30/54] simplify homogeneous coordinates part a bit; fix typo --- alpha-lab/imu-transformations/index.md | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/alpha-lab/imu-transformations/index.md b/alpha-lab/imu-transformations/index.md index a1301ade6..a6a246bbf 100644 --- a/alpha-lab/imu-transformations/index.md +++ b/alpha-lab/imu-transformations/index.md @@ -94,7 +94,7 @@ To facilitate the comparison, it can be useful to represent these data streams i We can use data from the IMU to transform gaze from scene camera coordinates to world coordinates. This is facilitated by the `transform_scene_to_imu` and `spherical_to_cartesian_scene` functions: ```python -def transform_scene_to_imu(coords_in_scene, translation=None): +def transform_scene_to_imu(coords_in_scene, translation=np.zeros((3,))): imu_scene_rotation_diff = np.deg2rad(-90 - 12) scene_to_imu = np.array( [ @@ -112,16 +112,14 @@ def transform_scene_to_imu(coords_in_scene, translation=None): ] ) - if translation is not None: - scene_to_imu_homogeneous = np.zeros((4, 4)) - scene_to_imu_homogeneous[:3, :3] = scene_to_imu - scene_to_imu_homogeneous[:3, 3] = translation + scene_to_imu_homogeneous = np.zeros((4, 4)) + scene_to_imu_homogeneous[:3, :3] = scene_to_imu + scene_to_imu_homogeneous[:3, 3] = translation + scene_to_imu_homogeneous[3, 3] = 1.0 - coords_in_scene_homogeneous = cv2.convertPointsToHomogeneous(coords_in_scene) - coords_in_imu_homogeneous = scene_to_imu_homogeneous @ coords_in_scene_homogeneous.reshape(-1, 4).T - coords_in_imu = cv2.convertPointsFromHomogeneous(coords_in_imu_homogeneous.T).reshape(-1, 3) - else: - coords_in_imu = (scene_to_imu @ coords_in_scene.T).T + coords_in_scene_homogeneous = cv2.convertPointsToHomogeneous(coords_in_scene) + coords_in_imu_homogeneous = scene_to_imu_homogeneous @ coords_in_scene_homogeneous.reshape(-1, 4).T + coords_in_imu = cv2.convertPointsFromHomogeneous(coords_in_imu_homogeneous.T).reshape(-1, 3) return coords_in_imu @@ -161,7 +159,7 @@ def spherical_to_cartesian_scene(elevations, azimuths): Putting these together, we can build a general `transform_scene_to_world` function: ```python -def transform_scene_to_world(coords_in_scene, imu_quaternions, translation=None): +def transform_scene_to_world(coords_in_scene, imu_quaternions, translation=np.zeros((3,))): coords_in_imu = transform_scene_to_imu(coords_in_scene, translation) return transform_imu_to_world(coords_in_imu, imu_quaternions) ``` From ea482c2abfc60ace83c3149e769a79bab2d2fa7f Mon Sep 17 00:00:00 2001 From: Robert Ennis Date: Fri, 23 Aug 2024 09:51:08 +0200 Subject: [PATCH 31/54] unproject 2d gaze rather than convert 3d gaze from spherical to cartesian --- alpha-lab/imu-transformations/index.md | 86 +++++++++++++------------- 1 file changed, 43 insertions(+), 43 deletions(-) diff --git a/alpha-lab/imu-transformations/index.md b/alpha-lab/imu-transformations/index.md index a6a246bbf..428d73f96 100644 --- a/alpha-lab/imu-transformations/index.md +++ b/alpha-lab/imu-transformations/index.md @@ -69,7 +69,7 @@ An alternative representation of IMU orientation data is a heading vector that p ```python heading_neutral_in_imu_coords = np.array([0.0, 1.0, 0.0]) headings_in_world = transform_imu_to_world( - heading_neutral_in_imu_coords, imu_quaternions, + heading_neutral_in_imu_coords, imu_quaternions ) ``` @@ -79,19 +79,19 @@ The IMU’s acceleration data are specified in its local coordinate system. Some ```python accelerations_in_world = transform_imu_to_world( - imu_accelerations, imu_quaternions, + imu_accelerations, imu_quaternions ) ``` -## Gaze to World Coordinates +## Scene to World Coordinates Neon simultaneously records gaze and IMU data, making it possible to study the relationship between head and eye movements. To facilitate the comparison, it can be useful to represent these data streams in the same coordinate system. An important step is accounting for [the fixed 102 degree rotation offset between the scene camera and IMU coordinate systems](https://docs.pupil-labs.com/neon/data-collection/data-streams/#movement-imu-data), as depicted below. -![Diagrams showing the 102 degree rotation offset between the IMU and scene camera coordinate systems.](./imu-scene_camera_offset-black.png) +![Diagrams showing the fixed 102 degree rotation offset between the IMU and scene camera coordinate systems.](./imu-scene_camera_offset-black.png) -We can use data from the IMU to transform gaze from scene camera coordinates to world coordinates. This is facilitated by the `transform_scene_to_imu` and `spherical_to_cartesian_scene` functions: +We can use data from the IMU to transform gaze in scene camera coordinates to world coordinates. We proceed by building a `transform_scene_to_imu` function: ```python def transform_scene_to_imu(coords_in_scene, translation=np.zeros((3,))): @@ -122,41 +122,9 @@ def transform_scene_to_imu(coords_in_scene, translation=np.zeros((3,))): coords_in_imu = cv2.convertPointsFromHomogeneous(coords_in_imu_homogeneous.T).reshape(-1, 3) return coords_in_imu - - -def spherical_to_cartesian_scene(elevations, azimuths): - """ - Convert Neon's spherical representation of 3D gaze to Cartesian coordinates. - """ - - elevations_rad = np.deg2rad(elevations) - azimuths_rad = np.deg2rad(azimuths) - - # Elevation of 0 in Neon system corresponds to Y = 0, but - # an elevation of 0 in traditional spherical coordinates would - # correspond to Y = 1, so we convert elevation to the - # more traditional format. - elevations_rad += np.pi / 2 - - # Azimuth of 0 in Neon system corresponds to X = 0, but - # an azimuth of 0 in traditional spherical coordinates would - # correspond to X = 1. Also, azimuth to the right in Neon is - # more positive, whereas it is more negative in traditional - # spherical coordiantes. So, we convert azimuth to the more - # traditional format. - azimuths_rad *= -1.0 - azimuths_rad += np.pi / 2 - - return np.array( - [ - np.sin(elevations_rad) * np.cos(azimuths_rad), - np.cos(elevations_rad), - np.sin(elevations_rad) * np.sin(azimuths_rad), - ] - ).T ``` -Putting these together, we can build a general `transform_scene_to_world` function: +Putting together the `transform_scene_to_imu` and `transform_imu_to_world` functions, we can build a general `transform_scene_to_world` function: ```python def transform_scene_to_world(coords_in_scene, imu_quaternions, translation=np.zeros((3,))): @@ -164,15 +132,47 @@ def transform_scene_to_world(coords_in_scene, imu_quaternions, translation=np.ze return transform_imu_to_world(coords_in_imu, imu_quaternions) ``` -Now we have the tools to convert 3D gaze data to world coordinates: +Now we have the tools to convert 3D gaze data to world coordinates, but first, we need to convert 2D gaze to 3D by undistorting and unprojecting the image coordinates: + +```python +def unproject_2d_gaze(gaze_points_2d, scene_camera_matrix, scene_distortion_coefficients): + """ + Transform the 2D gaze values from Neon to 3D gaze vectors. + + See the associated Alpha Labs article for a tutorial on undistorting: + https://docs.pupil-labs.com/alpha-lab/undistort/ + """ + + gaze_points_2d_undist = cv2.undistortPoints(gaze_points_2d, scene_camera_matrix, scene_distortion_coefficients) + gaze_vectors_3d = cv2.convertPointsToHomogeneous(gaze_points_2d_undist) + gaze_vectors_3d /= np.linalg.norm(gaze_vectors_3d, axis=2)[:, np.newaxis] + + return gaze_vectors_3d +``` + +Putting all of this together, we can convert 2D gaze data in scene image coordinates to 3D gaze data in world coordinates: ```python # The gaze data and the IMU quaternions should be sampled at the # same timestamps. You can linearly interpolate the IMU data to # ensure this. -cart_gazes_in_scene = spherical_to_cartesian_scene(gaze_elevations, gaze_azimuths) -cart_gazes_in_world = transform_scene_to_world(cart_gazes_in_scene, imu_quaternions) +# I'm not sure if we want to show how to load the camera calib data +# +# scene_camera_info = [] +# with open(rec_dir + "scene_camera.json") as f: +# scene_camera_info = json.load(f) +# +# scene_camera_matrix = np.array(scene_camera_info["camera_matrix"]) +# scene_distortion_coefficients = np.array(scene_camera_info["distortion_coefficients"]) + +gaze_points_2d = gaze[["gaze x [px]", "gaze y [px]"]].to_numpy() +cart_gazes_in_scene = undistort_and_unproject( + gaze_points_2d, scene_camera_matrix, scene_distortion_coefficients +) +cart_gazes_in_world = transform_scene_to_world( + cart_gazes_in_scene, imu_quaternions +) ``` ## Eyestate to World Coordinates @@ -191,13 +191,13 @@ The [3D eyestate estimates](https://docs.pupil-labs.com/neon/data-collection/dat # position in millimeters. scene_camera_position_in_imu = np.array([0.0, -1.3, -6.62]) eyeball_centers_in_world = transform_scene_to_world( - eyeball_centers, imu_quaternions, translation=scene_camera_position_in_imu, + eyeball_centers, imu_quaternions, translation=scene_camera_position_in_imu ) # The optical axes are unit vectors originating at the eyeball centers, # so there is no need to translate them. optical_axes_in_world = transform_scene_to_world( - optical_axes, imu_quaternions, + optical_axes, imu_quaternions ) ``` From a895e51b7f8edcbdc169758115db11fdb5bd10c4 Mon Sep 17 00:00:00 2001 From: Robert Ennis Date: Fri, 23 Aug 2024 09:52:22 +0200 Subject: [PATCH 32/54] revert section title change --- alpha-lab/imu-transformations/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/alpha-lab/imu-transformations/index.md b/alpha-lab/imu-transformations/index.md index 428d73f96..9d9ad6e27 100644 --- a/alpha-lab/imu-transformations/index.md +++ b/alpha-lab/imu-transformations/index.md @@ -83,7 +83,7 @@ accelerations_in_world = transform_imu_to_world( ) ``` -## Scene to World Coordinates +## Gaze to World Coordinates Neon simultaneously records gaze and IMU data, making it possible to study the relationship between head and eye movements. From e36c96935f80b1d13065596ea8cf4c8d70757a66 Mon Sep 17 00:00:00 2001 From: Robert Ennis Date: Fri, 23 Aug 2024 13:28:52 +0200 Subject: [PATCH 33/54] implement new suggestions: link to calib loading doc, re-order sections, have 2d->world and 3d->world sections for gaze, compare homogeneous and explicit translation approaches, add eyestate convienence function, some formatting cleanup --- alpha-lab/imu-transformations/index.md | 204 ++++++++++++++++--------- 1 file changed, 135 insertions(+), 69 deletions(-) diff --git a/alpha-lab/imu-transformations/index.md b/alpha-lab/imu-transformations/index.md index 9d9ad6e27..52c8b7651 100644 --- a/alpha-lab/imu-transformations/index.md +++ b/alpha-lab/imu-transformations/index.md @@ -35,7 +35,7 @@ This guide contains various transformation functions that can assist when analys While working through this guide, it can be helpful to try out our IMU visualization utility, [plimu](https://github.com/pupil-labs/plimu). This can assist in understanding the IMU data and the various coordinate systems. For example, some of the code in this article is [adapted from it](https://github.com/pupil-labs/plimu/blob/8b94302982363b203dddea2b15f43c6da60e787e/src/pupil_labs/plimu/visualizer.py#L274-L279). -## Transform to World Coordinates +## IMU to World Coordinates One of the key steps when dealing with the IMU is the transformation that takes coordinates in the local IMU coordinate system to their corresponding coordinates in the world coordinate system. The quaternion values provided by the IMU can be used to convert between the two coordinate systems. The `transform_imu_to_world` function, defined below, will be used throughout this article. @@ -60,41 +60,25 @@ def transform_imu_to_world(imu_coordinates, imu_quaternions): ]) ``` -Now that we have the `transform_imu_to_world` function, let's use it! +Now that we have the `transform_imu_to_world` function, let's build on it! -## Obtain IMU Heading Vectors - -An alternative representation of IMU orientation data is a heading vector that points outwards from the center of the IMU. Neutral orientation of the IMU would correspond to a heading vector that points at magnetic North and that is oriented perpendicular to the line of gravity: - -```python -heading_neutral_in_imu_coords = np.array([0.0, 1.0, 0.0]) -headings_in_world = transform_imu_to_world( - heading_neutral_in_imu_coords, imu_quaternions -) -``` +## Scene Camera to World Coordinates -## Acceleration in World +Neon simultaneously records data in the scene camera and IMU coordinate systems, making it possible to study the relationship between head and eye movements. -The IMU’s acceleration data are specified in its local coordinate system. Sometimes, it can be useful to have the acceleration data specified in the world coordinate system instead: +To facilitate the comparison, it can be useful to represent these data streams in the same coordinate system. An important step is accounting for [the fixed 102 degree rotation offset between the scene camera and IMU coordinate systems](https://docs.pupil-labs.com/neon/data-collection/data-streams/#movement-imu-data), as depicted below. -```python -accelerations_in_world = transform_imu_to_world( - imu_accelerations, imu_quaternions -) -``` +![Diagrams showing the fixed 102 degree rotation offset between the IMU and scene camera coordinate systems.](./imu-scene_camera_offset-black.png) -## Gaze to World Coordinates +We can use data from the IMU to transform gaze in scene camera coordinates to world coordinates. We proceed by building a `transform_scene_to_imu` function that handles the rotation between the two coordinate systems. It also accepts a `translation_in_imu` keyword argument to specify if points should be shifted in the IMU system. This will be relevant when converting 3D eyestate to world coordinates. -Neon simultaneously records gaze and IMU data, making it possible to study the relationship between head and eye movements. +- ***Rob note:*** Keep this next bit if we decide to use homogeneous coordinates: -To facilitate the comparison, it can be useful to represent these data streams in the same coordinate system. An important step is accounting for [the fixed 102 degree rotation offset between the scene camera and IMU coordinate systems](https://docs.pupil-labs.com/neon/data-collection/data-streams/#movement-imu-data), as depicted below. +We implement the rotation and translation as [a single affine transformation](https://en.wikipedia.org/wiki/Affine_transformation): -![Diagrams showing the fixed 102 degree rotation offset between the IMU and scene camera coordinate systems.](./imu-scene_camera_offset-black.png) - -We can use data from the IMU to transform gaze in scene camera coordinates to world coordinates. We proceed by building a `transform_scene_to_imu` function: ```python -def transform_scene_to_imu(coords_in_scene, translation=np.zeros((3,))): +def transform_scene_to_imu(coords_in_scene, translation_in_imu=np.zeros((3,))): imu_scene_rotation_diff = np.deg2rad(-90 - 12) scene_to_imu = np.array( [ @@ -112,35 +96,123 @@ def transform_scene_to_imu(coords_in_scene, translation=np.zeros((3,))): ] ) - scene_to_imu_homogeneous = np.zeros((4, 4)) - scene_to_imu_homogeneous[:3, :3] = scene_to_imu - scene_to_imu_homogeneous[:3, 3] = translation - scene_to_imu_homogeneous[3, 3] = 1.0 + # The homogeneous approach, for comparison + # + # scene_to_imu_homogeneous = np.zeros((4, 4)) + # scene_to_imu_homogeneous[:3, :3] = scene_to_imu + # scene_to_imu_homogeneous[:3, 3] = translation_in_imu + # scene_to_imu_homogeneous[3, 3] = 1.0 + + # coords_in_scene_homogeneous = cv2.convertPointsToHomogeneous(coords_in_scene) + # coords_in_imu_homogeneous = scene_to_imu_homogeneous @ coords_in_scene_homogeneous.reshape(-1, 4).T + # coords_in_imu = cv2.convertPointsFromHomogeneous(coords_in_imu_homogeneous.T).reshape(-1, 3) + + # Rob-Blob approach + coords_in_imu = scene_to_imu @ coords_in_scene.T - coords_in_scene_homogeneous = cv2.convertPointsToHomogeneous(coords_in_scene) - coords_in_imu_homogeneous = scene_to_imu_homogeneous @ coords_in_scene_homogeneous.reshape(-1, 4).T - coords_in_imu = cv2.convertPointsFromHomogeneous(coords_in_imu_homogeneous.T).reshape(-1, 3) + coords_in_imu[0, :] += translation_in_imu[0] + coords_in_imu[1, :] += translation_in_imu[1] + coords_in_imu[2, :] += translation_in_imu[2] - return coords_in_imu + return coords_in_imu.T ``` -Putting together the `transform_scene_to_imu` and `transform_imu_to_world` functions, we can build a general `transform_scene_to_world` function: +Putting together the `transform_scene_to_imu` and `transform_imu_to_world` functions, we can build a composite `transform_scene_to_world` function: ```python -def transform_scene_to_world(coords_in_scene, imu_quaternions, translation=np.zeros((3,))): - coords_in_imu = transform_scene_to_imu(coords_in_scene, translation) +def transform_scene_to_world(coords_in_scene, imu_quaternions, translation_in_imu=np.zeros((3,))): + coords_in_imu = transform_scene_to_imu(coords_in_scene, translation_in_imu) return transform_imu_to_world(coords_in_imu, imu_quaternions) ``` -Now we have the tools to convert 3D gaze data to world coordinates, but first, we need to convert 2D gaze to 3D by undistorting and unprojecting the image coordinates: +We can now apply this function to some data! + +## Eyestate to World Coordinates + +The [3D eyestate estimates](https://docs.pupil-labs.com/neon/data-collection/data-streams/#_3d-eye-states) provided by Neon are aligned with the scene camera coordinate system. This means we can use the `transform_scene_to_world` function above to reconstruct the pose of the eyes in the world coordinate system. We just need to consider that the scene camera is displaced a bit from the IMU. +Since the eyeball center and optical axis values provided by the 3D eyestate estimates are intrinsically linked, we provide the `eyestate_to_world` function to simplify doing the conversions: + +```python +# The 3D eyestate data and the IMU quaternions should be sampled +# at the same timestamps. You can linearly interpolate the IMU data, +# for example. + +def eyestate_to_world(eyeball_centers, optical_axes, imu_quaternions) + """ + The eyeball_centers and optical_axes inputs are for the same eye. + """ + + # The eyeball centers are specified in terms of their distance from + # the center of the scene camera, so to accurately convert them to + # world coordinates, we need to account for the position of the + # scene camera in the IMU coordinate system. Here, we express that + # position in millimeters. + scene_camera_position_in_imu = np.array([0.0, -1.3, -6.62]) + eyeball_centers_in_world = transform_scene_to_world( + eyeball_centers, imu_quaternions, translation=scene_camera_position_in_imu + ) + + # The optical axes are unit vectors originating at the eyeball centers, + # so they should not be to translated. + optical_axes_in_world = transform_scene_to_world( + optical_axes, imu_quaternions + ) + + return eyeball_centers_in_world, optical_axes_in_world +``` + +## 3D Gaze to World Coordinates + +Neon provides 3D gaze data in the scene camera system in terms of [spherical coordinates (i.e., `azimuth/elevation [deg]`)](https://docs.pupil-labs.com/neon/data-collection/data-format/#gaze-csv). The `transform_scene_to_world` function above expects 3D Cartesian coordinates, so to convert spherical 3D gaze to world coordinates, we will need the `spherical_to_cartesian_scene` function: + +```python +def spherical_to_cartesian_scene(elevations, azimuths): + """ + Convert Neon's spherical representation of 3D gaze to Cartesian coordinates. + """ + + elevations_rad = np.deg2rad(elevations) + azimuths_rad = np.deg2rad(azimuths) + + # Elevation of 0 in Neon system corresponds to Y = 0, but + # an elevation of 0 in traditional spherical coordinates would + # correspond to Y = 1, so we convert elevation to the + # more traditional format. + elevations_rad += np.pi / 2 + + # Azimuth of 0 in Neon system corresponds to X = 0, but + # an azimuth of 0 in traditional spherical coordinates would + # correspond to X = 1. Also, azimuth to the right in Neon is + # more positive, whereas it is more negative in traditional + # spherical coordiantes. So, we convert azimuth to the more + # traditional format. + azimuths_rad *= -1.0 + azimuths_rad += np.pi / 2 + + return np.array( + [ + np.sin(elevations_rad) * np.cos(azimuths_rad), + np.cos(elevations_rad), + np.sin(elevations_rad) * np.sin(azimuths_rad), + ] + ).T +``` + +Now we have the tools to convert 3D gaze data to world coordinates: + +```python +cart_gazes_in_scene = spherical_to_cartesian_scene(gaze_elevation_resampled, gaze_azimuth_resampled) +cart_gazes_in_world = transform_scene_to_world(cart_gazes_in_scene, quaternions_resampled) +``` + +## 2D Gaze to World Coordinates + +If you are starting from [the 2D gaze values in scene image coordinates (i.e., `gaze x/y [px]`)](https://docs.pupil-labs.com/neon/data-collection/data-format/#gaze-csv), then you will need to first [undistort](https://docs.pupil-labs.com/alpha-lab/undistort/) and unproject those points to obtain the corresponding 3D gaze vectors. Note that this requires [loading the scene camera calibration data](https://docs-staging.pupil-labs.com/alpha-lab/undistort/#reading-from-the-cloud-download-json-file). ```python def unproject_2d_gaze(gaze_points_2d, scene_camera_matrix, scene_distortion_coefficients): """ Transform the 2D gaze values from Neon to 3D gaze vectors. - - See the associated Alpha Labs article for a tutorial on undistorting: - https://docs.pupil-labs.com/alpha-lab/undistort/ """ gaze_points_2d_undist = cv2.undistortPoints(gaze_points_2d, scene_camera_matrix, scene_distortion_coefficients) @@ -150,22 +222,13 @@ def unproject_2d_gaze(gaze_points_2d, scene_camera_matrix, scene_distortion_coef return gaze_vectors_3d ``` -Putting all of this together, we can convert 2D gaze data in scene image coordinates to 3D gaze data in world coordinates: +Then, we can use the functions from [the previous section](#3d-gaze-to-world-coordinates) to convert 2D gaze to 3D world coordinates: ```python # The gaze data and the IMU quaternions should be sampled at the # same timestamps. You can linearly interpolate the IMU data to # ensure this. -# I'm not sure if we want to show how to load the camera calib data -# -# scene_camera_info = [] -# with open(rec_dir + "scene_camera.json") as f: -# scene_camera_info = json.load(f) -# -# scene_camera_matrix = np.array(scene_camera_info["camera_matrix"]) -# scene_distortion_coefficients = np.array(scene_camera_info["distortion_coefficients"]) - gaze_points_2d = gaze[["gaze x [px]", "gaze y [px]"]].to_numpy() cart_gazes_in_scene = undistort_and_unproject( gaze_points_2d, scene_camera_matrix, scene_distortion_coefficients @@ -175,29 +238,26 @@ cart_gazes_in_world = transform_scene_to_world( ) ``` -## Eyestate to World Coordinates +## Obtain IMU Heading Vectors -The [3D eyestate estimates](https://docs.pupil-labs.com/neon/data-collection/data-streams/#_3d-eye-states) provided by Neon are aligned with the scene camera coordinate system. To reconstruct the pose of the eyes in the world coordinate system, we need to also consider that the scene camera coordinate system is positioned downwards and a bit back from the IMU: +An alternative representation of IMU orientation data is a heading vector that points outwards from the center of the IMU. It can be useful to compare this heading vector with the 3D gaze vectors in world coordinates. ```python -# The 3D eyestate data and the IMU quaternions should be sampled -# at the same timestamps. You can linearly interpolate the IMU data -# to ensure this. - -# The eyeball centers are specified in terms of their distance from -# the center of the scene camera, so to accurately convert them to -# world coordinates, we need to account for the position of the -# scene camera in the IMU coordinate system. Here, we express that -# position in millimeters. -scene_camera_position_in_imu = np.array([0.0, -1.3, -6.62]) -eyeball_centers_in_world = transform_scene_to_world( - eyeball_centers, imu_quaternions, translation=scene_camera_position_in_imu +heading_neutral_in_imu_coords = np.array([0.0, 1.0, 0.0]) +headings_in_world = transform_imu_to_world( + heading_neutral_in_imu_coords, imu_quaternions ) +``` + +Neutral orientation of the IMU would correspond to a heading vector that points at magnetic North and that is oriented perpendicular to the line of gravity. -# The optical axes are unit vectors originating at the eyeball centers, -# so there is no need to translate them. -optical_axes_in_world = transform_scene_to_world( - optical_axes, imu_quaternions +## IMU Acceleration in World + +The IMU’s acceleration data are specified in its local coordinate system. If you want to understand how the observer is accelerating through their environment, then it can be easier to have the acceleration data specified in the world coordinate system: + +```python +accelerations_in_world = transform_imu_to_world( + imu_accelerations, imu_quaternions ) ``` @@ -241,6 +301,12 @@ def cartesian_to_spherical_world(world_points_3d): return elevation, azimuth ``` +## Application Example + +Below, we present a video showing how some of the functions in this article where used to visualize different combinations of head and eye movements in world coordinates. The code for producing the visualization [can be found here](https://gist.github.com/rennis250/8a684ea1e2f92c79fa2104b7a0f30e20). + +- ***Rob Note***: Video currently [here](https://drive.google.com/file/d/1UhZ9GAHacVQ8jLwkI7bLZHykeF7OpOwa/view?usp=sharing) + ::: tip Need assistance with the IMU code in this article? Or do you have something more custom in mind? Reach out to us via email at [info@pupil-labs.com](mailto:info@pupil-labs.com), on our [Discord server](https://pupil-labs.com/chat/), or visit our [Support Page](https://pupil-labs.com/products/support/) for dedicated support options. ::: From 449f70751bcf3c0e618e2b64891f3eedeaf9335d Mon Sep 17 00:00:00 2001 From: Robert Ennis Date: Fri, 23 Aug 2024 13:29:04 +0200 Subject: [PATCH 34/54] shorter section title --- alpha-lab/imu-transformations/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/alpha-lab/imu-transformations/index.md b/alpha-lab/imu-transformations/index.md index 52c8b7651..b9fb66539 100644 --- a/alpha-lab/imu-transformations/index.md +++ b/alpha-lab/imu-transformations/index.md @@ -62,7 +62,7 @@ def transform_imu_to_world(imu_coordinates, imu_quaternions): Now that we have the `transform_imu_to_world` function, let's build on it! -## Scene Camera to World Coordinates +## Scene to World Coordinates Neon simultaneously records data in the scene camera and IMU coordinate systems, making it possible to study the relationship between head and eye movements. From ca01fbb558643cd55b2c395770fd913dfcb1db37 Mon Sep 17 00:00:00 2001 From: Robert Ennis Date: Mon, 2 Sep 2024 13:29:17 +0200 Subject: [PATCH 35/54] - implement remaining changes for IMU alpha labs article - expand explanation of IMU coordinate systems in docs - update images in IMU docs --- alpha-lab/imu-transformations/index.md | 121 ++++++++---------- .../data-streams/imu-pitch-yaw-roll-black.png | Bin 0 -> 183939 bytes .../imu-scene_camera_offset-black.png | Bin 0 -> 145548 bytes neon/data-collection/data-streams/index.md | 28 ++-- 4 files changed, 75 insertions(+), 74 deletions(-) create mode 100644 neon/data-collection/data-streams/imu-pitch-yaw-roll-black.png create mode 100644 neon/data-collection/data-streams/imu-scene_camera_offset-black.png diff --git a/alpha-lab/imu-transformations/index.md b/alpha-lab/imu-transformations/index.md index b9fb66539..a22152cc0 100644 --- a/alpha-lab/imu-transformations/index.md +++ b/alpha-lab/imu-transformations/index.md @@ -27,17 +27,14 @@ import TagLinks from '@components/TagLinks.vue' ::: tip -Want to compare IMU and gaze data in the same coordinate system to better understand how people coordinate -head and eye movements? The transformation functions in this tutorial will show you how! +Want to compare IMU and gaze data in the same coordinate system to better understand how people coordinate head and eye movements? The transformation functions in this tutorial will show you how! ::: -This guide contains various transformation functions that can assist when analysing Neon's IMU data. - -While working through this guide, it can be helpful to try out our IMU visualization utility, [plimu](https://github.com/pupil-labs/plimu). This can assist in understanding the IMU data and the various coordinate systems. For example, some of the code in this article is [adapted from it](https://github.com/pupil-labs/plimu/blob/8b94302982363b203dddea2b15f43c6da60e787e/src/pupil_labs/plimu/visualizer.py#L274-L279). +This guide contains various transformation functions that can assist when working with Neon's IMU data. ## IMU to World Coordinates -One of the key steps when dealing with the IMU is the transformation that takes coordinates in the local IMU coordinate system to their corresponding coordinates in the world coordinate system. The quaternion values provided by the IMU can be used to convert between the two coordinate systems. The `transform_imu_to_world` function, defined below, will be used throughout this article. +One of the key steps when dealing with the IMU is the transformation that takes coordinates in the local IMU coordinate system to their corresponding coordinates in [the world coordinate system](http://docs.pupil-labs.com/neon/data-collection/data-streams/#movement-imu-data). The quaternion values provided by the IMU can be used to convert between the two coordinate systems. The `transform_imu_to_world` function, defined below, will be used throughout this article. Note that the origin of the IMU coordinate system is the same as the origin of the world coordinate system. @@ -60,7 +57,31 @@ def transform_imu_to_world(imu_coordinates, imu_quaternions): ]) ``` -Now that we have the `transform_imu_to_world` function, let's build on it! +Now that we have the `transform_imu_to_world` function, let's use it! + +## Obtain IMU Heading Vectors + +An alternative representation of IMU orientation data is a heading vector that points outwards from the center of the IMU. It can be useful to compare this heading vector with the 3D gaze vectors in world coordinates. + +```python +def imu_heading_in_world(imu_quaternions): + heading_neutral_in_imu_coords = np.array([0.0, 1.0, 0.0]) + return transform_imu_to_world( + heading_neutral_in_imu_coords, imu_quaternions + ) +``` + +Neutral orientation of the IMU would correspond to a heading vector that points at magnetic North and that is oriented perpendicular to the line of gravity. + +## IMU Acceleration in World + +The IMU’s acceleration data are specified in its local coordinate system. If you want to understand how the observer is accelerating through their environment, then it can be easier to have the acceleration data specified in the world coordinate system: + +```python +accelerations_in_world = transform_imu_to_world( + imu_accelerations, imu_quaternions +) +``` ## Scene to World Coordinates @@ -72,10 +93,6 @@ To facilitate the comparison, it can be useful to represent these data streams i We can use data from the IMU to transform gaze in scene camera coordinates to world coordinates. We proceed by building a `transform_scene_to_imu` function that handles the rotation between the two coordinate systems. It also accepts a `translation_in_imu` keyword argument to specify if points should be shifted in the IMU system. This will be relevant when converting 3D eyestate to world coordinates. -- ***Rob note:*** Keep this next bit if we decide to use homogeneous coordinates: - -We implement the rotation and translation as [a single affine transformation](https://en.wikipedia.org/wiki/Affine_transformation): - ```python def transform_scene_to_imu(coords_in_scene, translation_in_imu=np.zeros((3,))): @@ -96,18 +113,6 @@ def transform_scene_to_imu(coords_in_scene, translation_in_imu=np.zeros((3,))): ] ) - # The homogeneous approach, for comparison - # - # scene_to_imu_homogeneous = np.zeros((4, 4)) - # scene_to_imu_homogeneous[:3, :3] = scene_to_imu - # scene_to_imu_homogeneous[:3, 3] = translation_in_imu - # scene_to_imu_homogeneous[3, 3] = 1.0 - - # coords_in_scene_homogeneous = cv2.convertPointsToHomogeneous(coords_in_scene) - # coords_in_imu_homogeneous = scene_to_imu_homogeneous @ coords_in_scene_homogeneous.reshape(-1, 4).T - # coords_in_imu = cv2.convertPointsFromHomogeneous(coords_in_imu_homogeneous.T).reshape(-1, 3) - - # Rob-Blob approach coords_in_imu = scene_to_imu @ coords_in_scene.T coords_in_imu[0, :] += translation_in_imu[0] @@ -125,7 +130,7 @@ def transform_scene_to_world(coords_in_scene, imu_quaternions, translation_in_im return transform_imu_to_world(coords_in_imu, imu_quaternions) ``` -We can now apply this function to some data! +You can now use this function to transform data in scene camera coordinates to world coordinates. Head to the [Application Example](#application-example) to see how! ## Eyestate to World Coordinates @@ -134,26 +139,25 @@ Since the eyeball center and optical axis values provided by the 3D eyestate est ```python # The 3D eyestate data and the IMU quaternions should be sampled -# at the same timestamps. You can linearly interpolate the IMU data, -# for example. +# at the same timestamps. You can linearly interpolate the IMU data. +# See the Application Example: +# http://docs.pupil-labs.com/alpha-lab/imu-transformations/#application-example -def eyestate_to_world(eyeball_centers, optical_axes, imu_quaternions) +def eyestate_to_world(eyeball_centers, optical_axes, imu_quaternions): """ The eyeball_centers and optical_axes inputs are for the same eye. """ - # The eyeball centers are specified in terms of their distance from - # the center of the scene camera, so to accurately convert them to - # world coordinates, we need to account for the position of the - # scene camera in the IMU coordinate system. Here, we express that - # position in millimeters. + # The eyeball centers are specified relative to the center of the scene + # camera, so we need to account for the position of the scene camera in + # the IMU coordinate system. Here, we express that position in millimeters. scene_camera_position_in_imu = np.array([0.0, -1.3, -6.62]) eyeball_centers_in_world = transform_scene_to_world( eyeball_centers, imu_quaternions, translation=scene_camera_position_in_imu ) # The optical axes are unit vectors originating at the eyeball centers, - # so they should not be to translated. + # so they should not be translated. optical_axes_in_world = transform_scene_to_world( optical_axes, imu_quaternions ) @@ -163,7 +167,7 @@ def eyestate_to_world(eyeball_centers, optical_axes, imu_quaternions) ## 3D Gaze to World Coordinates -Neon provides 3D gaze data in the scene camera system in terms of [spherical coordinates (i.e., `azimuth/elevation [deg]`)](https://docs.pupil-labs.com/neon/data-collection/data-format/#gaze-csv). The `transform_scene_to_world` function above expects 3D Cartesian coordinates, so to convert spherical 3D gaze to world coordinates, we will need the `spherical_to_cartesian_scene` function: +Neon provides 3D gaze data in [spherical coordinates (i.e., `azimuth/elevation [deg]`)](https://docs.pupil-labs.com/neon/data-collection/data-format/#gaze-csv). The `transform_scene_to_world` function above expects 3D Cartesian coordinates, so to convert spherical 3D gaze to world coordinates, we will need the `spherical_to_cartesian_scene` function: ```python def spherical_to_cartesian_scene(elevations, azimuths): @@ -201,8 +205,9 @@ def spherical_to_cartesian_scene(elevations, azimuths): Now we have the tools to convert 3D gaze data to world coordinates: ```python -cart_gazes_in_scene = spherical_to_cartesian_scene(gaze_elevation_resampled, gaze_azimuth_resampled) -cart_gazes_in_world = transform_scene_to_world(cart_gazes_in_scene, quaternions_resampled) +def gaze_3d_to_world(gaze_elevation, gaze_azimuth, imu_quaternions): + cart_gazes_in_scene = spherical_to_cartesian_scene(gaze_elevation, gaze_azimuth) + return transform_scene_to_world(cart_gazes_in_scene, imu_quaternions) ``` ## 2D Gaze to World Coordinates @@ -228,37 +233,17 @@ Then, we can use the functions from [the previous section](#3d-gaze-to-world-coo # The gaze data and the IMU quaternions should be sampled at the # same timestamps. You can linearly interpolate the IMU data to # ensure this. +# See the Application Example: +# http://docs.pupil-labs.com/alpha-lab/imu-transformations/#application-example gaze_points_2d = gaze[["gaze x [px]", "gaze y [px]"]].to_numpy() -cart_gazes_in_scene = undistort_and_unproject( - gaze_points_2d, scene_camera_matrix, scene_distortion_coefficients -) -cart_gazes_in_world = transform_scene_to_world( - cart_gazes_in_scene, imu_quaternions -) -``` - -## Obtain IMU Heading Vectors - -An alternative representation of IMU orientation data is a heading vector that points outwards from the center of the IMU. It can be useful to compare this heading vector with the 3D gaze vectors in world coordinates. - -```python -heading_neutral_in_imu_coords = np.array([0.0, 1.0, 0.0]) -headings_in_world = transform_imu_to_world( - heading_neutral_in_imu_coords, imu_quaternions -) -``` - -Neutral orientation of the IMU would correspond to a heading vector that points at magnetic North and that is oriented perpendicular to the line of gravity. - -## IMU Acceleration in World - -The IMU’s acceleration data are specified in its local coordinate system. If you want to understand how the observer is accelerating through their environment, then it can be easier to have the acceleration data specified in the world coordinate system: - -```python -accelerations_in_world = transform_imu_to_world( - imu_accelerations, imu_quaternions -) +def gaze_2d_to_world(gaze_points_2d, scene_camera_matrix, scene_distortion_coefficients, imu_quaternions): + cart_gazes_in_scene = undistort_and_unproject( + gaze_points_2d, scene_camera_matrix, scene_distortion_coefficients + ) + return transform_scene_to_world( + cart_gazes_in_scene, imu_quaternions + ) ``` ## World Spherical Coordinates @@ -305,7 +290,11 @@ def cartesian_to_spherical_world(world_points_3d): Below, we present a video showing how some of the functions in this article where used to visualize different combinations of head and eye movements in world coordinates. The code for producing the visualization [can be found here](https://gist.github.com/rennis250/8a684ea1e2f92c79fa2104b7a0f30e20). -- ***Rob Note***: Video currently [here](https://drive.google.com/file/d/1UhZ9GAHacVQ8jLwkI7bLZHykeF7OpOwa/view?usp=sharing) + + +## Related content + +While working through this guide, it can be helpful to try out our IMU visualization utility, [plimu](https://github.com/pupil-labs/plimu). This can assist in understanding the IMU data and the various coordinate systems. For example, some of the code in this article is [adapted from it](https://github.com/pupil-labs/plimu/blob/8b94302982363b203dddea2b15f43c6da60e787e/src/pupil_labs/plimu/visualizer.py#L274-L279). ::: tip Need assistance with the IMU code in this article? Or do you have something more custom in mind? Reach out to us via email at [info@pupil-labs.com](mailto:info@pupil-labs.com), on our [Discord server](https://pupil-labs.com/chat/), or visit our [Support Page](https://pupil-labs.com/products/support/) for dedicated support options. diff --git a/neon/data-collection/data-streams/imu-pitch-yaw-roll-black.png b/neon/data-collection/data-streams/imu-pitch-yaw-roll-black.png new file mode 100644 index 0000000000000000000000000000000000000000..f35c581a607379eeb7babdc5a871b8b6941fc135 GIT binary patch literal 183939 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