12#include "xrt/xrt_config_build.h"
32#include <shared_mutex>
45#define CT_TRACE(ct, ...) U_LOG_IFL_T(ct->log_level, __VA_ARGS__)
46#define CT_DEBUG(ct, ...) U_LOG_IFL_D(ct->log_level, __VA_ARGS__)
47#define CT_INFO(ct, ...) U_LOG_IFL_I(ct->log_level, __VA_ARGS__)
48#define CT_WARN(ct, ...) U_LOG_IFL_W(ct->log_level, __VA_ARGS__)
49#define CT_ERROR(ct, ...) U_LOG_IFL_E(ct->log_level, __VA_ARGS__)
51#define MIN_ROT_ERROR DEG_TO_RAD(30)
52#define MIN_POS_ERROR 0.10
64constellation_tracker_camera_destroy(
t_blob_sink *tbs);
67constellation_tracker_camera_slow_thread(
void *ptr);
70constellation_tracker_camera_fast_thread(
void *ptr);
79namespace xrt::tracking::constellation {
81namespace os = xrt::auxiliary::os;
86struct ConstellationTracker;
93 t_constellation_device_id_t
device_id{XRT_CONSTELLATION_INVALID_DEVICE_ID};
110 int64_t timestamp_ns{};
111 t_blob blobs[XRT_CONSTELLATION_MAX_BLOBS_PER_FRAME]{};
112 uint32_t blob_count{};
117 std::array<DeviceState, XRT_CONSTELLATION_MAX_DEVICES> device_states{};
118 uint32_t device_count{};
120 uint32_t mosaic_index;
121 uint32_t camera_index;
124 std::optional<DeviceState *>
125 GetDeviceState(t_constellation_device_id_t device_id);
129 CameraSample() =
default;
132 MarkMatchingBlobs(ConstellationTracker *ct,
134 t_constellation_device_id_t device_id,
138 ToBlobObservation() const &
141 .source = this->source,
143 .timestamp_ns = this->timestamp_ns,
144 .blobs =
const_cast<t_blob *
>(this->blobs),
145 .num_blobs = this->blob_count,
152 ToBlobObservation() && =
delete;
154 ToBlobObservation() const && = delete;
161 bool draw_blobs{
true};
163 bool draw_blob_ids{
false};
165 bool draw_blob_device_ids{
true};
167 bool draw_blob_led_ids{
false};
170 bool draw_prior{
false};
172 bool draw_found{
false};
176 SetupDebugTracking(
void *root);
183 .
push_blobs = constellation_tracker_camera_push_blobs,
184 .destroy = constellation_tracker_camera_destroy,
189 std::weak_ptr<CameraMosaic> mosaic;
204 std::optional<CameraSample> sample{std::nullopt};
209 } slow_processing_thread_data;
218 std::optional<CameraSample> sample{std::nullopt};
223 } fast_processing_thread_data;
231 bool has_concrete_pose;
241 Camera(ConstellationTracker *tracker,
242 std::weak_ptr<CameraMosaic> mosaic,
250 Camera(
const Camera &) =
delete;
251 Camera(Camera &&) =
delete;
253 operator=(
const Camera &) =
delete;
255 operator=(Camera &&) =
delete;
257 std::optional<xrt_pose>
261 DeferSampleToSlowThread(CameraSample &sample);
265 TryDevicePose(std::unique_ptr<Device> &device,
266 CameraSample &sample,
268 std::optional<xrt_pose> &Tcv_world_device_prior,
269 xrt_pose &Tcv_world_device_candidate,
273 TryDeviceBlobRecovery(std::unique_ptr<Device> &device,
274 CameraSample &sample,
276 std::optional<xrt_pose> &Tcv_world_device_prior,
280 SlowSampleProcess(CameraSample &sample);
284 FastSampleProcess(CameraSample &sample);
287 PushPose(CameraSample &sample,
288 std::unique_ptr<Device> &device,
295 DebugScribbleSample(CameraSample &sample,
bool fast);
301 std::vector<std::unique_ptr<Camera>> cameras;
314 std::optional<xrt_pose>
324 t_constellation_device_id_t id;
332 xrt_vec3 prior_pos_error{MIN_POS_ERROR, MIN_POS_ERROR, MIN_POS_ERROR};
333 xrt_vec3 prior_rot_error{MIN_ROT_ERROR, MIN_ROT_ERROR, MIN_ROT_ERROR};
334 float gravity_error_rad{MIN_ROT_ERROR};
336 mutable os::Mutex data_lock;
339 std::optional<xrt_pose> Txr_world_device_last_known;
346 t_constellation_device_id_t
id);
357 .
break_apart = constellation_tracker_node_break_apart,
358 .destroy = constellation_tracker_node_destroy,
361 .
name =
"Constellation Tracker",
363 .initial_offset = XRT_POSE_IDENTITY,
377 bool single_threaded{
false};
379 std::vector<std::shared_ptr<CameraMosaic>> mosaics;
381 std::shared_mutex device_lock;
382 std::vector<std::unique_ptr<Device>> devices;
383 t_constellation_device_id_t next_device_id{0};
385 std::unique_ptr<DataRecorder> data_recorder{};
387#ifdef XRT_FEATURE_RERUN
388 std::unique_ptr<struct RerunContext> rerun_stream{};
392 static ConstellationTracker *
395 return static_cast<ConstellationTracker *
>(
container_of(node, ConstellationTrackerBase, node));
400 ~ConstellationTracker();
403 ConstellationTracker(
const ConstellationTracker &) =
delete;
404 ConstellationTracker(ConstellationTracker &&) =
delete;
405 ConstellationTracker &
406 operator=(
const ConstellationTracker &) =
delete;
407 ConstellationTracker &
408 operator=(ConstellationTracker &&) =
delete;
411 SetupVariableTracking();
413 t_constellation_device_id_t
417 RemoveDevice(t_constellation_device_id_t device_id);
Ab-initio blob<->LED correspondence search.
u_logging_level
Logging level enum.
Definition u_logging.h:45
@ U_LOGGING_WARN
Warning messages: indicating a potential problem.
Definition u_logging.h:49
int64_t timepoint_ns
Integer timestamp type.
Definition u_time.h:77
#define container_of(ptr, type, field)
Get the holder from a pointer to a field.
Definition xrt_compiler.h:226
@ XRT_TRACKING_TYPE_CONSTELLATION
The device(s) are tracked through a constellation of lights as seen by cameras.
Definition xrt_tracking.h:63
LED search model management code.
C interface to math library.
Metrics for constellation tracking poses.
RANSAC PnP pose refinement.
Definition t_rift_blobwatch.c:82
Definition camera_model.h:19
Definition correspondence_search.h:92
All in one helper that handles locking, waiting for change and starting a thread.
Definition os_threading.h:499
Definition pose_metrics.h:85
Definition pose_metrics.h:61
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:101
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:109
A blob is a 2d position in a camera sensor's view that is being tracked.
Definition t_constellation.h:37
Definition t_constellation.h:152
Essential calibration data for a single camera, or single lens/sensor of a stereo camera.
Definition t_tracking.h:236
Definition led_search_model.h:40
A constellation tracker camera mosaic is a set of cameras that may or may not be physically attached,...
Definition t_constellation_tracker.h:60
A constellation tracker camera is a single camera that the constellation tracker will use to track de...
Definition t_constellation_tracker.h:34
Parameters for adding a device to the constellation tracker.
Definition t_constellation_tracker.h:79
A constellation tracker device is a device that the constellation tracker will attempt to track in 6d...
Definition t_constellation.h:327
The LED model is a series of points which define the real-world positions of all LEDs.
Definition t_constellation.h:266
Definition t_constellation_tracker.h:104
A constellation tracker tracking source is an arbitrary source of tracking data for the constellation...
Definition t_constellation.h:221
Allows more safely to debug sink inputs and outputs.
Definition u_sink.h:214
Definition t_constellation_tracker_internal.hpp:180
os::Mutex processing_lock
Locks all processing data.
Definition t_constellation_tracker_internal.hpp:226
ConstellationTracker * tracker
The owner tracker, so we can retrieve it from the blob sink callback.
Definition t_constellation_tracker_internal.hpp:188
size_t index
The index in the mosaic.
Definition t_constellation_tracker_internal.hpp:198
Definition t_constellation_tracker_internal.hpp:299
size_t index
The index of this mosaic in the tracker.
Definition t_constellation_tracker_internal.hpp:303
Definition t_constellation_tracker_internal.hpp:106
std::optional< xrt_pose > Txr_world_cam
The camera's position in the constellation tracker's tracking origin.
Definition t_constellation_tracker_internal.hpp:115
Definition t_constellation_tracker_internal.hpp:158
Definition t_constellation_tracker_internal.hpp:354
Definition t_constellation_tracker_internal.hpp:368
Definition t_constellation_tracker_internal.hpp:319
Definition t_constellation_tracker_internal.hpp:91
t_constellation_device_id_t device_id
The ID of the device.
Definition t_constellation_tracker_internal.hpp:93
std::optional< xrt_pose > Txr_world_device_prior
The "predicted" pose, which is the pose the device expects itself to be at at the time of the blobser...
Definition t_constellation_tracker_internal.hpp:96
std::optional< xrt_pose > Tcv_cam_device_found
The final found pose of the device in this specific sample.
Definition t_constellation_tracker_internal.hpp:99
bool needs_slow_processing
Whether the device needs to have the slow processing thread run over it.
Definition t_constellation_tracker_internal.hpp:102
A interface object used for destroying a frame graph.
Definition xrt_frame.h:87
void(* break_apart)(struct xrt_frame_node *node)
Called first in when the graph is being destroyed, remove any references frames and other objects and...
Definition xrt_frame.h:94
A pose composed of a position and orientation.
Definition xrt_defines.h:492
A tracking system or device origin.
Definition xrt_tracking.h:78
char name[256]
For debugging.
Definition xrt_tracking.h:80
A 3 element vector with single floats.
Definition xrt_defines.h:289
Header defining the tracking system integration in Monado.
Header defining the constellation tracker parameters and functions.
xrt_frame helpers for scribbling onto frames.
Basic logging functionality.
xrt_frame_sink converters and other helpers.
Slightly higher level thread safe helpers.
C++ helpers for weak pointers.
Header defining the tracking system integration in Monado.