Improvements in the Galileo RINEX printer

This commit is contained in:
Carles Fernandez 2014-09-03 18:57:37 +02:00
parent 358f29f305
commit 90b2b25b5c
5 changed files with 80 additions and 14 deletions

View File

@ -438,8 +438,8 @@ void Rinex_Printer::rinex_nav_header(std::ofstream& out, Galileo_Iono iono, Gal
line += std::string("GPGA");
line += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(galileo_almanac.A_0G_10, 16, 2), 18);
line += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(galileo_almanac.A_1G_10, 15, 2), 16);
line += Rinex_Printer::rightJustify(boost::lexical_cast<std::string>(utc_model.t0t_6), 7);
line += Rinex_Printer::rightJustify(boost::lexical_cast<std::string>(utc_model.WNot_6), 5);
line += Rinex_Printer::rightJustify(boost::lexical_cast<std::string>(galileo_almanac.t_0G_10), 7);
line += Rinex_Printer::rightJustify(boost::lexical_cast<std::string>(galileo_almanac.WN_0G_10), 5);
line += std::string(10, ' ');
line += Rinex_Printer::leftJustify("TIME SYSTEM CORR", 20);
Rinex_Printer::lengthCheck(line);
@ -1147,12 +1147,17 @@ void Rinex_Printer::log_rinex_nav(std::ofstream& out, std::map<int, Galileo_Ephe
line += std::string(5, ' ');
line += Rinex_Printer::doub2for(galileo_ephemeris_iter->second.iDot_2, 18, 2);
line += std::string(1, ' ');
double zero = 0.0;
line += Rinex_Printer::doub2for(zero, 18, 2);
//double one = 1.0; // INAV E1-B
std::string iNAVE1B("1000000001");
int data_source_INAV = Rinex_Printer::toInt(iNAVE1B, 10);
line += Rinex_Printer::doub2for(static_cast<double>(data_source_INAV), 18, 2);
line += std::string(1, ' ');
double Galileo_week_continuous_number = (double)(galileo_ephemeris_iter->second.WN_5);
double GST_week = (double)(galileo_ephemeris_iter->second.WN_5);
double num_GST_rollovers = floor((GST_week + 1024.0) / 4096.0 );
double Galileo_week_continuous_number = GST_week + 1024.0 + num_GST_rollovers * 4096.0;
line += Rinex_Printer::doub2for(Galileo_week_continuous_number, 18, 2);
line += std::string(1, ' ');
double zero = 0.0;
line += Rinex_Printer::doub2for(zero, 18, 2);
Rinex_Printer::lengthCheck(line);
out << line << std::endl;
@ -1161,13 +1166,29 @@ void Rinex_Printer::log_rinex_nav(std::ofstream& out, std::map<int, Galileo_Ephe
// -------- BROADCAST ORBIT - 6
line.clear();
line += std::string(5, ' ');
line += Rinex_Printer::doub2for(zero, 18, 2);
line += Rinex_Printer::doub2for(galileo_ephemeris_iter->second.SISA_3, 18, 2); // Not read by eph!
//double minusone = -1.0; // Unknown
//line += Rinex_Printer::doub2for(minusone, 18, 2);
line += std::string(1, ' ');
line += Rinex_Printer::doub2for(zero, 18, 2); //
std::string E1B_HS, E5B_HS;
if (galileo_ephemeris_iter->second.E1B_HS_5 == 0) E1B_HS = "00";
if (galileo_ephemeris_iter->second.E1B_HS_5 == 1) E1B_HS = "01";
if (galileo_ephemeris_iter->second.E1B_HS_5 == 2) E1B_HS = "10";
if (galileo_ephemeris_iter->second.E1B_HS_5 == 3) E1B_HS = "11";
if (galileo_ephemeris_iter->second.E5b_HS_5 == 0) E5B_HS = "00";
if (galileo_ephemeris_iter->second.E5b_HS_5 == 1) E5B_HS = "01";
if (galileo_ephemeris_iter->second.E5b_HS_5 == 2) E5B_HS = "10";
if (galileo_ephemeris_iter->second.E5b_HS_5 == 3) E5B_HS = "11";
std::string SVhealth_str = boost::lexical_cast<std::string>(galileo_ephemeris_iter->second.E1B_DVS_5)
+ E1B_HS + boost::lexical_cast<std::string>(galileo_ephemeris_iter->second.E1B_DVS_5)
+ "1" + "11" + boost::lexical_cast<std::string>(galileo_ephemeris_iter->second.E5b_DVS_5)
+ E5B_HS;
int SVhealth = Rinex_Printer::toInt(SVhealth_str, 9);
line += Rinex_Printer::doub2for(static_cast<double>(SVhealth), 18, 2); //
line += std::string(1, ' ');
line += Rinex_Printer::doub2for(zero, 18, 2); //
line += Rinex_Printer::doub2for(galileo_ephemeris_iter->second.BGD_E1E5a_5, 18, 2); //
line += std::string(1, ' ');
line += Rinex_Printer::doub2for(zero, 18, 2); //
line += Rinex_Printer::doub2for(galileo_ephemeris_iter->second.BGD_E1E5b_5, 18, 2); //
Rinex_Printer::lengthCheck(line);
out << line << std::endl;
@ -1360,7 +1381,7 @@ void Rinex_Printer::rinex_obs_header(std::ofstream& out, Gps_Ephemeris eph, doub
line += std::string(1, ' ');
line += observationType["DOPPLER"];
line += observationCode["GPS_L1_CA"];
// GPS L! CA SIGNAL STRENGTH
// GPS L1 CA SIGNAL STRENGTH
line += std::string(1, ' ');
line += observationType["SIGNAL_STRENGTH"];
line += observationCode["GPS_L1_CA"];
@ -2115,9 +2136,8 @@ boost::posix_time::ptime Rinex_Printer::compute_GPS_time(Gps_Ephemeris eph, doub
boost::posix_time::ptime Rinex_Printer::compute_Galileo_time(Galileo_Ephemeris eph, double obs_time)
{
// The RINEX v2.11 v3.00 format uses GPS time for the observations epoch, not UTC time, thus, no leap seconds needed here.
// (see Section 3 in http://igscb.jpl.nasa.gov/igscb/data/format/rinex211.txt)
// (see Pag. 17 in http://igscb.jpl.nasa.gov/igscb/data/format/rinex300.pdf)
// The RINEX v2.11 v3.00 format uses Galileo time for the observations epoch, not UTC time, thus, no leap seconds needed here.
// (see Pag. 17 in http://igscb.jpl.nasa.gov/igscb/data/format/rinex301.pdf)
// --??? No time correction here, since it will be done in the RINEX processor
double galileo_t = obs_time;
boost::posix_time::time_duration t = boost::posix_time::millisec((galileo_t + 604800*(double)(eph.WN_5))*1000); //

View File

@ -333,6 +333,9 @@ private:
inline double asDouble(const std::string& s)
{ return strtod(s.c_str(), 0); }
inline int toInt(std::string bitString, int sLength);
/*
* Convert a string to an integer.
* @param s string containing a number.
@ -342,7 +345,6 @@ private:
{ return strtol(s.c_str(), 0, 10); }
/*
* Convert a double to a string in fixed notation.
* @param x double.
@ -580,6 +582,22 @@ inline std::string Rinex_Printer::asFixWidthString(const int x, const int width,
return ss.str().substr(ss.str().size() - width);
}
inline long asInt(const std::string& s)
{ return strtol(s.c_str(), 0, 10); }
inline int Rinex_Printer::toInt(std::string bitString, int sLength)
{
int tempInt;
int num = 0;
for(int i=0; i < sLength; i++)
{
tempInt = bitString[i]-'0';
num |= (1 << (sLength-1-i)) * tempInt;
}
return num;
}
template<class X>
inline std::string Rinex_Printer::asString(const X x)

View File

@ -61,6 +61,14 @@ Galileo_Ephemeris::Galileo_Ephemeris()
/*GST*/
WN_5 = 0;
TOW_5 = 0;
// SV status
SISA_3 = 0;
E5b_HS_5 = 0;
E1B_HS_5 = 0;
E5b_DVS_5 = 0;
E1B_DVS_5 = 0;
BGD_E1E5a_5 = 0; //!< E1-E5a Broadcast Group Delay [s]
BGD_E1E5b_5 = 0; //!< E1-E5b Broadcast Group Delay [s]
}

View File

@ -83,6 +83,16 @@ public:
double Galileo_satClkDrift;
double Galileo_dtr; //!< relativistic clock correction term
// SV status
double SISA_3;
double E5b_HS_5; //!< E5b Signal Health Status
double E1B_HS_5; //!< E1B Signal Health Status
double E5b_DVS_5; //!< E5b Data Validity Status
double E1B_DVS_5; //!< E1B Data Validity Status
double BGD_E1E5a_5; //!< E1-E5a Broadcast Group Delay [s]
double BGD_E1E5b_5; //!< E1-E5b Broadcast Group Delay [s]
// satellite positions
double d_satpos_X; //!< Earth-fixed coordinate x of the satellite [m]. Intersection of the IERS Reference Meridian (IRM) and the plane passing through the origin and normal to the Z-axis.
double d_satpos_Y; //!< Earth-fixed coordinate y of the satellite [m]. Completes a right-handed, Earth-Centered, Earth-Fixed orthogonal coordinate system.

View File

@ -545,6 +545,16 @@ Galileo_Ephemeris Galileo_Navigation_Message::get_ephemeris()
/*GST*/
ephemeris.WN_5 = WN_5; // Week number
ephemeris.TOW_5 = TOW_5; // Time of Week
ephemeris.SISA_3 = SISA_3;
ephemeris.E5b_HS_5 = E5b_HS_5; // E5b Signal Health Status
ephemeris.E1B_HS_5 = E1B_HS_5; // E1B Signal Health Status
ephemeris.E5b_DVS_5 = E5b_DVS_5; // E5b Data Validity Status
ephemeris.E1B_DVS_5 = E1B_DVS_5; // E1B Data Validity Status
ephemeris.BGD_E1E5a_5 = BGD_E1E5a_5; // E1-E5a Broadcast Group Delay [s]
ephemeris.BGD_E1E5b_5 = BGD_E1E5b_5; // E1-E5b Broadcast Group Delay [s]
return ephemeris;
}