···10031003#endif
10041004 }
1005100510061006+ if (wh->tracking.imu2me) {
10071007+ math_pose_transform(&wh->pose, &wh->P_imu_me, &wh->pose);
10081008+ }
10091009+10061010 out_relation->pose = wh->pose;
10071011 out_relation->relation_flags = (enum xrt_space_relation_flags)(
10081012 XRT_SPACE_RELATION_ORIENTATION_VALID_BIT | XRT_SPACE_RELATION_POSITION_VALID_BIT |
···1463146714641468 u_var_add_gui_header(wh, NULL, "SLAM Tracking");
14651469 u_var_add_ro_text(wh, wh->gui.slam_status, "Tracker status");
14701470+ u_var_add_bool(wh, &wh->tracking.imu2me, "Correct IMU pose to middle of eyes");
1466147114671472 u_var_add_gui_header(wh, NULL, "Hand Tracking");
14681473 u_var_add_ro_text(wh, wh->gui.hand_status, "Tracker status");
···1524152915251530 wh->tracking.slam_enabled = slam_enabled;
15261531 wh->tracking.hand_enabled = hand_enabled;
15321532+ wh->tracking.imu2me = true;
1527153315281534 wh->slam_over_3dof = slam_enabled; // We prefer SLAM over 3dof tracking if possible
15291535···16321638 struct xrt_pose P_me_gyr = {0};
16331639 struct xrt_pose P_ht0_me = {0};
16341640 struct xrt_pose P_acc_me = {0};
16411641+ struct xrt_pose P_oxr_acc_me = {0}; // P_acc_me in OpenXR coordinates
1635164216361643 // All of the observed headsets have reported a zero translation for its gyro
16371644 assert(m_vec3_equal_exact(P_gyr_ht0.position, (struct xrt_vec3){0, 0, 0}));
···16481655 math_pose_invert(&P_me_ht0, &P_ht0_me);
16491656 math_pose_invert(&P_me_acc, &P_acc_me);
1650165716581658+ // Express P_*_me pose in OpenXR coordinates through sandwich products.
16591659+ math_pose_transform(&P_acc_me, &P_wmr_oxr, &P_oxr_acc_me);
16601660+ math_pose_transform(&P_oxr_wmr, &P_oxr_acc_me, &P_oxr_acc_me);
16611661+16511662 // Save transforms
16521663 math_pose_transform(&P_oxr_wmr, &P_me_acc, &wh->P_oxr_acc);
16531664 math_pose_transform(&P_oxr_wmr, &P_me_gyr, &wh->P_oxr_gyr);
16651665+ wh->P_imu_me = P_oxr_acc_me; // Assume accel pose is IMU pose
16541666}
1655166716561668void
+4
src/xrt/drivers/wmr/wmr_hmd.h
···119119 //! Precomputed transforms, @see precompute_sensor_transforms.
120120 struct xrt_pose P_oxr_acc; //!< Converts accel samples into OpenXR coordinates
121121 struct xrt_pose P_oxr_gyr; //!< Converts gyro samples into OpenXR coordinates
122122+ struct xrt_pose P_imu_me; //!< IMU=accel. IMU-to-ME transform but in OpenXR coordinates
122123123124 struct hololens_sensors_packet packet;
124125···157158158159 //! Set at start. Whether the hand tracker was initialized.
159160 bool hand_enabled;
161161+162162+ //! SLAM systems track the IMU pose, enabling this corrects it to middle of the eyes
163163+ bool imu2me;
160164 } tracking;
161165162166 //! Whether to track the HMD with 6dof SLAM or fallback to the `fusion` 3dof tracker