Monado OpenXR Runtime
wmr_config.h
Go to the documentation of this file.
1/* Copyright 2021 Jan Schmidt
2 * SPDX-License-Identifier: BSL-1.0
3 */
4/*!
5 * @file
6 * @brief WMR and MS HoloLens configuration structures
7 * @author Jan Schmidt <jan@centricular.com>
8 * @ingroup drv_wmr
9 */
10
11#pragma once
12
13#include "math/m_vec2.h"
14#include "math/m_vec3.h"
15
16#include "util/u_logging.h"
18
19/* Increase this number if anyone releases a headset with
20 * more cameras */
21#define WMR_MAX_CAMERAS 4
22
23/* Increase this number if anyone releases a controller with
24 * more tracking LEDs */
25#define WMR_MAX_LEDS 40
26
27#ifdef __cplusplus
28extern "C" {
29#endif
30
31enum wmr_distortion_model
32{
33 WMR_DISTORTION_MODEL_UNKNOWN = 0,
34 WMR_DISTORTION_MODEL_POLYNOMIAL_3K,
35 WMR_DISTORTION_MODEL_POLYNOMIAL_6KT,
36};
37
38/* Location is used as camera_id for setting gain */
39enum wmr_camera_location
40{
41 WMR_CAMERA_LOCATION_HT0 = 0,
42 WMR_CAMERA_LOCATION_HT1 = 1,
43 WMR_CAMERA_LOCATION_DO0 = 2,
44 WMR_CAMERA_LOCATION_DO1 = 3,
45 WMR_CAMERA_LOCATION_HT2 = 4,
46 WMR_CAMERA_LOCATION_HT3 = 5,
47};
48
49enum wmr_camera_purpose
50{
51 WMR_CAMERA_PURPOSE_HEAD_TRACKING,
52 WMR_CAMERA_PURPOSE_DISPLAY_OBSERVER,
53};
54
56{
57 enum wmr_distortion_model model;
58
59 /* The config provides 15 float values: */
60 union {
61 struct
62 {
63 float cx, cy; /* Principal point */
64 float fx, fy; /* Focal length */
65 float k[6]; /* Radial distortion coefficients */
66 float dist_x, dist_y; /* Center of distortion */
67 float p2, p1; /* Tangential distortion parameters */
68 float metric_radius; /* Metric radius */
69 } params;
70 float v[15];
71 };
72};
73
75{
76 struct xrt_vec3 translation; //!< Raw translation (to HT0)
77 struct xrt_matrix_3x3 rotation; //!< Raw rotation (to HT0), row major
78 struct xrt_pose pose; //!< Pose from `translation` and `rotation`
79
80 /* Radius of the (undistorted) visible area from the center (pixels) (I think) */
81 double visible_radius;
82
83 /* Width, Height (pixels) of the full display */
84 struct xrt_vec2 display_size;
85 /* Center for the eye viewport visibility (pixels) */
86 struct xrt_vec2 visible_center;
87
88 struct u_poly_3k_eye_values poly_3k; //!< Distortion parameters for each channel
89};
90
92{
93 enum wmr_camera_location location;
94 enum wmr_camera_purpose purpose;
95
96 struct xrt_rect roi;
97
98 struct xrt_vec3 translation; //!< Raw translation (to HT0)
99 struct xrt_matrix_3x3 rotation; //!< Raw rotation (to HT0), row major
100 struct xrt_pose pose; //!< Pose from `translation` and `rotation`
101
102 struct wmr_distortion_6KT distortion6KT;
103};
104
105/* Configuration for a single inertial sensor */
107{
108 struct xrt_vec3 translation; //!< Raw translation (to HT0). Usually non-zero only on accelerometers.
109 struct xrt_matrix_3x3 rotation; //!< Raw rotation (to HT0), row major
110 struct xrt_pose pose; //!< Pose from `translation` and `rotation`
111
112 /* Current bias and mix matrix extracted from
113 * the configuration, which provides coefficients
114 * for temperature adjustments - but they're always 0,
115 * so we just take the constant coefficient */
116 struct xrt_vec3 bias_offsets;
117 struct xrt_matrix_3x3 mix_matrix;
118
119 //! Bias random walk variance. @see slam_tracker::inertial_calibration.
121
122 //! Measurement noise standard deviation. @see slam_tracker::inertial_calibration.
124};
125
126/* Precomputed transforms to convert between OpenXR and WMR coordinate systems */
128{
129 struct xrt_pose P_oxr_acc; //!< Converts accel samples into OpenXR coordinates
130 struct xrt_pose P_oxr_gyr; //!< Converts gyro samples into OpenXR coordinates
131 struct xrt_pose P_ht0_me; //!< ME="middle of the eyes". HT0-to-ME transform but in OpenXR coordinates
132 struct xrt_pose P_imu_me; //!< IMU=accel. IMU-to-ME transform but in OpenXR coordinates
133};
134
135/* Configuration for the set of inertial sensors */
137{
138 struct wmr_inertial_sensor_config accel;
139 struct wmr_inertial_sensor_config gyro;
141
142 struct wmr_sensor_transforms_config transforms;
143};
144
146{
147 struct xrt_vec3 pos;
148 struct xrt_vec3 norm;
149};
150
152{
153 /* Left and Right eye mapping and distortion params */
154 struct wmr_distortion_eye_config eye_params[2];
155
156 struct wmr_inertial_sensors_config sensors;
157
158 int cam_count;
159 struct wmr_camera_config cams[WMR_MAX_CAMERAS];
160
161 struct wmr_camera_config *tcams[WMR_MAX_CAMERAS]; //!< Pointers to tracking cameras in `cameras`
162 int tcam_count; //!< Number of tracking cameras
163 int slam_cam_count; //!< Number of tracking cameras to use for SLAM
164};
165
166bool
167wmr_hmd_config_parse(struct wmr_hmd_config *c, char *json_string, enum u_logging_level log_level);
168
169
171{
172 struct wmr_inertial_sensors_config sensors;
173
174 int led_count;
175 struct wmr_led_config leds[WMR_MAX_LEDS];
176};
177
178bool
179wmr_controller_config_parse(struct wmr_controller_config *c, char *json_string, enum u_logging_level log_level);
180
181void
183 struct wmr_distortion_eye_config *eye_params);
184
185#ifdef __cplusplus
186}
187#endif
u_logging_level
Logging level enum.
Definition: u_logging.h:44
C vec2 math library.
C vec3 math library.
Definition: u_distortion_mesh.h:180
Definition: wmr_config.h:92
struct xrt_vec3 translation
Raw translation (to HT0)
Definition: wmr_config.h:98
struct xrt_pose pose
Pose from translation and rotation
Definition: wmr_config.h:100
struct xrt_matrix_3x3 rotation
Raw rotation (to HT0), row major.
Definition: wmr_config.h:99
Definition: wmr_config.h:171
Definition: wmr_config.h:56
Definition: wmr_config.h:75
struct xrt_pose pose
Pose from translation and rotation
Definition: wmr_config.h:78
struct xrt_vec3 translation
Raw translation (to HT0)
Definition: wmr_config.h:76
struct xrt_matrix_3x3 rotation
Raw rotation (to HT0), row major.
Definition: wmr_config.h:77
struct u_poly_3k_eye_values poly_3k
Distortion parameters for each channel.
Definition: wmr_config.h:88
Definition: wmr_config.h:152
struct wmr_camera_config * tcams[4]
Pointers to tracking cameras in cameras
Definition: wmr_config.h:161
int slam_cam_count
Number of tracking cameras to use for SLAM.
Definition: wmr_config.h:163
int tcam_count
Number of tracking cameras.
Definition: wmr_config.h:162
Definition: wmr_config.h:107
struct xrt_vec3 noise_std
Measurement noise standard deviation.
Definition: wmr_config.h:123
struct xrt_vec3 bias_var
Bias random walk variance.
Definition: wmr_config.h:120
struct xrt_pose pose
Pose from translation and rotation
Definition: wmr_config.h:110
struct xrt_vec3 translation
Raw translation (to HT0).
Definition: wmr_config.h:108
struct xrt_matrix_3x3 rotation
Raw rotation (to HT0), row major.
Definition: wmr_config.h:109
Definition: wmr_config.h:137
Definition: wmr_config.h:146
Definition: wmr_config.h:128
struct xrt_pose P_imu_me
IMU=accel.
Definition: wmr_config.h:132
struct xrt_pose P_ht0_me
ME="middle of the eyes".
Definition: wmr_config.h:131
struct xrt_pose P_oxr_acc
Converts accel samples into OpenXR coordinates.
Definition: wmr_config.h:129
struct xrt_pose P_oxr_gyr
Converts gyro samples into OpenXR coordinates.
Definition: wmr_config.h:130
A tightly packed 3x3 matrix of floats.
Definition: xrt_defines.h:531
A pose composed of a position and orientation.
Definition: xrt_defines.h:464
Image rectangle.
Definition: xrt_defines.h:429
A 2 element vector with single floats.
Definition: xrt_defines.h:253
A 3 element vector with single floats.
Definition: xrt_defines.h:274
Code to generate disortion meshes.
Basic logging functionality.
void wmr_config_precompute_transforms(struct wmr_inertial_sensors_config *sensors, struct wmr_distortion_eye_config *eye_params)
Precompute transforms to convert between OpenXR and WMR coordinate systems.
Definition: wmr_config.c:615