Main MRPT website > C++ reference for MRPT 1.9.9
CObservationGPS.cpp
Go to the documentation of this file.
1 /* +------------------------------------------------------------------------+
2  | Mobile Robot Programming Toolkit (MRPT) |
3  | http://www.mrpt.org/ |
4  | |
5  | Copyright (c) 2005-2017, Individual contributors, see AUTHORS file |
6  | See: http://www.mrpt.org/Authors - All rights reserved. |
7  | Released under BSD License. See details in http://www.mrpt.org/License |
8  +------------------------------------------------------------------------+ */
9 
10 #include "obs-precomp.h" // Precompiled headers
11 
13 #include <mrpt/utils/CStream.h>
14 #include <mrpt/math/matrix_serialization.h> // for << of matrices
16 #include <iomanip>
17 
18 using namespace std;
19 using namespace mrpt;
20 using namespace mrpt::utils;
21 using namespace mrpt::obs;
22 using namespace mrpt::math;
23 
24 // This must be added to any CSerializable class implementation file.
26 
28  : sensorPose(),
29  originalReceivedTimestamp(INVALID_TIMESTAMP),
30  has_satellite_timestamp(false),
31  messages(),
32  has_GGA_datum(messages),
33  has_RMC_datum(messages),
34  has_PZS_datum(messages),
35  has_SATS_datum(messages)
36 {
37 }
38 
39 void CObservationGPS::swap(CObservationGPS& o)
40 {
41  std::swap(timestamp, o.timestamp);
42  std::swap(originalReceivedTimestamp, o.originalReceivedTimestamp);
43  std::swap(has_satellite_timestamp, o.has_satellite_timestamp);
44  std::swap(sensorLabel, o.sensorLabel);
45  std::swap(sensorPose, o.sensorPose);
46  messages.swap(o.messages);
47 }
48 
49 /*---------------------------------------------------------------
50  Implements the writing to a CStream capability of CSerializable objects
51  ---------------------------------------------------------------*/
52 void CObservationGPS::writeToStream(
53  mrpt::utils::CStream& out, int* version) const
54 {
55  if (version)
56  *version = 11;
57  else
58  {
59  out << timestamp << originalReceivedTimestamp << sensorLabel
60  << sensorPose;
61  out << has_satellite_timestamp; // v11
62 
63  const uint32_t nMsgs = messages.size();
64  out << nMsgs;
65  for (message_list_t::const_iterator it = messages.begin();
66  it != messages.end(); ++it)
67  it->second->writeToStream(out);
68  }
69 }
70 
71 /*---------------------------------------------------------------
72  Implements the reading from a CStream capability of CSerializable objects
73  ---------------------------------------------------------------*/
74 void CObservationGPS::readFromStream(mrpt::utils::CStream& in, int version)
75 {
76  this->clear();
77 
78  switch (version)
79  {
80  case 10:
81  case 11:
82  {
83  in >> timestamp >> originalReceivedTimestamp >> sensorLabel >>
84  sensorPose;
85  if (version >= 11)
86  in >> has_satellite_timestamp; // v11
87  else
88  has_satellite_timestamp =
89  (this->timestamp != this->originalReceivedTimestamp);
90 
91  uint32_t nMsgs;
92  in >> nMsgs;
93  for (unsigned i = 0; i < nMsgs; i++)
94  {
95  gnss::gnss_message* msg =
96  gnss::gnss_message::readAndBuildFromStream(in);
97  messages[msg->message_type] = gnss::gnss_message_ptr(msg);
98  }
99  };
100  break;
101 
102  // OLD VERSIONS: Ensure we can load datasets from many years ago
103  // ==========
104  case 0:
105  {
106  bool has_GGA_datum_;
107  in >> has_GGA_datum_;
108  if (has_GGA_datum_)
109  {
111  in.ReadBuffer(&datum->fields, sizeof(datum->fields));
112  messages[gnss::NMEA_GGA] = gnss::gnss_message_ptr(datum);
113  }
114 
115  bool has_RMC_datum_;
116  in >> has_RMC_datum_;
117  if (has_RMC_datum_)
118  {
120  in.ReadBuffer(&datum->fields, sizeof(datum->fields));
121  messages[gnss::NMEA_RMC] = gnss::gnss_message_ptr(datum);
122  }
123  }
124  break;
125  case 1:
126  case 2:
127  case 3:
128  case 4:
129  case 5:
130  case 6:
131  case 7:
132  case 8:
133  case 9:
134  {
135  if (version >= 3)
136  in >> timestamp;
137  else
138  timestamp = INVALID_TIMESTAMP;
139 
140  bool has_GGA_datum_;
141  in >> has_GGA_datum_;
142  if (has_GGA_datum_)
143  {
145  gnss::Message_NMEA_GGA::content_t& GGA_datum = datum.fields;
146 
147  MRPT_READ_POD(in, GGA_datum.UTCTime.hour);
148  MRPT_READ_POD(in, GGA_datum.UTCTime.minute);
149  MRPT_READ_POD(in, GGA_datum.UTCTime.sec);
150  MRPT_READ_POD(in, GGA_datum.latitude_degrees);
151  MRPT_READ_POD(in, GGA_datum.longitude_degrees);
152  MRPT_READ_POD(in, GGA_datum.fix_quality);
153  MRPT_READ_POD(in, GGA_datum.altitude_meters);
154  if (version >= 9)
155  {
156  MRPT_READ_POD(in, GGA_datum.geoidal_distance);
159  }
160  else
161  {
162  GGA_datum.geoidal_distance = 0.0f;
163  GGA_datum.orthometric_altitude = 0.0f;
164  GGA_datum.corrected_orthometric_altitude = 0.0f;
165  }
166 
167  MRPT_READ_POD(in, GGA_datum.satellitesUsed);
168  MRPT_READ_POD(in, GGA_datum.thereis_HDOP);
169  MRPT_READ_POD(in, GGA_datum.HDOP);
170  this->setMsg(datum);
171  }
172 
173  bool has_RMC_datum_;
174  in >> has_RMC_datum_;
175  if (has_RMC_datum_)
176  {
178  gnss::Message_NMEA_RMC::content_t& RMC_datum = datum.fields;
179 
180  MRPT_READ_POD(in, RMC_datum.UTCTime.hour);
181  MRPT_READ_POD(in, RMC_datum.UTCTime.minute);
182  MRPT_READ_POD(in, RMC_datum.UTCTime.sec);
183  MRPT_READ_POD(in, RMC_datum.validity_char);
184  MRPT_READ_POD(in, RMC_datum.latitude_degrees);
185  MRPT_READ_POD(in, RMC_datum.longitude_degrees);
186  MRPT_READ_POD(in, RMC_datum.speed_knots);
187  MRPT_READ_POD(in, RMC_datum.direction_degrees);
188  this->setMsg(datum);
189  }
190  if (version > 1)
191  in >> sensorLabel;
192  else
193  sensorLabel = "";
194  if (version >= 4)
195  in >> sensorPose;
196  else
197  sensorPose.setFromValues(0, 0, 0, 0, 0, 0);
198  if (version >= 5)
199  {
200  bool has_PZS_datum_;
201  in >> has_PZS_datum_;
202  if (has_PZS_datum_)
203  {
204  gnss::Message_TOPCON_PZS* datum =
206  messages[gnss::TOPCON_PZS] = gnss::gnss_message_ptr(datum);
207  gnss::Message_TOPCON_PZS& PZS_datum = *datum;
208 
209  MRPT_READ_POD(in, PZS_datum.latitude_degrees);
210  MRPT_READ_POD(in, PZS_datum.longitude_degrees);
211  MRPT_READ_POD(in, PZS_datum.height_meters);
212  MRPT_READ_POD(in, PZS_datum.RTK_height_meters);
213  MRPT_READ_POD(in, PZS_datum.PSigma);
214  MRPT_READ_POD(in, PZS_datum.angle_transmitter);
215  MRPT_READ_POD(in, PZS_datum.nId);
216  MRPT_READ_POD(in, PZS_datum.Fix);
217  MRPT_READ_POD(in, PZS_datum.TXBattery);
218  MRPT_READ_POD(in, PZS_datum.RXBattery);
219  MRPT_READ_POD(in, PZS_datum.error);
220  // extra data?
221  if (version >= 6)
222  {
223  MRPT_READ_POD(in, PZS_datum.hasCartesianPosVel);
224  MRPT_READ_POD(in, PZS_datum.cartesian_x);
225  MRPT_READ_POD(in, PZS_datum.cartesian_y);
226  MRPT_READ_POD(in, PZS_datum.cartesian_z);
227  MRPT_READ_POD(in, PZS_datum.cartesian_vx);
228  MRPT_READ_POD(in, PZS_datum.cartesian_vy);
229  MRPT_READ_POD(in, PZS_datum.cartesian_vz);
230  MRPT_READ_POD(in, PZS_datum.hasPosCov);
231  MRPT_READ_POD(in, PZS_datum.pos_covariance);
232  MRPT_READ_POD(in, PZS_datum.hasVelCov);
233  MRPT_READ_POD(in, PZS_datum.vel_covariance);
234  MRPT_READ_POD(in, PZS_datum.hasStats);
237  if (version >= 8)
239  else
240  PZS_datum.stats_rtk_fix_progress = 0;
241  }
242  else
243  {
244  PZS_datum.hasCartesianPosVel = PZS_datum.hasPosCov =
245  PZS_datum.hasVelCov = PZS_datum.hasStats = false;
246  }
247  }
248  } // end version >=5
249 
250  // Added in V7:
251  if (version >= 7)
252  {
255  messages[gnss::TOPCON_SATS] = gnss::gnss_message_ptr(datum);
256  gnss::Message_TOPCON_SATS& SATS_datum = *datum;
257  bool has_SATS_datum_;
258  in >> has_SATS_datum_;
259  if (has_SATS_datum_)
260  {
261  MRPT_READ_POD(in, SATS_datum.USIs);
262  MRPT_READ_POD(in, SATS_datum.ELs);
263  MRPT_READ_POD(in, SATS_datum.AZs);
264  }
265  }
266  }
267  break;
268  default:
270  };
271 
272  if (originalReceivedTimestamp == INVALID_TIMESTAMP)
273  originalReceivedTimestamp = timestamp;
274 }
275 
276 /*---------------------------------------------------------------
277  dumpToStream
278  ---------------------------------------------------------------*/
279 void CObservationGPS::dumpToStream(CStream& out) const
280 {
281  out.printf(
282  "\n------------- [CObservationGPS] Dump of %u messages "
283  "-----------------------\n",
284  static_cast<unsigned int>(messages.size()));
285  for (message_list_t::const_iterator it = messages.begin();
286  it != messages.end(); ++it)
287  it->second->dumpToStream(out);
288  out.printf(
289  "-------------- [CObservationGPS] End of dump "
290  "------------------------------\n\n");
291 }
292 
293 void CObservationGPS::dumpToConsole(std::ostream& o) const
294 {
296  this->dumpToStream(memStr);
297  if (memStr.getTotalBytesCount())
298  {
299  o.write(
300  (const char*)memStr.getRawBufferData(),
301  memStr.getTotalBytesCount());
302  }
303 }
304 
305 mrpt::system::TTimeStamp CObservationGPS::getOriginalReceivedTimeStamp() const
306 {
307  return originalReceivedTimestamp;
308 }
309 
311 {
312  messages.clear();
313  timestamp = INVALID_TIMESTAMP;
314  originalReceivedTimestamp = INVALID_TIMESTAMP;
315 }
316 void CObservationGPS::getDescriptionAsText(std::ostream& o) const
317 {
318  CObservation::getDescriptionAsText(o);
319 
320  o << "Timestamp (UTC) of reception at the computer: "
321  << mrpt::system::dateTimeToString(originalReceivedTimestamp) << std::endl;
322  o << " (as time_t): " << std::fixed << std::setprecision(5)
323  << mrpt::system::timestampTotime_t(originalReceivedTimestamp)
324  << std::endl;
325  o << " (as TTimestamp): " << originalReceivedTimestamp << std::endl;
326 
327  o << "Sensor position on the robot/vehicle: " << sensorPose << std::endl;
328 
329  this->dumpToConsole(o);
330 }
331 
332 bool CObservationGPS::hasMsgType(const gnss::gnss_message_type_t type_id) const
333 {
334  return messages.find(type_id) != messages.end();
335 }
336 
337 mrpt::obs::gnss::gnss_message* CObservationGPS::getMsgByType(
338  const gnss::gnss_message_type_t type_id)
339 {
340  message_list_t::iterator it = messages.find(type_id);
341  ASSERTMSG_(
342  it != messages.end(), mrpt::format(
343  "[CObservationGPS::getMsgByType] Cannot find "
344  "any observation of type `%u`",
345  static_cast<unsigned int>(type_id)));
346  return it->second.get();
347 }
348 /** \overload */
349 const mrpt::obs::gnss::gnss_message* CObservationGPS::getMsgByType(
350  const gnss::gnss_message_type_t type_id) const
351 {
352  message_list_t::const_iterator it = messages.find(type_id);
353  ASSERTMSG_(
354  it != messages.end(), mrpt::format(
355  "[CObservationGPS::getMsgByType] Cannot find "
356  "any observation of type `%u`",
357  static_cast<unsigned int>(type_id)));
358  return it->second.get();
359 }
360 
361 // From: http://gnsstk.sourceforge.net/time__conversion_8c-source.html
362 #define TIMECONV_JULIAN_DATE_START_OF_GPS_TIME (2444244.5) // [days]
364  const unsigned short gps_week, const double gps_tow,
365  const unsigned int utc_offset, double* julian_date)
366 {
367  if (gps_tow < 0.0 || gps_tow > 604800.0) return false;
368  // GPS time is ahead of UTC time and Julian time by the UTC offset
369  *julian_date = (gps_week + (gps_tow - utc_offset) / 604800.0) * 7.0 +
371  return true;
372 }
373 
374 bool TIMECONV_IsALeapYear(const unsigned short year)
375 {
376  bool is_a_leap_year = false;
377  if ((year % 4) == 0)
378  {
379  is_a_leap_year = true;
380  if ((year % 100) == 0)
381  {
382  if ((year % 400) == 0)
383  is_a_leap_year = true;
384  else
385  is_a_leap_year = false;
386  }
387  }
388  return is_a_leap_year;
389 }
390 
392  /** Universal Time Coordinated [year] */
393  const unsigned short year,
394  /** Universal Time Coordinated [1-12 months] */
395  const unsigned char month,
396  /** Days in the specified month [1-28|29|30|31 days] */
397  unsigned char* days_in_month)
398 {
399  unsigned char utmp = 0;
400  bool is_a_leapyear = TIMECONV_IsALeapYear(year);
401 
402  switch (month)
403  {
404  case 1:
405  utmp = 31;
406  break;
407  case 2:
408  if (is_a_leapyear)
409  {
410  utmp = 29;
411  }
412  else
413  {
414  utmp = 28;
415  }
416  break;
417  case 3:
418  utmp = 31;
419  break;
420  case 4:
421  utmp = 30;
422  break;
423  case 5:
424  utmp = 31;
425  break;
426  case 6:
427  utmp = 30;
428  break;
429  case 7:
430  utmp = 31;
431  break;
432  case 8:
433  utmp = 31;
434  break;
435  case 9:
436  utmp = 30;
437  break;
438  case 10:
439  utmp = 31;
440  break;
441  case 11:
442  utmp = 30;
443  break;
444  case 12:
445  utmp = 31;
446  break;
447  default:
448  return false;
449  break;
450  }
451  *days_in_month = utmp;
452  return true;
453 }
454 /** Number of days since noon Universal Time Jan 1, 4713 BCE (Julian calendar)
455  * [days] */
457  const double julian_date, mrpt::system::TTimeParts& utc)
458 {
459  int a, b, c, d, e; // temporary values
460 
461  unsigned short year;
462  unsigned char month;
463  unsigned char day;
464  unsigned char hour;
465  unsigned char minute;
466  unsigned char days_in_month = 0;
467  double td; // temporary double
468  double seconds;
469  bool result;
470 
471  // Check the input.
472  if (julian_date < 0.0) return false;
473 
474  a = (int)(julian_date + 0.5);
475  b = a + 1537;
476  c = (int)(((double)b - 122.1) / 365.25);
477  d = (int)(365.25 * c);
478  e = (int)(((double)(b - d)) / 30.6001);
479 
480  td = b - d - (int)(30.6001 * e) + fmod(julian_date + 0.5, 1.0); // [days]
481  day = (unsigned char)td;
482  td -= day;
483  td *= 24.0; // [hours]
484  hour = (unsigned char)td;
485  td -= hour;
486  td *= 60.0; // [minutes]
487  minute = (unsigned char)td;
488  td -= minute;
489  td *= 60.0; // [s]
490  seconds = td;
491  month = (unsigned char)(e - 1 - 12 * (int)(e / 14));
492  year = (unsigned short)(c - 4715 - (int)((7.0 + (double)month) / 10.0));
493  // check for rollover issues
494  if (seconds >= 60.0)
495  {
496  seconds -= 60.0;
497  minute++;
498  if (minute >= 60)
499  {
500  minute -= 60;
501  hour++;
502  if (hour >= 24)
503  {
504  hour -= 24;
505  day++;
507  year, month, &days_in_month);
508  if (result == false) return false;
509  if (day > days_in_month)
510  {
511  day = 1;
512  month++;
513  if (month > 12)
514  {
515  month = 1;
516  year++;
517  }
518  }
519  }
520  }
521  }
522 
523  utc.year = year;
524  utc.month = month;
525  utc.day = day;
526  utc.hour = hour;
527  utc.minute = minute;
528  utc.second = seconds;
529  return true;
530 }
531 
532 bool CObservationGPS::GPS_time_to_UTC(
533  uint16_t gps_week, double gps_sec, const int leap_seconds_count,
534  mrpt::system::TTimeStamp& utc_out)
535 {
537  if (!GPS_time_to_UTC(gps_week, gps_sec, leap_seconds_count, tim))
538  return false;
540  return true;
541 }
542 
543 bool CObservationGPS::GPS_time_to_UTC(
544  uint16_t gps_week, double gps_sec, const int leap_seconds_count,
545  mrpt::system::TTimeParts& utc_out)
546 {
547  double julian_date = 0.0;
548  if (gps_sec < 0.0 || gps_sec > 604800.0) return false;
550  gps_week, gps_sec, leap_seconds_count, &julian_date))
551  return false;
552  if (!TIMECONV_GetUTCTimeFromJulianDate(julian_date, utc_out)) return false;
553  return true;
554 }
uint64_t TTimeStamp
A system independent time type, it holds the the number of 100-nanosecond intervals since January 1...
Definition: datetime.h:32
double angle_transmitter
Vertical angle of N-beam.
uint8_t stats_rtk_fix_progress
[0,100] %, only in modes other than RTK FIXED.
uint8_t fix_quality
NMEA standard values: 0 = invalid, 1 = GPS fix (SPS), 2 = DGPS fix, 3 = PPS fix, 4 = Real Time Kinema...
double height_meters
ellipsoidal height from N-beam [m] perhaps weighted with regular gps
content_t fields
Message content, accesible by individual fields.
double longitude_degrees
The measured longitude, in degrees (East:+ , West:-)
Classes for serialization, sockets, ini-file manipulation, streams, list of properties-values, timewatch, extensions to STL.
mrpt::vector_byte USIs
The list of USI (Universal Sat ID) for the detected sats (See GRIL Manual, pag 4-31).
unsigned __int16 uint16_t
Definition: rptypes.h:44
double latitude_degrees
The measured latitude, in degrees (North:+ , South:-)
TopCon mmGPS devices: SATS, a generic structure for statistics about tracked satelites and their posi...
mrpt::math::CMatrixFloat44 vel_covariance
Only if hasPosCov is true.
#define IMPLEMENTS_SERIALIZABLE(class_name, base, NameSpace)
This must be inserted in all CSerializable classes implementation files.
mrpt::system::TTimeStamp originalReceivedTimestamp
The local computer-based timestamp based on the reception of the message in the computer.
gnss_message_type_t
List of all known GNSS message types.
message_list_t messages
The main piece of data in this class: a list of GNNS messages.
mrpt::system::TTimeStamp buildTimestampFromParts(const mrpt::system::TTimeParts &p)
Builds a timestamp from the parts (Parts are in UTC)
Definition: datetime.cpp:127
Scalar * iterator
Definition: eigen_plugins.h:26
uint32_t satellitesUsed
The number of satelites used to compute this estimation.
STL namespace.
bool TIMECONV_GetJulianDateFromGPSTime(const unsigned short gps_week, const double gps_tow, const unsigned int utc_offset, double *julian_date)
bool TIMECONV_IsALeapYear(const unsigned short year)
const Scalar * const_iterator
Definition: eigen_plugins.h:27
GPS datum for TopCon&#39;s mmGPS devices: PZS.
int8_t validity_char
This will be: &#39;A&#39;=OK or &#39;V&#39;=void.
UTC_time UTCTime
The GPS sensor measured timestamp (in UTC time)
void clear()
Clear the contents of this container.
Definition: ts_hash_map.h:189
double latitude_degrees
The measured latitude, in degrees (North:+ , South:-)
uint8_t nId
ID of the transmitter [1-4], 0 if none.
double orthometric_altitude
The measured orthometric altitude, in meters (A)+(B).
bool hasCartesianPosVel
system error indicator
double altitude_meters
The measured altitude, in meters (A).
This base class is used to provide a unified interface to files,memory buffers,..Please see the deriv...
Definition: CStream.h:41
bool thereis_HDOP
This states whether to take into account the value in the HDOP field.
This base provides a set of functions for maths stuff.
Definition: CArrayNumeric.h:19
double corrected_orthometric_altitude
The corrected (only for TopCon mmGPS) orthometric altitude, in meters mmGPS(A+B). ...
mrpt::math::CMatrixFloat44 pos_covariance
Only if hasPosCov is true.
bool TIMECONV_GetNumberOfDaysInMonth(const unsigned short year, const unsigned char month, unsigned char *days_in_month)
This CStream derived class allow using a memory buffer as a CStream.
Definition: CMemoryStream.h:27
const GLubyte * c
Definition: glext.h:6313
#define MRPT_THROW_UNKNOWN_SERIALIZATION_VERSION(__V)
For use in CSerializable implementations.
The parts of a date/time (it&#39;s like the standard &#39;tm&#39; but with fractions of seconds).
Definition: datetime.h:38
float HDOP
The HDOP (Horizontal Dilution of Precision) as returned by the sensor.
uint8_t day
Month (1-12)
Definition: datetime.h:42
double longitude_degrees
The measured longitude, in degrees (East:+ , West:-)
This namespace contains representation of robot actions and observations.
std::string format(const char *fmt,...) MRPT_printf_format_check(1
A std::string version of C sprintf.
Definition: format.cpp:19
GLubyte GLubyte b
Definition: glext.h:6279
bool has_satellite_timestamp
If true, CObservation::timestamp has been generated from accurate satellite clock.
gnss_message_type_t message_type
Type of GNSS message.
uint8_t RXBattery
battery level on receiver
#define INVALID_TIMESTAMP
Represents an invalid timestamp, where applicable.
Definition: datetime.h:16
mrpt::vector_signed_byte ELs
Elevation (in degrees, 0-90) for each satellite in USIs.
double second
Minute (0-59)
Definition: datetime.h:45
double cartesian_x
Only if hasCartesianPosVel is true.
void * getRawBufferData()
Method for getting a pointer to the raw stored data.
mrpt::vector_signed_word AZs
Azimuth (in degrees, 0-360) for each satellite in USIs.
double geoidal_distance
Undulation: Difference between the measured altitude and the geoid, in meters (B).
std::string sensorLabel
An arbitrary label that can be used to identify the sensor.
Definition: CObservation.h:60
bool TIMECONV_GetUTCTimeFromJulianDate(const double julian_date, mrpt::system::TTimeParts &utc)
Number of days since noon Universal Time Jan 1, 4713 BCE (Julian calendar) [days].
This is the global namespace for all Mobile Robot Programming Toolkit (MRPT) libraries.
mrpt::system::TTimeStamp timestamp
The associated UTC time-stamp.
Definition: CObservation.h:58
uint8_t minute
Hour (0-23)
Definition: datetime.h:44
mrpt::poses::CPose3D sensorPose
The sensor pose on the robot/vehicle.
Declares a class that represents any robot&#39;s observation.
Definition: CObservation.h:41
Pure virtual base for all message types.
std::string dateTimeToString(const mrpt::system::TTimeStamp t)
Convert a timestamp into this textual form (UTC time): YEAR/MONTH/DAY,HH:MM:SS.MMM.
Definition: datetime.cpp:247
This file implements matrix/vector text and binary serialization.
double direction_degrees
Measured speed direction (in degrees)
#define MRPT_READ_POD(_STREAM, _VARIABLE)
Definition: CStream.h:453
GLuint in
Definition: glext.h:7274
content_t fields
Message content, accesible by individual fields.
uint8_t month
The year.
Definition: datetime.h:41
double latitude_degrees
The measured latitude, in degrees (North:+ , South:-)
uint8_t hour
Day (1-31)
Definition: datetime.h:43
#define TIMECONV_JULIAN_DATE_START_OF_GPS_TIME
uint8_t TXBattery
battery level on transmitter
double cartesian_vx
Only if hasCartesianPosVel is true.
uint64_t getTotalBytesCount() override
Returns the total size of the internal buffer.
This class stores messages from GNSS or GNSS+IMU devices, from consumer-grade inexpensive GPS receive...
unsigned __int32 uint32_t
Definition: rptypes.h:47
double RTK_height_meters
ellipsoidal height [m] without N-beam correction
#define ASSERTMSG_(f, __ERROR_MSG)
GLubyte GLubyte GLubyte a
Definition: glext.h:6279
double timestampTotime_t(const mrpt::system::TTimeStamp t)
Transform from TTimeStamp to standard "time_t" (actually a double number, it can contain fractions of...
Definition: datetime.cpp:55
virtual int printf(const char *fmt,...) MRPT_printf_format_check(2
Writes a string to the stream in a textual form.
Definition: CStream.cpp:597
UTC_time UTCTime
The GPS sensor measured timestamp (in UTC time)
A smart pointer to a GNSS message.
double longitude_degrees
The measured longitude, in degrees (East:+ , West:-)



Page generated by Doxygen 1.8.14 for MRPT 1.9.9 Git: ae4571287 Thu Nov 23 00:06:53 2017 +0100 at dom oct 27 23:51:55 CET 2019