1
0
mirror of https://github.com/gnss-sdr/gnss-sdr synced 2024-12-14 04:00:34 +00:00

bugfix: Fix computation of TOW value for GLONASS GNAV

Fixes the TOW computation mapping from GLONASS Time to UTC time and then
conversion to TOW and WN. The logic of the conversion considers time
offsets but  may need to be reviewed.
This commit is contained in:
Damian Miralles 2017-09-22 12:16:26 -06:00
parent c22cc63f31
commit 081a78f603
6 changed files with 132 additions and 39 deletions

View File

@ -5,7 +5,7 @@ GNSS-SDR.internal_fs_sps=6625000
;######### SIGNAL_SOURCE CONFIG ############ ;######### SIGNAL_SOURCE CONFIG ############
SignalSource.implementation=File_Signal_Source SignalSource.implementation=File_Signal_Source
SignalSource.filename=/archive/NT1065_GLONASS_L1_20160831_fs6625e6_if0e3_schar_1m.bin ; <- PUT YOUR FILE HERE SignalSource.filename=/archive/NT1065_GLONASS_L1_20160923_fs6625e6_if0e3_schar.bin ; <- PUT YOUR FILE HERE
SignalSource.item_type=ibyte SignalSource.item_type=ibyte
SignalSource.sampling_frequency=6625000 SignalSource.sampling_frequency=6625000
;SignalSource.freq=0 ;SignalSource.freq=0
@ -29,11 +29,11 @@ Channel.signal=1G
Channels.in_acquisition=1 Channels.in_acquisition=1
Channels_1G.count=5 Channels_1G.count=5
Channel0.satellite=11 Channel0.satellite=24 ; k=
Channel1.satellite=2 Channel1.satellite=1 ; k=1
Channel2.satellite=18 Channel2.satellite=2 ; k=-4
Channel3.satellite=12 Channel3.satellite=20 ; k=-5
Channel4.satellite=21 Channel4.satellite=21 ; k=4
;######### ACQUISITION GLOBAL CONFIG ############ ;######### ACQUISITION GLOBAL CONFIG ############
Acquisition_1G.implementation=GLONASS_L1_CA_PCPS_Acquisition Acquisition_1G.implementation=GLONASS_L1_CA_PCPS_Acquisition

View File

@ -191,7 +191,8 @@ void rtklib_pvt_cc::msg_handler_telemetry(pmt::pmt_t msg)
// insert new ephemeris record // insert new ephemeris record
DLOG(INFO) << "GLONASS GNAV New Ephemeris record inserted in global map with TOW =" << glonass_gnav_eph->d_TOW DLOG(INFO) << "GLONASS GNAV New Ephemeris record inserted in global map with TOW =" << glonass_gnav_eph->d_TOW
<< ", GLONASS GNAV Week Number =" << glonass_gnav_eph->d_WN << ", GLONASS GNAV Week Number =" << glonass_gnav_eph->d_WN
<< " and Ephemeris IOD = " << glonass_gnav_eph->compute_GLONASS_time(glonass_gnav_eph->d_t_b); << " and Ephemeris IOD = " << glonass_gnav_eph->compute_GLONASS_time(glonass_gnav_eph->d_t_b)
<< " from SV = " << glonass_gnav_eph->i_satellite_slot_number;
// update/insert new ephemeris record to the global ephemeris map // update/insert new ephemeris record to the global ephemeris map
d_ls_pvt->glonass_gnav_ephemeris_map[glonass_gnav_eph->i_satellite_PRN] = *glonass_gnav_eph; d_ls_pvt->glonass_gnav_ephemeris_map[glonass_gnav_eph->i_satellite_PRN] = *glonass_gnav_eph;
} }
@ -209,7 +210,8 @@ void rtklib_pvt_cc::msg_handler_telemetry(pmt::pmt_t msg)
std::shared_ptr<Glonass_Gnav_Almanac> glonass_gnav_almanac; std::shared_ptr<Glonass_Gnav_Almanac> glonass_gnav_almanac;
glonass_gnav_almanac = boost::any_cast<std::shared_ptr<Glonass_Gnav_Almanac>>(pmt::any_ref(msg)); glonass_gnav_almanac = boost::any_cast<std::shared_ptr<Glonass_Gnav_Almanac>>(pmt::any_ref(msg));
d_ls_pvt->glonass_gnav_almanac = *glonass_gnav_almanac; d_ls_pvt->glonass_gnav_almanac = *glonass_gnav_almanac;
DLOG(INFO) << "New GLONASS GNAV Almanac has arrived "; DLOG(INFO) << "New GLONASS GNAV Almanac has arrived "
<< ", GLONASS GNAV Slot Number =" << glonass_gnav_almanac->d_n_A;
} }
else else
{ {

View File

@ -598,7 +598,7 @@ void GNSSFlowgraph::set_signals_list()
29, 30, 31, 32, 33, 34, 35, 36}; 29, 30, 31, 32, 33, 34, 35, 36};
// Removing satellites sharing same frequency number(1 and 5, 2 and 6, 3 and 7, 4 and 6, 11 and 15, 12 and 16, 14 and 18, 17 and 21 // Removing satellites sharing same frequency number(1 and 5, 2 and 6, 3 and 7, 4 and 6, 11 and 15, 12 and 16, 14 and 18, 17 and 21
std::set<unsigned int> available_glonass_prn = { 1, 2, 3, 4, 9, 10, 11, 12, 18, 19, 20, 21 }; std::set<unsigned int> available_glonass_prn = { 1, 2, 3, 4, 9, 10, 11, 12, 18, 19, 20, 21, 24 };
std::string sv_list = configuration_->property("Galileo.prns", std::string("") ); std::string sv_list = configuration_->property("Galileo.prns", std::string("") );

View File

@ -87,6 +87,7 @@ const double GLONASS_L1_CA_CODE_LENGTH_CHIPS = 511.0; //!< GLONASS L1 C/
const double GLONASS_L1_CA_CODE_PERIOD = 0.001; //!< GLONASS L1 C/A code period [seconds] const double GLONASS_L1_CA_CODE_PERIOD = 0.001; //!< GLONASS L1 C/A code period [seconds]
const double GLONASS_L1_CA_CHIP_PERIOD = 1.9569e-06; //!< GLONASS L1 C/A chip period [seconds] const double GLONASS_L1_CA_CHIP_PERIOD = 1.9569e-06; //!< GLONASS L1 C/A chip period [seconds]
const double GLONASS_L1_CA_SYMBOL_RATE_BPS = 1000; const double GLONASS_L1_CA_SYMBOL_RATE_BPS = 1000;
const int GLONASS_L1_CA_NBR_SATS = 24; // STRING DATA WITHOUT PREAMBLE
//FIXME Probably should use leap seconds definitions of rtklib //FIXME Probably should use leap seconds definitions of rtklib
const double GLONASS_LEAP_SECONDS[21][7] = { /* leap seconds (y,m,d,h,m,s,utc-gpst) */ const double GLONASS_LEAP_SECONDS[21][7] = { /* leap seconds (y,m,d,h,m,s,utc-gpst) */
@ -135,7 +136,7 @@ const std::map<unsigned int, int> GLONASS_PRN =
{17, 4,}, //Plane 3 {17, 4,}, //Plane 3
{18,-3,}, //Plane 3 {18,-3,}, //Plane 3
{19, 3,}, //Plane 3 {19, 3,}, //Plane 3
{20, 2,}, //Plane 3 {20, -5,}, //Plane 3
{21, 4,}, //Plane 3 {21, 4,}, //Plane 3
{22,-3,}, //Plane 3 {22,-3,}, //Plane 3
{23, 3,}, //Plane 3 {23, 3,}, //Plane 3

View File

@ -89,6 +89,11 @@ void Glonass_Gnav_Navigation_Message::reset()
d_dtr = 0.0; d_dtr = 0.0;
d_satClkDrift = 0.0; d_satClkDrift = 0.0;
// Data update information
d_previous_tb = 0.0;
for(unsigned int i = 0; i < GLONASS_L1_CA_NBR_SATS; i++)
d_previous_Na[i] = 0.0;
std::map<int,std::string> satelliteBlock; //!< Map that stores to which block the PRN belongs http://www.navcen.uscg.gov/?Do=constellationStatus std::map<int,std::string> satelliteBlock; //!< Map that stores to which block the PRN belongs http://www.navcen.uscg.gov/?Do=constellationStatus
@ -314,23 +319,74 @@ unsigned int Glonass_Gnav_Navigation_Message::get_frame_number(unsigned int sate
return frame_ID; return frame_ID;
} }
double Glonass_Gnav_Navigation_Message::get_WN()
{
double WN = 0.0;
double days = 0.0;
double total_sec = 0.0;
int i = 0;
boost::gregorian::date gps_epoch { 1980, 1, 6 };
// Map to UTC
boost::gregorian::date glo_date(gnav_ephemeris.d_yr, 1, 1);
boost::gregorian::days d2(gnav_ephemeris.d_N_T);
glo_date = glo_date + d2;
boost::posix_time::time_duration t(-6, 0, 0);
boost::posix_time::ptime glo_time(glo_date, t);
boost::gregorian::date utc_date = glo_time.date();
days = static_cast<double>((utc_date - gps_epoch).days());
total_sec = days*86400;
for (i = 0; GLONASS_LEAP_SECONDS[i][0]>0; i++)
{
if (GLONASS_LEAP_SECONDS[i][0] == gnav_ephemeris.d_yr)
{
// We add the leap second when going from utc to gpst
total_sec += GLONASS_LEAP_SECONDS[i][6];
}
}
WN = floor(total_sec/604800);
return WN;
}
double Glonass_Gnav_Navigation_Message::get_TOW() double Glonass_Gnav_Navigation_Message::get_TOW()
{ {
double TOD = 0.0;
double TOW = 0.0; double TOW = 0.0;
double dayofweek = 0.0;
double utcsu2utc = 3*3600; double utcsu2utc = 3*3600;
double glot2utcsu = 3*3600; double glot2utcsu = 3*3600;
int i = 0; int i = 0;
TOW = gnav_ephemeris.d_t_k + glot2utcsu + utcsu2utc + gnav_utc_model.d_tau_c + gnav_utc_model.d_tau_gps; // tk is relative to UTC(SU) + 3.00 hrs, so we need to convert to utc and add corrections
TOD = gnav_ephemeris.d_t_k - glot2utcsu - utcsu2utc + gnav_utc_model.d_tau_c + gnav_utc_model.d_tau_gps;
boost::gregorian::date glo_date(gnav_ephemeris.d_yr, 1, 1);
boost::gregorian::days d2(gnav_ephemeris.d_N_T);
glo_date = glo_date + d2;
dayofweek = static_cast<double>(glo_date.day_of_week());
TOW = TOD + dayofweek*86400;
for (i = 0; GLONASS_LEAP_SECONDS[i][0]>0; i++) for (i = 0; GLONASS_LEAP_SECONDS[i][0]>0; i++)
{ {
if (GLONASS_LEAP_SECONDS[i][0] == gnav_ephemeris.d_yr) if (GLONASS_LEAP_SECONDS[i][0] == gnav_ephemeris.d_yr)
{ {
TOW -= GLONASS_LEAP_SECONDS[i][6]; // We add the leap second when going from utc to gpst
TOW += GLONASS_LEAP_SECONDS[i][6];
} }
} }
// Compute the arithmetic modules to wrap around range
TOW = TOW - 604800*floor(TOW/604800);
return TOW; return TOW;
} }
@ -342,13 +398,14 @@ int Glonass_Gnav_Navigation_Message::string_decoder(std::string frame_string)
d_frame_ID = 0; d_frame_ID = 0;
// Unpack bytes to bits // Unpack bytes to bits
std::bitset<GLONASS_GNAV_STRING_BITS> string_bits = std::bitset<GLONASS_GNAV_STRING_BITS>((frame_string)); std::bitset<GLONASS_GNAV_STRING_BITS> string_bits (frame_string);
// Perform data verification and exit code if error in bit sequence // Perform data verification and exit code if error in bit sequence
flag_CRC_test = CRC_test(string_bits); flag_CRC_test = CRC_test(string_bits);
if(flag_CRC_test == false) if(flag_CRC_test == false)
return 0; return 0;
// Decode all 15 string messages // Decode all 15 string messages
d_string_ID = static_cast<unsigned int>(read_navigation_unsigned(string_bits, STRING_ID)); d_string_ID = static_cast<unsigned int>(read_navigation_unsigned(string_bits, STRING_ID));
switch (d_string_ID) { switch (d_string_ID) {
@ -461,6 +518,8 @@ int Glonass_Gnav_Navigation_Message::string_decoder(std::string frame_string)
if (flag_ephemeris_str_1 == true) if (flag_ephemeris_str_1 == true)
{ {
d_TOW = get_TOW(); d_TOW = get_TOW();
gnav_ephemeris.d_TOW = d_TOW;
gnav_ephemeris.d_WN = get_WN();
flag_TOW_set = true; flag_TOW_set = true;
} }
@ -730,20 +789,29 @@ Glonass_Gnav_Almanac Glonass_Gnav_Navigation_Message::get_almanac(unsigned int s
bool Glonass_Gnav_Navigation_Message::have_new_ephemeris() //Check if we have a new ephemeris stored in the galileo navigation class bool Glonass_Gnav_Navigation_Message::have_new_ephemeris() //Check if we have a new ephemeris stored in the galileo navigation class
{ {
bool new_eph = false;
// We need to make sure we have received the ephemeris info plus the time info // We need to make sure we have received the ephemeris info plus the time info
if ((flag_ephemeris_str_1 == true) and (flag_ephemeris_str_2 == true) and if ((flag_ephemeris_str_1 == true) and (flag_ephemeris_str_2 == true) and
(flag_ephemeris_str_3 == true) and (flag_ephemeris_str_4 == true) and (flag_ephemeris_str_3 == true) and (flag_ephemeris_str_4 == true) and
(flag_utc_model_str_5 == true)) (flag_utc_model_str_5 == true))
{ {
flag_ephemeris_str_1 = false;// clear the flag if(d_previous_tb != gnav_ephemeris.d_t_b)
flag_ephemeris_str_2 = false;// clear the flag {
flag_ephemeris_str_3 = false;// clear the flag flag_ephemeris_str_1 = false;// clear the flag
flag_ephemeris_str_4 = false;// clear the flag flag_ephemeris_str_2 = false;// clear the flag
flag_all_ephemeris = true; flag_ephemeris_str_3 = false;// clear the flag
DLOG(INFO) << "GLONASS GNAV Ephemeris (1, 2, 3, 4) have been received and belong to the same batch" << std::endl; flag_ephemeris_str_4 = false;// clear the flag
flag_all_ephemeris = true;
// Update the time of ephemeris information
d_previous_tb = gnav_ephemeris.d_t_b;
DLOG(INFO) << "GLONASS GNAV Ephemeris (1, 2, 3, 4) have been received and belong to the same batch" << std::endl;
new_eph = true;
}
} }
else
return false;
return new_eph;
} }
@ -764,34 +832,50 @@ bool Glonass_Gnav_Navigation_Message::have_new_almanac() //Check if we have a ne
bool new_alm = false; bool new_alm = false;
if ((flag_almanac_str_6 == true) and (flag_almanac_str_7 == true)) if ((flag_almanac_str_6 == true) and (flag_almanac_str_7 == true))
{ {
//All almanac have been received for this satellite if (d_previous_Na[i_alm_satellite_slot_number] != gnav_utc_model.d_N_A)
flag_almanac_str_6 = false; {
flag_almanac_str_7 = false; //All almanac have been received for this satellite
new_alm = true; flag_almanac_str_6 = false;
flag_almanac_str_7 = false;
new_alm = true;
}
} }
if ((flag_almanac_str_8 == true) and (flag_almanac_str_9 == true)) if ((flag_almanac_str_8 == true) and (flag_almanac_str_9 == true))
{ {
flag_almanac_str_8 = false; if (d_previous_Na[i_alm_satellite_slot_number] != gnav_utc_model.d_N_A)
flag_almanac_str_9 = false; {
new_alm = true; flag_almanac_str_8 = false;
flag_almanac_str_9 = false;
new_alm = true;
}
} }
if((flag_almanac_str_10 == true) and (flag_almanac_str_11 == true)) if((flag_almanac_str_10 == true) and (flag_almanac_str_11 == true))
{ {
flag_almanac_str_10 = false; if (d_previous_Na[i_alm_satellite_slot_number] != gnav_utc_model.d_N_A)
flag_almanac_str_11 = false; {
new_alm = true; flag_almanac_str_10 = false;
flag_almanac_str_11 = false;
new_alm = true;
}
} }
if((flag_almanac_str_12 == true) and (flag_almanac_str_13 == true)) if((flag_almanac_str_12 == true) and (flag_almanac_str_13 == true))
{ {
flag_almanac_str_12 = false; if (d_previous_Na[i_alm_satellite_slot_number] != gnav_utc_model.d_N_A)
flag_almanac_str_13 = false; {
new_alm = true; flag_almanac_str_12 = false;
flag_almanac_str_13 = false;
new_alm = true;
}
} }
if((flag_almanac_str_14 == true) and (flag_almanac_str_15 == true)) if((flag_almanac_str_14 == true) and (flag_almanac_str_15 == true))
{ {
flag_almanac_str_14 = false; if (d_previous_Na[i_alm_satellite_slot_number] != gnav_utc_model.d_N_A)
flag_almanac_str_15 = false; {
new_alm = true; flag_almanac_str_14 = false;
flag_almanac_str_15 = false;
new_alm = true;
}
} }
return new_alm; return new_alm;

View File

@ -67,9 +67,9 @@ public:
Glonass_Gnav_Ephemeris gnav_ephemeris; //!< Ephemeris information decoded Glonass_Gnav_Ephemeris gnav_ephemeris; //!< Ephemeris information decoded
Glonass_Gnav_Utc_Model gnav_utc_model; //!< UTC model information Glonass_Gnav_Utc_Model gnav_utc_model; //!< UTC model information
Glonass_Gnav_Almanac gnav_almanac[24]; //!< Almanac information for all 24 satellites Glonass_Gnav_Almanac gnav_almanac[GLONASS_L1_CA_NBR_SATS]; //!< Almanac information for all 24 satellites
//!< Ephmeris Flags //!< Ephmeris Flags and control variables
bool flag_all_ephemeris; //!< Flag indicating that all strings containing ephemeris have been received bool flag_all_ephemeris; //!< Flag indicating that all strings containing ephemeris have been received
bool flag_ephemeris_str_1; //!< Flag indicating that ephemeris 1/4 (string 1) have been received bool flag_ephemeris_str_1; //!< Flag indicating that ephemeris 1/4 (string 1) have been received
bool flag_ephemeris_str_2; //!< Flag indicating that ephemeris 2/4 (string 2) have been received bool flag_ephemeris_str_2; //!< Flag indicating that ephemeris 2/4 (string 2) have been received
@ -108,6 +108,10 @@ public:
double d_dtr; // Relativistic clock correction term double d_dtr; // Relativistic clock correction term
double d_satClkDrift; // Satellite clock drift double d_satClkDrift; // Satellite clock drift
// Data update parameters
double d_previous_tb;
double d_previous_Na[GLONASS_L1_CA_NBR_SATS];
bool CRC_test(std::bitset<GLONASS_GNAV_STRING_BITS> bits); bool CRC_test(std::bitset<GLONASS_GNAV_STRING_BITS> bits);
unsigned int get_frame_number(unsigned int satellite_slot_number); unsigned int get_frame_number(unsigned int satellite_slot_number);
@ -159,6 +163,8 @@ public:
*/ */
double get_TOW(); double get_TOW();
double get_WN();
/*! /*!
* \brief Computes the Coordinated Universal Time (UTC) and returns it in [s] * \brief Computes the Coordinated Universal Time (UTC) and returns it in [s]
*/ */