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