mirror of
https://github.com/gnss-sdr/gnss-sdr
synced 2024-12-12 19:20:32 +00:00
glonass rinex: Bug fixes in RINEX formats 2.11 and 3.02
Fixes a couple of bugs for RINEX file generation depending on the active version to be use.
This commit is contained in:
parent
aa2464cc28
commit
78eaa76a60
@ -55,7 +55,7 @@ Tracking_1G.if=0
|
|||||||
Tracking_1G.early_late_space_chips=0.5
|
Tracking_1G.early_late_space_chips=0.5
|
||||||
Tracking_1G.pll_bw_hz=25.0;
|
Tracking_1G.pll_bw_hz=25.0;
|
||||||
Tracking_1G.dll_bw_hz=3.0;
|
Tracking_1G.dll_bw_hz=3.0;
|
||||||
Tracking_1G.dump=true;
|
Tracking_1G.dump=false;
|
||||||
Tracking_1G.dump_filename=/archive/glo_tracking_ch_
|
Tracking_1G.dump_filename=/archive/glo_tracking_ch_
|
||||||
|
|
||||||
;######### TELEMETRY DECODER GPS CONFIG ############
|
;######### TELEMETRY DECODER GPS CONFIG ############
|
||||||
@ -63,7 +63,7 @@ TelemetryDecoder_1G.implementation=GLONASS_L1_CA_Telemetry_Decoder
|
|||||||
|
|
||||||
;######### OBSERVABLES CONFIG ############
|
;######### OBSERVABLES CONFIG ############
|
||||||
Observables.implementation=Hybrid_Observables
|
Observables.implementation=Hybrid_Observables
|
||||||
Observables.dump=true;
|
Observables.dump=false;
|
||||||
Observables.dump_filename=/archive/glo_observables.dat
|
Observables.dump_filename=/archive/glo_observables.dat
|
||||||
|
|
||||||
;######### PVT CONFIG ############
|
;######### PVT CONFIG ############
|
||||||
@ -80,4 +80,4 @@ PVT.rtcm_MT1019_rate_ms=5000
|
|||||||
PVT.rtcm_MT1045_rate_ms=5000
|
PVT.rtcm_MT1045_rate_ms=5000
|
||||||
PVT.rtcm_MT1097_rate_ms=1000
|
PVT.rtcm_MT1097_rate_ms=1000
|
||||||
PVT.rtcm_MT1077_rate_ms=1000
|
PVT.rtcm_MT1077_rate_ms=1000
|
||||||
PVT.rinex_version=2
|
PVT.rinex_version=3
|
||||||
|
@ -107,7 +107,7 @@ Tracking_1C.if=0
|
|||||||
Tracking_1C.early_late_space_chips=0.5
|
Tracking_1C.early_late_space_chips=0.5
|
||||||
Tracking_1C.pll_bw_hz=20.0;
|
Tracking_1C.pll_bw_hz=20.0;
|
||||||
Tracking_1C.dll_bw_hz=2.0;
|
Tracking_1C.dll_bw_hz=2.0;
|
||||||
Tracking_1C.dump=true;
|
Tracking_1C.dump=false;
|
||||||
Tracking_1C.dump_filename=/archive/gps_tracking_ch_
|
Tracking_1C.dump_filename=/archive/gps_tracking_ch_
|
||||||
|
|
||||||
Tracking_1G.implementation=GLONASS_L1_CA_DLL_PLL_Tracking
|
Tracking_1G.implementation=GLONASS_L1_CA_DLL_PLL_Tracking
|
||||||
@ -125,7 +125,7 @@ TelemetryDecoder_1G.implementation=GLONASS_L1_CA_Telemetry_Decoder
|
|||||||
|
|
||||||
;######### OBSERVABLES CONFIG ############
|
;######### OBSERVABLES CONFIG ############
|
||||||
Observables.implementation=Hybrid_Observables
|
Observables.implementation=Hybrid_Observables
|
||||||
Observables.dump=true;
|
Observables.dump=false;
|
||||||
Observables.dump_filename=/archive/gnss_observables.dat
|
Observables.dump_filename=/archive/gnss_observables.dat
|
||||||
|
|
||||||
;######### PVT CONFIG ############
|
;######### PVT CONFIG ############
|
||||||
@ -133,7 +133,7 @@ PVT.implementation=RTKLIB_PVT
|
|||||||
PVT.output_rate_ms=100
|
PVT.output_rate_ms=100
|
||||||
PVT.display_rate_ms=500
|
PVT.display_rate_ms=500
|
||||||
PVT.trop_model=Saastamoinen
|
PVT.trop_model=Saastamoinen
|
||||||
PVT.flag_rtcm_server=true
|
PVT.flag_rtcm_server=false
|
||||||
PVT.flag_rtcm_tty_port=false
|
PVT.flag_rtcm_tty_port=false
|
||||||
PVT.rtcm_dump_devname=/dev/pts/1
|
PVT.rtcm_dump_devname=/dev/pts/1
|
||||||
PVT.rtcm_tcp_port=2101
|
PVT.rtcm_tcp_port=2101
|
||||||
@ -141,4 +141,4 @@ PVT.rtcm_MT1019_rate_ms=5000
|
|||||||
PVT.rtcm_MT1045_rate_ms=5000
|
PVT.rtcm_MT1045_rate_ms=5000
|
||||||
PVT.rtcm_MT1097_rate_ms=1000
|
PVT.rtcm_MT1097_rate_ms=1000
|
||||||
PVT.rtcm_MT1077_rate_ms=1000
|
PVT.rtcm_MT1077_rate_ms=1000
|
||||||
PVT.rinex_version=2
|
PVT.rinex_version=3
|
||||||
|
@ -90,4 +90,4 @@ PVT.rtcm_MT1019_rate_ms=5000
|
|||||||
PVT.rtcm_MT1045_rate_ms=5000
|
PVT.rtcm_MT1045_rate_ms=5000
|
||||||
PVT.rtcm_MT1097_rate_ms=1000
|
PVT.rtcm_MT1097_rate_ms=1000
|
||||||
PVT.rtcm_MT1077_rate_ms=1000
|
PVT.rtcm_MT1077_rate_ms=1000
|
||||||
PVT.rinex_version=2
|
PVT.rinex_version=3
|
||||||
|
@ -345,7 +345,8 @@ rtklib_pvt_cc::rtklib_pvt_cc(unsigned int nchannels, bool dump, std::string dump
|
|||||||
|
|
||||||
b_rinex_header_written = false;
|
b_rinex_header_written = false;
|
||||||
b_rinex_header_updated = false;
|
b_rinex_header_updated = false;
|
||||||
rp = std::make_shared<Rinex_Printer>(rinex_version);
|
d_rinex_version = rinex_version;
|
||||||
|
rp = std::make_shared<Rinex_Printer>(d_rinex_version);
|
||||||
|
|
||||||
d_last_status_print_seg = 0;
|
d_last_status_print_seg = 0;
|
||||||
|
|
||||||
@ -874,7 +875,13 @@ int rtklib_pvt_cc::work (int noutput_items, gr_vector_const_void_star &input_ite
|
|||||||
{
|
{
|
||||||
std::string glo_signal("1G");
|
std::string glo_signal("1G");
|
||||||
rp->rinex_obs_header(rp->obsFile, gps_ephemeris_iter->second, glonass_gnav_ephemeris_iter->second, d_rx_time, glo_signal);
|
rp->rinex_obs_header(rp->obsFile, gps_ephemeris_iter->second, glonass_gnav_ephemeris_iter->second, d_rx_time, glo_signal);
|
||||||
rp->rinex_nav_header(rp->navMixFile, d_ls_pvt->gps_iono, d_ls_pvt->gps_utc_model, d_ls_pvt->glonass_gnav_utc_model, d_ls_pvt->glonass_gnav_almanac);
|
if(d_rinex_version == 3)
|
||||||
|
rp->rinex_nav_header(rp->navMixFile, d_ls_pvt->gps_iono, d_ls_pvt->gps_utc_model, d_ls_pvt->glonass_gnav_utc_model, d_ls_pvt->glonass_gnav_almanac);
|
||||||
|
if(d_rinex_version == 2)
|
||||||
|
{
|
||||||
|
rp->rinex_nav_header(rp->navFile, d_ls_pvt->gps_iono, d_ls_pvt->gps_utc_model);
|
||||||
|
rp->rinex_nav_header(rp->navGloFile, d_ls_pvt->glonass_gnav_utc_model, glonass_gnav_ephemeris_iter->second);
|
||||||
|
}
|
||||||
b_rinex_header_written = true; // do not write header anymore
|
b_rinex_header_written = true; // do not write header anymore
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -924,7 +931,14 @@ int rtklib_pvt_cc::work (int noutput_items, gr_vector_const_void_star &input_ite
|
|||||||
}
|
}
|
||||||
if(type_of_rx == 26) // GPS L1 C/A + GLONASS L1 C/A
|
if(type_of_rx == 26) // GPS L1 C/A + GLONASS L1 C/A
|
||||||
{
|
{
|
||||||
rp->log_rinex_nav(rp->navMixFile, d_ls_pvt->gps_ephemeris_map, d_ls_pvt->glonass_gnav_ephemeris_map);
|
if(d_rinex_version == 3)
|
||||||
|
rp->log_rinex_nav(rp->navMixFile, d_ls_pvt->gps_ephemeris_map, d_ls_pvt->glonass_gnav_ephemeris_map);
|
||||||
|
if(d_rinex_version == 2)
|
||||||
|
{
|
||||||
|
rp->log_rinex_nav(rp->navFile, d_ls_pvt->gps_ephemeris_map);
|
||||||
|
rp->log_rinex_nav(rp->navGloFile, d_ls_pvt->glonass_gnav_ephemeris_map);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
if(type_of_rx == 27) // Galileo E1B + GLONASS L1 C/A
|
if(type_of_rx == 27) // Galileo E1B + GLONASS L1 C/A
|
||||||
{
|
{
|
||||||
@ -1099,7 +1113,7 @@ int rtklib_pvt_cc::work (int noutput_items, gr_vector_const_void_star &input_ite
|
|||||||
{
|
{
|
||||||
if ((glonass_gnav_ephemeris_iter != d_ls_pvt->glonass_gnav_ephemeris_map.end()) && (gps_ephemeris_iter != d_ls_pvt->gps_ephemeris_map.end()) )
|
if ((glonass_gnav_ephemeris_iter != d_ls_pvt->glonass_gnav_ephemeris_map.end()) && (gps_ephemeris_iter != d_ls_pvt->gps_ephemeris_map.end()) )
|
||||||
{
|
{
|
||||||
rp->log_rinex_obs(rp->obsFile, gps_ephemeris_iter->second, glonass_gnav_ephemeris_iter->second, d_rx_time, gnss_observables_map);
|
rp->log_rinex_obs(rp->obsFile, gps_ephemeris_iter->second, glonass_gnav_ephemeris_iter->second, d_rx_time, gnss_observables_map);
|
||||||
}
|
}
|
||||||
if (!b_rinex_header_updated && (d_ls_pvt->gps_utc_model.d_A0 != 0))
|
if (!b_rinex_header_updated && (d_ls_pvt->gps_utc_model.d_A0 != 0))
|
||||||
{
|
{
|
||||||
|
@ -98,6 +98,7 @@ private:
|
|||||||
bool d_dump;
|
bool d_dump;
|
||||||
bool b_rinex_header_written;
|
bool b_rinex_header_written;
|
||||||
bool b_rinex_header_updated;
|
bool b_rinex_header_updated;
|
||||||
|
double d_rinex_version;
|
||||||
bool b_rtcm_writing_started;
|
bool b_rtcm_writing_started;
|
||||||
int d_rtcm_MT1045_rate_ms; //!< Galileo Broadcast Ephemeris
|
int d_rtcm_MT1045_rate_ms; //!< Galileo Broadcast Ephemeris
|
||||||
int d_rtcm_MT1019_rate_ms; //!< GPS Broadcast Ephemeris (orbits)
|
int d_rtcm_MT1019_rate_ms; //!< GPS Broadcast Ephemeris (orbits)
|
||||||
|
@ -3038,8 +3038,6 @@ void Rinex_Printer::log_rinex_nav(std::fstream& out, const std::map<int, Gps_Eph
|
|||||||
|
|
||||||
void Rinex_Printer::log_rinex_nav(std::fstream& out, const std::map<int, Gps_Ephemeris>& gps_eph_map, const std::map<int, Glonass_Gnav_Ephemeris>& glonass_gnav_eph_map)
|
void Rinex_Printer::log_rinex_nav(std::fstream& out, const std::map<int, Gps_Ephemeris>& gps_eph_map, const std::map<int, Glonass_Gnav_Ephemeris>& glonass_gnav_eph_map)
|
||||||
{
|
{
|
||||||
version = 3;
|
|
||||||
stringVersion = "3.02";
|
|
||||||
Rinex_Printer::log_rinex_nav(out, gps_eph_map);
|
Rinex_Printer::log_rinex_nav(out, gps_eph_map);
|
||||||
Rinex_Printer::log_rinex_nav(out, glonass_gnav_eph_map);
|
Rinex_Printer::log_rinex_nav(out, glonass_gnav_eph_map);
|
||||||
}
|
}
|
||||||
@ -3199,19 +3197,7 @@ void Rinex_Printer::rinex_obs_header(std::fstream& out, const Glonass_Gnav_Ephem
|
|||||||
Rinex_Printer::lengthCheck(line);
|
Rinex_Printer::lengthCheck(line);
|
||||||
out << line << std::endl;
|
out << line << std::endl;
|
||||||
|
|
||||||
if (version == 2)
|
// -------- SYS / OBS TYPES
|
||||||
{
|
|
||||||
// --------- WAVELENGHT FACTOR
|
|
||||||
// put here real data!
|
|
||||||
line.clear();
|
|
||||||
line +=Rinex_Printer::rightJustify("1",6);
|
|
||||||
line +=Rinex_Printer::rightJustify("1",6);
|
|
||||||
line += std::string(48, ' ');
|
|
||||||
line += Rinex_Printer::leftJustify("WAVELENGTH FACT L1/2", 20);
|
|
||||||
Rinex_Printer::lengthCheck(line);
|
|
||||||
out << line << std::endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (version == 3)
|
if (version == 3)
|
||||||
{
|
{
|
||||||
// -------- SYS / OBS TYPES
|
// -------- SYS / OBS TYPES
|
||||||
@ -3266,7 +3252,6 @@ void Rinex_Printer::rinex_obs_header(std::fstream& out, const Glonass_Gnav_Ephem
|
|||||||
Rinex_Printer::lengthCheck(line);
|
Rinex_Printer::lengthCheck(line);
|
||||||
out << line << std::endl;
|
out << line << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (version == 2)
|
if (version == 2)
|
||||||
{
|
{
|
||||||
// -------- SYS / OBS TYPES
|
// -------- SYS / OBS TYPES
|
||||||
@ -3293,6 +3278,7 @@ void Rinex_Printer::rinex_obs_header(std::fstream& out, const Glonass_Gnav_Ephem
|
|||||||
out << line << std::endl;
|
out << line << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// -------- Signal Strength units (Only version 3)
|
||||||
if (version == 3)
|
if (version == 3)
|
||||||
{
|
{
|
||||||
// -------- Signal Strength units
|
// -------- Signal Strength units
|
||||||
@ -3314,7 +3300,6 @@ void Rinex_Printer::rinex_obs_header(std::fstream& out, const Glonass_Gnav_Ephem
|
|||||||
std::string minutes (timestring, 11, 2);
|
std::string minutes (timestring, 11, 2);
|
||||||
double intpart = 0;
|
double intpart = 0;
|
||||||
double seconds = p_utc_time.time_of_day().seconds() + modf (d_TOW_first_observation , &intpart);
|
double seconds = p_utc_time.time_of_day().seconds() + modf (d_TOW_first_observation , &intpart);
|
||||||
|
|
||||||
line.clear();
|
line.clear();
|
||||||
line += Rinex_Printer::rightJustify(year, 6);
|
line += Rinex_Printer::rightJustify(year, 6);
|
||||||
line += Rinex_Printer::rightJustify(month, 6);
|
line += Rinex_Printer::rightJustify(month, 6);
|
||||||
@ -3328,50 +3313,52 @@ void Rinex_Printer::rinex_obs_header(std::fstream& out, const Glonass_Gnav_Ephem
|
|||||||
Rinex_Printer::lengthCheck(line);
|
Rinex_Printer::lengthCheck(line);
|
||||||
out << line << std::endl;
|
out << line << std::endl;
|
||||||
|
|
||||||
// -------- SYS /PHASE SHIFTS
|
// -------- GLONASS SLOT / FRQ # (On;y version 3)
|
||||||
// -------- GLONASS SLOT / FRQ #
|
if (version == 3)
|
||||||
line.clear();
|
{
|
||||||
line += Rinex_Printer::rightJustify(boost::lexical_cast<std::string>(0), 3);
|
// -------- GLONASS SLOT / FRQ #
|
||||||
line += std::string(1, ' ');
|
// TODO Need to provide system with list of all satellites and update this accordingly
|
||||||
|
line.clear();
|
||||||
|
line += Rinex_Printer::rightJustify(boost::lexical_cast<std::string>(0), 3); // Number of satellites in list
|
||||||
|
line += std::string(1, ' ');
|
||||||
|
line += satelliteSystem["GLONASS"];
|
||||||
|
line += Rinex_Printer::rightJustify(boost::lexical_cast<std::string>(0), 2); // Slot Number
|
||||||
|
line += std::string(1, ' ');
|
||||||
|
line += Rinex_Printer::rightJustify(boost::lexical_cast<std::string>(0), 2); // Frequency Number
|
||||||
|
line += std::string(1, ' ');
|
||||||
|
line += std::string(60-line.size(), ' ');
|
||||||
|
line += Rinex_Printer::leftJustify("GLONASS SLOT / FRQ #", 20);
|
||||||
|
Rinex_Printer::lengthCheck(line);
|
||||||
|
out << line << std::endl;
|
||||||
|
|
||||||
// TODO Add this here, we need to know all satellites in system to get this done
|
// -------- GLONASS CODE/PHS/BIS
|
||||||
line += satelliteSystem["GLONASS"];
|
// No GLONASS Phase bias correction used to align code and phase observations.
|
||||||
line += Rinex_Printer::rightJustify(boost::lexical_cast<std::string>(0), 2); // Slot Number
|
line.clear();
|
||||||
line += std::string(1, ' ');
|
line += std::string(1, ' ');
|
||||||
line += Rinex_Printer::rightJustify(boost::lexical_cast<std::string>(0), 2); // Frequency Number
|
line += observationType["PSEUDORANGE"];
|
||||||
line += std::string(1, ' ');
|
line += observationCode["GLONASS_G1_CA"];
|
||||||
line += std::string(60-line.size(), ' ');
|
line += std::string(1, ' ');
|
||||||
line += Rinex_Printer::leftJustify("GLONASS SLOT / FRQ #", 20);
|
line += Rinex_Printer::rightJustify(asString(0.0, 3), 8);
|
||||||
Rinex_Printer::lengthCheck(line);
|
line += std::string(1, ' ');
|
||||||
out << line << std::endl;
|
line += observationType["PSEUDORANGE"];
|
||||||
|
line += observationCode["GLONASS_G1_P"];
|
||||||
// -------- GLONASS CODE/PHS/BIS
|
line += std::string(1, ' ');
|
||||||
// TODO This needs more study, not really suer on what those values are. Setting it to zero to advance in code.
|
line += Rinex_Printer::rightJustify(asString(0.0, 3), 8);
|
||||||
line.clear();
|
line += std::string(1, ' ');
|
||||||
line += std::string(1, ' ');
|
line += observationType["PSEUDORANGE"];
|
||||||
line += observationType["PSEUDORANGE"];
|
line += observationCode["GLONASS_G2_CA"];
|
||||||
line += observationCode["GLONASS_G1_CA"];
|
line += std::string(1, ' ');
|
||||||
line += std::string(1, ' ');
|
line += Rinex_Printer::rightJustify(asString(0.0, 3), 8);
|
||||||
line += Rinex_Printer::rightJustify(asString(0.0, 3), 8);
|
line += std::string(1, ' ');
|
||||||
line += std::string(1, ' ');
|
line += observationType["PSEUDORANGE"];
|
||||||
line += observationType["PSEUDORANGE"];
|
line += observationCode["GLONASS_G2_P"];
|
||||||
line += observationCode["GLONASS_G1_P"];
|
line += std::string(1, ' ');
|
||||||
line += std::string(1, ' ');
|
line += Rinex_Printer::rightJustify(asString(0.0, 3), 8);
|
||||||
line += Rinex_Printer::rightJustify(asString(0.0, 3), 8);
|
line += std::string(60-line.size(), ' ');
|
||||||
line += std::string(1, ' ');
|
line += Rinex_Printer::leftJustify("GLONASS COD/PHS/BIS", 20);
|
||||||
line += observationType["PSEUDORANGE"];
|
Rinex_Printer::lengthCheck(line);
|
||||||
line += observationCode["GLONASS_G2_CA"];
|
out << line << std::endl;
|
||||||
line += std::string(1, ' ');
|
}
|
||||||
line += Rinex_Printer::rightJustify(asString(0.0, 3), 8);
|
|
||||||
line += std::string(1, ' ');
|
|
||||||
line += observationType["PSEUDORANGE"];
|
|
||||||
line += observationCode["GLONASS_G2_P"];
|
|
||||||
line += std::string(1, ' ');
|
|
||||||
line += Rinex_Printer::rightJustify(asString(0.0, 3), 8);
|
|
||||||
line += std::string(60-line.size(), ' ');
|
|
||||||
line += Rinex_Printer::leftJustify("GLONASS COD/PHS/BIS", 20);
|
|
||||||
Rinex_Printer::lengthCheck(line);
|
|
||||||
out << line << std::endl;
|
|
||||||
|
|
||||||
// -------- END OF HEADER
|
// -------- END OF HEADER
|
||||||
line.clear();
|
line.clear();
|
||||||
@ -3386,11 +3373,10 @@ void Rinex_Printer::rinex_obs_header(std::fstream& out, const Gps_Ephemeris& gps
|
|||||||
{
|
{
|
||||||
if(glonass_gnav_eph.d_m){} // avoid warning, not needed
|
if(glonass_gnav_eph.d_m){} // avoid warning, not needed
|
||||||
std::string line;
|
std::string line;
|
||||||
version = 3;
|
|
||||||
|
|
||||||
// -------- Line 1
|
// -------- Line 1
|
||||||
line = std::string(5, ' ');
|
line = std::string(5, ' ');
|
||||||
line += "3.02";
|
line += stringVersion;
|
||||||
line += std::string(11, ' ');
|
line += std::string(11, ' ');
|
||||||
line += Rinex_Printer::leftJustify("OBSERVATION DATA", 20);
|
line += Rinex_Printer::leftJustify("OBSERVATION DATA", 20);
|
||||||
line += satelliteSystem["Mixed"];
|
line += satelliteSystem["Mixed"];
|
||||||
@ -3416,7 +3402,7 @@ void Rinex_Printer::rinex_obs_header(std::fstream& out, const Gps_Ephemeris& gps
|
|||||||
|
|
||||||
// -------- Line COMMENT
|
// -------- Line COMMENT
|
||||||
line.clear();
|
line.clear();
|
||||||
line += Rinex_Printer::leftJustify("MIXED (GPS/GLONASS) OBSERVATION DATA FILE GENERATED BY GNSS-SDR", 60);
|
line += Rinex_Printer::leftJustify("MIXED (GPS/GLO) OBSERVATION DATA FILE GENERATED BY GNSS-SDR", 60);
|
||||||
line += Rinex_Printer::leftJustify("COMMENT", 20);
|
line += Rinex_Printer::leftJustify("COMMENT", 20);
|
||||||
Rinex_Printer::lengthCheck(line);
|
Rinex_Printer::lengthCheck(line);
|
||||||
out << line << std::endl;
|
out << line << std::endl;
|
||||||
@ -3520,100 +3506,127 @@ void Rinex_Printer::rinex_obs_header(std::fstream& out, const Gps_Ephemeris& gps
|
|||||||
out << line << std::endl;
|
out << line << std::endl;
|
||||||
|
|
||||||
// -------- SYS / OBS TYPES
|
// -------- SYS / OBS TYPES
|
||||||
// one line per available system
|
if(version == 3)
|
||||||
line.clear();
|
{
|
||||||
line += satelliteSystem["GPS"];
|
// one line per available system
|
||||||
line += std::string(2, ' ');
|
line.clear();
|
||||||
std::stringstream strm;
|
line += satelliteSystem["GPS"];
|
||||||
numberTypesObservations = 4;
|
line += std::string(2, ' ');
|
||||||
strm << numberTypesObservations;
|
std::stringstream strm;
|
||||||
line += Rinex_Printer::rightJustify(strm.str(), 3);
|
numberTypesObservations = 4;
|
||||||
// per type of observation
|
strm << numberTypesObservations;
|
||||||
// GPS L1 PSEUDORANGE
|
line += Rinex_Printer::rightJustify(strm.str(), 3);
|
||||||
line += std::string(1, ' ');
|
// per type of observation
|
||||||
line += observationType["PSEUDORANGE"];
|
// GPS L1 PSEUDORANGE
|
||||||
line += observationCode["GPS_L1_CA"];
|
line += std::string(1, ' ');
|
||||||
// GPS L1 PHASE
|
line += observationType["PSEUDORANGE"];
|
||||||
line += std::string(1, ' ');
|
line += observationCode["GPS_L1_CA"];
|
||||||
line += observationType["CARRIER_PHASE"];
|
// GPS L1 PHASE
|
||||||
line += observationCode["GPS_L1_CA"];
|
line += std::string(1, ' ');
|
||||||
// GPS DOPPLER L1
|
line += observationType["CARRIER_PHASE"];
|
||||||
line += std::string(1, ' ');
|
line += observationCode["GPS_L1_CA"];
|
||||||
line += observationType["DOPPLER"];
|
// GPS DOPPLER L1
|
||||||
line += observationCode["GPS_L1_CA"];
|
line += std::string(1, ' ');
|
||||||
// GPS L1 CA SIGNAL STRENGTH
|
line += observationType["DOPPLER"];
|
||||||
line += std::string(1, ' ');
|
line += observationCode["GPS_L1_CA"];
|
||||||
line += observationType["SIGNAL_STRENGTH"];
|
// GPS L1 CA SIGNAL STRENGTH
|
||||||
line += observationCode["GPS_L1_CA"];
|
line += std::string(1, ' ');
|
||||||
line += std::string(60-line.size(), ' ');
|
line += observationType["SIGNAL_STRENGTH"];
|
||||||
line += Rinex_Printer::leftJustify("SYS / # / OBS TYPES", 20);
|
line += observationCode["GPS_L1_CA"];
|
||||||
Rinex_Printer::lengthCheck(line);
|
line += std::string(60-line.size(), ' ');
|
||||||
out << line << std::endl;
|
line += Rinex_Printer::leftJustify("SYS / # / OBS TYPES", 20);
|
||||||
|
Rinex_Printer::lengthCheck(line);
|
||||||
|
out << line << std::endl;
|
||||||
|
|
||||||
// Find GLONASS Signal in Mixed file
|
// Find GLONASS Signal in Mixed file
|
||||||
unsigned int number_of_observations_glo = 0;
|
unsigned int number_of_observations_glo = 0;
|
||||||
std::string signal_("1G");
|
std::string signal_("1G");
|
||||||
std::size_t found_1C = glonass_bands.find(signal_);
|
std::size_t found_1C = glonass_bands.find(signal_);
|
||||||
if(found_1C != std::string::npos)
|
if(found_1C != std::string::npos)
|
||||||
|
{
|
||||||
|
number_of_observations_glo = number_of_observations_glo + 4;
|
||||||
|
}
|
||||||
|
signal_ = "2G";
|
||||||
|
std::size_t found_2C = glonass_bands.find(signal_);
|
||||||
|
if(found_2C != std::string::npos)
|
||||||
|
{
|
||||||
|
number_of_observations_glo = number_of_observations_glo + 4;
|
||||||
|
}
|
||||||
|
line.clear();
|
||||||
|
line += satelliteSystem["GLONASS"];
|
||||||
|
line += std::string(2, ' ');
|
||||||
|
line += Rinex_Printer::rightJustify(std::to_string(number_of_observations_glo), 3);
|
||||||
|
if(found_1C != std::string::npos)
|
||||||
|
{
|
||||||
|
line += std::string(1, ' ');
|
||||||
|
line += observationType["PSEUDORANGE"];
|
||||||
|
line += observationCode["GLONASS_G1_CA"];
|
||||||
|
line += std::string(1, ' ');
|
||||||
|
line += observationType["CARRIER_PHASE"];
|
||||||
|
line += observationCode["GLONASS_G1_CA"];
|
||||||
|
line += std::string(1, ' ');
|
||||||
|
line += observationType["DOPPLER"];
|
||||||
|
line += observationCode["GLONASS_G1_CA"];
|
||||||
|
line += std::string(1, ' ');
|
||||||
|
line += observationType["SIGNAL_STRENGTH"];
|
||||||
|
line += observationCode["GLONASS_G1_CA"];
|
||||||
|
}
|
||||||
|
if(found_2C != std::string::npos)
|
||||||
|
{
|
||||||
|
line += std::string(1, ' ');
|
||||||
|
line += observationType["PSEUDORANGE"];
|
||||||
|
line += observationCode["GLONASS_G2_CA"];
|
||||||
|
line += std::string(1, ' ');
|
||||||
|
line += observationType["CARRIER_PHASE"];
|
||||||
|
line += observationCode["GLONASS_G2_CA"];
|
||||||
|
line += std::string(1, ' ');
|
||||||
|
line += observationType["DOPPLER"];
|
||||||
|
line += observationCode["GLONASS_G2_CA"];
|
||||||
|
line += std::string(1, ' ');
|
||||||
|
line += observationType["SIGNAL_STRENGTH"];
|
||||||
|
line += observationCode["GLONASS_G2_CA"];
|
||||||
|
}
|
||||||
|
line += std::string(60-line.size(), ' ');
|
||||||
|
line += Rinex_Printer::leftJustify("SYS / # / OBS TYPES", 20);
|
||||||
|
Rinex_Printer::lengthCheck(line);
|
||||||
|
out << line << std::endl;
|
||||||
|
}
|
||||||
|
if(version == 2)
|
||||||
{
|
{
|
||||||
number_of_observations_glo = number_of_observations_glo + 4;
|
// -------- SYS / OBS TYPES
|
||||||
}
|
line.clear();
|
||||||
signal_ = "2G";
|
std::stringstream strm;
|
||||||
std::size_t found_2C = glonass_bands.find(signal_);
|
strm << numberTypesObservations;
|
||||||
if(found_2C != std::string::npos)
|
line += Rinex_Printer::rightJustify(strm.str(), 6);
|
||||||
{
|
// per type of observation
|
||||||
number_of_observations_glo = number_of_observations_glo + 4;
|
// GLONASS L1 C/A PSEUDORANGE
|
||||||
|
line += Rinex_Printer::rightJustify(observationType["PSEUDORANGE_CA_v2"], 5);
|
||||||
|
line += observationCode["GLONASS_G1_CA_v2"];
|
||||||
|
// GLONASS L1 PHASE
|
||||||
|
line += Rinex_Printer::rightJustify(observationType["CARRIER_PHASE_CA_v2"], 5);
|
||||||
|
line += observationCode["GLONASS_G1_CA_v2"];
|
||||||
|
// GLONASS DOPPLER L1
|
||||||
|
line += Rinex_Printer::rightJustify(observationType["DOPPLER_v2"], 5);
|
||||||
|
line += observationCode["GLONASS_G1_CA_v2"];
|
||||||
|
// GLONASS L1 SIGNAL STRENGTH
|
||||||
|
line += Rinex_Printer::rightJustify(observationType["SIGNAL_STRENGTH_v2"], 5);
|
||||||
|
line += observationCode["GLONASS_G1_CA_v2"];
|
||||||
|
line += std::string(60-line.size(), ' ');
|
||||||
|
line += Rinex_Printer::leftJustify("# / TYPES OF OBSERV", 20);
|
||||||
|
Rinex_Printer::lengthCheck(line);
|
||||||
|
out << line << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
line.clear();
|
// -------- Signal Strength units (only version 3)
|
||||||
line += satelliteSystem["GLONASS"];
|
if(version == 3)
|
||||||
line += std::string(2, ' ');
|
{
|
||||||
line += Rinex_Printer::rightJustify(std::to_string(number_of_observations_glo), 3);
|
line.clear();
|
||||||
|
line += Rinex_Printer::leftJustify("DBHZ", 20);
|
||||||
if(found_1C != std::string::npos)
|
line += std::string(40, ' ');
|
||||||
{
|
line += Rinex_Printer::leftJustify("SIGNAL STRENGTH UNIT", 20);
|
||||||
line += std::string(1, ' ');
|
Rinex_Printer::lengthCheck(line);
|
||||||
line += observationType["PSEUDORANGE"];
|
out << line << std::endl;
|
||||||
line += observationCode["GLONASS_G1_CA"];
|
}
|
||||||
line += std::string(1, ' ');
|
|
||||||
line += observationType["CARRIER_PHASE"];
|
|
||||||
line += observationCode["GLONASS_G1_CA"];
|
|
||||||
line += std::string(1, ' ');
|
|
||||||
line += observationType["DOPPLER"];
|
|
||||||
line += observationCode["GLONASS_G1_CA"];
|
|
||||||
line += std::string(1, ' ');
|
|
||||||
line += observationType["SIGNAL_STRENGTH"];
|
|
||||||
line += observationCode["GLONASS_G1_CA"];
|
|
||||||
}
|
|
||||||
|
|
||||||
if(found_2C != std::string::npos)
|
|
||||||
{
|
|
||||||
line += std::string(1, ' ');
|
|
||||||
line += observationType["PSEUDORANGE"];
|
|
||||||
line += observationCode["GLONASS_G2_CA"];
|
|
||||||
line += std::string(1, ' ');
|
|
||||||
line += observationType["CARRIER_PHASE"];
|
|
||||||
line += observationCode["GLONASS_G2_CA"];
|
|
||||||
line += std::string(1, ' ');
|
|
||||||
line += observationType["DOPPLER"];
|
|
||||||
line += observationCode["GLONASS_G2_CA"];
|
|
||||||
line += std::string(1, ' ');
|
|
||||||
line += observationType["SIGNAL_STRENGTH"];
|
|
||||||
line += observationCode["GLONASS_G2_CA"];
|
|
||||||
}
|
|
||||||
|
|
||||||
line += std::string(60-line.size(), ' ');
|
|
||||||
line += Rinex_Printer::leftJustify("SYS / # / OBS TYPES", 20);
|
|
||||||
Rinex_Printer::lengthCheck(line);
|
|
||||||
out << line << std::endl;
|
|
||||||
|
|
||||||
// -------- Signal Strength units
|
|
||||||
line.clear();
|
|
||||||
line += Rinex_Printer::leftJustify("DBHZ", 20);
|
|
||||||
line += std::string(40, ' ');
|
|
||||||
line += Rinex_Printer::leftJustify("SIGNAL STRENGTH UNIT", 20);
|
|
||||||
Rinex_Printer::lengthCheck(line);
|
|
||||||
out << line << std::endl;
|
|
||||||
|
|
||||||
// -------- TIME OF FIRST OBS
|
// -------- TIME OF FIRST OBS
|
||||||
line.clear();
|
line.clear();
|
||||||
@ -3638,6 +3651,53 @@ void Rinex_Printer::rinex_obs_header(std::fstream& out, const Gps_Ephemeris& gps
|
|||||||
Rinex_Printer::lengthCheck(line);
|
Rinex_Printer::lengthCheck(line);
|
||||||
out << line << std::endl;
|
out << line << std::endl;
|
||||||
|
|
||||||
|
// -------- GLONASS SLOT / FRQ # (On;y version 3)
|
||||||
|
if (version == 3)
|
||||||
|
{
|
||||||
|
// -------- GLONASS SLOT / FRQ #
|
||||||
|
// TODO Need to provide system with list of all satellites and update this accordingly
|
||||||
|
line.clear();
|
||||||
|
line += Rinex_Printer::rightJustify(boost::lexical_cast<std::string>(0), 3); // Number of satellites in list
|
||||||
|
line += std::string(1, ' ');
|
||||||
|
line += satelliteSystem["GLONASS"];
|
||||||
|
line += Rinex_Printer::rightJustify(boost::lexical_cast<std::string>(0), 2); // Slot Number
|
||||||
|
line += std::string(1, ' ');
|
||||||
|
line += Rinex_Printer::rightJustify(boost::lexical_cast<std::string>(0), 2); // Frequency Number
|
||||||
|
line += std::string(1, ' ');
|
||||||
|
line += std::string(60-line.size(), ' ');
|
||||||
|
line += Rinex_Printer::leftJustify("GLONASS SLOT / FRQ #", 20);
|
||||||
|
Rinex_Printer::lengthCheck(line);
|
||||||
|
out << line << std::endl;
|
||||||
|
|
||||||
|
// -------- GLONASS CODE/PHS/BIS
|
||||||
|
// No GLONASS Phase bias correction used to align code and phase observations.
|
||||||
|
line.clear();
|
||||||
|
line += std::string(1, ' ');
|
||||||
|
line += observationType["PSEUDORANGE"];
|
||||||
|
line += observationCode["GLONASS_G1_CA"];
|
||||||
|
line += std::string(1, ' ');
|
||||||
|
line += Rinex_Printer::rightJustify(asString(0.0, 3), 8);
|
||||||
|
line += std::string(1, ' ');
|
||||||
|
line += observationType["PSEUDORANGE"];
|
||||||
|
line += observationCode["GLONASS_G1_P"];
|
||||||
|
line += std::string(1, ' ');
|
||||||
|
line += Rinex_Printer::rightJustify(asString(0.0, 3), 8);
|
||||||
|
line += std::string(1, ' ');
|
||||||
|
line += observationType["PSEUDORANGE"];
|
||||||
|
line += observationCode["GLONASS_G2_CA"];
|
||||||
|
line += std::string(1, ' ');
|
||||||
|
line += Rinex_Printer::rightJustify(asString(0.0, 3), 8);
|
||||||
|
line += std::string(1, ' ');
|
||||||
|
line += observationType["PSEUDORANGE"];
|
||||||
|
line += observationCode["GLONASS_G2_P"];
|
||||||
|
line += std::string(1, ' ');
|
||||||
|
line += Rinex_Printer::rightJustify(asString(0.0, 3), 8);
|
||||||
|
line += std::string(60-line.size(), ' ');
|
||||||
|
line += Rinex_Printer::leftJustify("GLONASS COD/PHS/BIS", 20);
|
||||||
|
Rinex_Printer::lengthCheck(line);
|
||||||
|
out << line << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
// -------- end of header
|
// -------- end of header
|
||||||
line.clear();
|
line.clear();
|
||||||
line += std::string(60, ' ');
|
line += std::string(60, ' ');
|
||||||
@ -5670,6 +5730,7 @@ void Rinex_Printer::log_rinex_obs(std::fstream& out, const Gps_Ephemeris& gps_ep
|
|||||||
if(glonass_gnav_eph.d_m){} // avoid warning, not needed
|
if(glonass_gnav_eph.d_m){} // avoid warning, not needed
|
||||||
std::string line;
|
std::string line;
|
||||||
|
|
||||||
|
// -------- EPOCH record
|
||||||
boost::posix_time::ptime p_gps_time = Rinex_Printer::compute_GPS_time(gps_eph, gps_obs_time);
|
boost::posix_time::ptime p_gps_time = Rinex_Printer::compute_GPS_time(gps_eph, gps_obs_time);
|
||||||
std::string timestring = boost::posix_time::to_iso_string(p_gps_time);
|
std::string timestring = boost::posix_time::to_iso_string(p_gps_time);
|
||||||
//double utc_t = nav_msg.utc_time(nav_msg.sv_clock_correction(obs_time));
|
//double utc_t = nav_msg.utc_time(nav_msg.sv_clock_correction(obs_time));
|
||||||
@ -5681,221 +5742,303 @@ void Rinex_Printer::log_rinex_obs(std::fstream& out, const Gps_Ephemeris& gps_ep
|
|||||||
std::string hour (timestring, 9, 2);
|
std::string hour (timestring, 9, 2);
|
||||||
std::string minutes (timestring, 11, 2);
|
std::string minutes (timestring, 11, 2);
|
||||||
|
|
||||||
std::string year (timestring, 0, 4);
|
if (version == 2)
|
||||||
line += std::string(1, '>');
|
|
||||||
line += std::string(1, ' ');
|
|
||||||
line += year;
|
|
||||||
line += std::string(1, ' ');
|
|
||||||
line += month;
|
|
||||||
line += std::string(1, ' ');
|
|
||||||
line += day;
|
|
||||||
line += std::string(1, ' ');
|
|
||||||
line += hour;
|
|
||||||
line += std::string(1, ' ');
|
|
||||||
line += minutes;
|
|
||||||
|
|
||||||
line += std::string(1, ' ');
|
|
||||||
double seconds = fmod(gps_t, 60);
|
|
||||||
// Add extra 0 if seconds are < 10
|
|
||||||
if (seconds < 10)
|
|
||||||
{
|
{
|
||||||
line +=std::string(1, '0');
|
line.clear();
|
||||||
}
|
std::string year (timestring, 2, 2);
|
||||||
line += Rinex_Printer::asString(seconds, 7);
|
line += std::string(1, ' ');
|
||||||
line += std::string(2, ' ');
|
line += year;
|
||||||
// Epoch flag 0: OK 1: power failure between previous and current epoch <1: Special event
|
line += std::string(1, ' ');
|
||||||
line += std::string(1, '0');
|
if (month.compare(0, 1 , "0") == 0)
|
||||||
|
|
||||||
//Number of satellites observed in current epoch
|
|
||||||
|
|
||||||
//Get maps with observations
|
|
||||||
std::map<int, Gnss_Synchro> observablesG1C;
|
|
||||||
std::map<int, Gnss_Synchro> observablesR1C;
|
|
||||||
std::map<int, Gnss_Synchro> observablesR2C;
|
|
||||||
std::map<int, Gnss_Synchro>::const_iterator observables_iter;
|
|
||||||
|
|
||||||
for(observables_iter = observables.begin();
|
|
||||||
observables_iter != observables.end();
|
|
||||||
observables_iter++)
|
|
||||||
{
|
|
||||||
std::string system_(&observables_iter->second.System, 1);
|
|
||||||
std::string sig_(observables_iter->second.Signal);
|
|
||||||
if((system_.compare("R") == 0) && (sig_.compare("1C") == 0))
|
|
||||||
{
|
{
|
||||||
observablesR1C.insert(std::pair<int, Gnss_Synchro>(observables_iter->first, observables_iter->second));
|
line += std::string(1, ' ');
|
||||||
}
|
line += month.substr(1, 1);
|
||||||
if((system_.compare("R") == 0) && (sig_.compare("1C") == 0))
|
|
||||||
{
|
|
||||||
observablesR2C.insert(std::pair<int, Gnss_Synchro>(observables_iter->first, observables_iter->second));
|
|
||||||
}
|
|
||||||
if((system_.compare("G") == 0) && (sig_.compare("1C") == 0))
|
|
||||||
{
|
|
||||||
observablesG1C.insert(std::pair<int, Gnss_Synchro>(observables_iter->first, observables_iter->second));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
std::multimap<unsigned int, Gnss_Synchro> total_glo_map;
|
|
||||||
std::set<unsigned int> available_glo_prns;
|
|
||||||
std::set<unsigned int>::iterator it;
|
|
||||||
for(observables_iter = observablesR1C.begin();
|
|
||||||
observables_iter != observablesR1C.end();
|
|
||||||
observables_iter++)
|
|
||||||
{
|
|
||||||
unsigned int prn_ = observables_iter->second.PRN;
|
|
||||||
total_glo_map.insert(std::pair<unsigned int, Gnss_Synchro>(prn_, observables_iter->second));
|
|
||||||
it = available_glo_prns.find(prn_);
|
|
||||||
if(it == available_glo_prns.end())
|
|
||||||
{
|
|
||||||
available_glo_prns.insert(prn_);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for(observables_iter = observablesR2C.begin();
|
|
||||||
observables_iter != observablesR2C.end();
|
|
||||||
observables_iter++)
|
|
||||||
{
|
|
||||||
unsigned int prn_ = observables_iter->second.PRN;
|
|
||||||
total_glo_map.insert(std::pair<unsigned int, Gnss_Synchro>(prn_, observables_iter->second));
|
|
||||||
it = available_glo_prns.find(prn_);
|
|
||||||
if(it == available_glo_prns.end())
|
|
||||||
{
|
|
||||||
available_glo_prns.insert(prn_);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int numGloSatellitesObserved = available_glo_prns.size();
|
|
||||||
int numGpsSatellitesObserved = observablesG1C.size();
|
|
||||||
int numSatellitesObserved = numGloSatellitesObserved + numGpsSatellitesObserved;
|
|
||||||
line += Rinex_Printer::rightJustify(boost::lexical_cast<std::string>(numSatellitesObserved), 3);
|
|
||||||
|
|
||||||
// Receiver clock offset (optional)
|
|
||||||
//line += rightJustify(asString(clockOffset, 12), 15);
|
|
||||||
|
|
||||||
line += std::string(80 - line.size(), ' ');
|
|
||||||
Rinex_Printer::lengthCheck(line);
|
|
||||||
out << line << std::endl;
|
|
||||||
|
|
||||||
std::string s;
|
|
||||||
std::string lineObs;
|
|
||||||
for(observables_iter = observablesG1C.begin();
|
|
||||||
observables_iter != observablesG1C.end();
|
|
||||||
observables_iter++)
|
|
||||||
{
|
|
||||||
lineObs.clear();
|
|
||||||
|
|
||||||
s.assign(1, observables_iter->second.System);
|
|
||||||
if(s.compare("G") == 0) lineObs += satelliteSystem["GPS"];
|
|
||||||
if(s.compare("R") == 0) lineObs += satelliteSystem["GLONASS"]; // should not happen
|
|
||||||
if (static_cast<int>(observables_iter->second.PRN) < 10) lineObs += std::string(1, '0');
|
|
||||||
lineObs += boost::lexical_cast<std::string>(static_cast<int>(observables_iter->second.PRN));
|
|
||||||
lineObs += Rinex_Printer::rightJustify(asString(observables_iter->second.Pseudorange_m, 3), 14);
|
|
||||||
|
|
||||||
//Loss of lock indicator (LLI)
|
|
||||||
int lli = 0; // Include in the observation!!
|
|
||||||
if (lli == 0)
|
|
||||||
{
|
|
||||||
lineObs += std::string(1, ' ');
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString<short>(lli), 1);
|
line += month;
|
||||||
}
|
}
|
||||||
|
line += std::string(1, ' ');
|
||||||
// Signal Strength Indicator (SSI)
|
if (day.compare(0, 1 , "0") == 0)
|
||||||
int ssi = Rinex_Printer::signalStrength(observables_iter->second.CN0_dB_hz);
|
|
||||||
lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString<int>(ssi), 1);
|
|
||||||
|
|
||||||
// PHASE
|
|
||||||
lineObs += Rinex_Printer::rightJustify(asString(observables_iter->second.Carrier_phase_rads/GPS_TWO_PI, 3), 14);
|
|
||||||
if (lli == 0)
|
|
||||||
{
|
{
|
||||||
lineObs += std::string(1, ' ');
|
line += std::string(1, ' ');
|
||||||
|
line += day.substr(1, 1);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString<short>(lli), 1);
|
line += day;
|
||||||
}
|
}
|
||||||
lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString<int>(ssi), 1);
|
line += std::string(1, ' ');
|
||||||
|
line += hour;
|
||||||
// DOPPLER
|
line += std::string(1, ' ');
|
||||||
lineObs += Rinex_Printer::rightJustify(asString(observables_iter->second.Carrier_Doppler_hz, 3), 14);
|
line += minutes;
|
||||||
if (lli == 0)
|
line += std::string(1, ' ');
|
||||||
|
double second_ = fmod(gps_t, 60);
|
||||||
|
if (second_ < 10)
|
||||||
{
|
{
|
||||||
lineObs += std::string(1, ' ');
|
line += std::string(1, ' ');
|
||||||
}
|
}
|
||||||
else
|
line += Rinex_Printer::asString(second_, 7);
|
||||||
{
|
line += std::string(2, ' ');
|
||||||
lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString<short>(lli), 1);
|
// Epoch flag 0: OK 1: power failure between previous and current epoch <1: Special event
|
||||||
}
|
line += std::string(1, '0');
|
||||||
lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString<int>(ssi), 1);
|
|
||||||
|
|
||||||
// SIGNAL STRENGTH
|
|
||||||
lineObs += Rinex_Printer::rightJustify(asString(observables_iter->second.CN0_dB_hz, 3), 14);
|
|
||||||
|
|
||||||
if (lineObs.size() < 80) lineObs += std::string(80 - lineObs.size(), ' ');
|
|
||||||
out << lineObs << std::endl;
|
|
||||||
}
|
}
|
||||||
|
if (version == 3)
|
||||||
|
{
|
||||||
|
std::string year (timestring, 0, 4);
|
||||||
|
line += std::string(1, '>');
|
||||||
|
line += std::string(1, ' ');
|
||||||
|
line += year;
|
||||||
|
line += std::string(1, ' ');
|
||||||
|
line += month;
|
||||||
|
line += std::string(1, ' ');
|
||||||
|
line += day;
|
||||||
|
line += std::string(1, ' ');
|
||||||
|
line += hour;
|
||||||
|
line += std::string(1, ' ');
|
||||||
|
line += minutes;
|
||||||
|
|
||||||
std::pair <std::multimap<unsigned int, Gnss_Synchro>::iterator, std::multimap<unsigned int, Gnss_Synchro>::iterator> ret;
|
line += std::string(1, ' ');
|
||||||
for(it = available_glo_prns.begin();
|
double seconds = fmod(gps_t, 60);
|
||||||
it != available_glo_prns.end();
|
// Add extra 0 if seconds are < 10
|
||||||
it++)
|
if (seconds < 10)
|
||||||
{
|
{
|
||||||
lineObs.clear();
|
line +=std::string(1, '0');
|
||||||
lineObs += satelliteSystem["GLONASS"];
|
}
|
||||||
if (static_cast<int>(*it) < 10) lineObs += std::string(1, '0');
|
line += Rinex_Printer::asString(seconds, 7);
|
||||||
lineObs += boost::lexical_cast<std::string>(static_cast<int>(*it));
|
line += std::string(2, ' ');
|
||||||
ret = total_glo_map.equal_range(*it);
|
// Epoch flag 0: OK 1: power failure between previous and current epoch <1: Special event
|
||||||
for (std::multimap<unsigned int, Gnss_Synchro>::iterator iter = ret.first; iter != ret.second; ++iter)
|
line += std::string(1, '0');
|
||||||
{
|
|
||||||
lineObs += Rinex_Printer::rightJustify(asString(iter->second.Pseudorange_m, 3), 14);
|
|
||||||
|
|
||||||
//Loss of lock indicator (LLI)
|
}
|
||||||
int lli = 0; // Include in the observation!!
|
//Number of satellites observed in current epoch
|
||||||
if (lli == 0)
|
//Get maps with observations
|
||||||
{
|
std::map<int, Gnss_Synchro> observablesG1C;
|
||||||
lineObs += std::string(1, ' ');
|
std::map<int, Gnss_Synchro> observablesR1C;
|
||||||
}
|
std::map<int, Gnss_Synchro> observablesR2C;
|
||||||
else
|
std::map<int, Gnss_Synchro>::const_iterator observables_iter;
|
||||||
{
|
|
||||||
lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString<short>(lli), 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Signal Strength Indicator (SSI)
|
for(observables_iter = observables.begin();
|
||||||
int ssi = Rinex_Printer::signalStrength(iter->second.CN0_dB_hz);
|
observables_iter != observables.end();
|
||||||
lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString<int>(ssi), 1);
|
observables_iter++)
|
||||||
|
{
|
||||||
|
std::string system_(&observables_iter->second.System, 1);
|
||||||
|
std::string sig_(observables_iter->second.Signal);
|
||||||
|
if((system_.compare("R") == 0) && (sig_.compare("1G") == 0))
|
||||||
|
{
|
||||||
|
observablesR1C.insert(std::pair<int, Gnss_Synchro>(observables_iter->first, observables_iter->second));
|
||||||
|
}
|
||||||
|
if((system_.compare("R") == 0) && (sig_.compare("2G") == 0))
|
||||||
|
{
|
||||||
|
observablesR2C.insert(std::pair<int, Gnss_Synchro>(observables_iter->first, observables_iter->second));
|
||||||
|
}
|
||||||
|
if((system_.compare("G") == 0) && (sig_.compare("1C") == 0))
|
||||||
|
{
|
||||||
|
observablesG1C.insert(std::pair<int, Gnss_Synchro>(observables_iter->first, observables_iter->second));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// GLONASS CARRIER PHASE
|
std::multimap<unsigned int, Gnss_Synchro> total_glo_map;
|
||||||
lineObs += Rinex_Printer::rightJustify(asString(iter->second.Carrier_phase_rads / (GALILEO_TWO_PI), 3), 14);
|
std::set<unsigned int> available_glo_prns;
|
||||||
if (lli == 0)
|
std::set<unsigned int>::iterator it;
|
||||||
{
|
for(observables_iter = observablesR1C.begin();
|
||||||
lineObs += std::string(1, ' ');
|
observables_iter != observablesR1C.end();
|
||||||
}
|
observables_iter++)
|
||||||
else
|
{
|
||||||
{
|
unsigned int prn_ = observables_iter->second.PRN;
|
||||||
lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString<short>(lli), 1);
|
total_glo_map.insert(std::pair<unsigned int, Gnss_Synchro>(prn_, observables_iter->second));
|
||||||
}
|
it = available_glo_prns.find(prn_);
|
||||||
lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString<int>(ssi), 1);
|
if(it == available_glo_prns.end())
|
||||||
|
{
|
||||||
|
available_glo_prns.insert(prn_);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// GLONASS DOPPLER
|
for(observables_iter = observablesR2C.begin();
|
||||||
lineObs += Rinex_Printer::rightJustify(asString(iter->second.Carrier_Doppler_hz, 3), 14);
|
observables_iter != observablesR2C.end();
|
||||||
if (lli == 0)
|
observables_iter++)
|
||||||
{
|
{
|
||||||
lineObs += std::string(1, ' ');
|
unsigned int prn_ = observables_iter->second.PRN;
|
||||||
}
|
total_glo_map.insert(std::pair<unsigned int, Gnss_Synchro>(prn_, observables_iter->second));
|
||||||
else
|
it = available_glo_prns.find(prn_);
|
||||||
{
|
if(it == available_glo_prns.end())
|
||||||
lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString<short>(lli), 1);
|
{
|
||||||
}
|
available_glo_prns.insert(prn_);
|
||||||
lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString<int>(ssi), 1);
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// GLONASS SIGNAL STRENGTH
|
int numGloSatellitesObserved = available_glo_prns.size();
|
||||||
lineObs += Rinex_Printer::rightJustify(asString(iter->second.CN0_dB_hz, 3), 14);
|
int numGpsSatellitesObserved = observablesG1C.size();
|
||||||
}
|
int numSatellitesObserved = numGloSatellitesObserved + numGpsSatellitesObserved;
|
||||||
|
line += Rinex_Printer::rightJustify(boost::lexical_cast<std::string>(numSatellitesObserved), 3);
|
||||||
|
if(version == 2)
|
||||||
|
{
|
||||||
|
// Add list of GPS satellites
|
||||||
|
for(observables_iter = observablesG1C.begin();
|
||||||
|
observables_iter != observablesG1C.end();
|
||||||
|
observables_iter++)
|
||||||
|
{
|
||||||
|
line += satelliteSystem["GPS"];
|
||||||
|
if (static_cast<int>(observables_iter->second.PRN) < 10) line += std::string(1, '0');
|
||||||
|
line += boost::lexical_cast<std::string>(static_cast<int>(observables_iter->second.PRN));
|
||||||
|
}
|
||||||
|
// Add list of GLONASS L1 satellites
|
||||||
|
for(observables_iter = observablesR1C.begin();
|
||||||
|
observables_iter != observablesR1C.end();
|
||||||
|
observables_iter++)
|
||||||
|
{
|
||||||
|
line += satelliteSystem["GLONASS"];
|
||||||
|
if (static_cast<int>(observables_iter->second.PRN) < 10) line += std::string(1, '0');
|
||||||
|
line += boost::lexical_cast<std::string>(static_cast<int>(observables_iter->second.PRN));
|
||||||
|
}
|
||||||
|
// Add list of GLONASS L2 satellites
|
||||||
|
for(observables_iter = observablesR2C.begin();
|
||||||
|
observables_iter != observablesR2C.end();
|
||||||
|
observables_iter++)
|
||||||
|
{
|
||||||
|
line += satelliteSystem["GLONASS"];
|
||||||
|
if (static_cast<int>(observables_iter->second.PRN) < 10) line += std::string(1, '0');
|
||||||
|
line += boost::lexical_cast<std::string>(static_cast<int>(observables_iter->second.PRN));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
line += std::string(80 - line.size(), ' ');
|
||||||
|
Rinex_Printer::lengthCheck(line);
|
||||||
|
out << line << std::endl;
|
||||||
|
|
||||||
|
// -------- OBSERVATION record
|
||||||
|
std::string s;
|
||||||
|
std::string lineObs;
|
||||||
|
for(observables_iter = observablesG1C.begin();
|
||||||
|
observables_iter != observablesG1C.end();
|
||||||
|
observables_iter++)
|
||||||
|
{
|
||||||
|
lineObs.clear();
|
||||||
|
|
||||||
|
s.assign(1, observables_iter->second.System);
|
||||||
|
if(version == 3)
|
||||||
|
{
|
||||||
|
// Specify system only if in version 3
|
||||||
|
if(s.compare("G") == 0) lineObs += satelliteSystem["GPS"];
|
||||||
|
if(s.compare("R") == 0) lineObs += satelliteSystem["GLONASS"]; // should not happen
|
||||||
|
if (static_cast<int>(observables_iter->second.PRN) < 10) lineObs += std::string(1, '0');
|
||||||
|
lineObs += boost::lexical_cast<std::string>(static_cast<int>(observables_iter->second.PRN));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Pseudorange Measurements
|
||||||
|
lineObs += Rinex_Printer::rightJustify(asString(observables_iter->second.Pseudorange_m, 3), 14);
|
||||||
|
|
||||||
|
//Loss of lock indicator (LLI)
|
||||||
|
int lli = 0; // Include in the observation!!
|
||||||
|
if (lli == 0)
|
||||||
|
{
|
||||||
|
lineObs += std::string(1, ' ');
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString<short>(lli), 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Signal Strength Indicator (SSI)
|
||||||
|
int ssi = Rinex_Printer::signalStrength(observables_iter->second.CN0_dB_hz);
|
||||||
|
lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString<int>(ssi), 1);
|
||||||
|
|
||||||
|
// PHASE
|
||||||
|
lineObs += Rinex_Printer::rightJustify(asString(observables_iter->second.Carrier_phase_rads/GPS_TWO_PI, 3), 14);
|
||||||
|
if (lli == 0)
|
||||||
|
{
|
||||||
|
lineObs += std::string(1, ' ');
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString<short>(lli), 1);
|
||||||
|
}
|
||||||
|
lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString<int>(ssi), 1);
|
||||||
|
|
||||||
|
// DOPPLER
|
||||||
|
lineObs += Rinex_Printer::rightJustify(asString(observables_iter->second.Carrier_Doppler_hz, 3), 14);
|
||||||
|
if (lli == 0)
|
||||||
|
{
|
||||||
|
lineObs += std::string(1, ' ');
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString<short>(lli), 1);
|
||||||
|
}
|
||||||
|
lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString<int>(ssi), 1);
|
||||||
|
|
||||||
|
// SIGNAL STRENGTH
|
||||||
|
lineObs += Rinex_Printer::rightJustify(asString(observables_iter->second.CN0_dB_hz, 3), 14);
|
||||||
|
|
||||||
|
if (lineObs.size() < 80) lineObs += std::string(80 - lineObs.size(), ' ');
|
||||||
|
out << lineObs << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::pair <std::multimap<unsigned int, Gnss_Synchro>::iterator, std::multimap<unsigned int, Gnss_Synchro>::iterator> ret;
|
||||||
|
for(it = available_glo_prns.begin();
|
||||||
|
it != available_glo_prns.end();
|
||||||
|
it++)
|
||||||
|
{
|
||||||
|
lineObs.clear();
|
||||||
|
if(version == 3)
|
||||||
|
{
|
||||||
|
lineObs += satelliteSystem["GLONASS"];
|
||||||
|
if (static_cast<int>(*it) < 10) lineObs += std::string(1, '0');
|
||||||
|
lineObs += boost::lexical_cast<std::string>(static_cast<int>(*it));
|
||||||
|
}
|
||||||
|
ret = total_glo_map.equal_range(*it);
|
||||||
|
for (std::multimap<unsigned int, Gnss_Synchro>::iterator iter = ret.first; iter != ret.second; ++iter)
|
||||||
|
{
|
||||||
|
/// \todo Need to account for pseudorange correction for glonass
|
||||||
|
double leap_seconds = Rinex_Printer::get_leap_second(glonass_gnav_eph, gps_obs_time);
|
||||||
|
lineObs += Rinex_Printer::rightJustify(asString(iter->second.Pseudorange_m, 3), 14);
|
||||||
|
|
||||||
|
//Loss of lock indicator (LLI)
|
||||||
|
int lli = 0; // Include in the observation!!
|
||||||
|
if (lli == 0)
|
||||||
|
{
|
||||||
|
lineObs += std::string(1, ' ');
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString<short>(lli), 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Signal Strength Indicator (SSI)
|
||||||
|
int ssi = Rinex_Printer::signalStrength(iter->second.CN0_dB_hz);
|
||||||
|
lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString<int>(ssi), 1);
|
||||||
|
|
||||||
|
// GLONASS CARRIER PHASE
|
||||||
|
lineObs += Rinex_Printer::rightJustify(asString(iter->second.Carrier_phase_rads / (GLONASS_TWO_PI), 3), 14);
|
||||||
|
if (lli == 0)
|
||||||
|
{
|
||||||
|
lineObs += std::string(1, ' ');
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString<short>(lli), 1);
|
||||||
|
}
|
||||||
|
lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString<int>(ssi), 1);
|
||||||
|
|
||||||
|
// GLONASS DOPPLER
|
||||||
|
lineObs += Rinex_Printer::rightJustify(asString(iter->second.Carrier_Doppler_hz, 3), 14);
|
||||||
|
if (lli == 0)
|
||||||
|
{
|
||||||
|
lineObs += std::string(1, ' ');
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString<short>(lli), 1);
|
||||||
|
}
|
||||||
|
lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString<int>(ssi), 1);
|
||||||
|
|
||||||
|
// GLONASS SIGNAL STRENGTH
|
||||||
|
lineObs += Rinex_Printer::rightJustify(asString(iter->second.CN0_dB_hz, 3), 14);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (lineObs.size() < 80) lineObs += std::string(80 - lineObs.size(), ' ');
|
||||||
|
out << lineObs << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
if (lineObs.size() < 80) lineObs += std::string(80 - lineObs.size(), ' ');
|
|
||||||
out << lineObs << std::endl;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -5954,11 +6097,11 @@ void Rinex_Printer::log_rinex_obs(std::fstream& out, const Galileo_Ephemeris& ga
|
|||||||
{
|
{
|
||||||
std::string system_(&observables_iter->second.System, 1);
|
std::string system_(&observables_iter->second.System, 1);
|
||||||
std::string sig_(observables_iter->second.Signal);
|
std::string sig_(observables_iter->second.Signal);
|
||||||
if((system_.compare("R") == 0) && (sig_.compare("1C") == 0))
|
if((system_.compare("R") == 0) && (sig_.compare("1G") == 0))
|
||||||
{
|
{
|
||||||
observablesR1C.insert(std::pair<int, Gnss_Synchro>(observables_iter->first, observables_iter->second));
|
observablesR1C.insert(std::pair<int, Gnss_Synchro>(observables_iter->first, observables_iter->second));
|
||||||
}
|
}
|
||||||
if((system_.compare("R") == 0) && (sig_.compare("2C") == 0))
|
if((system_.compare("R") == 0) && (sig_.compare("2G") == 0))
|
||||||
{
|
{
|
||||||
observablesR2C.insert(std::pair<int, Gnss_Synchro>(observables_iter->first, observables_iter->second));
|
observablesR2C.insert(std::pair<int, Gnss_Synchro>(observables_iter->first, observables_iter->second));
|
||||||
}
|
}
|
||||||
@ -7431,6 +7574,46 @@ boost::posix_time::ptime Rinex_Printer::compute_UTC_time(const Glonass_Gnav_Ephe
|
|||||||
return utc_time;
|
return utc_time;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
double Rinex_Printer::get_leap_second(const Glonass_Gnav_Ephemeris& eph, const double gps_obs_time)
|
||||||
|
{
|
||||||
|
double tod = 0.0;
|
||||||
|
double glot2utc = 3*3600;
|
||||||
|
double obs_time_utc = 0.0, obs_time_glot = 0.0;
|
||||||
|
int i = 0;
|
||||||
|
double leap_second = 0;
|
||||||
|
|
||||||
|
// Get observation time in nearly GLONASS time. Correction for leap seconds done at the end
|
||||||
|
obs_time_glot = gps_obs_time + glot2utc;
|
||||||
|
|
||||||
|
// Get seconds of day in glonass time
|
||||||
|
tod = fmod (obs_time_glot, 86400);
|
||||||
|
|
||||||
|
// Form date and time duration types
|
||||||
|
boost::posix_time::time_duration t1(0, 0, tod);
|
||||||
|
boost::gregorian::date d1(eph.d_yr, 1, 1);
|
||||||
|
boost::gregorian::days d2(eph.d_N_T-1);
|
||||||
|
boost::posix_time::ptime glo_time(d1 + d2, t1);
|
||||||
|
|
||||||
|
// Convert to utc
|
||||||
|
boost::posix_time::time_duration t2(0, 0, glot2utc);
|
||||||
|
boost::posix_time::ptime utc_time = glo_time - t2;
|
||||||
|
|
||||||
|
// Adjust for leap second correction
|
||||||
|
for (i = 0; GLONASS_LEAP_SECONDS[i][0]>0; i++)
|
||||||
|
{
|
||||||
|
boost::posix_time::time_duration t3(GLONASS_LEAP_SECONDS[i][3], GLONASS_LEAP_SECONDS[i][4], GLONASS_LEAP_SECONDS[i][5]);
|
||||||
|
boost::gregorian::date d3(GLONASS_LEAP_SECONDS[i][0], GLONASS_LEAP_SECONDS[i][1], GLONASS_LEAP_SECONDS[i][2]);
|
||||||
|
boost::posix_time::ptime ls_time(d3, t3);
|
||||||
|
if (utc_time >= ls_time)
|
||||||
|
{
|
||||||
|
// We subtract the leap second when going from gpst to utc
|
||||||
|
leap_second = fabs(GLONASS_LEAP_SECONDS[i][6]);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return leap_second;
|
||||||
|
}
|
||||||
/*
|
/*
|
||||||
|
|
||||||
enum RINEX_enumMarkerType {
|
enum RINEX_enumMarkerType {
|
||||||
|
@ -202,6 +202,13 @@ public:
|
|||||||
*/
|
*/
|
||||||
boost::posix_time::ptime compute_UTC_time(const Glonass_Gnav_Ephemeris & eph, const double obs_time);
|
boost::posix_time::ptime compute_UTC_time(const Glonass_Gnav_Ephemeris & eph, const double obs_time);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* \brief Computes number of leap seconds of GPS relative to UTC
|
||||||
|
* \param eph GLONASS GNAV Ephemeris object
|
||||||
|
* \param gps_obs_time Observation time in GPS seconds of week
|
||||||
|
*/
|
||||||
|
double get_leap_second(const Glonass_Gnav_Ephemeris& eph, const double gps_obs_time);
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* \brief Writes data from the GPS L1 C/A navigation message into the RINEX file
|
* \brief Writes data from the GPS L1 C/A navigation message into the RINEX file
|
||||||
*/
|
*/
|
||||||
|
Loading…
Reference in New Issue
Block a user