Merge branch 'fix-double-pvt' into next

This commit is contained in:
Carles Fernandez
2026-07-16 15:12:42 +02:00
30 changed files with 826 additions and 588 deletions
+14
View File
@@ -136,6 +136,20 @@ All notable changes to GNSS-SDR will be documented in this file.
### Improvements in Usability:
- A new global parameter `GNSS-SDR.observation_date` allows specifying the
approximate date of the signal capture, in `YYYY-MM-DD` or `YYYY` format
(e.g., `GNSS-SDR.observation_date=2014-12-20`), when post-processing recorded
signal files. It is used to resolve the GPS mod-1024 week-number rollover:
each broadcast week number is expanded to the 1024-week era closest to the
given date. This works for recordings from any era, including files captured
after the April 2019 rollover replayed far in the future, and also fixes the
applied leap-second offset, which is derived from the resolved date. If the
parameter is not set, the era is derived from the system clock, as before,
which is the right choice for live operation. The `GNSS-SDR.pre_2009_file`
flag, which could only select the August 1999 - April 2019 era, is now
deprecated: it keeps working exactly as before, but the receiver prints a
notice suggesting `GNSS-SDR.observation_date` instead, and it is ignored if
the new parameter is also set.
- Added Galileo System Time (GST) annotations to HAS outputs when GST is decoded
from an I/NAV channel, enabling the HAS Time of Hour (TOH) to be associated
with an absolute UTC timestamp.
+6 -2
View File
@@ -24,6 +24,7 @@
#include "gnss_sdr_string_literals.h" // for std::string_literals in C++11
#include "gps_almanac.h" // for Gps_Almanac
#include "gps_ephemeris.h" // for Gps_Ephemeris
#include "gps_week_rollover.h" // for gps_ref_week_from_config
#include "pvt_conf.h" // for Pvt_Conf
#include "rtklib_rtkpos.h" // for rtkfree, rtkinit
#include "signal_enabled_flags.h" // for signal_enabled_flags
@@ -68,8 +69,11 @@ Rtklib_Pvt::Rtklib_Pvt(const ConfigurationInterface* configuration,
pvt_output_parameters.rtk_trace_level = configuration->property(role + ".rtk_trace_level"s, 0);
// Flag to postprocess old gnss records (older than 2009) and avoid wrong week rollover
pvt_output_parameters.pre_2009_file = configuration->property("GNSS-SDR.pre_2009_file", false);
// Approximate date of the signal capture, used to resolve the GPS mod-1024
// week-number rollover when post-processing recorded files
pvt_output_parameters.ref_gps_week = gps_ref_week_from_config(
configuration->property("GNSS-SDR.observation_date", std::string("")),
configuration->property("GNSS-SDR.pre_2009_file", false));
// output rate
pvt_output_parameters.observable_interval_ms = configuration->property("GNSS-SDR.observable_interval_ms", pvt_output_parameters.observable_interval_ms);
+2 -1
View File
@@ -47,7 +47,8 @@ class Gps_Ephemeris;
*
* Global configuration options used:
*
* GNSS-SDR.pre_2009_file - flag indicating a file older than 2009 rollover should be processed (false)
* GNSS-SDR.observation_date - approximate date of the signal capture in YYYY-MM-DD or YYYY format, used to resolve the GPS mod-1024 week-number rollover when post-processing recorded files (empty: derive it from the system clock)
* GNSS-SDR.pre_2009_file - deprecated, use GNSS-SDR.observation_date instead; flag indicating a file captured in the Aug 1999 - Apr 2019 week-number era (false)
* GNSS-SDR.observable_interval_ms - (20)
*
* It supports the following configuration options:
@@ -414,7 +414,7 @@ rtklib_pvt_gs::rtklib_pvt_gs(uint32_t nchannels,
// initialize RINEX printer
if (d_rinex_output_enabled)
{
d_rp = std::make_unique<Rinex_Printer>(d_signal_enabled_flags, d_rinex_version, conf_.rinex_output_path, conf_.rinex_name, conf_.pre_2009_file);
d_rp = std::make_unique<Rinex_Printer>(d_signal_enabled_flags, d_rinex_version, conf_.rinex_output_path, conf_.rinex_name, conf_.ref_gps_week);
}
else
{
@@ -578,19 +578,19 @@ rtklib_pvt_gs::rtklib_pvt_gs(uint32_t nchannels,
// setup two PVT solvers: internal solver for rx clock and user solver
// user PVT solver
d_user_pvt_solver = std::make_shared<Rtklib_Solver>(rtk, conf_, dump_ls_pvt_filename, d_signal_enabled_flags, d_dump, d_dump_mat);
d_user_pvt_solver->set_pre_2009_file(conf_.pre_2009_file);
d_user_pvt_solver->set_ref_gps_week(conf_.ref_gps_week);
// internal PVT solver, mainly used to estimate the receiver clock
rtk_t internal_rtk = rtk;
internal_rtk.opt.mode = PMODE_SINGLE; // use single positioning mode in internal PVT solver
d_internal_pvt_solver = std::make_shared<Rtklib_Solver>(internal_rtk, conf_, dump_ls_pvt_filename, d_signal_enabled_flags, false, false);
d_internal_pvt_solver->set_pre_2009_file(conf_.pre_2009_file);
d_internal_pvt_solver->set_ref_gps_week(conf_.ref_gps_week);
}
else
{
// only one solver, customized by the user options
d_internal_pvt_solver = std::make_shared<Rtklib_Solver>(rtk, conf_, dump_ls_pvt_filename, d_signal_enabled_flags, d_dump, d_dump_mat);
d_internal_pvt_solver->set_pre_2009_file(conf_.pre_2009_file);
d_internal_pvt_solver->set_ref_gps_week(conf_.ref_gps_week);
d_user_pvt_solver = d_internal_pvt_solver;
}
@@ -2198,8 +2198,17 @@ int rtklib_pvt_gs::work(int noutput_items, gr_vector_const_void_star& input_item
// LOG(INFO) << "diff raw obs time: " << d_gnss_observables_map.cbegin()->second.RX_time * 1000.0 - old_time_debug;
// old_time_debug = d_gnss_observables_map.cbegin()->second.RX_time * 1000.0;
uint32_t current_RX_time_ms = 0;
// If the Rx clock correction is disabled, d_internal_pvt_solver and d_user_pvt_solver
// are the same object and this is its only get_PVT call, executed at the observables
// rate; restrict dumping to epochs aligned with the configured output rate
bool dump_this_epoch = false;
if (d_enable_rx_clock_correction == false)
{
const auto rx_time_ms = static_cast<uint32_t>(d_gnss_observables_map.cbegin()->second.RX_time * 1000.0);
dump_this_epoch = (rx_time_ms % d_output_rate_ms == 0);
}
// #### solve PVT and store the corrected observable set
if (d_internal_pvt_solver->get_PVT(d_gnss_observables_map, d_observable_interval_ms / 1000.0, *d_sensor_data_aggregator))
if (d_internal_pvt_solver->get_PVT(d_gnss_observables_map, d_observable_interval_ms / 1000.0, *d_sensor_data_aggregator, dump_this_epoch))
{
d_pvt_errors_counter = 0; // Reset consecutive PVT error counter
const double Rx_clock_offset_s = d_internal_pvt_solver->get_time_offset_s();
@@ -2310,10 +2319,14 @@ int rtklib_pvt_gs::work(int noutput_items, gr_vector_const_void_star& input_item
}
}
// compute on the fly PVT solution
if (flag_compute_pvt_output == true)
// compute on the fly PVT solution at the output rate, on the clock-corrected
// and interpolated observables. If the Rx clock correction is disabled, the user
// solver is the same object as the internal one and already holds this epoch's
// solution (flag_pvt_valid was set above), so solving again would feed the same
// epoch twice to the solver and duplicate the dump record
if (flag_compute_pvt_output == true && d_enable_rx_clock_correction == true)
{
flag_pvt_valid = d_user_pvt_solver->get_PVT(d_gnss_observables_map, d_output_rate_ms / 1000.0, *d_sensor_data_aggregator);
flag_pvt_valid = d_user_pvt_solver->get_PVT(d_gnss_observables_map, d_output_rate_ms / 1000.0, *d_sensor_data_aggregator, true);
}
if (flag_pvt_valid == true)
+1 -1
View File
@@ -65,6 +65,7 @@ public:
int32_t rinexobs_rate_ms = 0;
int32_t an_rate_ms = 20;
int32_t max_obs_block_rx_clock_offset_ms = 40;
int32_t ref_gps_week = 0; // reference GPS week to resolve the mod-1024 week rollover in post-processing (0: use system clock)
int udp_eph_port = 0;
int rtk_trace_level = 0;
@@ -88,7 +89,6 @@ public:
bool protobuf_enabled = true;
bool enable_rx_clock_correction = true;
bool show_local_time_zone = false;
bool pre_2009_file = false;
bool dump = false;
bool dump_mat = true;
bool log_source_timetag = false;
+4 -4
View File
@@ -200,13 +200,13 @@ void Pvt_Solution::set_num_valid_observations(int num)
}
void Pvt_Solution::set_pre_2009_file(bool pre_2009_file)
void Pvt_Solution::set_ref_gps_week(int32_t ref_week)
{
d_pre_2009_file = pre_2009_file;
d_ref_gps_week = ref_week;
}
bool Pvt_Solution::is_pre_2009() const
int32_t Pvt_Solution::get_ref_gps_week() const
{
return d_pre_2009_file;
return d_ref_gps_week;
}
+6 -4
View File
@@ -20,6 +20,7 @@
#include <boost/date_time/posix_time/posix_time.hpp>
#include <array>
#include <cstdint>
/** \addtogroup PVT
* \{ */
@@ -53,7 +54,7 @@ public:
double get_speed_over_ground() const; //!< Get RX speed over ground [m/s]
double get_course_over_ground() const; //!< Get RX course over ground [deg]
int get_num_valid_observations() const; //!< Get the number of valid pseudorange observations (valid satellites)
bool is_pre_2009() const;
int32_t get_ref_gps_week() const; //!< Get the reference GPS week used to resolve the mod-1024 week rollover (0 if unset)
bool is_valid_position() const;
void set_rx_pos(const std::array<double, 3> &pos); //!< Set position: X, Y, Z in Cartesian ECEF coordinates [m]
@@ -64,8 +65,8 @@ public:
void set_speed_over_ground(double speed_m_s); //!< Set RX speed over ground [m/s]
void set_course_over_ground(double cog_deg); //!< Set RX course over ground [deg]
void set_valid_position(bool is_valid);
void set_num_valid_observations(int num); //!< Set the number of valid pseudorange observations (valid satellites)
void set_pre_2009_file(bool pre_2009_file); //!< Flag for the week rollover computation in post processing mode for signals older than 2009
void set_num_valid_observations(int num); //!< Set the number of valid pseudorange observations (valid satellites)
void set_ref_gps_week(int32_t ref_week); //!< Set the reference GPS week (e.g., derived from the date of signal capture) used to resolve the mod-1024 week rollover in post-processing mode
private:
/*
@@ -99,7 +100,8 @@ private:
int d_valid_observations{0}; // Number of valid observations in this epoch
bool d_pre_2009_file{false}; // Flag to correct week rollover in post processing mode for signals older than 2009
int32_t d_ref_gps_week{0}; // Reference GPS week to correct the mod-1024 week rollover in post-processing mode (0: use system clock)
bool d_valid_position{false};
};
+36 -36
View File
@@ -161,7 +161,7 @@ boost::posix_time::ptime gps_time_to_ptime(int32_t gps_week, double tow_s)
}
int32_t expand_lnav_utc_week(int32_t utc_week, int32_t ephemeris_week, bool pre_2009_file)
int32_t expand_lnav_utc_week(int32_t utc_week, int32_t ephemeris_week, int32_t ref_gps_week)
{
constexpr int32_t LNAV_UTC_WEEK_MODULUS = 256;
constexpr int32_t LNAV_UTC_WEEK_HALF_MODULUS = LNAV_UTC_WEEK_MODULUS / 2;
@@ -172,10 +172,10 @@ int32_t expand_lnav_utc_week(int32_t utc_week, int32_t ephemeris_week, bool pre_
}
if (utc_week > 255)
{
return adjgpsweek(utc_week, pre_2009_file);
return adjgpsweek(utc_week, ref_gps_week);
}
const int32_t reference_week = adjgpsweek(ephemeris_week, pre_2009_file);
const int32_t reference_week = adjgpsweek(ephemeris_week, ref_gps_week);
int32_t expanded_week = utc_week;
while ((expanded_week - reference_week) < -LNAV_UTC_WEEK_HALF_MODULUS)
{
@@ -1277,7 +1277,7 @@ std::string get_gps_iono_beta_line_v2(const Gps_Iono& iono)
}
std::string get_delta_utc_line_v2(const Gps_Utc_Model& utc_model, const Gps_Ephemeris& eph, bool pre_2009_file)
std::string get_delta_utc_line_v2(const Gps_Utc_Model& utc_model, const Gps_Ephemeris& eph, int32_t ref_gps_week)
{
std::string line;
@@ -1286,7 +1286,7 @@ std::string get_delta_utc_line_v2(const Gps_Utc_Model& utc_model, const Gps_Ephe
line += rightJustify(doub2for(utc_model.A1, 18, 2), 19);
line += rightJustify(std::to_string(utc_model.tot), 9);
const int32_t WN_T = expand_lnav_utc_week(utc_model.WN_T, eph.WN, pre_2009_file);
const int32_t WN_T = expand_lnav_utc_week(utc_model.WN_T, eph.WN, ref_gps_week);
line += rightJustify(std::to_string(WN_T), 9);
line += std::string(1, ' ');
@@ -1394,9 +1394,9 @@ std::string get_beidou_iono_beta_line(const Beidou_Dnav_Iono& iono)
}
std::string get_gps_time_corr_line(const Gps_Utc_Model& utc_model, const Gps_Ephemeris& gps_eph, bool pre_2009_file)
std::string get_gps_time_corr_line(const Gps_Utc_Model& utc_model, const Gps_Ephemeris& gps_eph, int32_t ref_gps_week)
{
int32_t WN_T = expand_lnav_utc_week(utc_model.WN_T, gps_eph.WN, pre_2009_file);
int32_t WN_T = expand_lnav_utc_week(utc_model.WN_T, gps_eph.WN, ref_gps_week);
return get_time_corr_line("GPUT", utc_model.A0, utc_model.A1, &utc_model.tot, &WN_T);
}
@@ -1473,9 +1473,9 @@ std::string get_leap_second_line_v2(const Gps_Utc_Model& utc_model)
}
std::string get_leap_second_line(const Gps_Utc_Model& utc_model, const Gps_Ephemeris& gps_eph, bool pre_2009_file)
std::string get_leap_second_line(const Gps_Utc_Model& utc_model, const Gps_Ephemeris& gps_eph, int32_t ref_gps_week)
{
const int32_t WN_LSF = expand_lnav_utc_week(utc_model.WN_LSF, gps_eph.WN, pre_2009_file);
const int32_t WN_LSF = expand_lnav_utc_week(utc_model.WN_LSF, gps_eph.WN, ref_gps_week);
return get_leap_second_line(utc_model.DeltaT_LS, utc_model.DeltaT_LSF, WN_LSF, utc_model.DN);
}
@@ -2157,7 +2157,7 @@ Rinex_Printer::Rinex_Printer(uint32_t signal_enabled_flags,
int version,
const std::string& base_path,
const std::string& base_name,
bool pre_2009_file) : Rinex_Printer(signal_enabled_flags, base_name, getAndCreateBaseRinexPath(base_path), version, pre_2009_file)
int32_t ref_gps_week) : Rinex_Printer(signal_enabled_flags, base_name, getAndCreateBaseRinexPath(base_path), version, ref_gps_week)
{
}
@@ -2166,23 +2166,23 @@ Rinex_Printer::Rinex_Printer(uint32_t signal_enabled_flags,
const std::string& base_name,
const std::string& base_rinex_path,
int version,
bool pre_2009_file) : observationType(getObservationTypes()),
observationCode(getObservationCodes()),
d_flags(signal_enabled_flags),
d_version(get_version(d_flags, version)),
d_stringVersion(d_version == 2 ? "2.11" : "3.02"), // Only version 2.11 and 3.02
d_fake_cnav_iode(1),
d_rinex_header_updated(false),
d_rinex_header_gps_updated(!d_flags.has_gps),
d_rinex_header_galileo_updated(!d_flags.has_galileo),
d_rinex_header_glonass_updated(!d_flags.has_glonass),
d_rinex_header_beidou_updated(!d_flags.has_beidou),
d_rinex_header_written(false),
d_pre_2009_file(pre_2009_file),
navfilename(getNavFilePath(d_flags, d_version, base_name, base_rinex_path)),
obsfilename(getFilePath("RINEX_FILE_TYPE_OBS", base_name, base_rinex_path)),
navGlofilename(getFilePath("RINEX_FILE_TYPE_GLO_NAV", base_name, base_rinex_path)),
output_navfilename({navfilename})
int32_t ref_gps_week) : observationType(getObservationTypes()),
observationCode(getObservationCodes()),
d_flags(signal_enabled_flags),
d_version(get_version(d_flags, version)),
d_stringVersion(d_version == 2 ? "2.11" : "3.02"), // Only version 2.11 and 3.02
d_fake_cnav_iode(1),
d_rinex_header_updated(false),
d_rinex_header_gps_updated(!d_flags.has_gps),
d_rinex_header_galileo_updated(!d_flags.has_galileo),
d_rinex_header_glonass_updated(!d_flags.has_glonass),
d_rinex_header_beidou_updated(!d_flags.has_beidou),
d_rinex_header_written(false),
d_ref_gps_week(ref_gps_week),
navfilename(getNavFilePath(d_flags, d_version, base_name, base_rinex_path)),
obsfilename(getFilePath("RINEX_FILE_TYPE_OBS", base_name, base_rinex_path)),
navGlofilename(getFilePath("RINEX_FILE_TYPE_GLO_NAV", base_name, base_rinex_path)),
output_navfilename({navfilename})
{
std::map<std::string, std::fstream&> fileMap = {
{navfilename, navFile},
@@ -2370,15 +2370,15 @@ void Rinex_Printer::print_rinex_annotation(const Rtklib_Solver* pvt_solver,
{
iono_lines.emplace_back(get_gps_iono_alpha_line_v2(pvt_solver->gps_iono));
iono_lines.emplace_back(get_gps_iono_beta_line_v2(pvt_solver->gps_iono));
time_corr_lines.emplace_back(get_delta_utc_line_v2(pvt_solver->gps_utc_model, gps_ephemeris_iter->second, d_pre_2009_file));
time_corr_lines.emplace_back(get_delta_utc_line_v2(pvt_solver->gps_utc_model, gps_ephemeris_iter->second, d_ref_gps_week));
leap_second_line = get_leap_second_line_v2(pvt_solver->gps_utc_model);
}
else
{
iono_lines.emplace_back(get_gps_iono_alpha_line(pvt_solver->gps_iono));
iono_lines.emplace_back(get_gps_iono_beta_line(pvt_solver->gps_iono));
time_corr_lines.emplace_back(get_gps_time_corr_line(pvt_solver->gps_utc_model, gps_ephemeris_iter->second, d_pre_2009_file));
leap_second_line = get_leap_second_line(pvt_solver->gps_utc_model, gps_ephemeris_iter->second, d_pre_2009_file);
time_corr_lines.emplace_back(get_gps_time_corr_line(pvt_solver->gps_utc_model, gps_ephemeris_iter->second, d_ref_gps_week));
leap_second_line = get_leap_second_line(pvt_solver->gps_utc_model, gps_ephemeris_iter->second, d_ref_gps_week);
}
}
else if (d_flags.check_any_enabled(GPS_2S, GPS_L5))
@@ -2482,15 +2482,15 @@ void Rinex_Printer::print_rinex_annotation(const Rtklib_Solver* pvt_solver,
{
nav_header_info.emplace_back("", "ION ALPHA", get_gps_iono_alpha_line_v2(pvt_solver->gps_iono));
nav_header_info.emplace_back("", "ION BETA", get_gps_iono_beta_line_v2(pvt_solver->gps_iono));
nav_header_info.emplace_back("", "DELTA-UTC", get_delta_utc_line_v2(pvt_solver->gps_utc_model, gps_ephemeris_iter->second, d_pre_2009_file));
nav_header_info.emplace_back("", "DELTA-UTC", get_delta_utc_line_v2(pvt_solver->gps_utc_model, gps_ephemeris_iter->second, d_ref_gps_week));
leap_second_line = get_leap_second_line_v2(pvt_solver->gps_utc_model);
}
else
{
nav_header_info.emplace_back("GPSA", "IONOSPHERIC CORR", get_gps_iono_alpha_line(pvt_solver->gps_iono));
nav_header_info.emplace_back("GPSB", "IONOSPHERIC CORR", get_gps_iono_beta_line(pvt_solver->gps_iono));
nav_header_info.emplace_back("GPUT", "TIME SYSTEM CORR", get_gps_time_corr_line(pvt_solver->gps_utc_model, gps_ephemeris_iter->second, d_pre_2009_file));
leap_second_line = get_leap_second_line(pvt_solver->gps_utc_model, gps_ephemeris_iter->second, d_pre_2009_file);
nav_header_info.emplace_back("GPUT", "TIME SYSTEM CORR", get_gps_time_corr_line(pvt_solver->gps_utc_model, gps_ephemeris_iter->second, d_ref_gps_week));
leap_second_line = get_leap_second_line(pvt_solver->gps_utc_model, gps_ephemeris_iter->second, d_ref_gps_week);
}
d_rinex_header_gps_updated = true;
}
@@ -2624,7 +2624,7 @@ void Rinex_Printer::log_rinex_nav_gps_nav(const std::map<int32_t, Gps_Ephemeris>
// -------- BROADCAST ORBIT - 5
auto GPS_week_continuous_number = static_cast<double>(adjgpsweek(eph.WN, d_pre_2009_file));
auto GPS_week_continuous_number = static_cast<double>(adjgpsweek(eph.WN, d_ref_gps_week));
// This week goes with Toe. This is different from the GPS week in the original satellite message!
if (eph.toe < 7200.0)
{
@@ -3231,7 +3231,7 @@ boost::posix_time::ptime Rinex_Printer::compute_UTC_time(const Gps_Navigation_Me
// if we are processing a file -> wait to leap second to resolve the ambiguity else take the week from the local system time
// idea: resolve the ambiguity with the leap second
const double utc_t = nav_msg.utc_time(nav_msg.get_TOW());
return gps_time_to_ptime(adjgpsweek(nav_msg.get_GPS_week(), d_pre_2009_file), utc_t);
return gps_time_to_ptime(adjgpsweek(nav_msg.get_GPS_week(), d_ref_gps_week), utc_t);
}
@@ -3254,7 +3254,7 @@ boost::posix_time::ptime Rinex_Printer::compute_GPS_time(const Gps_Ephemeris& ep
// (see Section 3 in ftp://igs.org/pub/data/format/rinex211.txt)
// (see Pag. 17 in ftp://igs.org/pub/data/format/rinex300.pdf)
// No time correction here, since it will be done in the PVT processor
int32_t gps_week = adjgpsweek(eph.WN, d_pre_2009_file);
int32_t gps_week = adjgpsweek(eph.WN, d_ref_gps_week);
// Handle TOW rollover
if (obs_time < 18.0)
{
+3 -3
View File
@@ -89,7 +89,7 @@ public:
int version = 3,
const std::string& base_path = ".",
const std::string& base_name = "-",
bool pre_2009_file = false);
int32_t ref_gps_week = 0);
/*!
* \brief Destructor. Removes created files if empty.
@@ -165,7 +165,7 @@ private:
const std::string& base_name,
const std::string& base_rinex_path,
int version,
bool pre_2009_file);
int32_t ref_gps_week);
/*
* Generates the GPS Observation data header
@@ -250,7 +250,7 @@ private:
bool d_rinex_header_glonass_updated;
bool d_rinex_header_beidou_updated;
bool d_rinex_header_written;
const bool d_pre_2009_file;
const int32_t d_ref_gps_week;
const std::string navfilename; // Name of RINEX navigation file
const std::string obsfilename; // Name of RINEX observation file
+6 -6
View File
@@ -1147,7 +1147,7 @@ void Rtklib_Solver::clear_applied_has_phase_bias_discontinuity(const HAS_obs_cor
}
bool Rtklib_Solver::get_PVT(const std::map<int, Gnss_Synchro> &gnss_observables_map, double kf_update_interval_s, const SensorDataAggregator &sensor_data_aggregator)
bool Rtklib_Solver::get_PVT(const std::map<int, Gnss_Synchro> &gnss_observables_map, double kf_update_interval_s, const SensorDataAggregator &sensor_data_aggregator, bool dump_this_epoch)
{
std::map<int, Gnss_Synchro>::const_iterator gnss_observables_iter;
std::map<int, Galileo_Ephemeris>::const_iterator galileo_ephemeris_iter;
@@ -1392,7 +1392,7 @@ bool Rtklib_Solver::get_PVT(const std::map<int, Gnss_Synchro> &gnss_observables_
eph_data[valid_obs] = eph_to_rtklib(gps_ephemeris_iter->second,
this->d_has_orbit_corrections_store_map[gnss_str],
this->d_has_clock_corrections_store_map[gnss_str],
this->is_pre_2009());
this->get_ref_gps_week());
// convert observation from GNSS-SDR class to RTKLIB structure
obsd_t newobs{};
const HAS_obs_corrections *applied_has_correction = nullptr;
@@ -1402,7 +1402,7 @@ bool Rtklib_Solver::get_PVT(const std::map<int, Gnss_Synchro> &gnss_observables_
gps_ephemeris_iter->second.WN,
d_rtklib_band_index[rtklib_sig],
&applied_has_correction,
this->is_pre_2009());
this->get_ref_gps_week());
clear_applied_has_phase_bias_discontinuity(applied_has_correction, prn);
valid_obs++;
}
@@ -1855,7 +1855,7 @@ bool Rtklib_Solver::get_PVT(const std::map<int, Gnss_Synchro> &gnss_observables_
// TOW
d_monitor_pvt.TOW_at_current_symbol_ms = gnss_observables_map.cbegin()->second.TOW_at_current_symbol_ms;
// WEEK
d_monitor_pvt.week = adjgpsweek(d_nav_data.eph[0].week, this->is_pre_2009());
d_monitor_pvt.week = adjgpsweek(d_nav_data.eph[0].week, this->get_ref_gps_week());
// PVT GPS time
d_monitor_pvt.RX_time = gnss_observables_map.cbegin()->second.RX_time;
// User clock offset [s]
@@ -1939,7 +1939,7 @@ bool Rtklib_Solver::get_PVT(const std::map<int, Gnss_Synchro> &gnss_observables_
d_monitor_pvt.utc_time = stream.str();
// ######## LOG FILE #########
if (d_flag_dump_enabled == true)
if (d_flag_dump_enabled == true && dump_this_epoch == true)
{
// MULTIPLEXED FILE RECORDING - Record results to file
try
@@ -1950,7 +1950,7 @@ bool Rtklib_Solver::get_PVT(const std::map<int, Gnss_Synchro> &gnss_observables_
tmp_uint32 = gnss_observables_map.cbegin()->second.TOW_at_current_symbol_ms;
d_dump_file.write(reinterpret_cast<char *>(&tmp_uint32), sizeof(uint32_t));
// WEEK
tmp_uint32 = adjgpsweek(d_nav_data.eph[0].week, this->is_pre_2009());
tmp_uint32 = adjgpsweek(d_nav_data.eph[0].week, this->get_ref_gps_week());
d_dump_file.write(reinterpret_cast<char *>(&tmp_uint32), sizeof(uint32_t));
// PVT GPS time
tmp_double = gnss_observables_map.cbegin()->second.RX_time;
+1 -1
View File
@@ -91,7 +91,7 @@ public:
~Rtklib_Solver() noexcept override;
bool get_PVT(const std::map<int, Gnss_Synchro>& gnss_observables_map, double kf_update_interval_s, const SensorDataAggregator& sensor_data_aggregator);
bool get_PVT(const std::map<int, Gnss_Synchro>& gnss_observables_map, double kf_update_interval_s, const SensorDataAggregator& sensor_data_aggregator, bool dump_this_epoch = true);
double get_hdop() const override;
double get_vdop() const override;
@@ -154,7 +154,7 @@ obsd_t insert_obs_to_rtklib(obsd_t& rtklib_obs,
int week,
int band,
const HAS_obs_corrections** applied_has_correction,
bool pre_2009_file)
int ref_week)
{
if (applied_has_correction != nullptr)
{
@@ -254,7 +254,7 @@ obsd_t insert_obs_to_rtklib(obsd_t& rtklib_obs,
}
else
{
rtklib_obs.time = gpst2time(adjgpsweek(week, pre_2009_file), gnss_synchro.RX_time);
rtklib_obs.time = gpst2time(adjgpsweek(week, ref_week), gnss_synchro.RX_time);
}
// account for the TOW crossover transitory in the first 18 seconds where the week is not yet updated!
if (gnss_synchro.RX_time < 18.0)
@@ -341,7 +341,7 @@ obsd_t insert_obs_to_rtklib(obsd_t& rtklib_obs,
const std::map<std::string, std::map<int, HAS_obs_corrections>>& has_obs_corr,
int week,
int band,
bool pre_2009_file)
int ref_week)
{
return insert_obs_to_rtklib(rtklib_obs,
gnss_synchro,
@@ -349,7 +349,7 @@ obsd_t insert_obs_to_rtklib(obsd_t& rtklib_obs,
week,
band,
static_cast<const HAS_obs_corrections**>(nullptr),
pre_2009_file);
ref_week);
}
@@ -357,7 +357,7 @@ obsd_t insert_obs_to_rtklib(obsd_t& rtklib_obs,
const Gnss_Synchro& gnss_synchro,
int week,
int band,
bool pre_2009_file)
int ref_week)
{
std::map<std::string, std::map<int, HAS_obs_corrections>> empty_map;
return insert_obs_to_rtklib(rtklib_obs,
@@ -365,7 +365,7 @@ obsd_t insert_obs_to_rtklib(obsd_t& rtklib_obs,
empty_map,
week,
band,
pre_2009_file);
ref_week);
}
@@ -520,18 +520,18 @@ eph_t eph_to_rtklib(const Galileo_Ephemeris& gal_eph,
}
eph_t eph_to_rtklib(const Gps_Ephemeris& gps_eph, bool pre_2009_file)
eph_t eph_to_rtklib(const Gps_Ephemeris& gps_eph, int ref_week)
{
std::map<int, HAS_orbit_corrections> empty_orbit_map;
std::map<int, HAS_clock_corrections> empty_clock_map;
return eph_to_rtklib(gps_eph, empty_orbit_map, empty_clock_map, pre_2009_file);
return eph_to_rtklib(gps_eph, empty_orbit_map, empty_clock_map, ref_week);
}
eph_t eph_to_rtklib(const Gps_Ephemeris& gps_eph,
const std::map<int, HAS_orbit_corrections>& orbit_correction_map,
const std::map<int, HAS_clock_corrections>& clock_correction_map,
bool pre_2009_file)
int ref_week)
{
eph_t rtklib_sat = {0, 0, 0, 0, 0, 0, 0, 0, {0, 0}, {0, 0}, {0, 0}, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, {}, {}, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, false, 0, 0, 0, 0, 0.0, -1, 0};
@@ -549,7 +549,7 @@ eph_t eph_to_rtklib(const Gps_Ephemeris& gps_eph,
rtklib_sat.Adot = 0; // only in CNAV;
rtklib_sat.ndot = 0; // only in CNAV;
rtklib_sat.week = adjgpsweek(gps_eph.WN, pre_2009_file); /* week of tow */
rtklib_sat.week = adjgpsweek(gps_eph.WN, ref_week); /* week of tow */
rtklib_sat.cic = gps_eph.Cic;
rtklib_sat.cis = gps_eph.Cis;
rtklib_sat.cuc = gps_eph.Cuc;
@@ -91,12 +91,12 @@ eph_t eph_to_rtklib(const Galileo_Ephemeris& gal_eph,
const std::map<int, HAS_clock_corrections>& clock_correction_map);
eph_t eph_to_rtklib(const Gps_Ephemeris& gps_eph,
bool pre_2009_file = false);
int ref_week = 0);
eph_t eph_to_rtklib(const Gps_Ephemeris& gps_eph,
const std::map<int, HAS_orbit_corrections>& orbit_correction_map,
const std::map<int, HAS_clock_corrections>& clock_correction_map,
bool pre_2009_file = false);
int ref_week = 0);
eph_t eph_to_rtklib(const Gps_CNAV_Ephemeris& gps_cnav_eph);
@@ -121,16 +121,16 @@ obsd_t insert_obs_to_rtklib(obsd_t& rtklib_obs,
int week,
int band,
const HAS_obs_corrections** applied_has_correction,
bool pre_2009_file);
int ref_week);
obsd_t insert_obs_to_rtklib(obsd_t& rtklib_obs,
const Gnss_Synchro& gnss_synchro,
const std::map<std::string, std::map<int, HAS_obs_corrections>>& has_obs_corr,
int week,
int band,
bool pre_2009_file = false);
int ref_week = 0);
obsd_t insert_obs_to_rtklib(obsd_t& rtklib_obs, const Gnss_Synchro& gnss_synchro, int week, int band, bool pre_2009_file = false);
obsd_t insert_obs_to_rtklib(obsd_t& rtklib_obs, const Gnss_Synchro& gnss_synchro, int week, int band, int ref_week = 0);
/** \} */
+4 -4
View File
@@ -172,7 +172,7 @@ int decode_type3(rtcm_t *rtcm)
/* decode type 14: gps time of week ------------------------------------------*/
int decode_type14(rtcm_t *rtcm, bool pre_2009_file)
int decode_type14(rtcm_t *rtcm, int ref_week)
{
double zcnt;
int i = 48;
@@ -196,7 +196,7 @@ int decode_type14(rtcm_t *rtcm, bool pre_2009_file)
trace(2, "rtcm2 14 length error: len=%d\n", rtcm->len);
return -1;
}
week = adjgpsweek(week, pre_2009_file);
week = adjgpsweek(week, ref_week);
rtcm->time = gpst2time(week, hour * 3600.0 + zcnt * 0.6);
rtcm->nav.leaps = leaps;
return 6;
@@ -224,7 +224,7 @@ int decode_type16(rtcm_t *rtcm)
/* decode type 17: gps ephemerides -------------------------------------------*/
int decode_type17(rtcm_t *rtcm, bool pre_2009_file)
int decode_type17(rtcm_t *rtcm, int ref_week)
{
eph_t eph = {0, -1, -1, 0, 0, 0, 0, 0, {0, 0.0}, {0, 0.0}, {0, 0.0},
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
@@ -309,7 +309,7 @@ int decode_type17(rtcm_t *rtcm, bool pre_2009_file)
}
sat = satno(SYS_GPS, prn);
eph.sat = sat;
eph.week = adjgpsweek(week, pre_2009_file);
eph.week = adjgpsweek(week, ref_week);
eph.toe = gpst2time(eph.week, eph.toes);
eph.toc = gpst2time(eph.week, toc);
eph.ttr = rtcm->time;
+2 -2
View File
@@ -41,9 +41,9 @@ void adjhour(rtcm_t *rtcm, double zcnt);
int obsindex(obs_t *obs, gtime_t time, int sat);
int decode_type1(rtcm_t *rtcm);
int decode_type3(rtcm_t *rtcm);
int decode_type14(rtcm_t *rtcm, bool pre_2009_file = false);
int decode_type14(rtcm_t *rtcm, int ref_week = 0);
int decode_type16(rtcm_t *rtcm);
int decode_type17(rtcm_t *rtcm, bool pre_2009_file = false);
int decode_type17(rtcm_t *rtcm, int ref_week = 0);
int decode_type18(rtcm_t *rtcm);
int decode_type19(rtcm_t *rtcm);
int decode_type22(rtcm_t *rtcm);
+4 -4
View File
@@ -1015,7 +1015,7 @@ int decode_type1013(rtcm_t *rtcm __attribute__((unused)))
/* decode type 1019: gps ephemerides -----------------------------------------*/
int decode_type1019(rtcm_t *rtcm, bool pre_2009_file)
int decode_type1019(rtcm_t *rtcm, int ref_week)
{
eph_t eph = {0, -1, -1, 0, 0, 0, 0, 0, {0, 0.0}, {0, 0.0}, {0, 0.0},
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
@@ -1115,7 +1115,7 @@ int decode_type1019(rtcm_t *rtcm, bool pre_2009_file)
return -1;
}
eph.sat = sat;
eph.week = adjgpsweek(week, pre_2009_file);
eph.week = adjgpsweek(week, ref_week);
eph.toe = gpst2time(eph.week, eph.toes);
eph.toc = gpst2time(eph.week, toc);
eph.ttr = rtcm->time;
@@ -1514,7 +1514,7 @@ int decode_type1039(rtcm_t *rtcm __attribute__((unused)))
/* decode type 1044: qzss ephemerides (ref [15]) -----------------------------*/
int decode_type1044(rtcm_t *rtcm, bool pre_2009_file)
int decode_type1044(rtcm_t *rtcm, int ref_week)
{
eph_t eph = {0, -1, -1, 0, 0, 0, 0, 0, {0, 0.0}, {0, 0.0}, {0, 0.0},
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
@@ -1607,7 +1607,7 @@ int decode_type1044(rtcm_t *rtcm, bool pre_2009_file)
return -1;
}
eph.sat = sat;
eph.week = adjgpsweek(week, pre_2009_file);
eph.week = adjgpsweek(week, ref_week);
eph.toe = gpst2time(eph.week, eph.toes);
eph.toc = gpst2time(eph.week, toc);
eph.ttr = rtcm->time;
+2 -2
View File
@@ -129,7 +129,7 @@ int decode_type1012(rtcm_t *rtcm);
int decode_type1013(rtcm_t *rtcm);
int decode_type1019(rtcm_t *rtcm, bool pre_2009_file = false);
int decode_type1019(rtcm_t *rtcm, int ref_week = 0);
int decode_type1020(rtcm_t *rtcm);
@@ -167,7 +167,7 @@ int decode_type1038(rtcm_t *rtcm);
int decode_type1039(rtcm_t *rtcm);
int decode_type1044(rtcm_t *rtcm, bool pre_2009_file = false);
int decode_type1044(rtcm_t *rtcm, int ref_week = 0);
int decode_type1045(rtcm_t *rtcm);
+16 -24
View File
@@ -2114,43 +2114,35 @@ double time2doy(gtime_t t)
/* adjust gps week number ------------------------------------------------------
* adjust gps week number using cpu time
* args : int week I not-adjusted gps week number
* adjust gps week number using a reference week or cpu time
* args : int week I not-adjusted (mod-1024) gps week number
* int ref_week I full gps week number used as reference to
* resolve the mod-1024 rollover, e.g. derived
* from the approximate date of signal capture
* when post-processing recorded files
* (0: use cpu time)
* return : adjusted gps week number
*-----------------------------------------------------------------------------*/
int adjgpsweek(int week, bool pre_2009_file)
int adjgpsweek(int week, int ref_week)
{
// int w;
// if (week < 512)
// {
// //assume receiver date > 7 april 2019
// w = week + 2048; //add weeks from 6-january-1980 to week rollover in 6 april 2019
// }
// else
// {
// //assume receiver date < 7 april 2019
// w = week + 1024; //add weeks from 6-january-1980 to week rollover in 21 august 1999
// }
int w;
if (week > 1023)
{
return week;
}
if (pre_2009_file == false)
if (ref_week > 0)
{
(void)time2gpst(utc2gpst(timeget()), &w);
if (w < 1560)
{
w = 1560; /* use 2009/12/1 if time is earlier than 2009/12/1 */
}
return week + (w - week + 512) / 1024 * 1024;
/* pick the 1024-week era that places the output closest to ref_week */
return week + (ref_week - week + 512) / 1024 * 1024;
}
else
(void)time2gpst(utc2gpst(timeget()), &w);
if (w < 1560)
{
w = week + 1024; // add weeks from 6-january-1980 to week rollover in 21 august 1999
return w;
w = 1560; /* use 2009/12/1 if time is earlier than 2009/12/1 */
}
return week + (w - week + 512) / 1024 * 1024;
}
+1 -1
View File
@@ -188,7 +188,7 @@ double utc2gmst(gtime_t t, double ut1_utc);
void time2str(gtime_t t, char *s, int n);
char *time_str(gtime_t t, int n);
double time2doy(gtime_t t);
int adjgpsweek(int week, bool pre_2009_file = false);
int adjgpsweek(int week, int ref_week = 0);
unsigned int tickget();
void sleepms(int ms);
void deg2dms(double deg, double *dms, int ndec);
+7 -3
View File
@@ -44,6 +44,7 @@
#include "gps_ephemeris.h" // for Gps_Ephemeris
#include "gps_iono.h" // for Gps_Iono
#include "gps_utc_model.h" // for Gps_Utc_Model
#include "gps_week_rollover.h" // for gps_ref_week_from_config
#include "pvt_interface.h" // for PvtInterface
#include "rtklib.h" // for gtime_t, alm_t
#include "rtklib_conversions.h" // for alm_to_rtklib
@@ -169,8 +170,11 @@ ControlThread::ControlThread(std::shared_ptr<ConfigurationInterface> configurati
void ControlThread::init()
{
telecommand_enabled_ = configuration_->property("GNSS-SDR.telecommand_enabled", false);
// OPTIONAL: specify a custom year to override the system time in order to postprocess old gnss records and avoid wrong week rollover
pre_2009_file_ = configuration_->property("GNSS-SDR.pre_2009_file", false);
// OPTIONAL: approximate date of the signal capture, used to resolve the GPS
// mod-1024 week-number rollover when post-processing old gnss records
ref_gps_week_ = gps_ref_week_from_config(
configuration_->property("GNSS-SDR.observation_date", std::string("")),
configuration_->property("GNSS-SDR.pre_2009_file", false));
// Instantiates a control queue, a GNSS flowgraph, and a control message factory
control_queue_ = std::make_shared<Concurrent_Queue<pmt::pmt_t>>();
cmd_interface_.set_msg_queue(control_queue_); // set also the queue pointer for the telecommand thread
@@ -1055,7 +1059,7 @@ std::vector<std::pair<int, Gnss_Satellite>> ControlThread::get_visible_sats(time
const std::map<int, Gps_Ephemeris> gps_eph_map = pvt_ptr->get_gps_ephemeris();
for (const auto &it : gps_eph_map)
{
const eph_t rtklib_eph = eph_to_rtklib(it.second, pre_2009_file_);
const eph_t rtklib_eph = eph_to_rtklib(it.second, ref_gps_week_);
std::array<double, 3> r_sat{};
double clock_bias_s;
double sat_pos_variance_m2;
+3 -1
View File
@@ -31,6 +31,7 @@
#include <pmt/pmt.h>
#include <array> // for array
#include <cstddef> // for size_t
#include <cstdint> // for int32_t
#include <memory> // for shared_ptr
#include <string> // for string
#include <thread> // for std::thread
@@ -223,7 +224,8 @@ private:
bool stop_;
bool restart_;
bool telecommand_enabled_;
bool pre_2009_file_; // to override the system time to postprocess old gnss records and avoid wrong week rollover
int32_t ref_gps_week_; // reference GPS week to resolve the mod-1024 week rollover when post-processing old gnss records (0: use system clock)
};
@@ -12,6 +12,7 @@ set(SYSTEM_PARAMETERS_SOURCES
gnss_signal.cc
gps_navigation_message.cc
gps_ephemeris.cc
gps_week_rollover.cc
galileo_utc_model.cc
galileo_ephemeris.cc
galileo_almanac_helper.cc
@@ -43,6 +44,7 @@ set(SYSTEM_PARAMETERS_HEADERS
gps_iono.h
gps_almanac.h
gps_utc_model.h
gps_week_rollover.h
gps_acq_assist.h
agnss_ref_time.h
agnss_ref_location.h
@@ -0,0 +1,87 @@
/*!
* \file gps_week_rollover.cc
* \brief Resolution of the GPS mod-1024 week-number rollover from the
* receiver configuration
* \author Carles Fernandez-Prades, 2026. cfernandez(at)cttc.es
*
* -----------------------------------------------------------------------------
*
* GNSS-SDR is a Global Navigation Satellite System software-defined receiver.
* This file is part of GNSS-SDR.
*
* Copyright (C) 2010-2026 (see AUTHORS file for a list of contributors)
* SPDX-License-Identifier: GPL-3.0-or-later
*
* -----------------------------------------------------------------------------
*/
#include "gps_week_rollover.h"
#include <boost/date_time/gregorian/gregorian.hpp>
#include <algorithm>
#include <exception>
#include <iostream>
namespace
{
// Parses "YYYY-MM-DD" or "YYYY" ("YYYY" maps to July 1 of that year).
// Returns a not_a_date_time value if the string cannot be parsed.
boost::gregorian::date parse_observation_date(const std::string& date_str)
{
try
{
if (date_str.size() == 4 && std::all_of(date_str.begin(), date_str.end(), [](char c) { return c >= '0' && c <= '9'; }))
{
return {static_cast<uint16_t>(std::stoi(date_str)), 7, 1};
}
return boost::gregorian::from_simple_string(date_str);
}
catch (const std::exception& e)
{
return boost::gregorian::date(boost::gregorian::not_a_date_time);
}
}
} // namespace
int32_t gps_ref_week_from_config(const std::string& observation_date, bool pre_2009_file)
{
const boost::gregorian::date gps_epoch(1980, 1, 6);
if (!observation_date.empty())
{
const boost::gregorian::date date = parse_observation_date(observation_date);
if (date.is_not_a_date())
{
std::cout << "Warning: could not parse GNSS-SDR.observation_date=" << observation_date
<< " (expected YYYY-MM-DD or YYYY format), ignoring it.\n";
}
else if (date < gps_epoch)
{
std::cout << "Warning: GNSS-SDR.observation_date=" << observation_date
<< " is earlier than the GPS epoch (1980-01-06), ignoring it.\n";
}
else
{
if (pre_2009_file)
{
std::cout << "Warning: the deprecated GNSS-SDR.pre_2009_file flag is ignored because GNSS-SDR.observation_date is set.\n";
}
return static_cast<int32_t>((date - gps_epoch).days() / 7);
}
}
if (pre_2009_file)
{
static bool notice_printed = false;
if (!notice_printed)
{
std::cout << "Warning: GNSS-SDR.pre_2009_file is deprecated. Please set GNSS-SDR.observation_date=YYYY-MM-DD\n"
<< "(the approximate date of the signal capture) instead, which also works for files\n"
<< "recorded after the April 2019 week rollover.\n";
notice_printed = true;
}
// Mid-point of the Aug 1999 - Apr 2019 era: reproduces the legacy
// fixed +1024 week adjustment for every mod-1024 week number
return 1535;
}
return 0;
}
@@ -0,0 +1,53 @@
/*!
* \file gps_week_rollover.h
* \brief Resolution of the GPS mod-1024 week-number rollover from the
* receiver configuration
* \author Carles Fernandez-Prades, 2026. cfernandez(at)cttc.es
*
* -----------------------------------------------------------------------------
*
* GNSS-SDR is a Global Navigation Satellite System software-defined receiver.
* This file is part of GNSS-SDR.
*
* Copyright (C) 2010-2026 (see AUTHORS file for a list of contributors)
* SPDX-License-Identifier: GPL-3.0-or-later
*
* -----------------------------------------------------------------------------
*/
#ifndef GNSS_SDR_GPS_WEEK_ROLLOVER_H
#define GNSS_SDR_GPS_WEEK_ROLLOVER_H
#include <cstdint>
#include <string>
/** \addtogroup Core
* \{ */
/** \addtogroup System_Parameters
* \{ */
/*!
* \brief Derives the reference GPS week number used to resolve the GPS
* mod-1024 week-number rollover when post-processing recorded signal files.
*
* \param observation_date Value of the GNSS-SDR.observation_date
* configuration option: approximate date of the signal capture, in
* "YYYY-MM-DD" or "YYYY" format. An empty string means "not set".
* \param pre_2009_file Value of the deprecated GNSS-SDR.pre_2009_file flag.
*
* \returns The full GPS week number of the observation date. Each mod-1024
* broadcast week number is then resolved to the 1024-week era that places it
* closest to this reference week (see adjgpsweek()). Returns 0 if neither
* option is set, which keeps the default behavior of deriving the era from
* the system clock. If only the deprecated flag is set, it returns week 1535
* (mid-point of the 1999-2019 era), which reproduces the legacy fixed +1024
* week adjustment, and a one-time deprecation notice is printed.
*/
int32_t gps_ref_week_from_config(const std::string& observation_date, bool pre_2009_file);
/** \} */
/** \} */
#endif // GNSS_SDR_GPS_WEEK_ROLLOVER_H
+440 -420
View File
@@ -1,6 +1,4 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!-- SPDX-License-Identifier: GPL-3.0-or-later -->
<!-- SPDX-FileCopyrightText: 2018 Javier Arribas <javier.arribas@cttc.es> -->
<!DOCTYPE boost_serialization>
<boost_serialization signature="serialization::archive" version="12">
<GNSS-SDR_ephemeris_map class_id="0" tracking_level="0" version="0">
@@ -9,474 +7,496 @@
<item class_id="1" tracking_level="0" version="0">
<first>1</first>
<second class_id="2" tracking_level="0" version="0">
<i_satellite_PRN>1</i_satellite_PRN>
<d_TOW>5.18448000000000000e+05</d_TOW>
<d_IODE_SF2>9.20000000000000000e+01</d_IODE_SF2>
<d_IODE_SF3>9.20000000000000000e+01</d_IODE_SF3>
<d_Crs>1.83125000000000000e+01</d_Crs>
<d_Delta_n>4.86413118201646669e-09</d_Delta_n>
<d_M_0>2.06468198930943725e+00</d_M_0>
<d_Cuc>9.42498445510864258e-07</d_Cuc>
<d_e_eccentricity>3.73082922305911736e-03</d_e_eccentricity>
<d_Cus>5.76488673686981201e-06</d_Cus>
<d_sqrt_A>5.15366174697875977e+03</d_sqrt_A>
<d_Toe>5.18400000000000000e+05</d_Toe>
<d_Toc>5.18400000000000000e+05</d_Toc>
<d_Cic>-5.40167093276977539e-08</d_Cic>
<d_OMEGA0>9.52167247599200905e-01</d_OMEGA0>
<d_Cis>1.86264514923095703e-08</d_Cis>
<d_i_0>9.61377026423456127e-01</d_i_0>
<d_Crc>2.66968750000000000e+02</d_Crc>
<d_OMEGA>4.44935333708291858e-01</d_OMEGA>
<d_OMEGA_DOT>-8.14641075927847669e-09</d_OMEGA_DOT>
<d_IDOT>4.15017287135849497e-10</d_IDOT>
<i_code_on_L2>0</i_code_on_L2>
<i_GPS_week>799</i_GPS_week>
<b_L2_P_data_flag>0</b_L2_P_data_flag>
<i_SV_accuracy>2</i_SV_accuracy>
<i_SV_health>0</i_SV_health>
<d_TGD>5.12227416038513184e-09</d_TGD>
<d_IODC>9.20000000000000000e+01</d_IODC>
<i_AODO>27900</i_AODO>
<b_fit_interval_flag>0</b_fit_interval_flag>
<d_spare1>0.00000000000000000e+00</d_spare1>
<d_spare2>0.00000000000000000e+00</d_spare2>
<d_A_f0>-1.09937973320484161e-05</d_A_f0>
<d_A_f1>3.41060513164847988e-13</d_A_f1>
<d_A_f2>0.00000000000000000e+00</d_A_f2>
<b_integrity_status_flag>0</b_integrity_status_flag>
<b_alert_flag>0</b_alert_flag>
<b_antispoofing_flag>0</b_antispoofing_flag>
<PRN>1</PRN>
<M_0>2.06468198930943725e+00</M_0>
<delta_n>4.86413118201646669e-09</delta_n>
<ecc>3.73082922305911736e-03</ecc>
<sqrtA>5.15366174697875977e+03</sqrtA>
<OMEGA_0>9.52167247599200905e-01</OMEGA_0>
<i_0>9.61377026423456127e-01</i_0>
<omega>4.44935333708291858e-01</omega>
<OMEGAdot>-8.14641075927847669e-09</OMEGAdot>
<idot>4.15017287135849497e-10</idot>
<Cuc>9.42498445510864258e-07</Cuc>
<Cus>5.76488673686981201e-06</Cus>
<Crc>2.66968750000000000e+02</Crc>
<Crs>1.83125000000000000e+01</Crs>
<Cic>-5.40167093276977539e-08</Cic>
<Cis>1.86264514923095703e-08</Cis>
<toe>518400</toe>
<toc>518400</toc>
<af0>-1.09937973320484161e-05</af0>
<af1>3.41060513164847988e-13</af1>
<af2>0.00000000000000000e+00</af2>
<WN>799</WN>
<tow>518448</tow>
<satClkDrift>0.00000000000000000e+00</satClkDrift>
<dtr>0.00000000000000000e+00</dtr>
<IODE_SF2>92</IODE_SF2>
<IODE_SF3>92</IODE_SF3>
<code_on_L2>0</code_on_L2>
<L2_P_data_flag>0</L2_P_data_flag>
<SV_accuracy>2</SV_accuracy>
<SV_health>0</SV_health>
<TGD>5.12227416038513184e-09</TGD>
<IODC>92</IODC>
<AODO>27900</AODO>
<fit_interval_flag>0</fit_interval_flag>
<spare1>0.00000000000000000e+00</spare1>
<spare2>0.00000000000000000e+00</spare2>
<integrity_status_flag>0</integrity_status_flag>
<alert_flag>0</alert_flag>
<antispoofing_flag>0</antispoofing_flag>
</second>
</item>
<item>
<first>2</first>
<second>
<i_satellite_PRN>2</i_satellite_PRN>
<d_TOW>5.18448000000000000e+05</d_TOW>
<d_IODE_SF2>5.50000000000000000e+01</d_IODE_SF2>
<d_IODE_SF3>5.50000000000000000e+01</d_IODE_SF3>
<d_Crs>2.22812500000000000e+01</d_Crs>
<d_Delta_n>5.12771358985317661e-09</d_Delta_n>
<d_M_0>2.75926302782053146e+00</d_M_0>
<d_Cuc>1.10082328319549561e-06</d_Cuc>
<d_e_eccentricity>1.40569622162729484e-02</d_e_eccentricity>
<d_Cus>6.26407563686370850e-06</d_Cus>
<d_sqrt_A>5.15372654151916504e+03</d_sqrt_A>
<d_Toe>5.18400000000000000e+05</d_Toe>
<d_Toc>5.18400000000000000e+05</d_Toc>
<d_Cic>-1.86264514923095703e-08</d_Cic>
<d_OMEGA0>9.18037446344556307e-01</d_OMEGA0>
<d_Cis>-2.16066837310791016e-07</d_Cis>
<d_i_0>9.39991586696909520e-01</d_i_0>
<d_Crc>2.45468750000000000e+02</d_Crc>
<d_OMEGA>-2.35598690357981555e+00</d_OMEGA>
<d_OMEGA_DOT>-8.07140763509730069e-09</d_OMEGA_DOT>
<d_IDOT>5.25736184736635464e-10</d_IDOT>
<i_code_on_L2>0</i_code_on_L2>
<i_GPS_week>799</i_GPS_week>
<b_L2_P_data_flag>0</b_L2_P_data_flag>
<i_SV_accuracy>2</i_SV_accuracy>
<i_SV_health>0</i_SV_health>
<d_TGD>-2.00234353542327881e-08</d_TGD>
<d_IODC>5.50000000000000000e+01</d_IODC>
<i_AODO>27900</i_AODO>
<b_fit_interval_flag>0</b_fit_interval_flag>
<d_spare1>0.00000000000000000e+00</d_spare1>
<d_spare2>0.00000000000000000e+00</d_spare2>
<d_A_f0>5.36850653588771820e-04</d_A_f0>
<d_A_f1>2.16004991671070416e-12</d_A_f1>
<d_A_f2>0.00000000000000000e+00</d_A_f2>
<b_integrity_status_flag>0</b_integrity_status_flag>
<b_alert_flag>0</b_alert_flag>
<b_antispoofing_flag>0</b_antispoofing_flag>
<PRN>2</PRN>
<M_0>2.75926302782053146e+00</M_0>
<delta_n>5.12771358985317661e-09</delta_n>
<ecc>1.40569622162729484e-02</ecc>
<sqrtA>5.15372654151916504e+03</sqrtA>
<OMEGA_0>9.18037446344556307e-01</OMEGA_0>
<i_0>9.39991586696909520e-01</i_0>
<omega>-2.35598690357981555e+00</omega>
<OMEGAdot>-8.07140763509730069e-09</OMEGAdot>
<idot>5.25736184736635464e-10</idot>
<Cuc>1.10082328319549561e-06</Cuc>
<Cus>6.26407563686370850e-06</Cus>
<Crc>2.45468750000000000e+02</Crc>
<Crs>2.22812500000000000e+01</Crs>
<Cic>-1.86264514923095703e-08</Cic>
<Cis>-2.16066837310791016e-07</Cis>
<toe>518400</toe>
<toc>518400</toc>
<af0>5.36850653588771820e-04</af0>
<af1>2.16004991671070416e-12</af1>
<af2>0.00000000000000000e+00</af2>
<WN>799</WN>
<tow>518448</tow>
<satClkDrift>0.00000000000000000e+00</satClkDrift>
<dtr>0.00000000000000000e+00</dtr>
<IODE_SF2>55</IODE_SF2>
<IODE_SF3>55</IODE_SF3>
<code_on_L2>0</code_on_L2>
<L2_P_data_flag>0</L2_P_data_flag>
<SV_accuracy>2</SV_accuracy>
<SV_health>0</SV_health>
<TGD>-2.00234353542327881e-08</TGD>
<IODC>55</IODC>
<AODO>27900</AODO>
<fit_interval_flag>0</fit_interval_flag>
<spare1>0.00000000000000000e+00</spare1>
<spare2>0.00000000000000000e+00</spare2>
<integrity_status_flag>0</integrity_status_flag>
<alert_flag>0</alert_flag>
<antispoofing_flag>0</antispoofing_flag>
</second>
</item>
<item>
<first>3</first>
<second>
<i_satellite_PRN>3</i_satellite_PRN>
<d_TOW>5.18448000000000000e+05</d_TOW>
<d_IODE_SF2>7.00000000000000000e+01</d_IODE_SF2>
<d_IODE_SF3>7.00000000000000000e+01</d_IODE_SF3>
<d_Crs>-2.04375000000000000e+01</d_Crs>
<d_Delta_n>4.75769817722603366e-09</d_Delta_n>
<d_M_0>-1.78871492992227910e+00</d_M_0>
<d_Cuc>-1.30012631416320801e-06</d_Cuc>
<d_e_eccentricity>9.70319728367030512e-04</d_e_eccentricity>
<d_Cus>8.26455652713775635e-06</d_Cus>
<d_sqrt_A>5.15378153991699219e+03</d_sqrt_A>
<d_Toe>5.18400000000000000e+05</d_Toe>
<d_Toc>5.18400000000000000e+05</d_Toc>
<d_Cic>7.82310962677001953e-08</d_Cic>
<d_OMEGA0>1.99297660614955263e+00</d_OMEGA0>
<d_Cis>-1.11758708953857422e-08</d_Cis>
<d_i_0>9.59058451948379909e-01</d_i_0>
<d_Crc>2.19593750000000000e+02</d_Crc>
<d_OMEGA>-3.00536842405812843e+00</d_OMEGA>
<d_OMEGA_DOT>-8.02712007605698577e-09</d_OMEGA_DOT>
<d_IDOT>-5.17164399115929480e-10</d_IDOT>
<i_code_on_L2>0</i_code_on_L2>
<i_GPS_week>799</i_GPS_week>
<b_L2_P_data_flag>0</b_L2_P_data_flag>
<i_SV_accuracy>2</i_SV_accuracy>
<i_SV_health>0</i_SV_health>
<d_TGD>5.12227416038513184e-09</d_TGD>
<d_IODC>7.00000000000000000e+01</d_IODC>
<i_AODO>27900</i_AODO>
<b_fit_interval_flag>0</b_fit_interval_flag>
<d_spare1>0.00000000000000000e+00</d_spare1>
<d_spare2>0.00000000000000000e+00</d_spare2>
<d_A_f0>8.80691222846508026e-05</d_A_f0>
<d_A_f1>2.89901436190120811e-11</d_A_f1>
<d_A_f2>0.00000000000000000e+00</d_A_f2>
<b_integrity_status_flag>0</b_integrity_status_flag>
<b_alert_flag>0</b_alert_flag>
<b_antispoofing_flag>0</b_antispoofing_flag>
<PRN>3</PRN>
<M_0>-1.78871492992227910e+00</M_0>
<delta_n>4.75769817722603366e-09</delta_n>
<ecc>9.70319728367030512e-04</ecc>
<sqrtA>5.15378153991699219e+03</sqrtA>
<OMEGA_0>1.99297660614955263e+00</OMEGA_0>
<i_0>9.59058451948379909e-01</i_0>
<omega>-3.00536842405812843e+00</omega>
<OMEGAdot>-8.02712007605698577e-09</OMEGAdot>
<idot>-5.17164399115929480e-10</idot>
<Cuc>-1.30012631416320801e-06</Cuc>
<Cus>8.26455652713775635e-06</Cus>
<Crc>2.19593750000000000e+02</Crc>
<Crs>-2.04375000000000000e+01</Crs>
<Cic>7.82310962677001953e-08</Cic>
<Cis>-1.11758708953857422e-08</Cis>
<toe>518400</toe>
<toc>518400</toc>
<af0>8.80691222846508026e-05</af0>
<af1>2.89901436190120811e-11</af1>
<af2>0.00000000000000000e+00</af2>
<WN>799</WN>
<tow>518448</tow>
<satClkDrift>0.00000000000000000e+00</satClkDrift>
<dtr>0.00000000000000000e+00</dtr>
<IODE_SF2>70</IODE_SF2>
<IODE_SF3>70</IODE_SF3>
<code_on_L2>0</code_on_L2>
<L2_P_data_flag>0</L2_P_data_flag>
<SV_accuracy>2</SV_accuracy>
<SV_health>0</SV_health>
<TGD>5.12227416038513184e-09</TGD>
<IODC>70</IODC>
<AODO>27900</AODO>
<fit_interval_flag>0</fit_interval_flag>
<spare1>0.00000000000000000e+00</spare1>
<spare2>0.00000000000000000e+00</spare2>
<integrity_status_flag>0</integrity_status_flag>
<alert_flag>0</alert_flag>
<antispoofing_flag>0</antispoofing_flag>
</second>
</item>
<item>
<first>6</first>
<second>
<i_satellite_PRN>6</i_satellite_PRN>
<d_TOW>5.18448000000000000e+05</d_TOW>
<d_IODE_SF2>2.30000000000000000e+01</d_IODE_SF2>
<d_IODE_SF3>2.30000000000000000e+01</d_IODE_SF3>
<d_Crs>1.63750000000000000e+01</d_Crs>
<d_Delta_n>4.76305554323897445e-09</d_Delta_n>
<d_M_0>-1.28531071631616522e+00</d_M_0>
<d_Cuc>9.12696123123168945e-07</d_Cuc>
<d_e_eccentricity>5.50022465176880251e-04</d_e_eccentricity>
<d_Cus>6.24358654022216797e-06</d_Cus>
<d_sqrt_A>5.15365166282653809e+03</d_sqrt_A>
<d_Toe>5.18400000000000000e+05</d_Toe>
<d_Toc>5.18400000000000000e+05</d_Toc>
<d_Cic>-1.30385160446166992e-08</d_Cic>
<d_OMEGA0>9.43624288779246867e-01</d_OMEGA0>
<d_Cis>-1.86264514923095703e-09</d_Cis>
<d_i_0>9.61292940818096020e-01</d_i_0>
<d_Crc>2.58406250000000000e+02</d_Crc>
<d_OMEGA>2.29191014519991665e+00</d_OMEGA>
<d_OMEGA_DOT>-8.08069373618639861e-09</d_OMEGA_DOT>
<d_IDOT>4.79305679291144535e-10</d_IDOT>
<i_code_on_L2>0</i_code_on_L2>
<i_GPS_week>799</i_GPS_week>
<b_L2_P_data_flag>0</b_L2_P_data_flag>
<i_SV_accuracy>2</i_SV_accuracy>
<i_SV_health>0</i_SV_health>
<d_TGD>4.65661287307739258e-09</d_TGD>
<d_IODC>2.30000000000000000e+01</d_IODC>
<i_AODO>27900</i_AODO>
<b_fit_interval_flag>0</b_fit_interval_flag>
<d_spare1>0.00000000000000000e+00</d_spare1>
<d_spare2>0.00000000000000000e+00</d_spare2>
<d_A_f0>3.07881273329257965e-05</d_A_f0>
<d_A_f1>8.18545231595635253e-12</d_A_f1>
<d_A_f2>0.00000000000000000e+00</d_A_f2>
<b_integrity_status_flag>0</b_integrity_status_flag>
<b_alert_flag>0</b_alert_flag>
<b_antispoofing_flag>0</b_antispoofing_flag>
<PRN>6</PRN>
<M_0>-1.28531071631616522e+00</M_0>
<delta_n>4.76305554323897445e-09</delta_n>
<ecc>5.50022465176880251e-04</ecc>
<sqrtA>5.15365166282653809e+03</sqrtA>
<OMEGA_0>9.43624288779246867e-01</OMEGA_0>
<i_0>9.61292940818096020e-01</i_0>
<omega>2.29191014519991665e+00</omega>
<OMEGAdot>-8.08069373618639861e-09</OMEGAdot>
<idot>4.79305679291144535e-10</idot>
<Cuc>9.12696123123168945e-07</Cuc>
<Cus>6.24358654022216797e-06</Cus>
<Crc>2.58406250000000000e+02</Crc>
<Crs>1.63750000000000000e+01</Crs>
<Cic>-1.30385160446166992e-08</Cic>
<Cis>-1.86264514923095703e-09</Cis>
<toe>518400</toe>
<toc>518400</toc>
<af0>3.07881273329257965e-05</af0>
<af1>8.18545231595635253e-12</af1>
<af2>0.00000000000000000e+00</af2>
<WN>799</WN>
<tow>518448</tow>
<satClkDrift>0.00000000000000000e+00</satClkDrift>
<dtr>0.00000000000000000e+00</dtr>
<IODE_SF2>23</IODE_SF2>
<IODE_SF3>23</IODE_SF3>
<code_on_L2>0</code_on_L2>
<L2_P_data_flag>0</L2_P_data_flag>
<SV_accuracy>2</SV_accuracy>
<SV_health>0</SV_health>
<TGD>4.65661287307739258e-09</TGD>
<IODC>23</IODC>
<AODO>27900</AODO>
<fit_interval_flag>0</fit_interval_flag>
<spare1>0.00000000000000000e+00</spare1>
<spare2>0.00000000000000000e+00</spare2>
<integrity_status_flag>0</integrity_status_flag>
<alert_flag>0</alert_flag>
<antispoofing_flag>0</antispoofing_flag>
</second>
</item>
<item>
<first>9</first>
<second>
<i_satellite_PRN>9</i_satellite_PRN>
<d_TOW>5.18448000000000000e+05</d_TOW>
<d_IODE_SF2>4.70000000000000000e+01</d_IODE_SF2>
<d_IODE_SF3>4.70000000000000000e+01</d_IODE_SF3>
<d_Crs>1.12906250000000000e+02</d_Crs>
<d_Delta_n>4.37911097897818463e-09</d_Delta_n>
<d_M_0>-2.75253879947800195e+00</d_M_0>
<d_Cuc>5.85243105888366699e-06</d_Cuc>
<d_e_eccentricity>2.16206186451017829e-04</d_e_eccentricity>
<d_Cus>1.16303563117980957e-05</d_Cus>
<d_sqrt_A>5.15369471168518066e+03</d_sqrt_A>
<d_Toe>5.18400000000000000e+05</d_Toe>
<d_Toc>5.18400000000000000e+05</d_Toc>
<d_Cic>1.67638063430786133e-08</d_Cic>
<d_OMEGA0>3.03742251571970812e+00</d_OMEGA0>
<d_Cis>-1.11758708953857422e-08</d_Cis>
<d_i_0>9.59160503650671514e-01</d_i_0>
<d_Crc>1.56125000000000000e+02</d_Crc>
<d_OMEGA>2.60662251530764344e+00</d_OMEGA>
<d_OMEGA_DOT>-7.85854162551643464e-09</d_OMEGA_DOT>
<d_IDOT>-3.46443002170201364e-11</d_IDOT>
<i_code_on_L2>0</i_code_on_L2>
<i_GPS_week>799</i_GPS_week>
<b_L2_P_data_flag>0</b_L2_P_data_flag>
<i_SV_accuracy>2</i_SV_accuracy>
<i_SV_health>0</i_SV_health>
<d_TGD>4.65661287307739258e-10</d_TGD>
<d_IODC>4.70000000000000000e+01</d_IODC>
<i_AODO>27900</i_AODO>
<b_fit_interval_flag>0</b_fit_interval_flag>
<d_spare1>0.00000000000000000e+00</d_spare1>
<d_spare2>0.00000000000000000e+00</d_spare2>
<d_A_f0>-3.18535603582859039e-05</d_A_f0>
<d_A_f1>-9.66338120633736091e-12</d_A_f1>
<d_A_f2>0.00000000000000000e+00</d_A_f2>
<b_integrity_status_flag>0</b_integrity_status_flag>
<b_alert_flag>0</b_alert_flag>
<b_antispoofing_flag>0</b_antispoofing_flag>
<PRN>9</PRN>
<M_0>-2.75253879947800195e+00</M_0>
<delta_n>4.37911097897818463e-09</delta_n>
<ecc>2.16206186451017829e-04</ecc>
<sqrtA>5.15369471168518066e+03</sqrtA>
<OMEGA_0>3.03742251571970812e+00</OMEGA_0>
<i_0>9.59160503650671514e-01</i_0>
<omega>2.60662251530764344e+00</omega>
<OMEGAdot>-7.85854162551643464e-09</OMEGAdot>
<idot>-3.46443002170201364e-11</idot>
<Cuc>5.85243105888366699e-06</Cuc>
<Cus>1.16303563117980957e-05</Cus>
<Crc>1.56125000000000000e+02</Crc>
<Crs>1.12906250000000000e+02</Crs>
<Cic>1.67638063430786133e-08</Cic>
<Cis>-1.11758708953857422e-08</Cis>
<toe>518400</toe>
<toc>518400</toc>
<af0>-3.18535603582859039e-05</af0>
<af1>-9.66338120633736091e-12</af1>
<af2>0.00000000000000000e+00</af2>
<WN>799</WN>
<tow>518448</tow>
<satClkDrift>0.00000000000000000e+00</satClkDrift>
<dtr>0.00000000000000000e+00</dtr>
<IODE_SF2>47</IODE_SF2>
<IODE_SF3>47</IODE_SF3>
<code_on_L2>0</code_on_L2>
<L2_P_data_flag>0</L2_P_data_flag>
<SV_accuracy>2</SV_accuracy>
<SV_health>0</SV_health>
<TGD>4.65661287307739258e-10</TGD>
<IODC>47</IODC>
<AODO>27900</AODO>
<fit_interval_flag>0</fit_interval_flag>
<spare1>0.00000000000000000e+00</spare1>
<spare2>0.00000000000000000e+00</spare2>
<integrity_status_flag>0</integrity_status_flag>
<alert_flag>0</alert_flag>
<antispoofing_flag>0</antispoofing_flag>
</second>
</item>
<item>
<first>10</first>
<second>
<i_satellite_PRN>10</i_satellite_PRN>
<d_TOW>5.18448000000000000e+05</d_TOW>
<d_IODE_SF2>5.80000000000000000e+01</d_IODE_SF2>
<d_IODE_SF3>5.80000000000000000e+01</d_IODE_SF3>
<d_Crs>-2.72500000000000000e+01</d_Crs>
<d_Delta_n>5.27093384126580581e-09</d_Delta_n>
<d_M_0>-8.86982818851813737e-01</d_M_0>
<d_Cuc>-1.17719173431396484e-06</d_Cuc>
<d_e_eccentricity>1.44534236751496774e-02</d_e_eccentricity>
<d_Cus>7.90506601333618164e-06</d_Cus>
<d_sqrt_A>5.15363725471496582e+03</d_sqrt_A>
<d_Toe>5.18400000000000000e+05</d_Toe>
<d_Toc>5.18400000000000000e+05</d_Toc>
<d_Cic>1.45286321640014648e-07</d_Cic>
<d_OMEGA0>2.00408517949479270e+00</d_OMEGA0>
<d_Cis>2.40281224250793457e-07</d_Cis>
<d_i_0>9.41160112993577269e-01</d_i_0>
<d_Crc>2.15406250000000000e+02</d_Crc>
<d_OMEGA>9.09732121011562200e-01</d_OMEGA>
<d_OMEGA_DOT>-8.42213653007785350e-09</d_OMEGA_DOT>
<d_IDOT>-5.42879755978047536e-10</d_IDOT>
<i_code_on_L2>0</i_code_on_L2>
<i_GPS_week>799</i_GPS_week>
<b_L2_P_data_flag>0</b_L2_P_data_flag>
<i_SV_accuracy>2</i_SV_accuracy>
<i_SV_health>0</i_SV_health>
<d_TGD>-2.79396772384643555e-09</d_TGD>
<d_IODC>5.80000000000000000e+01</d_IODC>
<i_AODO>27900</i_AODO>
<b_fit_interval_flag>0</b_fit_interval_flag>
<d_spare1>0.00000000000000000e+00</d_spare1>
<d_spare2>0.00000000000000000e+00</d_spare2>
<d_A_f0>-1.54968351125717163e-04</d_A_f0>
<d_A_f1>-1.59161572810262401e-12</d_A_f1>
<d_A_f2>0.00000000000000000e+00</d_A_f2>
<b_integrity_status_flag>0</b_integrity_status_flag>
<b_alert_flag>0</b_alert_flag>
<b_antispoofing_flag>0</b_antispoofing_flag>
<PRN>10</PRN>
<M_0>-8.86982818851813737e-01</M_0>
<delta_n>5.27093384126580581e-09</delta_n>
<ecc>1.44534236751496774e-02</ecc>
<sqrtA>5.15363725471496582e+03</sqrtA>
<OMEGA_0>2.00408517949479270e+00</OMEGA_0>
<i_0>9.41160112993577269e-01</i_0>
<omega>9.09732121011562200e-01</omega>
<OMEGAdot>-8.42213653007785350e-09</OMEGAdot>
<idot>-5.42879755978047536e-10</idot>
<Cuc>-1.17719173431396484e-06</Cuc>
<Cus>7.90506601333618164e-06</Cus>
<Crc>2.15406250000000000e+02</Crc>
<Crs>-2.72500000000000000e+01</Crs>
<Cic>1.45286321640014648e-07</Cic>
<Cis>2.40281224250793457e-07</Cis>
<toe>518400</toe>
<toc>518400</toc>
<af0>-1.54968351125717163e-04</af0>
<af1>-1.59161572810262401e-12</af1>
<af2>0.00000000000000000e+00</af2>
<WN>799</WN>
<tow>518448</tow>
<satClkDrift>0.00000000000000000e+00</satClkDrift>
<dtr>0.00000000000000000e+00</dtr>
<IODE_SF2>58</IODE_SF2>
<IODE_SF3>58</IODE_SF3>
<code_on_L2>0</code_on_L2>
<L2_P_data_flag>0</L2_P_data_flag>
<SV_accuracy>2</SV_accuracy>
<SV_health>0</SV_health>
<TGD>-2.79396772384643555e-09</TGD>
<IODC>58</IODC>
<AODO>27900</AODO>
<fit_interval_flag>0</fit_interval_flag>
<spare1>0.00000000000000000e+00</spare1>
<spare2>0.00000000000000000e+00</spare2>
<integrity_status_flag>0</integrity_status_flag>
<alert_flag>0</alert_flag>
<antispoofing_flag>0</antispoofing_flag>
</second>
</item>
<item>
<first>12</first>
<second>
<i_satellite_PRN>12</i_satellite_PRN>
<d_TOW>5.18448000000000000e+05</d_TOW>
<d_IODE_SF2>1.06000000000000000e+02</d_IODE_SF2>
<d_IODE_SF3>1.06000000000000000e+02</d_IODE_SF3>
<d_Crs>-1.17468750000000000e+02</d_Crs>
<d_Delta_n>3.94516433192994276e-09</d_Delta_n>
<d_M_0>1.11631735294997192e+00</d_M_0>
<d_Cuc>-6.15417957305908203e-06</d_Cuc>
<d_e_eccentricity>5.05860964767634782e-03</d_e_eccentricity>
<d_Cus>4.52436506748199463e-06</d_Cus>
<d_sqrt_A>5.15376680946350098e+03</d_sqrt_A>
<d_Toe>5.18400000000000000e+05</d_Toe>
<d_Toc>5.18400000000000000e+05</d_Toc>
<d_Cic>-5.40167093276977539e-08</d_Cic>
<d_OMEGA0>-1.10425023618040785e+00</d_OMEGA0>
<d_Cis>4.09781932830810547e-08</d_Cis>
<d_i_0>9.88803748742243305e-01</d_i_0>
<d_Crc>3.07187500000000000e+02</d_Crc>
<d_OMEGA>5.00154452274795935e-01</d_OMEGA>
<d_OMEGA_DOT>-7.97176062725659211e-09</d_OMEGA_DOT>
<d_IDOT>-4.18231706743614228e-10</d_IDOT>
<i_code_on_L2>0</i_code_on_L2>
<i_GPS_week>799</i_GPS_week>
<b_L2_P_data_flag>0</b_L2_P_data_flag>
<i_SV_accuracy>2</i_SV_accuracy>
<i_SV_health>0</i_SV_health>
<d_TGD>-1.16415321826934814e-08</d_TGD>
<d_IODC>1.06000000000000000e+02</d_IODC>
<i_AODO>27900</i_AODO>
<b_fit_interval_flag>0</b_fit_interval_flag>
<d_spare1>0.00000000000000000e+00</d_spare1>
<d_spare2>0.00000000000000000e+00</d_spare2>
<d_A_f0>2.54871323704719543e-04</d_A_f0>
<d_A_f1>2.72848410531878391e-12</d_A_f1>
<d_A_f2>0.00000000000000000e+00</d_A_f2>
<b_integrity_status_flag>0</b_integrity_status_flag>
<b_alert_flag>0</b_alert_flag>
<b_antispoofing_flag>0</b_antispoofing_flag>
<PRN>12</PRN>
<M_0>1.11631735294997192e+00</M_0>
<delta_n>3.94516433192994276e-09</delta_n>
<ecc>5.05860964767634782e-03</ecc>
<sqrtA>5.15376680946350098e+03</sqrtA>
<OMEGA_0>-1.10425023618040785e+00</OMEGA_0>
<i_0>9.88803748742243305e-01</i_0>
<omega>5.00154452274795935e-01</omega>
<OMEGAdot>-7.97176062725659211e-09</OMEGAdot>
<idot>-4.18231706743614228e-10</idot>
<Cuc>-6.15417957305908203e-06</Cuc>
<Cus>4.52436506748199463e-06</Cus>
<Crc>3.07187500000000000e+02</Crc>
<Crs>-1.17468750000000000e+02</Crs>
<Cic>-5.40167093276977539e-08</Cic>
<Cis>4.09781932830810547e-08</Cis>
<toe>518400</toe>
<toc>518400</toc>
<af0>2.54871323704719543e-04</af0>
<af1>2.72848410531878391e-12</af1>
<af2>0.00000000000000000e+00</af2>
<WN>799</WN>
<tow>518448</tow>
<satClkDrift>0.00000000000000000e+00</satClkDrift>
<dtr>0.00000000000000000e+00</dtr>
<IODE_SF2>106</IODE_SF2>
<IODE_SF3>106</IODE_SF3>
<code_on_L2>0</code_on_L2>
<L2_P_data_flag>0</L2_P_data_flag>
<SV_accuracy>2</SV_accuracy>
<SV_health>0</SV_health>
<TGD>-1.16415321826934814e-08</TGD>
<IODC>106</IODC>
<AODO>27900</AODO>
<fit_interval_flag>0</fit_interval_flag>
<spare1>0.00000000000000000e+00</spare1>
<spare2>0.00000000000000000e+00</spare2>
<integrity_status_flag>0</integrity_status_flag>
<alert_flag>0</alert_flag>
<antispoofing_flag>0</antispoofing_flag>
</second>
</item>
<item>
<first>17</first>
<second>
<i_satellite_PRN>17</i_satellite_PRN>
<d_TOW>5.18448000000000000e+05</d_TOW>
<d_IODE_SF2>2.60000000000000000e+01</d_IODE_SF2>
<d_IODE_SF3>2.60000000000000000e+01</d_IODE_SF3>
<d_Crs>-5.91250000000000000e+01</d_Crs>
<d_Delta_n>3.88194741297723567e-09</d_Delta_n>
<d_M_0>-1.94252959218893162e+00</d_M_0>
<d_Cuc>-3.04728746414184570e-06</d_Cuc>
<d_e_eccentricity>9.88844956737011498e-03</d_e_eccentricity>
<d_Cus>1.18296593427658081e-05</d_Cus>
<d_sqrt_A>5.15369299888610840e+03</d_sqrt_A>
<d_Toe>5.18400000000000000e+05</d_Toe>
<d_Toc>5.18400000000000000e+05</d_Toc>
<d_Cic>2.03028321266174316e-07</d_Cic>
<d_OMEGA0>-5.68690999805671268e-02</d_OMEGA0>
<d_Cis>-7.63684511184692383e-08</d_Cis>
<d_i_0>9.71201777972365177e-01</d_i_0>
<d_Crc>1.56531250000000000e+02</d_Crc>
<d_OMEGA>-2.06928329237789344e+00</d_OMEGA>
<d_OMEGA_DOT>-7.44602444251995675e-09</d_OMEGA_DOT>
<d_IDOT>4.40375486263771432e-10</d_IDOT>
<i_code_on_L2>0</i_code_on_L2>
<i_GPS_week>799</i_GPS_week>
<b_L2_P_data_flag>0</b_L2_P_data_flag>
<i_SV_accuracy>2</i_SV_accuracy>
<i_SV_health>0</i_SV_health>
<d_TGD>-1.07102096080780029e-08</d_TGD>
<d_IODC>2.60000000000000000e+01</d_IODC>
<i_AODO>27900</i_AODO>
<b_fit_interval_flag>0</b_fit_interval_flag>
<d_spare1>0.00000000000000000e+00</d_spare1>
<d_spare2>0.00000000000000000e+00</d_spare2>
<d_A_f0>-1.44933816045522690e-04</d_A_f0>
<d_A_f1>-2.27373675443232019e-12</d_A_f1>
<d_A_f2>0.00000000000000000e+00</d_A_f2>
<b_integrity_status_flag>0</b_integrity_status_flag>
<b_alert_flag>0</b_alert_flag>
<b_antispoofing_flag>0</b_antispoofing_flag>
<PRN>17</PRN>
<M_0>-1.94252959218893162e+00</M_0>
<delta_n>3.88194741297723567e-09</delta_n>
<ecc>9.88844956737011498e-03</ecc>
<sqrtA>5.15369299888610840e+03</sqrtA>
<OMEGA_0>-5.68690999805671268e-02</OMEGA_0>
<i_0>9.71201777972365177e-01</i_0>
<omega>-2.06928329237789344e+00</omega>
<OMEGAdot>-7.44602444251995675e-09</OMEGAdot>
<idot>4.40375486263771432e-10</idot>
<Cuc>-3.04728746414184570e-06</Cuc>
<Cus>1.18296593427658081e-05</Cus>
<Crc>1.56531250000000000e+02</Crc>
<Crs>-5.91250000000000000e+01</Crs>
<Cic>2.03028321266174316e-07</Cic>
<Cis>-7.63684511184692383e-08</Cis>
<toe>518400</toe>
<toc>518400</toc>
<af0>-1.44933816045522690e-04</af0>
<af1>-2.27373675443232019e-12</af1>
<af2>0.00000000000000000e+00</af2>
<WN>799</WN>
<tow>518448</tow>
<satClkDrift>0.00000000000000000e+00</satClkDrift>
<dtr>0.00000000000000000e+00</dtr>
<IODE_SF2>26</IODE_SF2>
<IODE_SF3>26</IODE_SF3>
<code_on_L2>0</code_on_L2>
<L2_P_data_flag>0</L2_P_data_flag>
<SV_accuracy>2</SV_accuracy>
<SV_health>0</SV_health>
<TGD>-1.07102096080780029e-08</TGD>
<IODC>26</IODC>
<AODO>27900</AODO>
<fit_interval_flag>0</fit_interval_flag>
<spare1>0.00000000000000000e+00</spare1>
<spare2>0.00000000000000000e+00</spare2>
<integrity_status_flag>0</integrity_status_flag>
<alert_flag>0</alert_flag>
<antispoofing_flag>0</antispoofing_flag>
</second>
</item>
<item>
<first>20</first>
<second>
<i_satellite_PRN>20</i_satellite_PRN>
<d_TOW>5.18448000000000000e+05</d_TOW>
<d_IODE_SF2>1.17000000000000000e+02</d_IODE_SF2>
<d_IODE_SF3>1.17000000000000000e+02</d_IODE_SF3>
<d_Crs>-2.58437500000000000e+01</d_Crs>
<d_Delta_n>5.60380484953655626e-09</d_Delta_n>
<d_M_0>1.28625710142833249e-01</d_M_0>
<d_Cuc>-1.52923166751861572e-06</d_Cuc>
<d_e_eccentricity>5.80669869668781671e-03</d_e_eccentricity>
<d_Cus>7.51018524169921875e-06</d_Cus>
<d_sqrt_A>5.15578671264648438e+03</d_sqrt_A>
<d_Toe>5.18400000000000000e+05</d_Toe>
<d_Toc>5.18400000000000000e+05</d_Toc>
<d_Cic>-2.23517417907714844e-08</d_Cic>
<d_OMEGA0>1.92543994118208528e+00</d_OMEGA0>
<d_Cis>4.65661287307739258e-08</d_Cis>
<d_i_0>9.26021286652122910e-01</d_i_0>
<d_Crc>2.18031250000000000e+02</d_Crc>
<d_OMEGA>1.23365536128043107e+00</d_OMEGA>
<d_OMEGA_DOT>-8.54892752571746483e-09</d_OMEGA_DOT>
<d_IDOT>-5.16450083647537340e-10</d_IDOT>
<i_code_on_L2>0</i_code_on_L2>
<i_GPS_week>799</i_GPS_week>
<b_L2_P_data_flag>0</b_L2_P_data_flag>
<i_SV_accuracy>2</i_SV_accuracy>
<i_SV_health>0</i_SV_health>
<d_TGD>-8.38190317153930664e-09</d_TGD>
<d_IODC>1.17000000000000000e+02</d_IODC>
<i_AODO>27900</i_AODO>
<b_fit_interval_flag>0</b_fit_interval_flag>
<d_spare1>0.00000000000000000e+00</d_spare1>
<d_spare2>0.00000000000000000e+00</d_spare2>
<d_A_f0>2.69209500402212143e-04</d_A_f0>
<d_A_f1>4.20641299569979229e-12</d_A_f1>
<d_A_f2>0.00000000000000000e+00</d_A_f2>
<b_integrity_status_flag>0</b_integrity_status_flag>
<b_alert_flag>0</b_alert_flag>
<b_antispoofing_flag>0</b_antispoofing_flag>
<PRN>20</PRN>
<M_0>1.28625710142833249e-01</M_0>
<delta_n>5.60380484953655626e-09</delta_n>
<ecc>5.80669869668781671e-03</ecc>
<sqrtA>5.15578671264648438e+03</sqrtA>
<OMEGA_0>1.92543994118208528e+00</OMEGA_0>
<i_0>9.26021286652122910e-01</i_0>
<omega>1.23365536128043107e+00</omega>
<OMEGAdot>-8.54892752571746483e-09</OMEGAdot>
<idot>-5.16450083647537340e-10</idot>
<Cuc>-1.52923166751861572e-06</Cuc>
<Cus>7.51018524169921875e-06</Cus>
<Crc>2.18031250000000000e+02</Crc>
<Crs>-2.58437500000000000e+01</Crs>
<Cic>-2.23517417907714844e-08</Cic>
<Cis>4.65661287307739258e-08</Cis>
<toe>518400</toe>
<toc>518400</toc>
<af0>2.69209500402212143e-04</af0>
<af1>4.20641299569979229e-12</af1>
<af2>0.00000000000000000e+00</af2>
<WN>799</WN>
<tow>518448</tow>
<satClkDrift>0.00000000000000000e+00</satClkDrift>
<dtr>0.00000000000000000e+00</dtr>
<IODE_SF2>117</IODE_SF2>
<IODE_SF3>117</IODE_SF3>
<code_on_L2>0</code_on_L2>
<L2_P_data_flag>0</L2_P_data_flag>
<SV_accuracy>2</SV_accuracy>
<SV_health>0</SV_health>
<TGD>-8.38190317153930664e-09</TGD>
<IODC>117</IODC>
<AODO>27900</AODO>
<fit_interval_flag>0</fit_interval_flag>
<spare1>0.00000000000000000e+00</spare1>
<spare2>0.00000000000000000e+00</spare2>
<integrity_status_flag>0</integrity_status_flag>
<alert_flag>0</alert_flag>
<antispoofing_flag>0</antispoofing_flag>
</second>
</item>
<item>
<first>23</first>
<second>
<i_satellite_PRN>23</i_satellite_PRN>
<d_TOW>5.18448000000000000e+05</d_TOW>
<d_IODE_SF2>4.10000000000000000e+01</d_IODE_SF2>
<d_IODE_SF3>4.10000000000000000e+01</d_IODE_SF3>
<d_Crs>1.20250000000000000e+02</d_Crs>
<d_Delta_n>4.45161399901998963e-09</d_Delta_n>
<d_M_0>3.04794581942897569e+00</d_M_0>
<d_Cuc>6.13741576671600342e-06</d_Cuc>
<d_e_eccentricity>9.67817602213471954e-03</d_e_eccentricity>
<d_Cus>1.14180147647857666e-05</d_Cus>
<d_sqrt_A>5.15370163154602051e+03</d_sqrt_A>
<d_Toe>5.18400000000000000e+05</d_Toe>
<d_Toc>5.18400000000000000e+05</d_Toc>
<d_Cic>-6.14672899246215820e-08</d_Cic>
<d_OMEGA0>3.04748172476042711e+00</d_OMEGA0>
<d_Cis>-1.04308128356933594e-07</d_Cis>
<d_i_0>9.50229191282804808e-01</d_i_0>
<d_Crc>1.56000000000000000e+02</d_Crc>
<d_OMEGA>-2.71676891930177256e+00</d_OMEGA>
<d_OMEGA_DOT>-7.78032408172749087e-09</d_OMEGA_DOT>
<d_IDOT>-2.75011455330984601e-11</d_IDOT>
<i_code_on_L2>0</i_code_on_L2>
<i_GPS_week>799</i_GPS_week>
<b_L2_P_data_flag>0</b_L2_P_data_flag>
<i_SV_accuracy>2</i_SV_accuracy>
<i_SV_health>0</i_SV_health>
<d_TGD>-1.95577740669250488e-08</d_TGD>
<d_IODC>4.10000000000000000e+01</d_IODC>
<i_AODO>27900</i_AODO>
<b_fit_interval_flag>0</b_fit_interval_flag>
<d_spare1>0.00000000000000000e+00</d_spare1>
<d_spare2>0.00000000000000000e+00</d_spare2>
<d_A_f0>-7.56788067519664764e-05</d_A_f0>
<d_A_f1>-2.72848410531878391e-12</d_A_f1>
<d_A_f2>0.00000000000000000e+00</d_A_f2>
<b_integrity_status_flag>0</b_integrity_status_flag>
<b_alert_flag>0</b_alert_flag>
<b_antispoofing_flag>0</b_antispoofing_flag>
<PRN>23</PRN>
<M_0>3.04794581942897569e+00</M_0>
<delta_n>4.45161399901998963e-09</delta_n>
<ecc>9.67817602213471954e-03</ecc>
<sqrtA>5.15370163154602051e+03</sqrtA>
<OMEGA_0>3.04748172476042711e+00</OMEGA_0>
<i_0>9.50229191282804808e-01</i_0>
<omega>-2.71676891930177256e+00</omega>
<OMEGAdot>-7.78032408172749087e-09</OMEGAdot>
<idot>-2.75011455330984601e-11</idot>
<Cuc>6.13741576671600342e-06</Cuc>
<Cus>1.14180147647857666e-05</Cus>
<Crc>1.56000000000000000e+02</Crc>
<Crs>1.20250000000000000e+02</Crs>
<Cic>-6.14672899246215820e-08</Cic>
<Cis>-1.04308128356933594e-07</Cis>
<toe>518400</toe>
<toc>518400</toc>
<af0>-7.56788067519664764e-05</af0>
<af1>-2.72848410531878391e-12</af1>
<af2>0.00000000000000000e+00</af2>
<WN>799</WN>
<tow>518448</tow>
<satClkDrift>0.00000000000000000e+00</satClkDrift>
<dtr>0.00000000000000000e+00</dtr>
<IODE_SF2>41</IODE_SF2>
<IODE_SF3>41</IODE_SF3>
<code_on_L2>0</code_on_L2>
<L2_P_data_flag>0</L2_P_data_flag>
<SV_accuracy>2</SV_accuracy>
<SV_health>0</SV_health>
<TGD>-1.95577740669250488e-08</TGD>
<IODC>41</IODC>
<AODO>27900</AODO>
<fit_interval_flag>0</fit_interval_flag>
<spare1>0.00000000000000000e+00</spare1>
<spare2>0.00000000000000000e+00</spare2>
<integrity_status_flag>0</integrity_status_flag>
<alert_flag>0</alert_flag>
<antispoofing_flag>0</antispoofing_flag>
</second>
</item>
<item>
<first>28</first>
<second>
<i_satellite_PRN>28</i_satellite_PRN>
<d_TOW>5.18448000000000000e+05</d_TOW>
<d_IODE_SF2>3.30000000000000000e+01</d_IODE_SF2>
<d_IODE_SF3>3.30000000000000000e+01</d_IODE_SF3>
<d_Crs>-1.27750000000000000e+02</d_Crs>
<d_Delta_n>4.04302555109966970e-09</d_Delta_n>
<d_M_0>-1.16607683198628931e+00</d_M_0>
<d_Cuc>-6.37024641036987305e-06</d_Cuc>
<d_e_eccentricity>1.97223023278638686e-02</d_e_eccentricity>
<d_Cus>5.66989183425903320e-06</d_Cus>
<d_sqrt_A>5.15368548965454102e+03</d_sqrt_A>
<d_Toe>5.18400000000000000e+05</d_Toe>
<d_Toc>5.18400000000000000e+05</d_Toc>
<d_Cic>-1.37835741043090820e-07</d_Cic>
<d_OMEGA0>-1.08006546321039543e+00</d_OMEGA0>
<d_Cis>4.35858964920043945e-07</d_Cis>
<d_i_0>9.87961552655681530e-01</d_i_0>
<d_Crc>2.84718750000000000e+02</d_Crc>
<d_OMEGA>-1.69047108635756738e+00</d_OMEGA>
<d_OMEGA_DOT>-8.17855495535612472e-09</d_OMEGA_DOT>
<d_IDOT>-4.44661379074124424e-10</d_IDOT>
<i_code_on_L2>0</i_code_on_L2>
<i_GPS_week>799</i_GPS_week>
<b_L2_P_data_flag>0</b_L2_P_data_flag>
<i_SV_accuracy>2</i_SV_accuracy>
<i_SV_health>0</i_SV_health>
<d_TGD>-1.11758708953857422e-08</d_TGD>
<d_IODC>3.30000000000000000e+01</d_IODC>
<i_AODO>27900</i_AODO>
<b_fit_interval_flag>0</b_fit_interval_flag>
<d_spare1>0.00000000000000000e+00</d_spare1>
<d_spare2>0.00000000000000000e+00</d_spare2>
<d_A_f0>4.06486913561820984e-04</d_A_f0>
<d_A_f1>2.61479726759716828e-12</d_A_f1>
<d_A_f2>0.00000000000000000e+00</d_A_f2>
<b_integrity_status_flag>0</b_integrity_status_flag>
<b_alert_flag>0</b_alert_flag>
<b_antispoofing_flag>0</b_antispoofing_flag>
<PRN>28</PRN>
<M_0>-1.16607683198628931e+00</M_0>
<delta_n>4.04302555109966970e-09</delta_n>
<ecc>1.97223023278638686e-02</ecc>
<sqrtA>5.15368548965454102e+03</sqrtA>
<OMEGA_0>-1.08006546321039543e+00</OMEGA_0>
<i_0>9.87961552655681530e-01</i_0>
<omega>-1.69047108635756738e+00</omega>
<OMEGAdot>-8.17855495535612472e-09</OMEGAdot>
<idot>-4.44661379074124424e-10</idot>
<Cuc>-6.37024641036987305e-06</Cuc>
<Cus>5.66989183425903320e-06</Cus>
<Crc>2.84718750000000000e+02</Crc>
<Crs>-1.27750000000000000e+02</Crs>
<Cic>-1.37835741043090820e-07</Cic>
<Cis>4.35858964920043945e-07</Cis>
<toe>518400</toe>
<toc>518400</toc>
<af0>4.06486913561820984e-04</af0>
<af1>2.61479726759716828e-12</af1>
<af2>0.00000000000000000e+00</af2>
<WN>799</WN>
<tow>518448</tow>
<satClkDrift>0.00000000000000000e+00</satClkDrift>
<dtr>0.00000000000000000e+00</dtr>
<IODE_SF2>33</IODE_SF2>
<IODE_SF3>33</IODE_SF3>
<code_on_L2>0</code_on_L2>
<L2_P_data_flag>0</L2_P_data_flag>
<SV_accuracy>2</SV_accuracy>
<SV_health>0</SV_health>
<TGD>-1.11758708953857422e-08</TGD>
<IODC>33</IODC>
<AODO>27900</AODO>
<fit_interval_flag>0</fit_interval_flag>
<spare1>0.00000000000000000e+00</spare1>
<spare2>0.00000000000000000e+00</spare2>
<integrity_status_flag>0</integrity_status_flag>
<alert_flag>0</alert_flag>
<antispoofing_flag>0</antispoofing_flag>
</second>
</item>
</GNSS-SDR_ephemeris_map>
@@ -0,0 +1,2 @@
SPDX-License-Identifier: GPL-3.0-or-later
SPDX-FileCopyrightText: 2018 Javier Arribas <javier.arribas@cttc.es>
+60 -42
View File
@@ -1,6 +1,4 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!-- SPDX-License-Identifier: GPL-3.0-or-later -->
<!-- SPDX-FileCopyrightText: 2018 Javier Arribas <javier.arribas@cttc.es> -->
<!DOCTYPE boost_serialization>
<boost_serialization signature="serialization::archive" version="12">
<GNSS-SDR_gnss_synchro_map class_id="0" tracking_level="0" version="0">
@@ -22,7 +20,6 @@
<Acq_doppler_hz>-2.50000000000000000e+03</Acq_doppler_hz>
<Acq_samplestamp_samples>10791</Acq_samplestamp_samples>
<Acq_doppler_step>0</Acq_doppler_step>
<Flag_valid_acquisition>0</Flag_valid_acquisition>
<fs>2600000</fs>
<Prompt_I>-3.85959140625000000e+04</Prompt_I>
<Prompt_Q>-9.03592163085937500e+02</Prompt_Q>
@@ -31,14 +28,17 @@
<Carrier_phase_rads>8.35350813421410858e+05</Carrier_phase_rads>
<Code_phase_samples>3.31084377635761484e-01</Code_phase_samples>
<Tracking_sample_counter>133923691</Tracking_sample_counter>
<Flag_valid_symbol_output>1</Flag_valid_symbol_output>
<correlation_length_ms>1</correlation_length_ms>
<Flag_valid_word>1</Flag_valid_word>
<TOW_at_current_symbol_ms>518451424</TOW_at_current_symbol_ms>
<Pseudorange_m>2.28178186234515086e+07</Pseudorange_m>
<RX_time>5.18451500000000000e+05</RX_time>
<Flag_valid_pseudorange>1</Flag_valid_pseudorange>
<interp_TOW_ms>5.18451423887949765e+08</interp_TOW_ms>
<Flag_valid_acquisition>0</Flag_valid_acquisition>
<Flag_valid_symbol_output>1</Flag_valid_symbol_output>
<Flag_valid_word>1</Flag_valid_word>
<Flag_valid_pseudorange>1</Flag_valid_pseudorange>
<Flag_PLL_180_deg_phase_locked>0</Flag_PLL_180_deg_phase_locked>
<Flag_cycle_slip>0</Flag_cycle_slip>
</second>
</item>
<item>
@@ -57,7 +57,6 @@
<Acq_doppler_hz>-3.00000000000000000e+03</Acq_doppler_hz>
<Acq_samplestamp_samples>68450858</Acq_samplestamp_samples>
<Acq_doppler_step>0</Acq_doppler_step>
<Flag_valid_acquisition>0</Flag_valid_acquisition>
<fs>2600000</fs>
<Prompt_I>-4.34972734375000000e+04</Prompt_I>
<Prompt_Q>4.21364685058593750e+02</Prompt_Q>
@@ -66,14 +65,17 @@
<Carrier_phase_rads>4.93910706686261110e+05</Carrier_phase_rads>
<Code_phase_samples>7.36033200862493686e-01</Code_phase_samples>
<Tracking_sample_counter>133923971</Tracking_sample_counter>
<Flag_valid_symbol_output>1</Flag_valid_symbol_output>
<correlation_length_ms>1</correlation_length_ms>
<Flag_valid_word>1</Flag_valid_word>
<TOW_at_current_symbol_ms>518451431</TOW_at_current_symbol_ms>
<Pseudorange_m>2.07516033774388395e+07</Pseudorange_m>
<RX_time>5.18451500000000000e+05</RX_time>
<Flag_valid_pseudorange>1</Flag_valid_pseudorange>
<interp_TOW_ms>5.18451430780101955e+08</interp_TOW_ms>
<Flag_valid_acquisition>0</Flag_valid_acquisition>
<Flag_valid_symbol_output>1</Flag_valid_symbol_output>
<Flag_valid_word>1</Flag_valid_word>
<Flag_valid_pseudorange>1</Flag_valid_pseudorange>
<Flag_PLL_180_deg_phase_locked>0</Flag_PLL_180_deg_phase_locked>
<Flag_cycle_slip>0</Flag_cycle_slip>
</second>
</item>
<item>
@@ -92,7 +94,6 @@
<Acq_doppler_hz>-3.00000000000000000e+03</Acq_doppler_hz>
<Acq_samplestamp_samples>1350770</Acq_samplestamp_samples>
<Acq_doppler_step>0</Acq_doppler_step>
<Flag_valid_acquisition>0</Flag_valid_acquisition>
<fs>2600000</fs>
<Prompt_I>4.46268046875000000e+04</Prompt_I>
<Prompt_Q>-3.98811938476562500e+03</Prompt_Q>
@@ -101,14 +102,17 @@
<Carrier_phase_rads>9.35704822809229488e+05</Carrier_phase_rads>
<Code_phase_samples>9.30327007595224131e-01</Code_phase_samples>
<Tracking_sample_counter>133923941</Tracking_sample_counter>
<Flag_valid_symbol_output>1</Flag_valid_symbol_output>
<correlation_length_ms>1</correlation_length_ms>
<Flag_valid_word>1</Flag_valid_word>
<TOW_at_current_symbol_ms>518451436</TOW_at_current_symbol_ms>
<Pseudorange_m>1.92492043561209217e+07</Pseudorange_m>
<RX_time>5.18451500000000000e+05</RX_time>
<Flag_valid_pseudorange>1</Flag_valid_pseudorange>
<interp_TOW_ms>5.18451435791565657e+08</interp_TOW_ms>
<Flag_valid_acquisition>0</Flag_valid_acquisition>
<Flag_valid_symbol_output>1</Flag_valid_symbol_output>
<Flag_valid_word>1</Flag_valid_word>
<Flag_valid_pseudorange>1</Flag_valid_pseudorange>
<Flag_PLL_180_deg_phase_locked>0</Flag_PLL_180_deg_phase_locked>
<Flag_cycle_slip>0</Flag_cycle_slip>
</second>
</item>
<item>
@@ -127,7 +131,6 @@
<Acq_doppler_hz>1.00000000000000000e+03</Acq_doppler_hz>
<Acq_samplestamp_samples>994247</Acq_samplestamp_samples>
<Acq_doppler_step>0</Acq_doppler_step>
<Flag_valid_acquisition>0</Flag_valid_acquisition>
<fs>2600000</fs>
<Prompt_I>3.98655546875000000e+04</Prompt_I>
<Prompt_Q>-8.63781860351562500e+02</Prompt_Q>
@@ -136,14 +139,17 @@
<Carrier_phase_rads>-3.54128275530727289e+05</Carrier_phase_rads>
<Code_phase_samples>4.08304036132904002e-01</Code_phase_samples>
<Tracking_sample_counter>133922883</Tracking_sample_counter>
<Flag_valid_symbol_output>1</Flag_valid_symbol_output>
<correlation_length_ms>1</correlation_length_ms>
<Flag_valid_word>1</Flag_valid_word>
<TOW_at_current_symbol_ms>518451429</TOW_at_current_symbol_ms>
<Pseudorange_m>2.12256989876578376e+07</Pseudorange_m>
<RX_time>5.18451500000000000e+05</RX_time>
<Flag_valid_pseudorange>1</Flag_valid_pseudorange>
<interp_TOW_ms>5.18451429198689222e+08</interp_TOW_ms>
<Flag_valid_acquisition>0</Flag_valid_acquisition>
<Flag_valid_symbol_output>1</Flag_valid_symbol_output>
<Flag_valid_word>1</Flag_valid_word>
<Flag_valid_pseudorange>1</Flag_valid_pseudorange>
<Flag_PLL_180_deg_phase_locked>0</Flag_PLL_180_deg_phase_locked>
<Flag_cycle_slip>0</Flag_cycle_slip>
</second>
</item>
<item>
@@ -162,7 +168,6 @@
<Acq_doppler_hz>1.75000000000000000e+03</Acq_doppler_hz>
<Acq_samplestamp_samples>4917751</Acq_samplestamp_samples>
<Acq_doppler_step>0</Acq_doppler_step>
<Flag_valid_acquisition>0</Flag_valid_acquisition>
<fs>2600000</fs>
<Prompt_I>-4.72456406250000000e+04</Prompt_I>
<Prompt_Q>-2.63723022460937500e+02</Prompt_Q>
@@ -171,14 +176,17 @@
<Carrier_phase_rads>-5.72184006019302527e+05</Carrier_phase_rads>
<Code_phase_samples>5.89544135488722532e-01</Code_phase_samples>
<Tracking_sample_counter>133922337</Tracking_sample_counter>
<Flag_valid_symbol_output>1</Flag_valid_symbol_output>
<correlation_length_ms>1</correlation_length_ms>
<Flag_valid_word>1</Flag_valid_word>
<TOW_at_current_symbol_ms>518451430</TOW_at_current_symbol_ms>
<Pseudorange_m>2.08629709015843943e+07</Pseudorange_m>
<RX_time>5.18451500000000000e+05</RX_time>
<Flag_valid_pseudorange>1</Flag_valid_pseudorange>
<interp_TOW_ms>5.18451430408619881e+08</interp_TOW_ms>
<Flag_valid_acquisition>0</Flag_valid_acquisition>
<Flag_valid_symbol_output>1</Flag_valid_symbol_output>
<Flag_valid_word>1</Flag_valid_word>
<Flag_valid_pseudorange>1</Flag_valid_pseudorange>
<Flag_PLL_180_deg_phase_locked>0</Flag_PLL_180_deg_phase_locked>
<Flag_cycle_slip>0</Flag_cycle_slip>
</second>
</item>
<item>
@@ -197,7 +205,6 @@
<Acq_doppler_hz>2.50000000000000000e+02</Acq_doppler_hz>
<Acq_samplestamp_samples>514377</Acq_samplestamp_samples>
<Acq_doppler_step>0</Acq_doppler_step>
<Flag_valid_acquisition>0</Flag_valid_acquisition>
<fs>2600000</fs>
<Prompt_I>4.27717460937500000e+04</Prompt_I>
<Prompt_Q>-9.45822082519531250e+02</Prompt_Q>
@@ -206,14 +213,17 @@
<Carrier_phase_rads>-9.09813659855529113e+04</Carrier_phase_rads>
<Code_phase_samples>6.57473345280777721e-01</Code_phase_samples>
<Tracking_sample_counter>133923172</Tracking_sample_counter>
<Flag_valid_symbol_output>1</Flag_valid_symbol_output>
<correlation_length_ms>1</correlation_length_ms>
<Flag_valid_word>1</Flag_valid_word>
<TOW_at_current_symbol_ms>518451440</TOW_at_current_symbol_ms>
<Pseudorange_m>1.79613337841309197e+07</Pseudorange_m>
<RX_time>5.18451500000000000e+05</RX_time>
<Flag_valid_pseudorange>1</Flag_valid_pseudorange>
<interp_TOW_ms>5.18451440087439477e+08</interp_TOW_ms>
<Flag_valid_acquisition>0</Flag_valid_acquisition>
<Flag_valid_symbol_output>1</Flag_valid_symbol_output>
<Flag_valid_word>1</Flag_valid_word>
<Flag_valid_pseudorange>1</Flag_valid_pseudorange>
<Flag_PLL_180_deg_phase_locked>0</Flag_PLL_180_deg_phase_locked>
<Flag_cycle_slip>0</Flag_cycle_slip>
</second>
</item>
<item>
@@ -232,7 +242,6 @@
<Acq_doppler_hz>2.25000000000000000e+03</Acq_doppler_hz>
<Acq_samplestamp_samples>7365787</Acq_samplestamp_samples>
<Acq_doppler_step>0</Acq_doppler_step>
<Flag_valid_acquisition>0</Flag_valid_acquisition>
<fs>2600000</fs>
<Prompt_I>-3.96159960937500000e+04</Prompt_I>
<Prompt_Q>-5.03847460937500000e+03</Prompt_Q>
@@ -241,14 +250,17 @@
<Carrier_phase_rads>-7.04913853936602012e+05</Carrier_phase_rads>
<Code_phase_samples>3.21518194999043772e-01</Code_phase_samples>
<Tracking_sample_counter>133922169</Tracking_sample_counter>
<Flag_valid_symbol_output>1</Flag_valid_symbol_output>
<correlation_length_ms>1</correlation_length_ms>
<Flag_valid_word>1</Flag_valid_word>
<TOW_at_current_symbol_ms>518451430</TOW_at_current_symbol_ms>
<Pseudorange_m>2.08435687343175523e+07</Pseudorange_m>
<RX_time>5.18451500000000000e+05</RX_time>
<Flag_valid_pseudorange>1</Flag_valid_pseudorange>
<interp_TOW_ms>5.18451430473338544e+08</interp_TOW_ms>
<Flag_valid_acquisition>0</Flag_valid_acquisition>
<Flag_valid_symbol_output>1</Flag_valid_symbol_output>
<Flag_valid_word>1</Flag_valid_word>
<Flag_valid_pseudorange>1</Flag_valid_pseudorange>
<Flag_PLL_180_deg_phase_locked>0</Flag_PLL_180_deg_phase_locked>
<Flag_cycle_slip>0</Flag_cycle_slip>
</second>
</item>
<item>
@@ -267,7 +279,6 @@
<Acq_doppler_hz>2.75000000000000000e+03</Acq_doppler_hz>
<Acq_samplestamp_samples>2173576</Acq_samplestamp_samples>
<Acq_doppler_step>0</Acq_doppler_step>
<Flag_valid_acquisition>0</Flag_valid_acquisition>
<fs>2600000</fs>
<Prompt_I>4.00322539062500000e+04</Prompt_I>
<Prompt_Q>-3.88590087890625000e+02</Prompt_Q>
@@ -276,14 +287,17 @@
<Carrier_phase_rads>-8.99142229977656389e+05</Carrier_phase_rads>
<Code_phase_samples>1.02370741655249731e-01</Code_phase_samples>
<Tracking_sample_counter>133922664</Tracking_sample_counter>
<Flag_valid_symbol_output>1</Flag_valid_symbol_output>
<correlation_length_ms>1</correlation_length_ms>
<Flag_valid_word>1</Flag_valid_word>
<TOW_at_current_symbol_ms>518451438</TOW_at_current_symbol_ms>
<Pseudorange_m>1.85022797143675610e+07</Pseudorange_m>
<RX_time>5.18451500000000000e+05</RX_time>
<Flag_valid_pseudorange>1</Flag_valid_pseudorange>
<interp_TOW_ms>5.18451438283038080e+08</interp_TOW_ms>
<Flag_valid_acquisition>0</Flag_valid_acquisition>
<Flag_valid_symbol_output>1</Flag_valid_symbol_output>
<Flag_valid_word>1</Flag_valid_word>
<Flag_valid_pseudorange>1</Flag_valid_pseudorange>
<Flag_PLL_180_deg_phase_locked>0</Flag_PLL_180_deg_phase_locked>
<Flag_cycle_slip>0</Flag_cycle_slip>
</second>
</item>
<item>
@@ -302,7 +316,6 @@
<Acq_doppler_hz>3.00000000000000000e+03</Acq_doppler_hz>
<Acq_samplestamp_samples>7464974</Acq_samplestamp_samples>
<Acq_doppler_step>0</Acq_doppler_step>
<Flag_valid_acquisition>0</Flag_valid_acquisition>
<fs>2600000</fs>
<Prompt_I>-4.03654140625000000e+04</Prompt_I>
<Prompt_Q>3.92351245117187500e+03</Prompt_Q>
@@ -311,14 +324,17 @@
<Carrier_phase_rads>-9.28340507655202877e+05</Carrier_phase_rads>
<Code_phase_samples>5.73995602361264901e-01</Code_phase_samples>
<Tracking_sample_counter>133923741</Tracking_sample_counter>
<Flag_valid_symbol_output>1</Flag_valid_symbol_output>
<correlation_length_ms>1</correlation_length_ms>
<Flag_valid_word>1</Flag_valid_word>
<TOW_at_current_symbol_ms>518451427</TOW_at_current_symbol_ms>
<Pseudorange_m>2.19242346189941987e+07</Pseudorange_m>
<RX_time>5.18451500000000000e+05</RX_time>
<Flag_valid_pseudorange>1</Flag_valid_pseudorange>
<interp_TOW_ms>5.18451426868625164e+08</interp_TOW_ms>
<Flag_valid_acquisition>0</Flag_valid_acquisition>
<Flag_valid_symbol_output>1</Flag_valid_symbol_output>
<Flag_valid_word>1</Flag_valid_word>
<Flag_valid_pseudorange>1</Flag_valid_pseudorange>
<Flag_PLL_180_deg_phase_locked>0</Flag_PLL_180_deg_phase_locked>
<Flag_cycle_slip>0</Flag_cycle_slip>
</second>
</item>
<item>
@@ -337,7 +353,6 @@
<Acq_doppler_hz>5.00000000000000000e+02</Acq_doppler_hz>
<Acq_samplestamp_samples>1859813</Acq_samplestamp_samples>
<Acq_doppler_step>0</Acq_doppler_step>
<Flag_valid_acquisition>0</Flag_valid_acquisition>
<fs>2600000</fs>
<Prompt_I>3.87814335937500000e+04</Prompt_I>
<Prompt_Q>2.13637329101562500e+03</Prompt_Q>
@@ -346,14 +361,17 @@
<Carrier_phase_rads>-1.78723083774703584e+05</Carrier_phase_rads>
<Code_phase_samples>3.47952294631795667e-01</Code_phase_samples>
<Tracking_sample_counter>133924211</Tracking_sample_counter>
<Flag_valid_symbol_output>1</Flag_valid_symbol_output>
<correlation_length_ms>1</correlation_length_ms>
<Flag_valid_word>1</Flag_valid_word>
<TOW_at_current_symbol_ms>518451439</TOW_at_current_symbol_ms>
<Pseudorange_m>1.83808922785463184e+07</Pseudorange_m>
<RX_time>5.18451500000000000e+05</RX_time>
<Flag_valid_pseudorange>1</Flag_valid_pseudorange>
<interp_TOW_ms>5.18451438687942982e+08</interp_TOW_ms>
<Flag_valid_acquisition>0</Flag_valid_acquisition>
<Flag_valid_symbol_output>1</Flag_valid_symbol_output>
<Flag_valid_word>1</Flag_valid_word>
<Flag_valid_pseudorange>1</Flag_valid_pseudorange>
<Flag_PLL_180_deg_phase_locked>0</Flag_PLL_180_deg_phase_locked>
<Flag_cycle_slip>0</Flag_cycle_slip>
</second>
</item>
</GNSS-SDR_gnss_synchro_map>
@@ -0,0 +1,2 @@
SPDX-License-Identifier: GPL-3.0-or-later
SPDX-FileCopyrightText: 2018 Javier Arribas <javier.arribas@cttc.es>
+11
View File
@@ -298,6 +298,17 @@ int PositionSystemTest::configure_receiver()
{
config->set_property("GNSS-SDR.use_acquisition_resampler", "true");
}
#if USE_GLOG_AND_GFLAGS
if (FLAGS_rinex_nav_file == std::string(DEFAULT_RINEX_NAV))
#else
if (absl::GetFlag(FLAGS_rinex_nav_file) == std::string(DEFAULT_RINEX_NAV))
#endif
{
// The signal is generated from the default RINEX nav file
// (brdc3540.14n, dated December 20, 2014), so set the observation
// date accordingly to resolve the GPS week rollover to that era
config->set_property("GNSS-SDR.observation_date", "2014-12-20");
}
config->set_property("GNSS-SDR.GPS_banned_prns", std::to_string(1));
// Set the assistance system parameters
config->set_property("GNSS-SDR.SUPL_read_gps_assistance_xml", "false");
@@ -17,9 +17,13 @@
#include "geofunctions.h"
#include "gnss_sdr_make_unique.h"
#include "gnss_sdr_supl_client.h"
#include "gps_week_rollover.h"
#include "in_memory_configuration.h"
#include "pvt_conf.h"
#include "rtklib_solver.h"
#include "sensor_data/sensor_data_aggregator.h"
#include "sensor_data/sensor_data_source_configuration.h"
#include "signal_flag.h"
#include <armadillo>
#include <boost/archive/xml_iarchive.hpp>
#include <boost/archive/xml_oarchive.hpp>
@@ -378,7 +382,6 @@ TEST(RTKLibSolverTest, test1)
{
// test case #1: GPS L1 CA simulated with gnss-sim
std::string path = std::string(TEST_PATH);
int nchannels = 8;
std::string dump_filename = ".rtklib_solver_dump.dat";
bool flag_dump_to_file = false;
bool save_to_mat = false;
@@ -386,8 +389,16 @@ TEST(RTKLibSolverTest, test1)
Pvt_Conf conf;
conf.use_e6_for_pvt = false;
auto d_ls_pvt = std::make_unique<Rtklib_Solver>(rtk, conf, nchannels, dump_filename, 1, flag_dump_to_file, save_to_mat);
d_ls_pvt->set_averaging_depth(1);
auto d_ls_pvt = std::make_unique<Rtklib_Solver>(rtk, conf, dump_filename, GPS_1C, flag_dump_to_file, save_to_mat);
// the scenario was simulated in December 2014 (GPS week 1823, transmitted mod-1024
// week 799); the approximate capture date resolves the week rollover, as the
// GNSS-SDR.observation_date configuration option does in the full receiver
d_ls_pvt->set_ref_gps_week(gps_ref_week_from_config("2014-12-20", false));
// sensor data aggregator with no external sensors
auto sensor_configuration = std::make_shared<InMemoryConfiguration>();
const SensorDataSourceConfiguration sensor_data_source_configuration(sensor_configuration.get());
const SensorDataAggregator sensor_data_aggregator(sensor_data_source_configuration, {});
// load ephemeris
std::string eph_xml_filename = path + "data/rtklib_test/eph_GPS_L1CA_test1.xml";
@@ -443,7 +454,7 @@ TEST(RTKLibSolverTest, test1)
// solve
bool pvt_valid = false;
if (d_ls_pvt->get_PVT(gnss_synchro_map, false))
if (d_ls_pvt->get_PVT(gnss_synchro_map, 0.02, sensor_data_aggregator))
{
// DEBUG MESSAGE: Display position in console output
if (d_ls_pvt->is_valid_position())