0.4.1
Loading...
Searching...
No Matches
UbloxUtilities.cpp
Go to the documentation of this file.
1// This file is part of INSTINCT, the INS Toolkit for Integrated
2// Navigation Concepts and Training by the Institute of Navigation of
3// the University of Stuttgart, Germany.
4//
5// This Source Code Form is subject to the terms of the Mozilla Public
6// License, v. 2.0. If a copy of the MPL was not distributed with this
7// file, You can obtain one at https://mozilla.org/MPL/2.0/.
8
9#include "UbloxUtilities.hpp"
10#include "UbloxTypes.hpp"
11
12#include "util/Eigen.hpp"
14#include "util/Logger.hpp"
15
17
18bool NAV::vendor::ublox::decryptUbloxObs(const std::shared_ptr<NAV::UbloxObs>& obs, uart::protocol::Packet& packet, [[maybe_unused]] const std::string& nameId)
19{
20 if (packet.type() == uart::protocol::Packet::Type::TYPE_BINARY)
21 {
22 uint8_t msgClassByte = packet.extractUint8();
23 obs->msgClass = static_cast<UbxClass>(msgClassByte);
24 obs->msgId = packet.extractUint8();
25 obs->payloadLength = packet.extractUint16();
26
27 // Ack/Nak Messages: Acknowledge or Reject messages to UBX-CFG input messages
28 if (obs->msgClass == UbxClass::UBX_CLASS_ACK)
29 {
30 auto msgId = static_cast<UbxAckMessages>(obs->msgId);
31 if (msgId == UbxAckMessages::UBX_ACK_ACK)
32 {
33 obs->data = UbxAckAck();
34 std::get<UbxAckAck>(obs->data).clsID = packet.extractUint8();
35 std::get<UbxAckAck>(obs->data).msgID = packet.extractUint8();
36
37 LOG_DATA("{}: UBX: ACK-ACK, clsID {}, msgID {}", nameId, std::get<UbxAckAck>(obs->data).clsID, std::get<UbxAckAck>(obs->data).msgID);
38 }
39 else if (msgId == UbxAckMessages::UBX_ACK_NAK)
40 {
41 obs->data = UbxAckNak();
42 std::get<UbxAckNak>(obs->data).clsID = packet.extractUint8();
43 std::get<UbxAckNak>(obs->data).msgID = packet.extractUint8();
44
45 LOG_DATA("{}: UBX: ACK-NAK, Size {}", nameId, packet.getRawDataLength());
46 }
47 else
48 {
49 LOG_DATA("{}: UBX: ACK-{:x}, Size {}, not implemented yet!", nameId, obs->msgId, packet.getRawDataLength());
50 return false;
51 }
52 }
53 // Configuration Input Messages: Configure the receiver
54 else if (obs->msgClass == UbxClass::UBX_CLASS_CFG)
55 {
56 [[maybe_unused]] auto msgId = static_cast<UbxCfgMessages>(obs->msgId);
57 LOG_DATA("{}: UBX: CFG-{:x}, Size {}, not implemented yet!", nameId, obs->msgId, packet.getRawDataLength());
58 return false;
59 }
60 // External Sensor Fusion Messages: External Sensor Measurements and Status Information
61 else if (obs->msgClass == UbxClass::UBX_CLASS_ESF)
62 {
63 auto msgId = static_cast<UbxEsfMessages>(obs->msgId);
64 if (msgId == UbxEsfMessages::UBX_ESF_INS)
65 {
66 LOG_DATA("{}: UBX: ESF-INS, Size {}, not implemented yet!", nameId, packet.getRawDataLength());
67 return false;
68 }
70 {
71 LOG_DATA("{}: UBX: ESF-MEAS, Size {}, not implemented yet!", nameId, packet.getRawDataLength());
72 return false;
73 }
74 if (msgId == UbxEsfMessages::UBX_ESF_RAW)
75 {
76 obs->data = UbxEsfRaw();
77 for (auto& reserved1 : std::get<UbxEsfRaw>(obs->data).reserved1)
78 {
79 reserved1 = packet.extractUint8();
80 }
81 for (int i = 0; i < (obs->payloadLength - 4) / 8; i++)
82 {
84 ubxEsfRawData.data = packet.extractUint32();
85 ubxEsfRawData.sTtag = packet.extractUint32();
86 std::get<UbxEsfRaw>(obs->data).data.push_back(ubxEsfRawData);
87 }
88
89 // TODO: - UBX_ESF_RAW: Calculate the insTime somehow from the sensor time tag (sTtag)
90
91 LOG_DATA("{}: UBX: ESF-RAW, {} measurements", nameId, (obs->payloadLength - 4) / 8);
92 }
93 else if (msgId == UbxEsfMessages::UBX_ESF_STATUS)
94 {
95 LOG_DATA("{}: UBX: ESF-STATUS, Size {}, not implemented yet!", nameId, packet.getRawDataLength());
96 return false;
97 }
98 else
99 {
100 LOG_DATA("{}: UBX: ESF-{:x}, Size {}, not implemented yet!", nameId, obs->msgId, packet.getRawDataLength());
101 return false;
102 }
103 }
104 // High Rate Navigation Results Messages: High rate time, position, speed, heading
105 else if (obs->msgClass == UbxClass::UBX_CLASS_HNR)
106 {
107 [[maybe_unused]] auto msgId = static_cast<UbxHnrMessages>(obs->msgId);
108 LOG_DATA("{}: UBX: HNR-{:x}, Size {}, not implemented yet!", nameId, obs->msgId, packet.getRawDataLength());
109 return false;
110 }
111 // Information Messages: Printf-Style Messages, with IDs such as Error, Warning, Notice
112 else if (obs->msgClass == UbxClass::UBX_CLASS_INF)
113 {
114 [[maybe_unused]] auto msgId = static_cast<UbxInfMessages>(obs->msgId);
115 LOG_DATA("{}: UBX: INF-{:x}, Size {}, not implemented yet!", nameId, obs->msgId, packet.getRawDataLength());
116 return false;
117 }
118 // Logging Messages: Log creation, deletion, info and retrieval
119 else if (obs->msgClass == UbxClass::UBX_CLASS_LOG)
120 {
121 [[maybe_unused]] auto msgId = static_cast<UbxLogMessages>(obs->msgId);
122 LOG_DATA("{}: UBX: LOG-{:x}, Size {}, not implemented yet!", nameId, obs->msgId, packet.getRawDataLength());
123 return false;
124 }
125 // Multiple GNSS Assistance Messages: Assistance data for various GNSS
126 else if (obs->msgClass == UbxClass::UBX_CLASS_MGA)
127 {
128 [[maybe_unused]] auto msgId = static_cast<UbxMgaMessages>(obs->msgId);
129 LOG_DATA("{}: UBX: MGA-{:x}, Size {}, not implemented yet!", nameId, obs->msgId, packet.getRawDataLength());
130 return false;
131 }
132 // Monitoring Messages: Communication Status, CPU Load, Stack Usage, Task Status
133 else if (obs->msgClass == UbxClass::UBX_CLASS_MON)
134 {
135 [[maybe_unused]] auto msgId = static_cast<UbxMonMessages>(obs->msgId);
136 LOG_DATA("{}: UBX: MON-{:x}, Size {}, not implemented yet!", nameId, obs->msgId, packet.getRawDataLength());
137 return false;
138 }
139 // Navigation Results Messages: Position, Speed, Time, Acceleration, Heading, DOP, SVs used
140 else if (obs->msgClass == UbxClass::UBX_CLASS_NAV)
141 {
142 auto msgId = static_cast<UbxNavMessages>(obs->msgId);
143 if (msgId == UbxNavMessages::UBX_NAV_ATT)
144 {
145 obs->data = UbxNavAtt();
146
147 std::get<UbxNavAtt>(obs->data).iTOW = packet.extractUint32();
148 std::get<UbxNavAtt>(obs->data).version = packet.extractUint8();
149 for (auto& reserved1 : std::get<UbxNavAtt>(obs->data).reserved1)
150 {
151 reserved1 = packet.extractUint8();
152 }
153 std::get<UbxNavAtt>(obs->data).roll = packet.extractInt32();
154 std::get<UbxNavAtt>(obs->data).pitch = packet.extractInt32();
155 std::get<UbxNavAtt>(obs->data).heading = packet.extractInt32();
156 std::get<UbxNavAtt>(obs->data).accRoll = packet.extractUint32();
157 std::get<UbxNavAtt>(obs->data).accPitch = packet.extractUint32();
158 std::get<UbxNavAtt>(obs->data).accHeading = packet.extractUint32();
159
160 // TODO: Calculate the insTime with the iTOW
161 // auto currentTime = util::time::GetCurrentInsTime();
162 // if (!currentTime.empty())
163 // {
164 // auto gpst = currentTime.toGPSweekTow();
165 // currentTime = InsTime(gpst.gpsCycle,
166 // gpst.gpsWeek,
167 // static_cast<long double>(std::get<UbxNavAtt>(obs->data).iTOW) / 1000.0L);
168 // obs->insTime = currentTime;
169 // }
170
171 LOG_DATA("{}: UBX: NAV-ATT, iTOW {}, roll {}, pitch {}, heading {}", nameId, std::get<UbxNavAtt>(obs->data).iTOW, std::get<UbxNavAtt>(obs->data).roll, std::get<UbxNavAtt>(obs->data).pitch, std::get<UbxNavAtt>(obs->data).heading);
172 }
173 else if (msgId == UbxNavMessages::UBX_NAV_POSECEF)
174 {
175 obs->data = UbxNavPosecef();
176
177 std::get<UbxNavPosecef>(obs->data).iTOW = packet.extractUint32();
178 std::get<UbxNavPosecef>(obs->data).ecefX = packet.extractInt32();
179 std::get<UbxNavPosecef>(obs->data).ecefY = packet.extractInt32();
180 std::get<UbxNavPosecef>(obs->data).ecefZ = packet.extractInt32();
181 std::get<UbxNavPosecef>(obs->data).pAcc = packet.extractUint32();
182
183 // TODO: Calculate the insTime with the iTOW
184 // auto currentTime = util::time::GetCurrentInsTime();
185 // if (!currentTime.empty())
186 // {
187 // auto gpst = currentTime.toGPSweekTow();
188 // currentTime = InsTime(gpst.gpsCycle,
189 // gpst.gpsWeek,
190 // static_cast<long double>(std::get<UbxNavPosecef>(obs->data).iTOW) / 1000.0L);
191 // obs->insTime = currentTime;
192 // }
193
194 LOG_DATA("{}: UBX: NAV-POSECEF, iTOW {}, x {}, y {}, z {}", nameId, std::get<UbxNavPosecef>(obs->data).iTOW, std::get<UbxNavPosecef>(obs->data).ecefX, std::get<UbxNavPosecef>(obs->data).ecefY, std::get<UbxNavPosecef>(obs->data).ecefZ);
195 }
196 else if (msgId == UbxNavMessages::UBX_NAV_POSLLH)
197 {
198 obs->data = UbxNavPosllh();
199
200 std::get<UbxNavPosllh>(obs->data).iTOW = packet.extractUint32();
201 std::get<UbxNavPosllh>(obs->data).lon = packet.extractInt32();
202 std::get<UbxNavPosllh>(obs->data).lat = packet.extractInt32();
203 std::get<UbxNavPosllh>(obs->data).height = packet.extractInt32();
204 std::get<UbxNavPosllh>(obs->data).hMSL = packet.extractInt32();
205 std::get<UbxNavPosllh>(obs->data).hAcc = packet.extractUint32();
206 std::get<UbxNavPosllh>(obs->data).vAcc = packet.extractUint32();
207
208 // TODO: Calculate the insTime with the iTOW
209 // auto currentTime = util::time::GetCurrentInsTime();
210 // if (!currentTime.empty())
211 // {
212 // auto gpst = currentTime.toGPSweekTow();
213 // currentTime = InsTime(gpst.gpsCycle,
214 // gpst.gpsWeek,
215 // static_cast<long double>(std::get<UbxNavPosllh>(obs->data).iTOW) / 1000.0L);
216 // obs->insTime = currentTime;
217 // }
218
219 LOG_DATA("{}: UBX: NAV-POSLLH, iTOW {}, lon {}, lat {}, height {}", nameId, std::get<UbxNavPosllh>(obs->data).iTOW, std::get<UbxNavPosllh>(obs->data).lon, std::get<UbxNavPosllh>(obs->data).lat, std::get<UbxNavPosllh>(obs->data).height);
220 }
221 else if (msgId == UbxNavMessages::UBX_NAV_VELNED)
222 {
223 obs->data = UbxNavVelned();
224
225 std::get<UbxNavVelned>(obs->data).iTOW = packet.extractUint32();
226 std::get<UbxNavVelned>(obs->data).velN = packet.extractInt32();
227 std::get<UbxNavVelned>(obs->data).velE = packet.extractInt32();
228 std::get<UbxNavVelned>(obs->data).velD = packet.extractInt32();
229 std::get<UbxNavVelned>(obs->data).speed = packet.extractUint32();
230 std::get<UbxNavVelned>(obs->data).gSpeed = packet.extractUint32();
231 std::get<UbxNavVelned>(obs->data).heading = packet.extractInt32();
232 std::get<UbxNavVelned>(obs->data).sAcc = packet.extractUint32();
233 std::get<UbxNavVelned>(obs->data).cAcc = packet.extractUint32();
234
235 // TODO: Calculate the insTime with the iTOW
236 // auto currentTime = util::time::GetCurrentInsTime();
237 // if (!currentTime.empty())
238 // {
239 // auto gpst = currentTime.toGPSweekTow();
240 // currentTime = InsTime(gpst.gpsCycle,
241 // gpst.gpsWeek,
242 // static_cast<long double>(std::get<UbxNavVelned>(obs->data).iTOW) / 1000.0L);
243 // obs->insTime = currentTime;
244 // }
245
246 LOG_DATA("{}: UBX: NAV-VELNED, iTOW {}, gSpeed {} [cm/s], heading {} [deg*1e-5], velD {} [cm/s]", nameId, std::get<UbxNavVelned>(obs->data).iTOW, std::get<UbxNavVelned>(obs->data).gSpeed, std::get<UbxNavVelned>(obs->data).heading, std::get<UbxNavVelned>(obs->data).velD);
247 }
248 else
249 {
250 LOG_DATA("{}: UBX: NAV-{:x}, Size {}, not implemented yet!", nameId, obs->msgId, packet.getRawDataLength());
251 return false;
252 }
253 }
254 // Receiver Manager Messages: Satellite Status, RTC Status
255 else if (obs->msgClass == UbxClass::UBX_CLASS_RXM)
256 {
257 auto msgId = static_cast<UbxRxmMessages>(obs->msgId);
258 if (msgId == UbxRxmMessages::UBX_RXM_RAWX)
259 {
260 obs->data = UbxRxmRawx();
261
262 std::get<UbxRxmRawx>(obs->data).rcvTow = packet.extractDouble();
263 std::get<UbxRxmRawx>(obs->data).week = packet.extractUint16();
264 std::get<UbxRxmRawx>(obs->data).leapS = packet.extractInt8();
265 std::get<UbxRxmRawx>(obs->data).numMeas = packet.extractUint8();
266 std::get<UbxRxmRawx>(obs->data).recStat = packet.extractUint8();
267 std::get<UbxRxmRawx>(obs->data).version = packet.extractUint8();
268 for (auto& reserved1 : std::get<UbxRxmRawx>(obs->data).reserved1)
269 {
270 reserved1 = packet.extractUint8();
271 }
272 for (size_t i = 0; i < std::get<UbxRxmRawx>(obs->data).numMeas; i++)
273 {
275 ubxRxmRawxData.prMes = packet.extractDouble();
276 ubxRxmRawxData.cpMes = packet.extractDouble();
277 ubxRxmRawxData.doMes = packet.extractFloat();
278 ubxRxmRawxData.gnssId = packet.extractUint8();
279 ubxRxmRawxData.svId = packet.extractUint8();
280 ubxRxmRawxData.sigId = packet.extractUint8();
281 ubxRxmRawxData.freqId = packet.extractUint8();
282 ubxRxmRawxData.locktime = packet.extractUint16();
283 ubxRxmRawxData.cno = packet.extractUint8();
284 ubxRxmRawxData.prStdev = packet.extractUint8();
285 ubxRxmRawxData.cpStdev = packet.extractUint8();
286 ubxRxmRawxData.doStdev = packet.extractUint8();
287 ubxRxmRawxData.trkStat = packet.extractUint8();
288 ubxRxmRawxData.reserved2 = packet.extractUint8();
289 std::get<UbxRxmRawx>(obs->data).data.push_back(ubxRxmRawxData);
290 }
291
292 obs->insTime = InsTime(0,
293 std::get<UbxRxmRawx>(obs->data).week,
294 static_cast<long double>(std::get<UbxRxmRawx>(obs->data).rcvTow));
295
296 std::string satInfo;
297 for (const auto& sat : std::get<UbxRxmRawx>(obs->data).data)
298 {
299 satInfo += "[" + std::to_string(sat.gnssId);
300 satInfo += ", " + std::to_string(sat.svId);
301 satInfo += ", " + std::to_string(sat.sigId) + "], ";
302 }
303
304 LOG_DATA("{}: UBX: RXM-RAWX, Size {}, rcvWeek {}, rcvTow {}, numMeas {}, satInfo {}.{}", nameId,
305 packet.getRawDataLength(), std::get<UbxRxmRawx>(obs->data).week, std::get<UbxRxmRawx>(obs->data).rcvTow,
306 std::get<UbxRxmRawx>(obs->data).numMeas, satInfo, std::get<UbxRxmRawx>(obs->data).week == 0 ? " Skipped because no valid time." : "");
307 if (std::get<UbxRxmRawx>(obs->data).week == 0)
308 {
309 return false;
310 }
311 }
312 else if (msgId == UbxRxmMessages::UBX_RXM_SFRBX)
313 {
314 obs->data = UbxRxmSfrbx();
315
316 std::get<UbxRxmSfrbx>(obs->data).gnssId = packet.extractUint8();
317 std::get<UbxRxmSfrbx>(obs->data).svId = packet.extractUint8();
318 std::get<UbxRxmSfrbx>(obs->data).sigId = packet.extractUint8();
319 std::get<UbxRxmSfrbx>(obs->data).freqId = packet.extractUint8();
320 std::get<UbxRxmSfrbx>(obs->data).numWords = packet.extractUint8();
321 std::get<UbxRxmSfrbx>(obs->data).chn = packet.extractUint8();
322 std::get<UbxRxmSfrbx>(obs->data).version = packet.extractUint8();
323 std::get<UbxRxmSfrbx>(obs->data).reserved0 = packet.extractUint8();
324
325 for (size_t i = 0; i < std::get<UbxRxmSfrbx>(obs->data).numWords; i++)
326 {
327 std::get<UbxRxmSfrbx>(obs->data).dwrd.emplace_back(packet.extractUint32());
328 }
329
330 LOG_DATA("{}: UBX: RXM-SFRBX, gnssId {}, svId {}, freqId {}, numWords {}, chn {}, version {}", nameId,
331 std::get<UbxRxmSfrbx>(obs->data).gnssId,
332 std::get<UbxRxmSfrbx>(obs->data).svId,
333 std::get<UbxRxmSfrbx>(obs->data).freqId,
334 std::get<UbxRxmSfrbx>(obs->data).numWords,
335 std::get<UbxRxmSfrbx>(obs->data).chn,
336 std::get<UbxRxmSfrbx>(obs->data).version);
337 }
338 else
339 {
340 LOG_DATA("{}: UBX: RXM-{:x}, Size {}, not implemented yet!", nameId, obs->msgId, packet.getRawDataLength());
341 return false;
342 }
343 }
344 // Security Feature Messages
345 else if (obs->msgClass == UbxClass::UBX_CLASS_SEC)
346 {
347 [[maybe_unused]] auto msgId = static_cast<UbxSecMessages>(obs->msgId);
348 LOG_DATA("{}: UBX: SEC-{:x}, Size {}, not implemented yet!", nameId, obs->msgId, packet.getRawDataLength());
349 return false;
350 }
351 // Timing Messages: Time Pulse Output, Time Mark Results
352 else if (obs->msgClass == UbxClass::UBX_CLASS_TIM)
353 {
354 [[maybe_unused]] auto msgId = static_cast<UbxTimMessages>(obs->msgId);
355 LOG_DATA("{}: UBX: TIM-{:x}, Size {}, not implemented yet!", nameId, obs->msgId, packet.getRawDataLength());
356 return false;
357 }
358 // Firmware Update Messages: Memory/Flash erase/write, Reboot, Flash identification, etc.
359 else if (obs->msgClass == UbxClass::UBX_CLASS_UPD)
360 {
361 [[maybe_unused]] auto msgId = static_cast<UbxUpdMessages>(obs->msgId);
362 LOG_DATA("{}: UBX: UPD-{:x}, Size {}, not implemented yet!", nameId, obs->msgId, packet.getRawDataLength());
363 return false;
364 }
365 else
366 {
367 LOG_DATA("{}: UBX: {:x}-{:x}, Size {}, not implemented yet!", nameId, static_cast<int>(obs->msgClass), static_cast<int>(obs->msgId), packet.getRawDataLength());
368 return false;
369 }
370 }
371 else if (packet.type() == uart::protocol::Packet::Type::TYPE_ASCII)
372 {
373 LOG_DATA("{}: NMEA: {}", nameId, packet.datastr().substr(0, packet.datastr().size() - 2));
374 }
375
376 return true;
377}
378
379std::pair<uint8_t, uint8_t> NAV::vendor::ublox::checksumUBX(const std::vector<uint8_t>& data)
380{
381 uint8_t cka = 0;
382 uint8_t ckb = 0;
383
384 for (size_t i = 2; i < data.size() - 2; i++)
385 {
386 cka += data.at(i);
387 ckb += cka;
388 }
389 return std::make_pair(cka, ckb);
390}
391
392uint8_t NAV::vendor::ublox::checksumNMEA(const std::vector<uint8_t>& data)
393{
394 uint8_t calcChecksum = 0;
395 // |-> <-| Checksum without first $ sign and till the *
396 // $--ZDA,hhmmss.ss,xx,xx,xxxx,xx,xx*hh<CR><LF>
397 for (size_t i = 1; i < data.size() - 5; i++)
398 {
399 calcChecksum ^= data.at(i);
400 }
401 return calcChecksum;
402}
Transformation collection.
Vector space operations.
Utility class for logging to console and file.
#define LOG_DATA
All output which occurs repeatedly every time observations are received.
Definition Logger.hpp:29
Keeps track of the current real/simulation time.
Type Definitions for Ublox messages.
Helper Functions to work with Ublox Sensors.
The class is responsible for all time-related tasks.
Definition InsTime.hpp:710
uint8_t checksumNMEA(const std::vector< uint8_t > &data)
Calculates the NMEA checksum for the provided data vector.
UbxMgaMessages
The available MGA Messages.
UbxUpdMessages
The available UPD Messages.
UbxTimMessages
The available TIM Messages.
UbxCfgMessages
The available CFG Messages.
bool decryptUbloxObs(const std::shared_ptr< NAV::UbloxObs > &obs, uart::protocol::Packet &packet, const std::string &nameId)
Decrypts the provided Ublox observation.
std::pair< uint8_t, uint8_t > checksumUBX(const std::vector< uint8_t > &data)
Calculates the two UBX checksums for the provided data vector.
UbxAckMessages
The available ACK Messages.
@ UBX_ACK_ACK
Message Acknowledged (Length = 2; Type = Output)
@ UBX_ACK_NAK
Message Not-Acknowledged (Length = 2; Type = Output)
UbxLogMessages
The available LOG Messages.
UbxInfMessages
The available INF Messages.
UbxEsfMessages
The available ESF Messages.
@ UBX_ESF_INS
Vehicle dynamics information (Length = 36; Type = Periodic/Polled)
@ UBX_ESF_RAW
Raw sensor measurements (Length = 4 + 8*N; Type = Output)
@ UBX_ESF_STATUS
External Sensor Fusion (ESF) status information (Length = 16 + 4*numSens; Type = Periodic/Polled)
@ UBX_ESF_MEAS
External Sensor Fusion Measurements (Length = (8 + 4*numMeas) or (12 + 4*numMeas); Type = Input/Outpu...
UbxClass
The available UBX Class IDs.
@ UBX_CLASS_NAV
Navigation Results Messages: Position, Speed, Time, Acceleration, Heading, DOP, SVs used.
@ UBX_CLASS_TIM
Timing Messages: Time Pulse Output, Time Mark Results.
@ UBX_CLASS_INF
Information Messages: Printf-Style Messages, with IDs such as Error, Warning, Notice.
@ UBX_CLASS_HNR
High Rate Navigation Results Messages: High rate time, position, speed, heading.
@ UBX_CLASS_SEC
Security Feature Messages.
@ UBX_CLASS_MON
Monitoring Messages: Communication Status, CPU Load, Stack Usage, Task Status.
@ UBX_CLASS_MGA
Multiple GNSS Assistance Messages: Assistance data for various GNSS.
@ UBX_CLASS_RXM
Receiver Manager Messages: Satellite Status, RTC Status.
@ UBX_CLASS_ESF
External Sensor Fusion Messages: External Sensor Measurements and Status Information.
@ UBX_CLASS_LOG
Logging Messages: Log creation, deletion, info and retrieval.
@ UBX_CLASS_UPD
Firmware Update Messages: Memory/Flash erase/write, Reboot, Flash identification, etc.
@ UBX_CLASS_CFG
Configuration Input Messages: Configure the receiver.
@ UBX_CLASS_ACK
Ack/Nak Messages: Acknowledge or Reject messages to UBX-CFG input messages.
UbxRxmMessages
The available RXM Messages.
UbxHnrMessages
The available HNR Messages.
UbxSecMessages
The available SEC Messages.
UbxNavMessages
The available NAV Messages.
@ UBX_NAV_VELNED
Velocity Solution in NED (Length = 36; Type = Periodic/Polled)
@ UBX_NAV_ATT
Attitude Solution (Length = 32; Type = Periodic/Polled)
@ UBX_NAV_POSECEF
Position Solution in ECEF (Length = 20; Type = Periodic/Polled)
@ UBX_NAV_POSLLH
Geodetic Position Solution (Length = 28; Type = Periodic/Polled)
UbxMonMessages
The available MON Messages.
Message Acknowledged.
Message Not-Acknowledged.
uint32_t data
data. Same as in UBX-ESF-MEAS (see graphic below)
Raw sensor measurements.
Position Solution in ECEF.
Geodetic Position Solution.
Velocity Solution in NED.
uint16_t locktime
Carrier phase locktime counter [ms] (maximum 64500ms)
uint8_t cno
Carrier-to-noise density ratio (signal strength) [dB-Hz].
std::bitset< 1UL *8UL > doStdev
Estimated Doppler measurement standard deviation. [Hz * 0.002*2^n] (see graphic below)
float doMes
Doppler measurement (positive sign for approaching satellites) [Hz].
std::bitset< 1UL *8UL > cpStdev
Estimated carrier phase measurement standard deviation [cycles * 0.004] (note a raw value of 0x0F ind...
std::bitset< 1UL *8UL > trkStat
Tracking status bitfield (see graphic below)
uint8_t gnssId
GNSS identifier (see Satellite Numbering for a list of identifiers)
uint8_t svId
Satellite identifier (see Satellite Numbering)
uint8_t sigId
New style signal identifier (see Signal Identifiers).(not supported in protocol versions less than 27...
std::bitset< 1UL *8UL > prStdev
Estimated pseudorange measurement standard deviation [m * 0.01*2^n] (see graphic below)
uint8_t freqId
Only used for GLONASS: This is the frequency slot + 7 (range from 0 to 13)
Multi-GNSS Raw Measurement Data.
Broadcast Navigation Data Subframe.