Skip to main content

solution.h File

Platform position/attitude solution messages. More...

Included Headers

Namespaces Index

namespacepoint_one

GNSS signal and frequency type definitions. More...

namespacefusion_engine
namespacemessages

Classes Index

structCalibrationStatusMessage

Device calibration status update. More...

structGNSSInfoMessage

Information about the GNSS data used in the PoseMessage with the corresponding timestamp (MessageType::GNSS_INFO, version 1.1). More...

structGNSSSatelliteInfo

Information about an individual satellite (see GNSSSignalsMessage). More...

structGNSSSatelliteMessage

Information about the individual satellites used in the PoseMessage and GNSSInfoMessage with the corresponding timestamp (MessageType::GNSS_SATELLITE, version 1.0). More...

structGNSSSignalInfo

Information about an individual GNSS signal (see GNSSSignalsMessage). More...

structGNSSSignalsMessage

Information about the individual GNSS satellites and signals used in the PoseMessage and GNSSInfoMessage with the corresponding timestamp (MessageType::GNSS_SIGNALS, version 1.1). More...

structPoseAuxMessage

Auxiliary platform pose information (MessageType::POSE_AUX, version 1.0). More...

structPoseMessage

Platform pose solution: position, velocity, attitude (MessageType::POSE, version 1.2). More...

structRelativeENUPositionMessage

Relative ENU position to base station (MessageType::RELATIVE_ENU_POSITION, version 1.1). More...

structSatelliteInfo

Information about an individual satellite (see GNSSSatelliteMessage). More...

Description

Platform position/attitude solution messages.

File Listing

The file content with the documentation metadata removed is:

1/**************************************************************************/ /**
2 * @brief Platform position/attitude solution messages.
3 * @file
4 ******************************************************************************/
5
6#pragma once
7
10
11namespace point_one {
12namespace fusion_engine {
13namespace messages {
14
15// Enforce 4-byte alignment and packing of all data structures and values.
16// Floating point values are aligned on platforms that require it. This is done
17// with a combination of setting struct attributes, and manual alignment
18// within the definitions. See the "Message Packing" section of the README.
19#pragma pack(push, 1)
20
21/**
22 * @defgroup solution_messages Navigation Solution Message Definitions
23 * @brief Output messages containing position, navigation, and time results.
24 * @ingroup messages
25 *
26 * See also @ref messages.
27 */
28
29/**
30 * @brief Platform pose solution: position, velocity, attitude (@ref
31 * MessageType::POSE, version 1.2).
32 * @ingroup solution_messages
33 *
34 * @note
35 * All data is timestamped using Point One (P1) time, which is a monotonic
36 * timestamp referenced to the start of the device. Corresponding messages (@ref
37 * GNSSInfoMessage, @ref GNSSSatelliteMessage, etc.) may be associated using
38 * their @ref p1_time values.
39 */
41 static constexpr MessageType MESSAGE_TYPE = MessageType::POSE;
42 static constexpr uint8_t MESSAGE_VERSION = 2;
43 static constexpr int16_t INVALID_UNDULATION = INT16_MIN;
44
45 /** Set if the device is stationary. */
46 static constexpr uint8_t FLAG_STATIONARY = 0x01;
47
48 /** The time of the message, in P1 time (beginning at power-on). */
50
51 /** The GPS time of the message, if available, referenced to 1980/1/6. */
53
54 /** The type of this position solution. */
55 SolutionType solution_type = SolutionType::Invalid;
56
57 /**
58 * A bitmask of flags associated with the pose data.
59 *
60 * Added in @ref PoseMessage version 1.2.
61 */
62 uint8_t flags = 0x0;
63
64 /**
65 * The geoid undulation at the current location (in cm).
66 *
67 * Geoid undulation is also frequently referred to as "geoid height". It is
68 * the height of the MSL geoid above the WGS-84 ellipsoid. Note that it is
69 * independent of the location of the receiver.
70 *
71 * Receiver ellipsoid altitude reported in @ref lla_deg (also frequently
72 * called "height above the ellipsoid") can be converted to a corresponding
73 * mean sea level (MSL) altitude ("height above the geoid" or "orthometric
74 * height") as follows:
75 *
76 * @f[
77 * h_{orthometric} = h_{ellipsoid} - undulation
78 * @f]
79 *
80 * Stored in units of 0.01 meters: `undulation_m = undulation_cm * 0.01`. Set
81 * to `-32768` if invalid.
82 *
83 * Added in @ref PoseMessage version 1.1.
84 */
85 int16_t undulation_cm = INVALID_UNDULATION;
86
87 /**
88 * The geodetic latitude, longitude, and altitude (in degrees/degrees/meters),
89 * expressed using the WGS-84 reference ellipsoid.
90 *
91 * @section p1_fe_pose_datum Datum/Epoch Considerations
92 * When comparing two positions, it is very important to make sure they are
93 * compared using the same geodetic datum, defined at the same time (epoch).
94 * Failing to do so can cause very large unexpected differences since the
95 * ground moves in various directions over time due to motion of tectonic
96 * plates.
97 *
98 * For example, the coordinates for a point on the ground in San Francisco
99 * expressed in the ITRF14 datum may differ by multiple meters from the
100 * coordinates for the same point expressed the NAD83 datum. Similarly, the
101 * coordinates for that location expressed in the ITRF14 2017 epoch
102 * (January 1, 2017) may differ by 12 cm or more when expressed using the
103 * ITRF14 2021 epoch (January 1, 2021).
104 *
105 * The datum and epoch to which the position reported in this message is
106 * aligned depends on the current @ref solution_type.
107 * - @ref SolutionType::AutonomousGPS / @ref SolutionType::DGPS /
108 * @ref SolutionType::PPP - Standalone solutions (i.e., no differential
109 * corrections) are aligned to the WGS-84 datum as broadcast live by GPS
110 * (aligns closely with the ITRF08/14 datums).
111 * - @ref SolutionType::RTKFloat / @ref SolutionType::RTKFixed - When
112 * differential corrections are applied, the reference datum and epoch are
113 * defined by the corrections provider. Point One's Polaris Corrections
114 * Service produces corrections using the ITRF14 datum. See
115 * https://pointonenav.com/polaris for more details.
116 * - @ref SolutionType::Integrate - When the INS is dead reckoning in the
117 * absence of GNSS, vision, or other measurements anchored in absolute world
118 * coordinates, the position solution is defined in the same datum/epoch
119 * specified by the previous solution type (e.g., WGS-84 if previously
120 * standalone GNSS, i.e., @ref SolutionType::AutonomousGPS).
121 */
122 double lla_deg[3] = {NAN, NAN, NAN};
123
124 /**
125 * The position standard deviation (in meters), resolved with respect to the
126 * local ENU tangent plane: east, north, up.
127 */
128 float position_std_enu_m[3] = {NAN, NAN, NAN};
129
130 /**
131 * The platform attitude (in degrees), if known, described as intrinsic
132 * Euler-321 angles (yaw, pitch, roll) with respect to the local ENU tangent
133 * plane. Set to `NAN` if attitude is not available.
134 *
135 * @note
136 * The platform body axes are defined as +x forward, +y left, and +z up. A
137 * positive yaw is a left turn, positive pitch points the nose of the vehicle
138 * down, and positive roll is a roll toward the right. Yaw is measured from
139 * east in a counter-clockwise direction. For example, north is 90 degrees
140 * (i.e., `heading = 90 - ypr_deg[0]`).
141 */
142 double ypr_deg[3] = {NAN, NAN, NAN};
143
144 /**
145 * The attitude standard deviation (in degrees): yaw, pitch, roll.
146 */
147 float ypr_std_deg[3] = {NAN, NAN, NAN};
148
149 /**
150 * The platform velocity (in meters/second), resolved in the body frame. Set
151 * to `NAN` if attitude is not available for the body frame transformation.
152 */
153 double velocity_body_mps[3] = {NAN, NAN, NAN};
154
155 /**
156 * The velocity standard deviation (in meters/second), resolved in the body
157 * frame.
158 */
159 float velocity_std_body_mps[3] = {NAN, NAN, NAN};
160
161 /** The estimated aggregate 3D protection level (in meters). */
162 float aggregate_protection_level_m = NAN;
163 /** The estimated 2D horizontal protection level (in meters). */
164 float horizontal_protection_level_m = NAN;
165 /** The estimated vertical protection level (in meters). */
166 float vertical_protection_level_m = NAN;
167};
168
169/**
170 * @brief Auxiliary platform pose information (@ref MessageType::POSE_AUX,
171 * version 1.0).
172 * @ingroup solution_messages
173 */
175 static constexpr MessageType MESSAGE_TYPE = MessageType::POSE_AUX;
176 static constexpr uint8_t MESSAGE_VERSION = 0;
177
178 /** The time of the message, in P1 time (beginning at power-on). */
180
181 /**
182 * The position standard deviation (in meters), resolved in the body frame.
183 * Set to `NAN` if attitude is not available for the body frame
184 * transformation.
185 */
186 float position_std_body_m[3] = {NAN, NAN, NAN};
187
188 /**
189 * The 3x3 position covariance matrix (in m^2), resolved in the local ENU
190 * frame. Values are stored in row-major order.
191 */
192 double position_cov_enu_m2[9] = {NAN};
193
194 /**
195 * The platform body orientation with respect to the local ENU frame,
196 * represented as a quaternion with the scalar component last (x, y, z, w).
197 */
198 double attitude_quaternion[4] = {NAN, NAN, NAN, NAN};
199
200 /**
201 * The platform velocity (in meters/second), resolved in the local ENU frame.
202 */
203 double velocity_enu_mps[3] = {NAN, NAN, NAN};
204
205 /**
206 * The velocity standard deviation (in meters/second), resolved in the local
207 * ENU frame.
208 */
209 float velocity_std_enu_mps[3] = {NAN, NAN, NAN};
210};
211
212/**
213 * @brief Information about the GNSS data used in the @ref PoseMessage with the
214 * corresponding timestamp (@ref MessageType::GNSS_INFO, version 1.1).
215 * @ingroup solution_messages
216 *
217 * @note
218 * The deprecated `last_differential_time` field was removed in version 1.1 of
219 * this message, and was replaced by the new @ref leap_second, @ref num_svs,
220 * @ref corrections_age, and @ref baseline_distance fields. Attempting to use
221 * those fields on version 0 messages will result in undefined behavior.
222 */
224 static constexpr MessageType MESSAGE_TYPE = MessageType::GNSS_INFO;
225 static constexpr uint8_t MESSAGE_VERSION = 1;
226
227 static constexpr uint8_t INVALID_LEAP_SECOND = 0xFF;
228 static constexpr uint16_t INVALID_AGE = 0xFFFF;
229 static constexpr uint16_t INVALID_DISTANCE = 0xFFFF;
230 static constexpr uint32_t INVALID_REFERENCE_STATION = 0xFFFFFFFF;
231
232 /** The time of the message, in P1 time (beginning at power-on). */
234
235 /** The GPS time of the message, if available, referenced to 1980/1/6. */
237
238 /**
239 * The current UTC leap second (offset between UTC and GPS time), if known.
240 * Set to 255 if invalid.
241 *
242 * Added in message version 1
243 */
244 uint8_t leap_second = INVALID_LEAP_SECOND;
245
246 /** The number of satellites used in the current position solution. */
247 uint8_t num_svs = 0;
248
249 uint8_t reserved[2] = {0};
250
251 /**
252 * The age of the most recently received GNSS corrections data (in 0.1
253 * seconds). Set to 65535 if invalid.
254 *
255 * Added in message version 1
256 */
257 uint16_t corrections_age = INVALID_AGE;
258
259 /**
260 * The distance between the device and the GNSS corrections base station.
261 * Stored in units of 10 meters:
262 * `baseline_distance_m = baseline_distance * 10`. Set to 65535 if invalid.
263 *
264 * Added in message version 1
265 */
266 uint16_t baseline_distance = INVALID_DISTANCE;
267
268 /**
269 * The ID of the GNSS corrections base station, if used. Set to 4294967295 if
270 * invalid.
271 */
272 uint32_t reference_station_id = INVALID_REFERENCE_STATION;
273
274 /** The geometric dilution of precision (GDOP). */
275 float gdop = NAN;
276 /** The position dilution of precision (PDOP). */
277 float pdop = NAN;
278 /** The horizontal dilution of precision (HDOP). */
279 float hdop = NAN;
280 /** The vertical dilution of precision (VDOP). */
281 float vdop = NAN;
282
283 /** GPS time alignment standard deviation (in seconds). */
284 float gps_time_std_sec = NAN;
285};
286
287/**
288 * @brief Information about the individual satellites used in the @ref
289 * PoseMessage and @ref GNSSInfoMessage with the corresponding timestamp
290 * (@ref MessageType::GNSS_SATELLITE, version 1.0).
291 * @ingroup solution_messages
292 *
293 * @deprecated This message is deprecated in favor of the @ref
294 * GNSSSignalsMessage that gives more information on both the
295 * tracked satellites and signals.
296 *
297 * This message is followed by `N` @ref SatelliteInfo objects, where `N` is
298 * equal to @ref num_satellites. For example, a message with two satellites
299 * would be serialized as:
300 *
301 * ```
302 * {MessageHeader, GNSSSatelliteMessage, SatelliteInfo, SatelliteInfo, ...}
303 * ```
304 */
306 static constexpr MessageType MESSAGE_TYPE = MessageType::GNSS_SATELLITE;
307 static constexpr uint8_t MESSAGE_VERSION = 0;
308
309 /** The time of the message, in P1 time (beginning at power-on). */
311
312 /** The GPS time of the message, if available, referenced to 1980/1/6. */
314
315 /** The number of known satellites. */
316 uint16_t num_satellites = 0;
317
318 uint8_t reserved[2] = {0};
319};
320
321/**
322 * @brief Information about an individual satellite (see @ref
323 * GNSSSatelliteMessage).
324 *
325 * For satellites where @ref usage is 0, the satellite may either be currently
326 * tracked by the receiver but not used for navigation, or may just be expected
327 * according to available ephemeris data.
328 */
330 /**
331 * @defgroup satellite_usage Bit definitions for the satellite usage bitmask
332 * (@ref SatelliteInfo::usage).
333 * @{
334 */
335 static constexpr uint8_t SATELLITE_USED = 0x01;
336 /** @} */
337
338 static constexpr uint8_t INVALID_CN0 = 0;
339
340 /** The GNSS system to which this satellite belongs. */
341 SatelliteType system = SatelliteType::UNKNOWN;
342
343 /** The satellite's PRN (or slot number for GLONASS). */
344 uint8_t prn = 0;
345
346 /**
347 * A bitmask specifying how this satellite was used in the position solution.
348 * Set to 0 if the satellite was not used. See @ref satellite_usage.
349 */
350 uint8_t usage = 0;
351
352 /**
353 * The carrier-to-noise density ratio (C/N0) for the L1 signal on the
354 * satellite.
355 *
356 * Stored in units of 0.25 dB-Hz: `cn0_dbhz = cn0 * 0.25`. Set to 0 if
357 * invalid. The range of this field is 0.25-63.75 dB-Hz. Values outside of
358 * this range will be clipped to the min/max values.
359 *
360 * @note
361 * If the satellite is not tracking L1 (or the L1-equivalent for other
362 * constellations, e.g., G1 for GLONASS) but another frequency is being used,
363 * that signal's C/N0 value will be reported.
364 *
365 * Added in @ref GNSSSatelliteMessage version 1.1.
366 */
367 uint8_t cn0 = INVALID_CN0;
368
369 /** The azimuth of the satellite (in degrees). */
370 float azimuth_deg = NAN;
371
372 /** The elevation of the satellite (in degrees). */
373 float elevation_deg = NAN;
374};
375
376/**
377 * @brief Information about the individual GNSS satellites and signals used in
378 * the @ref PoseMessage and @ref GNSSInfoMessage with the corresponding
379 * timestamp (@ref MessageType::GNSS_SIGNALS, version 1.1).
380 * @ingroup solution_messages
381 *
382 * This message is followed by `N` @ref GNSSSatelliteInfo objects, where `N` is
383 * equal to @ref num_satellites.
384 *
385 * After the satellite data objects, there will be a section of `S` @ref
386 * GNSSSignalInfo objects, where `S` is equal to `num_signals`.
387 *
388 * For example:
389 * - A message with two satellites where the the first had one signal and the
390 * second had two.
391 *
392 * ```
393 * num_satellites=2
394 * num_signals=3
395 *
396 * The data structure of the serialized message:
397 * {MessageHeader, GNSSSignalsMessage, GNSSSatelliteInfo, GNSSSatelliteInfo,
398 * GNSSSignalInfo, GNSSSignalInfo, GNSSSignalInfo}
399 * ```
400 */
402 static constexpr MessageType MESSAGE_TYPE = MessageType::GNSS_SIGNALS;
403 static constexpr uint8_t MESSAGE_VERSION = 1;
404
405 static constexpr uint16_t INVALID_GPS_WEEK = 0xFFFF;
406 static constexpr uint32_t INVALID_GPS_TOW = 0xFFFFFFFF;
407
408 /** The time of the message, in P1 time (beginning at power-on). */
410
411 /**
412 * The precise GPS time of the message, if available, referenced to 1980/1/6.
413 */
415
416 /** The approximate GPS time of week in milliseconds. */
417 uint32_t gps_tow_ms = INVALID_GPS_TOW;
418
419 /** The GPS week number. */
420 uint16_t gps_week = INVALID_GPS_WEEK;
421
422 /** The number of GNSS signals reported in this message. */
423 uint16_t num_signals = 0;
424
425 /** The number satellites reported in this message. */
426 uint8_t num_satellites = 0;
427
428 uint8_t reserved[7] = {0};
429};
430
431/**
432 * @brief Information about an individual satellite (see @ref
433 * GNSSSignalsMessage).
434 */
436 /**
437 * @defgroup gnss_sv_status_flags Bit definitions for the satellite status
438 * bitmask (@ref GNSSSatelliteInfo::status_flags).
439 * @{
440 */
441 static constexpr uint8_t STATUS_FLAG_IS_USED = 0x01;
442 static constexpr uint8_t STATUS_FLAG_IS_UNHEALTHY = 0x02;
443 static constexpr uint8_t STATUS_FLAG_IS_NON_LINE_OF_SIGHT = 0x04;
444 static constexpr uint8_t STATUS_FLAG_HAS_EPHEM = 0x10;
445 static constexpr uint8_t STATUS_FLAG_HAS_SBAS = 0x20;
446 /** @} */
447
448 static constexpr uint16_t INVALID_AZIMUTH = 0xFFFF;
449 static constexpr int16_t INVALID_ELEVATION = 0x7FFF;
450
451 /** The GNSS system to which this satellite belongs. */
452 SatelliteType system = SatelliteType::UNKNOWN;
453
454 /** The satellite's PRN (or slot number for GLONASS). */
455 uint8_t prn = 0;
456
457 /**
458 * A bitmask specifying how this satellite was used and what information was
459 * available for it.
460 */
461 uint8_t status_flags = 0;
462
463 uint8_t reserved[1] = {0};
464
465 /** The elevation of the satellite [-90, 90] (in 0.01 degrees). */
466 int16_t elevation_cdeg = INVALID_ELEVATION;
467
468 /**
469 * The azimuth of the satellite [0,359] (in 0.01 degrees). 0 is north, and
470 * azimuth increases in a clockwise direction.
471 */
472 uint16_t azimuth_cdeg = INVALID_AZIMUTH;
473};
474static_assert(sizeof(GNSSSatelliteInfo) == 8,
475 "GNSSSatelliteInfo does not match expected packed size.");
476
477/**
478 * @brief Information about an individual GNSS signal (see @ref
479 * GNSSSignalsMessage).
480 */
482 /**
483 * @defgroup gnss_signal_status_flags Bit definitions for the signal status
484 * bitmask (@ref GNSSSignalInfo::status_flags).
485 * @{
486 */
487 static constexpr uint16_t STATUS_FLAG_USED_PR = 0x01;
488 static constexpr uint16_t STATUS_FLAG_USED_DOPPLER = 0x02;
489 static constexpr uint16_t STATUS_FLAG_USED_CARRIER = 0x04;
490 static constexpr uint16_t STATUS_FLAG_CARRIER_AMBIGUITY_RESOLVED = 0x08;
491
492 static constexpr uint16_t STATUS_FLAG_VALID_PR = 0x10;
493 static constexpr uint16_t STATUS_FLAG_VALID_DOPPLER = 0x20;
494 static constexpr uint16_t STATUS_FLAG_CARRIER_LOCKED = 0x40;
495
496 static constexpr uint16_t STATUS_FLAG_HAS_RTK = 0x100;
497 static constexpr uint16_t STATUS_FLAG_HAS_SBAS = 0x200;
498 static constexpr uint16_t STATUS_FLAG_HAS_EPHEM = 0x400;
499 /** @} */
500
501 static constexpr uint8_t INVALID_CN0 = 0;
502
503 /** The type of signal being reported. */
504 GNSSSignalType signal_type = GNSSSignalType::UNKNOWN;
505
506 /**
507 * The PRN (or slot number for GLONASS) of the satellite that generated this
508 * signal.
509 */
510 uint8_t prn = 0;
511
512 /**
513 * The carrier-to-noise density ratio (C/N0) this signal.
514 *
515 * Stored in units of 0.25 dB-Hz: `cn0_dbhz = cn0 * 0.25`. Set to 0 if
516 * invalid. The range of this field is 0.25-63.75 dB-Hz. Values outside of
517 * this range will be clipped to the min/max values.
518 */
519 uint8_t cn0 = INVALID_CN0;
520
521 /**
522 * A bitmask specifying how this signal was used and what information was
523 * available for it.
524 */
525 uint16_t status_flags = 0;
526
527 uint8_t reserved[2] = {0};
528};
529static_assert(sizeof(GNSSSignalInfo) == 8,
530 "GNSSSignalInfo does not match expected packed size.");
531
532/**
533 * @brief The stages of the device calibration process.
534 * @ingroup solution_messages
535 */
537 UNKNOWN = 0, ///< Calibration stage not known.
538 MOUNTING_ANGLE = 1, ///< Estimating IMU mounting angles.
539 DONE = 255, ///< Calibration complete.
540};
541
542/**
543 * @brief Get a human-friendly string name for the specified @ref
544 * CalibrationStage.
545 *
546 * @param val The enum to get the string name for.
547 *
548 * @return The corresponding string name.
549 */
551 switch (val) {
553 return "Unknown";
555 return "IMU Mounting Angles";
557 return "Done";
558 }
559 return "Unrecognized";
560}
561
562/**
563 * @brief @ref CalibrationStage stream operator.
564 */
566 stream << to_string(val) << " (" << (int)val << ")";
567 return stream;
568}
569
570/**
571 * @brief Device calibration status update. (@ref
572 * MessageType::CALIBRATION_STATUS, version 1.1).
573 * @brief
574 * @ingroup solution_messages
575 */
577 static constexpr MessageType MESSAGE_TYPE = MessageType::CALIBRATION_STATUS;
578 static constexpr uint8_t MESSAGE_VERSION = 1;
579
580 /** The most recent P1 time, if available. */
582
583 /**
584 * @name Calibration State Data
585 * @{
586 */
587
588 /** The current calibration stage. */
589 CalibrationStage calibration_stage = CalibrationStage::UNKNOWN;
590
591 uint8_t reserved1[3] = {0};
592
593 /** The IMU yaw, pitch, and roll mounting angle offsets (in degrees). */
594 float ypr_deg[3] = {NAN, NAN, NAN};
595
596 /**
597 * The IMU yaw, pitch, and roll mounting angle standard deviations (in
598 * degrees).
599 */
600 float ypr_std_dev_deg[3] = {NAN, NAN, NAN};
601
602 /** The accumulated calibration travel distance (in meters). */
603 float travel_distance_m = 0.0;
604
605 uint8_t reserved2[24] = {0};
606
607 /** @} */
608
609 /**
610 * @name Calibration Process Status
611 * @{
612 */
613
614 /**
615 * Set to 1 once the navigation engine state is validated after
616 * initialization.
617 */
618 uint8_t state_verified{0};
619
620 uint8_t reserved3[3] = {0};
621
622 /**
623 * The completion percentage for gyro bias estimation, stored with a
624 * scale factor of 0.5% (0-200).
625 */
626 uint8_t gyro_bias_percent_complete = 0;
627
628 /**
629 * The completion percentage for accelerometer bias estimation, stored with a
630 * scale factor of 0.5% (0-200).
631 */
632 uint8_t accel_bias_percent_complete = 0;
633
634 /**
635 * The completion percentage for IMU mounting angle estimation, stored with a
636 * scale factor of 0.5% (0-200).
637 */
638 uint8_t mounting_angle_percent_complete = 0;
639
640 uint8_t reserved4[5] = {0};
641
642 /** @} */
643
644 /**
645 * @name Calibration Thresholds
646 * @{
647 */
648
649 /**
650 * The minimum accumulated calibration travel distance needed to complete
651 * mounting angle calibration.
652 */
653 float min_travel_distance_m = NAN;
654
655 /**
656 * The max threshold for each of the YPR mounting angle states (in degrees),
657 * above which calibration is incomplete.
658 */
659 float mounting_angle_max_std_dev_deg[3] = {NAN, NAN, NAN};
660
661 /** @} */
662};
663
664/**
665 * @brief Relative ENU position to base station (@ref
666 * MessageType::RELATIVE_ENU_POSITION, version 1.1).
667 * @ingroup solution_messages
668 *
669 * @note
670 * This message represents the relationship between the navigation engine's
671 * position solution and a nearby RTK base station. It is not used to convey
672 * unfiltered vehicle body orientation measurements generated using multiple
673 * GNSS antennas. See @ref GNSSAttitudeOutput instead.
674 */
676 static constexpr MessageType MESSAGE_TYPE =
677 MessageType::RELATIVE_ENU_POSITION;
678 static constexpr uint8_t MESSAGE_VERSION = 1;
679
680 static constexpr uint32_t INVALID_REFERENCE_STATION = 0xFFFFFFFF;
681
682 /** The time of the message, in P1 time (beginning at power-on). */
684
685 /** The GPS time of the message, if available, referenced to 1980/1/6. */
687
688 /** The type of this position solution. */
689 SolutionType solution_type = SolutionType::Invalid;
690
691 uint8_t reserved[3] = {0};
692
693 /** The ID of the differential base station. */
694 uint32_t reference_station_id = INVALID_REFERENCE_STATION;
695
696 /**
697 * The relative position (in meters), resolved in the local ENU frame.
698 *
699 * @note
700 * If a differential solution to the base station is not available, these
701 * values will be `NAN`.
702 */
703 double relative_position_enu_m[3] = {NAN, NAN, NAN};
704
705 /**
706 * The position standard deviation (in meters), resolved with respect to the
707 * local ENU tangent plane: east, north, up.
708 *
709 * @note
710 * If a differential solution to the base station is not available, these
711 * values will be `NAN`.
712 */
713 float position_std_enu_m[3] = {NAN, NAN, NAN};
714};
715
716#pragma pack(pop)
717
718} // namespace messages
719} // namespace fusion_engine
720} // namespace point_one

Generated via doxygen2docusaurus 2.2.0 by Doxygen 1.9.8.