Monado OpenXR Runtime
Loading...
Searching...
No Matches
t_constellation.h
Go to the documentation of this file.
1// Copyright 2026, Beyley Cardellio
2// SPDX-License-Identifier: BSL-1.0
3/*!
4 * @file
5 * @brief Header defining the tracking system integration in Monado.
6 * @author Beyley Cardellio <ep1cm1n10n123@gmail.com>
7 * @ingroup xrt_iface
8 */
9
10#pragma once
11
12#include "xrt/xrt_defines.h"
13
14
15#ifdef __cplusplus
16extern "C" {
17#endif
18
19typedef int8_t t_constellation_device_id_t;
20typedef int8_t t_constellation_led_id_it;
21
22#define XRT_CONSTELLATION_MAX_BLOBS_PER_FRAME 250
23#define XRT_CONSTELLATION_MAX_DEVICES 4
24
25#define XRT_CONSTELLATION_INVALID_DEVICE_ID -1
26#define XRT_CONSTELLATION_INVALID_LED_ID -1
27
28/*!
29 * A blob is a 2d position in a camera sensor's view that is being tracked. Generally used to
30 * represent found LEDs in a camera's sensor.
31 *
32 * Blobs are given in pixel coordinates, with the origin at the top left of the image, and x
33 * going right and y going down. The units are in pixels, but may be subpixel accurate. The tracking
34 * system is expected to handle the undistortion of the blob positions.
35 */
36struct t_blob
37{
38 /*!
39 * The ID of a blob, which may be used to track it across frames. The meaning of the ID is
40 * up to the tracking system, but it attempts to be consistent across frames for the same
41 * blob.
42 */
43 uint32_t blob_id;
44
45 /*!
46 * The device ID this blob is associated with, if any. XRT_CONSTELLATION_INVALID_DEVICE_ID
47 * for unmatched. The tracker is expected to fill this in.
48 */
49 t_constellation_device_id_t matched_device_id;
50
51 /*!
52 * The LED ID this blob is associated with, if any. XRT_CONSTELLATION_INVALID_LED_ID for
53 * unmatched. The tracker is expected to fill this in.
54 */
55 t_constellation_led_id_it matched_device_led_id;
56
57 //! Centre of blob
59
60 /*!
61 * Estimated motion vector of blob, in pixels per second. Only valid if the tracking system
62 * provides it.
63 */
65
66 //! The bounding box of the blob in pixel coordinates.
68
69 //! The size of the blob, in pixels. May be {0,0}, and may be subpixel accurate.
70 struct xrt_vec2 size;
71};
72
74{
75 struct t_blobwatch *source;
76
77 /*!
78 * Internal ID for this observation, may be set by the blobwatch implementation if it needs
79 * to know this.
80 */
81 uint64_t id;
82
83 int64_t timestamp_ns;
84 struct t_blob *blobs;
85 uint32_t num_blobs;
86};
87
88/*!
89 * @interface t_blob_sink
90 *
91 * A generic interface to allow a tracking system to receive "snapshots" of seen @ref t_blob in a
92 * frame.
93 */
95{
96 /*!
97 * Push a set of blobs into the sink. The tracking system will typically call this once per
98 * frame for each camera view.
99 *
100 * @param[in] tbs The sink to push the blobs into.
101 * @param[in] observation The blob observation to push into the sink.
102 */
103 void (*push_blobs)(struct t_blob_sink *tbs, struct t_blob_observation *observation);
104
105 /*!
106 * Destroy this blob sink.
107 */
108 void (*destroy)(struct t_blob_sink *tbs);
109};
110
111/*!
112 * Helper function for @ref t_blob_sink::push_blobs.
113 *
114 * @copydoc t_blob_sink::push_blobs
115 *
116 * @public @memberof t_blob_sink
117 */
118XRT_NONNULL_ALL static inline void
120{
121 tbs->push_blobs(tbs, tbo);
122}
123
124/*!
125 * Helper function for @ref t_blob_sink::destroy.
126 *
127 * Handles nulls, sets your pointer to null.
128 *
129 * @public @memberof t_blob_sink
130 */
131XRT_NONNULL_ALL static inline void
133{
134 struct t_blob_sink *tbs = *tbs_ptr;
135
136 if (tbs == NULL) {
137 return;
138 }
139
140 tbs->destroy(tbs);
141 *tbs_ptr = NULL;
142}
143
144
146{
147 /*!
148 * Notify the blobwatch that the blobs in the given observation with the correct ID set are
149 * associated with the given device. The blobwatch can use this information to track which
150 * blobs are associated with which devices across frames, and to provide this information to
151 * the tracker across frames to save it from doing that work again.
152 *
153 * @param[in] tbw The blobwatch to mark the blobs for.
154 * @param[in] tbo The observation containing the blobs to mark. The blobwatch will look at
155 * the blob IDs and the matched_device_id field to determine which blobs
156 * internally to mark with the given device ID.
157 * @param[in] device_id The device ID to mark
158 */
159 void (*mark_blob_device)(struct t_blobwatch *tbw,
160 const struct t_blob_observation *tbo,
161 t_constellation_device_id_t device_id);
162
163 /*!
164 * Destroy this blobwatch.
165 */
166 void (*destroy)(struct t_blobwatch *tbw);
167};
168
169/*!
170 * Helper function for @ref t_blobwatch::mark_blob_device.
171 *
172 * @copydoc t_blobwatch::mark_blob_device
173 *
174 * @public @memberof t_blobwatch
175 */
176XRT_NONNULL_ALL static inline void
178 const struct t_blob_observation *tbo,
179 t_constellation_device_id_t device_id)
180{
181 tbw->mark_blob_device(tbw, tbo, device_id);
182}
183
184/*!
185 * Helper function for @ref t_blobwatch::destroy.
186 *
187 * Handles nulls, sets your pointer to null.
188 *
189 * @public @memberof t_blobwatch
190 */
191XRT_NONNULL_ALL static inline void
193{
194 struct t_blobwatch *tbw = *tbw_ptr;
195
196 if (tbw == NULL) {
197 return;
198 }
199
200 tbw->destroy(tbw);
201 *tbw_ptr = NULL;
202}
203
204
205/*!
206 * @interface t_constellation_tracker_tracking_source
207 *
208 * A constellation tracker tracking source is an arbitrary source of tracking data for the
209 * constellation tracker. This is used by the constellation tracker to get the current pose of a
210 * device to eliminate bad guesses, or if a camera is anchored to a tracking source (a camera on a
211 * headset device), this can be used by the constellation tracker to locate that camera relative to
212 * the world.
213 */
215{
216 void (*get_tracked_pose)(struct t_constellation_tracker_tracking_source *,
217 int64_t when_ns,
218 struct xrt_space_relation *out_relation);
219};
220
221/*!
222 * Helper function for @ref t_constellation_tracker_tracking_source::get_tracked_pose.
223 *
224 * @copydoc t_constellation_tracker_tracking_source::get_tracked_pose
225 *
226 * @public @memberof t_constellation_tracker_tracking_source
227 */
228XRT_NONNULL_ALL static inline void
230 struct t_constellation_tracker_tracking_source *tracking_source,
231 int64_t when_ns,
232 struct xrt_space_relation *out_relation)
233{
234 tracking_source->get_tracked_pose(tracking_source, when_ns, out_relation);
235}
236
237
239{
240 //! The position of the LED in the model.
242 //! The normal of the LED, determines where it is facing
244 //! The visible radius of the LED in meters.
245 float radius_m;
246 //! The angle from dead on where the LED is no longer visible, in radians.
248 //! A unique ID for this LED, which distinguishes it from all other LEDs.
249 t_constellation_led_id_it id;
250};
251
252/*!
253 * @interface t_constellation_tracker_led_model
254 *
255 * The LED model is a series of points which define the real-world positions of all LEDs. Some LED
256 * models may have self-occluding areas, such as WMR, where inner LEDs can be blocked by the ring,
257 * such occlusions are modelled through the LED visibility computation function.
258 */
260{
261 //! The LEDs in this model.
263 //! The number of LEDs in this model.
264 size_t led_count;
265
266 /*!
267 * A function to compute whether a given LED is visible from a given position. This is used
268 * to allow devices to better model complex occlusion scenarios, like the inward facing LEDs
269 * on the WMR rings.
270 *
271 * @param led_model The LED model containing the LED in question.
272 * @param led The index of the LED in question in the model.
273 * @param T_obj_cam The transform from the root of the LED model to the camera. Assume
274 * camera is facing the origin of the LED model.
275 *
276 * @return Whether the LED is visible from the given position.
277 */
279 size_t led,
280 struct xrt_vec3 T_obj_cam);
281};
282
283/*!
284 * Helper function for @ref t_constellation_tracker_led_model::compute_led_visibility.
285 *
286 * @copydoc t_constellation_tracker_led_model::compute_led_visibility
287 *
288 * @public @memberof t_constellation_tracker_led_model
289 */
290XRT_NONNULL_ALL static inline bool
292 size_t led,
293 struct xrt_vec3 T_obj_cam)
294{
295 return led_model->compute_led_visibility(led_model, led, T_obj_cam);
296}
297
298
300{
301 //! The time the original blobservation was made.
303 //! The pose of the device at the time of the blobservation.
305};
306
307/*!
308 * @interface t_constellation_tracker_device
309 *
310 * A constellation tracker device is a device that the constellation tracker will attempt to track
311 * in 6dof. The constellation tracker will provide the device with samples of it's current pose as
312 * it tracks it.
313 */
315{
316 /*!
317 * A function that the constellation tracker will call to push a new sample of the device's
318 * pose as it tracks it.
319 *
320 * @param connection The device to push the sample to.
321 * @param sample The sample containing the current pose of the device and the timestamp of
322 * the original blobservation that led to this pose being computed.
323 */
325 struct t_constellation_tracker_sample *sample);
326};
327
328/*!
329 * Helper function for @ref t_constellation_tracker_device::push_constellation_tracker_sample.
330 *
331 * @copydoc t_constellation_tracker_device::push_constellation_tracker_sample
332 *
333 * @public @memberof t_constellation_tracker_device
334 */
335XRT_NONNULL_ALL static inline void
341
342#ifdef __cplusplus
343}
344#endif
Definition t_constellation.h:74
uint64_t id
Internal ID for this observation, may be set by the blobwatch implementation if it needs to know this...
Definition t_constellation.h:81
A generic interface to allow a tracking system to receive "snapshots" of seen t_blob in a frame.
Definition t_constellation.h:95
void(* push_blobs)(struct t_blob_sink *tbs, struct t_blob_observation *observation)
Push a set of blobs into the sink.
Definition t_constellation.h:103
void(* destroy)(struct t_blob_sink *tbs)
Destroy this blob sink.
Definition t_constellation.h:108
static XRT_NONNULL_ALL void t_blob_sink_push_blobs(struct t_blob_sink *tbs, struct t_blob_observation *tbo)
Helper function for t_blob_sink::push_blobs.
Definition t_constellation.h:119
static XRT_NONNULL_ALL void t_blob_sink_destroy(struct t_blob_sink **tbs_ptr)
Helper function for t_blob_sink::destroy.
Definition t_constellation.h:132
A blob is a 2d position in a camera sensor's view that is being tracked.
Definition t_constellation.h:37
t_constellation_led_id_it matched_device_led_id
The LED ID this blob is associated with, if any.
Definition t_constellation.h:55
t_constellation_device_id_t matched_device_id
The device ID this blob is associated with, if any.
Definition t_constellation.h:49
struct xrt_vec2 motion_vector
Estimated motion vector of blob, in pixels per second.
Definition t_constellation.h:64
uint32_t blob_id
The ID of a blob, which may be used to track it across frames.
Definition t_constellation.h:43
struct xrt_vec2 center
Centre of blob.
Definition t_constellation.h:58
struct xrt_rect bounding_box
The bounding box of the blob in pixel coordinates.
Definition t_constellation.h:67
Definition t_constellation.h:146
static XRT_NONNULL_ALL void t_blobwatch_mark_blob_device(struct t_blobwatch *tbw, const struct t_blob_observation *tbo, t_constellation_device_id_t device_id)
Helper function for t_blobwatch::mark_blob_device.
Definition t_constellation.h:177
static XRT_NONNULL_ALL void t_blobwatch_destroy(struct t_blobwatch **tbw_ptr)
Helper function for t_blobwatch::destroy.
Definition t_constellation.h:192
void(* destroy)(struct t_blobwatch *tbw)
Destroy this blobwatch.
Definition t_constellation.h:166
void(* mark_blob_device)(struct t_blobwatch *tbw, const struct t_blob_observation *tbo, t_constellation_device_id_t device_id)
Notify the blobwatch that the blobs in the given observation with the correct ID set are associated w...
Definition t_constellation.h:159
A constellation tracker device is a device that the constellation tracker will attempt to track in 6d...
Definition t_constellation.h:315
static XRT_NONNULL_ALL void t_constellation_tracker_device_push_sample(struct t_constellation_tracker_device *device, struct t_constellation_tracker_sample *sample)
Helper function for t_constellation_tracker_device::push_constellation_tracker_sample.
Definition t_constellation.h:336
void(* push_constellation_tracker_sample)(struct t_constellation_tracker_device *connection, struct t_constellation_tracker_sample *sample)
A function that the constellation tracker will call to push a new sample of the device's pose as it t...
Definition t_constellation.h:324
The LED model is a series of points which define the real-world positions of all LEDs.
Definition t_constellation.h:260
bool(* compute_led_visibility)(struct t_constellation_tracker_led_model *led_model, size_t led, struct xrt_vec3 T_obj_cam)
A function to compute whether a given LED is visible from a given position.
Definition t_constellation.h:278
static XRT_NONNULL_ALL bool t_constellation_tracker_led_model_compute_led_visibility(struct t_constellation_tracker_led_model *led_model, size_t led, struct xrt_vec3 T_obj_cam)
Helper function for t_constellation_tracker_led_model::compute_led_visibility.
Definition t_constellation.h:291
size_t led_count
The number of LEDs in this model.
Definition t_constellation.h:264
struct t_constellation_tracker_led * leds
The LEDs in this model.
Definition t_constellation.h:262
Definition t_constellation.h:239
float radius_m
The visible radius of the LED in meters.
Definition t_constellation.h:245
float visibility_angle
The angle from dead on where the LED is no longer visible, in radians.
Definition t_constellation.h:247
struct xrt_vec3 position
The position of the LED in the model.
Definition t_constellation.h:241
t_constellation_led_id_it id
A unique ID for this LED, which distinguishes it from all other LEDs.
Definition t_constellation.h:249
struct xrt_vec3 normal
The normal of the LED, determines where it is facing.
Definition t_constellation.h:243
Definition t_constellation.h:300
int64_t timestamp_ns
The time the original blobservation was made.
Definition t_constellation.h:302
struct xrt_pose pose
The pose of the device at the time of the blobservation.
Definition t_constellation.h:304
A constellation tracker tracking source is an arbitrary source of tracking data for the constellation...
Definition t_constellation.h:215
static XRT_NONNULL_ALL void t_constellation_tracker_tracking_source_get_tracked_pose(struct t_constellation_tracker_tracking_source *tracking_source, int64_t when_ns, struct xrt_space_relation *out_relation)
Helper function for t_constellation_tracker_tracking_source::get_tracked_pose.
Definition t_constellation.h:229
A pose composed of a position and orientation.
Definition xrt_defines.h:492
Image rectangle.
Definition xrt_defines.h:457
A relation with two spaces, includes velocity and acceleration.
Definition xrt_defines.h:683
A 2 element vector with single floats.
Definition xrt_defines.h:268
A 3 element vector with single floats.
Definition xrt_defines.h:289
Common defines and enums for XRT.