igs_satellite_metadata.cpp
Go to the documentation of this file.
1 // SPDX-License-Identifier: BSD-3-Clause
2 // SPDX-FileCopyrightText: Czech Technical University in Prague
3 
4 #include <iostream>
5 #include <limits>
6 #include <list>
7 #include <string>
8 #include <unordered_map>
9 #include <unordered_set>
10 #include <utility>
11 #include CXX_FILESYSTEM_INCLUDE
12 
13 #include <gnsstk/FFData.hpp>
14 #include <gnsstk/SinexStream.hpp> // Has to be before SinexData include
15 #include <gnsstk/SinexData.hpp>
16 #include <gnsstk/SinexTypes.hpp>
17 #include <gnsstk/SinexBlock.hpp>
18 #include <gnsstk/YDSTime.hpp>
19 #include <yaml-cpp/yaml.h>
20 
23 #include <gnss_info/cache.h>
25 #include <gnss_info_msgs/Enums.h>
26 #include <gnss_info_msgs/SatelliteInfo.h>
28 #include <gnsstk_ros/time.h>
29 #include <ros/ros.h>
30 #include <ros/package.h>
31 
32 namespace fs = CXX_FILESYSTEM_NAMESPACE;
33 
34 namespace gnss_info
35 {
36 
37 std::string longSinexTime(const gnsstk::Sinex::Time& t)
38 {
39  if (t.year > 50)
40  return "19" + static_cast<std::string>(t);
41  return "20" + static_cast<std::string>(t);
42 }
43 
45 {
46  static const std::string BLOCK_TITLE;
47  static const size_t MIN_LINE_LEN = 40;
48  static const size_t MAX_LINE_LEN = 80;
49 
50  std::string svn;
51  std::string cosparID;
52  uint32_t satcatID {0u};
53  std::string block;
54  std::string comment;
55 
56  SatelliteIdentifier() = default;
57 
58  explicit SatelliteIdentifier(const std::string& line, size_t num = 0)
59  {
60  *this = line;
61  }
62 
63  void dump(std::ostream& s) const
64  {
65  s << BLOCK_TITLE << " :" << std::endl;
66  s << " svn=" << this->svn << std::endl;
67  s << " cosparID=" << this->cosparID << std::endl;
68  s << " satcatID=" << this->satcatID << std::endl;
69  s << " block=" << this->block << std::endl;
70  s << " comment=" << this->comment << std::endl;
71  }
72 
73  operator std::string() const override
74  {
75  try
76  {
77  std::ostringstream ss;
79  ss << gnsstk::Sinex::formatStr(this->svn, 4);
80  ss << ' ' << gnsstk::Sinex::formatStr(this->cosparID, 9);
81  ss << " " << gnsstk::Sinex::formatStr(std::to_string(this->satcatID), 5);
82  ss << ' ' << gnsstk::Sinex::formatStr(this->block, 15);
83  ss << ' ' << gnsstk::Sinex::formatStr(this->comment, 41);
84  return ss.str();
85  }
86  catch (gnsstk::Exception& exc)
87  {
88  GNSSTK_RETHROW(exc);
89  }
90  }
91 
92  void operator=(const std::string& line) override
93  {
94  static int FIELD_DIVS[] = {0, 5, 15, 22, 38, -1};
95  try
96  {
98  this->svn = line.substr(1, 4);
99  this->cosparID = line.substr(6, 9);
100  this->satcatID = gnsstk::StringUtils::asUnsigned(line.substr(17, 5));
101  this->block = line.substr(23, 15);
102  while (!this->block.empty() && this->block.back() == ' ')
103  cras::stripTrailing(this->block, ' ');
104  this->comment = line.substr(39, 41);
105  }
106  catch (gnsstk::Exception& exc)
107  {
108  GNSSTK_RETHROW(exc);
109  }
110  }
111 };
112 const std::string SatelliteIdentifier::BLOCK_TITLE {"SATELLITE/IDENTIFIER"}; // NOLINT(runtime/string)
113 
115 {
116  static const std::string BLOCK_TITLE;
117  static constexpr size_t MIN_LINE_LEN = 39;
118  static constexpr size_t MAX_LINE_LEN = 80;
119 
120  std::string svn;
123  std::string prn;
124  std::string comment;
125 
126  SatellitePRN() = default;
127 
128  explicit SatellitePRN(const std::string& line, size_t num = 0)
129  {
130  *this = line;
131  }
132 
133  void dump(std::ostream& s) const
134  {
135  s << BLOCK_TITLE << " :" << std::endl;
136  s << " svn=" << this->svn << std::endl;
137  s << " validFrom=" << static_cast<std::string>(this->validFrom) << std::endl;
138  s << " validTo=" << static_cast<std::string>(this->validTo) << std::endl;
139  s << " PRN=" << this->prn << std::endl;
140  s << " comment=" << this->comment << std::endl;
141  }
142 
143  operator std::string() const override
144  {
145  try
146  {
147  std::ostringstream ss;
149  ss << gnsstk::Sinex::formatStr(this->svn, 4);
150  ss << ' ' << longSinexTime(this->validFrom);
151  ss << ' ' << longSinexTime(this->validTo);
152  ss << ' ' << gnsstk::Sinex::formatStr(this->prn, 3);
153  ss << ' ' << gnsstk::Sinex::formatStr(this->comment, 40);
154  return ss.str();
155  }
156  catch (gnsstk::Exception& exc)
157  {
158  GNSSTK_RETHROW(exc);
159  }
160  }
161 
162  void operator=(const std::string& line) override
163  {
164  static int FIELD_DIVS[] = {0, 5, 20, 35, -1};
165  try
166  {
168  this->svn = line.substr(1, 4);
169  this->validFrom = line.substr(8, 12);
170  this->validTo = line.substr(23, 12);
171  this->prn = line.substr(36, 3);
172  if (line.length() > 40)
173  this->comment = line.substr(40, 40);
174  }
175  catch (gnsstk::Exception& exc)
176  {
177  GNSSTK_RETHROW(exc);
178  }
179  }
180 };
181 const std::string SatellitePRN::BLOCK_TITLE {"SATELLITE/PRN"}; // NOLINT(runtime/string)
182 
184 {
185  static const std::string BLOCK_TITLE;
186  static constexpr size_t MIN_LINE_LEN = 39;
187  static constexpr size_t MAX_LINE_LEN = 80;
188 
189  std::string svn;
192  int16_t channel {0};
193  std::string comment;
194 
195  SatelliteFrequencyChannel() = default;
196 
197  explicit SatelliteFrequencyChannel(const std::string& line, size_t num = 0)
198  {
199  *this = line;
200  }
201 
202  void dump(std::ostream& s) const
203  {
204  s << BLOCK_TITLE << " :" << std::endl;
205  s << " svn=" << this->svn << std::endl;
206  s << " validFrom=" << static_cast<std::string>(this->validFrom) << std::endl;
207  s << " validTo=" << static_cast<std::string>(this->validTo) << std::endl;
208  s << " channel=" << this->channel << std::endl;
209  s << " comment=" << this->comment << std::endl;
210  }
211 
212  operator std::string() const override
213  {
214  try
215  {
216  std::ostringstream ss;
218  ss << gnsstk::Sinex::formatStr(this->svn, 4);
219  ss << ' ' << longSinexTime(this->validFrom);
220  ss << ' ' << longSinexTime(this->validTo);
221  ss << ' ' << gnsstk::Sinex::formatInt(this->channel, 3);
222  ss << ' ' << gnsstk::Sinex::formatStr(this->comment, 40);
223  return ss.str();
224  }
225  catch (gnsstk::Exception& exc)
226  {
227  GNSSTK_RETHROW(exc);
228  }
229  }
230 
231  void operator=(const std::string& line) override
232  {
233  static int FIELD_DIVS[] = {0, 5, 20, 35, 39, -1};
234  try
235  {
237  this->svn = line.substr(1, 4);
238  this->validFrom = line.substr(8, 12);
239  this->validTo = line.substr(23, 12);
240  this->channel = static_cast<int16_t>(gnsstk::StringUtils::asInt(line.substr(36, 3)));
241  this->comment = line.substr(40, 40);
242  }
243  catch (gnsstk::Exception& exc)
244  {
245  GNSSTK_RETHROW(exc);
246  }
247  }
248 };
249 const std::string SatelliteFrequencyChannel::BLOCK_TITLE {"SATELLITE/FREQUENCY_CHANNEL"}; // NOLINT(runtime/string)
250 
252 {
253  static const std::string BLOCK_TITLE;
254 
255  IgnoredBlock() = default;
256 
257  explicit IgnoredBlock(const std::string&, size_t = 0)
258  {
259  }
260 
261  void dump(std::ostream&) const
262  {
263  }
264 
265  operator std::string() const override
266  {
267  return "";
268  }
269 
270  void operator=(const std::string&) override
271  {
272  }
273 };
274 const std::string IgnoredBlock::BLOCK_TITLE {"IGNORED/BLOCK"}; // NOLINT(runtime/string)
275 
279 template<typename T>
281 {
282 protected:
283  size_t getBlock(gnsstk::Sinex::Stream& s) override
284  {
285  size_t lineNum {0u};
286  char c;
287  while (s.good())
288  {
289  c = s.get();
290  if (s.good() )
291  {
292  if (c == gnsstk::Sinex::DATA_START)
293  {
294  std::string line;
295  s.formattedGetLine(line);
296  try
297  {
298  this->dataVec.push_back(T(line.insert(0u, 1u, c), lineNum));
299  }
300  catch (gnsstk::Exception& exc)
301  {
302  gnsstk::FFStreamError err(exc);
303  GNSSTK_THROW(err);
304  }
305  ++lineNum;
306  }
307  // This branch adds the support for in-block comments
308  else if (c == gnsstk::Sinex::COMMENT_START)
309  {
310  std::string line;
311  s.formattedGetLine(line);
312  ++lineNum;
313  }
314  else
315  {
316  s.putback(c);
317  break;
318  }
319  }
320  }
321  return lineNum;
322  }
323 
324 public:
326 };
327 
332 {
333 public:
335  {
337  auto& factory = gnsstk::Sinex::Data::blockFactory;
343  factory["SATELLITE/MASS"] = IgsSinexBlock<IgnoredBlock>::create;
344  factory["SATELLITE/COM"] = IgsSinexBlock<IgnoredBlock>::create;
345  factory["SATELLITE/ECCENTRICITY"] = IgsSinexBlock<IgnoredBlock>::create;
346  factory["SATELLITE/TX_POWER"] = IgsSinexBlock<IgnoredBlock>::create;
347  }
348 };
349 
351 {
352  std::string name;
353  double frequency {std::numeric_limits<double>::quiet_NaN()};
354  double channelStep {0.0};
355 };
356 
357 struct GNSSBlock
358 {
359  std::string name;
360  std::list<GNSSSignal> signals;
361 };
362 
367 {
368  std::string url {};
369  std::string cacheFile {};
372 
373  std::unordered_map<std::string, uint32_t> svnToSatcat;
374  std::unordered_map<uint32_t, std::string> satcatToSvn;
375  std::unordered_map<std::string, SatelliteIdentifier> svnToSatInfo;
378  std::unordered_map<std::string, std::list<SatellitePRN>> svnToSatPRN;
380  std::unordered_map<std::string, std::list<SatelliteFrequencyChannel>> svnToSatChannel;
382  std::unordered_map<std::string, GNSSBlock> blockSignals;
383 
388  bool downloadMetadata() const;
389 
394  bool loadSignals();
395 };
396 
398 {
399  ROS_INFO("Downloading satellite metadata from %s.", this->url.c_str());
400  auto maybeReadBuffer = download(this->url);
401  if (!maybeReadBuffer.has_value())
402  {
403  ROS_ERROR("%s", maybeReadBuffer.error().c_str());
404  return false;
405  }
406 
407  auto& readBuffer = *maybeReadBuffer;
408  std::ofstream outFile(this->cacheFile.c_str());
409  for (std::string line; std::getline(readBuffer, line);)
410  {
411  // gnsstk::Sinex::SinexData has problems with trailing spaces, so we remove them
412  cras::stripTrailing(line, '\r');
413  if (line.find_first_not_of(' ') != std::string::npos)
414  while (!line.empty() && line.back() == ' ')
415  cras::stripTrailing(line, ' ');
416  // gnsstk::Sinex::SinexData has problems with UTF-8 characters in comments, so we remove them.
417  auto printable {true};
418  for (const auto c : line)
419  {
420  if (!std::isprint(c))
421  {
422  printable = false;
423  break;
424  }
425  }
426  if (printable)
427  outFile << line << "\r\n";
428  }
429  ROS_INFO("Saved satellite metadata to %s.", this->cacheFile.c_str());
430 
431  return true;
432 }
433 
435 {
436  if (!this->blockSignals.empty())
437  return true;
438 
439  const auto defaultDir = ros::package::getPath(ROS_PACKAGE_NAME) + "/data/constellations";
440  const auto signalsDirEnv = std::getenv("GNSS_INFO_SIGNALS_PATH");
441  const auto dir = (signalsDirEnv == nullptr) ? defaultDir : signalsDirEnv;
442 
443  std::unordered_map<std::string, GNSSSignal> signals;
444 
445  for (const auto& d : cras::split(dir, ":"))
446  {
447  for (fs::directory_iterator it(d); it != fs::directory_iterator(); ++it)
448  {
449  if (!fs::is_regular_file(*it))
450  continue;
451  const auto path = it->path().string();
452  if (!cras::endsWith(path, ".yaml"))
453  continue;
454  try
455  {
456  auto yaml = YAML::LoadFile(path);
457  if (yaml["signals"] && yaml["signals"].IsMap())
458  {
459  for (const auto& constellationAndData : yaml["signals"])
460  {
461  if (!constellationAndData.second.IsMap())
462  continue;
463  for (const auto& s : constellationAndData.second)
464  {
465  if (!s.second.IsMap() || !s.first.IsScalar() || !s.second["frequency"])
466  continue;
467  const auto signalName = s.first.as<std::string>();
468  GNSSSignal signal{signalName, 0.0, 0.0};
469  signal.frequency = s.second["frequency"].as<double>();
470  if (s.second["channel_step"])
471  signal.channelStep = s.second["channel_step"].as<double>();
472  signals[signalName] = signal;
473  }
474  }
475  }
476  if (yaml["blocks"] && yaml["blocks"].IsMap())
477  {
478  for (const auto& constellationAndData : yaml["blocks"])
479  {
480  if (!constellationAndData.second.IsMap())
481  continue;
482  for (const auto& s : constellationAndData.second)
483  {
484  if (!s.second.IsMap() || !s.first.IsScalar() || !s.second["signals"] ||
485  !s.second["signals"].IsSequence())
486  {
487  continue;
488  }
489  const auto blockName = s.first.as<std::string>();
490  GNSSBlock block{blockName, {}};
491  for (const auto& signalName : s.second["signals"])
492  {
493  if (!signalName.IsScalar())
494  continue;
495  const auto name = signalName.as<std::string>();
496  if (signals.find(name) == signals.end())
497  continue;
498  block.signals.push_back(signals[name]);
499  }
500  this->blockSignals[blockName] = block;
501  }
502  }
503  }
504  }
505  catch (const YAML::Exception& e)
506  {
507  ROS_ERROR("Error loading YAML file %s: %s.", path.c_str(), e.what());
508  }
509  }
510  }
511  return !signals.empty();
512 }
513 
515 {
516  this->data->cacheFile = getCacheDir() + "/igs_satellite_metadata.snx";
517 
518  this->data->url = "https://files.igs.org/pub/station/general/igs_satellite_metadata.snx";
519  const auto envUrl = std::getenv("GNSS_INFO_IGS_METADATA_URL");
520  if (envUrl != nullptr)
521  this->data->url = envUrl;
522 }
523 
525 
526 void IGSSatelliteMetadata::setMetadataURL(const std::string& url)
527 {
528  this->data->url = url;
529 }
530 
531 void IGSSatelliteMetadata::setCacheFile(const std::string& file)
532 {
533  this->data->cacheFile = file;
534 }
535 
537 {
538  this->data->cacheValidity = validity;
539 }
540 
542 {
543  if (!isCacheFileValid(this->data->cacheFile, this->data->cacheValidity) && !this->data->downloadMetadata())
544  return false;
545 
546  IgsSinexData igsSinexData;
547  try
548  {
549  gnsstk::Sinex::Stream input(this->data->cacheFile.c_str());
550  input.exceptions(std::fstream::eofbit | std::fstream::failbit);
551  input >> igsSinexData;
552  }
553  catch (const gnsstk::Exception& e)
554  {
555  ROS_ERROR("Error loading satellite metadata from %s: %s.", this->data->cacheFile.c_str(), e.what().c_str());
556  return false;
557  }
558 
559  for (const auto& block : igsSinexData.blocks)
560  {
561  if (dynamic_cast<const gnsstk::Sinex::Block<SatelliteIdentifier>*>(block))
562  {
563  const auto cb = dynamic_cast<const gnsstk::Sinex::Block<SatelliteIdentifier>*>(block);
564  for (const auto& entry : const_cast<gnsstk::Sinex::Block<SatelliteIdentifier>*>(cb)->getData())
565  {
566  this->data->svnToSatcat[entry.svn] = entry.satcatID;
567  this->data->satcatToSvn[entry.satcatID] = entry.svn;
568  this->data->svnToSatInfo[entry.svn] = entry;
569  }
570  }
571  else if (dynamic_cast<const gnsstk::Sinex::Block<SatellitePRN>*>(block))
572  {
573  const auto cb = dynamic_cast<const gnsstk::Sinex::Block<SatellitePRN>*>(block);
574  for (const auto& entry : const_cast<gnsstk::Sinex::Block<SatellitePRN>*>(cb)->getData())
575  {
576  this->data->svnToSatPRN[entry.svn].push_back(entry);
577  }
578  }
579  else if (dynamic_cast<const gnsstk::Sinex::Block<SatelliteFrequencyChannel>*>(block))
580  {
581  const auto cb = dynamic_cast<const gnsstk::Sinex::Block<SatelliteFrequencyChannel>*>(block);
582  for (const auto& entry : const_cast<gnsstk::Sinex::Block<SatelliteFrequencyChannel>*>(cb)->getData())
583  {
584  this->data->svnToSatChannel[entry.svn].push_back(entry);
585  }
586  }
587  }
588 
589  ROS_INFO("Satellite metadata loaded from %s.", this->data->cacheFile.c_str());
590  return true;
591 }
592 
594 {
595  if (t.year == 0 && t.doy == 0 && t.sod == 0) // special meaning of all zeros
596  return ros::Time::MAX;
597  return gnsstk_ros::convert(t);
598 }
599 
600 std::unordered_map<uint32_t, gnss_info_msgs::SatelliteInfo>
601 IGSSatelliteMetadata::getSatellites(const ros::Time& time, const bool onlyActive,
602  const std::unordered_set<std::string>& onlyConstellations,
603  const std::unordered_set<std::string>& onlySignals)
604 {
605  std::unordered_map<uint32_t, gnss_info_msgs::SatelliteInfo> result;
606 
607  for (const auto& [svn, satcatID] : this->data->svnToSatcat)
608  {
609  auto maybeSatellite = this->getSatellite(satcatID, time);
610  if (maybeSatellite && (!onlyActive || maybeSatellite->active))
611  {
612  if (!onlyConstellations.empty())
613  {
614  if (onlyConstellations.find(maybeSatellite->constellation) == onlyConstellations.cend())
615  continue;
616  }
617  if (!onlySignals.empty())
618  {
619  maybeSatellite->signals.erase(std::remove_if(
620  maybeSatellite->signals.begin(), maybeSatellite->signals.end(),
621  [&onlySignals](const gnss_info_msgs::SatelliteSignal& s)
622  {
623  return onlySignals.find(s.name) == onlySignals.cend();
624  }),
625  maybeSatellite->signals.end());
626  if (maybeSatellite->signals.empty())
627  continue;
628  }
629  result[satcatID] = *maybeSatellite;
630  }
631  }
632 
633  return result;
634 }
635 
636 cras::optional<gnss_info_msgs::SatelliteInfo> IGSSatelliteMetadata::getSatellite(
637  const uint32_t& satcatID, const ros::Time& time)
638 {
639  if (this->data->satcatToSvn.find(satcatID) == this->data->satcatToSvn.cend())
640  return cras::nullopt;
641 
642  const auto svn = this->data->satcatToSvn[satcatID];
643  const auto& satinfo = this->data->svnToSatInfo[svn];
644 
645  gnss_info_msgs::SatelliteInfo msg;
646  msg.stamp = time;
647  msg.active = false;
648  msg.satcat_id = satcatID;
649  msg.name = cras::split(satinfo.comment, ";", 1).back();
650  cras::strip(msg.name);
651  const auto maybeConstellation = gnsstk_ros::getRosConstellationFromSVN(svn);
652  msg.constellation = maybeConstellation ? *maybeConstellation : "";
653 
654  // Find PRN valid for the given time
655  for (const auto& prnItem : this->data->svnToSatPRN[svn])
656  {
657  const auto validFrom = sinexTimeToRosTime(prnItem.validFrom);
658  const auto validTo = sinexTimeToRosTime(prnItem.validTo);
659  if (validFrom <= time && time <= validTo)
660  {
661  msg.prn = prnItem.prn;
662  msg.active = true;
663  break;
664  }
665  }
666 
667  // Fill info about transmitted signals.
668  this->data->loadSignals();
669  const auto& blockName = this->data->svnToSatInfo[svn].block;
670  if (this->data->blockSignals.find(blockName) != this->data->blockSignals.cend())
671  {
672  int16_t channel{0};
673  if (msg.constellation == gnss_info_msgs::Enums::CONSTELLATION_GLONASS)
674  {
675  for (const auto& satChannelItem : this->data->svnToSatChannel[svn])
676  {
677  const auto validFrom = sinexTimeToRosTime(satChannelItem.validFrom);
678  const auto validTo = sinexTimeToRosTime(satChannelItem.validTo);
679  if (validFrom <= time && time <= validTo)
680  {
681  channel = satChannelItem.channel;
682  break;
683  }
684  }
685  }
686  for (const auto& signal : this->data->blockSignals[blockName].signals)
687  {
688  gnss_info_msgs::SatelliteSignal sigMsg;
689  sigMsg.constellation = msg.constellation;
690  sigMsg.name = signal.name;
691  sigMsg.frequency = static_cast<float>(signal.frequency + channel * signal.channelStep);
692  msg.signals.push_back(sigMsg);
693  }
694  }
695 
696  return msg;
697 }
698 
699 cras::optional<gnss_info_msgs::SatelliteInfo> IGSSatelliteMetadata::getSatelliteByPRN(
700  const std::string& prn, const ros::Time& time)
701 {
702  for (const auto& [svn, satPRN] : this->data->svnToSatPRN)
703  {
704  for (const auto& prnItem : this->data->svnToSatPRN[svn])
705  {
706  if (prnItem.prn != prn)
707  continue;
708  const auto validFrom = sinexTimeToRosTime(prnItem.validFrom);
709  const auto validTo = sinexTimeToRosTime(prnItem.validTo);
710  if (validFrom <= time && time <= validTo)
711  return this->getSatellite(this->data->svnToSatcat[svn], time);
712  }
713  }
714  return cras::nullopt;
715 }
716 
717 cras::optional<gnss_info_msgs::SatelliteInfo> IGSSatelliteMetadata::getSatelliteByPRN(
718  const int32_t prn, const std::string& constellation, const ros::Time& time)
719 {
720  const auto prnString = gnsstk_ros::prnIntToString(prn, constellation);
721  if (!prnString.has_value() || !prnString->empty())
722  return cras::nullopt;
723 
724  return this->getSatelliteByPRN(*prnString, time);
725 }
726 
727 }
gnss_info::SatelliteFrequencyChannel::SatelliteFrequencyChannel
SatelliteFrequencyChannel()=default
optional.hpp
gnss_info::IgsSinexBlock
Normal gnsstk::Sinex::Block cannot handle comments after block start. This class adds the support.
Definition: igs_satellite_metadata.cpp:280
gnsstk::StringUtils::asInt
long asInt(const std::string &s)
gnss_info::IGSSatelliteMetadataPrivate::url
std::string url
URL to download the metadata from.
Definition: igs_satellite_metadata.cpp:368
gnss_info::SatelliteFrequencyChannel::MAX_LINE_LEN
static constexpr size_t MAX_LINE_LEN
Definition: igs_satellite_metadata.cpp:187
gnss_info::IGSSatelliteMetadata::data
std::unique_ptr< IGSSatelliteMetadataPrivate > data
Private implementation details (PIMPL).
Definition: igs_satellite_metadata.h:119
gnss_info::IgsSinexData::IgsSinexData
IgsSinexData()
Definition: igs_satellite_metadata.cpp:334
gnss_info::IGSSatelliteMetadataPrivate
PIMPL data holder.
Definition: igs_satellite_metadata.cpp:366
msg
msg
gnss_info::SatelliteFrequencyChannel::SatelliteFrequencyChannel
SatelliteFrequencyChannel(const std::string &line, size_t num=0)
Definition: igs_satellite_metadata.cpp:197
ros::package::getPath
ROSLIB_DECL std::string getPath(const std::string &package_name)
gnss_info::IGSSatelliteMetadataPrivate::satcatToSvn
std::unordered_map< uint32_t, std::string > satcatToSvn
Definition: igs_satellite_metadata.cpp:374
gnsstk::Sinex::Data::blocks
Blocks blocks
gnsstk::Sinex::formatStr
std::string formatStr(const std::string &value, size_t width, bool allowBlank)
gnsstk::Sinex::Stream
gnsstk::Sinex::Block< T >::dataVec
std::vector< T > dataVec
gnss_info::SatelliteFrequencyChannel
Definition: igs_satellite_metadata.cpp:183
cras::stripTrailing
void stripTrailing(::std::string &s, const char &c=' ')
gnss_info::SatelliteIdentifier::SatelliteIdentifier
SatelliteIdentifier(const std::string &line, size_t num=0)
Definition: igs_satellite_metadata.cpp:58
gnss_info::SatelliteFrequencyChannel::dump
void dump(std::ostream &s) const
Definition: igs_satellite_metadata.cpp:202
gnsstk::Sinex::Data::blockFactory
static BlockFactory blockFactory
s
XmlRpcServer s
gnss_info::IGSSatelliteMetadata::setMetadataURL
void setMetadataURL(const std::string &url)
Set the URL from which IGS metadata are downloaded.
Definition: igs_satellite_metadata.cpp:526
ros.h
gnss_info::IgsSinexData
Customized Sinex Data reader that can read the almost-SINEX satellite metadata from IGS.
Definition: igs_satellite_metadata.cpp:331
time.h
gnsstk::Sinex::Block
gnss_info::SatellitePRN::validTo
gnsstk::Sinex::Time validTo
Time until which the entry is valid (valid up to now if zero)
Definition: igs_satellite_metadata.cpp:122
gnss_info::IGSSatelliteMetadata::setCacheValidity
void setCacheValidity(const ros::WallDuration &validity)
Set validity period of the cached IGS metadata.
Definition: igs_satellite_metadata.cpp:536
DurationBase< WallDuration >::DAY
static const WallDuration DAY
gnss_info::SatelliteIdentifier::block
std::string block
Block.
Definition: igs_satellite_metadata.cpp:53
gnss_info::IgnoredBlock::BLOCK_TITLE
static const std::string BLOCK_TITLE
Definition: igs_satellite_metadata.cpp:253
gnsstk_ros::convert
gnsstk::Position convert(const geographic_msgs::GeoPoint &position)
gnsstk::Exception::what
std::string what() const
gnss_info::SatellitePRN::BLOCK_TITLE
static const std::string BLOCK_TITLE
Definition: igs_satellite_metadata.cpp:116
cras::endsWith
bool endsWith(const ::std::string &str, const ::std::string &suffix)
gnsstk::Sinex::Data::initBlockFactory
static void initBlockFactory()
printable
std::string printable(const std::string &aStr)
gnss_info::IGSSatelliteMetadataPrivate::blockSignals
std::unordered_map< std::string, GNSSBlock > blockSignals
Maps GNSS block name to all signals transmitted by satellites from the block.
Definition: igs_satellite_metadata.cpp:382
constellations.h
gnss_info::SatelliteIdentifier::SatelliteIdentifier
SatelliteIdentifier()=default
cras::strip
void strip(::std::string &s, const char &c=' ')
gnss_info::IGSSatelliteMetadataPrivate::svnToSatPRN
std::unordered_map< std::string, std::list< SatellitePRN > > svnToSatPRN
Maps SVN to all parsed SATELLITE/PRN block entries related to the SVN.
Definition: igs_satellite_metadata.cpp:378
gnss_info::SatelliteFrequencyChannel::validTo
gnsstk::Sinex::Time validTo
Time until which the entry is valid (valid up to now if zero)
Definition: igs_satellite_metadata.cpp:191
gnss_info::IGSSatelliteMetadataPrivate::cacheFile
std::string cacheFile
Definition: igs_satellite_metadata.cpp:369
gnss_info::IGSSatelliteMetadata::~IGSSatelliteMetadata
virtual ~IGSSatelliteMetadata()
gnss_info::SatellitePRN::MIN_LINE_LEN
static constexpr size_t MIN_LINE_LEN
Definition: igs_satellite_metadata.cpp:117
gnss_info::IGSSatelliteMetadata::IGSSatelliteMetadata
IGSSatelliteMetadata()
Definition: igs_satellite_metadata.cpp:514
gnss_info::SatelliteFrequencyChannel::comment
std::string comment
Comment.
Definition: igs_satellite_metadata.cpp:193
TimeBase< Time, Duration >::MAX
static const Time MAX
gnss_info::GNSSSignal::name
std::string name
Definition: igs_satellite_metadata.cpp:352
data
data
gnss_info::IGSSatelliteMetadataPrivate::downloadMetadata
bool downloadMetadata() const
Download the IGS satellite catalog file to cacheFile.
Definition: igs_satellite_metadata.cpp:397
gnsstk::Exception
gnsstk::Sinex::DataType
gnss_info::SatelliteIdentifier
Definition: igs_satellite_metadata.cpp:44
gnss_info::IgnoredBlock::dump
void dump(std::ostream &) const
Definition: igs_satellite_metadata.cpp:261
gnss_info::GNSSSignal::frequency
double frequency
Definition: igs_satellite_metadata.cpp:353
string_utils.hpp
gnss_info::GNSSSignal
Definition: igs_satellite_metadata.cpp:350
gnss_info::SatellitePRN::validFrom
gnsstk::Sinex::Time validFrom
Time from which the entry is valid.
Definition: igs_satellite_metadata.cpp:121
gnss_info::SatellitePRN::comment
std::string comment
Comment.
Definition: igs_satellite_metadata.cpp:124
gnss_info::SatelliteIdentifier::BLOCK_TITLE
static const std::string BLOCK_TITLE
Definition: igs_satellite_metadata.cpp:46
gnss_info::SatelliteIdentifier::MIN_LINE_LEN
static const size_t MIN_LINE_LEN
Definition: igs_satellite_metadata.cpp:47
gnsstk::Sinex::Block::getData
std::vector< T > & getData()
gnsstk::Sinex::Data
gnss_info::IGSSatelliteMetadataPrivate::cacheValidity
ros::WallDuration cacheValidity
Max age of the cache file. If it is older, it is redownloaded.
Definition: igs_satellite_metadata.cpp:371
gnss_info::SatelliteFrequencyChannel::validFrom
gnsstk::Sinex::Time validFrom
Time from which the entry is valid.
Definition: igs_satellite_metadata.cpp:190
gnss_info::SatelliteFrequencyChannel::channel
int16_t channel
Channel.
Definition: igs_satellite_metadata.cpp:192
gnss_info::IGSSatelliteMetadata::getSatellites
std::unordered_map< uint32_t, gnss_info_msgs::SatelliteInfo > getSatellites(const ros::Time &time, bool onlyActive=true, const std::unordered_set< std::string > &onlyConstellations={}, const std::unordered_set< std::string > &onlySignals={})
Get all known satellites operating at the given time. If load() was not called or returned false,...
Definition: igs_satellite_metadata.cpp:601
gnss_info::isCacheFileValid
bool isCacheFileValid(const std::string &file)
Return whether the given cache file can be used.
Definition: cache.cpp:76
gnss_info::IgsSinexBlock::create
static gnsstk::Sinex::BlockBase * create()
Definition: igs_satellite_metadata.cpp:325
time
time
gnss_info::IGSSatelliteMetadata::getSatelliteByPRN
cras::optional< gnss_info_msgs::SatelliteInfo > getSatelliteByPRN(const std::string &prn, const ros::Time &time)
Get metadata of a satellite at the given time.
Definition: igs_satellite_metadata.cpp:699
err
err
gnss_info::GNSSSignal::channelStep
double channelStep
Definition: igs_satellite_metadata.cpp:354
gnss_info::SatelliteIdentifier::operator=
void operator=(const std::string &line) override
Definition: igs_satellite_metadata.cpp:92
gnss_info::SatellitePRN::SatellitePRN
SatellitePRN()=default
gnss_info::SatelliteIdentifier::MAX_LINE_LEN
static const size_t MAX_LINE_LEN
Definition: igs_satellite_metadata.cpp:48
gnss_info::SatelliteIdentifier::comment
std::string comment
Comment.
Definition: igs_satellite_metadata.cpp:54
d
d
gnss_info::IgnoredBlock::operator=
void operator=(const std::string &) override
Definition: igs_satellite_metadata.cpp:270
cras::split
::std::vector<::std::string > split(const ::std::string &str, const ::std::string &delimiter, int maxSplits=-1)
gnss_info::IgnoredBlock::IgnoredBlock
IgnoredBlock(const std::string &, size_t=0)
Definition: igs_satellite_metadata.cpp:257
gnsstk::Sinex::isValidLineStructure
bool isValidLineStructure(const std::string &line, size_t minLen, size_t maxLen, int divs[], bool toss)
gnsstk_ros::prnIntToString
cras::optional< std::string > prnIntToString(int32_t prn, const std::string &constellation)
gnss_info
Definition: cache.h:15
gnss_info::getCacheDir
std::string getCacheDir()
Return path to a directory where cache files should be stored. Also make sure the directory exists.
Definition: cache.cpp:20
gnss_info::SatellitePRN::operator=
void operator=(const std::string &line) override
Definition: igs_satellite_metadata.cpp:162
gnss_info::IGSSatelliteMetadataPrivate::loadSignals
bool loadSignals()
Load the mappings of available satellite signals from YAML configs into blockSignals.
Definition: igs_satellite_metadata.cpp:434
package.h
GNSSTK_RETHROW
#define GNSSTK_RETHROW(exc)
gnss_info::IGSSatelliteMetadataPrivate::svnToSatcat
std::unordered_map< std::string, uint32_t > svnToSatcat
Maps SVN to Satcat ID.
Definition: igs_satellite_metadata.cpp:373
cache.h
gnss_info::SatelliteIdentifier::cosparID
std::string cosparID
Cospar ID.
Definition: igs_satellite_metadata.cpp:51
gnss_info::IGSSatelliteMetadata::setCacheFile
void setCacheFile(const std::string &file)
Set the cache file into which the IGS metadata are downloaded.
Definition: igs_satellite_metadata.cpp:531
gnss_info::IgnoredBlock::IgnoredBlock
IgnoredBlock()=default
gnss_info::IGSSatelliteMetadata::load
bool load()
Load (and possibly also download) the data.
Definition: igs_satellite_metadata.cpp:541
gnss_info::SatellitePRN::SatellitePRN
SatellitePRN(const std::string &line, size_t num=0)
Definition: igs_satellite_metadata.cpp:128
gnsstk::StringUtils::asUnsigned
unsigned long asUnsigned(const std::string &s)
gnss_info::SatelliteFrequencyChannel::operator=
void operator=(const std::string &line) override
Definition: igs_satellite_metadata.cpp:231
ros::Time
gnss_info::GNSSBlock::signals
std::list< GNSSSignal > signals
Definition: igs_satellite_metadata.cpp:360
gnss_info::IGSSatelliteMetadataPrivate::svnToSatInfo
std::unordered_map< std::string, SatelliteIdentifier > svnToSatInfo
Maps SVN to parsed SATELLITE/IDENTIFIER block entry.
Definition: igs_satellite_metadata.cpp:376
gnsstk::Sinex::FileComment::BLOCK_TITLE
static const std::string BLOCK_TITLE
gnsstk::Sinex::FileReference::BLOCK_TITLE
static const std::string BLOCK_TITLE
gnss_info::SatelliteFrequencyChannel::svn
std::string svn
SVN.
Definition: igs_satellite_metadata.cpp:189
gnss_info::longSinexTime
std::string longSinexTime(const gnsstk::Sinex::Time &t)
Definition: igs_satellite_metadata.cpp:37
gnss_info::download
cras::expected< std::stringstream, std::string > download(const std::string &url, const std::function< void(CURL *)> &curlOptions={})
Download the given URL to a stringstream.
Definition: cache.cpp:50
ROS_ERROR
#define ROS_ERROR(...)
gnss_info::SatelliteIdentifier::svn
std::string svn
SVN.
Definition: igs_satellite_metadata.cpp:50
GNSSTK_THROW
#define GNSSTK_THROW(exc)
gnsstk::Sinex::COMMENT_START
const char COMMENT_START
gnss_info::SatellitePRN
Definition: igs_satellite_metadata.cpp:114
gnss_info::sinexTimeToRosTime
ros::Time sinexTimeToRosTime(const gnsstk::Sinex::Time &t)
Definition: igs_satellite_metadata.cpp:593
gnss_info::GNSSBlock
Definition: igs_satellite_metadata.cpp:357
gnss_info::IGSSatelliteMetadata::getSatellite
cras::optional< gnss_info_msgs::SatelliteInfo > getSatellite(const uint32_t &satcatID, const ros::Time &time)
Get metadata of a satellite at the given time.
Definition: igs_satellite_metadata.cpp:636
gnsstk::Sinex::formatInt
std::string formatInt(long value, size_t width)
gnss_info::IGSSatelliteMetadataPrivate::svnToSatChannel
std::unordered_map< std::string, std::list< SatelliteFrequencyChannel > > svnToSatChannel
Maps SVN to all parsed SATELLITE/FREQUENCY_CHANNEL block entries related to the SVN (GLONASS only).
Definition: igs_satellite_metadata.cpp:380
gnss_info::SatelliteFrequencyChannel::BLOCK_TITLE
static const std::string BLOCK_TITLE
Definition: igs_satellite_metadata.cpp:185
gnss_info::SatellitePRN::MAX_LINE_LEN
static constexpr size_t MAX_LINE_LEN
Definition: igs_satellite_metadata.cpp:118
ros::WallDuration
gnss_info::SatellitePRN::svn
std::string svn
SVN.
Definition: igs_satellite_metadata.cpp:120
gnsstk::Sinex::BlockBase
gnss_info::SatelliteFrequencyChannel::MIN_LINE_LEN
static constexpr size_t MIN_LINE_LEN
Definition: igs_satellite_metadata.cpp:186
ROS_INFO
#define ROS_INFO(...)
gnss_info::SatellitePRN::dump
void dump(std::ostream &s) const
Definition: igs_satellite_metadata.cpp:133
gnss_info::SatelliteIdentifier::satcatID
uint32_t satcatID
Satcat ID.
Definition: igs_satellite_metadata.cpp:52
gnss_info::GNSSBlock::name
std::string name
Definition: igs_satellite_metadata.cpp:359
gnss_info::IgnoredBlock
Definition: igs_satellite_metadata.cpp:251
gnss_info::SatelliteIdentifier::dump
void dump(std::ostream &s) const
Definition: igs_satellite_metadata.cpp:63
gnss_info::SatellitePRN::prn
std::string prn
PRN.
Definition: igs_satellite_metadata.cpp:123
gnsstk::Sinex::Time
gnss_info::IgsSinexBlock::getBlock
size_t getBlock(gnsstk::Sinex::Stream &s) override
Definition: igs_satellite_metadata.cpp:283
gnsstk::Sinex::DATA_START
const char DATA_START
igs_satellite_metadata.h
t
geometry_msgs::TransformStamped t
gnsstk_ros::getRosConstellationFromSVN
cras::optional< std::string > getRosConstellationFromSVN(const std::string &svn)


gnss_info
Author(s): Martin Pecka
autogenerated on Fri Nov 24 2023 03:50:35