1
0
mirror of https://github.com/gnss-sdr/gnss-sdr synced 2024-12-13 11:40:33 +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 ############
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.sampling_frequency=6625000
;SignalSource.freq=0
@ -29,11 +29,11 @@ Channel.signal=1G
Channels.in_acquisition=1
Channels_1G.count=5
Channel0.satellite=11
Channel1.satellite=2
Channel2.satellite=18
Channel3.satellite=12
Channel4.satellite=21
Channel0.satellite=24 ; k=
Channel1.satellite=1 ; k=1
Channel2.satellite=2 ; k=-4
Channel3.satellite=20 ; k=-5
Channel4.satellite=21 ; k=4
;######### ACQUISITION GLOBAL CONFIG ############
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
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
<< " 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
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;
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;
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
{

View File

@ -598,7 +598,7 @@ void GNSSFlowgraph::set_signals_list()
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
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("") );

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_CHIP_PERIOD = 1.9569e-06; //!< GLONASS L1 C/A chip period [seconds]
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
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
{18,-3,}, //Plane 3
{19, 3,}, //Plane 3
{20, 2,}, //Plane 3
{20, -5,}, //Plane 3
{21, 4,}, //Plane 3
{22,-3,}, //Plane 3
{23, 3,}, //Plane 3

View File

@ -89,6 +89,11 @@ void Glonass_Gnav_Navigation_Message::reset()
d_dtr = 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
@ -314,23 +319,74 @@ unsigned int Glonass_Gnav_Navigation_Message::get_frame_number(unsigned int sate
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 TOD = 0.0;
double TOW = 0.0;
double dayofweek = 0.0;
double utcsu2utc = 3*3600;
double glot2utcsu = 3*3600;
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++)
{
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;
}
@ -342,13 +398,14 @@ int Glonass_Gnav_Navigation_Message::string_decoder(std::string frame_string)
d_frame_ID = 0;
// 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
flag_CRC_test = CRC_test(string_bits);
if(flag_CRC_test == false)
return 0;
// Decode all 15 string messages
d_string_ID = static_cast<unsigned int>(read_navigation_unsigned(string_bits, 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)
{
d_TOW = get_TOW();
gnav_ephemeris.d_TOW = d_TOW;
gnav_ephemeris.d_WN = get_WN();
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 new_eph = false;
// 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
(flag_ephemeris_str_3 == true) and (flag_ephemeris_str_4 == true) and
(flag_utc_model_str_5 == true))
{
flag_ephemeris_str_1 = false;// clear the flag
flag_ephemeris_str_2 = false;// clear the flag
flag_ephemeris_str_3 = false;// clear the flag
flag_ephemeris_str_4 = false;// clear the flag
flag_all_ephemeris = true;
DLOG(INFO) << "GLONASS GNAV Ephemeris (1, 2, 3, 4) have been received and belong to the same batch" << std::endl;
if(d_previous_tb != gnav_ephemeris.d_t_b)
{
flag_ephemeris_str_1 = false;// clear the flag
flag_ephemeris_str_2 = false;// clear the flag
flag_ephemeris_str_3 = false;// clear the flag
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;
if ((flag_almanac_str_6 == true) and (flag_almanac_str_7 == true))
{
//All almanac have been received for this satellite
flag_almanac_str_6 = false;
flag_almanac_str_7 = false;
new_alm = true;
if (d_previous_Na[i_alm_satellite_slot_number] != gnav_utc_model.d_N_A)
{
//All almanac have been received for this satellite
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))
{
flag_almanac_str_8 = false;
flag_almanac_str_9 = false;
new_alm = true;
if (d_previous_Na[i_alm_satellite_slot_number] != gnav_utc_model.d_N_A)
{
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))
{
flag_almanac_str_10 = false;
flag_almanac_str_11 = false;
new_alm = true;
if (d_previous_Na[i_alm_satellite_slot_number] != gnav_utc_model.d_N_A)
{
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))
{
flag_almanac_str_12 = false;
flag_almanac_str_13 = false;
new_alm = true;
if (d_previous_Na[i_alm_satellite_slot_number] != gnav_utc_model.d_N_A)
{
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))
{
flag_almanac_str_14 = false;
flag_almanac_str_15 = false;
new_alm = true;
if (d_previous_Na[i_alm_satellite_slot_number] != gnav_utc_model.d_N_A)
{
flag_almanac_str_14 = false;
flag_almanac_str_15 = false;
new_alm = true;
}
}
return new_alm;

View File

@ -67,9 +67,9 @@ public:
Glonass_Gnav_Ephemeris gnav_ephemeris; //!< Ephemeris information decoded
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_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
@ -108,6 +108,10 @@ public:
double d_dtr; // Relativistic clock correction term
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);
unsigned int get_frame_number(unsigned int satellite_slot_number);
@ -159,6 +163,8 @@ public:
*/
double get_TOW();
double get_WN();
/*!
* \brief Computes the Coordinated Universal Time (UTC) and returns it in [s]
*/