From 8885333aa78ba98f64bea8083dab0b0f66d0d51a Mon Sep 17 00:00:00 2001 From: Antonio Ramos Date: Tue, 13 Feb 2018 18:16:03 +0100 Subject: [PATCH 01/61] Modify sample counter --- .../libs/gnss_sdr_sample_counter.cc | 41 +- src/algorithms/libs/gnss_sdr_sample_counter.h | 14 +- .../adapters/hybrid_observables.cc | 4 +- .../gnuradio_blocks/hybrid_observables_cc.cc | 449 +++++++++--------- .../gnuradio_blocks/hybrid_observables_cc.h | 6 +- src/core/receiver/gnss_block_factory.cc | 10 +- src/core/receiver/gnss_flowgraph.cc | 25 +- src/core/system_parameters/GPS_L1_CA.h | 2 +- 8 files changed, 287 insertions(+), 264 deletions(-) diff --git a/src/algorithms/libs/gnss_sdr_sample_counter.cc b/src/algorithms/libs/gnss_sdr_sample_counter.cc index 026e08548..81101c59d 100644 --- a/src/algorithms/libs/gnss_sdr_sample_counter.cc +++ b/src/algorithms/libs/gnss_sdr_sample_counter.cc @@ -33,39 +33,38 @@ #include "gnss_synchro.h" #include -gnss_sdr_sample_counter::gnss_sdr_sample_counter () : gr::sync_block("sample_counter", - gr::io_signature::make(1, 1, sizeof(Gnss_Synchro)), - gr::io_signature::make(0,0,0)) +gnss_sdr_sample_counter::gnss_sdr_sample_counter (double _fs) : gr::sync_decimator("sample_counter", + gr::io_signature::make(1, 1, sizeof(gr_complex)), + gr::io_signature::make(1, 1, sizeof(Gnss_Synchro)), floor(_fs*0.001)) { this->message_port_register_out(pmt::mp("sample_counter")); - last_T_rx_s = 0; - report_interval_s = 1;//default reporting 1 second + current_T_rx_ms = 0; + report_interval_ms = 1000;//default reporting 1 second flag_enable_send_msg = false; //enable it for reporting time with asynchronous message } -gnss_sdr_sample_counter_sptr gnss_sdr_make_sample_counter () +gnss_sdr_sample_counter_sptr gnss_sdr_make_sample_counter (double _fs) { - gnss_sdr_sample_counter_sptr sample_counter_(new gnss_sdr_sample_counter()); + gnss_sdr_sample_counter_sptr sample_counter_(new gnss_sdr_sample_counter(_fs)); return sample_counter_; } -int gnss_sdr_sample_counter::work (int noutput_items, - gr_vector_const_void_star &input_items, - gr_vector_void_star &output_items __attribute__((unused))) +int gnss_sdr_sample_counter::work (int noutput_items __attribute__((unused)), + gr_vector_const_void_star &input_items __attribute__((unused)), + gr_vector_void_star &output_items) { - const Gnss_Synchro *in = reinterpret_cast(input_items[0]); // input - - double current_T_rx_s = in[noutput_items - 1].Tracking_sample_counter / static_cast(in[noutput_items - 1].fs); - if ((current_T_rx_s - last_T_rx_s) > report_interval_s) + Gnss_Synchro* out = reinterpret_cast(output_items[0]); + out[0] = Gnss_Synchro(); + if ((current_T_rx_ms % report_interval_ms) == 0) + { + std::cout << "Current receiver time: " << static_cast(current_T_rx_ms) / 1000.0 << " [s]" << std::endl; + if(flag_enable_send_msg == true) { - std::cout << "Current receiver time: " << floor(current_T_rx_s) << " [s]" << std::endl; - if(flag_enable_send_msg == true) - { - this->message_port_pub(pmt::mp("receiver_time"), pmt::from_double(current_T_rx_s)); - } - last_T_rx_s = current_T_rx_s; + this->message_port_pub(pmt::mp("receiver_time"), pmt::from_double(static_cast(current_T_rx_ms) / 1000.0)); } - return noutput_items; + } + current_T_rx_ms++; + return 1; } diff --git a/src/algorithms/libs/gnss_sdr_sample_counter.h b/src/algorithms/libs/gnss_sdr_sample_counter.h index ec1560ee8..d5c75920b 100644 --- a/src/algorithms/libs/gnss_sdr_sample_counter.h +++ b/src/algorithms/libs/gnss_sdr_sample_counter.h @@ -31,7 +31,7 @@ #ifndef GNSS_SDR_sample_counter_H_ #define GNSS_SDR_sample_counter_H_ -#include +#include #include @@ -39,14 +39,14 @@ class gnss_sdr_sample_counter; typedef boost::shared_ptr gnss_sdr_sample_counter_sptr; -gnss_sdr_sample_counter_sptr gnss_sdr_make_sample_counter (); +gnss_sdr_sample_counter_sptr gnss_sdr_make_sample_counter (double _fs); -class gnss_sdr_sample_counter : public gr::sync_block +class gnss_sdr_sample_counter : public gr::sync_decimator { - friend gnss_sdr_sample_counter_sptr gnss_sdr_make_sample_counter(); - gnss_sdr_sample_counter (); - double last_T_rx_s; - double report_interval_s; + friend gnss_sdr_sample_counter_sptr gnss_sdr_make_sample_counter(double _fs); + gnss_sdr_sample_counter (double _fs); + long long int current_T_rx_ms; + int report_interval_ms; bool flag_enable_send_msg; public: diff --git a/src/algorithms/observables/adapters/hybrid_observables.cc b/src/algorithms/observables/adapters/hybrid_observables.cc index a3a33d38a..7bf7d53a7 100644 --- a/src/algorithms/observables/adapters/hybrid_observables.cc +++ b/src/algorithms/observables/adapters/hybrid_observables.cc @@ -57,10 +57,10 @@ HybridObservables::HybridObservables(ConfigurationInterface* configuration, } else { - default_depth = 500; + default_depth = 100; } unsigned int history_deep = configuration->property(role + ".history_depth", default_depth); - observables_ = hybrid_make_observables_cc(in_streams_, dump_, dump_filename_, history_deep); + observables_ = hybrid_make_observables_cc(in_streams_, out_streams_, dump_, dump_filename_, history_deep); DLOG(INFO) << "pseudorange(" << observables_->unique_id() << ")"; } diff --git a/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc b/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc index 66cd0fce0..fc816d8b0 100644 --- a/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc +++ b/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc @@ -47,19 +47,19 @@ using google::LogMessage; -hybrid_observables_cc_sptr hybrid_make_observables_cc(unsigned int nchannels, bool dump, std::string dump_filename, unsigned int deep_history) +hybrid_observables_cc_sptr hybrid_make_observables_cc(unsigned int nchannels_in, unsigned int nchannels_out, bool dump, std::string dump_filename, unsigned int deep_history) { - return hybrid_observables_cc_sptr(new hybrid_observables_cc(nchannels, dump, dump_filename, deep_history)); + return hybrid_observables_cc_sptr(new hybrid_observables_cc(nchannels_in, nchannels_out, dump, dump_filename, deep_history)); } -hybrid_observables_cc::hybrid_observables_cc(unsigned int nchannels, bool dump, std::string dump_filename, unsigned int deep_history) : - gr::block("hybrid_observables_cc", gr::io_signature::make(nchannels, nchannels, sizeof(Gnss_Synchro)), - gr::io_signature::make(nchannels, nchannels, sizeof(Gnss_Synchro))) +hybrid_observables_cc::hybrid_observables_cc(unsigned int nchannels_in, unsigned int nchannels_out, bool dump, std::string dump_filename, unsigned int deep_history) : + gr::block("hybrid_observables_cc", gr::io_signature::make(nchannels_in, nchannels_in, sizeof(Gnss_Synchro)), + gr::io_signature::make(nchannels_out, nchannels_out, sizeof(Gnss_Synchro))) { // initialize internal vars d_dump = dump; - d_nchannels = nchannels; + d_nchannels = nchannels_out; d_dump_filename = dump_filename; history_deep = deep_history; T_rx_s = 0.0; @@ -328,21 +328,13 @@ bool Hybrid_valueCompare_gnss_synchro_d_TOW(const Gnss_Synchro& a, double b) void hybrid_observables_cc::forecast (int noutput_items __attribute__((unused)), gr_vector_int &ninput_items_required) { - bool zero_samples = true; for(unsigned int i = 0; i < d_nchannels; i++) - { - int items = detail()->input(i)->items_available(); - if (items > 0) zero_samples = false; - ninput_items_required[i] = items; // set the required available samples in each call - } - - if (zero_samples == true) - { - for(unsigned int i = 0; i < d_nchannels; i++) - { - ninput_items_required[i] = 1; // set the required available samples in each call - } - } + { + ninput_items_required[i] = 0; + //std::cout << "IN buffer "<< i << ". Number of items " << detail()->input(i)->items_available() << std::endl; + } + //std::cout << "SC buffer. Number of items " << detail()->input(d_nchannels)->items_available() << std::endl; + ninput_items_required[d_nchannels] = 1; // set the required available samples in each call } @@ -360,239 +352,252 @@ int hybrid_observables_cc::general_work (int noutput_items , Gnss_Synchro current_gnss_synchro[d_nchannels]; Gnss_Synchro aux = Gnss_Synchro(); for(unsigned int i = 0; i < d_nchannels; i++) - { - current_gnss_synchro[i] = aux; - } + { + current_gnss_synchro[i] = aux; + } /* * 1. Read the GNSS SYNCHRO objects from available channels. * Multi-rate GNURADIO Block. Read how many input items are avaliable in each channel * Record all synchronization data into queues */ for (unsigned int i = 0; i < d_nchannels; i++) + { + n_consume[i] = ninput_items[i]; // full throttle + for (int j = 0; j < n_consume[i]; j++) { - n_consume[i] = ninput_items[i]; // full throttle - for (int j = 0; j < n_consume[i]; j++) - { - d_gnss_synchro_history_queue[i].push_back(in[i][j]); - } + d_gnss_synchro_history_queue[i].push_back(in[i][j]); } + } bool channel_history_ok; do + { + channel_history_ok = true; + for (unsigned int i = 0; i < d_nchannels; i++) { - channel_history_ok = true; + if (d_gnss_synchro_history_queue[i].size() < history_deep && !d_gnss_synchro_history_queue[i].empty()) + { + channel_history_ok = false; + } + } + if (channel_history_ok == true) + { + std::map::const_iterator gnss_synchro_map_iter; + std::deque::const_iterator gnss_synchro_deque_iter; + + // 1. If the RX time is not set, set the Rx time + if (T_rx_s == 0) + { + // 0. Read a gnss_synchro snapshot from the queue and store it in a map + std::map gnss_synchro_map; + for (unsigned int i = 0; i < d_nchannels; i++) + { + if (!d_gnss_synchro_history_queue[i].empty()) + { + gnss_synchro_map.insert(std::pair(d_gnss_synchro_history_queue[i].front().Channel_ID, + d_gnss_synchro_history_queue[i].front())); + } + } + if (gnss_synchro_map.empty()) break; + + gnss_synchro_map_iter = min_element(gnss_synchro_map.cbegin(), + gnss_synchro_map.cend(), + Hybrid_pairCompare_gnss_synchro_sample_counter); + T_rx_s = static_cast(gnss_synchro_map_iter->second.Tracking_sample_counter) / static_cast(gnss_synchro_map_iter->second.fs); + T_rx_s = floor(T_rx_s * 1000.0) / 1000.0; // truncate to ms + T_rx_s += past_history_s; // increase T_rx to have a minimum past history to interpolate + } + + // 2. Realign RX time in all valid channels + std::map realigned_gnss_synchro_map; // container for the aligned set of observables for the selected T_rx + std::map adjacent_gnss_synchro_map; // container for the previous observable values to interpolate + // shift channels history to match the reference TOW for (unsigned int i = 0; i < d_nchannels; i++) + { + if (!d_gnss_synchro_history_queue[i].empty()) { - if (d_gnss_synchro_history_queue[i].size() < history_deep) + gnss_synchro_deque_iter = std::lower_bound(d_gnss_synchro_history_queue[i].cbegin(), + d_gnss_synchro_history_queue[i].cend(), + T_rx_s, + Hybrid_valueCompare_gnss_synchro_receiver_time); + if (gnss_synchro_deque_iter != d_gnss_synchro_history_queue[i].cend()) + { + if (gnss_synchro_deque_iter->Flag_valid_word == true) { - channel_history_ok = false; - } - } - if (channel_history_ok == true) - { - std::map::const_iterator gnss_synchro_map_iter; - std::deque::const_iterator gnss_synchro_deque_iter; + double T_rx_channel = static_cast(gnss_synchro_deque_iter->Tracking_sample_counter) / static_cast(gnss_synchro_deque_iter->fs); + double delta_T_rx_s = T_rx_channel - T_rx_s; - // 1. If the RX time is not set, set the Rx time - if (T_rx_s == 0) - { - // 0. Read a gnss_synchro snapshot from the queue and store it in a map - std::map gnss_synchro_map; - for (unsigned int i = 0; i < d_nchannels; i++) + // check that T_rx difference is less than a threshold (the correlation interval) + if (delta_T_rx_s * 1000.0 < static_cast(gnss_synchro_deque_iter->correlation_length_ms)) + { + // record the word structure in a map for pseudorange computation + // save the previous observable + int distance = std::distance(d_gnss_synchro_history_queue[i].cbegin(), gnss_synchro_deque_iter); + if (distance > 0) { - gnss_synchro_map.insert(std::pair(d_gnss_synchro_history_queue[i].front().Channel_ID, - d_gnss_synchro_history_queue[i].front())); - } - gnss_synchro_map_iter = min_element(gnss_synchro_map.cbegin(), - gnss_synchro_map.cend(), - Hybrid_pairCompare_gnss_synchro_sample_counter); - T_rx_s = static_cast(gnss_synchro_map_iter->second.Tracking_sample_counter) / static_cast(gnss_synchro_map_iter->second.fs); - T_rx_s = floor(T_rx_s * 1000.0) / 1000.0; // truncate to ms - T_rx_s += past_history_s; // increase T_rx to have a minimum past history to interpolate - } - - // 2. Realign RX time in all valid channels - std::map realigned_gnss_synchro_map; // container for the aligned set of observables for the selected T_rx - std::map adjacent_gnss_synchro_map; // container for the previous observable values to interpolate - // shift channels history to match the reference TOW - for (unsigned int i = 0; i < d_nchannels; i++) - { - gnss_synchro_deque_iter = std::lower_bound(d_gnss_synchro_history_queue[i].cbegin(), - d_gnss_synchro_history_queue[i].cend(), - T_rx_s, - Hybrid_valueCompare_gnss_synchro_receiver_time); - if (gnss_synchro_deque_iter != d_gnss_synchro_history_queue[i].cend()) - { - if (gnss_synchro_deque_iter->Flag_valid_word == true) + if (d_gnss_synchro_history_queue[i].at(distance - 1).Flag_valid_word) + { + double T_rx_channel_prev = static_cast(d_gnss_synchro_history_queue[i].at(distance - 1).Tracking_sample_counter) / static_cast(gnss_synchro_deque_iter->fs); + double delta_T_rx_s_prev = T_rx_channel_prev - T_rx_s; + if (fabs(delta_T_rx_s_prev) < fabs(delta_T_rx_s)) { - double T_rx_channel = static_cast(gnss_synchro_deque_iter->Tracking_sample_counter) / static_cast(gnss_synchro_deque_iter->fs); - double delta_T_rx_s = T_rx_channel - T_rx_s; - - // check that T_rx difference is less than a threshold (the correlation interval) - if (delta_T_rx_s * 1000.0 < static_cast(gnss_synchro_deque_iter->correlation_length_ms)) - { - // record the word structure in a map for pseudorange computation - // save the previous observable - int distance = std::distance(d_gnss_synchro_history_queue[i].cbegin(), gnss_synchro_deque_iter); - if (distance > 0) - { - if (d_gnss_synchro_history_queue[i].at(distance - 1).Flag_valid_word) - { - double T_rx_channel_prev = static_cast(d_gnss_synchro_history_queue[i].at(distance - 1).Tracking_sample_counter) / static_cast(gnss_synchro_deque_iter->fs); - double delta_T_rx_s_prev = T_rx_channel_prev - T_rx_s; - if (fabs(delta_T_rx_s_prev) < fabs(delta_T_rx_s)) - { - realigned_gnss_synchro_map.insert(std::pair(d_gnss_synchro_history_queue[i].at(distance - 1).Channel_ID, - d_gnss_synchro_history_queue[i].at(distance - 1))); - adjacent_gnss_synchro_map.insert(std::pair(gnss_synchro_deque_iter->Channel_ID, *gnss_synchro_deque_iter)); - } - else - { - realigned_gnss_synchro_map.insert(std::pair(gnss_synchro_deque_iter->Channel_ID, *gnss_synchro_deque_iter)); - adjacent_gnss_synchro_map.insert(std::pair(d_gnss_synchro_history_queue[i].at(distance - 1).Channel_ID, - d_gnss_synchro_history_queue[i].at(distance - 1))); - } - } - - } - else - { - realigned_gnss_synchro_map.insert(std::pair(gnss_synchro_deque_iter->Channel_ID, *gnss_synchro_deque_iter)); - } - - } + realigned_gnss_synchro_map.insert(std::pair(d_gnss_synchro_history_queue[i].at(distance - 1).Channel_ID, + d_gnss_synchro_history_queue[i].at(distance - 1))); + adjacent_gnss_synchro_map.insert(std::pair(gnss_synchro_deque_iter->Channel_ID, *gnss_synchro_deque_iter)); + } + else + { + realigned_gnss_synchro_map.insert(std::pair(gnss_synchro_deque_iter->Channel_ID, *gnss_synchro_deque_iter)); + adjacent_gnss_synchro_map.insert(std::pair(d_gnss_synchro_history_queue[i].at(distance - 1).Channel_ID, + d_gnss_synchro_history_queue[i].at(distance - 1))); } - } - } - - if(!realigned_gnss_synchro_map.empty()) - { - /* - * 2.1 Use CURRENT set of measurements and find the nearest satellite - * common RX time algorithm - */ - // what is the most recent symbol TOW in the current set? -> this will be the reference symbol - gnss_synchro_map_iter = max_element(realigned_gnss_synchro_map.cbegin(), - realigned_gnss_synchro_map.cend(), - Hybrid_pairCompare_gnss_synchro_d_TOW); - double ref_fs_hz = static_cast(gnss_synchro_map_iter->second.fs); - - // compute interpolated TOW value at T_rx_s - int ref_channel_key = gnss_synchro_map_iter->second.Channel_ID; - Gnss_Synchro adj_obs; - adj_obs = adjacent_gnss_synchro_map.at(ref_channel_key); - double ref_adj_T_rx_s = static_cast(adj_obs.Tracking_sample_counter) / ref_fs_hz + adj_obs.Code_phase_samples / ref_fs_hz; - - double d_TOW_reference = gnss_synchro_map_iter->second.TOW_at_current_symbol_s; - double d_ref_T_rx_s = static_cast(gnss_synchro_map_iter->second.Tracking_sample_counter) / ref_fs_hz + gnss_synchro_map_iter->second.Code_phase_samples / ref_fs_hz; - - double selected_T_rx_s = T_rx_s; - // two points linear interpolation using adjacent (adj) values: y=y1+(x-x1)*(y2-y1)/(x2-x1) - double ref_TOW_at_T_rx_s = adj_obs.TOW_at_current_symbol_s + - (selected_T_rx_s - ref_adj_T_rx_s) * (d_TOW_reference - adj_obs.TOW_at_current_symbol_s) / (d_ref_T_rx_s - ref_adj_T_rx_s); - - // Now compute RX time differences due to the PRN alignment in the correlators - double traveltime_ms; - double pseudorange_m; - double channel_T_rx_s; - double channel_fs_hz; - double channel_TOW_s; - for(gnss_synchro_map_iter = realigned_gnss_synchro_map.cbegin(); gnss_synchro_map_iter != realigned_gnss_synchro_map.cend(); gnss_synchro_map_iter++) - { - channel_fs_hz = static_cast(gnss_synchro_map_iter->second.fs); - channel_TOW_s = gnss_synchro_map_iter->second.TOW_at_current_symbol_s; - channel_T_rx_s = static_cast(gnss_synchro_map_iter->second.Tracking_sample_counter) / channel_fs_hz + gnss_synchro_map_iter->second.Code_phase_samples / channel_fs_hz; - // compute interpolated observation values - // two points linear interpolation using adjacent (adj) values: y=y1+(x-x1)*(y2-y1)/(x2-x1) - // TOW at the selected receiver time T_rx_s - int element_key = gnss_synchro_map_iter->second.Channel_ID; - try{ - adj_obs = adjacent_gnss_synchro_map.at(element_key); - }catch(const std::exception & ex) - { - continue; } - double adj_T_rx_s = static_cast(adj_obs.Tracking_sample_counter) / channel_fs_hz + adj_obs.Code_phase_samples / channel_fs_hz; - - double channel_TOW_at_T_rx_s = adj_obs.TOW_at_current_symbol_s + (selected_T_rx_s - adj_T_rx_s) * (channel_TOW_s - adj_obs.TOW_at_current_symbol_s) / (channel_T_rx_s - adj_T_rx_s); - - // Doppler and Accumulated carrier phase - double Carrier_phase_lin_rads = adj_obs.Carrier_phase_rads + (selected_T_rx_s - adj_T_rx_s) * (gnss_synchro_map_iter->second.Carrier_phase_rads - adj_obs.Carrier_phase_rads) / (channel_T_rx_s - adj_T_rx_s); - double Carrier_Doppler_lin_hz = adj_obs.Carrier_Doppler_hz + (selected_T_rx_s - adj_T_rx_s) * (gnss_synchro_map_iter->second.Carrier_Doppler_hz - adj_obs.Carrier_Doppler_hz) / (channel_T_rx_s - adj_T_rx_s); - - // compute the pseudorange (no rx time offset correction) - traveltime_ms = (ref_TOW_at_T_rx_s - channel_TOW_at_T_rx_s) * 1000.0 + GPS_STARTOFFSET_ms; - // convert to meters - pseudorange_m = traveltime_ms * GPS_C_m_ms; // [m] - // update the pseudorange object - current_gnss_synchro[gnss_synchro_map_iter->second.Channel_ID] = gnss_synchro_map_iter->second; - current_gnss_synchro[gnss_synchro_map_iter->second.Channel_ID].Pseudorange_m = pseudorange_m; - current_gnss_synchro[gnss_synchro_map_iter->second.Channel_ID].Flag_valid_pseudorange = true; - // Save the estimated RX time (no RX clock offset correction yet!) - current_gnss_synchro[gnss_synchro_map_iter->second.Channel_ID].RX_time = ref_TOW_at_T_rx_s + GPS_STARTOFFSET_ms / 1000.0; - - current_gnss_synchro[gnss_synchro_map_iter->second.Channel_ID].Carrier_phase_rads = Carrier_phase_lin_rads; - current_gnss_synchro[gnss_synchro_map_iter->second.Channel_ID].Carrier_Doppler_hz = Carrier_Doppler_lin_hz; } - - if(d_dump == true) + else { - // MULTIPLEXED FILE RECORDING - Record results to file - try - { - double tmp_double; - for (unsigned int i = 0; i < d_nchannels; i++) - { - tmp_double = current_gnss_synchro[i].RX_time; - d_dump_file.write(reinterpret_cast(&tmp_double), sizeof(double)); - tmp_double = current_gnss_synchro[i].TOW_at_current_symbol_s; - d_dump_file.write(reinterpret_cast(&tmp_double), sizeof(double)); - tmp_double = current_gnss_synchro[i].Carrier_Doppler_hz; - d_dump_file.write(reinterpret_cast(&tmp_double), sizeof(double)); - tmp_double = current_gnss_synchro[i].Carrier_phase_rads / GPS_TWO_PI; - d_dump_file.write(reinterpret_cast(&tmp_double), sizeof(double)); - tmp_double = current_gnss_synchro[i].Pseudorange_m; - d_dump_file.write(reinterpret_cast(&tmp_double), sizeof(double)); - tmp_double = current_gnss_synchro[i].PRN; - d_dump_file.write(reinterpret_cast(&tmp_double), sizeof(double)); - tmp_double = static_cast(current_gnss_synchro[i].Flag_valid_pseudorange); - d_dump_file.write(reinterpret_cast(&tmp_double), sizeof(double)); - } - } - catch (const std::ifstream::failure& e) - { - LOG(WARNING) << "Exception writing observables dump file " << e.what(); - } + realigned_gnss_synchro_map.insert(std::pair(gnss_synchro_deque_iter->Channel_ID, *gnss_synchro_deque_iter)); } - for (unsigned int i = 0; i < d_nchannels; i++) - { - out[i][n_outputs] = current_gnss_synchro[i]; - } - - n_outputs++; - } - - // Move RX time - T_rx_s = T_rx_s + T_rx_step_s; - // pop old elements from queue - for (unsigned int i = 0; i < d_nchannels; i++) - { - while (static_cast(d_gnss_synchro_history_queue[i].front().Tracking_sample_counter) / static_cast(d_gnss_synchro_history_queue[i].front().fs) < (T_rx_s - past_history_s)) - { - d_gnss_synchro_history_queue[i].pop_front(); - } + } } + } } - } while(channel_history_ok == true && noutput_items > n_outputs); + } + + if(!realigned_gnss_synchro_map.empty()) + { + /* + * 2.1 Use CURRENT set of measurements and find the nearest satellite + * common RX time algorithm + */ + // what is the most recent symbol TOW in the current set? -> this will be the reference symbol + gnss_synchro_map_iter = max_element(realigned_gnss_synchro_map.cbegin(), + realigned_gnss_synchro_map.cend(), + Hybrid_pairCompare_gnss_synchro_d_TOW); + double ref_fs_hz = static_cast(gnss_synchro_map_iter->second.fs); + + // compute interpolated TOW value at T_rx_s + int ref_channel_key = gnss_synchro_map_iter->second.Channel_ID; + Gnss_Synchro adj_obs; + adj_obs = adjacent_gnss_synchro_map.at(ref_channel_key); + double ref_adj_T_rx_s = static_cast(adj_obs.Tracking_sample_counter) / ref_fs_hz + adj_obs.Code_phase_samples / ref_fs_hz; + + double d_TOW_reference = gnss_synchro_map_iter->second.TOW_at_current_symbol_s; + double d_ref_T_rx_s = static_cast(gnss_synchro_map_iter->second.Tracking_sample_counter) / ref_fs_hz + gnss_synchro_map_iter->second.Code_phase_samples / ref_fs_hz; + + double selected_T_rx_s = T_rx_s; + // two points linear interpolation using adjacent (adj) values: y=y1+(x-x1)*(y2-y1)/(x2-x1) + double ref_TOW_at_T_rx_s = adj_obs.TOW_at_current_symbol_s + + (selected_T_rx_s - ref_adj_T_rx_s) * (d_TOW_reference - adj_obs.TOW_at_current_symbol_s) / (d_ref_T_rx_s - ref_adj_T_rx_s); + + // Now compute RX time differences due to the PRN alignment in the correlators + double traveltime_ms; + double pseudorange_m; + double channel_T_rx_s; + double channel_fs_hz; + double channel_TOW_s; + for(gnss_synchro_map_iter = realigned_gnss_synchro_map.cbegin(); gnss_synchro_map_iter != realigned_gnss_synchro_map.cend(); gnss_synchro_map_iter++) + { + channel_fs_hz = static_cast(gnss_synchro_map_iter->second.fs); + channel_TOW_s = gnss_synchro_map_iter->second.TOW_at_current_symbol_s; + channel_T_rx_s = static_cast(gnss_synchro_map_iter->second.Tracking_sample_counter) / channel_fs_hz + gnss_synchro_map_iter->second.Code_phase_samples / channel_fs_hz; + // compute interpolated observation values + // two points linear interpolation using adjacent (adj) values: y=y1+(x-x1)*(y2-y1)/(x2-x1) + // TOW at the selected receiver time T_rx_s + int element_key = gnss_synchro_map_iter->second.Channel_ID; + try{ + adj_obs = adjacent_gnss_synchro_map.at(element_key); + }catch(const std::exception & ex) + { + continue; + } + + double adj_T_rx_s = static_cast(adj_obs.Tracking_sample_counter) / channel_fs_hz + adj_obs.Code_phase_samples / channel_fs_hz; + + double channel_TOW_at_T_rx_s = adj_obs.TOW_at_current_symbol_s + (selected_T_rx_s - adj_T_rx_s) * (channel_TOW_s - adj_obs.TOW_at_current_symbol_s) / (channel_T_rx_s - adj_T_rx_s); + + // Doppler and Accumulated carrier phase + double Carrier_phase_lin_rads = adj_obs.Carrier_phase_rads + (selected_T_rx_s - adj_T_rx_s) * (gnss_synchro_map_iter->second.Carrier_phase_rads - adj_obs.Carrier_phase_rads) / (channel_T_rx_s - adj_T_rx_s); + double Carrier_Doppler_lin_hz = adj_obs.Carrier_Doppler_hz + (selected_T_rx_s - adj_T_rx_s) * (gnss_synchro_map_iter->second.Carrier_Doppler_hz - adj_obs.Carrier_Doppler_hz) / (channel_T_rx_s - adj_T_rx_s); + + // compute the pseudorange (no rx time offset correction) + traveltime_ms = (ref_TOW_at_T_rx_s - channel_TOW_at_T_rx_s) * 1000.0 + GPS_STARTOFFSET_ms; + // convert to meters + pseudorange_m = traveltime_ms * GPS_C_m_ms; // [m] + // update the pseudorange object + current_gnss_synchro[gnss_synchro_map_iter->second.Channel_ID] = gnss_synchro_map_iter->second; + current_gnss_synchro[gnss_synchro_map_iter->second.Channel_ID].Pseudorange_m = pseudorange_m; + current_gnss_synchro[gnss_synchro_map_iter->second.Channel_ID].Flag_valid_pseudorange = true; + // Save the estimated RX time (no RX clock offset correction yet!) + current_gnss_synchro[gnss_synchro_map_iter->second.Channel_ID].RX_time = ref_TOW_at_T_rx_s + GPS_STARTOFFSET_ms / 1000.0; + + current_gnss_synchro[gnss_synchro_map_iter->second.Channel_ID].Carrier_phase_rads = Carrier_phase_lin_rads; + current_gnss_synchro[gnss_synchro_map_iter->second.Channel_ID].Carrier_Doppler_hz = Carrier_Doppler_lin_hz; + } + + if(d_dump == true) + { + // MULTIPLEXED FILE RECORDING - Record results to file + try + { + double tmp_double; + for (unsigned int i = 0; i < d_nchannels; i++) + { + tmp_double = current_gnss_synchro[i].RX_time; + d_dump_file.write(reinterpret_cast(&tmp_double), sizeof(double)); + tmp_double = current_gnss_synchro[i].TOW_at_current_symbol_s; + d_dump_file.write(reinterpret_cast(&tmp_double), sizeof(double)); + tmp_double = current_gnss_synchro[i].Carrier_Doppler_hz; + d_dump_file.write(reinterpret_cast(&tmp_double), sizeof(double)); + tmp_double = current_gnss_synchro[i].Carrier_phase_rads / GPS_TWO_PI; + d_dump_file.write(reinterpret_cast(&tmp_double), sizeof(double)); + tmp_double = current_gnss_synchro[i].Pseudorange_m; + d_dump_file.write(reinterpret_cast(&tmp_double), sizeof(double)); + tmp_double = current_gnss_synchro[i].PRN; + d_dump_file.write(reinterpret_cast(&tmp_double), sizeof(double)); + tmp_double = static_cast(current_gnss_synchro[i].Flag_valid_pseudorange); + d_dump_file.write(reinterpret_cast(&tmp_double), sizeof(double)); + } + } + catch (const std::ifstream::failure& e) + { + LOG(WARNING) << "Exception writing observables dump file " << e.what(); + } + } + + for (unsigned int i = 0; i < d_nchannels; i++) + { + out[i][n_outputs] = current_gnss_synchro[i]; + } + + n_outputs++; + } + + // Move RX time + T_rx_s = T_rx_s + T_rx_step_s; + // pop old elements from queue + for (unsigned int i = 0; i < d_nchannels; i++) + { + if (!d_gnss_synchro_history_queue[i].empty()) + { + while (static_cast(d_gnss_synchro_history_queue[i].front().Tracking_sample_counter) / static_cast(d_gnss_synchro_history_queue[i].front().fs) < (T_rx_s - past_history_s)) + { + d_gnss_synchro_history_queue[i].pop_front(); + } + } + } + } + } while(channel_history_ok == true && noutput_items > n_outputs); // Multi-rate consume! for (unsigned int i = 0; i < d_nchannels; i++) - { - consume(i, n_consume[i]); // which input, how many items - } + { + consume(i, n_consume[i]); // which input, how many items + } + //consume monitor channel always + consume(d_nchannels, 1); return n_outputs; } diff --git a/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.h b/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.h index 494f84e75..f1a1c3da2 100644 --- a/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.h +++ b/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.h @@ -44,7 +44,7 @@ class hybrid_observables_cc; typedef boost::shared_ptr hybrid_observables_cc_sptr; hybrid_observables_cc_sptr -hybrid_make_observables_cc(unsigned int n_channels, bool dump, std::string dump_filename, unsigned int deep_history); +hybrid_make_observables_cc(unsigned int nchannels_in, unsigned int nchannels_out, bool dump, std::string dump_filename, unsigned int deep_history); /*! * \brief This class implements a block that computes Galileo observables @@ -58,8 +58,8 @@ public: void forecast (int noutput_items, gr_vector_int &ninput_items_required); private: friend hybrid_observables_cc_sptr - hybrid_make_observables_cc(unsigned int nchannels, bool dump, std::string dump_filename, unsigned int deep_history); - hybrid_observables_cc(unsigned int nchannels, bool dump, std::string dump_filename, unsigned int deep_history); + hybrid_make_observables_cc(unsigned int nchannels_in, unsigned int nchannels_out, bool dump, std::string dump_filename, unsigned int deep_history); + hybrid_observables_cc(unsigned int nchannels_in, unsigned int nchannels_out, bool dump, std::string dump_filename, unsigned int deep_history); //Tracking observable history std::vector> d_gnss_synchro_history_queue; diff --git a/src/core/receiver/gnss_block_factory.cc b/src/core/receiver/gnss_block_factory.cc index 02aeffeb0..cf1ba3995 100644 --- a/src/core/receiver/gnss_block_factory.cc +++ b/src/core/receiver/gnss_block_factory.cc @@ -248,7 +248,15 @@ std::unique_ptr GNSSBlockFactory::GetObservables(std::shared GPS_channels += configuration->property("Channels_2S.count", 0); GPS_channels += configuration->property("Channels_L5.count", 0); unsigned int Glonass_channels = configuration->property("Channels_1G.count", 0); - return GetBlock(configuration, "Observables", implementation, Galileo_channels + GPS_channels + Glonass_channels, Galileo_channels + GPS_channels + Glonass_channels); + unsigned int extra_channels = 1; // For monitor channel sample counter + return GetBlock(configuration, "Observables", implementation, + Galileo_channels + + GPS_channels + + Glonass_channels + + extra_channels, + Galileo_channels + + GPS_channels + + Glonass_channels); } diff --git a/src/core/receiver/gnss_flowgraph.cc b/src/core/receiver/gnss_flowgraph.cc index 1b4438cea..e8c9798bf 100644 --- a/src/core/receiver/gnss_flowgraph.cc +++ b/src/core/receiver/gnss_flowgraph.cc @@ -248,6 +248,24 @@ void GNSSFlowgraph::connect() } DLOG(INFO) << "Signal source connected to signal conditioner"; + //connect the signal source to sample counter + //connect the sample counter to Observables + try + { + double fs = static_cast(configuration_->property("GNSS-SDR.internal_fs_sps", 0)); + ch_out_sample_counter = gnss_sdr_make_sample_counter(fs); + top_block_->connect(sig_conditioner_.at(0)->get_right_block(), 0, ch_out_sample_counter, 0); + top_block_->connect(ch_out_sample_counter, 0, observables_->get_left_block(), channels_count_); //extra port for the sample counter pulse + } + catch (const std::exception & e) + { + LOG(WARNING) << "Can't connect sample counter"; + LOG(ERROR) << e.what(); + top_block_->disconnect_all(); + return; + } + + // Signal conditioner (selected_signal_source) >> channels (i) (dependent of their associated SignalSource_ID) int selected_signal_conditioner_ID; for (unsigned int i = 0; i < channels_count_; i++) @@ -296,13 +314,6 @@ void GNSSFlowgraph::connect() { LOG(INFO) << "Channel " << i << " connected to observables in standby mode"; } - //connect the sample counter to the channel 0 - if (i == 0) - { - ch_out_sample_counter = gnss_sdr_make_sample_counter(); - top_block_->connect(channels_.at(i)->get_right_block(), 0, ch_out_sample_counter, 0); - - } } /* diff --git a/src/core/system_parameters/GPS_L1_CA.h b/src/core/system_parameters/GPS_L1_CA.h index a2976fe46..3944e3bc8 100644 --- a/src/core/system_parameters/GPS_L1_CA.h +++ b/src/core/system_parameters/GPS_L1_CA.h @@ -74,7 +74,7 @@ const double GPS_STARTOFFSET_ms = 68.802; //[ms] Initial sign. travel time (this // OBSERVABLE HISTORY DEEP FOR INTERPOLATION -const int GPS_L1_CA_HISTORY_DEEP = 500; +const int GPS_L1_CA_HISTORY_DEEP = 100; // NAVIGATION MESSAGE DEMODULATION AND DECODING From 28cc4a1a050872d0e799130a66baf35a5d56ed47 Mon Sep 17 00:00:00 2001 From: Antonio Ramos Date: Wed, 14 Feb 2018 11:56:22 +0100 Subject: [PATCH 02/61] Add try-catch block to hybrid observables --- .../libs/gnss_sdr_sample_counter.cc | 11 +-- src/algorithms/libs/gnss_sdr_sample_counter.h | 15 ++-- .../adapters/hybrid_observables.cc | 19 +---- .../gnuradio_blocks/hybrid_observables_cc.cc | 80 +++++++++++-------- 4 files changed, 66 insertions(+), 59 deletions(-) diff --git a/src/algorithms/libs/gnss_sdr_sample_counter.cc b/src/algorithms/libs/gnss_sdr_sample_counter.cc index 81101c59d..e568da7d6 100644 --- a/src/algorithms/libs/gnss_sdr_sample_counter.cc +++ b/src/algorithms/libs/gnss_sdr_sample_counter.cc @@ -33,9 +33,10 @@ #include "gnss_synchro.h" #include -gnss_sdr_sample_counter::gnss_sdr_sample_counter (double _fs) : gr::sync_decimator("sample_counter", +gnss_sdr_sample_counter::gnss_sdr_sample_counter(double _fs) : gr::sync_decimator("sample_counter", gr::io_signature::make(1, 1, sizeof(gr_complex)), - gr::io_signature::make(1, 1, sizeof(Gnss_Synchro)), floor(_fs*0.001)) + gr::io_signature::make(1, 1, sizeof(Gnss_Synchro)), + static_cast(floor(_fs * 0.001))) { this->message_port_register_out(pmt::mp("sample_counter")); current_T_rx_ms = 0; @@ -44,14 +45,14 @@ gnss_sdr_sample_counter::gnss_sdr_sample_counter (double _fs) : gr::sync_decimat } -gnss_sdr_sample_counter_sptr gnss_sdr_make_sample_counter (double _fs) +gnss_sdr_sample_counter_sptr gnss_sdr_make_sample_counter(double _fs) { gnss_sdr_sample_counter_sptr sample_counter_(new gnss_sdr_sample_counter(_fs)); return sample_counter_; } -int gnss_sdr_sample_counter::work (int noutput_items __attribute__((unused)), +int gnss_sdr_sample_counter::work(int noutput_items __attribute__((unused)), gr_vector_const_void_star &input_items __attribute__((unused)), gr_vector_void_star &output_items) { @@ -60,7 +61,7 @@ int gnss_sdr_sample_counter::work (int noutput_items __attribute__((unused)), if ((current_T_rx_ms % report_interval_ms) == 0) { std::cout << "Current receiver time: " << static_cast(current_T_rx_ms) / 1000.0 << " [s]" << std::endl; - if(flag_enable_send_msg == true) + if(flag_enable_send_msg) { this->message_port_pub(pmt::mp("receiver_time"), pmt::from_double(static_cast(current_T_rx_ms) / 1000.0)); } diff --git a/src/algorithms/libs/gnss_sdr_sample_counter.h b/src/algorithms/libs/gnss_sdr_sample_counter.h index d5c75920b..b3263e5b7 100644 --- a/src/algorithms/libs/gnss_sdr_sample_counter.h +++ b/src/algorithms/libs/gnss_sdr_sample_counter.h @@ -28,8 +28,8 @@ * * ------------------------------------------------------------------------- */ -#ifndef GNSS_SDR_sample_counter_H_ -#define GNSS_SDR_sample_counter_H_ +#ifndef GNSS_SDR_SAMPLE_COUNTER_H_ +#define GNSS_SDR_SAMPLE_COUNTER_H_ #include #include @@ -39,20 +39,23 @@ class gnss_sdr_sample_counter; typedef boost::shared_ptr gnss_sdr_sample_counter_sptr; -gnss_sdr_sample_counter_sptr gnss_sdr_make_sample_counter (double _fs); +gnss_sdr_sample_counter_sptr gnss_sdr_make_sample_counter(double _fs); class gnss_sdr_sample_counter : public gr::sync_decimator { - friend gnss_sdr_sample_counter_sptr gnss_sdr_make_sample_counter(double _fs); - gnss_sdr_sample_counter (double _fs); +private: + + gnss_sdr_sample_counter(double _fs); long long int current_T_rx_ms; int report_interval_ms; bool flag_enable_send_msg; public: + + friend gnss_sdr_sample_counter_sptr gnss_sdr_make_sample_counter(double _fs); int work(int noutput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items); }; -#endif /*GNSS_SDR_sample_counter_H_*/ +#endif /*GNSS_SDR_SAMPLE_COUNTER_H_*/ diff --git a/src/algorithms/observables/adapters/hybrid_observables.cc b/src/algorithms/observables/adapters/hybrid_observables.cc index 7bf7d53a7..15f7bfc2a 100644 --- a/src/algorithms/observables/adapters/hybrid_observables.cc +++ b/src/algorithms/observables/adapters/hybrid_observables.cc @@ -39,12 +39,8 @@ using google::LogMessage; HybridObservables::HybridObservables(ConfigurationInterface* configuration, - std::string role, - unsigned int in_streams, - unsigned int out_streams) : - role_(role), - in_streams_(in_streams), - out_streams_(out_streams) + std::string role, unsigned int in_streams, unsigned int out_streams) : + role_(role), in_streams_(in_streams), out_streams_(out_streams) { std::string default_dump_filename = "./observables.dat"; DLOG(INFO) << "role " << role; @@ -61,18 +57,14 @@ HybridObservables::HybridObservables(ConfigurationInterface* configuration, } unsigned int history_deep = configuration->property(role + ".history_depth", default_depth); observables_ = hybrid_make_observables_cc(in_streams_, out_streams_, dump_, dump_filename_, history_deep); - DLOG(INFO) << "pseudorange(" << observables_->unique_id() << ")"; + DLOG(INFO) << "Observables block ID (" << observables_->unique_id() << ")"; } - - HybridObservables::~HybridObservables() {} - - void HybridObservables::connect(gr::top_block_sptr top_block) { if(top_block) { /* top_block is not null */}; @@ -81,7 +73,6 @@ void HybridObservables::connect(gr::top_block_sptr top_block) } - void HybridObservables::disconnect(gr::top_block_sptr top_block) { if(top_block) { /* top_block is not null */}; @@ -89,16 +80,12 @@ void HybridObservables::disconnect(gr::top_block_sptr top_block) } - - gr::basic_block_sptr HybridObservables::get_left_block() { return observables_; } - - gr::basic_block_sptr HybridObservables::get_right_block() { return observables_; diff --git a/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc b/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc index fc816d8b0..ce11b6a1d 100644 --- a/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc +++ b/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc @@ -326,7 +326,7 @@ bool Hybrid_valueCompare_gnss_synchro_d_TOW(const Gnss_Synchro& a, double b) } -void hybrid_observables_cc::forecast (int noutput_items __attribute__((unused)), gr_vector_int &ninput_items_required) +void hybrid_observables_cc::forecast(int noutput_items __attribute__((unused)), gr_vector_int &ninput_items_required) { for(unsigned int i = 0; i < d_nchannels; i++) { @@ -338,13 +338,11 @@ void hybrid_observables_cc::forecast (int noutput_items __attribute__((unused)), } -int hybrid_observables_cc::general_work (int noutput_items , - gr_vector_int &ninput_items, - gr_vector_const_void_star &input_items, - gr_vector_void_star &output_items) +int hybrid_observables_cc::general_work(int noutput_items, gr_vector_int &ninput_items, + gr_vector_const_void_star &input_items, gr_vector_void_star &output_items) { - const Gnss_Synchro **in = reinterpret_cast(&input_items[0]); // Get the input buffer pointer - Gnss_Synchro **out = reinterpret_cast(&output_items[0]); // Get the output buffer pointer + const Gnss_Synchro** in = reinterpret_cast(&input_items[0]); // Get the input buffer pointer + Gnss_Synchro** out = reinterpret_cast(&output_items[0]); // Get the output buffer pointer int n_outputs = 0; int n_consume[d_nchannels]; double past_history_s = 100e-3; @@ -363,19 +361,24 @@ int hybrid_observables_cc::general_work (int noutput_items , for (unsigned int i = 0; i < d_nchannels; i++) { n_consume[i] = ninput_items[i]; // full throttle - for (int j = 0; j < n_consume[i]; j++) + for(int j = 0; j < n_consume[i]; j++) { d_gnss_synchro_history_queue[i].push_back(in[i][j]); } } bool channel_history_ok; + do { + + try + { + channel_history_ok = true; - for (unsigned int i = 0; i < d_nchannels; i++) + for(unsigned int i = 0; i < d_nchannels; i++) { - if (d_gnss_synchro_history_queue[i].size() < history_deep && !d_gnss_synchro_history_queue[i].empty()) + if (d_gnss_synchro_history_queue.at(i).size() < history_deep && !d_gnss_synchro_history_queue.at(i).empty()) { channel_history_ok = false; } @@ -392,15 +395,15 @@ int hybrid_observables_cc::general_work (int noutput_items , std::map gnss_synchro_map; for (unsigned int i = 0; i < d_nchannels; i++) { - if (!d_gnss_synchro_history_queue[i].empty()) + if (!d_gnss_synchro_history_queue.at(i).empty()) { - gnss_synchro_map.insert(std::pair(d_gnss_synchro_history_queue[i].front().Channel_ID, - d_gnss_synchro_history_queue[i].front())); + gnss_synchro_map.insert(std::pair(d_gnss_synchro_history_queue.at(i).front().Channel_ID, + d_gnss_synchro_history_queue.at(i).front())); } } - if (gnss_synchro_map.empty()) break; + if(gnss_synchro_map.empty()) { break; } // Breaks the do-while loop - gnss_synchro_map_iter = min_element(gnss_synchro_map.cbegin(), + gnss_synchro_map_iter = std::min_element(gnss_synchro_map.cbegin(), gnss_synchro_map.cend(), Hybrid_pairCompare_gnss_synchro_sample_counter); T_rx_s = static_cast(gnss_synchro_map_iter->second.Tracking_sample_counter) / static_cast(gnss_synchro_map_iter->second.fs); @@ -414,13 +417,13 @@ int hybrid_observables_cc::general_work (int noutput_items , // shift channels history to match the reference TOW for (unsigned int i = 0; i < d_nchannels; i++) { - if (!d_gnss_synchro_history_queue[i].empty()) + if (!d_gnss_synchro_history_queue.at(i).empty()) { - gnss_synchro_deque_iter = std::lower_bound(d_gnss_synchro_history_queue[i].cbegin(), - d_gnss_synchro_history_queue[i].cend(), + gnss_synchro_deque_iter = std::lower_bound(d_gnss_synchro_history_queue.at(i).cbegin(), + d_gnss_synchro_history_queue.at(i).cend(), T_rx_s, Hybrid_valueCompare_gnss_synchro_receiver_time); - if (gnss_synchro_deque_iter != d_gnss_synchro_history_queue[i].cend()) + if (gnss_synchro_deque_iter != d_gnss_synchro_history_queue.at(i).cend()) { if (gnss_synchro_deque_iter->Flag_valid_word == true) { @@ -432,24 +435,24 @@ int hybrid_observables_cc::general_work (int noutput_items , { // record the word structure in a map for pseudorange computation // save the previous observable - int distance = std::distance(d_gnss_synchro_history_queue[i].cbegin(), gnss_synchro_deque_iter); + int distance = std::distance(d_gnss_synchro_history_queue.at(i).cbegin(), gnss_synchro_deque_iter); if (distance > 0) { - if (d_gnss_synchro_history_queue[i].at(distance - 1).Flag_valid_word) + if (d_gnss_synchro_history_queue.at(i).at(distance - 1).Flag_valid_word) { - double T_rx_channel_prev = static_cast(d_gnss_synchro_history_queue[i].at(distance - 1).Tracking_sample_counter) / static_cast(gnss_synchro_deque_iter->fs); + double T_rx_channel_prev = static_cast(d_gnss_synchro_history_queue.at(i).at(distance - 1).Tracking_sample_counter) / static_cast(gnss_synchro_deque_iter->fs); double delta_T_rx_s_prev = T_rx_channel_prev - T_rx_s; if (fabs(delta_T_rx_s_prev) < fabs(delta_T_rx_s)) { - realigned_gnss_synchro_map.insert(std::pair(d_gnss_synchro_history_queue[i].at(distance - 1).Channel_ID, - d_gnss_synchro_history_queue[i].at(distance - 1))); + realigned_gnss_synchro_map.insert(std::pair(d_gnss_synchro_history_queue.at(i).at(distance - 1).Channel_ID, + d_gnss_synchro_history_queue.at(i).at(distance - 1))); adjacent_gnss_synchro_map.insert(std::pair(gnss_synchro_deque_iter->Channel_ID, *gnss_synchro_deque_iter)); } else { realigned_gnss_synchro_map.insert(std::pair(gnss_synchro_deque_iter->Channel_ID, *gnss_synchro_deque_iter)); - adjacent_gnss_synchro_map.insert(std::pair(d_gnss_synchro_history_queue[i].at(distance - 1).Channel_ID, - d_gnss_synchro_history_queue[i].at(distance - 1))); + adjacent_gnss_synchro_map.insert(std::pair(d_gnss_synchro_history_queue.at(i).at(distance - 1).Channel_ID, + d_gnss_synchro_history_queue.at(i).at(distance - 1))); } } @@ -472,7 +475,7 @@ int hybrid_observables_cc::general_work (int noutput_items , * common RX time algorithm */ // what is the most recent symbol TOW in the current set? -> this will be the reference symbol - gnss_synchro_map_iter = max_element(realigned_gnss_synchro_map.cbegin(), + gnss_synchro_map_iter = std::max_element(realigned_gnss_synchro_map.cbegin(), realigned_gnss_synchro_map.cend(), Hybrid_pairCompare_gnss_synchro_d_TOW); double ref_fs_hz = static_cast(gnss_synchro_map_iter->second.fs); @@ -575,20 +578,33 @@ int hybrid_observables_cc::general_work (int noutput_items , } // Move RX time - T_rx_s = T_rx_s + T_rx_step_s; + T_rx_s += T_rx_step_s; // pop old elements from queue for (unsigned int i = 0; i < d_nchannels; i++) { - if (!d_gnss_synchro_history_queue[i].empty()) + if (!d_gnss_synchro_history_queue.at(i).empty()) { - while (static_cast(d_gnss_synchro_history_queue[i].front().Tracking_sample_counter) / static_cast(d_gnss_synchro_history_queue[i].front().fs) < (T_rx_s - past_history_s)) + while (static_cast(d_gnss_synchro_history_queue.at(i).front().Tracking_sample_counter) / static_cast(d_gnss_synchro_history_queue.at(i).front().fs) < (T_rx_s - past_history_s)) { - d_gnss_synchro_history_queue[i].pop_front(); + d_gnss_synchro_history_queue.at(i).pop_front(); } } } } - } while(channel_history_ok == true && noutput_items > n_outputs); + + }// End of try{...} + catch(std::out_of_range& e) + { + LOG(WARNING) << "Out of range exception thrown by Hybrid Observables block. Exception message: " << e.what(); + std::cout << "Out of range exception thrown by Hybrid Observables block. Exception message: " << e.what() << std::endl; + } + catch(...) + { + LOG(WARNING) << "Undefined exception thrown by Hybrid Observables block."; + std::cout << "Undefined exception thrown by Hybrid Observables block." << std::endl; + } + + }while(channel_history_ok == true && noutput_items > n_outputs); // Multi-rate consume! for (unsigned int i = 0; i < d_nchannels; i++) From ab6e62af72f5ef239cad01d5a31ef30bf39c99fe Mon Sep 17 00:00:00 2001 From: Antonio Ramos Date: Wed, 14 Feb 2018 16:24:29 +0100 Subject: [PATCH 03/61] Return WORK_DONE when throwing an exception --- .../gnuradio_blocks/hybrid_observables_cc.cc | 21 +++++++++---------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc b/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc index ce11b6a1d..8fbf02e21 100644 --- a/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc +++ b/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc @@ -83,6 +83,7 @@ hybrid_observables_cc::hybrid_observables_cc(unsigned int nchannels_in, unsigned catch (const std::ifstream::failure & e) { LOG(WARNING) << "Exception opening observables dump file " << e.what(); + d_dump = false; } } } @@ -105,7 +106,7 @@ hybrid_observables_cc::~hybrid_observables_cc() if(d_dump == true) { std::cout << "Writing observables .mat files ..."; - hybrid_observables_cc::save_matfile(); + save_matfile(); std::cout << " done." << std::endl; } } @@ -509,12 +510,7 @@ int hybrid_observables_cc::general_work(int noutput_items, gr_vector_int &ninput // two points linear interpolation using adjacent (adj) values: y=y1+(x-x1)*(y2-y1)/(x2-x1) // TOW at the selected receiver time T_rx_s int element_key = gnss_synchro_map_iter->second.Channel_ID; - try{ - adj_obs = adjacent_gnss_synchro_map.at(element_key); - }catch(const std::exception & ex) - { - continue; - } + adj_obs = adjacent_gnss_synchro_map.at(element_key); double adj_T_rx_s = static_cast(adj_obs.Tracking_sample_counter) / channel_fs_hz + adj_obs.Code_phase_samples / channel_fs_hz; @@ -566,6 +562,7 @@ int hybrid_observables_cc::general_work(int noutput_items, gr_vector_int &ninput catch (const std::ifstream::failure& e) { LOG(WARNING) << "Exception writing observables dump file " << e.what(); + d_dump = false; } } @@ -593,15 +590,17 @@ int hybrid_observables_cc::general_work(int noutput_items, gr_vector_int &ninput } }// End of try{...} - catch(std::out_of_range& e) + catch(const std::out_of_range& e) { LOG(WARNING) << "Out of range exception thrown by Hybrid Observables block. Exception message: " << e.what(); std::cout << "Out of range exception thrown by Hybrid Observables block. Exception message: " << e.what() << std::endl; + return gr::block::WORK_DONE; } - catch(...) + catch(const std::exception& e) { - LOG(WARNING) << "Undefined exception thrown by Hybrid Observables block."; - std::cout << "Undefined exception thrown by Hybrid Observables block." << std::endl; + LOG(WARNING) << "Exception thrown by Hybrid Observables block. Exception message: " << e.what(); + std::cout << "Exception thrown by Hybrid Observables block. Exception message: " << e.what() << std::endl; + return gr::block::WORK_DONE; } }while(channel_history_ok == true && noutput_items > n_outputs); From 756fd1904eec11beedb2c8e5ce0d2b43a0d86c95 Mon Sep 17 00:00:00 2001 From: Antonio Ramos Date: Fri, 16 Feb 2018 18:10:48 +0100 Subject: [PATCH 04/61] Modify observables algorithm --- .../libs/gnss_sdr_sample_counter.cc | 6 +- .../adapters/hybrid_observables.cc | 13 +- .../gnuradio_blocks/hybrid_observables_cc.cc | 806 +++++++++++------- .../gnuradio_blocks/hybrid_observables_cc.h | 16 +- .../galileo_e1b_telemetry_decoder_cc.cc | 2 + .../galileo_e5a_telemetry_decoder_cc.cc | 2 + .../gps_l1_ca_telemetry_decoder_cc.cc | 2 + .../gps_l2c_telemetry_decoder_cc.cc | 2 + .../gps_l5_telemetry_decoder_cc.cc | 2 + .../galileo_e1_dll_pll_veml_tracking_cc.cc | 1 + .../galileo_e5a_dll_pll_tracking_cc.cc | 1 + .../gps_l1_ca_dll_pll_tracking_cc.cc | 1 + .../gps_l2_m_dll_pll_tracking_cc.cc | 1 + .../gps_l5i_dll_pll_tracking_cc.cc | 1 + 14 files changed, 522 insertions(+), 334 deletions(-) diff --git a/src/algorithms/libs/gnss_sdr_sample_counter.cc b/src/algorithms/libs/gnss_sdr_sample_counter.cc index e568da7d6..4047fad1a 100644 --- a/src/algorithms/libs/gnss_sdr_sample_counter.cc +++ b/src/algorithms/libs/gnss_sdr_sample_counter.cc @@ -38,7 +38,9 @@ gnss_sdr_sample_counter::gnss_sdr_sample_counter(double _fs) : gr::sync_decimato gr::io_signature::make(1, 1, sizeof(Gnss_Synchro)), static_cast(floor(_fs * 0.001))) { - this->message_port_register_out(pmt::mp("sample_counter")); + message_port_register_out(pmt::mp("sample_counter")); + set_max_noutput_items(1); + set_max_output_buffer(1); current_T_rx_ms = 0; report_interval_ms = 1000;//default reporting 1 second flag_enable_send_msg = false; //enable it for reporting time with asynchronous message @@ -63,7 +65,7 @@ int gnss_sdr_sample_counter::work(int noutput_items __attribute__((unused)), std::cout << "Current receiver time: " << static_cast(current_T_rx_ms) / 1000.0 << " [s]" << std::endl; if(flag_enable_send_msg) { - this->message_port_pub(pmt::mp("receiver_time"), pmt::from_double(static_cast(current_T_rx_ms) / 1000.0)); + message_port_pub(pmt::mp("receiver_time"), pmt::from_double(static_cast(current_T_rx_ms) / 1000.0)); } } current_T_rx_ms++; diff --git a/src/algorithms/observables/adapters/hybrid_observables.cc b/src/algorithms/observables/adapters/hybrid_observables.cc index 15f7bfc2a..d93b82598 100644 --- a/src/algorithms/observables/adapters/hybrid_observables.cc +++ b/src/algorithms/observables/adapters/hybrid_observables.cc @@ -46,17 +46,8 @@ HybridObservables::HybridObservables(ConfigurationInterface* configuration, DLOG(INFO) << "role " << role; dump_ = configuration->property(role + ".dump", false); dump_filename_ = configuration->property(role + ".dump_filename", default_dump_filename); - unsigned int default_depth = 0; - if (GPS_L1_CA_HISTORY_DEEP == GALILEO_E1_HISTORY_DEEP) - { - default_depth = GPS_L1_CA_HISTORY_DEEP; - } - else - { - default_depth = 100; - } - unsigned int history_deep = configuration->property(role + ".history_depth", default_depth); - observables_ = hybrid_make_observables_cc(in_streams_, out_streams_, dump_, dump_filename_, history_deep); + + observables_ = hybrid_make_observables_cc(in_streams_, out_streams_, dump_, dump_filename_); DLOG(INFO) << "Observables block ID (" << observables_->unique_id() << ")"; } diff --git a/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc b/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc index 8fbf02e21..eadbc64be 100644 --- a/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc +++ b/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc @@ -32,10 +32,7 @@ #include #include #include -#include -#include -#include -#include +#include #include #include #include @@ -47,63 +44,66 @@ using google::LogMessage; -hybrid_observables_cc_sptr hybrid_make_observables_cc(unsigned int nchannels_in, unsigned int nchannels_out, bool dump, std::string dump_filename, unsigned int deep_history) +hybrid_observables_cc_sptr hybrid_make_observables_cc(unsigned int nchannels_in, unsigned int nchannels_out, bool dump, std::string dump_filename) { - return hybrid_observables_cc_sptr(new hybrid_observables_cc(nchannels_in, nchannels_out, dump, dump_filename, deep_history)); + return hybrid_observables_cc_sptr(new hybrid_observables_cc(nchannels_in, nchannels_out, dump, dump_filename)); } -hybrid_observables_cc::hybrid_observables_cc(unsigned int nchannels_in, unsigned int nchannels_out, bool dump, std::string dump_filename, unsigned int deep_history) : - gr::block("hybrid_observables_cc", gr::io_signature::make(nchannels_in, nchannels_in, sizeof(Gnss_Synchro)), - gr::io_signature::make(nchannels_out, nchannels_out, sizeof(Gnss_Synchro))) +hybrid_observables_cc::hybrid_observables_cc(unsigned int nchannels_in, unsigned int nchannels_out, bool dump, std::string dump_filename) : + gr::block("hybrid_observables_cc", + gr::io_signature::make(nchannels_in, nchannels_in, sizeof(Gnss_Synchro)), + gr::io_signature::make(nchannels_out, nchannels_out, sizeof(Gnss_Synchro))) { - // initialize internal vars + set_max_noutput_items(1); + set_max_output_buffer(1); d_dump = dump; d_nchannels = nchannels_out; d_dump_filename = dump_filename; - history_deep = deep_history; T_rx_s = 0.0; - T_rx_step_s = 1e-3; // todo: move to gnss-sdr config + T_rx_step_s = 0.001; // 1 ms + max_extrapol_time_s = 0.1; // 100 ms + valid_channels.resize(d_nchannels, false); + d_num_valid_channels = 0; for (unsigned int i = 0; i < d_nchannels; i++) - { - d_gnss_synchro_history_queue.push_back(std::deque()); - } + { + d_gnss_synchro_history.push_back(std::pair()); + d_gnss_synchro_history.at(i).first.Flag_valid_word = false; + d_gnss_synchro_history.at(i).second.Flag_valid_word = false; + } // ############# ENABLE DATA FILE LOG ################# - if (d_dump == true) + if (d_dump) + { + if (!d_dump_file.is_open()) { - if (d_dump_file.is_open() == false) - { - try - { - d_dump_file.exceptions (std::ifstream::failbit | std::ifstream::badbit ); - d_dump_file.open(d_dump_filename.c_str(), std::ios::out | std::ios::binary); - LOG(INFO) << "Observables dump enabled Log file: " << d_dump_filename.c_str(); - } - catch (const std::ifstream::failure & e) - { - LOG(WARNING) << "Exception opening observables dump file " << e.what(); - d_dump = false; - } - } + try + { + d_dump_file.exceptions (std::ifstream::failbit | std::ifstream::badbit ); + d_dump_file.open(d_dump_filename.c_str(), std::ios::out | std::ios::binary); + LOG(INFO) << "Observables dump enabled Log file: " << d_dump_filename.c_str(); + } + catch (const std::ifstream::failure & e) + { + LOG(WARNING) << "Exception opening observables dump file " << e.what(); + d_dump = false; + } } + } } hybrid_observables_cc::~hybrid_observables_cc() { - if (d_dump_file.is_open() == true) + if (d_dump_file.is_open()) { - try - { - d_dump_file.close(); - } + try { d_dump_file.close(); } catch(const std::exception & ex) { LOG(WARNING) << "Exception in destructor closing the dump file " << ex.what(); } } - if(d_dump == true) + if(d_dump) { std::cout << "Writing observables .mat files ..."; save_matfile(); @@ -120,14 +120,11 @@ int hybrid_observables_cc::save_matfile() int epoch_size_bytes = sizeof(double) * number_of_double_vars * d_nchannels; std::ifstream dump_file; dump_file.exceptions(std::ifstream::failbit | std::ifstream::badbit); - try - { - dump_file.open(d_dump_filename.c_str(), std::ios::binary | std::ios::ate); - } + try { dump_file.open(d_dump_filename.c_str(), std::ios::binary | std::ios::ate); } catch(const std::ifstream::failure &e) { - std::cerr << "Problem opening dump file:" << e.what() << std::endl; - return 1; + std::cerr << "Problem opening dump file:" << e.what() << std::endl; + return 1; } // count number of epochs and rewind long int num_epoch = 0; @@ -137,10 +134,7 @@ int hybrid_observables_cc::save_matfile() num_epoch = static_cast(size) / static_cast(epoch_size_bytes); dump_file.seekg(0, std::ios::beg); } - else - { - return 1; - } + else { return 1; } double ** RX_time = new double * [d_nchannels]; double ** TOW_at_current_symbol_s = new double * [d_nchannels]; double ** Carrier_Doppler_hz = new double * [d_nchannels]; @@ -296,323 +290,505 @@ int hybrid_observables_cc::save_matfile() return 0; } - -bool Hybrid_pairCompare_gnss_synchro_sample_counter(const std::pair& a, const std::pair& b) +double Hybrid_Interpolate_data(const std::pair& a, const double& ti, int parameter) { - return (a.second.Tracking_sample_counter) < (b.second.Tracking_sample_counter); + // x(ti) = m * ti + c + // m = [x(t2) - x(t1)] / [t2 - t1] + // c = x(t1) - m * t1 + + double m = 0.0; + double c = 0.0; + + if(!a.first.Flag_valid_word or !a.second.Flag_valid_word) { return 0.0; } + + switch(parameter) + { + case 0:// Doppler + m = (a.first.Carrier_Doppler_hz - a.second.Carrier_Doppler_hz) / (a.first.RX_time - a.second.RX_time); + c = a.second.Carrier_Doppler_hz - m * a.second.RX_time; + break; + + case 1:// Carrier phase + m = (a.first.Carrier_phase_rads - a.second.Carrier_phase_rads) / (a.first.RX_time - a.second.RX_time); + c = a.second.Carrier_phase_rads - m * a.second.RX_time; + break; + + case 2:// TOW + m = (a.first.TOW_at_current_symbol_s - a.second.TOW_at_current_symbol_s) / (a.first.RX_time - a.second.RX_time); + c = a.second.TOW_at_current_symbol_s - m * a.second.RX_time; + break; + + case 3:// Code phase samples + m = (a.first.Code_phase_samples - a.second.Code_phase_samples) / (a.first.RX_time - a.second.RX_time); + c = a.second.Code_phase_samples - m * a.second.RX_time; + break; + } + return(m * ti + c); +} + +double Hybrid_Compute_T_rx_s(const Gnss_Synchro& a) +{ + if(a.Flag_valid_word) + { + return((static_cast(a.Tracking_sample_counter) + a.Code_phase_samples) / static_cast(a.fs)); + } + else { return 0.0; } +} + +/* +bool Hybrid_pairCompare_gnss_synchro_T_rx(const std::pair& a, const std::pair& b) +{ + if(a.second.Flag_valid_word and !b.second.Flag_valid_word) { return true; } + else if(!a.second.Flag_valid_word and b.second.Flag_valid_word) { return false; } + else if(!a.second.Flag_valid_word and !b.second.Flag_valid_word) {return false; } + else + { + return(Hybrid_Compute_T_rx_s(a.second) < Hybrid_Compute_T_rx_s(b.second)); + } +} + + +bool Hybrid_pairCompare_gnss_synchro_sample_counter(const std::pair& a, const std::pair& b) +{ + if(a.second.Flag_valid_word and !b.second.Flag_valid_word) { return true; } + else if(!a.second.Flag_valid_word and b.second.Flag_valid_word) { return false; } + else if(!a.second.Flag_valid_word and !b.second.Flag_valid_word) {return false; } + else + { + return(a.second.Tracking_sample_counter < b.second.Tracking_sample_counter); + } } bool Hybrid_valueCompare_gnss_synchro_sample_counter(const Gnss_Synchro& a, unsigned long int b) { - return (a.Tracking_sample_counter) < (b); + return(a.Tracking_sample_counter < b); } bool Hybrid_valueCompare_gnss_synchro_receiver_time(const Gnss_Synchro& a, double b) { - return ((static_cast(a.Tracking_sample_counter) + static_cast(a.Code_phase_samples)) / static_cast(a.fs) ) < (b); + return((static_cast(a.Tracking_sample_counter) + static_cast(a.Code_phase_samples)) / static_cast(a.fs) ) < (b); } -bool Hybrid_pairCompare_gnss_synchro_d_TOW(const std::pair& a, const std::pair& b) +bool Hybrid_pairCompare_gnss_synchro_TOW(const std::pair& a, const std::pair& b) { - return (a.second.TOW_at_current_symbol_s) < (b.second.TOW_at_current_symbol_s); + if(a.first.Flag_valid_word and !b.first.Flag_valid_word) { return true; } + else if(!a.first.Flag_valid_word and b.first.Flag_valid_word) { return false; } + else if(!a.first.Flag_valid_word and !b.first.Flag_valid_word) {return false; } + else + { + return(a.first.TOW_at_current_symbol_s < b.second.TOW_at_current_symbol_s); + } } bool Hybrid_valueCompare_gnss_synchro_d_TOW(const Gnss_Synchro& a, double b) { - return (a.TOW_at_current_symbol_s) < (b); + return(a.TOW_at_current_symbol_s < b); } +*/ - -void hybrid_observables_cc::forecast(int noutput_items __attribute__((unused)), gr_vector_int &ninput_items_required) +void hybrid_observables_cc::forecast(int noutput_items __attribute__((unused)), + gr_vector_int &ninput_items_required) { + bool available_items = false; for(unsigned int i = 0; i < d_nchannels; i++) { ninput_items_required[i] = 0; - //std::cout << "IN buffer "<< i << ". Number of items " << detail()->input(i)->items_available() << std::endl; + if(detail()->input(i)->items_available() > 0) { available_items = true; } } - //std::cout << "SC buffer. Number of items " << detail()->input(d_nchannels)->items_available() << std::endl; - ninput_items_required[d_nchannels] = 1; // set the required available samples in each call + if(available_items) { ninput_items_required[d_nchannels] = 0; } + else { ninput_items_required[d_nchannels] = 1; } } -int hybrid_observables_cc::general_work(int noutput_items, gr_vector_int &ninput_items, - gr_vector_const_void_star &input_items, gr_vector_void_star &output_items) +int hybrid_observables_cc::general_work(int noutput_items __attribute__((unused)), + gr_vector_int &ninput_items, gr_vector_const_void_star &input_items, + gr_vector_void_star &output_items) { - const Gnss_Synchro** in = reinterpret_cast(&input_items[0]); // Get the input buffer pointer - Gnss_Synchro** out = reinterpret_cast(&output_items[0]); // Get the output buffer pointer - int n_outputs = 0; - int n_consume[d_nchannels]; - double past_history_s = 100e-3; + const Gnss_Synchro** in = reinterpret_cast(&input_items[0]); + Gnss_Synchro** out = reinterpret_cast(&output_items[0]); - Gnss_Synchro current_gnss_synchro[d_nchannels]; - Gnss_Synchro aux = Gnss_Synchro(); - for(unsigned int i = 0; i < d_nchannels; i++) + unsigned int i; + int total_input_items = 0; + for(i = 0; i < d_nchannels; i++) { total_input_items += ninput_items[i]; } + bool compute_output = false; + + ////////////////////////////////////////////////////////////////////////// + if((total_input_items == 0) and (ninput_items[d_nchannels] == 0)) { - current_gnss_synchro[i] = aux; + return 0; } - /* - * 1. Read the GNSS SYNCHRO objects from available channels. - * Multi-rate GNURADIO Block. Read how many input items are avaliable in each channel - * Record all synchronization data into queues - */ - for (unsigned int i = 0; i < d_nchannels; i++) + else if((total_input_items == 0) and (ninput_items[d_nchannels] > 0) and (d_num_valid_channels == 0)) { - n_consume[i] = ninput_items[i]; // full throttle - for(int j = 0; j < n_consume[i]; j++) + T_rx_s += T_rx_step_s; + consume(d_nchannels, 1); + return 0; + } + else if((total_input_items == 0) and (ninput_items[d_nchannels] > 0) and (d_num_valid_channels > 0)) + { + T_rx_s += T_rx_step_s; + compute_output = true; + consume(d_nchannels, 1); + } + else if((total_input_items > 0) and (ninput_items[d_nchannels] == 0)) + {} + else if((total_input_items > 0) and (ninput_items[d_nchannels] > 0)) + { + T_rx_s += T_rx_step_s; + compute_output = true; + consume(d_nchannels, 1); + } + else + {} + ////////////////////////////////////////////////////////////////////////// + + + std::vector>::iterator it; + if (total_input_items > 0) + { + i = 0; + for (it = d_gnss_synchro_history.begin(); it != d_gnss_synchro_history.end(); it++) { - d_gnss_synchro_history_queue[i].push_back(in[i][j]); + if (ninput_items[i] > 0 and (Hybrid_Compute_T_rx_s(in[i][0]) < T_rx_s)) + { + it->second = it->first; // second is the older Gnss_Synchro + it->first = in[i][0]; // first is the newest Gnss_Synchro + it->first.RX_time = Hybrid_Compute_T_rx_s(it->first); + consume(i, 1); + } + if (it->first.Flag_valid_word and it->second.Flag_valid_word) { valid_channels[i] = true; } + else { valid_channels[i] = false; } + i++; } } + d_num_valid_channels = valid_channels.count(); + // Check if there is any valid channel after reading the new incoming Gnss_Synchro data + if(d_num_valid_channels == 0) { return 0; } - bool channel_history_ok; - - do + for(i = 0; i < d_nchannels; i++) //Discard observables with T_rx higher than the extrapolation threshold { - - try - { - - channel_history_ok = true; - for(unsigned int i = 0; i < d_nchannels; i++) + if(valid_channels[i]) { - if (d_gnss_synchro_history_queue.at(i).size() < history_deep && !d_gnss_synchro_history_queue.at(i).empty()) - { - channel_history_ok = false; - } + double delta_t = T_rx_s - d_gnss_synchro_history.at(i).second.RX_time; + //std::cout << "Sat " << d_gnss_synchro_history.at(i).second.PRN << ". Dt = " << delta_t * 1000.0 <<". Rx 2 "<< d_gnss_synchro_history.at(i).second.RX_time<<". Rx 1 "<< d_gnss_synchro_history.at(i).first.RX_time< max_extrapol_time_s) + { valid_channels[i] = false; } } - if (channel_history_ok == true) + } + d_num_valid_channels = valid_channels.count(); + + // Check if there is any valid channel after computing the time distance between the Gnss_Synchro data and the receiver time + if((d_num_valid_channels == 0) or !compute_output) { return 0; } + + it = d_gnss_synchro_history.begin(); + double TOW_ref = std::numeric_limits::max(); + for(i = 0; i < d_nchannels; i++) + { + if(!valid_channels[i]) { out[i][0] = Gnss_Synchro(); } + else { - std::map::const_iterator gnss_synchro_map_iter; - std::deque::const_iterator gnss_synchro_deque_iter; - - // 1. If the RX time is not set, set the Rx time - if (T_rx_s == 0) - { - // 0. Read a gnss_synchro snapshot from the queue and store it in a map - std::map gnss_synchro_map; - for (unsigned int i = 0; i < d_nchannels; i++) - { - if (!d_gnss_synchro_history_queue.at(i).empty()) - { - gnss_synchro_map.insert(std::pair(d_gnss_synchro_history_queue.at(i).front().Channel_ID, - d_gnss_synchro_history_queue.at(i).front())); - } - } - if(gnss_synchro_map.empty()) { break; } // Breaks the do-while loop - - gnss_synchro_map_iter = std::min_element(gnss_synchro_map.cbegin(), - gnss_synchro_map.cend(), - Hybrid_pairCompare_gnss_synchro_sample_counter); - T_rx_s = static_cast(gnss_synchro_map_iter->second.Tracking_sample_counter) / static_cast(gnss_synchro_map_iter->second.fs); - T_rx_s = floor(T_rx_s * 1000.0) / 1000.0; // truncate to ms - T_rx_s += past_history_s; // increase T_rx to have a minimum past history to interpolate - } - - // 2. Realign RX time in all valid channels - std::map realigned_gnss_synchro_map; // container for the aligned set of observables for the selected T_rx - std::map adjacent_gnss_synchro_map; // container for the previous observable values to interpolate - // shift channels history to match the reference TOW - for (unsigned int i = 0; i < d_nchannels; i++) - { - if (!d_gnss_synchro_history_queue.at(i).empty()) - { - gnss_synchro_deque_iter = std::lower_bound(d_gnss_synchro_history_queue.at(i).cbegin(), - d_gnss_synchro_history_queue.at(i).cend(), - T_rx_s, - Hybrid_valueCompare_gnss_synchro_receiver_time); - if (gnss_synchro_deque_iter != d_gnss_synchro_history_queue.at(i).cend()) - { - if (gnss_synchro_deque_iter->Flag_valid_word == true) - { - double T_rx_channel = static_cast(gnss_synchro_deque_iter->Tracking_sample_counter) / static_cast(gnss_synchro_deque_iter->fs); - double delta_T_rx_s = T_rx_channel - T_rx_s; - - // check that T_rx difference is less than a threshold (the correlation interval) - if (delta_T_rx_s * 1000.0 < static_cast(gnss_synchro_deque_iter->correlation_length_ms)) - { - // record the word structure in a map for pseudorange computation - // save the previous observable - int distance = std::distance(d_gnss_synchro_history_queue.at(i).cbegin(), gnss_synchro_deque_iter); - if (distance > 0) - { - if (d_gnss_synchro_history_queue.at(i).at(distance - 1).Flag_valid_word) - { - double T_rx_channel_prev = static_cast(d_gnss_synchro_history_queue.at(i).at(distance - 1).Tracking_sample_counter) / static_cast(gnss_synchro_deque_iter->fs); - double delta_T_rx_s_prev = T_rx_channel_prev - T_rx_s; - if (fabs(delta_T_rx_s_prev) < fabs(delta_T_rx_s)) - { - realigned_gnss_synchro_map.insert(std::pair(d_gnss_synchro_history_queue.at(i).at(distance - 1).Channel_ID, - d_gnss_synchro_history_queue.at(i).at(distance - 1))); - adjacent_gnss_synchro_map.insert(std::pair(gnss_synchro_deque_iter->Channel_ID, *gnss_synchro_deque_iter)); - } - else - { - realigned_gnss_synchro_map.insert(std::pair(gnss_synchro_deque_iter->Channel_ID, *gnss_synchro_deque_iter)); - adjacent_gnss_synchro_map.insert(std::pair(d_gnss_synchro_history_queue.at(i).at(distance - 1).Channel_ID, - d_gnss_synchro_history_queue.at(i).at(distance - 1))); - } - } - - } - else - { - realigned_gnss_synchro_map.insert(std::pair(gnss_synchro_deque_iter->Channel_ID, *gnss_synchro_deque_iter)); - } - - } - } - } - } - } - - if(!realigned_gnss_synchro_map.empty()) - { - /* - * 2.1 Use CURRENT set of measurements and find the nearest satellite - * common RX time algorithm - */ - // what is the most recent symbol TOW in the current set? -> this will be the reference symbol - gnss_synchro_map_iter = std::max_element(realigned_gnss_synchro_map.cbegin(), - realigned_gnss_synchro_map.cend(), - Hybrid_pairCompare_gnss_synchro_d_TOW); - double ref_fs_hz = static_cast(gnss_synchro_map_iter->second.fs); - - // compute interpolated TOW value at T_rx_s - int ref_channel_key = gnss_synchro_map_iter->second.Channel_ID; - Gnss_Synchro adj_obs; - adj_obs = adjacent_gnss_synchro_map.at(ref_channel_key); - double ref_adj_T_rx_s = static_cast(adj_obs.Tracking_sample_counter) / ref_fs_hz + adj_obs.Code_phase_samples / ref_fs_hz; - - double d_TOW_reference = gnss_synchro_map_iter->second.TOW_at_current_symbol_s; - double d_ref_T_rx_s = static_cast(gnss_synchro_map_iter->second.Tracking_sample_counter) / ref_fs_hz + gnss_synchro_map_iter->second.Code_phase_samples / ref_fs_hz; - - double selected_T_rx_s = T_rx_s; - // two points linear interpolation using adjacent (adj) values: y=y1+(x-x1)*(y2-y1)/(x2-x1) - double ref_TOW_at_T_rx_s = adj_obs.TOW_at_current_symbol_s + - (selected_T_rx_s - ref_adj_T_rx_s) * (d_TOW_reference - adj_obs.TOW_at_current_symbol_s) / (d_ref_T_rx_s - ref_adj_T_rx_s); - - // Now compute RX time differences due to the PRN alignment in the correlators - double traveltime_ms; - double pseudorange_m; - double channel_T_rx_s; - double channel_fs_hz; - double channel_TOW_s; - for(gnss_synchro_map_iter = realigned_gnss_synchro_map.cbegin(); gnss_synchro_map_iter != realigned_gnss_synchro_map.cend(); gnss_synchro_map_iter++) - { - channel_fs_hz = static_cast(gnss_synchro_map_iter->second.fs); - channel_TOW_s = gnss_synchro_map_iter->second.TOW_at_current_symbol_s; - channel_T_rx_s = static_cast(gnss_synchro_map_iter->second.Tracking_sample_counter) / channel_fs_hz + gnss_synchro_map_iter->second.Code_phase_samples / channel_fs_hz; - // compute interpolated observation values - // two points linear interpolation using adjacent (adj) values: y=y1+(x-x1)*(y2-y1)/(x2-x1) - // TOW at the selected receiver time T_rx_s - int element_key = gnss_synchro_map_iter->second.Channel_ID; - adj_obs = adjacent_gnss_synchro_map.at(element_key); - - double adj_T_rx_s = static_cast(adj_obs.Tracking_sample_counter) / channel_fs_hz + adj_obs.Code_phase_samples / channel_fs_hz; - - double channel_TOW_at_T_rx_s = adj_obs.TOW_at_current_symbol_s + (selected_T_rx_s - adj_T_rx_s) * (channel_TOW_s - adj_obs.TOW_at_current_symbol_s) / (channel_T_rx_s - adj_T_rx_s); - - // Doppler and Accumulated carrier phase - double Carrier_phase_lin_rads = adj_obs.Carrier_phase_rads + (selected_T_rx_s - adj_T_rx_s) * (gnss_synchro_map_iter->second.Carrier_phase_rads - adj_obs.Carrier_phase_rads) / (channel_T_rx_s - adj_T_rx_s); - double Carrier_Doppler_lin_hz = adj_obs.Carrier_Doppler_hz + (selected_T_rx_s - adj_T_rx_s) * (gnss_synchro_map_iter->second.Carrier_Doppler_hz - adj_obs.Carrier_Doppler_hz) / (channel_T_rx_s - adj_T_rx_s); - - // compute the pseudorange (no rx time offset correction) - traveltime_ms = (ref_TOW_at_T_rx_s - channel_TOW_at_T_rx_s) * 1000.0 + GPS_STARTOFFSET_ms; - // convert to meters - pseudorange_m = traveltime_ms * GPS_C_m_ms; // [m] - // update the pseudorange object - current_gnss_synchro[gnss_synchro_map_iter->second.Channel_ID] = gnss_synchro_map_iter->second; - current_gnss_synchro[gnss_synchro_map_iter->second.Channel_ID].Pseudorange_m = pseudorange_m; - current_gnss_synchro[gnss_synchro_map_iter->second.Channel_ID].Flag_valid_pseudorange = true; - // Save the estimated RX time (no RX clock offset correction yet!) - current_gnss_synchro[gnss_synchro_map_iter->second.Channel_ID].RX_time = ref_TOW_at_T_rx_s + GPS_STARTOFFSET_ms / 1000.0; - - current_gnss_synchro[gnss_synchro_map_iter->second.Channel_ID].Carrier_phase_rads = Carrier_phase_lin_rads; - current_gnss_synchro[gnss_synchro_map_iter->second.Channel_ID].Carrier_Doppler_hz = Carrier_Doppler_lin_hz; - } - - if(d_dump == true) - { - // MULTIPLEXED FILE RECORDING - Record results to file - try - { - double tmp_double; - for (unsigned int i = 0; i < d_nchannels; i++) - { - tmp_double = current_gnss_synchro[i].RX_time; - d_dump_file.write(reinterpret_cast(&tmp_double), sizeof(double)); - tmp_double = current_gnss_synchro[i].TOW_at_current_symbol_s; - d_dump_file.write(reinterpret_cast(&tmp_double), sizeof(double)); - tmp_double = current_gnss_synchro[i].Carrier_Doppler_hz; - d_dump_file.write(reinterpret_cast(&tmp_double), sizeof(double)); - tmp_double = current_gnss_synchro[i].Carrier_phase_rads / GPS_TWO_PI; - d_dump_file.write(reinterpret_cast(&tmp_double), sizeof(double)); - tmp_double = current_gnss_synchro[i].Pseudorange_m; - d_dump_file.write(reinterpret_cast(&tmp_double), sizeof(double)); - tmp_double = current_gnss_synchro[i].PRN; - d_dump_file.write(reinterpret_cast(&tmp_double), sizeof(double)); - tmp_double = static_cast(current_gnss_synchro[i].Flag_valid_pseudorange); - d_dump_file.write(reinterpret_cast(&tmp_double), sizeof(double)); - } - } - catch (const std::ifstream::failure& e) - { - LOG(WARNING) << "Exception writing observables dump file " << e.what(); - d_dump = false; - } - } - - for (unsigned int i = 0; i < d_nchannels; i++) - { - out[i][n_outputs] = current_gnss_synchro[i]; - } - - n_outputs++; - } - - // Move RX time - T_rx_s += T_rx_step_s; - // pop old elements from queue - for (unsigned int i = 0; i < d_nchannels; i++) - { - if (!d_gnss_synchro_history_queue.at(i).empty()) - { - while (static_cast(d_gnss_synchro_history_queue.at(i).front().Tracking_sample_counter) / static_cast(d_gnss_synchro_history_queue.at(i).front().fs) < (T_rx_s - past_history_s)) - { - d_gnss_synchro_history_queue.at(i).pop_front(); - } - } - } + out[i][0] = it->first; + out[i][0].Flag_valid_pseudorange = true; + out[i][0].Carrier_Doppler_hz = Hybrid_Interpolate_data(*it, T_rx_s, 0); + out[i][0].Carrier_phase_rads = Hybrid_Interpolate_data(*it, T_rx_s, 1); + out[i][0].RX_time = Hybrid_Interpolate_data(*it, T_rx_s, 2); + out[i][0].Code_phase_samples = Hybrid_Interpolate_data(*it, T_rx_s, 3); + //std::cout<<"T2: "<< it->first.RX_time<<". T1: "<< it->second.RX_time <<" T i: " << T_rx_s <first.Carrier_Doppler_hz<<","<< it->second.Carrier_Doppler_hz<<" Doppler interp: " << out[i][0].Carrier_Doppler_hz <(d_gnss_synchro_history_queue.at(i).front().Tracking_sample_counter) / static_cast(d_gnss_synchro_history_queue.at(i).front().fs) < (T_rx_s - past_history_s)) +// { +// d_gnss_synchro_history_queue.at(i).pop_front(); +// } +// } +// } +// } +// +// }// End of try{...} +// catch(const std::out_of_range& e) +// { +// LOG(WARNING) << "Out of range exception thrown by Hybrid Observables block. Exception message: " << e.what(); +// std::cout << "Out of range exception thrown by Hybrid Observables block. Exception message: " << e.what() << std::endl; +// return gr::block::WORK_DONE; +// } +// catch(const std::exception& e) +// { +// LOG(WARNING) << "Exception thrown by Hybrid Observables block. Exception message: " << e.what(); +// std::cout << "Exception thrown by Hybrid Observables block. Exception message: " << e.what() << std::endl; +// return gr::block::WORK_DONE; +// } +// +// }while(channel_history_ok == true && noutput_items > n_outputs); +// +// // Multi-rate consume! +// for (unsigned int i = 0; i < d_nchannels; i++) +// { +// consume(i, n_consume[i]); // which input, how many items +// } +// +// //consume monitor channel always +// consume(d_nchannels, 1); +// return n_outputs; +// +// } diff --git a/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.h b/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.h index f1a1c3da2..139dd8644 100644 --- a/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.h +++ b/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.h @@ -35,6 +35,9 @@ #include #include +#include //std::pair +#include //std::vector +#include #include #include "gnss_synchro.h" @@ -44,7 +47,7 @@ class hybrid_observables_cc; typedef boost::shared_ptr hybrid_observables_cc_sptr; hybrid_observables_cc_sptr -hybrid_make_observables_cc(unsigned int nchannels_in, unsigned int nchannels_out, bool dump, std::string dump_filename, unsigned int deep_history); +hybrid_make_observables_cc(unsigned int nchannels_in, unsigned int nchannels_out, bool dump, std::string dump_filename); /*! * \brief This class implements a block that computes Galileo observables @@ -58,17 +61,18 @@ public: void forecast (int noutput_items, gr_vector_int &ninput_items_required); private: friend hybrid_observables_cc_sptr - hybrid_make_observables_cc(unsigned int nchannels_in, unsigned int nchannels_out, bool dump, std::string dump_filename, unsigned int deep_history); - hybrid_observables_cc(unsigned int nchannels_in, unsigned int nchannels_out, bool dump, std::string dump_filename, unsigned int deep_history); + hybrid_make_observables_cc(unsigned int nchannels_in, unsigned int nchannels_out, bool dump, std::string dump_filename); + hybrid_observables_cc(unsigned int nchannels_in, unsigned int nchannels_out, bool dump, std::string dump_filename); //Tracking observable history - std::vector> d_gnss_synchro_history_queue; - + std::vector> d_gnss_synchro_history; + boost::dynamic_bitset<> valid_channels; double T_rx_s; double T_rx_step_s; + double max_extrapol_time_s; bool d_dump; unsigned int d_nchannels; - unsigned int history_deep; + unsigned int d_num_valid_channels; std::string d_dump_filename; std::ofstream d_dump_file; diff --git a/src/algorithms/telemetry_decoder/gnuradio_blocks/galileo_e1b_telemetry_decoder_cc.cc b/src/algorithms/telemetry_decoder/gnuradio_blocks/galileo_e1b_telemetry_decoder_cc.cc index 97c4a9927..5504f84cf 100644 --- a/src/algorithms/telemetry_decoder/gnuradio_blocks/galileo_e1b_telemetry_decoder_cc.cc +++ b/src/algorithms/telemetry_decoder/gnuradio_blocks/galileo_e1b_telemetry_decoder_cc.cc @@ -107,6 +107,8 @@ galileo_e1b_telemetry_decoder_cc::galileo_e1b_telemetry_decoder_cc( gr::block("galileo_e1b_telemetry_decoder_cc", gr::io_signature::make(1, 1, sizeof(Gnss_Synchro)), gr::io_signature::make(1, 1, sizeof(Gnss_Synchro))) { + set_max_noutput_items(1); + set_max_output_buffer(1); // Telemetry Bit transition synchronization port out this->message_port_register_out(pmt::mp("preamble_timestamp_s")); // Ephemeris data port out diff --git a/src/algorithms/telemetry_decoder/gnuradio_blocks/galileo_e5a_telemetry_decoder_cc.cc b/src/algorithms/telemetry_decoder/gnuradio_blocks/galileo_e5a_telemetry_decoder_cc.cc index 4f76a6d99..5e94348e6 100644 --- a/src/algorithms/telemetry_decoder/gnuradio_blocks/galileo_e5a_telemetry_decoder_cc.cc +++ b/src/algorithms/telemetry_decoder/gnuradio_blocks/galileo_e5a_telemetry_decoder_cc.cc @@ -183,6 +183,8 @@ galileo_e5a_telemetry_decoder_cc::galileo_e5a_telemetry_decoder_cc( gr::io_signature::make(1, 1, sizeof(Gnss_Synchro)), gr::io_signature::make(1, 1, sizeof(Gnss_Synchro))) { + set_max_noutput_items(1); + set_max_output_buffer(1); // Telemetry Bit transition synchronization port out this->message_port_register_out(pmt::mp("preamble_timestamp_s")); // Ephemeris data port out diff --git a/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_cc.cc b/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_cc.cc index c47d448e7..50adeed2d 100644 --- a/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_cc.cc +++ b/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_cc.cc @@ -55,6 +55,8 @@ gps_l1_ca_telemetry_decoder_cc::gps_l1_ca_telemetry_decoder_cc( gr::block("gps_navigation_cc", gr::io_signature::make(1, 1, sizeof(Gnss_Synchro)), gr::io_signature::make(1, 1, sizeof(Gnss_Synchro))) { + set_max_noutput_items(1); + set_max_output_buffer(1); // Telemetry Bit transition synchronization port out this->message_port_register_out(pmt::mp("preamble_timestamp_s")); // Ephemeris data port out diff --git a/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l2c_telemetry_decoder_cc.cc b/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l2c_telemetry_decoder_cc.cc index 7b1334836..1e000a009 100644 --- a/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l2c_telemetry_decoder_cc.cc +++ b/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l2c_telemetry_decoder_cc.cc @@ -52,6 +52,8 @@ gps_l2c_telemetry_decoder_cc::gps_l2c_telemetry_decoder_cc( gr::io_signature::make(1, 1, sizeof(Gnss_Synchro)), gr::io_signature::make(1, 1, sizeof(Gnss_Synchro))) { + set_max_noutput_items(1); + set_max_output_buffer(1); // Telemetry Bit transition synchronization port out this->message_port_register_out(pmt::mp("preamble_timestamp_s")); // Ephemeris data port out diff --git a/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l5_telemetry_decoder_cc.cc b/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l5_telemetry_decoder_cc.cc index 2d604b221..cd44ffad5 100644 --- a/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l5_telemetry_decoder_cc.cc +++ b/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l5_telemetry_decoder_cc.cc @@ -54,6 +54,8 @@ gps_l5_telemetry_decoder_cc::gps_l5_telemetry_decoder_cc( gr::io_signature::make(1, 1, sizeof(Gnss_Synchro)), gr::io_signature::make(1, 1, sizeof(Gnss_Synchro))) { + set_max_noutput_items(1); + set_max_output_buffer(1); // Telemetry Bit transition synchronization port out this->message_port_register_out(pmt::mp("preamble_timestamp_s")); // Ephemeris data port out diff --git a/src/algorithms/tracking/gnuradio_blocks/galileo_e1_dll_pll_veml_tracking_cc.cc b/src/algorithms/tracking/gnuradio_blocks/galileo_e1_dll_pll_veml_tracking_cc.cc index 9ed1259dc..bb59c62bc 100755 --- a/src/algorithms/tracking/gnuradio_blocks/galileo_e1_dll_pll_veml_tracking_cc.cc +++ b/src/algorithms/tracking/gnuradio_blocks/galileo_e1_dll_pll_veml_tracking_cc.cc @@ -117,6 +117,7 @@ galileo_e1_dll_pll_veml_tracking_cc::galileo_e1_dll_pll_veml_tracking_cc( gr::block("galileo_e1_dll_pll_veml_tracking_cc", gr::io_signature::make(1, 1, sizeof(gr_complex)), gr::io_signature::make(1, 1, sizeof(Gnss_Synchro))) { + set_max_noutput_items(1); // Telemetry bit synchronization message port input this->message_port_register_in(pmt::mp("preamble_timestamp_s")); this->set_relative_rate(1.0 / vector_length); diff --git a/src/algorithms/tracking/gnuradio_blocks/galileo_e5a_dll_pll_tracking_cc.cc b/src/algorithms/tracking/gnuradio_blocks/galileo_e5a_dll_pll_tracking_cc.cc index 139097148..49db923e4 100644 --- a/src/algorithms/tracking/gnuradio_blocks/galileo_e5a_dll_pll_tracking_cc.cc +++ b/src/algorithms/tracking/gnuradio_blocks/galileo_e5a_dll_pll_tracking_cc.cc @@ -97,6 +97,7 @@ Galileo_E5a_Dll_Pll_Tracking_cc::Galileo_E5a_Dll_Pll_Tracking_cc( gr::block("Galileo_E5a_Dll_Pll_Tracking_cc", gr::io_signature::make(1, 1, sizeof(gr_complex)), gr::io_signature::make(1, 1, sizeof(Gnss_Synchro))) { + set_max_noutput_items(1); // Telemetry bit synchronization message port input this->message_port_register_in(pmt::mp("preamble_timestamp_s")); this->message_port_register_out(pmt::mp("events")); diff --git a/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_tracking_cc.cc b/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_tracking_cc.cc index 3bc3d0f9f..fe7201bc9 100644 --- a/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_tracking_cc.cc +++ b/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_tracking_cc.cc @@ -93,6 +93,7 @@ Gps_L1_Ca_Dll_Pll_Tracking_cc::Gps_L1_Ca_Dll_Pll_Tracking_cc( gr::block("Gps_L1_Ca_Dll_Pll_Tracking_cc", gr::io_signature::make(1, 1, sizeof(gr_complex)), gr::io_signature::make(1, 1, sizeof(Gnss_Synchro))) { + set_max_noutput_items(1); // Telemetry bit synchronization message port input this->message_port_register_in(pmt::mp("preamble_timestamp_s")); this->message_port_register_out(pmt::mp("events")); diff --git a/src/algorithms/tracking/gnuradio_blocks/gps_l2_m_dll_pll_tracking_cc.cc b/src/algorithms/tracking/gnuradio_blocks/gps_l2_m_dll_pll_tracking_cc.cc index 2a28283f4..25f8191f1 100644 --- a/src/algorithms/tracking/gnuradio_blocks/gps_l2_m_dll_pll_tracking_cc.cc +++ b/src/algorithms/tracking/gnuradio_blocks/gps_l2_m_dll_pll_tracking_cc.cc @@ -90,6 +90,7 @@ gps_l2_m_dll_pll_tracking_cc::gps_l2_m_dll_pll_tracking_cc( gr::block("gps_l2_m_dll_pll_tracking_cc", gr::io_signature::make(1, 1, sizeof(gr_complex)), gr::io_signature::make(1, 1, sizeof(Gnss_Synchro))) { + set_max_noutput_items(1); // Telemetry bit synchronization message port input this->message_port_register_in(pmt::mp("preamble_timestamp_s")); this->message_port_register_out(pmt::mp("events")); diff --git a/src/algorithms/tracking/gnuradio_blocks/gps_l5i_dll_pll_tracking_cc.cc b/src/algorithms/tracking/gnuradio_blocks/gps_l5i_dll_pll_tracking_cc.cc index c7205f6bf..cae86d1b7 100644 --- a/src/algorithms/tracking/gnuradio_blocks/gps_l5i_dll_pll_tracking_cc.cc +++ b/src/algorithms/tracking/gnuradio_blocks/gps_l5i_dll_pll_tracking_cc.cc @@ -90,6 +90,7 @@ gps_l5i_dll_pll_tracking_cc::gps_l5i_dll_pll_tracking_cc( gr::block("gps_l5i_dll_pll_tracking_cc", gr::io_signature::make(1, 1, sizeof(gr_complex)), gr::io_signature::make(1, 1, sizeof(Gnss_Synchro))) { + set_max_noutput_items(1); // Telemetry bit synchronization message port input this->message_port_register_in(pmt::mp("preamble_timestamp_s")); this->message_port_register_out(pmt::mp("events")); From c3657f32515443a5c7920a54ce0f9d3fc52992c9 Mon Sep 17 00:00:00 2001 From: Antonio Ramos Date: Mon, 19 Feb 2018 10:29:12 +0100 Subject: [PATCH 05/61] Modify hybrid observables --- .../gnuradio_blocks/hybrid_observables_cc.cc | 38 +++++++++++-------- .../gnuradio_blocks/hybrid_observables_cc.h | 5 ++- 2 files changed, 25 insertions(+), 18 deletions(-) diff --git a/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc b/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc index eadbc64be..eea804e17 100644 --- a/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc +++ b/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc @@ -55,8 +55,8 @@ hybrid_observables_cc::hybrid_observables_cc(unsigned int nchannels_in, unsigned gr::io_signature::make(nchannels_in, nchannels_in, sizeof(Gnss_Synchro)), gr::io_signature::make(nchannels_out, nchannels_out, sizeof(Gnss_Synchro))) { - set_max_noutput_items(1); - set_max_output_buffer(1); + //set_max_noutput_items(1); + //set_max_output_buffer(1); d_dump = dump; d_nchannels = nchannels_out; d_dump_filename = dump_filename; @@ -65,12 +65,7 @@ hybrid_observables_cc::hybrid_observables_cc(unsigned int nchannels_in, unsigned max_extrapol_time_s = 0.1; // 100 ms valid_channels.resize(d_nchannels, false); d_num_valid_channels = 0; - for (unsigned int i = 0; i < d_nchannels; i++) - { - d_gnss_synchro_history.push_back(std::pair()); - d_gnss_synchro_history.at(i).first.Flag_valid_word = false; - d_gnss_synchro_history.at(i).second.Flag_valid_word = false; - } + // ############# ENABLE DATA FILE LOG ################# if (d_dump) @@ -335,6 +330,11 @@ double Hybrid_Compute_T_rx_s(const Gnss_Synchro& a) else { return 0.0; } } +bool Hybrid_find_trx(const Gnss_Synchro&a) +{ + return(std::fabs(T_rx_s - a.RX_time) > trx_comp_thres); +} + /* bool Hybrid_pairCompare_gnss_synchro_T_rx(const std::pair& a, const std::pair& b) { @@ -446,20 +446,26 @@ int hybrid_observables_cc::general_work(int noutput_items __attribute__((unused) ////////////////////////////////////////////////////////////////////////// - std::vector>::iterator it; + std::vector>::iterator it; if (total_input_items > 0) { i = 0; for (it = d_gnss_synchro_history.begin(); it != d_gnss_synchro_history.end(); it++) { - if (ninput_items[i] > 0 and (Hybrid_Compute_T_rx_s(in[i][0]) < T_rx_s)) + if (ninput_items[i] > 0) { - it->second = it->first; // second is the older Gnss_Synchro - it->first = in[i][0]; // first is the newest Gnss_Synchro - it->first.RX_time = Hybrid_Compute_T_rx_s(it->first); - consume(i, 1); + for(int aux = 0; aux < ninput_items[i]; aux++) + { + it->push_back(in[i][aux]); + it->at(it->size() - 1).RX_time = Hybrid_Compute_T_rx_s(in[i][aux]); + } + consume(ninput_items[i], 1); } - if (it->first.Flag_valid_word and it->second.Flag_valid_word) { valid_channels[i] = true; } + while(std::find(d_gnss_synchro_history.begin(), d_gnss_synchro_history.end(), Hybrid_compare_trx) != d_gnss_synchro_history.end()) + { + + } + if (it->size() > 2) { valid_channels[i] = true; } else { valid_channels[i] = false; } i++; } @@ -506,7 +512,7 @@ int hybrid_observables_cc::general_work(int noutput_items __attribute__((unused) { if(valid_channels[i]) { - double traveltime_ms = (out[i][0].RX_time - TOW_ref)*1000.0 + GPS_STARTOFFSET_ms; + double traveltime_ms = (out[i][0].RX_time - TOW_ref) * 1000.0 + GPS_STARTOFFSET_ms; out[i][0].Pseudorange_m = traveltime_ms * GPS_C_m_ms; out[i][0].RX_time = TOW_ref + GPS_STARTOFFSET_ms / 1000.0; //std::cout << "Sat " << out[i][0].PRN << ". Prang = " << out[i][0].Pseudorange_m << ". TOW = " << out[i][0].RX_time << std::endl; diff --git a/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.h b/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.h index 139dd8644..4d1119a35 100644 --- a/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.h +++ b/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.h @@ -35,8 +35,9 @@ #include #include -#include //std::pair +//#include //std::pair #include //std::vector +#include #include #include #include "gnss_synchro.h" @@ -65,7 +66,7 @@ private: hybrid_observables_cc(unsigned int nchannels_in, unsigned int nchannels_out, bool dump, std::string dump_filename); //Tracking observable history - std::vector> d_gnss_synchro_history; + std::vector> d_gnss_synchro_history; boost::dynamic_bitset<> valid_channels; double T_rx_s; double T_rx_step_s; From 82084dd8672371332479711a9a14f4dda35dc4d0 Mon Sep 17 00:00:00 2001 From: Antonio Ramos Date: Mon, 19 Feb 2018 17:20:34 +0100 Subject: [PATCH 06/61] Minor changes --- .../libs/gnss_sdr_sample_counter.cc | 1 - .../gnuradio_blocks/hybrid_observables_cc.cc | 232 +++++++++++++----- .../gnuradio_blocks/hybrid_observables_cc.h | 11 +- .../galileo_e1b_telemetry_decoder_cc.cc | 1 - .../galileo_e5a_telemetry_decoder_cc.cc | 1 - .../gps_l1_ca_telemetry_decoder_cc.cc | 1 - .../gps_l2c_telemetry_decoder_cc.cc | 1 - .../gps_l5_telemetry_decoder_cc.cc | 1 - 8 files changed, 184 insertions(+), 65 deletions(-) diff --git a/src/algorithms/libs/gnss_sdr_sample_counter.cc b/src/algorithms/libs/gnss_sdr_sample_counter.cc index 4047fad1a..9db529625 100644 --- a/src/algorithms/libs/gnss_sdr_sample_counter.cc +++ b/src/algorithms/libs/gnss_sdr_sample_counter.cc @@ -40,7 +40,6 @@ gnss_sdr_sample_counter::gnss_sdr_sample_counter(double _fs) : gr::sync_decimato { message_port_register_out(pmt::mp("sample_counter")); set_max_noutput_items(1); - set_max_output_buffer(1); current_T_rx_ms = 0; report_interval_ms = 1000;//default reporting 1 second flag_enable_send_msg = false; //enable it for reporting time with asynchronous message diff --git a/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc b/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc index eea804e17..f69eeee61 100644 --- a/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc +++ b/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc @@ -55,17 +55,22 @@ hybrid_observables_cc::hybrid_observables_cc(unsigned int nchannels_in, unsigned gr::io_signature::make(nchannels_in, nchannels_in, sizeof(Gnss_Synchro)), gr::io_signature::make(nchannels_out, nchannels_out, sizeof(Gnss_Synchro))) { - //set_max_noutput_items(1); - //set_max_output_buffer(1); + set_max_noutput_items(1); + set_max_output_buffer(1); d_dump = dump; + set_T_rx_s = false; d_nchannels = nchannels_out; d_dump_filename = dump_filename; T_rx_s = 0.0; T_rx_step_s = 0.001; // 1 ms - max_extrapol_time_s = 0.1; // 100 ms + max_delta = 0.05; // 50 ms valid_channels.resize(d_nchannels, false); d_num_valid_channels = 0; + for(unsigned int i = 0; i < d_nchannels; i++) + { + d_gnss_synchro_history.push_back(std::deque()); + } // ############# ENABLE DATA FILE LOG ################# if (d_dump) @@ -285,7 +290,7 @@ int hybrid_observables_cc::save_matfile() return 0; } -double Hybrid_Interpolate_data(const std::pair& a, const double& ti, int parameter) +double hybrid_observables_cc::interpolate_data(const std::pair& a, const double& ti, int parameter) { // x(ti) = m * ti + c // m = [x(t2) - x(t1)] / [t2 - t1] @@ -321,7 +326,7 @@ double Hybrid_Interpolate_data(const std::pair& a, c return(m * ti + c); } -double Hybrid_Compute_T_rx_s(const Gnss_Synchro& a) +double hybrid_observables_cc::compute_T_rx_s(const Gnss_Synchro& a) { if(a.Flag_valid_word) { @@ -330,11 +335,6 @@ double Hybrid_Compute_T_rx_s(const Gnss_Synchro& a) else { return 0.0; } } -bool Hybrid_find_trx(const Gnss_Synchro&a) -{ - return(std::fabs(T_rx_s - a.RX_time) > trx_comp_thres); -} - /* bool Hybrid_pairCompare_gnss_synchro_T_rx(const std::pair& a, const std::pair& b) { @@ -393,14 +393,80 @@ bool Hybrid_valueCompare_gnss_synchro_d_TOW(const Gnss_Synchro& a, double b) void hybrid_observables_cc::forecast(int noutput_items __attribute__((unused)), gr_vector_int &ninput_items_required) { - bool available_items = false; +// bool available_items = false; +// for(unsigned int i = 0; i < d_nchannels; i++) +// { +// ninput_items_required[i] = 0; +// if(detail()->input(i)->items_available() > 0) { available_items = true; } +// } +// if(available_items) { ninput_items_required[d_nchannels] = 0; } +// else { ninput_items_required[d_nchannels] = 1; } for(unsigned int i = 0; i < d_nchannels; i++) { ninput_items_required[i] = 0; - if(detail()->input(i)->items_available() > 0) { available_items = true; } } - if(available_items) { ninput_items_required[d_nchannels] = 0; } - else { ninput_items_required[d_nchannels] = 1; } + ninput_items_required[d_nchannels] = 1; +} + +void hybrid_observables_cc::clean_history(std::deque& data) +{ + while(data.size() > 0) + { + if((T_rx_s - data.front().RX_time) > max_delta) { data.pop_front(); } + else { return; } + } +} + +unsigned int hybrid_observables_cc::find_closest(std::deque& data) +{ + unsigned int result = 0; + double delta_t = std::numeric_limits::max(); + std::deque::iterator it; + unsigned int aux = 0; + for(it = data.begin(); it != data.end(); it++) + { + double instant_delta = T_rx_s - it->RX_time; + if((instant_delta > 0) and (instant_delta < delta_t)) + { + delta_t = instant_delta; + result = aux; + } + aux++; + } + return result; +} + +double hybrid_observables_cc::find_min_RX_time() +{ + if(d_num_valid_channels == 0) { return 0.0; } + + std::vector>::iterator it = d_gnss_synchro_history.begin(); + double result = std::numeric_limits::max(); + for(unsigned int i = 0; i < d_nchannels; i++) + { + if(valid_channels[i]) + { + if(it->front().RX_time < result) { result = it->front().RX_time; } + } + it++; + } + return(floor(result * 1000.0) / 1000.0); +} + +void hybrid_observables_cc::correct_TOW_and_compute_prange(std::vector& data) +{ + double TOW_ref = std::numeric_limits::lowest(); + std::vector::iterator it; + for(it = data.begin(); it != data.end(); it++) + { + if(it->RX_time > TOW_ref) { TOW_ref = it->RX_time; } + } + for(it = data.begin(); it != data.end(); it++) + { + double traveltime_s = TOW_ref - it->RX_time + GPS_STARTOFFSET_ms / 1000.0; + it->RX_time = TOW_ref + GPS_STARTOFFSET_ms / 1000.0; + it->Pseudorange_m = traveltime_s * SPEED_OF_LIGHT; + } } @@ -414,35 +480,14 @@ int hybrid_observables_cc::general_work(int noutput_items __attribute__((unused) unsigned int i; int total_input_items = 0; for(i = 0; i < d_nchannels; i++) { total_input_items += ninput_items[i]; } - bool compute_output = false; + consume(d_nchannels, 1); ////////////////////////////////////////////////////////////////////////// - if((total_input_items == 0) and (ninput_items[d_nchannels] == 0)) + if((total_input_items == 0) and (d_num_valid_channels == 0)) { return 0; } - else if((total_input_items == 0) and (ninput_items[d_nchannels] > 0) and (d_num_valid_channels == 0)) - { - T_rx_s += T_rx_step_s; - consume(d_nchannels, 1); - return 0; - } - else if((total_input_items == 0) and (ninput_items[d_nchannels] > 0) and (d_num_valid_channels > 0)) - { - T_rx_s += T_rx_step_s; - compute_output = true; - consume(d_nchannels, 1); - } - else if((total_input_items > 0) and (ninput_items[d_nchannels] == 0)) - {} - else if((total_input_items > 0) and (ninput_items[d_nchannels] > 0)) - { - T_rx_s += T_rx_step_s; - compute_output = true; - consume(d_nchannels, 1); - } - else - {} + if(set_T_rx_s) { T_rx_s += T_rx_step_s; } ////////////////////////////////////////////////////////////////////////// @@ -450,45 +495,116 @@ int hybrid_observables_cc::general_work(int noutput_items __attribute__((unused) if (total_input_items > 0) { i = 0; - for (it = d_gnss_synchro_history.begin(); it != d_gnss_synchro_history.end(); it++) + for(it = d_gnss_synchro_history.begin(); it != d_gnss_synchro_history.end(); it++) { - if (ninput_items[i] > 0) + if(ninput_items[i] > 0) { for(int aux = 0; aux < ninput_items[i]; aux++) { - it->push_back(in[i][aux]); - it->at(it->size() - 1).RX_time = Hybrid_Compute_T_rx_s(in[i][aux]); + if(in[i][aux].Flag_valid_word) + { + it->push_back(in[i][aux]); + it->back().RX_time = compute_T_rx_s(in[i][aux]); + } } - consume(ninput_items[i], 1); + consume(i, ninput_items[i]); } - while(std::find(d_gnss_synchro_history.begin(), d_gnss_synchro_history.end(), Hybrid_compare_trx) != d_gnss_synchro_history.end()) - { - - } - if (it->size() > 2) { valid_channels[i] = true; } - else { valid_channels[i] = false; } i++; } } + for(i = 0; i < d_nchannels; i++) + { + if(d_gnss_synchro_history.at(i).size() > 2) { valid_channels[i] = true; } + else { valid_channels[i] = false; } + } d_num_valid_channels = valid_channels.count(); // Check if there is any valid channel after reading the new incoming Gnss_Synchro data - if(d_num_valid_channels == 0) { return 0; } + if(d_num_valid_channels == 0) + { + set_T_rx_s = false; + return 0; + } - for(i = 0; i < d_nchannels; i++) //Discard observables with T_rx higher than the extrapolation threshold + if(!set_T_rx_s) //Find the lowest RX_time among the valid observables in the history + { + T_rx_s = find_min_RX_time(); + set_T_rx_s = true; + } + + for(i = 0; i < d_nchannels; i++) //Discard observables with T_rx higher than the threshold { if(valid_channels[i]) { - double delta_t = T_rx_s - d_gnss_synchro_history.at(i).second.RX_time; - //std::cout << "Sat " << d_gnss_synchro_history.at(i).second.PRN << ". Dt = " << delta_t * 1000.0 <<". Rx 2 "<< d_gnss_synchro_history.at(i).second.RX_time<<". Rx 1 "<< d_gnss_synchro_history.at(i).first.RX_time< max_extrapol_time_s) - { valid_channels[i] = false; } + clean_history(d_gnss_synchro_history.at(i)); + if(d_gnss_synchro_history.at(i).size() < 2) { valid_channels[i] = false; } } } - d_num_valid_channels = valid_channels.count(); // Check if there is any valid channel after computing the time distance between the Gnss_Synchro data and the receiver time - if((d_num_valid_channels == 0) or !compute_output) { return 0; } + d_num_valid_channels = valid_channels.count(); + if(d_num_valid_channels == 0) + { + set_T_rx_s = false; + return 0; + } + std::vector epoch_data; + i = 0; + for(it = d_gnss_synchro_history.begin(); it != d_gnss_synchro_history.end(); it++) + { + if(valid_channels[i]) + { + unsigned int index_closest = find_closest(*it); + unsigned int index1; + unsigned int index2; + if(index_closest == (it->size() - 1)) + { + index1 = index_closest - 1; + index2 = index_closest; + } + else + { + index1 = index_closest; + index2 = index_closest + 1; + } + Gnss_Synchro interpolated_gnss_synchro = it->at(index1); + + interpolated_gnss_synchro.Carrier_Doppler_hz = interpolate_data( + std::pair(it->at(index2), it->at(index1)), T_rx_s, 0); + + interpolated_gnss_synchro.Carrier_phase_rads = interpolate_data( + std::pair(it->at(index2), it->at(index1)), T_rx_s, 1); + + interpolated_gnss_synchro.RX_time = interpolate_data( + std::pair(it->at(index2), it->at(index1)), T_rx_s, 2); + + //interpolated_gnss_synchro.Code_phase_samples = interpolate_data( + // std::pair(it->at(index2), it->at(index1)), T_rx_s, 3); + + epoch_data.push_back(interpolated_gnss_synchro); + } + i++; + } + + correct_TOW_and_compute_prange(epoch_data); + std::vector::iterator it2 = epoch_data.begin(); + for(i = 0; i < d_nchannels; i++) + { + if(valid_channels[i]) + { + out[i][0] = (*it2); + out[i][0].Flag_valid_pseudorange = true; + it2++; + } + else + { + out[i][0] = Gnss_Synchro(); + out[i][0].Flag_valid_pseudorange = false; + } + } + return 1; + + /* ANTONIO it = d_gnss_synchro_history.begin(); double TOW_ref = std::numeric_limits::max(); for(i = 0; i < d_nchannels; i++) @@ -520,6 +636,8 @@ int hybrid_observables_cc::general_work(int noutput_items __attribute__((unused) } return 1; + */ + /******************************* OLD ALGORITHM ********************************/ // const Gnss_Synchro** in = reinterpret_cast(&input_items[0]); // Get the input buffer pointer diff --git a/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.h b/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.h index 4d1119a35..ada7b3d47 100644 --- a/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.h +++ b/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.h @@ -35,7 +35,7 @@ #include #include -//#include //std::pair +#include //std::pair #include //std::vector #include #include @@ -64,14 +64,21 @@ private: friend hybrid_observables_cc_sptr hybrid_make_observables_cc(unsigned int nchannels_in, unsigned int nchannels_out, bool dump, std::string dump_filename); hybrid_observables_cc(unsigned int nchannels_in, unsigned int nchannels_out, bool dump, std::string dump_filename); + void clean_history(std::deque& data); + double compute_T_rx_s(const Gnss_Synchro& a); + double interpolate_data(const std::pair& a, const double& ti, int parameter); + double find_min_RX_time(); + unsigned int find_closest(std::deque& data); + void correct_TOW_and_compute_prange(std::vector& data); //Tracking observable history std::vector> d_gnss_synchro_history; boost::dynamic_bitset<> valid_channels; double T_rx_s; double T_rx_step_s; - double max_extrapol_time_s; + double max_delta; bool d_dump; + bool set_T_rx_s; unsigned int d_nchannels; unsigned int d_num_valid_channels; std::string d_dump_filename; diff --git a/src/algorithms/telemetry_decoder/gnuradio_blocks/galileo_e1b_telemetry_decoder_cc.cc b/src/algorithms/telemetry_decoder/gnuradio_blocks/galileo_e1b_telemetry_decoder_cc.cc index 5504f84cf..53ad564e8 100644 --- a/src/algorithms/telemetry_decoder/gnuradio_blocks/galileo_e1b_telemetry_decoder_cc.cc +++ b/src/algorithms/telemetry_decoder/gnuradio_blocks/galileo_e1b_telemetry_decoder_cc.cc @@ -108,7 +108,6 @@ galileo_e1b_telemetry_decoder_cc::galileo_e1b_telemetry_decoder_cc( gr::io_signature::make(1, 1, sizeof(Gnss_Synchro))) { set_max_noutput_items(1); - set_max_output_buffer(1); // Telemetry Bit transition synchronization port out this->message_port_register_out(pmt::mp("preamble_timestamp_s")); // Ephemeris data port out diff --git a/src/algorithms/telemetry_decoder/gnuradio_blocks/galileo_e5a_telemetry_decoder_cc.cc b/src/algorithms/telemetry_decoder/gnuradio_blocks/galileo_e5a_telemetry_decoder_cc.cc index 5e94348e6..174d6754d 100644 --- a/src/algorithms/telemetry_decoder/gnuradio_blocks/galileo_e5a_telemetry_decoder_cc.cc +++ b/src/algorithms/telemetry_decoder/gnuradio_blocks/galileo_e5a_telemetry_decoder_cc.cc @@ -184,7 +184,6 @@ galileo_e5a_telemetry_decoder_cc::galileo_e5a_telemetry_decoder_cc( gr::io_signature::make(1, 1, sizeof(Gnss_Synchro))) { set_max_noutput_items(1); - set_max_output_buffer(1); // Telemetry Bit transition synchronization port out this->message_port_register_out(pmt::mp("preamble_timestamp_s")); // Ephemeris data port out diff --git a/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_cc.cc b/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_cc.cc index 50adeed2d..79810f000 100644 --- a/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_cc.cc +++ b/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_cc.cc @@ -56,7 +56,6 @@ gps_l1_ca_telemetry_decoder_cc::gps_l1_ca_telemetry_decoder_cc( gr::io_signature::make(1, 1, sizeof(Gnss_Synchro))) { set_max_noutput_items(1); - set_max_output_buffer(1); // Telemetry Bit transition synchronization port out this->message_port_register_out(pmt::mp("preamble_timestamp_s")); // Ephemeris data port out diff --git a/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l2c_telemetry_decoder_cc.cc b/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l2c_telemetry_decoder_cc.cc index 1e000a009..e5f37423a 100644 --- a/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l2c_telemetry_decoder_cc.cc +++ b/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l2c_telemetry_decoder_cc.cc @@ -53,7 +53,6 @@ gps_l2c_telemetry_decoder_cc::gps_l2c_telemetry_decoder_cc( gr::io_signature::make(1, 1, sizeof(Gnss_Synchro))) { set_max_noutput_items(1); - set_max_output_buffer(1); // Telemetry Bit transition synchronization port out this->message_port_register_out(pmt::mp("preamble_timestamp_s")); // Ephemeris data port out diff --git a/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l5_telemetry_decoder_cc.cc b/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l5_telemetry_decoder_cc.cc index cd44ffad5..04c0890a6 100644 --- a/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l5_telemetry_decoder_cc.cc +++ b/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l5_telemetry_decoder_cc.cc @@ -55,7 +55,6 @@ gps_l5_telemetry_decoder_cc::gps_l5_telemetry_decoder_cc( gr::io_signature::make(1, 1, sizeof(Gnss_Synchro))) { set_max_noutput_items(1); - set_max_output_buffer(1); // Telemetry Bit transition synchronization port out this->message_port_register_out(pmt::mp("preamble_timestamp_s")); // Ephemeris data port out From 350821830706d210eb490aef863f1879f86bcf01 Mon Sep 17 00:00:00 2001 From: Antonio Ramos Date: Tue, 20 Feb 2018 10:58:56 +0100 Subject: [PATCH 07/61] Check PRN coherency in observables --- .../gnuradio_blocks/hybrid_observables_cc.cc | 89 +++---------------- 1 file changed, 11 insertions(+), 78 deletions(-) diff --git a/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc b/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc index f69eeee61..f8a8ae768 100644 --- a/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc +++ b/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc @@ -56,7 +56,6 @@ hybrid_observables_cc::hybrid_observables_cc(unsigned int nchannels_in, unsigned gr::io_signature::make(nchannels_out, nchannels_out, sizeof(Gnss_Synchro))) { set_max_noutput_items(1); - set_max_output_buffer(1); d_dump = dump; set_T_rx_s = false; d_nchannels = nchannels_out; @@ -335,76 +334,11 @@ double hybrid_observables_cc::compute_T_rx_s(const Gnss_Synchro& a) else { return 0.0; } } -/* -bool Hybrid_pairCompare_gnss_synchro_T_rx(const std::pair& a, const std::pair& b) -{ - if(a.second.Flag_valid_word and !b.second.Flag_valid_word) { return true; } - else if(!a.second.Flag_valid_word and b.second.Flag_valid_word) { return false; } - else if(!a.second.Flag_valid_word and !b.second.Flag_valid_word) {return false; } - else - { - return(Hybrid_Compute_T_rx_s(a.second) < Hybrid_Compute_T_rx_s(b.second)); - } -} - - -bool Hybrid_pairCompare_gnss_synchro_sample_counter(const std::pair& a, const std::pair& b) -{ - if(a.second.Flag_valid_word and !b.second.Flag_valid_word) { return true; } - else if(!a.second.Flag_valid_word and b.second.Flag_valid_word) { return false; } - else if(!a.second.Flag_valid_word and !b.second.Flag_valid_word) {return false; } - else - { - return(a.second.Tracking_sample_counter < b.second.Tracking_sample_counter); - } -} - - -bool Hybrid_valueCompare_gnss_synchro_sample_counter(const Gnss_Synchro& a, unsigned long int b) -{ - return(a.Tracking_sample_counter < b); -} - - -bool Hybrid_valueCompare_gnss_synchro_receiver_time(const Gnss_Synchro& a, double b) -{ - return((static_cast(a.Tracking_sample_counter) + static_cast(a.Code_phase_samples)) / static_cast(a.fs) ) < (b); -} - - -bool Hybrid_pairCompare_gnss_synchro_TOW(const std::pair& a, const std::pair& b) -{ - if(a.first.Flag_valid_word and !b.first.Flag_valid_word) { return true; } - else if(!a.first.Flag_valid_word and b.first.Flag_valid_word) { return false; } - else if(!a.first.Flag_valid_word and !b.first.Flag_valid_word) {return false; } - else - { - return(a.first.TOW_at_current_symbol_s < b.second.TOW_at_current_symbol_s); - } -} - - -bool Hybrid_valueCompare_gnss_synchro_d_TOW(const Gnss_Synchro& a, double b) -{ - return(a.TOW_at_current_symbol_s < b); -} -*/ void hybrid_observables_cc::forecast(int noutput_items __attribute__((unused)), gr_vector_int &ninput_items_required) { -// bool available_items = false; -// for(unsigned int i = 0; i < d_nchannels; i++) -// { -// ninput_items_required[i] = 0; -// if(detail()->input(i)->items_available() > 0) { available_items = true; } -// } -// if(available_items) { ninput_items_required[d_nchannels] = 0; } -// else { ninput_items_required[d_nchannels] = 1; } - for(unsigned int i = 0; i < d_nchannels; i++) - { - ninput_items_required[i] = 0; - } + for(unsigned int i = 0; i < d_nchannels; i++) { ninput_items_required[i] = 0; } ninput_items_required[d_nchannels] = 1; } @@ -499,12 +433,18 @@ int hybrid_observables_cc::general_work(int noutput_items __attribute__((unused) { if(ninput_items[i] > 0) { + // Add the new Gnss_Synchros to their corresponding deque for(int aux = 0; aux < ninput_items[i]; aux++) { if(in[i][aux].Flag_valid_word) { it->push_back(in[i][aux]); it->back().RX_time = compute_T_rx_s(in[i][aux]); + // Check if the last Gnss_Synchro comes from the same satellite as the previous ones + if(it->size() > 1) + { + if(it->front().PRN != it->back().PRN) { it->clear(); } + } } } consume(i, ninput_items[i]); @@ -568,18 +508,11 @@ int hybrid_observables_cc::general_work(int noutput_items __attribute__((unused) index2 = index_closest + 1; } Gnss_Synchro interpolated_gnss_synchro = it->at(index1); + std::pair gnss_pair(it->at(index2), it->at(index1)); - interpolated_gnss_synchro.Carrier_Doppler_hz = interpolate_data( - std::pair(it->at(index2), it->at(index1)), T_rx_s, 0); - - interpolated_gnss_synchro.Carrier_phase_rads = interpolate_data( - std::pair(it->at(index2), it->at(index1)), T_rx_s, 1); - - interpolated_gnss_synchro.RX_time = interpolate_data( - std::pair(it->at(index2), it->at(index1)), T_rx_s, 2); - - //interpolated_gnss_synchro.Code_phase_samples = interpolate_data( - // std::pair(it->at(index2), it->at(index1)), T_rx_s, 3); + interpolated_gnss_synchro.Carrier_Doppler_hz = interpolate_data(gnss_pair, T_rx_s, 0); + interpolated_gnss_synchro.Carrier_phase_rads = interpolate_data(gnss_pair, T_rx_s, 1); + interpolated_gnss_synchro.RX_time = interpolate_data(gnss_pair, T_rx_s, 2); epoch_data.push_back(interpolated_gnss_synchro); } From 832f828d52754d8baf688c7a933986941720f0c8 Mon Sep 17 00:00:00 2001 From: Antonio Ramos Date: Tue, 20 Feb 2018 11:17:41 +0100 Subject: [PATCH 08/61] Clean code --- .../gnuradio_blocks/hybrid_observables_cc.cc | 350 ++---------------- 1 file changed, 34 insertions(+), 316 deletions(-) diff --git a/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc b/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc index f8a8ae768..3984bb2f8 100644 --- a/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc +++ b/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc @@ -95,19 +95,19 @@ hybrid_observables_cc::hybrid_observables_cc(unsigned int nchannels_in, unsigned hybrid_observables_cc::~hybrid_observables_cc() { if (d_dump_file.is_open()) + { + try { d_dump_file.close(); } + catch(const std::exception & ex) { - try { d_dump_file.close(); } - catch(const std::exception & ex) - { - LOG(WARNING) << "Exception in destructor closing the dump file " << ex.what(); - } + LOG(WARNING) << "Exception in destructor closing the dump file " << ex.what(); } + } if(d_dump) - { - std::cout << "Writing observables .mat files ..."; - save_matfile(); - std::cout << " done." << std::endl; - } + { + std::cout << "Writing observables .mat files ..."; + save_matfile(); + std::cout << " done." << std::endl; + } } @@ -535,317 +535,35 @@ int hybrid_observables_cc::general_work(int noutput_items __attribute__((unused) out[i][0].Flag_valid_pseudorange = false; } } - return 1; - - /* ANTONIO - it = d_gnss_synchro_history.begin(); - double TOW_ref = std::numeric_limits::max(); - for(i = 0; i < d_nchannels; i++) + if(d_dump) { - if(!valid_channels[i]) { out[i][0] = Gnss_Synchro(); } - else + // MULTIPLEXED FILE RECORDING - Record results to file + try { - out[i][0] = it->first; - out[i][0].Flag_valid_pseudorange = true; - out[i][0].Carrier_Doppler_hz = Hybrid_Interpolate_data(*it, T_rx_s, 0); - out[i][0].Carrier_phase_rads = Hybrid_Interpolate_data(*it, T_rx_s, 1); - out[i][0].RX_time = Hybrid_Interpolate_data(*it, T_rx_s, 2); - out[i][0].Code_phase_samples = Hybrid_Interpolate_data(*it, T_rx_s, 3); - //std::cout<<"T2: "<< it->first.RX_time<<". T1: "<< it->second.RX_time <<" T i: " << T_rx_s <first.Carrier_Doppler_hz<<","<< it->second.Carrier_Doppler_hz<<" Doppler interp: " << out[i][0].Carrier_Doppler_hz <(&tmp_double), sizeof(double)); + tmp_double = out[i][0].TOW_at_current_symbol_s; + d_dump_file.write(reinterpret_cast(&tmp_double), sizeof(double)); + tmp_double = out[i][0].Carrier_Doppler_hz; + d_dump_file.write(reinterpret_cast(&tmp_double), sizeof(double)); + tmp_double = out[i][0].Carrier_phase_rads / GPS_TWO_PI; + d_dump_file.write(reinterpret_cast(&tmp_double), sizeof(double)); + tmp_double = out[i][0].Pseudorange_m; + d_dump_file.write(reinterpret_cast(&tmp_double), sizeof(double)); + tmp_double = static_cast(out[i][0].PRN); + d_dump_file.write(reinterpret_cast(&tmp_double), sizeof(double)); + tmp_double = static_cast(out[i][0].Flag_valid_pseudorange); + d_dump_file.write(reinterpret_cast(&tmp_double), sizeof(double)); + } } - it++; - } - for(i = 0; i < d_nchannels; i++) - { - if(valid_channels[i]) + catch (const std::ifstream::failure& e) { - double traveltime_ms = (out[i][0].RX_time - TOW_ref) * 1000.0 + GPS_STARTOFFSET_ms; - out[i][0].Pseudorange_m = traveltime_ms * GPS_C_m_ms; - out[i][0].RX_time = TOW_ref + GPS_STARTOFFSET_ms / 1000.0; - //std::cout << "Sat " << out[i][0].PRN << ". Prang = " << out[i][0].Pseudorange_m << ". TOW = " << out[i][0].RX_time << std::endl; + LOG(WARNING) << "Exception writing observables dump file " << e.what(); + d_dump = false; } } return 1; - - */ - - /******************************* OLD ALGORITHM ********************************/ - -// const Gnss_Synchro** in = reinterpret_cast(&input_items[0]); // Get the input buffer pointer -// Gnss_Synchro** out = reinterpret_cast(&output_items[0]); // Get the output buffer pointer -// int n_outputs = 0; -// int n_consume[d_nchannels]; -// double past_history_s = 100e-3; -// -// Gnss_Synchro current_gnss_synchro[d_nchannels]; -// Gnss_Synchro aux = Gnss_Synchro(); -// for(unsigned int i = 0; i < d_nchannels; i++) -// { -// current_gnss_synchro[i] = aux; -// } -// /* -// * 1. Read the GNSS SYNCHRO objects from available channels. -// * Multi-rate GNURADIO Block. Read how many input items are avaliable in each channel -// * Record all synchronization data into queues -// */ -// for (unsigned int i = 0; i < d_nchannels; i++) -// { -// n_consume[i] = ninput_items[i]; // full throttle -// for(int j = 0; j < n_consume[i]; j++) -// { -// d_gnss_synchro_history_queue[i].push_back(in[i][j]); -// } -// } -// -// bool channel_history_ok; -// -// do -// { -// -// try -// { -// -// channel_history_ok = true; -// for(unsigned int i = 0; i < d_nchannels; i++) -// { -// if (d_gnss_synchro_history_queue.at(i).size() < history_deep && !d_gnss_synchro_history_queue.at(i).empty()) -// { -// channel_history_ok = false; -// } -// } -// if (channel_history_ok == true) -// { -// std::map::const_iterator gnss_synchro_map_iter; -// std::deque::const_iterator gnss_synchro_deque_iter; -// -// // 1. If the RX time is not set, set the Rx time -// if (T_rx_s == 0) -// { -// // 0. Read a gnss_synchro snapshot from the queue and store it in a map -// std::map gnss_synchro_map; -// for (unsigned int i = 0; i < d_nchannels; i++) -// { -// if (!d_gnss_synchro_history_queue.at(i).empty()) -// { -// gnss_synchro_map.insert(std::pair(d_gnss_synchro_history_queue.at(i).front().Channel_ID, -// d_gnss_synchro_history_queue.at(i).front())); -// } -// } -// if(gnss_synchro_map.empty()) { break; } // Breaks the do-while loop -// -// gnss_synchro_map_iter = std::min_element(gnss_synchro_map.cbegin(), -// gnss_synchro_map.cend(), -// Hybrid_pairCompare_gnss_synchro_sample_counter); -// T_rx_s = static_cast(gnss_synchro_map_iter->second.Tracking_sample_counter) / static_cast(gnss_synchro_map_iter->second.fs); -// T_rx_s = floor(T_rx_s * 1000.0) / 1000.0; // truncate to ms -// T_rx_s += past_history_s; // increase T_rx to have a minimum past history to interpolate -// } -// -// // 2. Realign RX time in all valid channels -// std::map realigned_gnss_synchro_map; // container for the aligned set of observables for the selected T_rx -// std::map adjacent_gnss_synchro_map; // container for the previous observable values to interpolate -// // shift channels history to match the reference TOW -// for (unsigned int i = 0; i < d_nchannels; i++) -// { -// if (!d_gnss_synchro_history_queue.at(i).empty()) -// { -// gnss_synchro_deque_iter = std::lower_bound(d_gnss_synchro_history_queue.at(i).cbegin(), -// d_gnss_synchro_history_queue.at(i).cend(), -// T_rx_s, -// Hybrid_valueCompare_gnss_synchro_receiver_time); -// if (gnss_synchro_deque_iter != d_gnss_synchro_history_queue.at(i).cend()) -// { -// if (gnss_synchro_deque_iter->Flag_valid_word == true) -// { -// double T_rx_channel = static_cast(gnss_synchro_deque_iter->Tracking_sample_counter) / static_cast(gnss_synchro_deque_iter->fs); -// double delta_T_rx_s = T_rx_channel - T_rx_s; -// -// // check that T_rx difference is less than a threshold (the correlation interval) -// if (delta_T_rx_s * 1000.0 < static_cast(gnss_synchro_deque_iter->correlation_length_ms)) -// { -// // record the word structure in a map for pseudorange computation -// // save the previous observable -// int distance = std::distance(d_gnss_synchro_history_queue.at(i).cbegin(), gnss_synchro_deque_iter); -// if (distance > 0) -// { -// if (d_gnss_synchro_history_queue.at(i).at(distance - 1).Flag_valid_word) -// { -// double T_rx_channel_prev = static_cast(d_gnss_synchro_history_queue.at(i).at(distance - 1).Tracking_sample_counter) / static_cast(gnss_synchro_deque_iter->fs); -// double delta_T_rx_s_prev = T_rx_channel_prev - T_rx_s; -// if (fabs(delta_T_rx_s_prev) < fabs(delta_T_rx_s)) -// { -// realigned_gnss_synchro_map.insert(std::pair(d_gnss_synchro_history_queue.at(i).at(distance - 1).Channel_ID, -// d_gnss_synchro_history_queue.at(i).at(distance - 1))); -// adjacent_gnss_synchro_map.insert(std::pair(gnss_synchro_deque_iter->Channel_ID, *gnss_synchro_deque_iter)); -// } -// else -// { -// realigned_gnss_synchro_map.insert(std::pair(gnss_synchro_deque_iter->Channel_ID, *gnss_synchro_deque_iter)); -// adjacent_gnss_synchro_map.insert(std::pair(d_gnss_synchro_history_queue.at(i).at(distance - 1).Channel_ID, -// d_gnss_synchro_history_queue.at(i).at(distance - 1))); -// } -// } -// -// } -// else -// { -// realigned_gnss_synchro_map.insert(std::pair(gnss_synchro_deque_iter->Channel_ID, *gnss_synchro_deque_iter)); -// } -// -// } -// } -// } -// } -// } -// -// if(!realigned_gnss_synchro_map.empty()) -// { -// /* -// * 2.1 Use CURRENT set of measurements and find the nearest satellite -// * common RX time algorithm -// */ -// // what is the most recent symbol TOW in the current set? -> this will be the reference symbol -// gnss_synchro_map_iter = std::max_element(realigned_gnss_synchro_map.cbegin(), -// realigned_gnss_synchro_map.cend(), -// Hybrid_pairCompare_gnss_synchro_d_TOW); -// double ref_fs_hz = static_cast(gnss_synchro_map_iter->second.fs); -// -// // compute interpolated TOW value at T_rx_s -// int ref_channel_key = gnss_synchro_map_iter->second.Channel_ID; -// Gnss_Synchro adj_obs; -// adj_obs = adjacent_gnss_synchro_map.at(ref_channel_key); -// double ref_adj_T_rx_s = static_cast(adj_obs.Tracking_sample_counter) / ref_fs_hz + adj_obs.Code_phase_samples / ref_fs_hz; -// -// double d_TOW_reference = gnss_synchro_map_iter->second.TOW_at_current_symbol_s; -// double d_ref_T_rx_s = static_cast(gnss_synchro_map_iter->second.Tracking_sample_counter) / ref_fs_hz + gnss_synchro_map_iter->second.Code_phase_samples / ref_fs_hz; -// -// double selected_T_rx_s = T_rx_s; -// // two points linear interpolation using adjacent (adj) values: y=y1+(x-x1)*(y2-y1)/(x2-x1) -// double ref_TOW_at_T_rx_s = adj_obs.TOW_at_current_symbol_s + -// (selected_T_rx_s - ref_adj_T_rx_s) * (d_TOW_reference - adj_obs.TOW_at_current_symbol_s) / (d_ref_T_rx_s - ref_adj_T_rx_s); -// -// // Now compute RX time differences due to the PRN alignment in the correlators -// double traveltime_ms; -// double pseudorange_m; -// double channel_T_rx_s; -// double channel_fs_hz; -// double channel_TOW_s; -// for(gnss_synchro_map_iter = realigned_gnss_synchro_map.cbegin(); gnss_synchro_map_iter != realigned_gnss_synchro_map.cend(); gnss_synchro_map_iter++) -// { -// channel_fs_hz = static_cast(gnss_synchro_map_iter->second.fs); -// channel_TOW_s = gnss_synchro_map_iter->second.TOW_at_current_symbol_s; -// channel_T_rx_s = static_cast(gnss_synchro_map_iter->second.Tracking_sample_counter) / channel_fs_hz + gnss_synchro_map_iter->second.Code_phase_samples / channel_fs_hz; -// // compute interpolated observation values -// // two points linear interpolation using adjacent (adj) values: y=y1+(x-x1)*(y2-y1)/(x2-x1) -// // TOW at the selected receiver time T_rx_s -// int element_key = gnss_synchro_map_iter->second.Channel_ID; -// adj_obs = adjacent_gnss_synchro_map.at(element_key); -// -// double adj_T_rx_s = static_cast(adj_obs.Tracking_sample_counter) / channel_fs_hz + adj_obs.Code_phase_samples / channel_fs_hz; -// -// double channel_TOW_at_T_rx_s = adj_obs.TOW_at_current_symbol_s + (selected_T_rx_s - adj_T_rx_s) * (channel_TOW_s - adj_obs.TOW_at_current_symbol_s) / (channel_T_rx_s - adj_T_rx_s); -// -// // Doppler and Accumulated carrier phase -// double Carrier_phase_lin_rads = adj_obs.Carrier_phase_rads + (selected_T_rx_s - adj_T_rx_s) * (gnss_synchro_map_iter->second.Carrier_phase_rads - adj_obs.Carrier_phase_rads) / (channel_T_rx_s - adj_T_rx_s); -// double Carrier_Doppler_lin_hz = adj_obs.Carrier_Doppler_hz + (selected_T_rx_s - adj_T_rx_s) * (gnss_synchro_map_iter->second.Carrier_Doppler_hz - adj_obs.Carrier_Doppler_hz) / (channel_T_rx_s - adj_T_rx_s); -// -// // compute the pseudorange (no rx time offset correction) -// traveltime_ms = (ref_TOW_at_T_rx_s - channel_TOW_at_T_rx_s) * 1000.0 + GPS_STARTOFFSET_ms; -// // convert to meters -// pseudorange_m = traveltime_ms * GPS_C_m_ms; // [m] -// // update the pseudorange object -// current_gnss_synchro[gnss_synchro_map_iter->second.Channel_ID] = gnss_synchro_map_iter->second; -// current_gnss_synchro[gnss_synchro_map_iter->second.Channel_ID].Pseudorange_m = pseudorange_m; -// current_gnss_synchro[gnss_synchro_map_iter->second.Channel_ID].Flag_valid_pseudorange = true; -// // Save the estimated RX time (no RX clock offset correction yet!) -// current_gnss_synchro[gnss_synchro_map_iter->second.Channel_ID].RX_time = ref_TOW_at_T_rx_s + GPS_STARTOFFSET_ms / 1000.0; -// -// current_gnss_synchro[gnss_synchro_map_iter->second.Channel_ID].Carrier_phase_rads = Carrier_phase_lin_rads; -// current_gnss_synchro[gnss_synchro_map_iter->second.Channel_ID].Carrier_Doppler_hz = Carrier_Doppler_lin_hz; -// } -// -// if(d_dump == true) -// { -// // MULTIPLEXED FILE RECORDING - Record results to file -// try -// { -// double tmp_double; -// for (unsigned int i = 0; i < d_nchannels; i++) -// { -// tmp_double = current_gnss_synchro[i].RX_time; -// d_dump_file.write(reinterpret_cast(&tmp_double), sizeof(double)); -// tmp_double = current_gnss_synchro[i].TOW_at_current_symbol_s; -// d_dump_file.write(reinterpret_cast(&tmp_double), sizeof(double)); -// tmp_double = current_gnss_synchro[i].Carrier_Doppler_hz; -// d_dump_file.write(reinterpret_cast(&tmp_double), sizeof(double)); -// tmp_double = current_gnss_synchro[i].Carrier_phase_rads / GPS_TWO_PI; -// d_dump_file.write(reinterpret_cast(&tmp_double), sizeof(double)); -// tmp_double = current_gnss_synchro[i].Pseudorange_m; -// d_dump_file.write(reinterpret_cast(&tmp_double), sizeof(double)); -// tmp_double = current_gnss_synchro[i].PRN; -// d_dump_file.write(reinterpret_cast(&tmp_double), sizeof(double)); -// tmp_double = static_cast(current_gnss_synchro[i].Flag_valid_pseudorange); -// d_dump_file.write(reinterpret_cast(&tmp_double), sizeof(double)); -// } -// } -// catch (const std::ifstream::failure& e) -// { -// LOG(WARNING) << "Exception writing observables dump file " << e.what(); -// d_dump = false; -// } -// } -// -// for (unsigned int i = 0; i < d_nchannels; i++) -// { -// out[i][n_outputs] = current_gnss_synchro[i]; -// } -// -// n_outputs++; -// } -// -// // Move RX time -// T_rx_s += T_rx_step_s; -// // pop old elements from queue -// for (unsigned int i = 0; i < d_nchannels; i++) -// { -// if (!d_gnss_synchro_history_queue.at(i).empty()) -// { -// while (static_cast(d_gnss_synchro_history_queue.at(i).front().Tracking_sample_counter) / static_cast(d_gnss_synchro_history_queue.at(i).front().fs) < (T_rx_s - past_history_s)) -// { -// d_gnss_synchro_history_queue.at(i).pop_front(); -// } -// } -// } -// } -// -// }// End of try{...} -// catch(const std::out_of_range& e) -// { -// LOG(WARNING) << "Out of range exception thrown by Hybrid Observables block. Exception message: " << e.what(); -// std::cout << "Out of range exception thrown by Hybrid Observables block. Exception message: " << e.what() << std::endl; -// return gr::block::WORK_DONE; -// } -// catch(const std::exception& e) -// { -// LOG(WARNING) << "Exception thrown by Hybrid Observables block. Exception message: " << e.what(); -// std::cout << "Exception thrown by Hybrid Observables block. Exception message: " << e.what() << std::endl; -// return gr::block::WORK_DONE; -// } -// -// }while(channel_history_ok == true && noutput_items > n_outputs); -// -// // Multi-rate consume! -// for (unsigned int i = 0; i < d_nchannels; i++) -// { -// consume(i, n_consume[i]); // which input, how many items -// } -// -// //consume monitor channel always -// consume(d_nchannels, 1); -// return n_outputs; -// -// } - From cc178495c99e2ff281f47fd54c88e44a948daab4 Mon Sep 17 00:00:00 2001 From: Antonio Ramos Date: Tue, 20 Feb 2018 11:28:34 +0100 Subject: [PATCH 09/61] Modify authors --- .../observables/gnuradio_blocks/hybrid_observables_cc.cc | 5 +++-- .../observables/gnuradio_blocks/hybrid_observables_cc.h | 7 ++++--- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc b/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc index 3984bb2f8..7654a019b 100644 --- a/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc +++ b/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc @@ -1,11 +1,12 @@ /*! * \file hybrid_observables_cc.cc - * \brief Implementation of the pseudorange computation block for Galileo E1 + * \brief Implementation of the pseudorange computation block * \author Javier Arribas 2017. jarribas(at)cttc.es + * \author Antonio Ramos 2018. antonio.ramos(at)cttc.es * * ------------------------------------------------------------------------- * - * Copyright (C) 2010-2015 (see AUTHORS file for a list of contributors) + * Copyright (C) 2010-2018 (see AUTHORS file for a list of contributors) * * GNSS-SDR is a software defined Global Navigation * Satellite Systems receiver diff --git a/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.h b/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.h index ada7b3d47..c3692b24b 100644 --- a/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.h +++ b/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.h @@ -1,12 +1,13 @@ /*! * \file hybrid_observables_cc.h - * \brief Interface of the observables computation block for Galileo E1 + * \brief Interface of the observables computation block * \author Mara Branzanti 2013. mara.branzanti(at)gmail.com * \author Javier Arribas 2013. jarribas(at)cttc.es + * \author Antonio Ramos 2018. antonio.ramos(at)cttc.es * * ------------------------------------------------------------------------- * - * Copyright (C) 2010-2015 (see AUTHORS file for a list of contributors) + * Copyright (C) 2010-2018 (see AUTHORS file for a list of contributors) * * GNSS-SDR is a software defined Global Navigation * Satellite Systems receiver @@ -51,7 +52,7 @@ hybrid_observables_cc_sptr hybrid_make_observables_cc(unsigned int nchannels_in, unsigned int nchannels_out, bool dump, std::string dump_filename); /*! - * \brief This class implements a block that computes Galileo observables + * \brief This class implements a block that computes observables */ class hybrid_observables_cc : public gr::block { From dfb5f1118cc379eb2eb1f8edc19f86fb666f8bdf Mon Sep 17 00:00:00 2001 From: Antonio Ramos Date: Tue, 20 Feb 2018 15:44:45 +0100 Subject: [PATCH 10/61] Fix unit tests --- src/core/receiver/gnss_flowgraph.cc | 6 ++++++ src/tests/unit-tests/control-plane/control_thread_test.cc | 3 +++ src/tests/unit-tests/control-plane/gnss_flowgraph_test.cc | 7 ++++--- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/core/receiver/gnss_flowgraph.cc b/src/core/receiver/gnss_flowgraph.cc index e8c9798bf..a8be2a89f 100644 --- a/src/core/receiver/gnss_flowgraph.cc +++ b/src/core/receiver/gnss_flowgraph.cc @@ -253,6 +253,12 @@ void GNSSFlowgraph::connect() try { double fs = static_cast(configuration_->property("GNSS-SDR.internal_fs_sps", 0)); + if(fs == 0.0) + { + LOG(WARNING) << "Set GNSS-SDR.internal_fs_sps in configuration file"; + std::cout << "Set GNSS-SDR.internal_fs_sps in configuration file" << std::endl; + throw(std::invalid_argument("Set GNSS-SDR.internal_fs_sps in configuration")); + } ch_out_sample_counter = gnss_sdr_make_sample_counter(fs); top_block_->connect(sig_conditioner_.at(0)->get_right_block(), 0, ch_out_sample_counter, 0); top_block_->connect(ch_out_sample_counter, 0, observables_->get_left_block(), channels_count_); //extra port for the sample counter pulse diff --git a/src/tests/unit-tests/control-plane/control_thread_test.cc b/src/tests/unit-tests/control-plane/control_thread_test.cc index ac3f00bff..a8fdd0d9d 100644 --- a/src/tests/unit-tests/control-plane/control_thread_test.cc +++ b/src/tests/unit-tests/control-plane/control_thread_test.cc @@ -114,6 +114,7 @@ TEST_F(ControlThreadTest, InstantiateRunControlMessages) config->set_property("Observables.item_type", "gr_complex"); config->set_property("PVT.implementation", "RTKLIB_PVT"); config->set_property("PVT.item_type", "gr_complex"); + config->set_property("GNSS-SDR.internal_fs_sps", "4000000"); std::shared_ptr control_thread = std::make_shared(config); @@ -174,6 +175,7 @@ TEST_F(ControlThreadTest, InstantiateRunControlMessages2) config->set_property("Observables.item_type", "gr_complex"); config->set_property("PVT.implementation", "RTKLIB_PVT"); config->set_property("PVT.item_type", "gr_complex"); + config->set_property("GNSS-SDR.internal_fs_sps", "4000000"); std::unique_ptr control_thread2(new ControlThread(config)); @@ -238,6 +240,7 @@ TEST_F(ControlThreadTest, StopReceiverProgrammatically) config->set_property("Observables.item_type", "gr_complex"); config->set_property("PVT.implementation", "RTKLIB_PVT"); config->set_property("PVT.item_type", "gr_complex"); + config->set_property("GNSS-SDR.internal_fs_sps", "4000000"); std::shared_ptr control_thread = std::make_shared(config); gr::msg_queue::sptr control_queue = gr::msg_queue::make(0); diff --git a/src/tests/unit-tests/control-plane/gnss_flowgraph_test.cc b/src/tests/unit-tests/control-plane/gnss_flowgraph_test.cc index 8c31aaca2..63e184766 100644 --- a/src/tests/unit-tests/control-plane/gnss_flowgraph_test.cc +++ b/src/tests/unit-tests/control-plane/gnss_flowgraph_test.cc @@ -49,6 +49,7 @@ TEST(GNSSFlowgraph, InstantiateConnectStartStopOldNotation) std::shared_ptr config = std::make_shared(); config->set_property("GNSS-SDR.SUPL_gps_enabled", "false"); + config->set_property("GNSS-SDR.internal_fs_sps", "4000000"); config->set_property("SignalSource.sampling_frequency", "4000000"); config->set_property("SignalSource.implementation", "File_Signal_Source"); config->set_property("SignalSource.item_type", "gr_complex"); @@ -82,7 +83,7 @@ TEST(GNSSFlowgraph, InstantiateConnectStartStopOldNotation) TEST(GNSSFlowgraph, InstantiateConnectStartStop) { std::shared_ptr config = std::make_shared(); - + config->set_property("GNSS-SDR.internal_fs_sps", "4000000"); config->set_property("SignalSource.sampling_frequency", "4000000"); config->set_property("SignalSource.implementation", "File_Signal_Source"); config->set_property("SignalSource.item_type", "gr_complex"); @@ -116,7 +117,7 @@ TEST(GNSSFlowgraph, InstantiateConnectStartStop) TEST(GNSSFlowgraph, InstantiateConnectStartStopGalileoE1B) { std::shared_ptr config = std::make_shared(); - + config->set_property("GNSS-SDR.internal_fs_sps", "4000000"); config->set_property("SignalSource.sampling_frequency", "4000000"); config->set_property("SignalSource.implementation", "File_Signal_Source"); config->set_property("SignalSource.item_type", "gr_complex"); @@ -151,7 +152,7 @@ TEST(GNSSFlowgraph, InstantiateConnectStartStopGalileoE1B) TEST(GNSSFlowgraph, InstantiateConnectStartStopHybrid) { std::shared_ptr config = std::make_shared(); - + config->set_property("GNSS-SDR.internal_fs_sps", "4000000"); config->set_property("SignalSource.sampling_frequency", "4000000"); config->set_property("SignalSource.implementation", "File_Signal_Source"); config->set_property("SignalSource.item_type", "gr_complex"); From c793b47181c6b7fa43d37a505f94447c779148fe Mon Sep 17 00:00:00 2001 From: Antonio Ramos Date: Wed, 21 Feb 2018 10:41:33 +0100 Subject: [PATCH 11/61] Interpolate TOW_at_current_symbol in observables block --- .../observables/gnuradio_blocks/hybrid_observables_cc.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc b/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc index 7654a019b..be350f859 100644 --- a/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc +++ b/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc @@ -514,6 +514,7 @@ int hybrid_observables_cc::general_work(int noutput_items __attribute__((unused) interpolated_gnss_synchro.Carrier_Doppler_hz = interpolate_data(gnss_pair, T_rx_s, 0); interpolated_gnss_synchro.Carrier_phase_rads = interpolate_data(gnss_pair, T_rx_s, 1); interpolated_gnss_synchro.RX_time = interpolate_data(gnss_pair, T_rx_s, 2); + interpolated_gnss_synchro.TOW_at_current_symbol_s = interpolated_gnss_synchro.RX_time; epoch_data.push_back(interpolated_gnss_synchro); } From 281687615ad11c926d0dfbd7409530b05c221df6 Mon Sep 17 00:00:00 2001 From: Antonio Ramos Date: Wed, 21 Feb 2018 10:59:53 +0100 Subject: [PATCH 12/61] Set observables history to 100 ms --- .../observables/gnuradio_blocks/hybrid_observables_cc.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc b/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc index be350f859..db02f4856 100644 --- a/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc +++ b/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc @@ -63,7 +63,7 @@ hybrid_observables_cc::hybrid_observables_cc(unsigned int nchannels_in, unsigned d_dump_filename = dump_filename; T_rx_s = 0.0; T_rx_step_s = 0.001; // 1 ms - max_delta = 0.05; // 50 ms + max_delta = 0.1; // 100 ms valid_channels.resize(d_nchannels, false); d_num_valid_channels = 0; From 5da7a83eeb292ed934c0e7346af09dcd6580876e Mon Sep 17 00:00:00 2001 From: Antonio Ramos Date: Wed, 21 Feb 2018 11:28:35 +0100 Subject: [PATCH 13/61] Correct interpolation indexes --- .../observables/gnuradio_blocks/hybrid_observables_cc.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc b/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc index db02f4856..8deb9746b 100644 --- a/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc +++ b/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc @@ -498,15 +498,15 @@ int hybrid_observables_cc::general_work(int noutput_items __attribute__((unused) unsigned int index_closest = find_closest(*it); unsigned int index1; unsigned int index2; - if(index_closest == (it->size() - 1)) + if(index_closest > 0) { index1 = index_closest - 1; index2 = index_closest; } else { - index1 = index_closest; - index2 = index_closest + 1; + index1 = 0; + index2 = 1; } Gnss_Synchro interpolated_gnss_synchro = it->at(index1); std::pair gnss_pair(it->at(index2), it->at(index1)); From 98cde6583238f0c8c23ff8595c45d8c31e5024bd Mon Sep 17 00:00:00 2001 From: Antonio Ramos Date: Wed, 21 Feb 2018 12:56:44 +0100 Subject: [PATCH 14/61] Improved find_closest algorithm in observables --- .../gnuradio_blocks/hybrid_observables_cc.cc | 44 ++++++++++--------- .../gnuradio_blocks/hybrid_observables_cc.h | 2 +- 2 files changed, 25 insertions(+), 21 deletions(-) diff --git a/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc b/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc index 8deb9746b..92a308356 100644 --- a/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc +++ b/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc @@ -352,22 +352,39 @@ void hybrid_observables_cc::clean_history(std::deque& data) } } -unsigned int hybrid_observables_cc::find_closest(std::deque& data) +std::pair hybrid_observables_cc::find_closest(std::deque& data) { - unsigned int result = 0; + std::pair result; + unsigned int index = 0; double delta_t = std::numeric_limits::max(); std::deque::iterator it; unsigned int aux = 0; for(it = data.begin(); it != data.end(); it++) { - double instant_delta = T_rx_s - it->RX_time; - if((instant_delta > 0) and (instant_delta < delta_t)) + double instant_delta = std::fabs(T_rx_s - it->RX_time); + if(instant_delta < delta_t) { delta_t = instant_delta; - result = aux; + index = aux; } aux++; } + delta_t = T_rx_s - data.at(index).RX_time; + if((index == (data.size() - 1)) or (delta_t < 0.0)) + { + result.first = data.at(index); + result.second = data.at(index - 1); + } + else if(index == 0) + { + result.first = data.at(1); + result.second = data.at(0); + } + else + { + result.first = data.at(index + 1); + result.second = data.at(index); + } return result; } @@ -495,21 +512,8 @@ int hybrid_observables_cc::general_work(int noutput_items __attribute__((unused) { if(valid_channels[i]) { - unsigned int index_closest = find_closest(*it); - unsigned int index1; - unsigned int index2; - if(index_closest > 0) - { - index1 = index_closest - 1; - index2 = index_closest; - } - else - { - index1 = 0; - index2 = 1; - } - Gnss_Synchro interpolated_gnss_synchro = it->at(index1); - std::pair gnss_pair(it->at(index2), it->at(index1)); + std::pair gnss_pair = find_closest(*it); + Gnss_Synchro interpolated_gnss_synchro = gnss_pair.second; interpolated_gnss_synchro.Carrier_Doppler_hz = interpolate_data(gnss_pair, T_rx_s, 0); interpolated_gnss_synchro.Carrier_phase_rads = interpolate_data(gnss_pair, T_rx_s, 1); diff --git a/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.h b/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.h index c3692b24b..13a8e70cd 100644 --- a/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.h +++ b/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.h @@ -69,7 +69,7 @@ private: double compute_T_rx_s(const Gnss_Synchro& a); double interpolate_data(const std::pair& a, const double& ti, int parameter); double find_min_RX_time(); - unsigned int find_closest(std::deque& data); + std::pair find_closest(std::deque& data); void correct_TOW_and_compute_prange(std::vector& data); //Tracking observable history From a2eaf403fffea1150d5a486929023a7d4752166b Mon Sep 17 00:00:00 2001 From: Antonio Ramos Date: Wed, 21 Feb 2018 13:12:45 +0100 Subject: [PATCH 15/61] Avoid acces to a out of range value --- .../gnuradio_blocks/hybrid_observables_cc.cc | 33 ++++++++++++------- 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc b/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc index 92a308356..19b0e89ba 100644 --- a/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc +++ b/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc @@ -369,21 +369,30 @@ std::pair hybrid_observables_cc::find_closest(std::d } aux++; } - delta_t = T_rx_s - data.at(index).RX_time; - if((index == (data.size() - 1)) or (delta_t < 0.0)) + try { - result.first = data.at(index); - result.second = data.at(index - 1); + delta_t = T_rx_s - data.at(index).RX_time; + if(index == 0) + { + result.first = data.at(1); + result.second = data.at(0); + } + else if((index == (data.size() - 1)) or (delta_t < 0.0)) + { + result.first = data.at(index); + result.second = data.at(index - 1); + } + else + { + result.first = data.at(index + 1); + result.second = data.at(index); + } } - else if(index == 0) + catch(const std::exception& e) { - result.first = data.at(1); - result.second = data.at(0); - } - else - { - result.first = data.at(index + 1); - result.second = data.at(index); + result.first = Gnss_Synchro(); + result.second = Gnss_Synchro(); + LOG(WARNING) << e.what(); } return result; } From df5f51ba91b9b8825cff16d0d94f7dc33e79d84b Mon Sep 17 00:00:00 2001 From: Antonio Ramos Date: Wed, 21 Feb 2018 16:10:03 +0100 Subject: [PATCH 16/61] Dump incoming Gnss Synchros in observables --- .../gnuradio_blocks/hybrid_observables_cc.cc | 60 ++++++++++++++++--- .../gnuradio_blocks/hybrid_observables_cc.h | 2 + 2 files changed, 53 insertions(+), 9 deletions(-) diff --git a/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc b/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc index 19b0e89ba..3653b16dc 100644 --- a/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc +++ b/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc @@ -61,6 +61,7 @@ hybrid_observables_cc::hybrid_observables_cc(unsigned int nchannels_in, unsigned set_T_rx_s = false; d_nchannels = nchannels_out; d_dump_filename = dump_filename; + d_dump_filename_in = d_dump_filename; T_rx_s = 0.0; T_rx_step_s = 0.001; // 1 ms max_delta = 0.1; // 100 ms @@ -80,6 +81,7 @@ hybrid_observables_cc::hybrid_observables_cc(unsigned int nchannels_in, unsigned try { d_dump_file.exceptions (std::ifstream::failbit | std::ifstream::badbit ); + d_dump_filename.append(".bin"); d_dump_file.open(d_dump_filename.c_str(), std::ios::out | std::ios::binary); LOG(INFO) << "Observables dump enabled Log file: " << d_dump_filename.c_str(); } @@ -89,6 +91,21 @@ hybrid_observables_cc::hybrid_observables_cc(unsigned int nchannels_in, unsigned d_dump = false; } } + if (!d_dump_in.is_open()) + { + try + { + d_dump_in.exceptions (std::ifstream::failbit | std::ifstream::badbit ); + d_dump_filename_in.append("_in.bin"); + d_dump_in.open(d_dump_filename_in.c_str(), std::ios::out | std::ios::binary); + LOG(INFO) << "Observables dump enabled Log file: " << d_dump_filename.c_str(); + } + catch (const std::ifstream::failure & e) + { + LOG(WARNING) << "Exception opening observables dump file " << e.what(); + d_dump = false; + } + } } } @@ -103,6 +120,14 @@ hybrid_observables_cc::~hybrid_observables_cc() LOG(WARNING) << "Exception in destructor closing the dump file " << ex.what(); } } + if (d_dump_in.is_open()) + { + try { d_dump_in.close(); } + catch(const std::exception & ex) + { + LOG(WARNING) << "Exception in destructor closing the dump file " << ex.what(); + } + } if(d_dump) { std::cout << "Writing observables .mat files ..."; @@ -225,7 +250,6 @@ int hybrid_observables_cc::save_matfile() mat_t *matfp; matvar_t *matvar; std::string filename = d_dump_filename; - filename.erase(filename.length() - 4, 4); filename.append(".mat"); matfp = Mat_CreateVer(filename.c_str(), NULL, MAT_FT_MAT73); if(reinterpret_cast(matfp) != NULL) @@ -392,7 +416,7 @@ std::pair hybrid_observables_cc::find_closest(std::d { result.first = Gnss_Synchro(); result.second = Gnss_Synchro(); - LOG(WARNING) << e.what(); + LOG(WARNING) << "Exception computing observables " << e.what(); } return result; } @@ -420,11 +444,11 @@ void hybrid_observables_cc::correct_TOW_and_compute_prange(std::vector::iterator it; for(it = data.begin(); it != data.end(); it++) { - if(it->RX_time > TOW_ref) { TOW_ref = it->RX_time; } + if(it->TOW_at_current_symbol_s > TOW_ref) { TOW_ref = it->TOW_at_current_symbol_s; } } for(it = data.begin(); it != data.end(); it++) { - double traveltime_s = TOW_ref - it->RX_time + GPS_STARTOFFSET_ms / 1000.0; + double traveltime_s = TOW_ref - it->TOW_at_current_symbol_s + GPS_STARTOFFSET_ms / 1000.0; it->RX_time = TOW_ref + GPS_STARTOFFSET_ms / 1000.0; it->Pseudorange_m = traveltime_s * SPEED_OF_LIGHT; } @@ -465,12 +489,31 @@ int hybrid_observables_cc::general_work(int noutput_items __attribute__((unused) { if(in[i][aux].Flag_valid_word) { + bool __dump = false; it->push_back(in[i][aux]); it->back().RX_time = compute_T_rx_s(in[i][aux]); + __dump = true; // Check if the last Gnss_Synchro comes from the same satellite as the previous ones if(it->size() > 1) { - if(it->front().PRN != it->back().PRN) { it->clear(); } + if(it->front().PRN != it->back().PRN) { it->clear(); __dump = false; } + } + if(d_dump && __dump) + { + // MULTIPLEXED FILE RECORDING - Record results to file + try + { + int tmp_int = static_cast(it->back().PRN); + d_dump_in.write(reinterpret_cast(&tmp_int), sizeof(int)); + d_dump_in.write(reinterpret_cast(&it->back().RX_time), sizeof(double)); + d_dump_in.write(reinterpret_cast(&it->back().TOW_at_current_symbol_s), sizeof(double)); + d_dump_in.write(it->back().Signal, 3 * sizeof(char)); + } + catch (const std::ifstream::failure& e) + { + LOG(WARNING) << "Exception writing observables dump file " << e.what(); + d_dump = false; + } } } } @@ -524,10 +567,9 @@ int hybrid_observables_cc::general_work(int noutput_items __attribute__((unused) std::pair gnss_pair = find_closest(*it); Gnss_Synchro interpolated_gnss_synchro = gnss_pair.second; - interpolated_gnss_synchro.Carrier_Doppler_hz = interpolate_data(gnss_pair, T_rx_s, 0); - interpolated_gnss_synchro.Carrier_phase_rads = interpolate_data(gnss_pair, T_rx_s, 1); - interpolated_gnss_synchro.RX_time = interpolate_data(gnss_pair, T_rx_s, 2); - interpolated_gnss_synchro.TOW_at_current_symbol_s = interpolated_gnss_synchro.RX_time; + interpolated_gnss_synchro.Carrier_Doppler_hz = interpolate_data(gnss_pair, T_rx_s, 0); + interpolated_gnss_synchro.Carrier_phase_rads = interpolate_data(gnss_pair, T_rx_s, 1); + interpolated_gnss_synchro.TOW_at_current_symbol_s = interpolate_data(gnss_pair, T_rx_s, 2); epoch_data.push_back(interpolated_gnss_synchro); } diff --git a/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.h b/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.h index 13a8e70cd..d4b50a36b 100644 --- a/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.h +++ b/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.h @@ -83,7 +83,9 @@ private: unsigned int d_nchannels; unsigned int d_num_valid_channels; std::string d_dump_filename; + std::string d_dump_filename_in; std::ofstream d_dump_file; + std::ofstream d_dump_in; int save_matfile(); }; From ca9a551a862cc2f1090ebe6c0168773e0e329518 Mon Sep 17 00:00:00 2001 From: Antonio Ramos Date: Thu, 22 Feb 2018 11:14:57 +0100 Subject: [PATCH 17/61] Avoid extrapolation --- .../gnuradio_blocks/hybrid_observables_cc.cc | 99 +++++++------------ .../gnuradio_blocks/hybrid_observables_cc.h | 9 +- 2 files changed, 40 insertions(+), 68 deletions(-) diff --git a/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc b/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc index 3653b16dc..27568c0c6 100644 --- a/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc +++ b/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc @@ -58,7 +58,6 @@ hybrid_observables_cc::hybrid_observables_cc(unsigned int nchannels_in, unsigned { set_max_noutput_items(1); d_dump = dump; - set_T_rx_s = false; d_nchannels = nchannels_out; d_dump_filename = dump_filename; d_dump_filename_in = d_dump_filename; @@ -376,7 +375,7 @@ void hybrid_observables_cc::clean_history(std::deque& data) } } -std::pair hybrid_observables_cc::find_closest(std::deque& data) +std::pair hybrid_observables_cc::find_closest(std::deque& data, const double& ti) { std::pair result; unsigned int index = 0; @@ -385,7 +384,7 @@ std::pair hybrid_observables_cc::find_closest(std::d unsigned int aux = 0; for(it = data.begin(); it != data.end(); it++) { - double instant_delta = std::fabs(T_rx_s - it->RX_time); + double instant_delta = std::fabs(ti - it->RX_time); if(instant_delta < delta_t) { delta_t = instant_delta; @@ -393,50 +392,31 @@ std::pair hybrid_observables_cc::find_closest(std::d } aux++; } - try + delta_t = ti - data.at(index).RX_time; + if( (index == 0) or (index == (data.size() - 1)) ) { - delta_t = T_rx_s - data.at(index).RX_time; - if(index == 0) - { - result.first = data.at(1); - result.second = data.at(0); - } - else if((index == (data.size() - 1)) or (delta_t < 0.0)) - { - result.first = data.at(index); - result.second = data.at(index - 1); - } - else - { - result.first = data.at(index + 1); - result.second = data.at(index); - } + Gnss_Synchro invalid_data; + invalid_data.Flag_valid_pseudorange = false; + result.first = invalid_data; + result.second = invalid_data; } - catch(const std::exception& e) + else if(delta_t < 0.0) { - result.first = Gnss_Synchro(); - result.second = Gnss_Synchro(); - LOG(WARNING) << "Exception computing observables " << e.what(); + result.first = data.at(index); + result.first.Flag_valid_pseudorange = true; + result.second = data.at(index - 1); + result.second.Flag_valid_pseudorange = true; + } + else + { + result.first = data.at(index + 1); + result.first.Flag_valid_pseudorange = true; + result.second = data.at(index); + result.second.Flag_valid_pseudorange = true; } return result; } -double hybrid_observables_cc::find_min_RX_time() -{ - if(d_num_valid_channels == 0) { return 0.0; } - - std::vector>::iterator it = d_gnss_synchro_history.begin(); - double result = std::numeric_limits::max(); - for(unsigned int i = 0; i < d_nchannels; i++) - { - if(valid_channels[i]) - { - if(it->front().RX_time < result) { result = it->front().RX_time; } - } - it++; - } - return(floor(result * 1000.0) / 1000.0); -} void hybrid_observables_cc::correct_TOW_and_compute_prange(std::vector& data) { @@ -466,16 +446,15 @@ int hybrid_observables_cc::general_work(int noutput_items __attribute__((unused) int total_input_items = 0; for(i = 0; i < d_nchannels; i++) { total_input_items += ninput_items[i]; } consume(d_nchannels, 1); + T_rx_s += T_rx_step_s; ////////////////////////////////////////////////////////////////////////// if((total_input_items == 0) and (d_num_valid_channels == 0)) { return 0; } - if(set_T_rx_s) { T_rx_s += T_rx_step_s; } ////////////////////////////////////////////////////////////////////////// - std::vector>::iterator it; if (total_input_items > 0) { @@ -498,7 +477,7 @@ int hybrid_observables_cc::general_work(int noutput_items __attribute__((unused) { if(it->front().PRN != it->back().PRN) { it->clear(); __dump = false; } } - if(d_dump && __dump) + if(d_dump and __dump) { // MULTIPLEXED FILE RECORDING - Record results to file try @@ -529,17 +508,7 @@ int hybrid_observables_cc::general_work(int noutput_items __attribute__((unused) } d_num_valid_channels = valid_channels.count(); // Check if there is any valid channel after reading the new incoming Gnss_Synchro data - if(d_num_valid_channels == 0) - { - set_T_rx_s = false; - return 0; - } - - if(!set_T_rx_s) //Find the lowest RX_time among the valid observables in the history - { - T_rx_s = find_min_RX_time(); - set_T_rx_s = true; - } + if(d_num_valid_channels == 0) { return 0; } for(i = 0; i < d_nchannels; i++) //Discard observables with T_rx higher than the threshold { @@ -552,11 +521,8 @@ int hybrid_observables_cc::general_work(int noutput_items __attribute__((unused) // Check if there is any valid channel after computing the time distance between the Gnss_Synchro data and the receiver time d_num_valid_channels = valid_channels.count(); - if(d_num_valid_channels == 0) - { - set_T_rx_s = false; - return 0; - } + double T_rx_s_out = T_rx_s - (max_delta / 2.0); + if((d_num_valid_channels == 0) or (T_rx_s_out < 0.0)) { return 0; } std::vector epoch_data; i = 0; @@ -564,14 +530,17 @@ int hybrid_observables_cc::general_work(int noutput_items __attribute__((unused) { if(valid_channels[i]) { - std::pair gnss_pair = find_closest(*it); + std::pair gnss_pair = find_closest(*it, T_rx_s_out); Gnss_Synchro interpolated_gnss_synchro = gnss_pair.second; + if(interpolated_gnss_synchro.Flag_valid_pseudorange) + { + interpolated_gnss_synchro.Carrier_Doppler_hz = interpolate_data(gnss_pair, T_rx_s_out, 0); + interpolated_gnss_synchro.Carrier_phase_rads = interpolate_data(gnss_pair, T_rx_s_out, 1); + interpolated_gnss_synchro.TOW_at_current_symbol_s = interpolate_data(gnss_pair, T_rx_s_out, 2); - interpolated_gnss_synchro.Carrier_Doppler_hz = interpolate_data(gnss_pair, T_rx_s, 0); - interpolated_gnss_synchro.Carrier_phase_rads = interpolate_data(gnss_pair, T_rx_s, 1); - interpolated_gnss_synchro.TOW_at_current_symbol_s = interpolate_data(gnss_pair, T_rx_s, 2); - - epoch_data.push_back(interpolated_gnss_synchro); + epoch_data.push_back(interpolated_gnss_synchro); + } + else { valid_channels[i] = false; } } i++; } diff --git a/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.h b/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.h index d4b50a36b..b562a7232 100644 --- a/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.h +++ b/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.h @@ -68,8 +68,7 @@ private: void clean_history(std::deque& data); double compute_T_rx_s(const Gnss_Synchro& a); double interpolate_data(const std::pair& a, const double& ti, int parameter); - double find_min_RX_time(); - std::pair find_closest(std::deque& data); + std::pair find_closest(std::deque& data, const double& ti); void correct_TOW_and_compute_prange(std::vector& data); //Tracking observable history @@ -79,7 +78,6 @@ private: double T_rx_step_s; double max_delta; bool d_dump; - bool set_T_rx_s; unsigned int d_nchannels; unsigned int d_num_valid_channels; std::string d_dump_filename; @@ -87,6 +85,11 @@ private: std::ofstream d_dump_file; std::ofstream d_dump_in; + std::string text_red = "\033[31m"; + std::string text_green = "\033[32m"; + std::string text_reset = "\033[0m"; + + int save_matfile(); }; From 9533662a0e4eaf889981fd092bf40751b9ec1c0f Mon Sep 17 00:00:00 2001 From: Antonio Ramos Date: Thu, 22 Feb 2018 11:18:37 +0100 Subject: [PATCH 18/61] Minor change --- .../observables/gnuradio_blocks/hybrid_observables_cc.cc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc b/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc index 27568c0c6..28221f150 100644 --- a/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc +++ b/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc @@ -544,6 +544,8 @@ int hybrid_observables_cc::general_work(int noutput_items __attribute__((unused) } i++; } + d_num_valid_channels = valid_channels.count(); + if(d_num_valid_channels == 0) { return 0; } correct_TOW_and_compute_prange(epoch_data); std::vector::iterator it2 = epoch_data.begin(); From 58dd5428a8f3297235b372514e9ac675b396f086 Mon Sep 17 00:00:00 2001 From: Antonio Ramos Date: Thu, 22 Feb 2018 11:39:38 +0100 Subject: [PATCH 19/61] debug --- .../observables/gnuradio_blocks/hybrid_observables_cc.cc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc b/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc index 28221f150..ecee876d9 100644 --- a/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc +++ b/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc @@ -399,6 +399,7 @@ std::pair hybrid_observables_cc::find_closest(std::d invalid_data.Flag_valid_pseudorange = false; result.first = invalid_data; result.second = invalid_data; + std::cout << text_red << data.at(index).Signal << text_reset << std::endl; } else if(delta_t < 0.0) { @@ -406,6 +407,7 @@ std::pair hybrid_observables_cc::find_closest(std::d result.first.Flag_valid_pseudorange = true; result.second = data.at(index - 1); result.second.Flag_valid_pseudorange = true; + std::cout << text_green << data.at(index).Signal << text_reset << std::endl; } else { @@ -413,6 +415,7 @@ std::pair hybrid_observables_cc::find_closest(std::d result.first.Flag_valid_pseudorange = true; result.second = data.at(index); result.second.Flag_valid_pseudorange = true; + std::cout << text_green << data.at(index).Signal << text_reset << std::endl; } return result; } From 592d50af79b4379b89bc06526ff298b8d66b0610 Mon Sep 17 00:00:00 2001 From: Antonio Ramos Date: Thu, 22 Feb 2018 12:42:09 +0100 Subject: [PATCH 20/61] debug 2 --- src/algorithms/PVT/gnuradio_blocks/rtklib_pvt_cc.cc | 6 ++++-- .../gnuradio_blocks/hybrid_observables_cc.cc | 5 +---- .../gnuradio_blocks/hybrid_observables_cc.h | 5 ----- .../gnuradio_blocks/gps_l2c_telemetry_decoder_cc.cc | 10 ++++++++++ 4 files changed, 15 insertions(+), 11 deletions(-) diff --git a/src/algorithms/PVT/gnuradio_blocks/rtklib_pvt_cc.cc b/src/algorithms/PVT/gnuradio_blocks/rtklib_pvt_cc.cc index 85290da73..1554884b0 100644 --- a/src/algorithms/PVT/gnuradio_blocks/rtklib_pvt_cc.cc +++ b/src/algorithms/PVT/gnuradio_blocks/rtklib_pvt_cc.cc @@ -1713,9 +1713,11 @@ int rtklib_pvt_cc::work (int noutput_items, gr_vector_const_void_star &input_ite // DEBUG MESSAGE: Display position in console output if( (d_ls_pvt->is_valid_position() == true) && (flag_display_pvt == true) ) { - std::cout << "Position at " << boost::posix_time::to_simple_string(d_ls_pvt->get_position_UTC_time()) + std::string text_green = "\033[32m"; + std::string text_reset = "\033[0m"; + std::cout << text_green << "Position at " << boost::posix_time::to_simple_string(d_ls_pvt->get_position_UTC_time()) << " UTC using " << d_ls_pvt->get_num_valid_observations() << " observations is Lat = " << d_ls_pvt->get_latitude() << " [deg], Long = " << d_ls_pvt->get_longitude() - << " [deg], Height= " << d_ls_pvt->get_height() << " [m]" << std::endl; + << " [deg], Height= " << d_ls_pvt->get_height() << " [m]" << text_reset << std::endl; LOG(INFO) << "Position at " << boost::posix_time::to_simple_string(d_ls_pvt->get_position_UTC_time()) << " UTC using "<< d_ls_pvt->get_num_valid_observations() << " observations is Lat = " << d_ls_pvt->get_latitude() << " [deg], Long = " << d_ls_pvt->get_longitude() diff --git a/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc b/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc index ecee876d9..105e1fc38 100644 --- a/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc +++ b/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc @@ -63,7 +63,7 @@ hybrid_observables_cc::hybrid_observables_cc(unsigned int nchannels_in, unsigned d_dump_filename_in = d_dump_filename; T_rx_s = 0.0; T_rx_step_s = 0.001; // 1 ms - max_delta = 0.1; // 100 ms + max_delta = 0.15; // 150 ms valid_channels.resize(d_nchannels, false); d_num_valid_channels = 0; @@ -399,7 +399,6 @@ std::pair hybrid_observables_cc::find_closest(std::d invalid_data.Flag_valid_pseudorange = false; result.first = invalid_data; result.second = invalid_data; - std::cout << text_red << data.at(index).Signal << text_reset << std::endl; } else if(delta_t < 0.0) { @@ -407,7 +406,6 @@ std::pair hybrid_observables_cc::find_closest(std::d result.first.Flag_valid_pseudorange = true; result.second = data.at(index - 1); result.second.Flag_valid_pseudorange = true; - std::cout << text_green << data.at(index).Signal << text_reset << std::endl; } else { @@ -415,7 +413,6 @@ std::pair hybrid_observables_cc::find_closest(std::d result.first.Flag_valid_pseudorange = true; result.second = data.at(index); result.second.Flag_valid_pseudorange = true; - std::cout << text_green << data.at(index).Signal << text_reset << std::endl; } return result; } diff --git a/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.h b/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.h index b562a7232..5f9d0722f 100644 --- a/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.h +++ b/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.h @@ -85,11 +85,6 @@ private: std::ofstream d_dump_file; std::ofstream d_dump_in; - std::string text_red = "\033[31m"; - std::string text_green = "\033[32m"; - std::string text_reset = "\033[0m"; - - int save_matfile(); }; diff --git a/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l2c_telemetry_decoder_cc.cc b/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l2c_telemetry_decoder_cc.cc index e5f37423a..20be2dcf9 100644 --- a/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l2c_telemetry_decoder_cc.cc +++ b/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l2c_telemetry_decoder_cc.cc @@ -156,8 +156,18 @@ int gps_l2c_telemetry_decoder_cc::general_work (int noutput_items __attribute__( //* delay by the formulae: //* \code //* symbolTime_ms = msg->tow * 6000 + *pdelay * 20 + (12 * 20); 12 symbols of the encoder's transitory + double tmp_tow= d_TOW_at_current_symbol += GPS_L2_M_PERIOD; d_TOW_at_current_symbol = static_cast(msg.tow) * 6.0 + static_cast(delay) * GPS_L2_M_PERIOD + 12 * GPS_L2_M_PERIOD; d_TOW_at_current_symbol = floor(d_TOW_at_current_symbol * 1000.0) / 1000.0; + double tmp_diff = std::fabs(tmp_tow-d_TOW_at_current_symbol); + if ((tmp_tow != 0) or (tmp_diff > 0.0)) + { + std::string text_red = "\033[31m"; + std::string text_reset = "\033[0m"; + std::cout << text_red << + "GPS L2C. TOW incoherence on channel: "<< d_channel << ". TOW difference = " << + tmp_diff * 1000.0 << " [ms]" << text_reset << std::endl; + } d_flag_valid_word = true; } else From e2c2da67c4b7163bd539cb33f2570b8dc597f8cf Mon Sep 17 00:00:00 2001 From: Antonio Ramos Date: Thu, 22 Feb 2018 16:15:07 +0100 Subject: [PATCH 21/61] debug3 --- src/algorithms/PVT/gnuradio_blocks/rtklib_pvt_cc.cc | 6 ++---- .../gnuradio_blocks/gps_l1_ca_telemetry_decoder_cc.cc | 10 +++++++++- .../gnuradio_blocks/gps_l2c_telemetry_decoder_cc.cc | 10 ++++------ src/core/system_parameters/MATH_CONSTANTS.h | 7 +++++++ 4 files changed, 22 insertions(+), 11 deletions(-) diff --git a/src/algorithms/PVT/gnuradio_blocks/rtklib_pvt_cc.cc b/src/algorithms/PVT/gnuradio_blocks/rtklib_pvt_cc.cc index 1554884b0..4914bf020 100644 --- a/src/algorithms/PVT/gnuradio_blocks/rtklib_pvt_cc.cc +++ b/src/algorithms/PVT/gnuradio_blocks/rtklib_pvt_cc.cc @@ -1713,11 +1713,9 @@ int rtklib_pvt_cc::work (int noutput_items, gr_vector_const_void_star &input_ite // DEBUG MESSAGE: Display position in console output if( (d_ls_pvt->is_valid_position() == true) && (flag_display_pvt == true) ) { - std::string text_green = "\033[32m"; - std::string text_reset = "\033[0m"; - std::cout << text_green << "Position at " << boost::posix_time::to_simple_string(d_ls_pvt->get_position_UTC_time()) + std::cout << TEXT_GREEN << "Position at " << boost::posix_time::to_simple_string(d_ls_pvt->get_position_UTC_time()) << " UTC using " << d_ls_pvt->get_num_valid_observations() << " observations is Lat = " << d_ls_pvt->get_latitude() << " [deg], Long = " << d_ls_pvt->get_longitude() - << " [deg], Height= " << d_ls_pvt->get_height() << " [m]" << text_reset << std::endl; + << " [deg], Height= " << d_ls_pvt->get_height() << " [m]" << TEXT_RESET << std::endl; LOG(INFO) << "Position at " << boost::posix_time::to_simple_string(d_ls_pvt->get_position_UTC_time()) << " UTC using "<< d_ls_pvt->get_num_valid_observations() << " observations is Lat = " << d_ls_pvt->get_latitude() << " [deg], Long = " << d_ls_pvt->get_longitude() diff --git a/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_cc.cc b/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_cc.cc index 79810f000..f0766f528 100644 --- a/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_cc.cc +++ b/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_cc.cc @@ -350,11 +350,19 @@ int gps_l1_ca_telemetry_decoder_cc::general_work (int noutput_items __attribute_ //double decoder_latency_ms=(double)(current_symbol.Tracking_sample_counter-d_symbol_history.at(0).Tracking_sample_counter) // /(double)current_symbol.fs; // update TOW at the preamble instant (account with decoder latency) - d_TOW_at_Preamble = d_GPS_FSM.d_nav.d_TOW + 2 * GPS_L1_CA_CODE_PERIOD + GPS_CA_PREAMBLE_DURATION_S; + double tmp_tow = d_TOW_at_current_symbol + GPS_L1_CA_CODE_PERIOD; + d_TOW_at_Preamble = d_GPS_FSM.d_nav.d_TOW + 2 * GPS_L1_CA_CODE_PERIOD + GPS_CA_PREAMBLE_DURATION_S; d_TOW_at_current_symbol = floor(d_TOW_at_Preamble * 1000.0) / 1000.0; flag_TOW_set = true; d_flag_new_tow_available = false; + double tmp_diff = std::fabs(tmp_tow - d_TOW_at_current_symbol); + if ((tmp_tow != 0) or (tmp_diff > 0.0)) + { + std::cout << TEXT_RED << + "GPS L1 C/A. TOW incoherence on channel: "<< d_channel << ". TOW difference = " << + tmp_diff * 1000.0 << " [ms]" << TEXT_RESET << std::endl; + } } else { diff --git a/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l2c_telemetry_decoder_cc.cc b/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l2c_telemetry_decoder_cc.cc index 20be2dcf9..be426b70a 100644 --- a/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l2c_telemetry_decoder_cc.cc +++ b/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l2c_telemetry_decoder_cc.cc @@ -156,17 +156,15 @@ int gps_l2c_telemetry_decoder_cc::general_work (int noutput_items __attribute__( //* delay by the formulae: //* \code //* symbolTime_ms = msg->tow * 6000 + *pdelay * 20 + (12 * 20); 12 symbols of the encoder's transitory - double tmp_tow= d_TOW_at_current_symbol += GPS_L2_M_PERIOD; + double tmp_tow = d_TOW_at_current_symbol + GPS_L2_M_PERIOD; d_TOW_at_current_symbol = static_cast(msg.tow) * 6.0 + static_cast(delay) * GPS_L2_M_PERIOD + 12 * GPS_L2_M_PERIOD; d_TOW_at_current_symbol = floor(d_TOW_at_current_symbol * 1000.0) / 1000.0; - double tmp_diff = std::fabs(tmp_tow-d_TOW_at_current_symbol); + double tmp_diff = std::fabs(tmp_tow - d_TOW_at_current_symbol); if ((tmp_tow != 0) or (tmp_diff > 0.0)) { - std::string text_red = "\033[31m"; - std::string text_reset = "\033[0m"; - std::cout << text_red << + std::cout << TEXT_RED << "GPS L2C. TOW incoherence on channel: "<< d_channel << ". TOW difference = " << - tmp_diff * 1000.0 << " [ms]" << text_reset << std::endl; + tmp_diff * 1000.0 << " [ms]" << TEXT_RESET << std::endl; } d_flag_valid_word = true; } diff --git a/src/core/system_parameters/MATH_CONSTANTS.h b/src/core/system_parameters/MATH_CONSTANTS.h index 8c8dfbbe5..2a5f376e6 100644 --- a/src/core/system_parameters/MATH_CONSTANTS.h +++ b/src/core/system_parameters/MATH_CONSTANTS.h @@ -31,6 +31,8 @@ #ifndef GNSS_SDR_MATH_CONSTANTS_H_ #define GNSS_SDR_MATH_CONSTANTS_H_ +#include + /* Constants for scaling the ephemeris found in the data message the format is the following: TWO_N5 -> 2^-5, TWO_P4 -> 2^4, PI_TWO_N43 -> Pi*2^-43, etc etc Additionally some of the PI*2^N terms are used in the tracking stuff @@ -41,6 +43,11 @@ ONE_PI_TWO_PX = (1/Pi)*2^X */ +const std::string TEXT_RED = "\033[31m"; +const std::string TEXT_GREEN = "\033[32m"; +const std::string TEXT_RESET = "\033[0m"; + + const double PI = 3.1415926535897932; //!< pi const double PI_2 = 2.0 * PI; //!< 2 * pi From 44f05263f00541a9e654808878f53301004a0123 Mon Sep 17 00:00:00 2001 From: Antonio Ramos Date: Thu, 22 Feb 2018 18:03:24 +0100 Subject: [PATCH 22/61] debug4 --- .../gnuradio_blocks/gps_l1_ca_telemetry_decoder_cc.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_cc.cc b/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_cc.cc index f0766f528..4084db964 100644 --- a/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_cc.cc +++ b/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_cc.cc @@ -357,7 +357,7 @@ int gps_l1_ca_telemetry_decoder_cc::general_work (int noutput_items __attribute_ flag_TOW_set = true; d_flag_new_tow_available = false; double tmp_diff = std::fabs(tmp_tow - d_TOW_at_current_symbol); - if ((tmp_tow != 0) or (tmp_diff > 0.0)) + if (tmp_diff > 0.0) { std::cout << TEXT_RED << "GPS L1 C/A. TOW incoherence on channel: "<< d_channel << ". TOW difference = " << From 3921000ed2f45df3402528cfcbab399829c1f546 Mon Sep 17 00:00:00 2001 From: Antonio Ramos Date: Thu, 22 Feb 2018 19:16:06 +0100 Subject: [PATCH 23/61] debug5 --- .../gnuradio_blocks/gps_l1_ca_telemetry_decoder_cc.cc | 4 ++-- .../gnuradio_blocks/gps_l2c_telemetry_decoder_cc.cc | 10 ++++++---- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_cc.cc b/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_cc.cc index 4084db964..880b9b7fb 100644 --- a/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_cc.cc +++ b/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_cc.cc @@ -357,10 +357,10 @@ int gps_l1_ca_telemetry_decoder_cc::general_work (int noutput_items __attribute_ flag_TOW_set = true; d_flag_new_tow_available = false; double tmp_diff = std::fabs(tmp_tow - d_TOW_at_current_symbol); - if (tmp_diff > 0.0) + if (tmp_diff > 0.000001) { std::cout << TEXT_RED << - "GPS L1 C/A. TOW incoherence on channel: "<< d_channel << ". TOW difference = " << + "GPS L1 C/A. TOW incoherence on PRN: "<< current_symbol.PRN << ". TOW difference = " << tmp_diff * 1000.0 << " [ms]" << TEXT_RESET << std::endl; } } diff --git a/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l2c_telemetry_decoder_cc.cc b/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l2c_telemetry_decoder_cc.cc index be426b70a..95d34aa4f 100644 --- a/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l2c_telemetry_decoder_cc.cc +++ b/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l2c_telemetry_decoder_cc.cc @@ -150,7 +150,8 @@ int gps_l2c_telemetry_decoder_cc::general_work (int noutput_items __attribute__( } //update TOW at the preamble instant - d_TOW_at_Preamble = static_cast(msg.tow); + std::cout<<"delta tow at preamble: "<(msg.tow) * 6.0-d_TOW_at_Preamble*6.0<(msg.tow); //std::cout<<"["<<(int)msg.prn<<"] deco delay: "<tow * 6000 + *pdelay * 20 + (12 * 20); 12 symbols of the encoder's transitory double tmp_tow = d_TOW_at_current_symbol + GPS_L2_M_PERIOD; d_TOW_at_current_symbol = static_cast(msg.tow) * 6.0 + static_cast(delay) * GPS_L2_M_PERIOD + 12 * GPS_L2_M_PERIOD; - d_TOW_at_current_symbol = floor(d_TOW_at_current_symbol * 1000.0) / 1000.0; + + //d_TOW_at_current_symbol = floor(d_TOW_at_current_symbol * 1000.0) / 1000.0; double tmp_diff = std::fabs(tmp_tow - d_TOW_at_current_symbol); - if ((tmp_tow != 0) or (tmp_diff > 0.0)) + if (tmp_diff > 0.000001) { std::cout << TEXT_RED << - "GPS L2C. TOW incoherence on channel: "<< d_channel << ". TOW difference = " << + "GPS L2C. TOW incoherence on PRN: "<< current_synchro_data.PRN << ". TOW difference = " << tmp_diff * 1000.0 << " [ms]" << TEXT_RESET << std::endl; } d_flag_valid_word = true; From c0f1d95b32df023a46bc2805a2c11a2f4aa1de87 Mon Sep 17 00:00:00 2001 From: Antonio Ramos Date: Fri, 23 Feb 2018 10:50:22 +0100 Subject: [PATCH 24/61] debug6 --- .../gnuradio_blocks/hybrid_observables_cc.cc | 22 +++++++++++++++++++ .../gps_l2c_telemetry_decoder_cc.cc | 2 -- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc b/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc index 105e1fc38..4ecb8d236 100644 --- a/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc +++ b/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc @@ -422,6 +422,28 @@ void hybrid_observables_cc::correct_TOW_and_compute_prange(std::vector::lowest(); std::vector::iterator it; + + +/////////////////////// DEBUG ////////////////////////// + std::vector::iterator it2; + double thr_ = 250.0 / 3e8; + for(it = data.begin(); it != (data.end() - 1); it++) + { + for(it2 = it + 1; it2 != data.end(); it2++) + { + if(it->PRN == it2->PRN) + { + double tow_dif_ = std::fabs(it->TOW_at_current_symbol_s - it2->TOW_at_current_symbol_s); + if(tow_dif_ > thr_) + { + std::cout << TEXT_RED << "L1 - L2 TOW difference in PRN " << it->PRN << + " = " << tow_dif_ << "[ms]. Equivalent to " << tow_dif_ * 3e8 << " meters in pseudorange" + << TEXT_RESET << std::endl; + } + } + } + } +/////////////////////////////////////////////////////////// for(it = data.begin(); it != data.end(); it++) { if(it->TOW_at_current_symbol_s > TOW_ref) { TOW_ref = it->TOW_at_current_symbol_s; } diff --git a/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l2c_telemetry_decoder_cc.cc b/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l2c_telemetry_decoder_cc.cc index 95d34aa4f..281698845 100644 --- a/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l2c_telemetry_decoder_cc.cc +++ b/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l2c_telemetry_decoder_cc.cc @@ -150,9 +150,7 @@ int gps_l2c_telemetry_decoder_cc::general_work (int noutput_items __attribute__( } //update TOW at the preamble instant - std::cout<<"delta tow at preamble: "<(msg.tow) * 6.0-d_TOW_at_Preamble*6.0<(msg.tow); - //std::cout<<"["<<(int)msg.prn<<"] deco delay: "< Date: Fri, 23 Feb 2018 12:00:20 +0100 Subject: [PATCH 25/61] debug7 --- .../gnuradio_blocks/hybrid_observables_cc.cc | 60 ++++--------------- .../gnuradio_blocks/hybrid_observables_cc.h | 4 +- .../gps_l1_ca_telemetry_decoder_cc.cc | 8 --- .../gps_l2c_telemetry_decoder_cc.cc | 9 --- 4 files changed, 12 insertions(+), 69 deletions(-) diff --git a/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc b/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc index 4ecb8d236..beda350d3 100644 --- a/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc +++ b/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc @@ -60,7 +60,6 @@ hybrid_observables_cc::hybrid_observables_cc(unsigned int nchannels_in, unsigned d_dump = dump; d_nchannels = nchannels_out; d_dump_filename = dump_filename; - d_dump_filename_in = d_dump_filename; T_rx_s = 0.0; T_rx_step_s = 0.001; // 1 ms max_delta = 0.15; // 150 ms @@ -90,21 +89,6 @@ hybrid_observables_cc::hybrid_observables_cc(unsigned int nchannels_in, unsigned d_dump = false; } } - if (!d_dump_in.is_open()) - { - try - { - d_dump_in.exceptions (std::ifstream::failbit | std::ifstream::badbit ); - d_dump_filename_in.append("_in.bin"); - d_dump_in.open(d_dump_filename_in.c_str(), std::ios::out | std::ios::binary); - LOG(INFO) << "Observables dump enabled Log file: " << d_dump_filename.c_str(); - } - catch (const std::ifstream::failure & e) - { - LOG(WARNING) << "Exception opening observables dump file " << e.what(); - d_dump = false; - } - } } } @@ -119,14 +103,6 @@ hybrid_observables_cc::~hybrid_observables_cc() LOG(WARNING) << "Exception in destructor closing the dump file " << ex.what(); } } - if (d_dump_in.is_open()) - { - try { d_dump_in.close(); } - catch(const std::exception & ex) - { - LOG(WARNING) << "Exception in destructor closing the dump file " << ex.what(); - } - } if(d_dump) { std::cout << "Writing observables .mat files ..."; @@ -425,25 +401,30 @@ void hybrid_observables_cc::correct_TOW_and_compute_prange(std::vector::iterator it2; - double thr_ = 250.0 / 3e8; + double thr_ = 250.0 / 3e8; // Maximum pseudorange difference = 250 meters for(it = data.begin(); it != (data.end() - 1); it++) { for(it2 = it + 1; it2 != data.end(); it2++) { - if(it->PRN == it2->PRN) + if(it->PRN == it2->PRN and it->System == it2->System) { double tow_dif_ = std::fabs(it->TOW_at_current_symbol_s - it2->TOW_at_current_symbol_s); if(tow_dif_ > thr_) { - std::cout << TEXT_RED << "L1 - L2 TOW difference in PRN " << it->PRN << - " = " << tow_dif_ << "[ms]. Equivalent to " << tow_dif_ * 3e8 << " meters in pseudorange" - << TEXT_RESET << std::endl; + DLOG(INFO) << "System " << it->System << ". Signals " << it->Signal << " and " << it2->Signal + << ". TOW difference in PRN " << it->PRN + << " = " << tow_dif_ * 1e3 << "[ms]. Equivalent to " << tow_dif_ * 3e8 + << " meters in pseudorange"; } } } } +#endif /////////////////////////////////////////////////////////// + + for(it = data.begin(); it != data.end(); it++) { if(it->TOW_at_current_symbol_s > TOW_ref) { TOW_ref = it->TOW_at_current_symbol_s; } @@ -490,31 +471,12 @@ int hybrid_observables_cc::general_work(int noutput_items __attribute__((unused) { if(in[i][aux].Flag_valid_word) { - bool __dump = false; it->push_back(in[i][aux]); it->back().RX_time = compute_T_rx_s(in[i][aux]); - __dump = true; // Check if the last Gnss_Synchro comes from the same satellite as the previous ones if(it->size() > 1) { - if(it->front().PRN != it->back().PRN) { it->clear(); __dump = false; } - } - if(d_dump and __dump) - { - // MULTIPLEXED FILE RECORDING - Record results to file - try - { - int tmp_int = static_cast(it->back().PRN); - d_dump_in.write(reinterpret_cast(&tmp_int), sizeof(int)); - d_dump_in.write(reinterpret_cast(&it->back().RX_time), sizeof(double)); - d_dump_in.write(reinterpret_cast(&it->back().TOW_at_current_symbol_s), sizeof(double)); - d_dump_in.write(it->back().Signal, 3 * sizeof(char)); - } - catch (const std::ifstream::failure& e) - { - LOG(WARNING) << "Exception writing observables dump file " << e.what(); - d_dump = false; - } + if(it->front().PRN != it->back().PRN) { it->clear(); } } } } diff --git a/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.h b/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.h index 5f9d0722f..024e1b4c0 100644 --- a/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.h +++ b/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.h @@ -70,6 +70,7 @@ private: double interpolate_data(const std::pair& a, const double& ti, int parameter); std::pair find_closest(std::deque& data, const double& ti); void correct_TOW_and_compute_prange(std::vector& data); + int save_matfile(); //Tracking observable history std::vector> d_gnss_synchro_history; @@ -81,11 +82,8 @@ private: unsigned int d_nchannels; unsigned int d_num_valid_channels; std::string d_dump_filename; - std::string d_dump_filename_in; std::ofstream d_dump_file; - std::ofstream d_dump_in; - int save_matfile(); }; #endif diff --git a/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_cc.cc b/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_cc.cc index 880b9b7fb..ae303a20f 100644 --- a/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_cc.cc +++ b/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_cc.cc @@ -350,19 +350,11 @@ int gps_l1_ca_telemetry_decoder_cc::general_work (int noutput_items __attribute_ //double decoder_latency_ms=(double)(current_symbol.Tracking_sample_counter-d_symbol_history.at(0).Tracking_sample_counter) // /(double)current_symbol.fs; // update TOW at the preamble instant (account with decoder latency) - double tmp_tow = d_TOW_at_current_symbol + GPS_L1_CA_CODE_PERIOD; d_TOW_at_Preamble = d_GPS_FSM.d_nav.d_TOW + 2 * GPS_L1_CA_CODE_PERIOD + GPS_CA_PREAMBLE_DURATION_S; d_TOW_at_current_symbol = floor(d_TOW_at_Preamble * 1000.0) / 1000.0; flag_TOW_set = true; d_flag_new_tow_available = false; - double tmp_diff = std::fabs(tmp_tow - d_TOW_at_current_symbol); - if (tmp_diff > 0.000001) - { - std::cout << TEXT_RED << - "GPS L1 C/A. TOW incoherence on PRN: "<< current_symbol.PRN << ". TOW difference = " << - tmp_diff * 1000.0 << " [ms]" << TEXT_RESET << std::endl; - } } else { diff --git a/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l2c_telemetry_decoder_cc.cc b/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l2c_telemetry_decoder_cc.cc index 281698845..4e046f1c4 100644 --- a/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l2c_telemetry_decoder_cc.cc +++ b/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l2c_telemetry_decoder_cc.cc @@ -155,17 +155,8 @@ int gps_l2c_telemetry_decoder_cc::general_work (int noutput_items __attribute__( //* delay by the formulae: //* \code //* symbolTime_ms = msg->tow * 6000 + *pdelay * 20 + (12 * 20); 12 symbols of the encoder's transitory - double tmp_tow = d_TOW_at_current_symbol + GPS_L2_M_PERIOD; d_TOW_at_current_symbol = static_cast(msg.tow) * 6.0 + static_cast(delay) * GPS_L2_M_PERIOD + 12 * GPS_L2_M_PERIOD; - //d_TOW_at_current_symbol = floor(d_TOW_at_current_symbol * 1000.0) / 1000.0; - double tmp_diff = std::fabs(tmp_tow - d_TOW_at_current_symbol); - if (tmp_diff > 0.000001) - { - std::cout << TEXT_RED << - "GPS L2C. TOW incoherence on PRN: "<< current_synchro_data.PRN << ". TOW difference = " << - tmp_diff * 1000.0 << " [ms]" << TEXT_RESET << std::endl; - } d_flag_valid_word = true; } else From 5cba843eaab16b87bfc079c617063d4e80c9e4af Mon Sep 17 00:00:00 2001 From: Antonio Ramos Date: Fri, 23 Feb 2018 16:17:51 +0100 Subject: [PATCH 26/61] Add colors to display --- CMakeLists.txt | 1 + .../PVT/gnuradio_blocks/rtklib_pvt_cc.cc | 3 +- .../gnuradio_blocks/hybrid_observables_cc.cc | 11 +-- src/core/system_parameters/MATH_CONSTANTS.h | 5 -- src/core/system_parameters/display.h | 77 +++++++++++++++++++ src/main/main.cc | 1 + 6 files changed, 87 insertions(+), 11 deletions(-) create mode 100644 src/core/system_parameters/display.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 28435b368..18032be21 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -137,6 +137,7 @@ set(OS_IS_LINUX "") if(${CMAKE_SYSTEM_NAME} MATCHES "Linux") set(OperatingSystem "Linux") set(OS_IS_LINUX TRUE) + add_definitions(-DDISPLAY_COLORS) if(ARCH_64BITS) set(ARCH_ "(64 bits)") else(ARCH_64BITS) diff --git a/src/algorithms/PVT/gnuradio_blocks/rtklib_pvt_cc.cc b/src/algorithms/PVT/gnuradio_blocks/rtklib_pvt_cc.cc index 4914bf020..c6af2e47a 100644 --- a/src/algorithms/PVT/gnuradio_blocks/rtklib_pvt_cc.cc +++ b/src/algorithms/PVT/gnuradio_blocks/rtklib_pvt_cc.cc @@ -40,6 +40,7 @@ #include #include #include +#include "display.h" using google::LogMessage; @@ -1713,7 +1714,7 @@ int rtklib_pvt_cc::work (int noutput_items, gr_vector_const_void_star &input_ite // DEBUG MESSAGE: Display position in console output if( (d_ls_pvt->is_valid_position() == true) && (flag_display_pvt == true) ) { - std::cout << TEXT_GREEN << "Position at " << boost::posix_time::to_simple_string(d_ls_pvt->get_position_UTC_time()) + std::cout << TEXT_BOLD_GREEN << "Position at " << boost::posix_time::to_simple_string(d_ls_pvt->get_position_UTC_time()) << " UTC using " << d_ls_pvt->get_num_valid_observations() << " observations is Lat = " << d_ls_pvt->get_latitude() << " [deg], Long = " << d_ls_pvt->get_longitude() << " [deg], Height= " << d_ls_pvt->get_height() << " [m]" << TEXT_RESET << std::endl; diff --git a/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc b/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc index beda350d3..2f3d7f5c6 100644 --- a/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc +++ b/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc @@ -396,14 +396,15 @@ std::pair hybrid_observables_cc::find_closest(std::d void hybrid_observables_cc::correct_TOW_and_compute_prange(std::vector& data) { - double TOW_ref = std::numeric_limits::lowest(); std::vector::iterator it; - /////////////////////// DEBUG ////////////////////////// +// Logs if there is a pseudorange difference between +// signals of the same satellite higher than a threshold +//////////////////////////////////////////////////////// #ifndef NDEBUG std::vector::iterator it2; - double thr_ = 250.0 / 3e8; // Maximum pseudorange difference = 250 meters + double thr_ = 250.0 / SPEED_OF_LIGHT; // Maximum pseudorange difference = 250 meters for(it = data.begin(); it != (data.end() - 1); it++) { for(it2 = it + 1; it2 != data.end(); it2++) @@ -415,7 +416,7 @@ void hybrid_observables_cc::correct_TOW_and_compute_prange(std::vectorSystem << ". Signals " << it->Signal << " and " << it2->Signal << ". TOW difference in PRN " << it->PRN - << " = " << tow_dif_ * 1e3 << "[ms]. Equivalent to " << tow_dif_ * 3e8 + << " = " << tow_dif_ * 1e3 << "[ms]. Equivalent to " << tow_dif_ * SPEED_OF_LIGHT << " meters in pseudorange"; } } @@ -424,7 +425,7 @@ void hybrid_observables_cc::correct_TOW_and_compute_prange(std::vector::lowest(); for(it = data.begin(); it != data.end(); it++) { if(it->TOW_at_current_symbol_s > TOW_ref) { TOW_ref = it->TOW_at_current_symbol_s; } diff --git a/src/core/system_parameters/MATH_CONSTANTS.h b/src/core/system_parameters/MATH_CONSTANTS.h index 2a5f376e6..d7da95651 100644 --- a/src/core/system_parameters/MATH_CONSTANTS.h +++ b/src/core/system_parameters/MATH_CONSTANTS.h @@ -43,11 +43,6 @@ ONE_PI_TWO_PX = (1/Pi)*2^X */ -const std::string TEXT_RED = "\033[31m"; -const std::string TEXT_GREEN = "\033[32m"; -const std::string TEXT_RESET = "\033[0m"; - - const double PI = 3.1415926535897932; //!< pi const double PI_2 = 2.0 * PI; //!< 2 * pi diff --git a/src/core/system_parameters/display.h b/src/core/system_parameters/display.h new file mode 100644 index 000000000..b6c3c05b8 --- /dev/null +++ b/src/core/system_parameters/display.h @@ -0,0 +1,77 @@ +/*! + * \file display.h + * \brief Defines useful display constants + * \author Antonio Ramos, 2018. antonio.ramos(at)cttc.es + * + * ------------------------------------------------------------------------- + * + * Copyright (C) 2010-2018 (see AUTHORS file for a list of contributors) + * + * GNSS-SDR is a software defined Global Navigation + * Satellite Systems receiver + * + * This file is part of GNSS-SDR. + * + * GNSS-SDR is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * GNSS-SDR is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNSS-SDR. If not, see . + * + * ------------------------------------------------------------------------- + */ + +#ifndef GNSS_SDR_DISPLAY_H_ +#define GNSS_SDR_DISPLAY_H_ + +#include + +#ifdef DISPLAY_COLORS + +const std::string TEXT_RESET = "\033[0m"; +const std::string TEXT_BLACK = "\033[30m"; +const std::string TEXT_RED = "\033[31m"; +const std::string TEXT_GREEN = "\033[32m"; +const std::string TEXT_YELLOW = "\033[33m"; +const std::string TEXT_BLUE = "\033[34m"; +const std::string TEXT_MAGENTA = "\033[35m"; +const std::string TEXT_CYAN = "\033[36m"; +const std::string TEXT_WHITE = "\033[37m"; +const std::string TEXT_BOLD_BLACK = "\033[1m\033[30m"; +const std::string TEXT_BOLD_RED = "\033[1m\033[31m"; +const std::string TEXT_BOLD_GREEN = "\033[1m\033[32m"; +const std::string TEXT_BOLD_YELLOW = "\033[1m\033[33m"; +const std::string TEXT_BOLD_BLUE = "\033[1m\033[34m"; +const std::string TEXT_BOLD_MAGENTA = "\033[1m\033[35m"; +const std::string TEXT_BOLD_CYAN = "\033[1m\033[36m"; +const std::string TEXT_BOLD_WHITE = "\033[1m\033[37m"; + +#else + +const std::string TEXT_RESET = ""; +const std::string TEXT_BLACK = ""; +const std::string TEXT_RED = ""; +const std::string TEXT_GREEN = ""; +const std::string TEXT_YELLOW = ""; +const std::string TEXT_BLUE = ""; +const std::string TEXT_MAGENTA = ""; +const std::string TEXT_CYAN = ""; +const std::string TEXT_WHITE = ""; +const std::string TEXT_BOLD_BLACK = ""; +const std::string TEXT_BOLD_RED = ""; +const std::string TEXT_BOLD_GREEN = ""; +const std::string TEXT_BOLD_YELLOW = ""; +const std::string TEXT_BOLD_BLUE = ""; +const std::string TEXT_BOLD_MAGENTA = ""; +const std::string TEXT_BOLD_CYAN = ""; +const std::string TEXT_BOLD_WHITE = ""; + +#endif /* DISPLAY_COLORS */ +#endif /* GNSS_SDR_DISPLAY_H_ */ diff --git a/src/main/main.cc b/src/main/main.cc index af45ab3a7..ef2a0effb 100644 --- a/src/main/main.cc +++ b/src/main/main.cc @@ -50,6 +50,7 @@ #include "concurrent_queue.h" #include "concurrent_map.h" #include "gnss_sdr_flags.h" +#include "display.h" #if CUDA_GPU_ACCEL // For the CUDA runtime routines (prefixed with "cuda_") From e964bf060f731ef5d097fa2d8c996f7977795a8f Mon Sep 17 00:00:00 2001 From: Antonio Ramos Date: Mon, 26 Feb 2018 10:40:08 +0100 Subject: [PATCH 27/61] Clean code --- CMakeLists.txt | 2 +- .../observables/gnuradio_blocks/hybrid_observables_cc.cc | 3 --- .../observables/gnuradio_blocks/hybrid_observables_cc.h | 2 -- 3 files changed, 1 insertion(+), 6 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9867f24e7..540930e3f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -137,7 +137,7 @@ set(OS_IS_LINUX "") if(${CMAKE_SYSTEM_NAME} MATCHES "Linux") set(OperatingSystem "Linux") set(OS_IS_LINUX TRUE) - add_definitions(-DDISPLAY_COLORS) + add_definitions( -DDISPLAY_COLORS=1 ) if(ARCH_64BITS) set(ARCH_ "(64 bits)") else(ARCH_64BITS) diff --git a/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc b/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc index f26b6d294..27be559d7 100644 --- a/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc +++ b/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc @@ -30,13 +30,10 @@ */ #include "hybrid_observables_cc.h" -#include "Galileo_E1.h" #include "GPS_L1_CA.h" #include #include #include -#include -#include #include #include #include diff --git a/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.h b/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.h index dc5085cd3..f48f5ce22 100644 --- a/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.h +++ b/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.h @@ -42,8 +42,6 @@ #include //std::vector #include #include -#include -#include "gnss_synchro.h" class hybrid_observables_cc; From eed6ed1f5e74b7ba3ced917c08a8b567873e9032 Mon Sep 17 00:00:00 2001 From: Antonio Ramos Date: Mon, 26 Feb 2018 12:33:40 +0100 Subject: [PATCH 28/61] Remove set_max_noutput_items --- .../gnuradio_blocks/hybrid_observables_cc.cc | 117 ++----- .../gnuradio_blocks/hybrid_observables_cc.h | 4 +- .../galileo_e1b_telemetry_decoder_cc.cc | 1 - .../galileo_e5a_telemetry_decoder_cc.cc | 1 - .../gps_l1_ca_telemetry_decoder_cc.cc | 20 +- .../gps_l1_ca_telemetry_decoder_cc.h | 5 +- .../gps_l2c_telemetry_decoder_cc.cc | 8 +- .../gps_l5_telemetry_decoder_cc.cc | 1 - .../galileo_e1_dll_pll_veml_tracking_cc.cc | 1 - .../galileo_e5a_dll_pll_tracking_cc.cc | 1 - .../gps_l1_ca_dll_pll_tracking_cc.cc | 1 - .../gps_l2_m_dll_pll_tracking_cc.cc | 1 - .../gps_l5i_dll_pll_tracking_cc.cc | 1 - .../gps_navigation_message.cc | 18 +- .../observables/hybrid_observables_test.cc | 328 +++++++++--------- 15 files changed, 233 insertions(+), 275 deletions(-) diff --git a/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc b/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc index 27be559d7..559caafdc 100644 --- a/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc +++ b/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc @@ -39,6 +39,7 @@ #include #include #include +#include "display.h" using google::LogMessage; @@ -55,7 +56,6 @@ hybrid_observables_cc::hybrid_observables_cc(unsigned int nchannels_in, unsigned gr::io_signature::make(nchannels_in, nchannels_in, sizeof(Gnss_Synchro)), gr::io_signature::make(nchannels_out, nchannels_out, sizeof(Gnss_Synchro))) { - set_max_noutput_items(1); d_dump = dump; d_nchannels = nchannels_out; d_dump_filename = dump_filename; @@ -78,7 +78,6 @@ hybrid_observables_cc::hybrid_observables_cc(unsigned int nchannels_in, unsigned try { d_dump_file.exceptions (std::ifstream::failbit | std::ifstream::badbit ); - d_dump_filename.append(".bin"); d_dump_file.open(d_dump_filename.c_str(), std::ios::out | std::ios::binary); LOG(INFO) << "Observables dump enabled Log file: " << d_dump_filename.c_str(); } @@ -224,6 +223,7 @@ int hybrid_observables_cc::save_matfile() mat_t *matfp; matvar_t *matvar; std::string filename = d_dump_filename; + if(filename.size() > 4) { filename.erase(filename.end() - 4, filename.end()); } filename.append(".mat"); matfp = Mat_CreateVer(filename.c_str(), NULL, MAT_FT_MAT73); if(reinterpret_cast(matfp) != NULL) @@ -288,40 +288,36 @@ int hybrid_observables_cc::save_matfile() return 0; } -double hybrid_observables_cc::interpolate_data(const std::pair& a, const double& ti, int parameter) +bool hybrid_observables_cc::interpolate_data(Gnss_Synchro& out, std::deque& data, const double& ti) { - // x(ti) = m * ti + c - // m = [x(t2) - x(t1)] / [t2 - t1] - // c = x(t1) - m * t1 + std::deque::iterator it; - double m = 0.0; - double c = 0.0; + arma::vec t = arma::vec(data.size()); + arma::vec dop = t; + arma::vec cph = t; + arma::vec tow = t; + arma::vec tiv = arma::vec(1); + arma::vec result; + tiv(0) = ti; - if(!a.first.Flag_valid_word or !a.second.Flag_valid_word) { return 0.0; } - - switch(parameter) + unsigned int aux = 0; + for(it = data.begin(); it != data.end(); it++) { - case 0:// Doppler - m = (a.first.Carrier_Doppler_hz - a.second.Carrier_Doppler_hz) / (a.first.RX_time - a.second.RX_time); - c = a.second.Carrier_Doppler_hz - m * a.second.RX_time; - break; + t(aux) = it->RX_time; + dop(aux) = it->Carrier_Doppler_hz; + cph(aux) = it->Carrier_phase_rads; + tow(aux) = it->TOW_at_current_symbol_s; - case 1:// Carrier phase - m = (a.first.Carrier_phase_rads - a.second.Carrier_phase_rads) / (a.first.RX_time - a.second.RX_time); - c = a.second.Carrier_phase_rads - m * a.second.RX_time; - break; - - case 2:// TOW - m = (a.first.TOW_at_current_symbol_s - a.second.TOW_at_current_symbol_s) / (a.first.RX_time - a.second.RX_time); - c = a.second.TOW_at_current_symbol_s - m * a.second.RX_time; - break; - - case 3:// Code phase samples - m = (a.first.Code_phase_samples - a.second.Code_phase_samples) / (a.first.RX_time - a.second.RX_time); - c = a.second.Code_phase_samples - m * a.second.RX_time; - break; + aux++; } - return(m * ti + c); + arma::interp1(t, dop, tiv, result); + out.Carrier_Doppler_hz = result(0); + arma::interp1(t, cph, tiv, result); + out.Carrier_phase_rads = result(0); + arma::interp1(t, tow, tiv, result); + out.TOW_at_current_symbol_s = result(0); + + return result.is_finite(); } double hybrid_observables_cc::compute_T_rx_s(const Gnss_Synchro& a) @@ -350,49 +346,6 @@ void hybrid_observables_cc::clean_history(std::deque& data) } } -std::pair hybrid_observables_cc::find_closest(std::deque& data, const double& ti) -{ - std::pair result; - unsigned int index = 0; - double delta_t = std::numeric_limits::max(); - std::deque::iterator it; - unsigned int aux = 0; - for(it = data.begin(); it != data.end(); it++) - { - double instant_delta = std::fabs(ti - it->RX_time); - if(instant_delta < delta_t) - { - delta_t = instant_delta; - index = aux; - } - aux++; - } - delta_t = ti - data.at(index).RX_time; - if( (index == 0) or (index == (data.size() - 1)) ) - { - Gnss_Synchro invalid_data; - invalid_data.Flag_valid_pseudorange = false; - result.first = invalid_data; - result.second = invalid_data; - } - else if(delta_t < 0.0) - { - result.first = data.at(index); - result.first.Flag_valid_pseudorange = true; - result.second = data.at(index - 1); - result.second.Flag_valid_pseudorange = true; - } - else - { - result.first = data.at(index + 1); - result.first.Flag_valid_pseudorange = true; - result.second = data.at(index); - result.second.Flag_valid_pseudorange = true; - } - return result; -} - - void hybrid_observables_cc::correct_TOW_and_compute_prange(std::vector& data) { std::vector::iterator it; @@ -417,6 +370,10 @@ void hybrid_observables_cc::correct_TOW_and_compute_prange(std::vectorPRN << " = " << tow_dif_ * 1e3 << "[ms]. Equivalent to " << tow_dif_ * SPEED_OF_LIGHT << " meters in pseudorange"; + std::cout << TEXT_RED << "System " << it->System << ". Signals " << it->Signal << " and " << it2->Signal + << ". TOW difference in PRN " << it->PRN + << " = " << tow_dif_ * 1e3 << "[ms]. Equivalent to " << tow_dif_ * SPEED_OF_LIGHT + << " meters in pseudorange" << TEXT_RESET << std::endl; } } } @@ -514,17 +471,15 @@ int hybrid_observables_cc::general_work(int noutput_items __attribute__((unused) { if(valid_channels[i]) { - std::pair gnss_pair = find_closest(*it, T_rx_s_out); - Gnss_Synchro interpolated_gnss_synchro = gnss_pair.second; - if(interpolated_gnss_synchro.Flag_valid_pseudorange) + Gnss_Synchro interpolated_gnss_synchro; + if(interpolate_data(interpolated_gnss_synchro, *it, T_rx_s_out)) { - interpolated_gnss_synchro.Carrier_Doppler_hz = interpolate_data(gnss_pair, T_rx_s_out, 0); - interpolated_gnss_synchro.Carrier_phase_rads = interpolate_data(gnss_pair, T_rx_s_out, 1); - interpolated_gnss_synchro.TOW_at_current_symbol_s = interpolate_data(gnss_pair, T_rx_s_out, 2); - epoch_data.push_back(interpolated_gnss_synchro); } - else { valid_channels[i] = false; } + else + { + valid_channels[i] = false; + } } i++; } diff --git a/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.h b/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.h index f48f5ce22..127bba60a 100644 --- a/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.h +++ b/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.h @@ -38,7 +38,6 @@ #include #include #include -#include //std::pair #include //std::vector #include #include @@ -67,8 +66,7 @@ private: hybrid_observables_cc(unsigned int nchannels_in, unsigned int nchannels_out, bool dump, std::string dump_filename); void clean_history(std::deque& data); double compute_T_rx_s(const Gnss_Synchro& a); - double interpolate_data(const std::pair& a, const double& ti, int parameter); - std::pair find_closest(std::deque& data, const double& ti); + bool interpolate_data(Gnss_Synchro& out, std::deque& data, const double& ti); void correct_TOW_and_compute_prange(std::vector& data); int save_matfile(); diff --git a/src/algorithms/telemetry_decoder/gnuradio_blocks/galileo_e1b_telemetry_decoder_cc.cc b/src/algorithms/telemetry_decoder/gnuradio_blocks/galileo_e1b_telemetry_decoder_cc.cc index 40d737246..34b829252 100644 --- a/src/algorithms/telemetry_decoder/gnuradio_blocks/galileo_e1b_telemetry_decoder_cc.cc +++ b/src/algorithms/telemetry_decoder/gnuradio_blocks/galileo_e1b_telemetry_decoder_cc.cc @@ -107,7 +107,6 @@ galileo_e1b_telemetry_decoder_cc::galileo_e1b_telemetry_decoder_cc( gr::block("galileo_e1b_telemetry_decoder_cc", gr::io_signature::make(1, 1, sizeof(Gnss_Synchro)), gr::io_signature::make(1, 1, sizeof(Gnss_Synchro))) { - set_max_noutput_items(1); // Telemetry Bit transition synchronization port out this->message_port_register_out(pmt::mp("preamble_timestamp_s")); // Ephemeris data port out diff --git a/src/algorithms/telemetry_decoder/gnuradio_blocks/galileo_e5a_telemetry_decoder_cc.cc b/src/algorithms/telemetry_decoder/gnuradio_blocks/galileo_e5a_telemetry_decoder_cc.cc index 928f14ac6..6ae735b57 100644 --- a/src/algorithms/telemetry_decoder/gnuradio_blocks/galileo_e5a_telemetry_decoder_cc.cc +++ b/src/algorithms/telemetry_decoder/gnuradio_blocks/galileo_e5a_telemetry_decoder_cc.cc @@ -183,7 +183,6 @@ galileo_e5a_telemetry_decoder_cc::galileo_e5a_telemetry_decoder_cc( gr::io_signature::make(1, 1, sizeof(Gnss_Synchro)), gr::io_signature::make(1, 1, sizeof(Gnss_Synchro))) { - set_max_noutput_items(1); // Telemetry Bit transition synchronization port out this->message_port_register_out(pmt::mp("preamble_timestamp_s")); // Ephemeris data port out diff --git a/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_cc.cc b/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_cc.cc index ccbd17d9e..df6cbb6d8 100644 --- a/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_cc.cc +++ b/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_cc.cc @@ -55,7 +55,6 @@ gps_l1_ca_telemetry_decoder_cc::gps_l1_ca_telemetry_decoder_cc( gr::block("gps_navigation_cc", gr::io_signature::make(1, 1, sizeof(Gnss_Synchro)), gr::io_signature::make(1, 1, sizeof(Gnss_Synchro))) { - set_max_noutput_items(1); // Telemetry Bit transition synchronization port out this->message_port_register_out(pmt::mp("preamble_timestamp_s")); // Ephemeris data port out @@ -95,8 +94,8 @@ gps_l1_ca_telemetry_decoder_cc::gps_l1_ca_telemetry_decoder_cc( d_GPS_frame_4bytes = 0; d_prev_GPS_frame_4bytes = 0; d_flag_parity = false; - d_TOW_at_Preamble = 0; - d_TOW_at_current_symbol = 0; + d_TOW_at_Preamble = 0.0; + d_TOW_at_current_symbol = 0.0; flag_TOW_set = false; d_average_count = 0; d_flag_preamble = false; @@ -106,6 +105,7 @@ gps_l1_ca_telemetry_decoder_cc::gps_l1_ca_telemetry_decoder_cc( d_channel = 0; flag_PLL_180_deg_phase_locked = false; d_preamble_time_samples = 0; + d_TOW_at_current_symbol_ms = 0; } @@ -206,7 +206,7 @@ int gps_l1_ca_telemetry_decoder_cc::general_work (int noutput_items __attribute_ else if (d_stat == 1) //check 6 seconds of preamble separation { preamble_diff_ms = round(((static_cast(d_symbol_history.at(0).Tracking_sample_counter) - d_preamble_time_samples) / static_cast(d_symbol_history.at(0).fs)) * 1000.0); - if (abs(preamble_diff_ms - GPS_SUBFRAME_MS) < 1) + if (abs(preamble_diff_ms - GPS_SUBFRAME_MS) == 0) { DLOG(INFO) << "Preamble confirmation for SAT " << this->d_satellite; d_GPS_FSM.Event_gps_word_preamble(); @@ -351,17 +351,21 @@ int gps_l1_ca_telemetry_decoder_cc::general_work (int noutput_items __attribute_ // /(double)current_symbol.fs; // update TOW at the preamble instant (account with decoder latency) - d_TOW_at_Preamble = d_GPS_FSM.d_nav.d_TOW + 2 * GPS_L1_CA_CODE_PERIOD + GPS_CA_PREAMBLE_DURATION_S; - d_TOW_at_current_symbol = floor(d_TOW_at_Preamble * 1000.0) / 1000.0; + d_TOW_at_Preamble = d_GPS_FSM.d_nav.d_TOW + 1.0 * GPS_L1_CA_CODE_PERIOD + GPS_CA_PREAMBLE_DURATION_S; + d_TOW_at_current_symbol_ms = static_cast(d_GPS_FSM.d_nav.d_TOW) * 1000 + 161; + //d_TOW_at_current_symbol = floor(d_TOW_at_Preamble * 1000.0) / 1000.0; + d_TOW_at_current_symbol = d_TOW_at_Preamble; flag_TOW_set = true; d_flag_new_tow_available = false; } else { - d_TOW_at_current_symbol = d_TOW_at_current_symbol + GPS_L1_CA_CODE_PERIOD; + d_TOW_at_current_symbol += GPS_L1_CA_CODE_PERIOD; + d_TOW_at_current_symbol_ms++; } - current_symbol.TOW_at_current_symbol_s = d_TOW_at_current_symbol; + current_symbol.TOW_at_current_symbol_s = static_cast(d_TOW_at_current_symbol_ms) / 1000.0; + //current_symbol.TOW_at_current_symbol_s = d_TOW_at_current_symbol; current_symbol.Flag_valid_word = flag_TOW_set; if (flag_PLL_180_deg_phase_locked == true) diff --git a/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_cc.h b/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_cc.h index 28c006adf..b43893f09 100644 --- a/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_cc.h +++ b/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_cc.h @@ -107,8 +107,9 @@ private: unsigned long int d_preamble_time_samples; - long double d_TOW_at_Preamble; - long double d_TOW_at_current_symbol; + double d_TOW_at_Preamble; + double d_TOW_at_current_symbol; + unsigned int d_TOW_at_current_symbol_ms; bool flag_TOW_set; bool flag_PLL_180_deg_phase_locked; diff --git a/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l2c_telemetry_decoder_cc.cc b/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l2c_telemetry_decoder_cc.cc index f4a64d06f..5a2bbf8e4 100644 --- a/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l2c_telemetry_decoder_cc.cc +++ b/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l2c_telemetry_decoder_cc.cc @@ -32,6 +32,7 @@ #include "gps_l2c_telemetry_decoder_cc.h" #include "gnss_synchro.h" +#include "display.h" #include #include #include @@ -54,7 +55,6 @@ gps_l2c_telemetry_decoder_cc::gps_l2c_telemetry_decoder_cc( gr::io_signature::make(1, 1, sizeof(Gnss_Synchro)), gr::io_signature::make(1, 1, sizeof(Gnss_Synchro))) { - set_max_noutput_items(1); // Telemetry Bit transition synchronization port out this->message_port_register_out(pmt::mp("preamble_timestamp_s")); // Ephemeris data port out @@ -133,21 +133,21 @@ int gps_l2c_telemetry_decoder_cc::general_work (int noutput_items __attribute__( { // get ephemeris object for this SV std::shared_ptr tmp_obj = std::make_shared(d_CNAV_Message.get_ephemeris()); - std::cout << "New GPS CNAV message received: ephemeris from satellite " << d_satellite << std::endl; + std::cout << TEXT_BLUE << "New GPS CNAV message received: ephemeris from satellite " << d_satellite << TEXT_RESET << std::endl; this->message_port_pub(pmt::mp("telemetry"), pmt::make_any(tmp_obj)); } if (d_CNAV_Message.have_new_iono() == true) { std::shared_ptr tmp_obj = std::make_shared(d_CNAV_Message.get_iono()); - std::cout << "New GPS CNAV message received: iono model parameters from satellite " << d_satellite << std::endl; + std::cout << TEXT_BLUE << "New GPS CNAV message received: iono model parameters from satellite " << d_satellite << TEXT_RESET << std::endl; this->message_port_pub(pmt::mp("telemetry"), pmt::make_any(tmp_obj)); } if (d_CNAV_Message.have_new_utc_model() == true) { std::shared_ptr tmp_obj = std::make_shared(d_CNAV_Message.get_utc_model()); - std::cout << "New GPS CNAV message received: UTC model parameters from satellite " << d_satellite << std::endl; + std::cout << TEXT_BLUE << "New GPS CNAV message received: UTC model parameters from satellite " << d_satellite << TEXT_RESET << std::endl; this->message_port_pub(pmt::mp("telemetry"), pmt::make_any(tmp_obj)); } diff --git a/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l5_telemetry_decoder_cc.cc b/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l5_telemetry_decoder_cc.cc index eb8e4a976..44ebc407b 100644 --- a/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l5_telemetry_decoder_cc.cc +++ b/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l5_telemetry_decoder_cc.cc @@ -56,7 +56,6 @@ gps_l5_telemetry_decoder_cc::gps_l5_telemetry_decoder_cc( gr::io_signature::make(1, 1, sizeof(Gnss_Synchro)), gr::io_signature::make(1, 1, sizeof(Gnss_Synchro))) { - set_max_noutput_items(1); // Telemetry Bit transition synchronization port out this->message_port_register_out(pmt::mp("preamble_timestamp_s")); // Ephemeris data port out diff --git a/src/algorithms/tracking/gnuradio_blocks/galileo_e1_dll_pll_veml_tracking_cc.cc b/src/algorithms/tracking/gnuradio_blocks/galileo_e1_dll_pll_veml_tracking_cc.cc index 8359f0e77..925ac457d 100755 --- a/src/algorithms/tracking/gnuradio_blocks/galileo_e1_dll_pll_veml_tracking_cc.cc +++ b/src/algorithms/tracking/gnuradio_blocks/galileo_e1_dll_pll_veml_tracking_cc.cc @@ -118,7 +118,6 @@ galileo_e1_dll_pll_veml_tracking_cc::galileo_e1_dll_pll_veml_tracking_cc( gr::block("galileo_e1_dll_pll_veml_tracking_cc", gr::io_signature::make(1, 1, sizeof(gr_complex)), gr::io_signature::make(1, 1, sizeof(Gnss_Synchro))) { - set_max_noutput_items(1); // Telemetry bit synchronization message port input this->message_port_register_in(pmt::mp("preamble_timestamp_s")); this->set_relative_rate(1.0 / vector_length); diff --git a/src/algorithms/tracking/gnuradio_blocks/galileo_e5a_dll_pll_tracking_cc.cc b/src/algorithms/tracking/gnuradio_blocks/galileo_e5a_dll_pll_tracking_cc.cc index c7f30d867..c91d59a68 100644 --- a/src/algorithms/tracking/gnuradio_blocks/galileo_e5a_dll_pll_tracking_cc.cc +++ b/src/algorithms/tracking/gnuradio_blocks/galileo_e5a_dll_pll_tracking_cc.cc @@ -98,7 +98,6 @@ Galileo_E5a_Dll_Pll_Tracking_cc::Galileo_E5a_Dll_Pll_Tracking_cc( gr::block("Galileo_E5a_Dll_Pll_Tracking_cc", gr::io_signature::make(1, 1, sizeof(gr_complex)), gr::io_signature::make(1, 1, sizeof(Gnss_Synchro))) { - set_max_noutput_items(1); // Telemetry bit synchronization message port input this->message_port_register_in(pmt::mp("preamble_timestamp_s")); this->message_port_register_out(pmt::mp("events")); diff --git a/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_tracking_cc.cc b/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_tracking_cc.cc index 89f3ba0ec..cfd4c69bd 100644 --- a/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_tracking_cc.cc +++ b/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_tracking_cc.cc @@ -94,7 +94,6 @@ Gps_L1_Ca_Dll_Pll_Tracking_cc::Gps_L1_Ca_Dll_Pll_Tracking_cc( gr::block("Gps_L1_Ca_Dll_Pll_Tracking_cc", gr::io_signature::make(1, 1, sizeof(gr_complex)), gr::io_signature::make(1, 1, sizeof(Gnss_Synchro))) { - set_max_noutput_items(1); // Telemetry bit synchronization message port input this->message_port_register_in(pmt::mp("preamble_timestamp_s")); this->message_port_register_out(pmt::mp("events")); diff --git a/src/algorithms/tracking/gnuradio_blocks/gps_l2_m_dll_pll_tracking_cc.cc b/src/algorithms/tracking/gnuradio_blocks/gps_l2_m_dll_pll_tracking_cc.cc index 9bd8d7967..bf1f1513b 100644 --- a/src/algorithms/tracking/gnuradio_blocks/gps_l2_m_dll_pll_tracking_cc.cc +++ b/src/algorithms/tracking/gnuradio_blocks/gps_l2_m_dll_pll_tracking_cc.cc @@ -91,7 +91,6 @@ gps_l2_m_dll_pll_tracking_cc::gps_l2_m_dll_pll_tracking_cc( gr::block("gps_l2_m_dll_pll_tracking_cc", gr::io_signature::make(1, 1, sizeof(gr_complex)), gr::io_signature::make(1, 1, sizeof(Gnss_Synchro))) { - set_max_noutput_items(1); // Telemetry bit synchronization message port input this->message_port_register_in(pmt::mp("preamble_timestamp_s")); this->message_port_register_out(pmt::mp("events")); diff --git a/src/algorithms/tracking/gnuradio_blocks/gps_l5i_dll_pll_tracking_cc.cc b/src/algorithms/tracking/gnuradio_blocks/gps_l5i_dll_pll_tracking_cc.cc index b97cc804a..f0b56afa6 100644 --- a/src/algorithms/tracking/gnuradio_blocks/gps_l5i_dll_pll_tracking_cc.cc +++ b/src/algorithms/tracking/gnuradio_blocks/gps_l5i_dll_pll_tracking_cc.cc @@ -92,7 +92,6 @@ gps_l5i_dll_pll_tracking_cc::gps_l5i_dll_pll_tracking_cc( gr::block("gps_l5i_dll_pll_tracking_cc", gr::io_signature::make(1, 1, sizeof(gr_complex)), gr::io_signature::make(1, 1, sizeof(Gnss_Synchro))) { - set_max_noutput_items(1); // Telemetry bit synchronization message port input this->message_port_register_in(pmt::mp("preamble_timestamp_s")); this->message_port_register_out(pmt::mp("events")); diff --git a/src/core/system_parameters/gps_navigation_message.cc b/src/core/system_parameters/gps_navigation_message.cc index 27a4e26c7..cf0d7aa0d 100644 --- a/src/core/system_parameters/gps_navigation_message.cc +++ b/src/core/system_parameters/gps_navigation_message.cc @@ -39,7 +39,7 @@ m * \file gps_navigation_message.cc void Gps_Navigation_Message::reset() { b_valid_ephemeris_set_flag = false; - d_TOW = 0; + d_TOW = 0.0; d_TOW_SF1 = 0; d_TOW_SF2 = 0; d_TOW_SF3 = 0; @@ -70,7 +70,7 @@ void Gps_Navigation_Message::reset() i_SV_accuracy = 0; i_SV_health = 0; d_TGD = 0; - d_IODC = -1; + d_IODC = -1.0; i_AODO = 0; b_fit_interval_flag = false; @@ -298,7 +298,7 @@ int Gps_Navigation_Message::subframe_decoder(char *subframe) //TOW = bin2dec(subframe(31:47)) * 6; d_TOW_SF1 = static_cast(read_navigation_unsigned(subframe_bits, TOW)); //we are in the first subframe (the transmitted TOW is the start time of the next subframe) ! - d_TOW_SF1 = d_TOW_SF1 * 6; + d_TOW_SF1 = d_TOW_SF1 * 6.0; d_TOW = d_TOW_SF1; // Set transmission time b_integrity_status_flag = read_navigation_bool(subframe_bits, INTEGRITY_STATUS_FLAG); b_alert_flag = read_navigation_bool(subframe_bits, ALERT_FLAG); @@ -324,7 +324,7 @@ int Gps_Navigation_Message::subframe_decoder(char *subframe) case 2: //--- It is subframe 2 ------------------- d_TOW_SF2 = static_cast(read_navigation_unsigned(subframe_bits, TOW)); - d_TOW_SF2 = d_TOW_SF2 * 6; + d_TOW_SF2 = d_TOW_SF2 * 6.0; d_TOW = d_TOW_SF2; // Set transmission time b_integrity_status_flag = read_navigation_bool(subframe_bits, INTEGRITY_STATUS_FLAG); b_alert_flag = read_navigation_bool(subframe_bits, ALERT_FLAG); @@ -354,7 +354,7 @@ int Gps_Navigation_Message::subframe_decoder(char *subframe) case 3: // --- It is subframe 3 ------------------------------------- d_TOW_SF3 = static_cast(read_navigation_unsigned(subframe_bits, TOW)); - d_TOW_SF3 = d_TOW_SF3 * 6; + d_TOW_SF3 = d_TOW_SF3 * 6.0; d_TOW = d_TOW_SF3; // Set transmission time b_integrity_status_flag = read_navigation_bool(subframe_bits, INTEGRITY_STATUS_FLAG); b_alert_flag = read_navigation_bool(subframe_bits, ALERT_FLAG); @@ -383,7 +383,7 @@ int Gps_Navigation_Message::subframe_decoder(char *subframe) int SV_data_ID; int SV_page; d_TOW_SF4 = static_cast(read_navigation_unsigned(subframe_bits, TOW)); - d_TOW_SF4 = d_TOW_SF4 * 6; + d_TOW_SF4 = d_TOW_SF4 * 6.0; d_TOW = d_TOW_SF4; // Set transmission time b_integrity_status_flag = read_navigation_bool(subframe_bits, INTEGRITY_STATUS_FLAG); b_alert_flag = read_navigation_bool(subframe_bits, ALERT_FLAG); @@ -459,7 +459,7 @@ int Gps_Navigation_Message::subframe_decoder(char *subframe) int SV_data_ID_5; int SV_page_5; d_TOW_SF5 = static_cast(read_navigation_unsigned(subframe_bits, TOW)); - d_TOW_SF5 = d_TOW_SF5 * 6; + d_TOW_SF5 = d_TOW_SF5 * 6.0; d_TOW = d_TOW_SF5; // Set transmission time b_integrity_status_flag = read_navigation_bool(subframe_bits, INTEGRITY_STATUS_FLAG); b_alert_flag = read_navigation_bool(subframe_bits, ALERT_FLAG); @@ -679,9 +679,9 @@ bool Gps_Navigation_Message::satellite_validation() // First Step: // check Issue Of Ephemeris Data (IODE IODC..) to find a possible interrupted reception // and check if the data have been filled (!=0) - if (d_TOW_SF1 != 0 and d_TOW_SF2 != 0 and d_TOW_SF3 != 0) + if (d_TOW_SF1 != 0.0 and d_TOW_SF2 != 0.0 and d_TOW_SF3 != 0.0) { - if (d_IODE_SF2 == d_IODE_SF3 and d_IODC == d_IODE_SF2 and d_IODC!= -1) + if (d_IODE_SF2 == d_IODE_SF3 and d_IODC == d_IODE_SF2 and d_IODC != -1.0) { flag_data_valid = true; b_valid_ephemeris_set_flag = true; diff --git a/src/tests/unit-tests/signal-processing-blocks/observables/hybrid_observables_test.cc b/src/tests/unit-tests/signal-processing-blocks/observables/hybrid_observables_test.cc index 3f5923460..32113d21a 100644 --- a/src/tests/unit-tests/signal-processing-blocks/observables/hybrid_observables_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/observables/hybrid_observables_test.cc @@ -36,11 +36,8 @@ #include #include #include -#include -#include #include #include -#include #include #include "GPS_L1_CA.h" #include "gnss_satellite.h" @@ -57,9 +54,10 @@ #include "observables_dump_reader.h" #include "tlm_dump_reader.h" #include "gps_l1_ca_dll_pll_tracking.h" -#include "gps_l1_ca_dll_pll_c_aid_tracking.h" #include "hybrid_observables.h" #include "signal_generator_flags.h" +#include "gnss_sdr_sample_counter.h" +#include // ######## GNURADIO BLOCK MESSAGE RECEVER FOR TRACKING MESSAGES ######### @@ -189,18 +187,17 @@ public: int configure_generator(); int generate_signal(); void check_results_carrier_phase( - arma::vec & true_ch0_phase_cycles, - arma::vec & true_ch1_phase_cycles, - arma::vec & true_ch0_tow_s, - arma::vec & measuded_ch0_phase_cycles, - arma::vec & measuded_ch1_phase_cycles, - arma::vec & measuded_ch0_RX_time_s); + arma::mat& true_ch0, + arma::mat& true_ch1, + arma::vec& true_tow_s, + arma::mat& measured_ch0, + arma::mat& measured_ch1); void check_results_code_psudorange( - arma::vec & true_ch0_dist_m, arma::vec & true_ch1_dist_m, - arma::vec & true_ch0_tow_s, - arma::vec & measuded_ch0_Pseudorange_m, - arma::vec & measuded_ch1_Pseudorange_m, - arma::vec & measuded_ch0_RX_time_s); + arma::mat& true_ch0, + arma::mat& true_ch1, + arma::vec& true_tow_s, + arma::mat& measured_ch0, + arma::mat& measured_ch1); HybridObservablesTest() { @@ -289,7 +286,7 @@ void HybridObservablesTest::configure_receiver() config->set_property("Tracking_1C.if", "0"); config->set_property("Tracking_1C.dump", "true"); config->set_property("Tracking_1C.dump_filename", "./tracking_ch_"); - config->set_property("Tracking_1C.pll_bw_hz", "15.0"); + config->set_property("Tracking_1C.pll_bw_hz", "35.0"); config->set_property("Tracking_1C.dll_bw_hz", "0.5"); config->set_property("Tracking_1C.early_late_space_chips", "0.5"); @@ -300,27 +297,37 @@ void HybridObservablesTest::configure_receiver() } void HybridObservablesTest::check_results_carrier_phase( - arma::vec & true_ch0_phase_cycles, - arma::vec & true_ch1_phase_cycles, - arma::vec & true_ch0_tow_s, - arma::vec & measuded_ch0_phase_cycles, - arma::vec & measuded_ch1_phase_cycles, - arma::vec & measuded_ch0_RX_time_s) + arma::mat& true_ch0, + arma::mat& true_ch1, + arma::vec& true_tow_s, + arma::mat& measured_ch0, + arma::mat& measured_ch1) { //1. True value interpolation to match the measurement times + double t0 = std::max(measured_ch0(0, 0), measured_ch1(0, 0)); + int size1 = measured_ch0.col(0).n_rows; + int size2 = measured_ch1.col(0).n_rows; + double t1 = std::min(measured_ch0(size1 - 1, 0), measured_ch1(size2 - 1, 0)); + arma::vec t = arma::linspace(t0, t1, floor((t1 - t0) * 1e3)); + arma::vec true_ch0_phase_interp; arma::vec true_ch1_phase_interp; - arma::interp1(true_ch0_tow_s, true_ch0_phase_cycles, measuded_ch0_RX_time_s, true_ch0_phase_interp); - arma::interp1(true_ch0_tow_s, true_ch1_phase_cycles, measuded_ch0_RX_time_s, true_ch1_phase_interp); + arma::interp1(true_tow_s, true_ch0.col(3), t, true_ch0_phase_interp); + arma::interp1(true_tow_s, true_ch1.col(3), t, true_ch1_phase_interp); + + arma::vec meas_ch0_phase_interp; + arma::vec meas_ch1_phase_interp; + arma::interp1(measured_ch0.col(0), measured_ch0.col(3), t, meas_ch0_phase_interp); + arma::interp1(measured_ch1.col(0), measured_ch1.col(3), t, meas_ch1_phase_interp); //2. RMSE arma::vec err_ch0_cycles; arma::vec err_ch1_cycles; //compute error without the accumulated carrier phase offsets (which depends on the receiver starting time) - err_ch0_cycles = measuded_ch0_phase_cycles - true_ch0_phase_interp - measuded_ch0_phase_cycles(0) + true_ch0_phase_interp(0); - err_ch1_cycles = measuded_ch1_phase_cycles - true_ch1_phase_interp - measuded_ch1_phase_cycles(0) + true_ch1_phase_interp(0); + err_ch0_cycles = meas_ch0_phase_interp - true_ch0_phase_interp - meas_ch0_phase_interp(0) + true_ch0_phase_interp(0); + err_ch1_cycles = meas_ch1_phase_interp - true_ch1_phase_interp - meas_ch1_phase_interp(0) + true_ch1_phase_interp(0); arma::vec err2_ch0 = arma::square(err_ch0_cycles); double rmse_ch0 = sqrt(arma::mean(err2_ch0)); @@ -347,58 +354,68 @@ void HybridObservablesTest::check_results_carrier_phase( //5. report std::streamsize ss = std::cout.precision(); - std::cout << std::setprecision(10) << "Channel 0 Carrier phase RMSE=" - << rmse_ch0 << ", mean=" << error_mean_ch0 - << ", stdev=" << sqrt(error_var_ch0) - << " (max,min)=" << max_error_ch0 + std::cout << std::setprecision(10) << "Channel 0 Carrier phase RMSE = " + << rmse_ch0 << ", mean = " << error_mean_ch0 + << ", stdev = " << sqrt(error_var_ch0) + << " (max,min) = " << max_error_ch0 << "," << min_error_ch0 << " [cycles]" << std::endl; std::cout.precision (ss); - ASSERT_LT(rmse_ch0, 1e-2); - ASSERT_LT(error_mean_ch0, 1e-2); - ASSERT_GT(error_mean_ch0, -1e-2); - ASSERT_LT(error_var_ch0, 1e-2); - ASSERT_LT(max_error_ch0, 5e-2); - ASSERT_GT(min_error_ch0, -5e-2); + ASSERT_LT(rmse_ch0, 5e-2); + ASSERT_LT(error_mean_ch0, 5e-2); + ASSERT_GT(error_mean_ch0, -5e-2); + ASSERT_LT(error_var_ch0, 5e-2); + ASSERT_LT(max_error_ch0, 5e-2); + ASSERT_GT(min_error_ch0, -5e-2); //5. report ss = std::cout.precision(); - std::cout << std::setprecision(10) << "Channel 1 Carrier phase RMSE=" - << rmse_ch1 << ", mean=" << error_mean_ch1 - << ", stdev=" << sqrt(error_var_ch1) - << " (max,min)=" << max_error_ch1 + std::cout << std::setprecision(10) << "Channel 1 Carrier phase RMSE = " + << rmse_ch1 << ", mean = " << error_mean_ch1 + << ", stdev = " << sqrt(error_var_ch1) + << " (max,min) = " << max_error_ch1 << "," << min_error_ch1 << " [cycles]" << std::endl; std::cout.precision (ss); - ASSERT_LT(rmse_ch1, 1e-2); - ASSERT_LT(error_mean_ch1, 1e-2); - ASSERT_GT(error_mean_ch1, -1e-2); - ASSERT_LT(error_var_ch1, 1e-2); - ASSERT_LT(max_error_ch1, 5e-2); - ASSERT_GT(min_error_ch1, -5e-2); + ASSERT_LT(rmse_ch1, 5e-2); + ASSERT_LT(error_mean_ch1, 5e-2); + ASSERT_GT(error_mean_ch1, -5e-2); + ASSERT_LT(error_var_ch1, 5e-2); + ASSERT_LT(max_error_ch1, 5e-2); + ASSERT_GT(min_error_ch1, -5e-2); } void HybridObservablesTest::check_results_code_psudorange( - arma::vec & true_ch0_dist_m, - arma::vec & true_ch1_dist_m, - arma::vec & true_ch0_tow_s, - arma::vec & measuded_ch0_Pseudorange_m, - arma::vec & measuded_ch1_Pseudorange_m, - arma::vec & measuded_ch0_RX_time_s) + arma::mat& true_ch0, + arma::mat& true_ch1, + arma::vec& true_tow_s, + arma::mat& measured_ch0, + arma::mat& measured_ch1) { //1. True value interpolation to match the measurement times + double t0 = std::max(measured_ch0(0, 0), measured_ch1(0, 0)); + int size1 = measured_ch0.col(0).n_rows; + int size2 = measured_ch1.col(0).n_rows; + double t1 = std::min(measured_ch0(size1 - 1, 0), measured_ch1(size2 - 1, 0)); + arma::vec t = arma::linspace(t0, t1, floor((t1 - t0) * 1e3)); + arma::vec true_ch0_dist_interp; arma::vec true_ch1_dist_interp; - arma::interp1(true_ch0_tow_s, true_ch0_dist_m, measuded_ch0_RX_time_s, true_ch0_dist_interp); - arma::interp1(true_ch0_tow_s, true_ch1_dist_m, measuded_ch0_RX_time_s, true_ch1_dist_interp); + arma::interp1(true_tow_s, true_ch0.col(1), t, true_ch0_dist_interp); + arma::interp1(true_tow_s, true_ch1.col(1), t, true_ch1_dist_interp); + + arma::vec meas_ch0_dist_interp; + arma::vec meas_ch1_dist_interp; + arma::interp1(measured_ch0.col(0), measured_ch0.col(4), t, meas_ch0_dist_interp); + arma::interp1(measured_ch1.col(0), measured_ch1.col(4), t, meas_ch1_dist_interp); // generate delta pseudoranges - arma::vec delta_true_dist_m = true_ch0_dist_interp-true_ch1_dist_interp; - arma::vec delta_measured_dist_m = measuded_ch0_Pseudorange_m-measuded_ch1_Pseudorange_m; + arma::vec delta_true_dist_m = true_ch0_dist_interp - true_ch1_dist_interp; + arma::vec delta_measured_dist_m = meas_ch0_dist_interp - meas_ch1_dist_interp; //2. RMSE arma::vec err; @@ -417,20 +434,20 @@ void HybridObservablesTest::check_results_code_psudorange( //5. report std::streamsize ss = std::cout.precision(); - std::cout << std::setprecision(10) << "Delta Observables RMSE=" - << rmse << ", mean=" << error_mean - << ", stdev=" << sqrt(error_var) - << " (max,min)=" << max_error + std::cout << std::setprecision(10) << "Delta Observables RMSE = " + << rmse << ", mean = " << error_mean + << ", stdev = " << sqrt(error_var) + << " (max,min) = " << max_error << "," << min_error << " [meters]" << std::endl; std::cout.precision (ss); - ASSERT_LT(rmse, 0.5); - ASSERT_LT(error_mean, 0.5); + ASSERT_LT(rmse, 0.5); + ASSERT_LT(error_mean, 0.5); ASSERT_GT(error_mean, -0.5); - ASSERT_LT(error_var, 0.5); - ASSERT_LT(max_error, 2); - ASSERT_GT(min_error, -2); + ASSERT_LT(error_var, 0.5); + ASSERT_LT(max_error, 2.0); + ASSERT_GT(min_error, -2.0); } @@ -440,7 +457,7 @@ TEST_F(HybridObservablesTest, ValidationOfResults) configure_generator(); // Generate signal raw signal samples and observations RINEX file - if (FLAGS_disable_generator==false) + if (FLAGS_disable_generator == false) { generate_signal(); } @@ -478,9 +495,7 @@ TEST_F(HybridObservablesTest, ValidationOfResults) top_block = gr::make_top_block("Telemetry_Decoder test"); std::shared_ptr tracking_ch0 = std::make_shared(config.get(), "Tracking_1C", 1, 1); - //std::shared_ptr tracking_ch1 = std::make_shared(config.get(), "Tracking_1C", 1, 1); std::shared_ptr tracking_ch1 = std::make_shared(config.get(), "Tracking_1C", 1, 1); - //std::shared_ptr tracking_ch1 = std::make_shared(config.get(), "Tracking_1C", 1, 1); boost::shared_ptr msg_rx_ch0 = HybridObservablesTest_msg_rx_make(); boost::shared_ptr msg_rx_ch1 = HybridObservablesTest_msg_rx_make(); @@ -524,15 +539,15 @@ TEST_F(HybridObservablesTest, ValidationOfResults) tlm_ch0->set_channel(0); tlm_ch1->set_channel(1); - tlm_ch0->set_satellite(Gnss_Satellite(std::string("GPS"),gnss_synchro_ch0.PRN)); - tlm_ch1->set_satellite(Gnss_Satellite(std::string("GPS"),gnss_synchro_ch1.PRN)); + tlm_ch0->set_satellite(Gnss_Satellite(std::string("GPS"), gnss_synchro_ch0.PRN)); + tlm_ch1->set_satellite(Gnss_Satellite(std::string("GPS"), gnss_synchro_ch1.PRN)); }) << "Failure setting gnss_synchro."; boost::shared_ptr tlm_msg_rx_ch1 = HybridObservablesTest_tlm_msg_rx_make(); boost::shared_ptr tlm_msg_rx_ch2 = HybridObservablesTest_tlm_msg_rx_make(); //Observables - std::shared_ptr observables(new HybridObservables(config.get(), "Observables",2, 2)); + std::shared_ptr observables(new HybridObservables(config.get(), "Observables",3, 2)); ASSERT_NO_THROW( { tracking_ch0->set_channel(gnss_synchro_ch0.Channel_ID); @@ -556,7 +571,10 @@ TEST_F(HybridObservablesTest, ValidationOfResults) gr::blocks::interleaved_char_to_complex::sptr gr_interleaved_char_to_complex = gr::blocks::interleaved_char_to_complex::make(); gr::blocks::null_sink::sptr sink_ch0 = gr::blocks::null_sink::make(sizeof(Gnss_Synchro)); gr::blocks::null_sink::sptr sink_ch1 = gr::blocks::null_sink::make(sizeof(Gnss_Synchro)); + gnss_sdr_sample_counter_sptr samp_counter = gnss_sdr_make_sample_counter(static_cast(baseband_sampling_freq)); top_block->connect(file_source, 0, gr_interleaved_char_to_complex, 0); + top_block->connect(gr_interleaved_char_to_complex, 0, samp_counter, 0); + //ch0 top_block->connect(gr_interleaved_char_to_complex, 0, tracking_ch0->get_left_block(), 0); top_block->connect(tracking_ch0->get_right_block(), 0, tlm_ch0->get_left_block(), 0); @@ -570,6 +588,7 @@ TEST_F(HybridObservablesTest, ValidationOfResults) top_block->connect(observables->get_right_block(), 0, sink_ch0, 0); top_block->connect(observables->get_right_block(), 1, sink_ch1, 0); + top_block->connect(samp_counter, 0, observables->get_left_block(), 2); }) << "Failure connecting the blocks."; @@ -589,48 +608,43 @@ TEST_F(HybridObservablesTest, ValidationOfResults) true_observables_reader true_observables; ASSERT_NO_THROW({ - if ( true_observables.open_obs_file(std::string("./obs_out.bin")) == false) - { - throw std::exception(); - }; + if(true_observables.open_obs_file(std::string("./obs_out.bin")) == false) + { + throw std::exception(); + } }) << "Failure opening true observables file"; - long int nepoch = true_observables.num_epochs(); + unsigned int nepoch = static_cast(true_observables.num_epochs()); - std::cout << "True observation epochs=" << nepoch << std::endl; - arma::vec true_ch0_dist_m = arma::zeros(nepoch, 1); - arma::vec true_ch0_acc_carrier_phase_cycles = arma::zeros(nepoch, 1); - arma::vec true_ch0_Doppler_Hz = arma::zeros(nepoch, 1); - arma::vec true_ch0_tow_s = arma::zeros(nepoch, 1); - arma::vec true_ch1_dist_m = arma::zeros(nepoch, 1); - arma::vec true_ch1_acc_carrier_phase_cycles = arma::zeros(nepoch, 1); - arma::vec true_ch1_Doppler_Hz = arma::zeros(nepoch, 1); - arma::vec true_ch1_tow_s = arma::zeros(nepoch, 1); + std::cout << "True observation epochs = " << nepoch << std::endl; + // Matrices for storing columnwise true GPS time, Range, Doppler and Carrier phase + arma::mat true_ch0 = arma::zeros(nepoch, 4); + arma::mat true_ch1 = arma::zeros(nepoch, 4); true_observables.restart(); long int epoch_counter = 0; ASSERT_NO_THROW({ while(true_observables.read_binary_obs()) { - if (round(true_observables.prn[0])!=gnss_synchro_ch0.PRN) + if(round(true_observables.prn[0]) != gnss_synchro_ch0.PRN) { - std::cout<<"True observables SV PRN do not match"< 0) and index(0) < (nepoch - 1)) + { measured_ch0.shed_rows(index(0) + 1, nepoch - 1); } + index = arma::find(measured_ch1.col(0) > 0.0, 1, "last"); + if((index.size() > 0) and index(0) < (nepoch - 1)) + { measured_ch1.shed_rows(index(0) + 1, nepoch - 1); } + //Cut measurement initial transitory of the measurements - arma::uvec initial_meas_point = arma::find(measuded_ch0_RX_time_s >= true_ch0_tow_s(0), 1, "first"); + index = arma::find(measured_ch0.col(0) >= true_ch0(0, 0), 1, "first"); + if((index.size() > 0) and (index(0) > 0)) + { measured_ch0.shed_rows(0, index(0)); } + index = arma::find(measured_ch1.col(0) >= true_ch1(0, 0), 1, "first"); + if((index.size() > 0) and (index(0) > 0)) + { measured_ch1.shed_rows(0, index(0)); } - measuded_ch0_RX_time_s = measuded_ch0_RX_time_s.subvec(initial_meas_point(0), measuded_ch0_RX_time_s.size() - 1); - measuded_ch0_Pseudorange_m = measuded_ch0_Pseudorange_m.subvec(initial_meas_point(0), measuded_ch0_Pseudorange_m.size() - 1); - measuded_ch0_Acc_carrier_phase_hz = measuded_ch0_Acc_carrier_phase_hz.subvec(initial_meas_point(0), measuded_ch0_Acc_carrier_phase_hz.size() - 1); - - measuded_ch1_RX_time_s = measuded_ch1_RX_time_s.subvec(initial_meas_point(0), measuded_ch1_RX_time_s.size() - 1); - measuded_ch1_Pseudorange_m = measuded_ch1_Pseudorange_m.subvec(initial_meas_point(0), measuded_ch1_Pseudorange_m.size() - 1); - measuded_ch1_Acc_carrier_phase_hz = measuded_ch1_Acc_carrier_phase_hz.subvec(initial_meas_point(0), measuded_ch1_Acc_carrier_phase_hz.size() - 1); - - //correct the clock error using true values (it is not possible for a receiver to correct + //Correct the clock error using true values (it is not possible for a receiver to correct //the receiver clock offset error at the observables level because it is required the //decoding of the ephemeris data and solve the PVT equations) - //find the reference satellite and compute the receiver time offset at obsevable level + //Find the reference satellite (the nearest) and compute the receiver time offset at observable level arma::vec receiver_time_offset_s; - if (measuded_ch0_Pseudorange_m(0) Date: Thu, 1 Mar 2018 15:54:51 +0100 Subject: [PATCH 29/61] Check data validity --- .../observables/gnuradio_blocks/hybrid_observables_cc.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc b/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc index 559caafdc..d8b3a5e34 100644 --- a/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc +++ b/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc @@ -290,6 +290,7 @@ int hybrid_observables_cc::save_matfile() bool hybrid_observables_cc::interpolate_data(Gnss_Synchro& out, std::deque& data, const double& ti) { + if((ti < data.front().RX_time) or (ti > data.back().RX_time)) { return false; } std::deque::iterator it; arma::vec t = arma::vec(data.size()); From e58f96a196c6ed19e3443c8602c05ef73e4b7021 Mon Sep 17 00:00:00 2001 From: Antonio Ramos Date: Thu, 1 Mar 2018 17:23:48 +0100 Subject: [PATCH 30/61] Minor change --- src/algorithms/observables/adapters/hybrid_observables.cc | 2 -- .../observables/gnuradio_blocks/hybrid_observables_cc.cc | 3 +-- .../gnuradio_blocks/gps_l1_ca_telemetry_decoder_cc.cc | 4 ++-- 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/src/algorithms/observables/adapters/hybrid_observables.cc b/src/algorithms/observables/adapters/hybrid_observables.cc index c95866a09..64c61522b 100644 --- a/src/algorithms/observables/adapters/hybrid_observables.cc +++ b/src/algorithms/observables/adapters/hybrid_observables.cc @@ -32,8 +32,6 @@ #include "hybrid_observables.h" #include "configuration_interface.h" -#include "Galileo_E1.h" -#include "GPS_L1_CA.h" #include diff --git a/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc b/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc index d8b3a5e34..fa4ba397c 100644 --- a/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc +++ b/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc @@ -472,7 +472,7 @@ int hybrid_observables_cc::general_work(int noutput_items __attribute__((unused) { if(valid_channels[i]) { - Gnss_Synchro interpolated_gnss_synchro; + Gnss_Synchro interpolated_gnss_synchro = it->back(); if(interpolate_data(interpolated_gnss_synchro, *it, T_rx_s_out)) { epoch_data.push_back(interpolated_gnss_synchro); @@ -486,7 +486,6 @@ int hybrid_observables_cc::general_work(int noutput_items __attribute__((unused) } d_num_valid_channels = valid_channels.count(); if(d_num_valid_channels == 0) { return 0; } - correct_TOW_and_compute_prange(epoch_data); std::vector::iterator it2 = epoch_data.begin(); for(i = 0; i < d_nchannels; i++) diff --git a/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_cc.cc b/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_cc.cc index df6cbb6d8..b28064ee3 100644 --- a/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_cc.cc +++ b/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_cc.cc @@ -206,7 +206,7 @@ int gps_l1_ca_telemetry_decoder_cc::general_work (int noutput_items __attribute_ else if (d_stat == 1) //check 6 seconds of preamble separation { preamble_diff_ms = round(((static_cast(d_symbol_history.at(0).Tracking_sample_counter) - d_preamble_time_samples) / static_cast(d_symbol_history.at(0).fs)) * 1000.0); - if (abs(preamble_diff_ms - GPS_SUBFRAME_MS) == 0) + if (abs(preamble_diff_ms - GPS_SUBFRAME_MS) < 1) { DLOG(INFO) << "Preamble confirmation for SAT " << this->d_satellite; d_GPS_FSM.Event_gps_word_preamble(); @@ -351,7 +351,7 @@ int gps_l1_ca_telemetry_decoder_cc::general_work (int noutput_items __attribute_ // /(double)current_symbol.fs; // update TOW at the preamble instant (account with decoder latency) - d_TOW_at_Preamble = d_GPS_FSM.d_nav.d_TOW + 1.0 * GPS_L1_CA_CODE_PERIOD + GPS_CA_PREAMBLE_DURATION_S; + d_TOW_at_Preamble = d_GPS_FSM.d_nav.d_TOW + 2.0 * GPS_L1_CA_CODE_PERIOD + GPS_CA_PREAMBLE_DURATION_S; d_TOW_at_current_symbol_ms = static_cast(d_GPS_FSM.d_nav.d_TOW) * 1000 + 161; //d_TOW_at_current_symbol = floor(d_TOW_at_Preamble * 1000.0) / 1000.0; d_TOW_at_current_symbol = d_TOW_at_Preamble; From b3c6d94cb6d4820da3cf88692b04920da17dcb0c Mon Sep 17 00:00:00 2001 From: Antonio Ramos Date: Fri, 2 Mar 2018 10:29:43 +0100 Subject: [PATCH 31/61] debug1 --- src/algorithms/libs/rtklib/rtklib_pntpos.cc | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/algorithms/libs/rtklib/rtklib_pntpos.cc b/src/algorithms/libs/rtklib/rtklib_pntpos.cc index 69f093703..13ec3434b 100644 --- a/src/algorithms/libs/rtklib/rtklib_pntpos.cc +++ b/src/algorithms/libs/rtklib/rtklib_pntpos.cc @@ -54,6 +54,7 @@ #include "rtklib_ephemeris.h" #include "rtklib_ionex.h" #include "rtklib_sbas.h" +#include /* pseudorange measurement error variance ------------------------------------*/ double varerr(const prcopt_t *opt, double el, int sys) @@ -163,7 +164,9 @@ double prange(const obsd_t *obs, const nav_t *nav, const double *azel, } else if((obs->code[i] == CODE_NONE) && (obs->code[j] != CODE_NONE)) { - P2 += P2_C2; /* C2->P2 */ + std::cout << "P1_P2 = " << P1_P2 << std::endl; + std::cout << "P2_C2 = " << P2_C2 << std::endl; + P2 += P2_C2; /* C2->P2 */ PC = P2 - gamma_ * P1_P2 / (1.0 - gamma_); } /* dual-frequency */ From a216d2250970c1684821034ac60b21a72a67b5f1 Mon Sep 17 00:00:00 2001 From: Antonio Ramos Date: Fri, 2 Mar 2018 11:22:46 +0100 Subject: [PATCH 32/61] debug2 --- src/algorithms/libs/rtklib/rtklib_pntpos.cc | 2 -- src/core/system_parameters/gps_cnav_navigation_message.cc | 3 +++ 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/algorithms/libs/rtklib/rtklib_pntpos.cc b/src/algorithms/libs/rtklib/rtklib_pntpos.cc index 13ec3434b..07267c427 100644 --- a/src/algorithms/libs/rtklib/rtklib_pntpos.cc +++ b/src/algorithms/libs/rtklib/rtklib_pntpos.cc @@ -164,8 +164,6 @@ double prange(const obsd_t *obs, const nav_t *nav, const double *azel, } else if((obs->code[i] == CODE_NONE) && (obs->code[j] != CODE_NONE)) { - std::cout << "P1_P2 = " << P1_P2 << std::endl; - std::cout << "P2_C2 = " << P2_C2 << std::endl; P2 += P2_C2; /* C2->P2 */ PC = P2 - gamma_ * P1_P2 / (1.0 - gamma_); } diff --git a/src/core/system_parameters/gps_cnav_navigation_message.cc b/src/core/system_parameters/gps_cnav_navigation_message.cc index 1bdc48360..c4f49f849 100644 --- a/src/core/system_parameters/gps_cnav_navigation_message.cc +++ b/src/core/system_parameters/gps_cnav_navigation_message.cc @@ -258,6 +258,9 @@ void Gps_CNAV_Navigation_Message::decode_page(std::bitset(read_navigation_signed(data_bits, CNAV_TGD)); + //Check if the grup delay value is not available. See IS-GPS-200, Table 30-IV. + //Bit string "1000000000000" is -4096 in 2 complement + if(ephemeris_record.d_TGD < -4095.9) { ephemeris_record.d_TGD = 0.0; } ephemeris_record.d_TGD = ephemeris_record.d_TGD * CNAV_TGD_LSB; ephemeris_record.d_ISCL1 = static_cast(read_navigation_signed(data_bits, CNAV_ISCL1)); ephemeris_record.d_ISCL1 = ephemeris_record.d_ISCL1 * CNAV_ISCL1_LSB; From 3ce49ada96a293cd59b4b0557a55b767a5005402 Mon Sep 17 00:00:00 2001 From: Antonio Ramos Date: Fri, 2 Mar 2018 13:30:21 +0100 Subject: [PATCH 33/61] debug 3 --- src/algorithms/libs/rtklib/rtklib_pntpos.cc | 143 ++++++++++++-------- 1 file changed, 83 insertions(+), 60 deletions(-) diff --git a/src/algorithms/libs/rtklib/rtklib_pntpos.cc b/src/algorithms/libs/rtklib/rtklib_pntpos.cc index 07267c427..01f6f7b4b 100644 --- a/src/algorithms/libs/rtklib/rtklib_pntpos.cc +++ b/src/algorithms/libs/rtklib/rtklib_pntpos.cc @@ -54,7 +54,6 @@ #include "rtklib_ephemeris.h" #include "rtklib_ionex.h" #include "rtklib_sbas.h" -#include /* pseudorange measurement error variance ------------------------------------*/ double varerr(const prcopt_t *opt, double el, int sys) @@ -91,47 +90,52 @@ double prange(const obsd_t *obs, const nav_t *nav, const double *azel, *var = 0.0; if (!(sys = satsys(obs->sat, NULL))) - { - trace(4, "prange: satsys NULL\n"); - return 0.0; - } + { + trace(4, "prange: satsys NULL\n"); + return 0.0; + } /* L1-L2 for GPS/GLO/QZS, L1-L5 for GAL/SBS */ if (sys & (SYS_GAL | SYS_SBS)) {j = 2;} if (sys == SYS_GPS) - { - if(obs->code[1] != CODE_NONE) {j = 1;} - else if(obs->code[2] != CODE_NONE) {j = 2;} - } + { + if(obs->code[1] != CODE_NONE) {j = 1;} + else if(obs->code[2] != CODE_NONE) {j = 2;} + } if (NFREQ<2 || lam[i] == 0.0 || lam[j] == 0.0) - { - trace(4, "prange: NFREQ<2||lam[i]==0.0||lam[j]==0.0\n"); - printf("i: %d j:%d, lam[i]: %f lam[j] %f\n", i, j, lam[i], lam[j]); - return 0.0; - } + { + trace(4, "prange: NFREQ<2||lam[i]==0.0||lam[j]==0.0\n"); + printf("i: %d j:%d, lam[i]: %f lam[j] %f\n", i, j, lam[i], lam[j]); + return 0.0; + } /* test snr mask */ if (iter > 0) + { + if (testsnr(0, i, azel[1], obs->SNR[i] * 0.25, &opt->snrmask)) { - if (testsnr(0, i, azel[1], obs->SNR[i] * 0.25, &opt->snrmask)) - { - trace(4, "snr mask: %s sat=%2d el=%.1f snr=%.1f\n", - time_str(obs->time, 0), obs->sat, azel[1] * R2D, obs->SNR[i] * 0.25); - return 0.0; - } - if (opt->ionoopt == IONOOPT_IFLC) - { - if (testsnr(0, j, azel[1], obs->SNR[j] * 0.25, &opt->snrmask)) - { - trace(4, "prange: testsnr error\n"); - return 0.0; - } - } + trace(4, "snr mask: %s sat=%2d el=%.1f snr=%.1f\n", + time_str(obs->time, 0), obs->sat, azel[1] * R2D, obs->SNR[i] * 0.25); + return 0.0; } - gamma_ = std::pow(lam[j], 2.0) / std::pow(lam[i], 2.0); /* f1^2/f2^2 */ + if (opt->ionoopt == IONOOPT_IFLC) + { + if (testsnr(0, j, azel[1], obs->SNR[j] * 0.25, &opt->snrmask)) + { + trace(4, "prange: testsnr error\n"); + return 0.0; + } + } + } + /* fL1^2 / fL2(orL5)^2 . See IS-GPS-200, p. 103 and Galileo ICD p. 48 */ + if(sys == SYS_GPS or sys == SYS_GAL) + { + gamma_ = std::pow(lam[i], 2.0) / std::pow(lam[j], 2.0); + } + P1 = obs->P[i]; P2 = obs->P[j]; P1_P2 = nav->cbias[obs->sat-1][0]; @@ -139,42 +143,61 @@ double prange(const obsd_t *obs, const nav_t *nav, const double *azel, P2_C2 = nav->cbias[obs->sat-1][2]; /* if no P1-P2 DCB, use TGD instead */ - if (P1_P2 == 0.0 && (sys & (SYS_GPS | SYS_GAL | SYS_QZS))) //CHECK! - { - P1_P2 = (1.0 - gamma_) * gettgd(obs->sat, nav); - } + if(P1_P2 == 0.0 and sys == SYS_GPS) + { + P1_P2 = (gamma_ - 1.0) * gettgd(obs->sat, nav); + } + else if(P1_P2 == 0.0 and sys == SYS_GAL) + { + //TODO + } + if (opt->ionoopt == IONOOPT_IFLC) - { /* dual-frequency */ + { /* dual-frequency */ - if (P1 == 0.0 || P2 == 0.0) { return 0.0; } - if (obs->code[i] == CODE_L1C) { P1 += P1_C1; } /* C1->P1 */ - if (obs->code[j] == CODE_L2C) { P2 += P2_C2; } /* C2->P2 */ + if (P1 == 0.0 || P2 == 0.0) { return 0.0; } + if (obs->code[i] == CODE_L1C) { P1 += P1_C1; } /* C1->P1 */ + if (obs->code[j] == CODE_L2C) { P2 += P2_C2; } /* C2->P2 */ - /* iono-free combination */ - PC = (gamma_ * P1 - P2) / (gamma_ - 1.0); - } + /* iono-free combination */ + PC = (gamma_ * P1 - P2) / (gamma_ - 1.0); + } else - { /* single-frequency */ - if((obs->code[i] == CODE_NONE) && (obs->code[j] == CODE_NONE)) { return 0.0; } + { /* single-frequency */ + if((obs->code[i] == CODE_NONE) && (obs->code[j] == CODE_NONE)) { return 0.0; } - else if((obs->code[i] != CODE_NONE) && (obs->code[j] == CODE_NONE)) - { - P1 += P1_C1; /* C1->P1 */ - PC = P1 - P1_P2 / (1.0 - gamma_); - } - else if((obs->code[i] == CODE_NONE) && (obs->code[j] != CODE_NONE)) - { - P2 += P2_C2; /* C2->P2 */ - PC = P2 - gamma_ * P1_P2 / (1.0 - gamma_); - } - /* dual-frequency */ - else - { - P1 += P1_C1; - P2 += P2_C2; - PC = (gamma_ * P1 - P2) / (gamma_ - 1.0); - } - } + else if((obs->code[i] != CODE_NONE) && (obs->code[j] == CODE_NONE)) + {//CHECK!! + P1 += P1_C1; /* C1->P1 */ + PC = P1 - P1_P2 / (1.0 - gamma_); + } + else if((obs->code[i] == CODE_NONE) && (obs->code[j] != CODE_NONE)) + { + if(sys == SYS_GPS) + {//CHECK!! + P2 += P2_C2; /* C2->P2 */ + PC = P2 - gamma_ * P1_P2 / (1.0 - gamma_); + } + else if(sys == SYS_GAL) + { + //TODO + } + } + /* dual-frequency */ + else + { + if(sys == SYS_GPS) /* See IS-GPS-200 p. 179 */ + { + P1 += P1_C1; + P2 += P2_C2; + PC = (P2 - gamma_ * P1) / (1 - gamma_) - P1_P2 / (gamma_ - 1); + } + else if(sys == SYS_GAL) + { + //TODO + } + } + } if (opt->sateph == EPHOPT_SBAS) { PC -= P1_C1; } /* sbas clock based C1 */ *var = std::pow(ERR_CBIAS, 2.0); From 764656831453e5633654ac6e024070be0e2692f1 Mon Sep 17 00:00:00 2001 From: Antonio Ramos Date: Mon, 5 Mar 2018 11:05:58 +0100 Subject: [PATCH 34/61] debug4 --- src/algorithms/libs/rtklib/rtklib_pntpos.cc | 43 +++++++++++++++------ 1 file changed, 31 insertions(+), 12 deletions(-) diff --git a/src/algorithms/libs/rtklib/rtklib_pntpos.cc b/src/algorithms/libs/rtklib/rtklib_pntpos.cc index 01f6f7b4b..3b951189f 100644 --- a/src/algorithms/libs/rtklib/rtklib_pntpos.cc +++ b/src/algorithms/libs/rtklib/rtklib_pntpos.cc @@ -54,6 +54,8 @@ #include "rtklib_ephemeris.h" #include "rtklib_ionex.h" #include "rtklib_sbas.h" +#include +#include /* pseudorange measurement error variance ------------------------------------*/ double varerr(const prcopt_t *opt, double el, int sys) @@ -84,8 +86,16 @@ double prange(const obsd_t *obs, const nav_t *nav, const double *azel, int iter, const prcopt_t *opt, double *var) { const double *lam = nav->lam[obs->sat - 1]; - double PC, P1, P2, P1_P2, P1_C1, P2_C2, gamma_; - int i = 0, j = 1, sys; + double PC; + double P1; + double P2; + double P1_P2; + double P1_C1; + double P2_C2; + double gamma_ = 0.0; + int i = 0; + int j = 1; + int sys; *var = 0.0; @@ -133,15 +143,22 @@ double prange(const obsd_t *obs, const nav_t *nav, const double *azel, /* fL1^2 / fL2(orL5)^2 . See IS-GPS-200, p. 103 and Galileo ICD p. 48 */ if(sys == SYS_GPS or sys == SYS_GAL) { - gamma_ = std::pow(lam[i], 2.0) / std::pow(lam[j], 2.0); + gamma_ = std::pow(lam[j], 2.0) / std::pow(lam[i], 2.0); } - P1 = obs->P[i]; P2 = obs->P[j]; P1_P2 = nav->cbias[obs->sat-1][0]; P1_C1 = nav->cbias[obs->sat-1][1]; P2_C2 = nav->cbias[obs->sat-1][2]; - + std::string d_dump_filename = "/home/antonio/data/dump_prange.dat"; + std::ofstream d_file; + d_file.exceptions (std::ifstream::failbit | std::ifstream::badbit ); + d_file.open(d_dump_filename.c_str(), std::ios::out | std::ios::binary); + d_file.write(reinterpret_cast(&P1), sizeof(double)); + d_file.write(reinterpret_cast(&P2), sizeof(double)); + d_file.write(reinterpret_cast(&P1_P2), sizeof(double)); + d_file.write(reinterpret_cast(&P1_C1), sizeof(double)); + d_file.write(reinterpret_cast(&P2_C2), sizeof(double)); /* if no P1-P2 DCB, use TGD instead */ if(P1_P2 == 0.0 and sys == SYS_GPS) { @@ -151,7 +168,7 @@ double prange(const obsd_t *obs, const nav_t *nav, const double *azel, { //TODO } - + d_file.write(reinterpret_cast(&P1_P2), sizeof(double)); if (opt->ionoopt == IONOOPT_IFLC) { /* dual-frequency */ @@ -166,17 +183,18 @@ double prange(const obsd_t *obs, const nav_t *nav, const double *azel, { /* single-frequency */ if((obs->code[i] == CODE_NONE) && (obs->code[j] == CODE_NONE)) { return 0.0; } - else if((obs->code[i] != CODE_NONE) && (obs->code[j] == CODE_NONE)) + else if((obs->code[i] != CODE_NONE) and (obs->code[j] == CODE_NONE)) {//CHECK!! P1 += P1_C1; /* C1->P1 */ - PC = P1 - P1_P2 / (1.0 - gamma_); + PC = P1 + P1_P2 / (gamma_ - 1.0); } - else if((obs->code[i] == CODE_NONE) && (obs->code[j] != CODE_NONE)) + else if((obs->code[i] == CODE_NONE) and (obs->code[j] != CODE_NONE)) { if(sys == SYS_GPS) {//CHECK!! P2 += P2_C2; /* C2->P2 */ - PC = P2 - gamma_ * P1_P2 / (1.0 - gamma_); + //PC = P2 - gamma_ * P1_P2 / (1.0 - gamma_); + PC = P2 + gamma_ * P1_P2 / (gamma_ - 1.0); } else if(sys == SYS_GAL) { @@ -190,7 +208,7 @@ double prange(const obsd_t *obs, const nav_t *nav, const double *azel, { P1 += P1_C1; P2 += P2_C2; - PC = (P2 - gamma_ * P1) / (1 - gamma_) - P1_P2 / (gamma_ - 1); + PC = (P2 - gamma_ * P1) / (1.0 - gamma_) - P1_P2 / (gamma_ - 1.0); } else if(sys == SYS_GAL) { @@ -198,10 +216,11 @@ double prange(const obsd_t *obs, const nav_t *nav, const double *azel, } } } + d_file.write(reinterpret_cast(&PC), sizeof(double)); if (opt->sateph == EPHOPT_SBAS) { PC -= P1_C1; } /* sbas clock based C1 */ *var = std::pow(ERR_CBIAS, 2.0); - + d_file.close(); return PC; } From 8d37013e96672672d56fdb1c31e26e25ccf85285 Mon Sep 17 00:00:00 2001 From: Antonio Ramos Date: Mon, 5 Mar 2018 13:07:41 +0100 Subject: [PATCH 35/61] debug 5 --- src/algorithms/libs/rtklib/rtklib.h | 1 + .../libs/rtklib/rtklib_conversions.cc | 16 +++-- src/algorithms/libs/rtklib/rtklib_pntpos.cc | 66 ++++++++++++++++++- src/algorithms/libs/rtklib/rtklib_pntpos.h | 6 ++ src/algorithms/libs/rtklib/rtklib_rtkcmn.cc | 2 +- 5 files changed, 82 insertions(+), 9 deletions(-) diff --git a/src/algorithms/libs/rtklib/rtklib.h b/src/algorithms/libs/rtklib/rtklib.h index 8d172b171..162d445c6 100644 --- a/src/algorithms/libs/rtklib/rtklib.h +++ b/src/algorithms/libs/rtklib/rtklib.h @@ -464,6 +464,7 @@ typedef struct { /* GPS/QZS/GAL broadcast ephemeris type */ /* GPS/QZS:tgd[0]=TGD */ /* GAL :tgd[0]=BGD E5a/E1,tgd[1]=BGD E5b/E1 */ /* BDS :tgd[0]=BGD1,tgd[1]=BGD2 */ + double isc[4]; /* GPS :isc[0]=ISCL1, isc[1]=ISCL2, isc[2]=ISCL5I, isc[3]=ISCL5Q */ double Adot,ndot; /* Adot,ndot for CNAV */ } eph_t; diff --git a/src/algorithms/libs/rtklib/rtklib_conversions.cc b/src/algorithms/libs/rtklib/rtklib_conversions.cc index 7f1d933a6..c0bf8929c 100644 --- a/src/algorithms/libs/rtklib/rtklib_conversions.cc +++ b/src/algorithms/libs/rtklib/rtklib_conversions.cc @@ -117,7 +117,7 @@ geph_t eph_to_rtklib(const Glonass_Gnav_Ephemeris & glonass_gnav_eph, const Glon eph_t eph_to_rtklib(const Galileo_Ephemeris & gal_eph) { 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, 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 }; //Galileo is the third satellite system for RTKLIB, so, add the required offset to discriminate Galileo ephemeris rtklib_sat.sat = gal_eph.i_satellite_PRN+NSATGPS+NSATGLO; rtklib_sat.A = gal_eph.A_1 * gal_eph.A_1; @@ -167,7 +167,7 @@ eph_t eph_to_rtklib(const Galileo_Ephemeris & gal_eph) eph_t eph_to_rtklib(const Gps_Ephemeris & gps_eph) { 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, 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 }; rtklib_sat.sat = gps_eph.i_satellite_PRN; rtklib_sat.A = gps_eph.d_sqrt_A * gps_eph.d_sqrt_A; rtklib_sat.M0 = gps_eph.d_M_0; @@ -216,7 +216,7 @@ eph_t eph_to_rtklib(const Gps_Ephemeris & gps_eph) eph_t eph_to_rtklib(const Gps_CNAV_Ephemeris & gps_cnav_eph) { 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, 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 }; rtklib_sat.sat = gps_cnav_eph.i_satellite_PRN; const double A_REF = 26559710.0; // See IS-GPS-200H, pp. 170 rtklib_sat.A = A_REF + gps_cnav_eph.d_DELTA_A; @@ -245,9 +245,13 @@ eph_t eph_to_rtklib(const Gps_CNAV_Ephemeris & gps_cnav_eph) rtklib_sat.f1 = gps_cnav_eph.d_A_f1; rtklib_sat.f2 = gps_cnav_eph.d_A_f2; rtklib_sat.tgd[0] = gps_cnav_eph.d_TGD; - rtklib_sat.tgd[1] = 0; - rtklib_sat.tgd[2] = 0; - rtklib_sat.tgd[3] = 0; + rtklib_sat.tgd[1] = 0.0; + rtklib_sat.tgd[2] = 0.0; + rtklib_sat.tgd[3] = 0.0; + rtklib_sat.isc[0] = gps_cnav_eph.d_ISCL1; + rtklib_sat.isc[1] = gps_cnav_eph.d_ISCL2; + rtklib_sat.isc[2] = gps_cnav_eph.d_ISCL5I; + rtklib_sat.isc[3] = gps_cnav_eph.d_ISCL5Q; rtklib_sat.toes = gps_cnav_eph.d_Toe1; rtklib_sat.toc = gpst2time(rtklib_sat.week,gps_cnav_eph.d_Toc); rtklib_sat.ttr = gpst2time(rtklib_sat.week,gps_cnav_eph.d_TOW); diff --git a/src/algorithms/libs/rtklib/rtklib_pntpos.cc b/src/algorithms/libs/rtklib/rtklib_pntpos.cc index 3b951189f..8dccfe679 100644 --- a/src/algorithms/libs/rtklib/rtklib_pntpos.cc +++ b/src/algorithms/libs/rtklib/rtklib_pntpos.cc @@ -80,6 +80,50 @@ double gettgd(int sat, const nav_t *nav) return 0.0; } +/* get isc parameter (m) -----------------------------------------------------*/ +double getiscl1(int sat, const nav_t *nav) +{ + int i; + for (i = 0; i < nav->n; i++) + { + if (nav->eph[i].sat != sat) continue; + return SPEED_OF_LIGHT * nav->eph[i].isc[0]; + } + return 0.0; +} + +double getiscl2(int sat, const nav_t *nav) +{ + int i; + for (i = 0; i < nav->n; i++) + { + if (nav->eph[i].sat != sat) continue; + return SPEED_OF_LIGHT * nav->eph[i].isc[1]; + } + return 0.0; +} + +double getiscl5i(int sat, const nav_t *nav) +{ + int i; + for (i = 0; i < nav->n; i++) + { + if (nav->eph[i].sat != sat) continue; + return SPEED_OF_LIGHT * nav->eph[i].isc[2]; + } + return 0.0; +} + +double getiscl5q(int sat, const nav_t *nav) +{ + int i; + for (i = 0; i < nav->n; i++) + { + if (nav->eph[i].sat != sat) continue; + return SPEED_OF_LIGHT * nav->eph[i].isc[3]; + } + return 0.0; +} /* psendorange with code bias correction -------------------------------------*/ double prange(const obsd_t *obs, const nav_t *nav, const double *azel, @@ -92,6 +136,10 @@ double prange(const obsd_t *obs, const nav_t *nav, const double *azel, double P1_P2; double P1_C1; double P2_C2; + double ISCl1 = 0.0; + double ISCl2 = 0.0; + double ISCl5i = 0.0; + double ISCl5q = 0.0; double gamma_ = 0.0; int i = 0; int j = 1; @@ -150,10 +198,13 @@ double prange(const obsd_t *obs, const nav_t *nav, const double *azel, P1_P2 = nav->cbias[obs->sat-1][0]; P1_C1 = nav->cbias[obs->sat-1][1]; P2_C2 = nav->cbias[obs->sat-1][2]; + std::string d_dump_filename = "/home/antonio/data/dump_prange.dat"; std::ofstream d_file; d_file.exceptions (std::ifstream::failbit | std::ifstream::badbit ); - d_file.open(d_dump_filename.c_str(), std::ios::out | std::ios::binary); + d_file.open(d_dump_filename.c_str(), std::ios::out | std::ios::binary | std::ios::app); + double tmp_double = static_cast(obs->sat); + d_file.write(reinterpret_cast(&tmp_double), sizeof(double)); d_file.write(reinterpret_cast(&P1), sizeof(double)); d_file.write(reinterpret_cast(&P2), sizeof(double)); d_file.write(reinterpret_cast(&P1_P2), sizeof(double)); @@ -168,6 +219,14 @@ double prange(const obsd_t *obs, const nav_t *nav, const double *azel, { //TODO } + + if(sys == SYS_GPS) + { + ISCl1 = getiscl1(obs->sat, nav); + ISCl2 = getiscl2(obs->sat, nav); + ISCl5i = getiscl5i(obs->sat, nav); + ISCl5q = getiscl5q(obs->sat, nav); + } d_file.write(reinterpret_cast(&P1_P2), sizeof(double)); if (opt->ionoopt == IONOOPT_IFLC) { /* dual-frequency */ @@ -208,7 +267,10 @@ double prange(const obsd_t *obs, const nav_t *nav, const double *azel, { P1 += P1_C1; P2 += P2_C2; - PC = (P2 - gamma_ * P1) / (1.0 - gamma_) - P1_P2 / (gamma_ - 1.0); + if(obs->code[j] == CODE_L2S) + { + PC = (P2 + ISCl2 - gamma_ * (P1 + ISCl1)) / (1.0 - gamma_) - P1_P2 / (gamma_ - 1.0); + } } else if(sys == SYS_GAL) { diff --git a/src/algorithms/libs/rtklib/rtklib_pntpos.h b/src/algorithms/libs/rtklib/rtklib_pntpos.h index 5dd969943..ad53558fa 100644 --- a/src/algorithms/libs/rtklib/rtklib_pntpos.h +++ b/src/algorithms/libs/rtklib/rtklib_pntpos.h @@ -69,6 +69,12 @@ double varerr(const prcopt_t *opt, double el, int sys); /* get tgd parameter (m) -----------------------------------------------------*/ double gettgd(int sat, const nav_t *nav); +/* get isc parameter (m) -----------------------------------------------------*/ +double getiscl1(int sat, const nav_t *nav); +double getiscl2(int sat, const nav_t *nav); +double getiscl5i(int sat, const nav_t *nav); +double getiscl5q(int sat, const nav_t *nav); + /* psendorange with code bias correction -------------------------------------*/ double prange(const obsd_t *obs, const nav_t *nav, const double *azel, int iter, const prcopt_t *opt, double *var); diff --git a/src/algorithms/libs/rtklib/rtklib_rtkcmn.cc b/src/algorithms/libs/rtklib/rtklib_rtkcmn.cc index a9c74ab55..60b95594b 100644 --- a/src/algorithms/libs/rtklib/rtklib_rtkcmn.cc +++ b/src/algorithms/libs/rtklib/rtklib_rtkcmn.cc @@ -2825,7 +2825,7 @@ int readnav(const char *file, nav_t *nav) { FILE *fp; eph_t eph0 = {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, 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 }; geph_t geph0 = {0, 0, 0, 0, 0, 0, {0, 0}, {0, 0}, {}, {}, {}, 0.0, 0.0, 0.0}; char buff[4096], *p; long toe_time, tof_time, toc_time, ttr_time; From a25a6fb556bdd5d7d93100648ec8b2ca863bc6a0 Mon Sep 17 00:00:00 2001 From: Antonio Ramos Date: Mon, 5 Mar 2018 18:34:20 +0100 Subject: [PATCH 36/61] debug 6 --- src/algorithms/libs/rtklib/rtklib_pntpos.cc | 81 ++++++++++--------- .../gps_cnav_navigation_message.cc | 2 + 2 files changed, 43 insertions(+), 40 deletions(-) diff --git a/src/algorithms/libs/rtklib/rtklib_pntpos.cc b/src/algorithms/libs/rtklib/rtklib_pntpos.cc index 8dccfe679..5f1e17156 100644 --- a/src/algorithms/libs/rtklib/rtklib_pntpos.cc +++ b/src/algorithms/libs/rtklib/rtklib_pntpos.cc @@ -83,8 +83,7 @@ double gettgd(int sat, const nav_t *nav) /* get isc parameter (m) -----------------------------------------------------*/ double getiscl1(int sat, const nav_t *nav) { - int i; - for (i = 0; i < nav->n; i++) + for (int i = 0; i < nav->n; i++) { if (nav->eph[i].sat != sat) continue; return SPEED_OF_LIGHT * nav->eph[i].isc[0]; @@ -94,8 +93,7 @@ double getiscl1(int sat, const nav_t *nav) double getiscl2(int sat, const nav_t *nav) { - int i; - for (i = 0; i < nav->n; i++) + for (int i = 0; i < nav->n; i++) { if (nav->eph[i].sat != sat) continue; return SPEED_OF_LIGHT * nav->eph[i].isc[1]; @@ -105,8 +103,7 @@ double getiscl2(int sat, const nav_t *nav) double getiscl5i(int sat, const nav_t *nav) { - int i; - for (i = 0; i < nav->n; i++) + for (int i = 0; i < nav->n; i++) { if (nav->eph[i].sat != sat) continue; return SPEED_OF_LIGHT * nav->eph[i].isc[2]; @@ -116,8 +113,7 @@ double getiscl5i(int sat, const nav_t *nav) double getiscl5q(int sat, const nav_t *nav) { - int i; - for (i = 0; i < nav->n; i++) + for (int i = 0; i < nav->n; i++) { if (nav->eph[i].sat != sat) continue; return SPEED_OF_LIGHT * nav->eph[i].isc[3]; @@ -129,13 +125,13 @@ double getiscl5q(int sat, const nav_t *nav) double prange(const obsd_t *obs, const nav_t *nav, const double *azel, int iter, const prcopt_t *opt, double *var) { - const double *lam = nav->lam[obs->sat - 1]; - double PC; - double P1; - double P2; - double P1_P2; - double P1_C1; - double P2_C2; + const double* lam = nav->lam[obs->sat - 1]; + double PC = 0.0; + double P1 = 0.0; + double P2 = 0.0; + double P1_P2 = 0.0; + double P1_C1 = 0.0; + double P2_C2 = 0.0; double ISCl1 = 0.0; double ISCl2 = 0.0; double ISCl5i = 0.0; @@ -143,11 +139,10 @@ double prange(const obsd_t *obs, const nav_t *nav, const double *azel, double gamma_ = 0.0; int i = 0; int j = 1; - int sys; - + int sys = satsys(obs->sat, NULL); *var = 0.0; - if (!(sys = satsys(obs->sat, NULL))) + if(sys == SYS_NONE) { trace(4, "prange: satsys NULL\n"); return 0.0; @@ -155,15 +150,15 @@ double prange(const obsd_t *obs, const nav_t *nav, const double *azel, /* L1-L2 for GPS/GLO/QZS, L1-L5 for GAL/SBS */ - if (sys & (SYS_GAL | SYS_SBS)) {j = 2;} + if(sys == SYS_GAL or sys == SYS_SBS) {j = 2;} - if (sys == SYS_GPS) + if(sys == SYS_GPS) { if(obs->code[1] != CODE_NONE) {j = 1;} else if(obs->code[2] != CODE_NONE) {j = 2;} } - if (NFREQ<2 || lam[i] == 0.0 || lam[j] == 0.0) + if(lam[i] == 0.0 or lam[j] == 0.0) { trace(4, "prange: NFREQ<2||lam[i]==0.0||lam[j]==0.0\n"); printf("i: %d j:%d, lam[i]: %f lam[j] %f\n", i, j, lam[i], lam[j]); @@ -171,7 +166,7 @@ double prange(const obsd_t *obs, const nav_t *nav, const double *azel, } /* test snr mask */ - if (iter > 0) + if(iter > 0) { if (testsnr(0, i, azel[1], obs->SNR[i] * 0.25, &opt->snrmask)) { @@ -226,9 +221,15 @@ double prange(const obsd_t *obs, const nav_t *nav, const double *azel, ISCl2 = getiscl2(obs->sat, nav); ISCl5i = getiscl5i(obs->sat, nav); ISCl5q = getiscl5q(obs->sat, nav); + d_file.write(reinterpret_cast(&ISCl1), sizeof(double)); + d_file.write(reinterpret_cast(&ISCl2), sizeof(double)); + d_file.write(reinterpret_cast(&ISCl5i), sizeof(double)); + d_file.write(reinterpret_cast(&ISCl5q), sizeof(double)); } d_file.write(reinterpret_cast(&P1_P2), sizeof(double)); - if (opt->ionoopt == IONOOPT_IFLC) + + //CHECK IF IT IS STILL NEEDED + if(opt->ionoopt == IONOOPT_IFLC) { /* dual-frequency */ if (P1 == 0.0 || P2 == 0.0) { return 0.0; } @@ -238,22 +239,23 @@ double prange(const obsd_t *obs, const nav_t *nav, const double *azel, /* iono-free combination */ PC = (gamma_ * P1 - P2) / (gamma_ - 1.0); } + //////////////////////////////////////////// else { /* single-frequency */ - if((obs->code[i] == CODE_NONE) && (obs->code[j] == CODE_NONE)) { return 0.0; } + if(obs->code[i] == CODE_NONE and obs->code[j] == CODE_NONE) { return 0.0; } - else if((obs->code[i] != CODE_NONE) and (obs->code[j] == CODE_NONE)) + else if(obs->code[i] != CODE_NONE and obs->code[j] == CODE_NONE) {//CHECK!! P1 += P1_C1; /* C1->P1 */ PC = P1 + P1_P2 / (gamma_ - 1.0); } - else if((obs->code[i] == CODE_NONE) and (obs->code[j] != CODE_NONE)) + else if(obs->code[i] == CODE_NONE and obs->code[j] != CODE_NONE) { if(sys == SYS_GPS) {//CHECK!! P2 += P2_C2; /* C2->P2 */ //PC = P2 - gamma_ * P1_P2 / (1.0 - gamma_); - PC = P2 + gamma_ * P1_P2 / (gamma_ - 1.0); + PC = P2 + P1_P2 / (gamma_ - 1.0) - ISCl2; } else if(sys == SYS_GAL) { @@ -261,28 +263,27 @@ double prange(const obsd_t *obs, const nav_t *nav, const double *azel, } } /* dual-frequency */ - else + else if(sys == SYS_GPS) { - if(sys == SYS_GPS) /* See IS-GPS-200 p. 179 */ + if(obs->code[j] == CODE_L2S) /* L1 + L2 */ { - P1 += P1_C1; - P2 += P2_C2; - if(obs->code[j] == CODE_L2S) - { - PC = (P2 + ISCl2 - gamma_ * (P1 + ISCl1)) / (1.0 - gamma_) - P1_P2 / (gamma_ - 1.0); - } + //PC = (P2 + ISCl2 - gamma_ * (P1 + ISCl1)) / (1.0 - gamma_) - P1_P2 / (gamma_ - 1.0); + PC = (P1 + P2) / 2.0; } - else if(sys == SYS_GAL) + if(obs->code[j] == CODE_L5X) /* L1 + L5 */ { - //TODO + } } + else if(sys == SYS_GAL) /* E1 + E5a */ + { + + } } d_file.write(reinterpret_cast(&PC), sizeof(double)); - if (opt->sateph == EPHOPT_SBAS) { PC -= P1_C1; } /* sbas clock based C1 */ - - *var = std::pow(ERR_CBIAS, 2.0); d_file.close(); + if(opt->sateph == EPHOPT_SBAS) { PC -= P1_C1; } /* sbas clock based C1 */ + *var = std::pow(ERR_CBIAS, 2.0); return PC; } diff --git a/src/core/system_parameters/gps_cnav_navigation_message.cc b/src/core/system_parameters/gps_cnav_navigation_message.cc index c4f49f849..bc8507c89 100644 --- a/src/core/system_parameters/gps_cnav_navigation_message.cc +++ b/src/core/system_parameters/gps_cnav_navigation_message.cc @@ -32,6 +32,7 @@ #include "gps_cnav_navigation_message.h" #include "gnss_satellite.h" +#include void Gps_CNAV_Navigation_Message::reset() @@ -266,6 +267,7 @@ void Gps_CNAV_Navigation_Message::decode_page(std::bitset(read_navigation_signed(data_bits, CNAV_ISCL2)); ephemeris_record.d_ISCL2 = ephemeris_record.d_ISCL2 * CNAV_ISCL2_LSB; + std::cout << "ISCL2 * c = " << ephemeris_record.d_ISCL2 * 3e8 << " [m]" << std::endl; ephemeris_record.d_ISCL5I = static_cast(read_navigation_signed(data_bits, CNAV_ISCL5I)); ephemeris_record.d_ISCL5I = ephemeris_record.d_ISCL5I * CNAV_ISCL5I_LSB; ephemeris_record.d_ISCL5Q = static_cast(read_navigation_signed(data_bits, CNAV_ISCL5Q)); From 40be1e3ad4903d4d8e268d0b1e3c2a67ea495690 Mon Sep 17 00:00:00 2001 From: Antonio Ramos Date: Mon, 5 Mar 2018 18:45:18 +0100 Subject: [PATCH 37/61] debug7 --- src/core/system_parameters/GPS_CNAV.h | 4 ++-- .../gps_cnav_navigation_message.cc | 24 ++++++++++++------- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/src/core/system_parameters/GPS_CNAV.h b/src/core/system_parameters/GPS_CNAV.h index fc2239ab6..e703ea4cd 100644 --- a/src/core/system_parameters/GPS_CNAV.h +++ b/src/core/system_parameters/GPS_CNAV.h @@ -120,11 +120,11 @@ const std::vector > CNAV_URA_NED2({{58,3}}); const std::vector > CNAV_TOC({{61,11}}); const double CNAV_TOC_LSB = 300.0; const std::vector > CNAV_AF0({{72,26}}); -const double CNAV_AF0_LSB = TWO_N60; +const double CNAV_AF0_LSB = TWO_N35; const std::vector > CNAV_AF1({{98,20}}); const double CNAV_AF1_LSB = TWO_N48; const std::vector > CNAV_AF2({{118,10}}); -const double CNAV_AF2_LSB = TWO_N35; +const double CNAV_AF2_LSB = TWO_N60; const std::vector > CNAV_TGD({{128,13}}); const double CNAV_TGD_LSB = TWO_N35; const std::vector > CNAV_ISCL1({{141,13}}); diff --git a/src/core/system_parameters/gps_cnav_navigation_message.cc b/src/core/system_parameters/gps_cnav_navigation_message.cc index bc8507c89..7a1479ed0 100644 --- a/src/core/system_parameters/gps_cnav_navigation_message.cc +++ b/src/core/system_parameters/gps_cnav_navigation_message.cc @@ -32,7 +32,6 @@ #include "gps_cnav_navigation_message.h" #include "gnss_satellite.h" -#include void Gps_CNAV_Navigation_Message::reset() @@ -258,20 +257,27 @@ void Gps_CNAV_Navigation_Message::decode_page(std::bitset(read_navigation_signed(data_bits, CNAV_AF2)); ephemeris_record.d_A_f2 = ephemeris_record.d_A_f2 * CNAV_AF2_LSB; //group delays - ephemeris_record.d_TGD = static_cast(read_navigation_signed(data_bits, CNAV_TGD)); - //Check if the grup delay value is not available. See IS-GPS-200, Table 30-IV. + //Check if the grup delay values are not available. See IS-GPS-200, Table 30-IV. //Bit string "1000000000000" is -4096 in 2 complement + ephemeris_record.d_TGD = static_cast(read_navigation_signed(data_bits, CNAV_TGD)); if(ephemeris_record.d_TGD < -4095.9) { ephemeris_record.d_TGD = 0.0; } - ephemeris_record.d_TGD = ephemeris_record.d_TGD * CNAV_TGD_LSB; + ephemeris_record.d_TGD *= CNAV_TGD_LSB; + ephemeris_record.d_ISCL1 = static_cast(read_navigation_signed(data_bits, CNAV_ISCL1)); - ephemeris_record.d_ISCL1 = ephemeris_record.d_ISCL1 * CNAV_ISCL1_LSB; + if(ephemeris_record.d_ISCL1 < -4095.9) { ephemeris_record.d_ISCL1 = 0.0; } + ephemeris_record.d_ISCL1 *= CNAV_ISCL1_LSB; + ephemeris_record.d_ISCL2 = static_cast(read_navigation_signed(data_bits, CNAV_ISCL2)); - ephemeris_record.d_ISCL2 = ephemeris_record.d_ISCL2 * CNAV_ISCL2_LSB; - std::cout << "ISCL2 * c = " << ephemeris_record.d_ISCL2 * 3e8 << " [m]" << std::endl; + if(ephemeris_record.d_ISCL2 < -4095.9) { ephemeris_record.d_ISCL2 = 0.0; } + ephemeris_record.d_ISCL2 *= CNAV_ISCL2_LSB; + ephemeris_record.d_ISCL5I = static_cast(read_navigation_signed(data_bits, CNAV_ISCL5I)); - ephemeris_record.d_ISCL5I = ephemeris_record.d_ISCL5I * CNAV_ISCL5I_LSB; + if(ephemeris_record.d_ISCL5I < -4095.9) { ephemeris_record.d_ISCL5I = 0.0; } + ephemeris_record.d_ISCL5I *= CNAV_ISCL5I_LSB; + ephemeris_record.d_ISCL5Q = static_cast(read_navigation_signed(data_bits, CNAV_ISCL5Q)); - ephemeris_record.d_ISCL5Q = ephemeris_record.d_ISCL5Q * CNAV_ISCL5Q_LSB; + if(ephemeris_record.d_ISCL5Q < -4095.9) { ephemeris_record.d_ISCL5Q = 0.0; } + ephemeris_record.d_ISCL5Q *= CNAV_ISCL5Q_LSB; //iono iono_record.d_alpha0 = static_cast(read_navigation_signed(data_bits, CNAV_ALPHA0)); iono_record.d_alpha0 = iono_record.d_alpha0 * CNAV_ALPHA0_LSB; From 21fff4e696bbef5a7ac08a0908911a5b6c86b0e2 Mon Sep 17 00:00:00 2001 From: Antonio Ramos Date: Tue, 6 Mar 2018 13:23:22 +0100 Subject: [PATCH 38/61] Fix CNAV telemetry reader --- src/algorithms/PVT/libs/rtklib_solver.cc | 2 +- src/algorithms/libs/rtklib/rtklib_pntpos.cc | 11 ++-- .../gps_cnav_navigation_message.cc | 50 +++++++++---------- 3 files changed, 31 insertions(+), 32 deletions(-) diff --git a/src/algorithms/PVT/libs/rtklib_solver.cc b/src/algorithms/PVT/libs/rtklib_solver.cc index 2067e42f8..84f636820 100644 --- a/src/algorithms/PVT/libs/rtklib_solver.cc +++ b/src/algorithms/PVT/libs/rtklib_solver.cc @@ -132,7 +132,7 @@ bool rtklib_solver::get_PVT(const std::map & gnss_observables_ for(gnss_observables_iter = gnss_observables_map.cbegin(); gnss_observables_iter != gnss_observables_map.cend(); - gnss_observables_iter++) + gnss_observables_iter++) //CHECK INCONSISTENCY when combining GLONASS + other system { switch(gnss_observables_iter->second.System) { diff --git a/src/algorithms/libs/rtklib/rtklib_pntpos.cc b/src/algorithms/libs/rtklib/rtklib_pntpos.cc index 5f1e17156..6ef2629b8 100644 --- a/src/algorithms/libs/rtklib/rtklib_pntpos.cc +++ b/src/algorithms/libs/rtklib/rtklib_pntpos.cc @@ -194,7 +194,7 @@ double prange(const obsd_t *obs, const nav_t *nav, const double *azel, P1_C1 = nav->cbias[obs->sat-1][1]; P2_C2 = nav->cbias[obs->sat-1][2]; - std::string d_dump_filename = "/home/antonio/data/dump_prange.dat"; + std::string d_dump_filename = "/home/aramos/dump_prange.dat"; std::ofstream d_file; d_file.exceptions (std::ifstream::failbit | std::ifstream::badbit ); d_file.open(d_dump_filename.c_str(), std::ios::out | std::ios::binary | std::ios::app); @@ -208,7 +208,7 @@ double prange(const obsd_t *obs, const nav_t *nav, const double *azel, /* if no P1-P2 DCB, use TGD instead */ if(P1_P2 == 0.0 and sys == SYS_GPS) { - P1_P2 = (gamma_ - 1.0) * gettgd(obs->sat, nav); + P1_P2 = gettgd(obs->sat, nav); } else if(P1_P2 == 0.0 and sys == SYS_GAL) { @@ -247,7 +247,7 @@ double prange(const obsd_t *obs, const nav_t *nav, const double *azel, else if(obs->code[i] != CODE_NONE and obs->code[j] == CODE_NONE) {//CHECK!! P1 += P1_C1; /* C1->P1 */ - PC = P1 + P1_P2 / (gamma_ - 1.0); + PC = P1 + P1_P2; } else if(obs->code[i] == CODE_NONE and obs->code[j] != CODE_NONE) { @@ -255,7 +255,7 @@ double prange(const obsd_t *obs, const nav_t *nav, const double *azel, {//CHECK!! P2 += P2_C2; /* C2->P2 */ //PC = P2 - gamma_ * P1_P2 / (1.0 - gamma_); - PC = P2 + P1_P2 / (gamma_ - 1.0) - ISCl2; + PC = P2 + P1_P2 - ISCl2; } else if(sys == SYS_GAL) { @@ -267,8 +267,7 @@ double prange(const obsd_t *obs, const nav_t *nav, const double *azel, { if(obs->code[j] == CODE_L2S) /* L1 + L2 */ { - //PC = (P2 + ISCl2 - gamma_ * (P1 + ISCl1)) / (1.0 - gamma_) - P1_P2 / (gamma_ - 1.0); - PC = (P1 + P2) / 2.0; + PC = (P2 + ISCl2 - gamma_ * (P1 + ISCl1)) / (1.0 - gamma_) - P1_P2; } if(obs->code[j] == CODE_L5X) /* L1 + L5 */ { diff --git a/src/core/system_parameters/gps_cnav_navigation_message.cc b/src/core/system_parameters/gps_cnav_navigation_message.cc index 7a1479ed0..c2cd29ddd 100644 --- a/src/core/system_parameters/gps_cnav_navigation_message.cc +++ b/src/core/system_parameters/gps_cnav_navigation_message.cc @@ -180,7 +180,7 @@ void Gps_CNAV_Navigation_Message::decode_page(std::bitset(read_navigation_unsigned(data_bits, CNAV_TOW)); - d_TOW = d_TOW * CNAV_TOW_LSB; + d_TOW *= CNAV_TOW_LSB; ephemeris_record.d_TOW = d_TOW; alert_flag = static_cast(read_navigation_bool(data_bits, CNAV_ALERT_FLAG)); @@ -194,24 +194,24 @@ void Gps_CNAV_Navigation_Message::decode_page(std::bitset(read_navigation_unsigned(data_bits, CNAV_WN)); ephemeris_record.i_signal_health = static_cast(read_navigation_unsigned(data_bits, CNAV_HEALTH)); ephemeris_record.d_Top = static_cast(read_navigation_unsigned(data_bits, CNAV_TOP1)); - ephemeris_record.d_Top = ephemeris_record.d_Top * CNAV_TOP1_LSB; + ephemeris_record.d_Top *= CNAV_TOP1_LSB; ephemeris_record.d_URA0 = static_cast(read_navigation_signed(data_bits, CNAV_URA)); ephemeris_record.d_Toe1 = static_cast(read_navigation_unsigned(data_bits, CNAV_TOE1)); - ephemeris_record.d_Toe1 = ephemeris_record.d_Toe1 * CNAV_TOE1_LSB; + ephemeris_record.d_Toe1 *= CNAV_TOE1_LSB; ephemeris_record.d_DELTA_A = static_cast(read_navigation_signed(data_bits, CNAV_DELTA_A)); - ephemeris_record.d_DELTA_A = ephemeris_record.d_DELTA_A * CNAV_DELTA_A_LSB; + ephemeris_record.d_DELTA_A *= CNAV_DELTA_A_LSB; ephemeris_record.d_A_DOT = static_cast(read_navigation_signed(data_bits, CNAV_A_DOT)); - ephemeris_record.d_A_DOT = ephemeris_record.d_A_DOT * CNAV_A_DOT_LSB; + ephemeris_record.d_A_DOT *= CNAV_A_DOT_LSB; ephemeris_record.d_Delta_n = static_cast(read_navigation_signed(data_bits, CNAV_DELTA_N0)); - ephemeris_record.d_Delta_n = ephemeris_record.d_Delta_n * CNAV_DELTA_N0_LSB; + ephemeris_record.d_Delta_n *= CNAV_DELTA_N0_LSB; ephemeris_record.d_DELTA_DOT_N = static_cast(read_navigation_signed(data_bits, CNAV_DELTA_N0_DOT)); - ephemeris_record.d_DELTA_DOT_N = ephemeris_record.d_DELTA_DOT_N * CNAV_DELTA_N0_DOT_LSB; + ephemeris_record.d_DELTA_DOT_N *= CNAV_DELTA_N0_DOT_LSB; ephemeris_record.d_M_0 = static_cast(read_navigation_signed(data_bits, CNAV_M0)); - ephemeris_record.d_M_0 = ephemeris_record.d_M_0 * CNAV_M0_LSB; + ephemeris_record.d_M_0 *= CNAV_M0_LSB; ephemeris_record.d_e_eccentricity = static_cast(read_navigation_unsigned(data_bits, CNAV_E_ECCENTRICITY)); - ephemeris_record.d_e_eccentricity = ephemeris_record.d_e_eccentricity * CNAV_E_ECCENTRICITY_LSB; + ephemeris_record.d_e_eccentricity *= CNAV_E_ECCENTRICITY_LSB; ephemeris_record.d_OMEGA = static_cast(read_navigation_signed(data_bits, CNAV_OMEGA)); - ephemeris_record.d_OMEGA = ephemeris_record.d_OMEGA * CNAV_OMEGA_LSB; + ephemeris_record.d_OMEGA *= CNAV_OMEGA_LSB; ephemeris_record.b_integrity_status_flag = static_cast(read_navigation_bool(data_bits, CNAV_INTEGRITY_FLAG)); ephemeris_record.b_l2c_phasing_flag = static_cast(read_navigation_bool(data_bits, CNAV_L2_PHASING_FLAG)); @@ -220,42 +220,42 @@ void Gps_CNAV_Navigation_Message::decode_page(std::bitset(read_navigation_unsigned(data_bits, CNAV_TOE2)); - ephemeris_record.d_Toe2 = ephemeris_record.d_Toe2 * CNAV_TOE2_LSB; + ephemeris_record.d_Toe2 *= CNAV_TOE2_LSB; ephemeris_record.d_OMEGA0 = static_cast(read_navigation_signed(data_bits, CNAV_OMEGA0)); - ephemeris_record.d_OMEGA0 = ephemeris_record.d_OMEGA0 * CNAV_OMEGA0_LSB; + ephemeris_record.d_OMEGA0 *= CNAV_OMEGA0_LSB; ephemeris_record.d_DELTA_OMEGA_DOT = static_cast(read_navigation_signed(data_bits, CNAV_DELTA_OMEGA_DOT)); - ephemeris_record.d_DELTA_OMEGA_DOT = ephemeris_record.d_DELTA_OMEGA_DOT * CNAV_DELTA_OMEGA_DOT_LSB; + ephemeris_record.d_DELTA_OMEGA_DOT *= CNAV_DELTA_OMEGA_DOT_LSB; ephemeris_record.d_i_0 = static_cast(read_navigation_signed(data_bits, CNAV_I0)); - ephemeris_record.d_i_0 = ephemeris_record.d_i_0 * CNAV_I0_LSB; + ephemeris_record.d_i_0 *= CNAV_I0_LSB; ephemeris_record.d_IDOT = static_cast(read_navigation_signed(data_bits, CNAV_I0_DOT)); - ephemeris_record.d_IDOT = ephemeris_record.d_IDOT * CNAV_I0_DOT_LSB; + ephemeris_record.d_IDOT *= CNAV_I0_DOT_LSB; ephemeris_record.d_Cis = static_cast(read_navigation_signed(data_bits, CNAV_CIS)); - ephemeris_record.d_Cis = ephemeris_record.d_Cis * CNAV_CIS_LSB; + ephemeris_record.d_Cis *= CNAV_CIS_LSB; ephemeris_record.d_Cic = static_cast(read_navigation_signed(data_bits, CNAV_CIC)); - ephemeris_record.d_Cic = ephemeris_record.d_Cic * CNAV_CIC_LSB; + ephemeris_record.d_Cic *= CNAV_CIC_LSB; ephemeris_record.d_Crs = static_cast(read_navigation_signed(data_bits, CNAV_CRS)); - ephemeris_record.d_Crs = ephemeris_record.d_Crs * CNAV_CRS_LSB; + ephemeris_record.d_Crs *= CNAV_CRS_LSB; ephemeris_record.d_Crc = static_cast(read_navigation_signed(data_bits, CNAV_CRC)); - ephemeris_record.d_Cic = ephemeris_record.d_Cic * CNAV_CRC_LSB; + ephemeris_record.d_Crc *= CNAV_CRC_LSB; ephemeris_record.d_Cus = static_cast(read_navigation_signed(data_bits, CNAV_CUS)); - ephemeris_record.d_Cus = ephemeris_record.d_Cus * CNAV_CUS_LSB; + ephemeris_record.d_Cus *= CNAV_CUS_LSB; ephemeris_record.d_Cuc = static_cast(read_navigation_signed(data_bits, CNAV_CUC)); - ephemeris_record.d_Cuc = ephemeris_record.d_Cuc * CNAV_CUS_LSB; + ephemeris_record.d_Cuc *= CNAV_CUC_LSB; b_flag_ephemeris_2 = true; break; case 30: // (CLOCK, IONO, GRUP DELAY) //clock ephemeris_record.d_Toc = static_cast(read_navigation_unsigned(data_bits, CNAV_TOC)); - ephemeris_record.d_Toc = ephemeris_record.d_Toc * CNAV_TOC_LSB; + ephemeris_record.d_Toc *= CNAV_TOC_LSB; ephemeris_record.d_URA0 = static_cast(read_navigation_signed(data_bits, CNAV_URA_NED0)); ephemeris_record.d_URA1 = static_cast(read_navigation_unsigned(data_bits, CNAV_URA_NED1)); ephemeris_record.d_URA2 = static_cast(read_navigation_unsigned(data_bits, CNAV_URA_NED2)); ephemeris_record.d_A_f0 = static_cast(read_navigation_signed(data_bits, CNAV_AF0)); - ephemeris_record.d_A_f0 = ephemeris_record.d_A_f0 * CNAV_AF0_LSB; + ephemeris_record.d_A_f0 *= CNAV_AF0_LSB; ephemeris_record.d_A_f1 = static_cast(read_navigation_signed(data_bits, CNAV_AF1)); - ephemeris_record.d_A_f1 = ephemeris_record.d_A_f1 * CNAV_AF1_LSB; + ephemeris_record.d_A_f1 *= CNAV_AF1_LSB; ephemeris_record.d_A_f2 = static_cast(read_navigation_signed(data_bits, CNAV_AF2)); - ephemeris_record.d_A_f2 = ephemeris_record.d_A_f2 * CNAV_AF2_LSB; + ephemeris_record.d_A_f2 *= CNAV_AF2_LSB; //group delays //Check if the grup delay values are not available. See IS-GPS-200, Table 30-IV. //Bit string "1000000000000" is -4096 in 2 complement From de3bf9d480a4707de5a2c6535bd3ee213aef9e53 Mon Sep 17 00:00:00 2001 From: Antonio Ramos Date: Tue, 6 Mar 2018 15:58:48 +0100 Subject: [PATCH 39/61] debug8 --- src/algorithms/libs/rtklib/rtklib_conversions.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/algorithms/libs/rtklib/rtklib_conversions.cc b/src/algorithms/libs/rtklib/rtklib_conversions.cc index c0bf8929c..91c50c151 100644 --- a/src/algorithms/libs/rtklib/rtklib_conversions.cc +++ b/src/algorithms/libs/rtklib/rtklib_conversions.cc @@ -192,9 +192,9 @@ eph_t eph_to_rtklib(const Gps_Ephemeris & gps_eph) rtklib_sat.f1 = gps_eph.d_A_f1; rtklib_sat.f2 = gps_eph.d_A_f2; rtklib_sat.tgd[0] = gps_eph.d_TGD; - rtklib_sat.tgd[1] = 0; - rtklib_sat.tgd[2] = 0; - rtklib_sat.tgd[3] = 0; + rtklib_sat.tgd[1] = 0.0; + rtklib_sat.tgd[2] = 0.0; + rtklib_sat.tgd[3] = 0.0; rtklib_sat.toes = gps_eph.d_Toe; rtklib_sat.toc = gpst2time(rtklib_sat.week, gps_eph.d_Toc); rtklib_sat.ttr = gpst2time(rtklib_sat.week, gps_eph.d_TOW); From 93d2fdaf1436d6adef162d1e0fe6031582f2d1bc Mon Sep 17 00:00:00 2001 From: Antonio Ramos Date: Thu, 8 Mar 2018 18:05:22 +0100 Subject: [PATCH 40/61] debug 9 --- src/algorithms/PVT/gnuradio_blocks/rtklib_pvt_cc.cc | 2 +- src/algorithms/PVT/libs/rtklib_solver.cc | 6 +++--- src/algorithms/libs/rtklib/rtklib_pntpos.cc | 12 +++--------- src/algorithms/libs/rtklib/rtklib_rtcm.cc | 2 +- src/algorithms/libs/rtklib/rtklib_rtcm2.cc | 2 +- src/algorithms/libs/rtklib/rtklib_rtcm3.cc | 12 ++++++------ src/algorithms/libs/rtklib/rtklib_rtksvr.cc | 2 +- 7 files changed, 16 insertions(+), 22 deletions(-) diff --git a/src/algorithms/PVT/gnuradio_blocks/rtklib_pvt_cc.cc b/src/algorithms/PVT/gnuradio_blocks/rtklib_pvt_cc.cc index e688ada7d..43da2f97f 100644 --- a/src/algorithms/PVT/gnuradio_blocks/rtklib_pvt_cc.cc +++ b/src/algorithms/PVT/gnuradio_blocks/rtklib_pvt_cc.cc @@ -385,7 +385,7 @@ rtklib_pvt_cc::~rtklib_pvt_cc() msgctl(sysv_msqid, IPC_RMID, NULL); //save GPS L2CM ephemeris to XML file - std::string file_name = "eph_GPS_L2CM_L5.xml"; + std::string file_name = "eph_GPS_CNAV.xml"; if (d_ls_pvt->gps_cnav_ephemeris_map.size() > 0) { diff --git a/src/algorithms/PVT/libs/rtklib_solver.cc b/src/algorithms/PVT/libs/rtklib_solver.cc index 081f38bfd..f504ebfe0 100644 --- a/src/algorithms/PVT/libs/rtklib_solver.cc +++ b/src/algorithms/PVT/libs/rtklib_solver.cc @@ -127,7 +127,7 @@ bool rtklib_solver::get_PVT(const std::map& gnss_observables_ int glo_valid_obs = 0; //GLONASS L1/L2 valid observations counter obsd_t obs_data[MAXOBS]; - eph_t eph_data[MAXOBS]; + eph_t eph_data[MAXOBS]; geph_t geph_data[MAXOBS]; for(gnss_observables_iter = gnss_observables_map.cbegin(); @@ -404,7 +404,7 @@ bool rtklib_solver::get_PVT(const std::map& gnss_observables_ // ********************************************************************** this->set_valid_position(false); - if (valid_obs > 0 || glo_valid_obs > 0) + if ((valid_obs + glo_valid_obs) > 3) { int result = 0; nav_t nav_data; @@ -495,5 +495,5 @@ bool rtklib_solver::get_PVT(const std::map& gnss_observables_ } } } - return this->is_valid_position(); + return is_valid_position(); } diff --git a/src/algorithms/libs/rtklib/rtklib_pntpos.cc b/src/algorithms/libs/rtklib/rtklib_pntpos.cc index b8795531c..aea3dd85f 100644 --- a/src/algorithms/libs/rtklib/rtklib_pntpos.cc +++ b/src/algorithms/libs/rtklib/rtklib_pntpos.cc @@ -205,15 +205,9 @@ double prange(const obsd_t *obs, const nav_t *nav, const double *azel, d_file.write(reinterpret_cast(&P1_P2), sizeof(double)); d_file.write(reinterpret_cast(&P1_C1), sizeof(double)); d_file.write(reinterpret_cast(&P2_C2), sizeof(double)); + /* if no P1-P2 DCB, use TGD instead */ - if(P1_P2 == 0.0 and sys == SYS_GPS) - { - P1_P2 = gettgd(obs->sat, nav); - } - else if(P1_P2 == 0.0 and sys == SYS_GAL) - { - //TODO - } + if(P1_P2 == 0.0) { P1_P2 = gettgd(obs->sat, nav); } if(sys == SYS_GPS) { @@ -276,7 +270,7 @@ double prange(const obsd_t *obs, const nav_t *nav, const double *azel, } else if(sys == SYS_GAL) /* E1 + E5a */ { - + //TODO } } d_file.write(reinterpret_cast(&PC), sizeof(double)); diff --git a/src/algorithms/libs/rtklib/rtklib_rtcm.cc b/src/algorithms/libs/rtklib/rtklib_rtcm.cc index e3c0d15b9..3ffb4502d 100644 --- a/src/algorithms/libs/rtklib/rtklib_rtcm.cc +++ b/src/algorithms/libs/rtklib/rtklib_rtcm.cc @@ -69,7 +69,7 @@ int init_rtcm(rtcm_t *rtcm) obsd_t data0 = {{0, 0.0}, 0, 0, {0}, {0}, {0}, {0.0}, {0.0}, {0.0}}; eph_t eph0 = {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, - 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}; geph_t geph0 = {0, -1, 0, 0, 0, 0, {0, 0.0}, {0, 0.0}, {0.0}, {0.0}, {0.0}, 0.0, 0.0, 0.0}; ssr_t ssr0 = {{{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'}; diff --git a/src/algorithms/libs/rtklib/rtklib_rtcm2.cc b/src/algorithms/libs/rtklib/rtklib_rtcm2.cc index a754db2e0..c7af88ccd 100644 --- a/src/algorithms/libs/rtklib/rtklib_rtcm2.cc +++ b/src/algorithms/libs/rtklib/rtklib_rtcm2.cc @@ -219,7 +219,7 @@ int decode_type17(rtcm_t *rtcm) { 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, - 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}; double toc, sqrtA; int i = 48, week, prn, sat; diff --git a/src/algorithms/libs/rtklib/rtklib_rtcm3.cc b/src/algorithms/libs/rtklib/rtklib_rtcm3.cc index 53e88739d..249953f64 100644 --- a/src/algorithms/libs/rtklib/rtklib_rtcm3.cc +++ b/src/algorithms/libs/rtklib/rtklib_rtcm3.cc @@ -846,7 +846,7 @@ int decode_type1019(rtcm_t *rtcm) { 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, - 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}; double toc, sqrtA; char *msg; int i = 24 + 12, prn, sat, week, sys = SYS_GPS; @@ -1293,7 +1293,7 @@ int decode_type1044(rtcm_t *rtcm) { 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, - 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}; double toc, sqrtA; char *msg; int i = 24 + 12, prn, sat, week, sys = SYS_QZS; @@ -1398,7 +1398,7 @@ int decode_type1045(rtcm_t *rtcm) { 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, - 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}; double toc, sqrtA; char *msg; int i = 24 + 12, prn, sat, week, e5a_hs, e5a_dvs, sys = SYS_GAL; @@ -1502,7 +1502,7 @@ int decode_type1046(rtcm_t *rtcm) { 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, - 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}; double toc, sqrtA; char *msg; int i = 24 + 12, prn, sat, week, e5a_hs, e5a_dvs, sys = SYS_GAL; @@ -1606,7 +1606,7 @@ int decode_type1047(rtcm_t *rtcm) { 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, - 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}; ; double toc, sqrtA; char *msg; @@ -1716,7 +1716,7 @@ int decode_type63(rtcm_t *rtcm) { 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, - 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}; double toc, sqrtA; char *msg; int i = 24 + 12, prn, sat, week, sys = SYS_BDS; diff --git a/src/algorithms/libs/rtklib/rtklib_rtksvr.cc b/src/algorithms/libs/rtklib/rtklib_rtksvr.cc index 732d5cc28..0a2875f97 100644 --- a/src/algorithms/libs/rtklib/rtklib_rtksvr.cc +++ b/src/algorithms/libs/rtklib/rtklib_rtksvr.cc @@ -592,7 +592,7 @@ int rtksvrinit(rtksvr_t *svr) '0', '0', '0', 0, 0, 0}; eph_t eph0 = {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, - 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}; geph_t geph0 = {0, -1, 0, 0, 0, 0, {0, 0.0}, {0, 0.0}, {0.0}, {0.0}, {0.0}, 0.0, 0.0, 0.0}; seph_t seph0 = {0, {0, 0.0}, {0, 0.0}, 0, 0, {0.0}, {0.0}, {0.0}, 0.0, 0.0}; From ab7cabc8e87603bbe2b052fb58248fd51b905817 Mon Sep 17 00:00:00 2001 From: Antonio Ramos Date: Thu, 8 Mar 2018 18:32:55 +0100 Subject: [PATCH 41/61] code style --- .../PVT/gnuradio_blocks/rtklib_pvt_cc.cc | 100 ++-- .../gnuradio_blocks/hybrid_observables_cc.cc | 469 ++++++++++-------- 2 files changed, 311 insertions(+), 258 deletions(-) diff --git a/src/algorithms/PVT/gnuradio_blocks/rtklib_pvt_cc.cc b/src/algorithms/PVT/gnuradio_blocks/rtklib_pvt_cc.cc index 43da2f97f..75438755c 100644 --- a/src/algorithms/PVT/gnuradio_blocks/rtklib_pvt_cc.cc +++ b/src/algorithms/PVT/gnuradio_blocks/rtklib_pvt_cc.cc @@ -534,13 +534,13 @@ int rtklib_pvt_cc::work(int noutput_items, gr_vector_const_void_star& input_item // ############ 1. READ PSEUDORANGES #### for (unsigned int i = 0; i < d_nchannels; i++) { - if (in[i][epoch].Flag_valid_pseudorange == true) + if (in[i][epoch].Flag_valid_pseudorange) { std::map::const_iterator tmp_eph_iter_gps = d_ls_pvt->gps_ephemeris_map.find(in[i][epoch].PRN); std::map::const_iterator tmp_eph_iter_gal = d_ls_pvt->galileo_ephemeris_map.find(in[i][epoch].PRN); std::map::const_iterator tmp_eph_iter_cnav = d_ls_pvt->gps_cnav_ephemeris_map.find(in[i][epoch].PRN); std::map::const_iterator tmp_eph_iter_glo_gnav = d_ls_pvt->glonass_gnav_ephemeris_map.find(in[i][epoch].PRN); - if (((tmp_eph_iter_gps->second.i_satellite_PRN == in[i][epoch].PRN) && (std::string(in[i][epoch].Signal).compare("1C") == 0)) || ((tmp_eph_iter_cnav->second.i_satellite_PRN == in[i][epoch].PRN) && (std::string(in[i][epoch].Signal).compare("2S") == 0)) || ((tmp_eph_iter_gal->second.i_satellite_PRN == in[i][epoch].PRN) && (std::string(in[i][epoch].Signal).compare("1B") == 0)) || ((tmp_eph_iter_gal->second.i_satellite_PRN == in[i][epoch].PRN) && (std::string(in[i][epoch].Signal).compare("5X") == 0)) || ((tmp_eph_iter_glo_gnav->second.i_satellite_PRN == in[i][epoch].PRN) && (std::string(in[i][epoch].Signal).compare("1G") == 0)) || ((tmp_eph_iter_glo_gnav->second.i_satellite_PRN == in[i][epoch].PRN) && (std::string(in[i][epoch].Signal).compare("2G") == 0)) || ((tmp_eph_iter_cnav->second.i_satellite_PRN == in[i][epoch].PRN) && (std::string(in[i][epoch].Signal).compare("L5") == 0))) + if (((tmp_eph_iter_gps->second.i_satellite_PRN == in[i][epoch].PRN) and (std::string(in[i][epoch].Signal).compare("1C") == 0)) or ((tmp_eph_iter_cnav->second.i_satellite_PRN == in[i][epoch].PRN) and (std::string(in[i][epoch].Signal).compare("2S") == 0)) or ((tmp_eph_iter_gal->second.i_satellite_PRN == in[i][epoch].PRN) and (std::string(in[i][epoch].Signal).compare("1B") == 0)) or ((tmp_eph_iter_gal->second.i_satellite_PRN == in[i][epoch].PRN) and (std::string(in[i][epoch].Signal).compare("5X") == 0)) or ((tmp_eph_iter_glo_gnav->second.i_satellite_PRN == in[i][epoch].PRN) and (std::string(in[i][epoch].Signal).compare("1G") == 0)) or ((tmp_eph_iter_glo_gnav->second.i_satellite_PRN == in[i][epoch].PRN) and (std::string(in[i][epoch].Signal).compare("2G") == 0)) or ((tmp_eph_iter_cnav->second.i_satellite_PRN == in[i][epoch].PRN) and (std::string(in[i][epoch].Signal).compare("L5") == 0))) { // store valid observables in a map. gnss_observables_map.insert(std::pair(i, in[i][epoch])); @@ -601,36 +601,36 @@ int rtklib_pvt_cc::work(int noutput_items, gr_vector_const_void_star& input_item flag_display_pvt = true; last_pvt_display_T_rx_s = current_RX_time; } - if ((std::fabs(current_RX_time - last_RTCM_1019_output_time) * 1000.0 >= static_cast(d_rtcm_MT1019_rate_ms)) && (d_rtcm_MT1019_rate_ms != 0)) // allows deactivating messages by setting rate = 0 + if ((std::fabs(current_RX_time - last_RTCM_1019_output_time) * 1000.0 >= static_cast(d_rtcm_MT1019_rate_ms)) and (d_rtcm_MT1019_rate_ms != 0)) // allows deactivating messages by setting rate = 0 { flag_write_RTCM_1019_output = true; last_RTCM_1019_output_time = current_RX_time; } - if ((std::fabs(current_RX_time - last_RTCM_1020_output_time) * 1000.0 >= static_cast(d_rtcm_MT1020_rate_ms)) && (d_rtcm_MT1020_rate_ms != 0)) // allows deactivating messages by setting rate = 0 + if ((std::fabs(current_RX_time - last_RTCM_1020_output_time) * 1000.0 >= static_cast(d_rtcm_MT1020_rate_ms)) and (d_rtcm_MT1020_rate_ms != 0)) // allows deactivating messages by setting rate = 0 { flag_write_RTCM_1020_output = true; last_RTCM_1020_output_time = current_RX_time; } - if ((std::fabs(current_RX_time - last_RTCM_1045_output_time) * 1000.0 >= static_cast(d_rtcm_MT1045_rate_ms)) && (d_rtcm_MT1045_rate_ms != 0)) + if ((std::fabs(current_RX_time - last_RTCM_1045_output_time) * 1000.0 >= static_cast(d_rtcm_MT1045_rate_ms)) and (d_rtcm_MT1045_rate_ms != 0)) { flag_write_RTCM_1045_output = true; last_RTCM_1045_output_time = current_RX_time; } - if ((std::fabs(current_RX_time - last_RTCM_1077_output_time) * 1000.0 >= static_cast(d_rtcm_MT1077_rate_ms)) && (d_rtcm_MT1077_rate_ms != 0)) + if ((std::fabs(current_RX_time - last_RTCM_1077_output_time) * 1000.0 >= static_cast(d_rtcm_MT1077_rate_ms)) and (d_rtcm_MT1077_rate_ms != 0)) { last_RTCM_1077_output_time = current_RX_time; } - if ((std::fabs(current_RX_time - last_RTCM_1087_output_time) * 1000.0 >= static_cast(d_rtcm_MT1087_rate_ms)) && (d_rtcm_MT1087_rate_ms != 0)) + if ((std::fabs(current_RX_time - last_RTCM_1087_output_time) * 1000.0 >= static_cast(d_rtcm_MT1087_rate_ms)) and (d_rtcm_MT1087_rate_ms != 0)) { last_RTCM_1087_output_time = current_RX_time; } - if ((std::fabs(current_RX_time - last_RTCM_1097_output_time) * 1000.0 >= static_cast(d_rtcm_MT1097_rate_ms)) && (d_rtcm_MT1097_rate_ms != 0)) + if ((std::fabs(current_RX_time - last_RTCM_1097_output_time) * 1000.0 >= static_cast(d_rtcm_MT1097_rate_ms)) and (d_rtcm_MT1097_rate_ms != 0)) { last_RTCM_1097_output_time = current_RX_time; } - if ((std::fabs(current_RX_time - last_RTCM_MSM_output_time) * 1000.0 >= static_cast(d_rtcm_MSM_rate_ms)) && (d_rtcm_MSM_rate_ms != 0)) + if ((std::fabs(current_RX_time - last_RTCM_MSM_output_time) * 1000.0 >= static_cast(d_rtcm_MSM_rate_ms)) and (d_rtcm_MSM_rate_ms != 0)) { flag_write_RTCM_MSM_output = true; last_RTCM_MSM_output_time = current_RX_time; @@ -776,7 +776,7 @@ int rtklib_pvt_cc::work(int noutput_items, gr_vector_const_void_star& input_item } if (type_of_rx == 7) // GPS L1 C/A + GPS L2C { - if ((gps_ephemeris_iter != d_ls_pvt->gps_ephemeris_map.cend()) && (gps_cnav_ephemeris_iter != d_ls_pvt->gps_cnav_ephemeris_map.cend())) + if ((gps_ephemeris_iter != d_ls_pvt->gps_ephemeris_map.cend()) and (gps_cnav_ephemeris_iter != d_ls_pvt->gps_cnav_ephemeris_map.cend())) { rp->rinex_obs_header(rp->obsFile, gps_ephemeris_iter->second, gps_cnav_ephemeris_iter->second, d_rx_time); rp->rinex_nav_header(rp->navFile, d_ls_pvt->gps_iono, d_ls_pvt->gps_utc_model); @@ -786,7 +786,7 @@ int rtklib_pvt_cc::work(int noutput_items, gr_vector_const_void_star& input_item if (type_of_rx == 9) // GPS L1 C/A + Galileo E1B { - if ((galileo_ephemeris_iter != d_ls_pvt->galileo_ephemeris_map.cend()) && (gps_ephemeris_iter != d_ls_pvt->gps_ephemeris_map.cend())) + if ((galileo_ephemeris_iter != d_ls_pvt->galileo_ephemeris_map.cend()) and (gps_ephemeris_iter != d_ls_pvt->gps_ephemeris_map.cend())) { std::string gal_signal("1B"); rp->rinex_obs_header(rp->obsFile, gps_ephemeris_iter->second, galileo_ephemeris_iter->second, d_rx_time, gal_signal); @@ -796,7 +796,7 @@ int rtklib_pvt_cc::work(int noutput_items, gr_vector_const_void_star& input_item } if (type_of_rx == 10) // GPS L1 C/A + Galileo E5a { - if ((galileo_ephemeris_iter != d_ls_pvt->galileo_ephemeris_map.cend()) && (gps_ephemeris_iter != d_ls_pvt->gps_ephemeris_map.cend())) + if ((galileo_ephemeris_iter != d_ls_pvt->galileo_ephemeris_map.cend()) and (gps_ephemeris_iter != d_ls_pvt->gps_ephemeris_map.cend())) { std::string gal_signal("5X"); rp->rinex_obs_header(rp->obsFile, gps_ephemeris_iter->second, galileo_ephemeris_iter->second, d_rx_time, gal_signal); @@ -806,7 +806,7 @@ int rtklib_pvt_cc::work(int noutput_items, gr_vector_const_void_star& input_item } if (type_of_rx == 11) // GPS L1 C/A + Galileo E5b { - if ((galileo_ephemeris_iter != d_ls_pvt->galileo_ephemeris_map.cend()) && (gps_ephemeris_iter != d_ls_pvt->gps_ephemeris_map.cend())) + if ((galileo_ephemeris_iter != d_ls_pvt->galileo_ephemeris_map.cend()) and (gps_ephemeris_iter != d_ls_pvt->gps_ephemeris_map.cend())) { std::string gal_signal("7X"); rp->rinex_obs_header(rp->obsFile, gps_ephemeris_iter->second, galileo_ephemeris_iter->second, d_rx_time, gal_signal); @@ -867,7 +867,7 @@ int rtklib_pvt_cc::work(int noutput_items, gr_vector_const_void_star& input_item if (type_of_rx == 26) // GPS L1 C/A + GLONASS L1 C/A { - if ((glonass_gnav_ephemeris_iter != d_ls_pvt->glonass_gnav_ephemeris_map.cend()) && (gps_ephemeris_iter != d_ls_pvt->gps_ephemeris_map.cend())) + if ((glonass_gnav_ephemeris_iter != d_ls_pvt->glonass_gnav_ephemeris_map.cend()) and (gps_ephemeris_iter != d_ls_pvt->gps_ephemeris_map.cend())) { 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); @@ -883,7 +883,7 @@ int rtklib_pvt_cc::work(int noutput_items, gr_vector_const_void_star& input_item } if (type_of_rx == 27) // Galileo E1B + GLONASS L1 C/A { - if ((glonass_gnav_ephemeris_iter != d_ls_pvt->glonass_gnav_ephemeris_map.cend()) && (galileo_ephemeris_iter != d_ls_pvt->galileo_ephemeris_map.cend())) + if ((glonass_gnav_ephemeris_iter != d_ls_pvt->glonass_gnav_ephemeris_map.cend()) and (galileo_ephemeris_iter != d_ls_pvt->galileo_ephemeris_map.cend())) { std::string glo_signal("1G"); std::string gal_signal("1B"); @@ -894,7 +894,7 @@ int rtklib_pvt_cc::work(int noutput_items, gr_vector_const_void_star& input_item } if (type_of_rx == 28) // GPS L2C + GLONASS L1 C/A { - if ((glonass_gnav_ephemeris_iter != d_ls_pvt->glonass_gnav_ephemeris_map.cend()) && (gps_cnav_ephemeris_iter != d_ls_pvt->gps_cnav_ephemeris_map.cend())) + if ((glonass_gnav_ephemeris_iter != d_ls_pvt->glonass_gnav_ephemeris_map.cend()) and (gps_cnav_ephemeris_iter != d_ls_pvt->gps_cnav_ephemeris_map.cend())) { std::string glo_signal("1G"); rp->rinex_obs_header(rp->obsFile, gps_cnav_ephemeris_iter->second, glonass_gnav_ephemeris_iter->second, d_rx_time, glo_signal); @@ -919,7 +919,7 @@ int rtklib_pvt_cc::work(int noutput_items, gr_vector_const_void_star& input_item { rp->log_rinex_nav(rp->navFile, d_ls_pvt->gps_cnav_ephemeris_map); } - if ((type_of_rx == 4) || (type_of_rx == 5) || (type_of_rx == 6)) // Galileo + if ((type_of_rx == 4) or (type_of_rx == 5) or (type_of_rx == 6)) // Galileo { rp->log_rinex_nav(rp->navGalFile, d_ls_pvt->galileo_ephemeris_map); } @@ -927,15 +927,15 @@ int rtklib_pvt_cc::work(int noutput_items, gr_vector_const_void_star& input_item { rp->log_rinex_nav(rp->navFile, d_ls_pvt->gps_cnav_ephemeris_map); } - if ((type_of_rx == 9) || (type_of_rx == 10) || (type_of_rx == 11)) // GPS L1 C/A + Galileo + if ((type_of_rx == 9) or (type_of_rx == 10) or (type_of_rx == 11)) // GPS L1 C/A + Galileo { rp->log_rinex_nav(rp->navMixFile, d_ls_pvt->gps_ephemeris_map, d_ls_pvt->galileo_ephemeris_map); } - if ((type_of_rx == 14) || (type_of_rx == 15)) // Galileo E1B + Galileo E5a + if ((type_of_rx == 14) or (type_of_rx == 15)) // Galileo E1B + Galileo E5a { rp->log_rinex_nav(rp->navGalFile, d_ls_pvt->galileo_ephemeris_map); } - if ((type_of_rx == 23) || (type_of_rx == 24) || (type_of_rx == 25)) // GLONASS L1 C/A, GLONASS L2 C/A + if ((type_of_rx == 23) or (type_of_rx == 24) or (type_of_rx == 25)) // GLONASS L1 C/A, GLONASS L2 C/A { rp->log_rinex_nav(rp->navGloFile, d_ls_pvt->glonass_gnav_ephemeris_map); } @@ -972,7 +972,7 @@ int rtklib_pvt_cc::work(int noutput_items, gr_vector_const_void_star& input_item { rp->log_rinex_obs(rp->obsFile, gps_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 and (d_ls_pvt->gps_utc_model.d_A0 != 0)) { rp->update_obs_header(rp->obsFile, d_ls_pvt->gps_utc_model); rp->update_nav_header(rp->navFile, d_ls_pvt->gps_utc_model, d_ls_pvt->gps_iono); @@ -985,7 +985,7 @@ int rtklib_pvt_cc::work(int noutput_items, gr_vector_const_void_star& input_item { rp->log_rinex_obs(rp->obsFile, gps_cnav_ephemeris_iter->second, d_rx_time, gnss_observables_map); } - if (!b_rinex_header_updated && (d_ls_pvt->gps_cnav_utc_model.d_A0 != 0)) + if (!b_rinex_header_updated and (d_ls_pvt->gps_cnav_utc_model.d_A0 != 0)) { rp->update_obs_header(rp->obsFile, d_ls_pvt->gps_cnav_utc_model); rp->update_nav_header(rp->navFile, d_ls_pvt->gps_cnav_utc_model, d_ls_pvt->gps_cnav_iono); @@ -998,7 +998,7 @@ int rtklib_pvt_cc::work(int noutput_items, gr_vector_const_void_star& input_item { rp->log_rinex_obs(rp->obsFile, gps_cnav_ephemeris_iter->second, d_rx_time, gnss_observables_map); } - if (!b_rinex_header_updated && (d_ls_pvt->gps_cnav_utc_model.d_A0 != 0)) + if (!b_rinex_header_updated and (d_ls_pvt->gps_cnav_utc_model.d_A0 != 0)) { rp->update_obs_header(rp->obsFile, d_ls_pvt->gps_cnav_utc_model); rp->update_nav_header(rp->navFile, d_ls_pvt->gps_cnav_utc_model, d_ls_pvt->gps_cnav_iono); @@ -1011,7 +1011,7 @@ int rtklib_pvt_cc::work(int noutput_items, gr_vector_const_void_star& input_item { rp->log_rinex_obs(rp->obsFile, galileo_ephemeris_iter->second, d_rx_time, gnss_observables_map, "1B"); } - if (!b_rinex_header_updated && (d_ls_pvt->galileo_utc_model.A0_6 != 0)) + if (!b_rinex_header_updated and (d_ls_pvt->galileo_utc_model.A0_6 != 0)) { rp->update_nav_header(rp->navGalFile, d_ls_pvt->galileo_iono, d_ls_pvt->galileo_utc_model, d_ls_pvt->galileo_almanac); rp->update_obs_header(rp->obsFile, d_ls_pvt->galileo_utc_model); @@ -1024,7 +1024,7 @@ int rtklib_pvt_cc::work(int noutput_items, gr_vector_const_void_star& input_item { rp->log_rinex_obs(rp->obsFile, galileo_ephemeris_iter->second, d_rx_time, gnss_observables_map, "5X"); } - if (!b_rinex_header_updated && (d_ls_pvt->galileo_utc_model.A0_6 != 0)) + if (!b_rinex_header_updated and (d_ls_pvt->galileo_utc_model.A0_6 != 0)) { rp->update_nav_header(rp->navGalFile, d_ls_pvt->galileo_iono, d_ls_pvt->galileo_utc_model, d_ls_pvt->galileo_almanac); rp->update_obs_header(rp->obsFile, d_ls_pvt->galileo_utc_model); @@ -1037,7 +1037,7 @@ int rtklib_pvt_cc::work(int noutput_items, gr_vector_const_void_star& input_item { rp->log_rinex_obs(rp->obsFile, galileo_ephemeris_iter->second, d_rx_time, gnss_observables_map, "7X"); } - if (!b_rinex_header_updated && (d_ls_pvt->galileo_utc_model.A0_6 != 0)) + if (!b_rinex_header_updated and (d_ls_pvt->galileo_utc_model.A0_6 != 0)) { rp->update_nav_header(rp->navGalFile, d_ls_pvt->galileo_iono, d_ls_pvt->galileo_utc_model, d_ls_pvt->galileo_almanac); rp->update_obs_header(rp->obsFile, d_ls_pvt->galileo_utc_model); @@ -1046,11 +1046,11 @@ int rtklib_pvt_cc::work(int noutput_items, gr_vector_const_void_star& input_item } if (type_of_rx == 7) // GPS L1 C/A + GPS L2C { - if ((gps_ephemeris_iter != d_ls_pvt->gps_ephemeris_map.end()) && (gps_cnav_ephemeris_iter != d_ls_pvt->gps_cnav_ephemeris_map.end())) + if ((gps_ephemeris_iter != d_ls_pvt->gps_ephemeris_map.end()) and (gps_cnav_ephemeris_iter != d_ls_pvt->gps_cnav_ephemeris_map.end())) { rp->log_rinex_obs(rp->obsFile, gps_ephemeris_iter->second, gps_cnav_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 and (d_ls_pvt->gps_utc_model.d_A0 != 0)) { rp->update_obs_header(rp->obsFile, d_ls_pvt->gps_utc_model); rp->update_nav_header(rp->navFile, d_ls_pvt->gps_utc_model, d_ls_pvt->gps_iono); @@ -1059,11 +1059,11 @@ int rtklib_pvt_cc::work(int noutput_items, gr_vector_const_void_star& input_item } if (type_of_rx == 9) // GPS L1 C/A + Galileo E1B { - if ((galileo_ephemeris_iter != d_ls_pvt->galileo_ephemeris_map.end()) && (gps_ephemeris_iter != d_ls_pvt->gps_ephemeris_map.end())) + if ((galileo_ephemeris_iter != d_ls_pvt->galileo_ephemeris_map.end()) and (gps_ephemeris_iter != d_ls_pvt->gps_ephemeris_map.end())) { rp->log_rinex_obs(rp->obsFile, gps_ephemeris_iter->second, galileo_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 and (d_ls_pvt->gps_utc_model.d_A0 != 0)) { rp->update_obs_header(rp->obsFile, d_ls_pvt->gps_utc_model); rp->update_nav_header(rp->navMixFile, d_ls_pvt->gps_iono, d_ls_pvt->gps_utc_model, d_ls_pvt->galileo_iono, d_ls_pvt->galileo_utc_model, d_ls_pvt->galileo_almanac); @@ -1076,7 +1076,7 @@ int rtklib_pvt_cc::work(int noutput_items, gr_vector_const_void_star& input_item { rp->log_rinex_obs(rp->obsFile, galileo_ephemeris_iter->second, d_rx_time, gnss_observables_map, "1B 5X"); } - if (!b_rinex_header_updated && (d_ls_pvt->galileo_utc_model.A0_6 != 0)) + if (!b_rinex_header_updated and (d_ls_pvt->galileo_utc_model.A0_6 != 0)) { rp->update_nav_header(rp->navGalFile, d_ls_pvt->galileo_iono, d_ls_pvt->galileo_utc_model, d_ls_pvt->galileo_almanac); rp->update_obs_header(rp->obsFile, d_ls_pvt->galileo_utc_model); @@ -1089,7 +1089,7 @@ int rtklib_pvt_cc::work(int noutput_items, gr_vector_const_void_star& input_item { rp->log_rinex_obs(rp->obsFile, galileo_ephemeris_iter->second, d_rx_time, gnss_observables_map, "1B 7X"); } - if (!b_rinex_header_updated && (d_ls_pvt->galileo_utc_model.A0_6 != 0)) + if (!b_rinex_header_updated and (d_ls_pvt->galileo_utc_model.A0_6 != 0)) { rp->update_nav_header(rp->navGalFile, d_ls_pvt->galileo_iono, d_ls_pvt->galileo_utc_model, d_ls_pvt->galileo_almanac); rp->update_obs_header(rp->obsFile, d_ls_pvt->galileo_utc_model); @@ -1102,7 +1102,7 @@ int rtklib_pvt_cc::work(int noutput_items, gr_vector_const_void_star& input_item { rp->log_rinex_obs(rp->obsFile, glonass_gnav_ephemeris_iter->second, d_rx_time, gnss_observables_map, "1C"); } - if (!b_rinex_header_updated && (d_ls_pvt->glonass_gnav_utc_model.d_tau_c != 0)) + if (!b_rinex_header_updated and (d_ls_pvt->glonass_gnav_utc_model.d_tau_c != 0)) { rp->update_nav_header(rp->navGloFile, d_ls_pvt->glonass_gnav_utc_model, d_ls_pvt->glonass_gnav_almanac); rp->update_obs_header(rp->obsFile, d_ls_pvt->glonass_gnav_utc_model); @@ -1115,7 +1115,7 @@ int rtklib_pvt_cc::work(int noutput_items, gr_vector_const_void_star& input_item { rp->log_rinex_obs(rp->obsFile, glonass_gnav_ephemeris_iter->second, d_rx_time, gnss_observables_map, "2C"); } - if (!b_rinex_header_updated && (d_ls_pvt->glonass_gnav_utc_model.d_tau_c != 0)) + if (!b_rinex_header_updated and (d_ls_pvt->glonass_gnav_utc_model.d_tau_c != 0)) { rp->update_nav_header(rp->navGloFile, d_ls_pvt->glonass_gnav_utc_model, d_ls_pvt->glonass_gnav_almanac); rp->update_obs_header(rp->obsFile, d_ls_pvt->glonass_gnav_utc_model); @@ -1128,7 +1128,7 @@ int rtklib_pvt_cc::work(int noutput_items, gr_vector_const_void_star& input_item { rp->log_rinex_obs(rp->obsFile, glonass_gnav_ephemeris_iter->second, d_rx_time, gnss_observables_map, "1C 2C"); } - if (!b_rinex_header_updated && (d_ls_pvt->glonass_gnav_utc_model.d_tau_c != 0)) + if (!b_rinex_header_updated and (d_ls_pvt->glonass_gnav_utc_model.d_tau_c != 0)) { rp->update_nav_header(rp->navMixFile, d_ls_pvt->glonass_gnav_utc_model, d_ls_pvt->glonass_gnav_almanac); rp->update_obs_header(rp->obsFile, d_ls_pvt->glonass_gnav_utc_model); @@ -1137,11 +1137,11 @@ int rtklib_pvt_cc::work(int noutput_items, gr_vector_const_void_star& input_item } if (type_of_rx == 26) // GPS L1 C/A + GLONASS L1 C/A { - 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()) and (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); } - if (!b_rinex_header_updated && (d_ls_pvt->gps_utc_model.d_A0 != 0)) + if (!b_rinex_header_updated and (d_ls_pvt->gps_utc_model.d_A0 != 0)) { rp->update_obs_header(rp->obsFile, d_ls_pvt->gps_utc_model); rp->update_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); @@ -1150,11 +1150,11 @@ int rtklib_pvt_cc::work(int noutput_items, gr_vector_const_void_star& input_item } if (type_of_rx == 27) // Galileo E1B + GLONASS L1 C/A { - if ((glonass_gnav_ephemeris_iter != d_ls_pvt->glonass_gnav_ephemeris_map.end()) && (galileo_ephemeris_iter != d_ls_pvt->galileo_ephemeris_map.end())) + if ((glonass_gnav_ephemeris_iter != d_ls_pvt->glonass_gnav_ephemeris_map.end()) and (galileo_ephemeris_iter != d_ls_pvt->galileo_ephemeris_map.end())) { rp->log_rinex_obs(rp->obsFile, galileo_ephemeris_iter->second, glonass_gnav_ephemeris_iter->second, d_rx_time, gnss_observables_map); } - if (!b_rinex_header_updated && (d_ls_pvt->galileo_utc_model.A0_6 != 0)) + if (!b_rinex_header_updated and (d_ls_pvt->galileo_utc_model.A0_6 != 0)) { rp->update_obs_header(rp->obsFile, d_ls_pvt->galileo_utc_model); rp->update_nav_header(rp->navMixFile, d_ls_pvt->galileo_iono, d_ls_pvt->galileo_utc_model, d_ls_pvt->galileo_almanac, d_ls_pvt->glonass_gnav_utc_model, d_ls_pvt->glonass_gnav_almanac); @@ -1163,11 +1163,11 @@ int rtklib_pvt_cc::work(int noutput_items, gr_vector_const_void_star& input_item } if (type_of_rx == 28) // GPS L2C + GLONASS L1 C/A { - if ((glonass_gnav_ephemeris_iter != d_ls_pvt->glonass_gnav_ephemeris_map.end()) && (gps_cnav_ephemeris_iter != d_ls_pvt->gps_cnav_ephemeris_map.end())) + if ((glonass_gnav_ephemeris_iter != d_ls_pvt->glonass_gnav_ephemeris_map.end()) and (gps_cnav_ephemeris_iter != d_ls_pvt->gps_cnav_ephemeris_map.end())) { rp->log_rinex_obs(rp->obsFile, gps_cnav_ephemeris_iter->second, glonass_gnav_ephemeris_iter->second, d_rx_time, gnss_observables_map); } - if (!b_rinex_header_updated && (d_ls_pvt->gps_cnav_utc_model.d_A0 != 0)) + if (!b_rinex_header_updated and (d_ls_pvt->gps_cnav_utc_model.d_A0 != 0)) { rp->update_obs_header(rp->obsFile, d_ls_pvt->gps_cnav_utc_model); rp->update_nav_header(rp->navMixFile, d_ls_pvt->gps_cnav_iono, d_ls_pvt->gps_cnav_utc_model, d_ls_pvt->glonass_gnav_utc_model, d_ls_pvt->glonass_gnav_almanac); @@ -1200,7 +1200,7 @@ int rtklib_pvt_cc::work(int noutput_items, gr_vector_const_void_star& input_item } } } - if ((type_of_rx == 4) || (type_of_rx == 5) || (type_of_rx == 6) || (type_of_rx == 14) || (type_of_rx == 15)) // Galileo + if ((type_of_rx == 4) or (type_of_rx == 5) or (type_of_rx == 6) or (type_of_rx == 14) or (type_of_rx == 15)) // Galileo { if (flag_write_RTCM_1045_output == true) { @@ -1234,7 +1234,7 @@ int rtklib_pvt_cc::work(int noutput_items, gr_vector_const_void_star& input_item gps_ephemeris_iter = d_ls_pvt->gps_ephemeris_map.cbegin(); std::map::const_iterator gps_cnav_ephemeris_iter; gps_cnav_ephemeris_iter = d_ls_pvt->gps_cnav_ephemeris_map.cbegin(); - if ((gps_ephemeris_iter != d_ls_pvt->gps_ephemeris_map.cend()) && (gps_cnav_ephemeris_iter != d_ls_pvt->gps_cnav_ephemeris_map.cend())) + if ((gps_ephemeris_iter != d_ls_pvt->gps_ephemeris_map.cend()) and (gps_cnav_ephemeris_iter != d_ls_pvt->gps_cnav_ephemeris_map.cend())) { d_rtcm_printer->Print_Rtcm_MSM(7, gps_ephemeris_iter->second, gps_cnav_ephemeris_iter->second, {}, {}, d_rx_time, gnss_observables_map, 0, 0, 0, 0, 0); } @@ -1305,7 +1305,7 @@ int rtklib_pvt_cc::work(int noutput_items, gr_vector_const_void_star& input_item } } } - if ((type_of_rx == 23) || (type_of_rx == 24) || (type_of_rx == 25)) // GLONASS + if ((type_of_rx == 23) or (type_of_rx == 24) or (type_of_rx == 25)) // GLONASS { if (flag_write_RTCM_1020_output == true) { @@ -1472,7 +1472,7 @@ int rtklib_pvt_cc::work(int noutput_items, gr_vector_const_void_star& input_item } b_rtcm_writing_started = true; } - if ((type_of_rx == 4) || (type_of_rx == 5) || (type_of_rx == 6) || (type_of_rx == 14) || (type_of_rx == 15)) // Galileo + if ((type_of_rx == 4) or (type_of_rx == 5) or (type_of_rx == 6) or (type_of_rx == 14) or (type_of_rx == 15)) // Galileo { for (std::map::const_iterator gal_ephemeris_iter = d_ls_pvt->galileo_ephemeris_map.cbegin(); gal_ephemeris_iter != d_ls_pvt->galileo_ephemeris_map.cend(); gal_ephemeris_iter++) { @@ -1497,7 +1497,7 @@ int rtklib_pvt_cc::work(int noutput_items, gr_vector_const_void_star& input_item std::map::const_iterator gps_ephemeris_iter = d_ls_pvt->gps_ephemeris_map.cbegin(); std::map::const_iterator gps_cnav_ephemeris_iter = d_ls_pvt->gps_cnav_ephemeris_map.cbegin(); - if ((gps_ephemeris_iter != d_ls_pvt->gps_ephemeris_map.cend()) && (gps_cnav_ephemeris_iter != d_ls_pvt->gps_cnav_ephemeris_map.cend())) + if ((gps_ephemeris_iter != d_ls_pvt->gps_ephemeris_map.cend()) and (gps_cnav_ephemeris_iter != d_ls_pvt->gps_cnav_ephemeris_map.cend())) { d_rtcm_printer->Print_Rtcm_MSM(7, gps_ephemeris_iter->second, gps_cnav_ephemeris_iter->second, {}, {}, d_rx_time, gnss_observables_map, 0, 0, 0, 0, 0); } @@ -1550,18 +1550,18 @@ int rtklib_pvt_cc::work(int noutput_items, gr_vector_const_void_star& input_item i++; } - if (gps_ephemeris_iter != d_ls_pvt->gps_ephemeris_map.end() && (d_rtcm_MT1077_rate_ms != 0)) + if (gps_ephemeris_iter != d_ls_pvt->gps_ephemeris_map.end() and (d_rtcm_MT1077_rate_ms != 0)) { d_rtcm_printer->Print_Rtcm_MSM(7, gps_ephemeris_iter->second, {}, {}, {}, d_rx_time, gnss_observables_map, 0, 0, 0, 0, 0); } - if (galileo_ephemeris_iter != d_ls_pvt->galileo_ephemeris_map.end() && (d_rtcm_MT1097_rate_ms != 0)) + if (galileo_ephemeris_iter != d_ls_pvt->galileo_ephemeris_map.end() and (d_rtcm_MT1097_rate_ms != 0)) { d_rtcm_printer->Print_Rtcm_MSM(7, {}, {}, galileo_ephemeris_iter->second, {}, d_rx_time, gnss_observables_map, 0, 0, 0, 0, 0); } b_rtcm_writing_started = true; } - if ((type_of_rx == 23) || (type_of_rx == 24) || (type_of_rx == 25)) // GLONASS + if ((type_of_rx == 23) or (type_of_rx == 24) or (type_of_rx == 25)) // GLONASS { for (std::map::const_iterator glonass_gnav_ephemeris_iter = d_ls_pvt->glonass_gnav_ephemeris_map.cbegin(); glonass_gnav_ephemeris_iter != d_ls_pvt->glonass_gnav_ephemeris_map.cend(); glonass_gnav_ephemeris_iter++) { @@ -1696,7 +1696,7 @@ int rtklib_pvt_cc::work(int noutput_items, gr_vector_const_void_star& input_item } // DEBUG MESSAGE: Display position in console output - if ((d_ls_pvt->is_valid_position() == true) && (flag_display_pvt == true)) + if ((d_ls_pvt->is_valid_position() == true) and (flag_display_pvt == true)) { std::cout << TEXT_BOLD_GREEN << "Position at " << boost::posix_time::to_simple_string(d_ls_pvt->get_position_UTC_time()) << " UTC using " << d_ls_pvt->get_num_valid_observations() << " observations is Lat = " << d_ls_pvt->get_latitude() << " [deg], Long = " << d_ls_pvt->get_longitude() diff --git a/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc b/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc index c5e2c983e..20e5c6948 100644 --- a/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc +++ b/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc @@ -51,62 +51,64 @@ hybrid_observables_cc_sptr hybrid_make_observables_cc(unsigned int nchannels_in, } -hybrid_observables_cc::hybrid_observables_cc(unsigned int nchannels_in, unsigned int nchannels_out, bool dump, std::string dump_filename) : - gr::block("hybrid_observables_cc", - gr::io_signature::make(nchannels_in, nchannels_in, sizeof(Gnss_Synchro)), - gr::io_signature::make(nchannels_out, nchannels_out, sizeof(Gnss_Synchro))) +hybrid_observables_cc::hybrid_observables_cc(unsigned int nchannels_in, unsigned int nchannels_out, bool dump, std::string dump_filename) : gr::block("hybrid_observables_cc", + gr::io_signature::make(nchannels_in, nchannels_in, sizeof(Gnss_Synchro)), + gr::io_signature::make(nchannels_out, nchannels_out, sizeof(Gnss_Synchro))) { d_dump = dump; d_nchannels = nchannels_out; d_dump_filename = dump_filename; T_rx_s = 0.0; - T_rx_step_s = 0.001; // 1 ms - max_delta = 0.15; // 150 ms + T_rx_step_s = 0.001; // 1 ms + max_delta = 0.15; // 150 ms valid_channels.resize(d_nchannels, false); d_num_valid_channels = 0; - for(unsigned int i = 0; i < d_nchannels; i++) - { - d_gnss_synchro_history.push_back(std::deque()); - } + for (unsigned int i = 0; i < d_nchannels; i++) + { + d_gnss_synchro_history.push_back(std::deque()); + } // ############# ENABLE DATA FILE LOG ################# if (d_dump) - { - if (!d_dump_file.is_open()) { - try - { - d_dump_file.exceptions (std::ifstream::failbit | std::ifstream::badbit ); - d_dump_file.open(d_dump_filename.c_str(), std::ios::out | std::ios::binary); - LOG(INFO) << "Observables dump enabled Log file: " << d_dump_filename.c_str(); - } - catch (const std::ifstream::failure & e) - { - LOG(WARNING) << "Exception opening observables dump file " << e.what(); - d_dump = false; - } + if (!d_dump_file.is_open()) + { + try + { + d_dump_file.exceptions(std::ifstream::failbit | std::ifstream::badbit); + d_dump_file.open(d_dump_filename.c_str(), std::ios::out | std::ios::binary); + LOG(INFO) << "Observables dump enabled Log file: " << d_dump_filename.c_str(); + } + catch (const std::ifstream::failure &e) + { + LOG(WARNING) << "Exception opening observables dump file " << e.what(); + d_dump = false; + } + } } - } } hybrid_observables_cc::~hybrid_observables_cc() { if (d_dump_file.is_open()) - { - try { d_dump_file.close(); } - catch(const std::exception & ex) { - LOG(WARNING) << "Exception in destructor closing the dump file " << ex.what(); + try + { + d_dump_file.close(); + } + catch (const std::exception &ex) + { + LOG(WARNING) << "Exception in destructor closing the dump file " << ex.what(); + } + } + if (d_dump) + { + std::cout << "Writing observables .mat files ..."; + save_matfile(); + std::cout << " done." << std::endl; } - } - if(d_dump) - { - std::cout << "Writing observables .mat files ..."; - save_matfile(); - std::cout << " done." << std::endl; - } } @@ -118,12 +120,15 @@ int hybrid_observables_cc::save_matfile() int epoch_size_bytes = sizeof(double) * number_of_double_vars * d_nchannels; std::ifstream dump_file; dump_file.exceptions(std::ifstream::failbit | std::ifstream::badbit); - try { dump_file.open(d_dump_filename.c_str(), std::ios::binary | std::ios::ate); } - catch(const std::ifstream::failure &e) - { - std::cerr << "Problem opening dump file:" << e.what() << std::endl; - return 1; - } + try + { + dump_file.open(d_dump_filename.c_str(), std::ios::binary | std::ios::ate); + } + catch (const std::ifstream::failure &e) + { + std::cerr << "Problem opening dump file:" << e.what() << std::endl; + return 1; + } // count number of epochs and rewind long int num_epoch = 0; if (dump_file.is_open()) @@ -132,14 +137,17 @@ int hybrid_observables_cc::save_matfile() num_epoch = static_cast(size) / static_cast(epoch_size_bytes); dump_file.seekg(0, std::ios::beg); } - else { return 1; } - double ** RX_time = new double * [d_nchannels]; - double ** TOW_at_current_symbol_s = new double * [d_nchannels]; - double ** Carrier_Doppler_hz = new double * [d_nchannels]; - double ** Carrier_phase_cycles = new double * [d_nchannels]; - double ** Pseudorange_m = new double * [d_nchannels]; - double ** PRN = new double * [d_nchannels]; - double ** Flag_valid_pseudorange = new double * [d_nchannels]; + else + { + return 1; + } + double **RX_time = new double *[d_nchannels]; + double **TOW_at_current_symbol_s = new double *[d_nchannels]; + double **Carrier_Doppler_hz = new double *[d_nchannels]; + double **Carrier_phase_cycles = new double *[d_nchannels]; + double **Pseudorange_m = new double *[d_nchannels]; + double **PRN = new double *[d_nchannels]; + double **Flag_valid_pseudorange = new double *[d_nchannels]; for (unsigned int i = 0; i < d_nchannels; i++) { @@ -223,7 +231,10 @@ int hybrid_observables_cc::save_matfile() mat_t *matfp; matvar_t *matvar; std::string filename = d_dump_filename; - if(filename.size() > 4) { filename.erase(filename.end() - 4, filename.end()); } + if (filename.size() > 4) + { + filename.erase(filename.end() - 4, filename.end()); + } filename.append(".mat"); matfp = Mat_CreateVer(filename.c_str(), NULL, MAT_FT_MAT73); if (reinterpret_cast(matfp) != NULL) @@ -287,66 +298,81 @@ int hybrid_observables_cc::save_matfile() return 0; } -bool hybrid_observables_cc::interpolate_data(Gnss_Synchro& out, std::deque& data, const double& ti) +bool hybrid_observables_cc::interpolate_data(Gnss_Synchro &out, std::deque &data, const double &ti) { - if((ti < data.front().RX_time) or (ti > data.back().RX_time)) { return false; } + if ((ti < data.front().RX_time) or (ti > data.back().RX_time)) + { + return false; + } std::deque::iterator it; - arma::vec t = arma::vec(data.size()); - arma::vec dop = t; - arma::vec cph = t; - arma::vec tow = t; - arma::vec tiv = arma::vec(1); + arma::vec t = arma::vec(data.size()); + arma::vec dop = t; + arma::vec cph = t; + arma::vec tow = t; + arma::vec tiv = arma::vec(1); arma::vec result; tiv(0) = ti; unsigned int aux = 0; - for(it = data.begin(); it != data.end(); it++) - { - t(aux) = it->RX_time; - dop(aux) = it->Carrier_Doppler_hz; - cph(aux) = it->Carrier_phase_rads; - tow(aux) = it->TOW_at_current_symbol_s; + for (it = data.begin(); it != data.end(); it++) + { + t(aux) = it->RX_time; + dop(aux) = it->Carrier_Doppler_hz; + cph(aux) = it->Carrier_phase_rads; + tow(aux) = it->TOW_at_current_symbol_s; - aux++; - } + aux++; + } arma::interp1(t, dop, tiv, result); - out.Carrier_Doppler_hz = result(0); + out.Carrier_Doppler_hz = result(0); arma::interp1(t, cph, tiv, result); - out.Carrier_phase_rads = result(0); + out.Carrier_phase_rads = result(0); arma::interp1(t, tow, tiv, result); out.TOW_at_current_symbol_s = result(0); return result.is_finite(); } -double hybrid_observables_cc::compute_T_rx_s(const Gnss_Synchro& a) +double hybrid_observables_cc::compute_T_rx_s(const Gnss_Synchro &a) { - if(a.Flag_valid_word) - { - return((static_cast(a.Tracking_sample_counter) + a.Code_phase_samples) / static_cast(a.fs)); - } - else { return 0.0; } + if (a.Flag_valid_word) + { + return ((static_cast(a.Tracking_sample_counter) + a.Code_phase_samples) / static_cast(a.fs)); + } + else + { + return 0.0; + } } void hybrid_observables_cc::forecast(int noutput_items __attribute__((unused)), - gr_vector_int &ninput_items_required) + gr_vector_int &ninput_items_required) { - for(unsigned int i = 0; i < d_nchannels; i++) { ninput_items_required[i] = 0; } + for (unsigned int i = 0; i < d_nchannels; i++) + { + ninput_items_required[i] = 0; + } ninput_items_required[d_nchannels] = 1; } -void hybrid_observables_cc::clean_history(std::deque& data) +void hybrid_observables_cc::clean_history(std::deque &data) { - while(data.size() > 0) - { - if((T_rx_s - data.front().RX_time) > max_delta) { data.pop_front(); } - else { return; } - } + while (data.size() > 0) + { + if ((T_rx_s - data.front().RX_time) > max_delta) + { + data.pop_front(); + } + else + { + return; + } + } } -void hybrid_observables_cc::correct_TOW_and_compute_prange(std::vector& data) +void hybrid_observables_cc::correct_TOW_and_compute_prange(std::vector &data) { std::vector::iterator it; @@ -356,180 +382,207 @@ void hybrid_observables_cc::correct_TOW_and_compute_prange(std::vector::iterator it2; - double thr_ = 250.0 / SPEED_OF_LIGHT; // Maximum pseudorange difference = 250 meters - for(it = data.begin(); it != (data.end() - 1); it++) - { - for(it2 = it + 1; it2 != data.end(); it2++) + double thr_ = 250.0 / SPEED_OF_LIGHT; // Maximum pseudorange difference = 250 meters + for (it = data.begin(); it != (data.end() - 1); it++) { - if(it->PRN == it2->PRN and it->System == it2->System) - { - double tow_dif_ = std::fabs(it->TOW_at_current_symbol_s - it2->TOW_at_current_symbol_s); - if(tow_dif_ > thr_) + for (it2 = it + 1; it2 != data.end(); it2++) { - DLOG(INFO) << "System " << it->System << ". Signals " << it->Signal << " and " << it2->Signal - << ". TOW difference in PRN " << it->PRN - << " = " << tow_dif_ * 1e3 << "[ms]. Equivalent to " << tow_dif_ * SPEED_OF_LIGHT - << " meters in pseudorange"; - std::cout << TEXT_RED << "System " << it->System << ". Signals " << it->Signal << " and " << it2->Signal - << ". TOW difference in PRN " << it->PRN - << " = " << tow_dif_ * 1e3 << "[ms]. Equivalent to " << tow_dif_ * SPEED_OF_LIGHT - << " meters in pseudorange" << TEXT_RESET << std::endl; + if (it->PRN == it2->PRN and it->System == it2->System) + { + double tow_dif_ = std::fabs(it->TOW_at_current_symbol_s - it2->TOW_at_current_symbol_s); + if (tow_dif_ > thr_) + { + DLOG(INFO) << "System " << it->System << ". Signals " << it->Signal << " and " << it2->Signal + << ". TOW difference in PRN " << it->PRN + << " = " << tow_dif_ * 1e3 << "[ms]. Equivalent to " << tow_dif_ * SPEED_OF_LIGHT + << " meters in pseudorange"; + std::cout << TEXT_RED << "System " << it->System << ". Signals " << it->Signal << " and " << it2->Signal + << ". TOW difference in PRN " << it->PRN + << " = " << tow_dif_ * 1e3 << "[ms]. Equivalent to " << tow_dif_ * SPEED_OF_LIGHT + << " meters in pseudorange" << TEXT_RESET << std::endl; + } + } } - } } - } #endif -/////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////// double TOW_ref = std::numeric_limits::lowest(); - for(it = data.begin(); it != data.end(); it++) - { - if(it->TOW_at_current_symbol_s > TOW_ref) { TOW_ref = it->TOW_at_current_symbol_s; } - } - for(it = data.begin(); it != data.end(); it++) - { - double traveltime_s = TOW_ref - it->TOW_at_current_symbol_s + GPS_STARTOFFSET_ms / 1000.0; - it->RX_time = TOW_ref + GPS_STARTOFFSET_ms / 1000.0; - it->Pseudorange_m = traveltime_s * SPEED_OF_LIGHT; - } + for (it = data.begin(); it != data.end(); it++) + { + if (it->TOW_at_current_symbol_s > TOW_ref and it->Signal[0] != '2') + { + TOW_ref = it->TOW_at_current_symbol_s; + } + } + for (it = data.begin(); it != data.end(); it++) + { + double traveltime_s = TOW_ref - it->TOW_at_current_symbol_s + GPS_STARTOFFSET_ms / 1000.0; + it->RX_time = TOW_ref + GPS_STARTOFFSET_ms / 1000.0; + it->Pseudorange_m = traveltime_s * SPEED_OF_LIGHT; + } } int hybrid_observables_cc::general_work(int noutput_items __attribute__((unused)), - gr_vector_int &ninput_items, gr_vector_const_void_star &input_items, - gr_vector_void_star &output_items) + gr_vector_int &ninput_items, gr_vector_const_void_star &input_items, + gr_vector_void_star &output_items) { - const Gnss_Synchro** in = reinterpret_cast(&input_items[0]); - Gnss_Synchro** out = reinterpret_cast(&output_items[0]); + const Gnss_Synchro **in = reinterpret_cast(&input_items[0]); + Gnss_Synchro **out = reinterpret_cast(&output_items[0]); unsigned int i; int total_input_items = 0; - for(i = 0; i < d_nchannels; i++) { total_input_items += ninput_items[i]; } + for (i = 0; i < d_nchannels; i++) + { + total_input_items += ninput_items[i]; + } consume(d_nchannels, 1); T_rx_s += T_rx_step_s; ////////////////////////////////////////////////////////////////////////// - if((total_input_items == 0) and (d_num_valid_channels == 0)) - { - return 0; - } + if ((total_input_items == 0) and (d_num_valid_channels == 0)) + { + return 0; + } ////////////////////////////////////////////////////////////////////////// std::vector>::iterator it; if (total_input_items > 0) - { - i = 0; - for(it = d_gnss_synchro_history.begin(); it != d_gnss_synchro_history.end(); it++) { - if(ninput_items[i] > 0) - { - // Add the new Gnss_Synchros to their corresponding deque - for(int aux = 0; aux < ninput_items[i]; aux++) + i = 0; + for (it = d_gnss_synchro_history.begin(); it != d_gnss_synchro_history.end(); it++) { - if(in[i][aux].Flag_valid_word) - { - it->push_back(in[i][aux]); - it->back().RX_time = compute_T_rx_s(in[i][aux]); - // Check if the last Gnss_Synchro comes from the same satellite as the previous ones - if(it->size() > 1) + if (ninput_items[i] > 0) { - if(it->front().PRN != it->back().PRN) { it->clear(); } + // Add the new Gnss_Synchros to their corresponding deque + for (int aux = 0; aux < ninput_items[i]; aux++) + { + if (in[i][aux].Flag_valid_word) + { + it->push_back(in[i][aux]); + it->back().RX_time = compute_T_rx_s(in[i][aux]); + // Check if the last Gnss_Synchro comes from the same satellite as the previous ones + if (it->size() > 1) + { + if (it->front().PRN != it->back().PRN) + { + it->clear(); + } + } + } + } + consume(i, ninput_items[i]); } - } + i++; + } + } + for (i = 0; i < d_nchannels; i++) + { + if (d_gnss_synchro_history.at(i).size() > 2) + { + valid_channels[i] = true; + } + else + { + valid_channels[i] = false; } - consume(i, ninput_items[i]); - } - i++; } - } - for(i = 0; i < d_nchannels; i++) - { - if(d_gnss_synchro_history.at(i).size() > 2) { valid_channels[i] = true; } - else { valid_channels[i] = false; } - } d_num_valid_channels = valid_channels.count(); // Check if there is any valid channel after reading the new incoming Gnss_Synchro data - if(d_num_valid_channels == 0) { return 0; } - - for(i = 0; i < d_nchannels; i++) //Discard observables with T_rx higher than the threshold - { - if(valid_channels[i]) + if (d_num_valid_channels == 0) { - clean_history(d_gnss_synchro_history.at(i)); - if(d_gnss_synchro_history.at(i).size() < 2) { valid_channels[i] = false; } + return 0; + } + + for (i = 0; i < d_nchannels; i++) //Discard observables with T_rx higher than the threshold + { + if (valid_channels[i]) + { + clean_history(d_gnss_synchro_history.at(i)); + if (d_gnss_synchro_history.at(i).size() < 2) + { + valid_channels[i] = false; + } + } } - } // Check if there is any valid channel after computing the time distance between the Gnss_Synchro data and the receiver time d_num_valid_channels = valid_channels.count(); double T_rx_s_out = T_rx_s - (max_delta / 2.0); - if((d_num_valid_channels == 0) or (T_rx_s_out < 0.0)) { return 0; } + if ((d_num_valid_channels == 0) or (T_rx_s_out < 0.0)) + { + return 0; + } std::vector epoch_data; i = 0; - for(it = d_gnss_synchro_history.begin(); it != d_gnss_synchro_history.end(); it++) - { - if(valid_channels[i]) + for (it = d_gnss_synchro_history.begin(); it != d_gnss_synchro_history.end(); it++) { - Gnss_Synchro interpolated_gnss_synchro = it->back(); - if(interpolate_data(interpolated_gnss_synchro, *it, T_rx_s_out)) - { - epoch_data.push_back(interpolated_gnss_synchro); - } - else - { - valid_channels[i] = false; - } + if (valid_channels[i]) + { + Gnss_Synchro interpolated_gnss_synchro = it->back(); + if (interpolate_data(interpolated_gnss_synchro, *it, T_rx_s_out)) + { + epoch_data.push_back(interpolated_gnss_synchro); + } + else + { + valid_channels[i] = false; + } + } + i++; } - i++; - } d_num_valid_channels = valid_channels.count(); - if(d_num_valid_channels == 0) { return 0; } + if (d_num_valid_channels == 0) + { + return 0; + } correct_TOW_and_compute_prange(epoch_data); std::vector::iterator it2 = epoch_data.begin(); - for(i = 0; i < d_nchannels; i++) - { - if(valid_channels[i]) + for (i = 0; i < d_nchannels; i++) { - out[i][0] = (*it2); - out[i][0].Flag_valid_pseudorange = true; - it2++; + if (valid_channels[i]) + { + out[i][0] = (*it2); + out[i][0].Flag_valid_pseudorange = true; + it2++; + } + else + { + out[i][0] = Gnss_Synchro(); + out[i][0].Flag_valid_pseudorange = false; + } } - else + if (d_dump) { - out[i][0] = Gnss_Synchro(); - out[i][0].Flag_valid_pseudorange = false; + // MULTIPLEXED FILE RECORDING - Record results to file + try + { + double tmp_double; + for (i = 0; i < d_nchannels; i++) + { + tmp_double = out[i][0].RX_time; + d_dump_file.write(reinterpret_cast(&tmp_double), sizeof(double)); + tmp_double = out[i][0].TOW_at_current_symbol_s; + d_dump_file.write(reinterpret_cast(&tmp_double), sizeof(double)); + tmp_double = out[i][0].Carrier_Doppler_hz; + d_dump_file.write(reinterpret_cast(&tmp_double), sizeof(double)); + tmp_double = out[i][0].Carrier_phase_rads / GPS_TWO_PI; + d_dump_file.write(reinterpret_cast(&tmp_double), sizeof(double)); + tmp_double = out[i][0].Pseudorange_m; + d_dump_file.write(reinterpret_cast(&tmp_double), sizeof(double)); + tmp_double = static_cast(out[i][0].PRN); + d_dump_file.write(reinterpret_cast(&tmp_double), sizeof(double)); + tmp_double = static_cast(out[i][0].Flag_valid_pseudorange); + d_dump_file.write(reinterpret_cast(&tmp_double), sizeof(double)); + } + } + catch (const std::ifstream::failure &e) + { + LOG(WARNING) << "Exception writing observables dump file " << e.what(); + d_dump = false; + } } - } - if(d_dump) - { - // MULTIPLEXED FILE RECORDING - Record results to file - try - { - double tmp_double; - for (i = 0; i < d_nchannels; i++) - { - tmp_double = out[i][0].RX_time; - d_dump_file.write(reinterpret_cast(&tmp_double), sizeof(double)); - tmp_double = out[i][0].TOW_at_current_symbol_s; - d_dump_file.write(reinterpret_cast(&tmp_double), sizeof(double)); - tmp_double = out[i][0].Carrier_Doppler_hz; - d_dump_file.write(reinterpret_cast(&tmp_double), sizeof(double)); - tmp_double = out[i][0].Carrier_phase_rads / GPS_TWO_PI; - d_dump_file.write(reinterpret_cast(&tmp_double), sizeof(double)); - tmp_double = out[i][0].Pseudorange_m; - d_dump_file.write(reinterpret_cast(&tmp_double), sizeof(double)); - tmp_double = static_cast(out[i][0].PRN); - d_dump_file.write(reinterpret_cast(&tmp_double), sizeof(double)); - tmp_double = static_cast(out[i][0].Flag_valid_pseudorange); - d_dump_file.write(reinterpret_cast(&tmp_double), sizeof(double)); - } - } - catch (const std::ifstream::failure& e) - { - LOG(WARNING) << "Exception writing observables dump file " << e.what(); - d_dump = false; - } - } return 1; } From ecb4a4970a9a788186fb9a1457bc0c7bdbc266da Mon Sep 17 00:00:00 2001 From: Antonio Ramos Date: Fri, 9 Mar 2018 13:05:25 +0100 Subject: [PATCH 42/61] Disable eph update when L1 + L2 --- src/algorithms/PVT/libs/rtklib_solver.cc | 17 +- src/algorithms/libs/rtklib/rtklib_pntpos.cc | 238 ++++++++++-------- src/algorithms/libs/rtklib/rtklib_rtkcmn.cc | 17 +- .../gnuradio_blocks/hybrid_observables_cc.cc | 2 +- 4 files changed, 151 insertions(+), 123 deletions(-) diff --git a/src/algorithms/PVT/libs/rtklib_solver.cc b/src/algorithms/PVT/libs/rtklib_solver.cc index f504ebfe0..65a1a0807 100644 --- a/src/algorithms/PVT/libs/rtklib_solver.cc +++ b/src/algorithms/PVT/libs/rtklib_solver.cc @@ -127,12 +127,12 @@ bool rtklib_solver::get_PVT(const std::map& gnss_observables_ int glo_valid_obs = 0; //GLONASS L1/L2 valid observations counter obsd_t obs_data[MAXOBS]; - eph_t eph_data[MAXOBS]; + eph_t eph_data[MAXOBS]; geph_t geph_data[MAXOBS]; - for(gnss_observables_iter = gnss_observables_map.cbegin(); - gnss_observables_iter != gnss_observables_map.cend(); - gnss_observables_iter++) //CHECK INCONSISTENCY when combining GLONASS + other system + for (gnss_observables_iter = gnss_observables_map.cbegin(); + gnss_observables_iter != gnss_observables_map.cend(); + gnss_observables_iter++) //CHECK INCONSISTENCY when combining GLONASS + other system { switch (gnss_observables_iter->second.System) { @@ -247,17 +247,19 @@ bool rtklib_solver::get_PVT(const std::map& gnss_observables_ { if (eph_data[i].sat == static_cast(gnss_observables_iter->second.PRN)) { - eph_data[i] = eph_to_rtklib(gps_cnav_ephemeris_iter->second); + eph_t eph_aux = eph_to_rtklib(gps_cnav_ephemeris_iter->second); + eph_data[i].tgd = eph_aux.tgd; + eph_data[i].isc = eph_aux.isc; obs_data[i + glo_valid_obs] = insert_obs_to_rtklib(obs_data[i + glo_valid_obs], gnss_observables_iter->second, - gps_cnav_ephemeris_iter->second.i_GPS_week, + eph_data[i].week, 1); //Band 2 (L2) break; } } } else - { + { /* // 3. If not found, insert the GPS L2 ephemeris and the observation //convert ephemeris from GNSS-SDR class to RTKLIB structure eph_data[valid_obs] = eph_to_rtklib(gps_cnav_ephemeris_iter->second); @@ -271,6 +273,7 @@ bool rtklib_solver::get_PVT(const std::map& gnss_observables_ gps_cnav_ephemeris_iter->second.i_GPS_week, 1); //Band 2 (L2) valid_obs++; + */ } } else // the ephemeris are not available for this SV diff --git a/src/algorithms/libs/rtklib/rtklib_pntpos.cc b/src/algorithms/libs/rtklib/rtklib_pntpos.cc index aea3dd85f..b15275214 100644 --- a/src/algorithms/libs/rtklib/rtklib_pntpos.cc +++ b/src/algorithms/libs/rtklib/rtklib_pntpos.cc @@ -125,15 +125,15 @@ double getiscl5q(int sat, const nav_t *nav) double prange(const obsd_t *obs, const nav_t *nav, const double *azel, int iter, const prcopt_t *opt, double *var) { - const double* lam = nav->lam[obs->sat - 1]; + const double *lam = nav->lam[obs->sat - 1]; double PC = 0.0; double P1 = 0.0; double P2 = 0.0; double P1_P2 = 0.0; double P1_C1 = 0.0; double P2_C2 = 0.0; - double ISCl1 = 0.0; - double ISCl2 = 0.0; + double ISCl1 = 0.0; + double ISCl2 = 0.0; double ISCl5i = 0.0; double ISCl5q = 0.0; double gamma_ = 0.0; @@ -142,52 +142,61 @@ double prange(const obsd_t *obs, const nav_t *nav, const double *azel, int sys = satsys(obs->sat, NULL); *var = 0.0; - if(sys == SYS_NONE) - { - trace(4, "prange: satsys NULL\n"); - return 0.0; - } + if (sys == SYS_NONE) + { + trace(4, "prange: satsys NULL\n"); + return 0.0; + } /* L1-L2 for GPS/GLO/QZS, L1-L5 for GAL/SBS */ - if(sys == SYS_GAL or sys == SYS_SBS) {j = 2;} - - if(sys == SYS_GPS) - { - if(obs->code[1] != CODE_NONE) {j = 1;} - else if(obs->code[2] != CODE_NONE) {j = 2;} - } - - if(lam[i] == 0.0 or lam[j] == 0.0) - { - trace(4, "prange: NFREQ<2||lam[i]==0.0||lam[j]==0.0\n"); - printf("i: %d j:%d, lam[i]: %f lam[j] %f\n", i, j, lam[i], lam[j]); - return 0.0; - } - - /* test snr mask */ - if(iter > 0) - { - if (testsnr(0, i, azel[1], obs->SNR[i] * 0.25, &opt->snrmask)) + if (sys == SYS_GAL or sys == SYS_SBS) { - trace(4, "snr mask: %s sat=%2d el=%.1f snr=%.1f\n", - time_str(obs->time, 0), obs->sat, azel[1] * R2D, obs->SNR[i] * 0.25); + j = 2; + } + + if (sys == SYS_GPS) + { + if (obs->code[1] != CODE_NONE) + { + j = 1; + } + else if (obs->code[2] != CODE_NONE) + { + j = 2; + } + } + + if (lam[i] == 0.0 or lam[j] == 0.0) + { + trace(4, "prange: NFREQ<2||lam[i]==0.0||lam[j]==0.0\n"); + printf("i: %d j:%d, lam[i]: %f lam[j] %f\n", i, j, lam[i], lam[j]); return 0.0; } - if (opt->ionoopt == IONOOPT_IFLC) + + /* test snr mask */ + if (iter > 0) { - if (testsnr(0, j, azel[1], obs->SNR[j] * 0.25, &opt->snrmask)) - { - trace(4, "prange: testsnr error\n"); - return 0.0; - } + if (testsnr(0, i, azel[1], obs->SNR[i] * 0.25, &opt->snrmask)) + { + trace(4, "snr mask: %s sat=%2d el=%.1f snr=%.1f\n", + time_str(obs->time, 0), obs->sat, azel[1] * R2D, obs->SNR[i] * 0.25); + return 0.0; + } + if (opt->ionoopt == IONOOPT_IFLC) + { + if (testsnr(0, j, azel[1], obs->SNR[j] * 0.25, &opt->snrmask)) + { + trace(4, "prange: testsnr error\n"); + return 0.0; + } + } } - } /* fL1^2 / fL2(orL5)^2 . See IS-GPS-200, p. 103 and Galileo ICD p. 48 */ - if(sys == SYS_GPS or sys == SYS_GAL) - { - gamma_ = std::pow(lam[j], 2.0) / std::pow(lam[i], 2.0); - } + if (sys == SYS_GPS or sys == SYS_GAL) + { + gamma_ = std::pow(lam[j], 2.0) / std::pow(lam[i], 2.0); + } P1 = obs->P[i]; P2 = obs->P[j]; P1_P2 = nav->cbias[obs->sat - 1][0]; @@ -196,86 +205,103 @@ double prange(const obsd_t *obs, const nav_t *nav, const double *azel, std::string d_dump_filename = "/home/aramos/dump_prange.dat"; std::ofstream d_file; - d_file.exceptions (std::ifstream::failbit | std::ifstream::badbit ); + d_file.exceptions(std::ifstream::failbit | std::ifstream::badbit); d_file.open(d_dump_filename.c_str(), std::ios::out | std::ios::binary | std::ios::app); double tmp_double = static_cast(obs->sat); - d_file.write(reinterpret_cast(&tmp_double), sizeof(double)); - d_file.write(reinterpret_cast(&P1), sizeof(double)); - d_file.write(reinterpret_cast(&P2), sizeof(double)); - d_file.write(reinterpret_cast(&P1_P2), sizeof(double)); - d_file.write(reinterpret_cast(&P1_C1), sizeof(double)); - d_file.write(reinterpret_cast(&P2_C2), sizeof(double)); + d_file.write(reinterpret_cast(&tmp_double), sizeof(double)); + d_file.write(reinterpret_cast(&P1), sizeof(double)); + d_file.write(reinterpret_cast(&P2), sizeof(double)); + d_file.write(reinterpret_cast(&P1_P2), sizeof(double)); + d_file.write(reinterpret_cast(&P1_C1), sizeof(double)); + d_file.write(reinterpret_cast(&P2_C2), sizeof(double)); /* if no P1-P2 DCB, use TGD instead */ - if(P1_P2 == 0.0) { P1_P2 = gettgd(obs->sat, nav); } + if (P1_P2 == 0.0) + { + P1_P2 = gettgd(obs->sat, nav); + } - if(sys == SYS_GPS) - { - ISCl1 = getiscl1(obs->sat, nav); - ISCl2 = getiscl2(obs->sat, nav); - ISCl5i = getiscl5i(obs->sat, nav); - ISCl5q = getiscl5q(obs->sat, nav); - d_file.write(reinterpret_cast(&ISCl1), sizeof(double)); - d_file.write(reinterpret_cast(&ISCl2), sizeof(double)); - d_file.write(reinterpret_cast(&ISCl5i), sizeof(double)); - d_file.write(reinterpret_cast(&ISCl5q), sizeof(double)); - } - d_file.write(reinterpret_cast(&P1_P2), sizeof(double)); + if (sys == SYS_GPS) + { + ISCl1 = getiscl1(obs->sat, nav); + ISCl2 = getiscl2(obs->sat, nav); + ISCl5i = getiscl5i(obs->sat, nav); + ISCl5q = getiscl5q(obs->sat, nav); + d_file.write(reinterpret_cast(&ISCl1), sizeof(double)); + d_file.write(reinterpret_cast(&ISCl2), sizeof(double)); + d_file.write(reinterpret_cast(&ISCl5i), sizeof(double)); + d_file.write(reinterpret_cast(&ISCl5q), sizeof(double)); + } + d_file.write(reinterpret_cast(&P1_P2), sizeof(double)); //CHECK IF IT IS STILL NEEDED - if(opt->ionoopt == IONOOPT_IFLC) - { /* dual-frequency */ + if (opt->ionoopt == IONOOPT_IFLC) + { /* dual-frequency */ - if (P1 == 0.0 || P2 == 0.0) { return 0.0; } - if (obs->code[i] == CODE_L1C) { P1 += P1_C1; } /* C1->P1 */ - if (obs->code[j] == CODE_L2C) { P2 += P2_C2; } /* C2->P2 */ + if (P1 == 0.0 || P2 == 0.0) + { + return 0.0; + } + if (obs->code[i] == CODE_L1C) + { + P1 += P1_C1; + } /* C1->P1 */ + if (obs->code[j] == CODE_L2C) + { + P2 += P2_C2; + } /* C2->P2 */ - /* iono-free combination */ - PC = (gamma_ * P1 - P2) / (gamma_ - 1.0); - } + /* iono-free combination */ + PC = (gamma_ * P1 - P2) / (gamma_ - 1.0); + } //////////////////////////////////////////// else - { /* single-frequency */ - if(obs->code[i] == CODE_NONE and obs->code[j] == CODE_NONE) { return 0.0; } + { /* single-frequency */ + if (obs->code[i] == CODE_NONE and obs->code[j] == CODE_NONE) + { + return 0.0; + } - else if(obs->code[i] != CODE_NONE and obs->code[j] == CODE_NONE) - {//CHECK!! - P1 += P1_C1; /* C1->P1 */ - PC = P1 + P1_P2; + else if (obs->code[i] != CODE_NONE and obs->code[j] == CODE_NONE) + { //CHECK!! + P1 += P1_C1; /* C1->P1 */ + PC = P1 + P1_P2; + } + else if (obs->code[i] == CODE_NONE and obs->code[j] != CODE_NONE) + { + if (sys == SYS_GPS) + { //CHECK!! + P2 += P2_C2; /* C2->P2 */ + //PC = P2 - gamma_ * P1_P2 / (1.0 - gamma_); + PC = P2 + P1_P2 - ISCl2; + } + else if (sys == SYS_GAL) + { + //TODO + } + } + /* dual-frequency */ + else if (sys == SYS_GPS) + { + if (obs->code[j] == CODE_L2S) /* L1 + L2 */ + { + PC = (P2 + ISCl2 - gamma_ * (P1 + ISCl1)) / (1.0 - gamma_) - P1_P2; + } + if (obs->code[j] == CODE_L5X) /* L1 + L5 */ + { + } + } + else if (sys == SYS_GAL) /* E1 + E5a */ + { + //TODO + } } - else if(obs->code[i] == CODE_NONE and obs->code[j] != CODE_NONE) - { - if(sys == SYS_GPS) - {//CHECK!! - P2 += P2_C2; /* C2->P2 */ - //PC = P2 - gamma_ * P1_P2 / (1.0 - gamma_); - PC = P2 + P1_P2 - ISCl2; - } - else if(sys == SYS_GAL) - { - //TODO - } - } - /* dual-frequency */ - else if(sys == SYS_GPS) - { - if(obs->code[j] == CODE_L2S) /* L1 + L2 */ - { - PC = (P2 + ISCl2 - gamma_ * (P1 + ISCl1)) / (1.0 - gamma_) - P1_P2; - } - if(obs->code[j] == CODE_L5X) /* L1 + L5 */ - { - - } - } - else if(sys == SYS_GAL) /* E1 + E5a */ - { - //TODO - } - } - d_file.write(reinterpret_cast(&PC), sizeof(double)); + d_file.write(reinterpret_cast(&PC), sizeof(double)); d_file.close(); - if(opt->sateph == EPHOPT_SBAS) { PC -= P1_C1; } /* sbas clock based C1 */ + if (opt->sateph == EPHOPT_SBAS) + { + PC -= P1_C1; + } /* sbas clock based C1 */ *var = std::pow(ERR_CBIAS, 2.0); return PC; } diff --git a/src/algorithms/libs/rtklib/rtklib_rtkcmn.cc b/src/algorithms/libs/rtklib/rtklib_rtkcmn.cc index 3456916b5..92c1c51fd 100644 --- a/src/algorithms/libs/rtklib/rtklib_rtkcmn.cc +++ b/src/algorithms/libs/rtklib/rtklib_rtkcmn.cc @@ -253,12 +253,11 @@ const unsigned int tbl_CRC24Q[] = { 0x42FA2F, 0xC4B6D4, 0xC82F22, 0x4E63D9, 0xD11CCE, 0x575035, 0x5BC9C3, 0xDD8538}; -extern "C" -{ - void dgemm_(char *, char *, int *, int *, int *, double *, double *, int *, double *, int *, double *, double *, int *); - extern void dgetrf_(int *, int *, double *, int *, int *, int *); - extern void dgetri_(int *, double *, int *, int *, double *, int *, int *); - extern void dgetrs_(char *, int *, int *, double *, int *, int *, double *, int *, int *); +extern "C" { +void dgemm_(char *, char *, int *, int *, int *, double *, double *, int *, double *, int *, double *, double *, int *); +extern void dgetrf_(int *, int *, double *, int *, int *, int *); +extern void dgetri_(int *, double *, int *, int *, double *, int *, int *); +extern void dgetrs_(char *, int *, int *, double *, int *, int *, double *, int *, int *); } @@ -1388,10 +1387,10 @@ double time2gpst(gtime_t t, int *week) { gtime_t t0 = epoch2time(gpst0); time_t sec = t.time - t0.time; - int w = (int)(sec / (86400 * 7)); + int w = static_cast(sec / 604800); if (week) *week = w; - return (double)(sec - (double)w * 86400 * 7) + t.sec; + return (static_cast(sec - static_cast(w * 604800)) + t.sec); } @@ -2993,7 +2992,7 @@ int readnav(const char *file, nav_t *nav) { FILE *fp; eph_t eph0 = {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, 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}; geph_t geph0 = {0, 0, 0, 0, 0, 0, {0, 0}, {0, 0}, {}, {}, {}, 0.0, 0.0, 0.0}; char buff[4096], *p; long toe_time, tof_time, toc_time, ttr_time; diff --git a/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc b/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc index 20e5c6948..81daa31ca 100644 --- a/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc +++ b/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc @@ -410,7 +410,7 @@ void hybrid_observables_cc::correct_TOW_and_compute_prange(std::vector::lowest(); for (it = data.begin(); it != data.end(); it++) { - if (it->TOW_at_current_symbol_s > TOW_ref and it->Signal[0] != '2') + if (it->TOW_at_current_symbol_s > TOW_ref) { TOW_ref = it->TOW_at_current_symbol_s; } From 0057e609241bd21740ba3a3de2bb5ef20209843a Mon Sep 17 00:00:00 2001 From: Antonio Ramos Date: Mon, 12 Mar 2018 10:51:06 +0100 Subject: [PATCH 43/61] Clean code --- src/algorithms/PVT/libs/rtklib_solver.cc | 12 +- src/algorithms/libs/rtklib/rtklib_pntpos.cc | 47 ++-- .../system_parameters/gps_cnav_ephemeris.h | 43 ++-- .../gps_cnav_navigation_message.cc | 240 +++++++++--------- 4 files changed, 175 insertions(+), 167 deletions(-) diff --git a/src/algorithms/PVT/libs/rtklib_solver.cc b/src/algorithms/PVT/libs/rtklib_solver.cc index 65a1a0807..eaed5f5ec 100644 --- a/src/algorithms/PVT/libs/rtklib_solver.cc +++ b/src/algorithms/PVT/libs/rtklib_solver.cc @@ -247,19 +247,19 @@ bool rtklib_solver::get_PVT(const std::map& gnss_observables_ { if (eph_data[i].sat == static_cast(gnss_observables_iter->second.PRN)) { - eph_t eph_aux = eph_to_rtklib(gps_cnav_ephemeris_iter->second); - eph_data[i].tgd = eph_aux.tgd; - eph_data[i].isc = eph_aux.isc; + eph_data[i] = eph_to_rtklib(gps_cnav_ephemeris_iter->second); + /* By the moment, GPS L2 observables are not used in pseudorange computations obs_data[i + glo_valid_obs] = insert_obs_to_rtklib(obs_data[i + glo_valid_obs], gnss_observables_iter->second, eph_data[i].week, - 1); //Band 2 (L2) + 1); //Band 2 (L2) */ break; } } } else - { /* + { + /* By the moment, GPS L2 observables are not used in pseudorange computations // 3. If not found, insert the GPS L2 ephemeris and the observation //convert ephemeris from GNSS-SDR class to RTKLIB structure eph_data[valid_obs] = eph_to_rtklib(gps_cnav_ephemeris_iter->second); @@ -273,7 +273,7 @@ bool rtklib_solver::get_PVT(const std::map& gnss_observables_ gps_cnav_ephemeris_iter->second.i_GPS_week, 1); //Band 2 (L2) valid_obs++; - */ + */ } } else // the ephemeris are not available for this SV diff --git a/src/algorithms/libs/rtklib/rtklib_pntpos.cc b/src/algorithms/libs/rtklib/rtklib_pntpos.cc index b15275214..434f3b03a 100644 --- a/src/algorithms/libs/rtklib/rtklib_pntpos.cc +++ b/src/algorithms/libs/rtklib/rtklib_pntpos.cc @@ -54,8 +54,6 @@ #include "rtklib_ephemeris.h" #include "rtklib_ionex.h" #include "rtklib_sbas.h" -#include -#include /* pseudorange measurement error variance ------------------------------------*/ double varerr(const prcopt_t *opt, double el, int sys) @@ -132,6 +130,7 @@ double prange(const obsd_t *obs, const nav_t *nav, const double *azel, double P1_P2 = 0.0; double P1_C1 = 0.0; double P2_C2 = 0.0; + //Intersignal corrections (m). See GPS IS-200 CNAV message double ISCl1 = 0.0; double ISCl2 = 0.0; double ISCl5i = 0.0; @@ -154,8 +153,7 @@ double prange(const obsd_t *obs, const nav_t *nav, const double *azel, { j = 2; } - - if (sys == SYS_GPS) + else if (sys == SYS_GPS or sys == SYS_GLO) { if (obs->code[1] != CODE_NONE) { @@ -203,18 +201,6 @@ double prange(const obsd_t *obs, const nav_t *nav, const double *azel, P1_C1 = nav->cbias[obs->sat - 1][1]; P2_C2 = nav->cbias[obs->sat - 1][2]; - std::string d_dump_filename = "/home/aramos/dump_prange.dat"; - std::ofstream d_file; - d_file.exceptions(std::ifstream::failbit | std::ifstream::badbit); - d_file.open(d_dump_filename.c_str(), std::ios::out | std::ios::binary | std::ios::app); - double tmp_double = static_cast(obs->sat); - d_file.write(reinterpret_cast(&tmp_double), sizeof(double)); - d_file.write(reinterpret_cast(&P1), sizeof(double)); - d_file.write(reinterpret_cast(&P2), sizeof(double)); - d_file.write(reinterpret_cast(&P1_P2), sizeof(double)); - d_file.write(reinterpret_cast(&P1_C1), sizeof(double)); - d_file.write(reinterpret_cast(&P2_C2), sizeof(double)); - /* if no P1-P2 DCB, use TGD instead */ if (P1_P2 == 0.0) { @@ -227,12 +213,7 @@ double prange(const obsd_t *obs, const nav_t *nav, const double *azel, ISCl2 = getiscl2(obs->sat, nav); ISCl5i = getiscl5i(obs->sat, nav); ISCl5q = getiscl5q(obs->sat, nav); - d_file.write(reinterpret_cast(&ISCl1), sizeof(double)); - d_file.write(reinterpret_cast(&ISCl2), sizeof(double)); - d_file.write(reinterpret_cast(&ISCl5i), sizeof(double)); - d_file.write(reinterpret_cast(&ISCl5q), sizeof(double)); } - d_file.write(reinterpret_cast(&P1_P2), sizeof(double)); //CHECK IF IT IS STILL NEEDED if (opt->ionoopt == IONOOPT_IFLC) @@ -263,19 +244,26 @@ double prange(const obsd_t *obs, const nav_t *nav, const double *azel, } else if (obs->code[i] != CODE_NONE and obs->code[j] == CODE_NONE) - { //CHECK!! + { P1 += P1_C1; /* C1->P1 */ PC = P1 + P1_P2; } else if (obs->code[i] == CODE_NONE and obs->code[j] != CODE_NONE) { if (sys == SYS_GPS) - { //CHECK!! + { P2 += P2_C2; /* C2->P2 */ //PC = P2 - gamma_ * P1_P2 / (1.0 - gamma_); - PC = P2 + P1_P2 - ISCl2; + if (obs->code[j] == CODE_L2S) //L2 single freq. + { + PC = P2 + P1_P2 - ISCl2; + } + else if (obs->code[j] == CODE_L5X) //L5 single freq. + { + PC = P2 + P1_P2 - ISCl5i; + } } - else if (sys == SYS_GAL) + else if (sys == SYS_GAL) // Gal. E5a single freq. { //TODO } @@ -285,9 +273,12 @@ double prange(const obsd_t *obs, const nav_t *nav, const double *azel, { if (obs->code[j] == CODE_L2S) /* L1 + L2 */ { - PC = (P2 + ISCl2 - gamma_ * (P1 + ISCl1)) / (1.0 - gamma_) - P1_P2; + //By the moment, GPS L2 pseudoranges are not used + //PC = (P2 + ISCl2 - gamma_ * (P1 + ISCl1)) / (1.0 - gamma_) - P1_P2; + P1 += P1_C1; /* C1->P1 */ + PC = P1 + P1_P2; } - if (obs->code[j] == CODE_L5X) /* L1 + L5 */ + else if (obs->code[j] == CODE_L5X) /* L1 + L5 */ { } } @@ -296,8 +287,6 @@ double prange(const obsd_t *obs, const nav_t *nav, const double *azel, //TODO } } - d_file.write(reinterpret_cast(&PC), sizeof(double)); - d_file.close(); if (opt->sateph == EPHOPT_SBAS) { PC -= P1_C1; diff --git a/src/core/system_parameters/gps_cnav_ephemeris.h b/src/core/system_parameters/gps_cnav_ephemeris.h index d10c2d8c6..7b63c0857 100644 --- a/src/core/system_parameters/gps_cnav_ephemeris.h +++ b/src/core/system_parameters/gps_cnav_ephemeris.h @@ -138,25 +138,30 @@ public: { }; - archive& make_nvp("i_satellite_PRN", i_satellite_PRN); // SV PRN NUMBER - archive& make_nvp("d_TOW", d_TOW); //!< Time of GPS Week of the ephemeris set (taken from subframes TOW) [s] - archive& make_nvp("d_Crs", d_Crs); //!< Amplitude of the Sine Harmonic Correction Term to the Orbit Radius [m] - archive& make_nvp("d_M_0", d_M_0); //!< Mean Anomaly at Reference Time [semi-circles] - archive& make_nvp("d_Cuc", d_Cuc); //!< Amplitude of the Cosine Harmonic Correction Term to the Argument of Latitude [rad] - archive& make_nvp("d_e_eccentricity", d_e_eccentricity); //!< Eccentricity [dimensionless] - archive& make_nvp("d_Cus", d_Cus); //!< Amplitude of the Sine Harmonic Correction Term to the Argument of Latitude [rad] - archive& make_nvp("d_Toe1", d_Toe1); //!< Ephemeris data reference time of week (Ref. 20.3.3.4.3 IS-GPS-200E) [s] - archive& make_nvp("d_Toe2", d_Toe2); //!< Ephemeris data reference time of week (Ref. 20.3.3.4.3 IS-GPS-200E) [s] - archive& make_nvp("d_Toc", d_Toc); //!< clock data reference time (Ref. 20.3.3.3.3.1 IS-GPS-200E) [s] - archive& make_nvp("d_Cic", d_Cic); //!< Amplitude of the Cosine Harmonic Correction Term to the Angle of Inclination [rad] - archive& make_nvp("d_OMEGA0", d_OMEGA0); //!< Longitude of Ascending Node of Orbit Plane at Weekly Epoch [semi-circles] - archive& make_nvp("d_Cis", d_Cis); //!< Amplitude of the Sine Harmonic Correction Term to the Angle of Inclination [rad] - archive& make_nvp("d_i_0", d_i_0); //!< Inclination Angle at Reference Time [semi-circles] - archive& make_nvp("d_Crc", d_Crc); //!< Amplitude of the Cosine Harmonic Correction Term to the Orbit Radius [m] - archive& make_nvp("d_OMEGA", d_OMEGA); //!< Argument of Perigee [semi-cicles] - archive& make_nvp("d_IDOT", d_IDOT); //!< Rate of Inclination Angle [semi-circles/s] - archive& make_nvp("i_GPS_week", i_GPS_week); //!< GPS week number, aka WN [week] - archive& make_nvp("d_TGD", d_TGD); //!< Estimated Group Delay Differential: L1-L2 correction term only for the benefit of "L1 P(Y)" or "L2 P(Y)" s users [s] + archive& make_nvp("i_satellite_PRN", i_satellite_PRN); // SV PRN NUMBER + archive& make_nvp("d_TOW", d_TOW); //!< Time of GPS Week of the ephemeris set (taken from subframes TOW) [s] + archive& make_nvp("d_Crs", d_Crs); //!< Amplitude of the Sine Harmonic Correction Term to the Orbit Radius [m] + archive& make_nvp("d_M_0", d_M_0); //!< Mean Anomaly at Reference Time [semi-circles] + archive& make_nvp("d_Cuc", d_Cuc); //!< Amplitude of the Cosine Harmonic Correction Term to the Argument of Latitude [rad] + archive& make_nvp("d_e_eccentricity", d_e_eccentricity); //!< Eccentricity [dimensionless] + archive& make_nvp("d_Cus", d_Cus); //!< Amplitude of the Sine Harmonic Correction Term to the Argument of Latitude [rad] + archive& make_nvp("d_Toe1", d_Toe1); //!< Ephemeris data reference time of week (Ref. 20.3.3.4.3 IS-GPS-200E) [s] + archive& make_nvp("d_Toe2", d_Toe2); //!< Ephemeris data reference time of week (Ref. 20.3.3.4.3 IS-GPS-200E) [s] + archive& make_nvp("d_Toc", d_Toc); //!< clock data reference time (Ref. 20.3.3.3.3.1 IS-GPS-200E) [s] + archive& make_nvp("d_Cic", d_Cic); //!< Amplitude of the Cosine Harmonic Correction Term to the Angle of Inclination [rad] + archive& make_nvp("d_OMEGA0", d_OMEGA0); //!< Longitude of Ascending Node of Orbit Plane at Weekly Epoch [semi-circles] + archive& make_nvp("d_Cis", d_Cis); //!< Amplitude of the Sine Harmonic Correction Term to the Angle of Inclination [rad] + archive& make_nvp("d_i_0", d_i_0); //!< Inclination Angle at Reference Time [semi-circles] + archive& make_nvp("d_Crc", d_Crc); //!< Amplitude of the Cosine Harmonic Correction Term to the Orbit Radius [m] + archive& make_nvp("d_OMEGA", d_OMEGA); //!< Argument of Perigee [semi-cicles] + archive& make_nvp("d_IDOT", d_IDOT); //!< Rate of Inclination Angle [semi-circles/s] + archive& make_nvp("i_GPS_week", i_GPS_week); //!< GPS week number, aka WN [week] + archive& make_nvp("d_TGD", d_TGD); //!< Estimated Group Delay Differential: L1-L2 correction term only for the benefit of "L1 P(Y)" or "L2 P(Y)" s users [s] + archive& make_nvp("d_ISCL1", d_ISCL1); //!< Estimated Group Delay Differential: L1P(Y)-L1C/A correction term only for the benefit of "L1 P(Y)" or "L2 P(Y)" s users [s] + archive& make_nvp("d_ISCL2", d_ISCL2); //!< Estimated Group Delay Differential: L1P(Y)-L2C correction term only for the benefit of "L1 P(Y)" or "L2 P(Y)" s users [s] + archive& make_nvp("d_ISCL5I", d_ISCL5I); //!< Estimated Group Delay Differential: L1P(Y)-L5i correction term only for the benefit of "L1 P(Y)" or "L2 P(Y)" s users [s] + archive& make_nvp("d_ISCL5Q", d_ISCL5Q); //!< Estimated Group Delay Differential: L1P(Y)-L5q correction term only for the benefit of "L1 P(Y)" or "L2 P(Y)" s users [s] + archive& make_nvp("d_DELTA_A", d_DELTA_A); //!< Semi-major axis difference at reference time [m] archive& make_nvp("d_A_DOT", d_A_DOT); //!< Change rate in semi-major axis [m/s] archive& make_nvp("d_DELTA_OMEGA_DOT", d_DELTA_OMEGA_DOT); //!< Rate of Right Ascension difference [semi-circles/s] diff --git a/src/core/system_parameters/gps_cnav_navigation_message.cc b/src/core/system_parameters/gps_cnav_navigation_message.cc index 0f2455e51..d188060bd 100644 --- a/src/core/system_parameters/gps_cnav_navigation_message.cc +++ b/src/core/system_parameters/gps_cnav_navigation_message.cc @@ -187,127 +187,141 @@ void Gps_CNAV_Navigation_Message::decode_page(std::bitset(read_navigation_unsigned(data_bits, CNAV_MSG_TYPE)); - switch(page_type) - { - case 10: // Ephemeris 1/2 - ephemeris_record.i_GPS_week = static_cast(read_navigation_unsigned(data_bits, CNAV_WN)); - ephemeris_record.i_signal_health = static_cast(read_navigation_unsigned(data_bits, CNAV_HEALTH)); - ephemeris_record.d_Top = static_cast(read_navigation_unsigned(data_bits, CNAV_TOP1)); - ephemeris_record.d_Top *= CNAV_TOP1_LSB; - ephemeris_record.d_URA0 = static_cast(read_navigation_signed(data_bits, CNAV_URA)); - ephemeris_record.d_Toe1 = static_cast(read_navigation_unsigned(data_bits, CNAV_TOE1)); - ephemeris_record.d_Toe1 *= CNAV_TOE1_LSB; - ephemeris_record.d_DELTA_A = static_cast(read_navigation_signed(data_bits, CNAV_DELTA_A)); - ephemeris_record.d_DELTA_A *= CNAV_DELTA_A_LSB; - ephemeris_record.d_A_DOT = static_cast(read_navigation_signed(data_bits, CNAV_A_DOT)); - ephemeris_record.d_A_DOT *= CNAV_A_DOT_LSB; - ephemeris_record.d_Delta_n = static_cast(read_navigation_signed(data_bits, CNAV_DELTA_N0)); - ephemeris_record.d_Delta_n *= CNAV_DELTA_N0_LSB; - ephemeris_record.d_DELTA_DOT_N = static_cast(read_navigation_signed(data_bits, CNAV_DELTA_N0_DOT)); - ephemeris_record.d_DELTA_DOT_N *= CNAV_DELTA_N0_DOT_LSB; - ephemeris_record.d_M_0 = static_cast(read_navigation_signed(data_bits, CNAV_M0)); - ephemeris_record.d_M_0 *= CNAV_M0_LSB; - ephemeris_record.d_e_eccentricity = static_cast(read_navigation_unsigned(data_bits, CNAV_E_ECCENTRICITY)); - ephemeris_record.d_e_eccentricity *= CNAV_E_ECCENTRICITY_LSB; - ephemeris_record.d_OMEGA = static_cast(read_navigation_signed(data_bits, CNAV_OMEGA)); - ephemeris_record.d_OMEGA *= CNAV_OMEGA_LSB; + switch (page_type) + { + case 10: // Ephemeris 1/2 + ephemeris_record.i_GPS_week = static_cast(read_navigation_unsigned(data_bits, CNAV_WN)); + ephemeris_record.i_signal_health = static_cast(read_navigation_unsigned(data_bits, CNAV_HEALTH)); + ephemeris_record.d_Top = static_cast(read_navigation_unsigned(data_bits, CNAV_TOP1)); + ephemeris_record.d_Top *= CNAV_TOP1_LSB; + ephemeris_record.d_URA0 = static_cast(read_navigation_signed(data_bits, CNAV_URA)); + ephemeris_record.d_Toe1 = static_cast(read_navigation_unsigned(data_bits, CNAV_TOE1)); + ephemeris_record.d_Toe1 *= CNAV_TOE1_LSB; + ephemeris_record.d_DELTA_A = static_cast(read_navigation_signed(data_bits, CNAV_DELTA_A)); + ephemeris_record.d_DELTA_A *= CNAV_DELTA_A_LSB; + ephemeris_record.d_A_DOT = static_cast(read_navigation_signed(data_bits, CNAV_A_DOT)); + ephemeris_record.d_A_DOT *= CNAV_A_DOT_LSB; + ephemeris_record.d_Delta_n = static_cast(read_navigation_signed(data_bits, CNAV_DELTA_N0)); + ephemeris_record.d_Delta_n *= CNAV_DELTA_N0_LSB; + ephemeris_record.d_DELTA_DOT_N = static_cast(read_navigation_signed(data_bits, CNAV_DELTA_N0_DOT)); + ephemeris_record.d_DELTA_DOT_N *= CNAV_DELTA_N0_DOT_LSB; + ephemeris_record.d_M_0 = static_cast(read_navigation_signed(data_bits, CNAV_M0)); + ephemeris_record.d_M_0 *= CNAV_M0_LSB; + ephemeris_record.d_e_eccentricity = static_cast(read_navigation_unsigned(data_bits, CNAV_E_ECCENTRICITY)); + ephemeris_record.d_e_eccentricity *= CNAV_E_ECCENTRICITY_LSB; + ephemeris_record.d_OMEGA = static_cast(read_navigation_signed(data_bits, CNAV_OMEGA)); + ephemeris_record.d_OMEGA *= CNAV_OMEGA_LSB; ephemeris_record.b_integrity_status_flag = static_cast(read_navigation_bool(data_bits, CNAV_INTEGRITY_FLAG)); ephemeris_record.b_l2c_phasing_flag = static_cast(read_navigation_bool(data_bits, CNAV_L2_PHASING_FLAG)); - b_flag_ephemeris_1 = true; - break; - case 11: // Ephemeris 2/2 - ephemeris_record.d_Toe2 = static_cast(read_navigation_unsigned(data_bits, CNAV_TOE2)); - ephemeris_record.d_Toe2 *= CNAV_TOE2_LSB; - ephemeris_record.d_OMEGA0 = static_cast(read_navigation_signed(data_bits, CNAV_OMEGA0)); - ephemeris_record.d_OMEGA0 *= CNAV_OMEGA0_LSB; - ephemeris_record.d_DELTA_OMEGA_DOT = static_cast(read_navigation_signed(data_bits, CNAV_DELTA_OMEGA_DOT)); - ephemeris_record.d_DELTA_OMEGA_DOT *= CNAV_DELTA_OMEGA_DOT_LSB; - ephemeris_record.d_i_0 = static_cast(read_navigation_signed(data_bits, CNAV_I0)); - ephemeris_record.d_i_0 *= CNAV_I0_LSB; - ephemeris_record.d_IDOT = static_cast(read_navigation_signed(data_bits, CNAV_I0_DOT)); - ephemeris_record.d_IDOT *= CNAV_I0_DOT_LSB; - ephemeris_record.d_Cis = static_cast(read_navigation_signed(data_bits, CNAV_CIS)); - ephemeris_record.d_Cis *= CNAV_CIS_LSB; - ephemeris_record.d_Cic = static_cast(read_navigation_signed(data_bits, CNAV_CIC)); - ephemeris_record.d_Cic *= CNAV_CIC_LSB; - ephemeris_record.d_Crs = static_cast(read_navigation_signed(data_bits, CNAV_CRS)); - ephemeris_record.d_Crs *= CNAV_CRS_LSB; - ephemeris_record.d_Crc = static_cast(read_navigation_signed(data_bits, CNAV_CRC)); - ephemeris_record.d_Crc *= CNAV_CRC_LSB; - ephemeris_record.d_Cus = static_cast(read_navigation_signed(data_bits, CNAV_CUS)); - ephemeris_record.d_Cus *= CNAV_CUS_LSB; - ephemeris_record.d_Cuc = static_cast(read_navigation_signed(data_bits, CNAV_CUC)); - ephemeris_record.d_Cuc *= CNAV_CUC_LSB; - b_flag_ephemeris_2 = true; - break; - case 30: // (CLOCK, IONO, GRUP DELAY) - //clock - ephemeris_record.d_Toc = static_cast(read_navigation_unsigned(data_bits, CNAV_TOC)); - ephemeris_record.d_Toc *= CNAV_TOC_LSB; - ephemeris_record.d_URA0 = static_cast(read_navigation_signed(data_bits, CNAV_URA_NED0)); - ephemeris_record.d_URA1 = static_cast(read_navigation_unsigned(data_bits, CNAV_URA_NED1)); - ephemeris_record.d_URA2 = static_cast(read_navigation_unsigned(data_bits, CNAV_URA_NED2)); - ephemeris_record.d_A_f0 = static_cast(read_navigation_signed(data_bits, CNAV_AF0)); - ephemeris_record.d_A_f0 *= CNAV_AF0_LSB; - ephemeris_record.d_A_f1 = static_cast(read_navigation_signed(data_bits, CNAV_AF1)); - ephemeris_record.d_A_f1 *= CNAV_AF1_LSB; - ephemeris_record.d_A_f2 = static_cast(read_navigation_signed(data_bits, CNAV_AF2)); - ephemeris_record.d_A_f2 *= CNAV_AF2_LSB; - //group delays - //Check if the grup delay values are not available. See IS-GPS-200, Table 30-IV. - //Bit string "1000000000000" is -4096 in 2 complement - ephemeris_record.d_TGD = static_cast(read_navigation_signed(data_bits, CNAV_TGD)); - if(ephemeris_record.d_TGD < -4095.9) { ephemeris_record.d_TGD = 0.0; } - ephemeris_record.d_TGD *= CNAV_TGD_LSB; + b_flag_ephemeris_1 = true; + break; + case 11: // Ephemeris 2/2 + ephemeris_record.d_Toe2 = static_cast(read_navigation_unsigned(data_bits, CNAV_TOE2)); + ephemeris_record.d_Toe2 *= CNAV_TOE2_LSB; + ephemeris_record.d_OMEGA0 = static_cast(read_navigation_signed(data_bits, CNAV_OMEGA0)); + ephemeris_record.d_OMEGA0 *= CNAV_OMEGA0_LSB; + ephemeris_record.d_DELTA_OMEGA_DOT = static_cast(read_navigation_signed(data_bits, CNAV_DELTA_OMEGA_DOT)); + ephemeris_record.d_DELTA_OMEGA_DOT *= CNAV_DELTA_OMEGA_DOT_LSB; + ephemeris_record.d_i_0 = static_cast(read_navigation_signed(data_bits, CNAV_I0)); + ephemeris_record.d_i_0 *= CNAV_I0_LSB; + ephemeris_record.d_IDOT = static_cast(read_navigation_signed(data_bits, CNAV_I0_DOT)); + ephemeris_record.d_IDOT *= CNAV_I0_DOT_LSB; + ephemeris_record.d_Cis = static_cast(read_navigation_signed(data_bits, CNAV_CIS)); + ephemeris_record.d_Cis *= CNAV_CIS_LSB; + ephemeris_record.d_Cic = static_cast(read_navigation_signed(data_bits, CNAV_CIC)); + ephemeris_record.d_Cic *= CNAV_CIC_LSB; + ephemeris_record.d_Crs = static_cast(read_navigation_signed(data_bits, CNAV_CRS)); + ephemeris_record.d_Crs *= CNAV_CRS_LSB; + ephemeris_record.d_Crc = static_cast(read_navigation_signed(data_bits, CNAV_CRC)); + ephemeris_record.d_Crc *= CNAV_CRC_LSB; + ephemeris_record.d_Cus = static_cast(read_navigation_signed(data_bits, CNAV_CUS)); + ephemeris_record.d_Cus *= CNAV_CUS_LSB; + ephemeris_record.d_Cuc = static_cast(read_navigation_signed(data_bits, CNAV_CUC)); + ephemeris_record.d_Cuc *= CNAV_CUC_LSB; + b_flag_ephemeris_2 = true; + break; + case 30: // (CLOCK, IONO, GRUP DELAY) + //clock + ephemeris_record.d_Toc = static_cast(read_navigation_unsigned(data_bits, CNAV_TOC)); + ephemeris_record.d_Toc *= CNAV_TOC_LSB; + ephemeris_record.d_URA0 = static_cast(read_navigation_signed(data_bits, CNAV_URA_NED0)); + ephemeris_record.d_URA1 = static_cast(read_navigation_unsigned(data_bits, CNAV_URA_NED1)); + ephemeris_record.d_URA2 = static_cast(read_navigation_unsigned(data_bits, CNAV_URA_NED2)); + ephemeris_record.d_A_f0 = static_cast(read_navigation_signed(data_bits, CNAV_AF0)); + ephemeris_record.d_A_f0 *= CNAV_AF0_LSB; + ephemeris_record.d_A_f1 = static_cast(read_navigation_signed(data_bits, CNAV_AF1)); + ephemeris_record.d_A_f1 *= CNAV_AF1_LSB; + ephemeris_record.d_A_f2 = static_cast(read_navigation_signed(data_bits, CNAV_AF2)); + ephemeris_record.d_A_f2 *= CNAV_AF2_LSB; + //group delays + //Check if the grup delay values are not available. See IS-GPS-200, Table 30-IV. + //Bit string "1000000000000" is -4096 in 2 complement + ephemeris_record.d_TGD = static_cast(read_navigation_signed(data_bits, CNAV_TGD)); + if (ephemeris_record.d_TGD < -4095.9) + { + ephemeris_record.d_TGD = 0.0; + } + ephemeris_record.d_TGD *= CNAV_TGD_LSB; - ephemeris_record.d_ISCL1 = static_cast(read_navigation_signed(data_bits, CNAV_ISCL1)); - if(ephemeris_record.d_ISCL1 < -4095.9) { ephemeris_record.d_ISCL1 = 0.0; } - ephemeris_record.d_ISCL1 *= CNAV_ISCL1_LSB; + ephemeris_record.d_ISCL1 = static_cast(read_navigation_signed(data_bits, CNAV_ISCL1)); + if (ephemeris_record.d_ISCL1 < -4095.9) + { + ephemeris_record.d_ISCL1 = 0.0; + } + ephemeris_record.d_ISCL1 *= CNAV_ISCL1_LSB; - ephemeris_record.d_ISCL2 = static_cast(read_navigation_signed(data_bits, CNAV_ISCL2)); - if(ephemeris_record.d_ISCL2 < -4095.9) { ephemeris_record.d_ISCL2 = 0.0; } - ephemeris_record.d_ISCL2 *= CNAV_ISCL2_LSB; + ephemeris_record.d_ISCL2 = static_cast(read_navigation_signed(data_bits, CNAV_ISCL2)); + if (ephemeris_record.d_ISCL2 < -4095.9) + { + ephemeris_record.d_ISCL2 = 0.0; + } + ephemeris_record.d_ISCL2 *= CNAV_ISCL2_LSB; - ephemeris_record.d_ISCL5I = static_cast(read_navigation_signed(data_bits, CNAV_ISCL5I)); - if(ephemeris_record.d_ISCL5I < -4095.9) { ephemeris_record.d_ISCL5I = 0.0; } - ephemeris_record.d_ISCL5I *= CNAV_ISCL5I_LSB; - - ephemeris_record.d_ISCL5Q = static_cast(read_navigation_signed(data_bits, CNAV_ISCL5Q)); - if(ephemeris_record.d_ISCL5Q < -4095.9) { ephemeris_record.d_ISCL5Q = 0.0; } - ephemeris_record.d_ISCL5Q *= CNAV_ISCL5Q_LSB; - //iono - iono_record.d_alpha0 = static_cast(read_navigation_signed(data_bits, CNAV_ALPHA0)); - iono_record.d_alpha0 = iono_record.d_alpha0 * CNAV_ALPHA0_LSB; - iono_record.d_alpha1 = static_cast(read_navigation_signed(data_bits, CNAV_ALPHA1)); - iono_record.d_alpha1 = iono_record.d_alpha1 * CNAV_ALPHA1_LSB; - iono_record.d_alpha2 = static_cast(read_navigation_signed(data_bits, CNAV_ALPHA2)); - iono_record.d_alpha2 = iono_record.d_alpha2 * CNAV_ALPHA2_LSB; - iono_record.d_alpha3 = static_cast(read_navigation_signed(data_bits, CNAV_ALPHA3)); - iono_record.d_alpha3 = iono_record.d_alpha3 * CNAV_ALPHA3_LSB; - iono_record.d_beta0 = static_cast(read_navigation_signed(data_bits, CNAV_BETA0)); - iono_record.d_beta0 = iono_record.d_beta0 * CNAV_BETA0_LSB; - iono_record.d_beta1 = static_cast(read_navigation_signed(data_bits, CNAV_BETA1)); - iono_record.d_beta1 = iono_record.d_beta1 * CNAV_BETA1_LSB; - iono_record.d_beta2 = static_cast(read_navigation_signed(data_bits, CNAV_BETA2)); - iono_record.d_beta2 = iono_record.d_beta2 * CNAV_BETA2_LSB; - iono_record.d_beta3 = static_cast(read_navigation_signed(data_bits, CNAV_BETA3)); - iono_record.d_beta3 = iono_record.d_beta3 * CNAV_BETA3_LSB; - b_flag_iono_valid = true; - break; - case 33: // (CLOCK & UTC) - ephemeris_record.d_Top = static_cast(read_navigation_unsigned(data_bits, CNAV_TOP1)); - ephemeris_record.d_Top = ephemeris_record.d_Top * CNAV_TOP1_LSB; - ephemeris_record.d_Toc = static_cast(read_navigation_unsigned(data_bits, CNAV_TOC)); - ephemeris_record.d_Toc = ephemeris_record.d_Toc * CNAV_TOC_LSB; - ephemeris_record.d_A_f0 = static_cast(read_navigation_signed(data_bits, CNAV_AF0)); - ephemeris_record.d_A_f0 = ephemeris_record.d_A_f0 * CNAV_AF0_LSB; - ephemeris_record.d_A_f1 = static_cast(read_navigation_signed(data_bits, CNAV_AF1)); - ephemeris_record.d_A_f1 = ephemeris_record.d_A_f1 * CNAV_AF1_LSB; - ephemeris_record.d_A_f2 = static_cast(read_navigation_signed(data_bits, CNAV_AF2)); - ephemeris_record.d_A_f2 = ephemeris_record.d_A_f2 * CNAV_AF2_LSB; + ephemeris_record.d_ISCL5I = static_cast(read_navigation_signed(data_bits, CNAV_ISCL5I)); + if (ephemeris_record.d_ISCL5I < -4095.9) + { + ephemeris_record.d_ISCL5I = 0.0; + } + ephemeris_record.d_ISCL5I *= CNAV_ISCL5I_LSB; + ephemeris_record.d_ISCL5Q = static_cast(read_navigation_signed(data_bits, CNAV_ISCL5Q)); + if (ephemeris_record.d_ISCL5Q < -4095.9) + { + ephemeris_record.d_ISCL5Q = 0.0; + } + ephemeris_record.d_ISCL5Q *= CNAV_ISCL5Q_LSB; + //iono + iono_record.d_alpha0 = static_cast(read_navigation_signed(data_bits, CNAV_ALPHA0)); + iono_record.d_alpha0 = iono_record.d_alpha0 * CNAV_ALPHA0_LSB; + iono_record.d_alpha1 = static_cast(read_navigation_signed(data_bits, CNAV_ALPHA1)); + iono_record.d_alpha1 = iono_record.d_alpha1 * CNAV_ALPHA1_LSB; + iono_record.d_alpha2 = static_cast(read_navigation_signed(data_bits, CNAV_ALPHA2)); + iono_record.d_alpha2 = iono_record.d_alpha2 * CNAV_ALPHA2_LSB; + iono_record.d_alpha3 = static_cast(read_navigation_signed(data_bits, CNAV_ALPHA3)); + iono_record.d_alpha3 = iono_record.d_alpha3 * CNAV_ALPHA3_LSB; + iono_record.d_beta0 = static_cast(read_navigation_signed(data_bits, CNAV_BETA0)); + iono_record.d_beta0 = iono_record.d_beta0 * CNAV_BETA0_LSB; + iono_record.d_beta1 = static_cast(read_navigation_signed(data_bits, CNAV_BETA1)); + iono_record.d_beta1 = iono_record.d_beta1 * CNAV_BETA1_LSB; + iono_record.d_beta2 = static_cast(read_navigation_signed(data_bits, CNAV_BETA2)); + iono_record.d_beta2 = iono_record.d_beta2 * CNAV_BETA2_LSB; + iono_record.d_beta3 = static_cast(read_navigation_signed(data_bits, CNAV_BETA3)); + iono_record.d_beta3 = iono_record.d_beta3 * CNAV_BETA3_LSB; + b_flag_iono_valid = true; + break; + case 33: // (CLOCK & UTC) + ephemeris_record.d_Top = static_cast(read_navigation_unsigned(data_bits, CNAV_TOP1)); + ephemeris_record.d_Top = ephemeris_record.d_Top * CNAV_TOP1_LSB; + ephemeris_record.d_Toc = static_cast(read_navigation_unsigned(data_bits, CNAV_TOC)); + ephemeris_record.d_Toc = ephemeris_record.d_Toc * CNAV_TOC_LSB; + ephemeris_record.d_A_f0 = static_cast(read_navigation_signed(data_bits, CNAV_AF0)); + ephemeris_record.d_A_f0 = ephemeris_record.d_A_f0 * CNAV_AF0_LSB; + ephemeris_record.d_A_f1 = static_cast(read_navigation_signed(data_bits, CNAV_AF1)); + ephemeris_record.d_A_f1 = ephemeris_record.d_A_f1 * CNAV_AF1_LSB; + ephemeris_record.d_A_f2 = static_cast(read_navigation_signed(data_bits, CNAV_AF2)); + ephemeris_record.d_A_f2 = ephemeris_record.d_A_f2 * CNAV_AF2_LSB; utc_model_record.d_A0 = static_cast(read_navigation_signed(data_bits, CNAV_A0)); utc_model_record.d_A0 = utc_model_record.d_A0 * CNAV_A0_LSB; From a797bfb641635955cb68945a29386ae43e088ca0 Mon Sep 17 00:00:00 2001 From: Antonio Ramos Date: Mon, 12 Mar 2018 11:27:26 +0100 Subject: [PATCH 44/61] Migrate GPS L1 TOW from double to unsigned int --- .../gnuradio_blocks/gps_l1_ca_telemetry_decoder_cc.cc | 8 ++++---- src/core/system_parameters/GPS_L1_CA.h | 1 + 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_cc.cc b/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_cc.cc index 2ace76e77..580bc8bdc 100644 --- a/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_cc.cc +++ b/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_cc.cc @@ -362,12 +362,12 @@ int gps_l1_ca_telemetry_decoder_cc::general_work(int noutput_items __attribute__ else { d_TOW_at_current_symbol += GPS_L1_CA_CODE_PERIOD; - d_TOW_at_current_symbol_ms++; + d_TOW_at_current_symbol_ms += GPS_L1_CA_CODE_PERIOD_MS; } - current_symbol.TOW_at_current_symbol_s = static_cast(d_TOW_at_current_symbol_ms) / 1000.0; - //current_symbol.TOW_at_current_symbol_s = d_TOW_at_current_symbol; - current_symbol.Flag_valid_word = flag_TOW_set; + current_symbol.TOW_at_current_symbol_s = static_cast(d_TOW_at_current_symbol_ms) / 1000.0; + //current_symbol.TOW_at_current_symbol_s = d_TOW_at_current_symbol; + current_symbol.Flag_valid_word = flag_TOW_set; if (flag_PLL_180_deg_phase_locked == true) { diff --git a/src/core/system_parameters/GPS_L1_CA.h b/src/core/system_parameters/GPS_L1_CA.h index cf2611344..c5ae95618 100644 --- a/src/core/system_parameters/GPS_L1_CA.h +++ b/src/core/system_parameters/GPS_L1_CA.h @@ -53,6 +53,7 @@ const double GPS_L1_FREQ_HZ = FREQ1; //!< L1 [Hz] const double GPS_L1_CA_CODE_RATE_HZ = 1.023e6; //!< GPS L1 C/A code rate [chips/s] const double GPS_L1_CA_CODE_LENGTH_CHIPS = 1023.0; //!< GPS L1 C/A code length [chips] const double GPS_L1_CA_CODE_PERIOD = 0.001; //!< GPS L1 C/A code period [seconds] +const unsigned int GPS_L1_CA_CODE_PERIOD_MS = 1; //!< GPS L1 C/A code period [ms] const double GPS_L1_CA_CHIP_PERIOD = 9.7752e-07; //!< GPS L1 C/A chip period [seconds] /*! From 02deff9b24acd2f973193f002e507c31ac2e1f97 Mon Sep 17 00:00:00 2001 From: Antonio Ramos Date: Mon, 19 Mar 2018 16:52:36 +0100 Subject: [PATCH 45/61] Add new tracking block to GPS L2 adapter --- .../galileo_e1b_telemetry_decoder_cc.cc | 10 +-- .../adapters/gps_l2_m_dll_pll_tracking.cc | 68 +++++++++++++------ .../adapters/gps_l2_m_dll_pll_tracking.h | 3 + .../gnuradio_blocks/dll_pll_veml_tracking.cc | 13 ++-- 4 files changed, 66 insertions(+), 28 deletions(-) diff --git a/src/algorithms/telemetry_decoder/gnuradio_blocks/galileo_e1b_telemetry_decoder_cc.cc b/src/algorithms/telemetry_decoder/gnuradio_blocks/galileo_e1b_telemetry_decoder_cc.cc index 294436c2d..5d8cbfab6 100644 --- a/src/algorithms/telemetry_decoder/gnuradio_blocks/galileo_e1b_telemetry_decoder_cc.cc +++ b/src/algorithms/telemetry_decoder/gnuradio_blocks/galileo_e1b_telemetry_decoder_cc.cc @@ -399,32 +399,32 @@ int galileo_e1b_telemetry_decoder_cc::general_work(int noutput_items __attribute if (d_nav.flag_TOW_5 == true) //page 5 arrived and decoded, so we are in the odd page (since Tow refers to the even page, we have to add 1 sec) { //TOW_5 refers to the even preamble, but when we decode it we are in the odd part, so 1 second later plus the decoding delay - d_TOW_at_current_symbol = d_nav.TOW_5 + GALILEO_INAV_PAGE_PART_SECONDS + (static_cast(required_symbols)) * GALILEO_E1_CODE_PERIOD; //-GALILEO_E1_CODE_PERIOD;//+ (double)GALILEO_INAV_PREAMBLE_LENGTH_BITS/(double)GALILEO_TELEMETRY_RATE_BITS_SECOND; + d_TOW_at_current_symbol = d_nav.TOW_5 + static_cast(GALILEO_INAV_PAGE_PART_SECONDS) + static_cast(required_symbols - 1) * GALILEO_E1_CODE_PERIOD; //-GALILEO_E1_CODE_PERIOD;//+ (double)GALILEO_INAV_PREAMBLE_LENGTH_BITS/(double)GALILEO_TELEMETRY_RATE_BITS_SECOND; d_nav.flag_TOW_5 = false; } else if (d_nav.flag_TOW_6 == true) //page 6 arrived and decoded, so we are in the odd page (since Tow refers to the even page, we have to add 1 sec) { //TOW_6 refers to the even preamble, but when we decode it we are in the odd part, so 1 second later plus the decoding delay - d_TOW_at_current_symbol = d_nav.TOW_6 + GALILEO_INAV_PAGE_PART_SECONDS + (static_cast(required_symbols)) * GALILEO_E1_CODE_PERIOD; //-GALILEO_E1_CODE_PERIOD;//+ (double)GALILEO_INAV_PREAMBLE_LENGTH_BITS/(double)GALILEO_TELEMETRY_RATE_BITS_SECOND; + d_TOW_at_current_symbol = d_nav.TOW_6 + static_cast(GALILEO_INAV_PAGE_PART_SECONDS) + static_cast(required_symbols - 1) * GALILEO_E1_CODE_PERIOD; //-GALILEO_E1_CODE_PERIOD;//+ (double)GALILEO_INAV_PREAMBLE_LENGTH_BITS/(double)GALILEO_TELEMETRY_RATE_BITS_SECOND; d_nav.flag_TOW_6 = false; } else { //this page has no timing information - d_TOW_at_current_symbol = d_TOW_at_current_symbol + GALILEO_E1_CODE_PERIOD; // + GALILEO_INAV_PAGE_PART_SYMBOLS*GALILEO_E1_CODE_PERIOD; + d_TOW_at_current_symbol += GALILEO_E1_CODE_PERIOD; // + GALILEO_INAV_PAGE_PART_SYMBOLS*GALILEO_E1_CODE_PERIOD; } } else //if there is not a new preamble, we define the TOW of the current symbol { - d_TOW_at_current_symbol = d_TOW_at_current_symbol + GALILEO_E1_CODE_PERIOD; + d_TOW_at_current_symbol += GALILEO_E1_CODE_PERIOD; } //if (d_flag_frame_sync == true and d_nav.flag_TOW_set==true and d_nav.flag_CRC_test == true) if (d_nav.flag_GGTO_1 == true and d_nav.flag_GGTO_2 == true and d_nav.flag_GGTO_3 == true and d_nav.flag_GGTO_4 == true) //all GGTO parameters arrived { - delta_t = d_nav.A_0G_10 + d_nav.A_1G_10 * (d_TOW_at_current_symbol - d_nav.t_0G_10 + 604800.0 * (fmod((d_nav.WN_0 - d_nav.WN_0G_10), 64))); + delta_t = d_nav.A_0G_10 + d_nav.A_1G_10 * (d_TOW_at_current_symbol - d_nav.t_0G_10 + 604800.0 * (fmod((d_nav.WN_0 - d_nav.WN_0G_10), 64.0))); } if (d_flag_frame_sync == true and d_nav.flag_TOW_set == true) diff --git a/src/algorithms/tracking/adapters/gps_l2_m_dll_pll_tracking.cc b/src/algorithms/tracking/adapters/gps_l2_m_dll_pll_tracking.cc index 839ef334c..ac8b6af7a 100644 --- a/src/algorithms/tracking/adapters/gps_l2_m_dll_pll_tracking.cc +++ b/src/algorithms/tracking/adapters/gps_l2_m_dll_pll_tracking.cc @@ -39,6 +39,7 @@ #include "configuration_interface.h" #include "GPS_L2C.h" #include "gnss_sdr_flags.h" +#include "display.h" #include @@ -52,7 +53,6 @@ GpsL2MDllPllTracking::GpsL2MDllPllTracking( //################# CONFIGURATION PARAMETERS ######################## int fs_in; int vector_length; - int f_if; bool dump; std::string dump_filename; std::string item_type; @@ -63,31 +63,46 @@ GpsL2MDllPllTracking::GpsL2MDllPllTracking( item_type = configuration->property(role + ".item_type", default_item_type); int fs_in_deprecated = configuration->property("GNSS-SDR.internal_fs_hz", 2048000); fs_in = configuration->property("GNSS-SDR.internal_fs_sps", fs_in_deprecated); - f_if = configuration->property(role + ".if", 0); dump = configuration->property(role + ".dump", false); - pll_bw_hz = configuration->property(role + ".pll_bw_hz", 50.0); + pll_bw_hz = configuration->property(role + ".pll_bw_hz", 2.0); if (FLAGS_pll_bw_hz != 0.0) pll_bw_hz = static_cast(FLAGS_pll_bw_hz); - dll_bw_hz = configuration->property(role + ".dll_bw_hz", 2.0); + dll_bw_hz = configuration->property(role + ".dll_bw_hz", 0.75); if (FLAGS_dll_bw_hz != 0.0) dll_bw_hz = static_cast(FLAGS_dll_bw_hz); + unified_ = configuration->property(role + ".unified", false); early_late_space_chips = configuration->property(role + ".early_late_space_chips", 0.5); std::string default_dump_filename = "./track_ch"; dump_filename = configuration->property(role + ".dump_filename", default_dump_filename); //unused! vector_length = std::round(static_cast(fs_in) / (static_cast(GPS_L2_M_CODE_RATE_HZ) / static_cast(GPS_L2_M_CODE_LENGTH_CHIPS))); - + int symbols_extended_correlator = configuration->property(role + ".extend_correlation_symbols", 1); + if (symbols_extended_correlator != 1) + { + std::cout << TEXT_RED << "WARNING: Extended coherent integration is not allowed in GPS L2. Coherent integration has been set to 20 ms (1 symbol)" << TEXT_RESET << std::endl; + } //################# MAKE TRACKING GNURadio object ################### if (item_type.compare("gr_complex") == 0) { item_size_ = sizeof(gr_complex); - tracking_ = gps_l2_m_dll_pll_make_tracking_cc( - f_if, - fs_in, - vector_length, - dump, - dump_filename, - pll_bw_hz, - dll_bw_hz, - early_late_space_chips); + if (unified_) + { + char sig_[3] = "2S"; + item_size_ = sizeof(gr_complex); + tracking_unified_ = dll_pll_veml_make_tracking( + fs_in, vector_length, dump, dump_filename, + pll_bw_hz, dll_bw_hz, pll_bw_hz, dll_bw_hz, + early_late_space_chips, + early_late_space_chips, + early_late_space_chips, + early_late_space_chips, + 1, false, 'G', sig_); + } + else + { + tracking_ = gps_l2_m_dll_pll_make_tracking_cc( + 0, fs_in, vector_length, dump, + dump_filename, pll_bw_hz, dll_bw_hz, + early_late_space_chips); + } } else { @@ -106,7 +121,10 @@ GpsL2MDllPllTracking::~GpsL2MDllPllTracking() void GpsL2MDllPllTracking::start_tracking() { - tracking_->start_tracking(); + if (unified_) + tracking_unified_->start_tracking(); + else + tracking_->start_tracking(); } /* @@ -115,13 +133,19 @@ void GpsL2MDllPllTracking::start_tracking() void GpsL2MDllPllTracking::set_channel(unsigned int channel) { channel_ = channel; - tracking_->set_channel(channel); + if (unified_) + tracking_unified_->set_channel(channel); + else + tracking_->set_channel(channel); } void GpsL2MDllPllTracking::set_gnss_synchro(Gnss_Synchro* p_gnss_synchro) { - tracking_->set_gnss_synchro(p_gnss_synchro); + if (unified_) + tracking_unified_->set_gnss_synchro(p_gnss_synchro); + else + tracking_->set_gnss_synchro(p_gnss_synchro); } void GpsL2MDllPllTracking::connect(gr::top_block_sptr top_block) @@ -142,10 +166,16 @@ void GpsL2MDllPllTracking::disconnect(gr::top_block_sptr top_block) gr::basic_block_sptr GpsL2MDllPllTracking::get_left_block() { - return tracking_; + if (unified_) + return tracking_unified_; + else + return tracking_; } gr::basic_block_sptr GpsL2MDllPllTracking::get_right_block() { - return tracking_; + if (unified_) + return tracking_unified_; + else + return tracking_; } diff --git a/src/algorithms/tracking/adapters/gps_l2_m_dll_pll_tracking.h b/src/algorithms/tracking/adapters/gps_l2_m_dll_pll_tracking.h index ae7498a40..77741e9b1 100644 --- a/src/algorithms/tracking/adapters/gps_l2_m_dll_pll_tracking.h +++ b/src/algorithms/tracking/adapters/gps_l2_m_dll_pll_tracking.h @@ -40,6 +40,7 @@ #include "tracking_interface.h" #include "gps_l2_m_dll_pll_tracking_cc.h" +#include "dll_pll_veml_tracking.h" #include class ConfigurationInterface; @@ -93,11 +94,13 @@ public: private: gps_l2_m_dll_pll_tracking_cc_sptr tracking_; + dll_pll_veml_tracking_sptr tracking_unified_; size_t item_size_; unsigned int channel_; std::string role_; unsigned int in_streams_; unsigned int out_streams_; + bool unified_; }; #endif // GNSS_SDR_gps_l2_m_dll_pll_tracking_H_ diff --git a/src/algorithms/tracking/gnuradio_blocks/dll_pll_veml_tracking.cc b/src/algorithms/tracking/gnuradio_blocks/dll_pll_veml_tracking.cc index 9a0c97c18..9d4d0b06d 100755 --- a/src/algorithms/tracking/gnuradio_blocks/dll_pll_veml_tracking.cc +++ b/src/algorithms/tracking/gnuradio_blocks/dll_pll_veml_tracking.cc @@ -887,6 +887,7 @@ void dll_pll_veml_tracking::log_data(bool integrating) tmp_L = std::abs(d_L_accu); if (integrating) { + //TODO: Improve this solution! // It compensates the amplitude difference while integrating float scale_factor = static_cast(d_extend_correlation_symbols) / static_cast(d_extend_correlation_symbols_count); tmp_VE *= scale_factor; @@ -1027,7 +1028,7 @@ int dll_pll_veml_tracking::general_work(int noutput_items __attribute__((unused) d_Prompt_buffer_deque.pop_front(); } } - else //Signal does not have secondary code. Search a bit transition by sign change + else if (d_symbols_per_bit > 1) //Signal does not have secondary code. Search a bit transition by sign change { if (d_synchonizing) { @@ -1058,6 +1059,10 @@ int dll_pll_veml_tracking::general_work(int noutput_items __attribute__((unused) d_current_symbol = 1; } } + else + { + next_state = true; + } if (next_state) { // reset extended correlator d_VE_accu = gr_complex(0.0, 0.0); @@ -1089,9 +1094,9 @@ int dll_pll_veml_tracking::general_work(int noutput_items __attribute__((unused) if (d_enable_extended_integration) { d_extend_correlation_symbols_count = 0; - float new_correlation_time_s = static_cast(d_extend_correlation_symbols) * static_cast(d_code_period); - d_carrier_loop_filter.set_pdi(new_correlation_time_s); - d_code_loop_filter.set_pdi(new_correlation_time_s); + float new_correlation_time = static_cast(d_extend_correlation_symbols) * static_cast(d_code_period); + d_carrier_loop_filter.set_pdi(new_correlation_time); + d_code_loop_filter.set_pdi(new_correlation_time); d_state = 3; // next state is the extended correlator integrator LOG(INFO) << "Enabled " << d_extend_correlation_symbols << " [symbols] extended correlator for CH " << d_channel From e94d7296dc0349b0ad5d70e98a52cf75b15a05d3 Mon Sep 17 00:00:00 2001 From: Antonio Ramos Date: Tue, 20 Mar 2018 10:33:02 +0100 Subject: [PATCH 46/61] Add warnings to tracking adapters --- src/algorithms/libs/rtklib/rtklib_pntpos.cc | 1 + .../galileo_e1_dll_pll_veml_tracking.cc | 57 ++++----- .../adapters/galileo_e5a_dll_pll_tracking.cc | 114 +++++++++++------- .../adapters/galileo_e5a_dll_pll_tracking.h | 3 + .../adapters/gps_l1_ca_dll_pll_tracking.cc | 42 +++---- .../adapters/gps_l5i_dll_pll_tracking.cc | 101 ++++++++++------ .../adapters/gps_l5i_dll_pll_tracking.h | 9 +- .../gnuradio_blocks/dll_pll_veml_tracking.cc | 47 ++++---- .../gnuradio_blocks/dll_pll_veml_tracking.h | 5 - 9 files changed, 211 insertions(+), 168 deletions(-) diff --git a/src/algorithms/libs/rtklib/rtklib_pntpos.cc b/src/algorithms/libs/rtklib/rtklib_pntpos.cc index 434f3b03a..d33a70c31 100644 --- a/src/algorithms/libs/rtklib/rtklib_pntpos.cc +++ b/src/algorithms/libs/rtklib/rtklib_pntpos.cc @@ -280,6 +280,7 @@ double prange(const obsd_t *obs, const nav_t *nav, const double *azel, } else if (obs->code[j] == CODE_L5X) /* L1 + L5 */ { + //TODO } } else if (sys == SYS_GAL) /* E1 + E5a */ diff --git a/src/algorithms/tracking/adapters/galileo_e1_dll_pll_veml_tracking.cc b/src/algorithms/tracking/adapters/galileo_e1_dll_pll_veml_tracking.cc index daf6e898a..3b2331531 100644 --- a/src/algorithms/tracking/adapters/galileo_e1_dll_pll_veml_tracking.cc +++ b/src/algorithms/tracking/adapters/galileo_e1_dll_pll_veml_tracking.cc @@ -38,6 +38,7 @@ #include "configuration_interface.h" #include "Galileo_E1.h" #include "gnss_sdr_flags.h" +#include "display.h" #include @@ -49,44 +50,37 @@ GalileoE1DllPllVemlTracking::GalileoE1DllPllVemlTracking( { DLOG(INFO) << "role " << role; //################# CONFIGURATION PARAMETERS ######################## - int fs_in; - int vector_length; - bool dump; - std::string dump_filename; - std::string item_type; std::string default_item_type = "gr_complex"; - float pll_bw_hz; - float pll_bw_narrow_hz; - float dll_bw_hz; - float dll_bw_narrow_hz; - float early_late_space_chips; - float very_early_late_space_chips; - float early_late_space_narrow_chips; - float very_early_late_space_narrow_chips; unified_ = configuration->property(role + ".unified", false); - item_type = configuration->property(role + ".item_type", default_item_type); + std::string item_type = configuration->property(role + ".item_type", default_item_type); int fs_in_deprecated = configuration->property("GNSS-SDR.internal_fs_hz", 2048000); - fs_in = configuration->property("GNSS-SDR.internal_fs_sps", fs_in_deprecated); - dump = configuration->property(role + ".dump", false); - pll_bw_hz = configuration->property(role + ".pll_bw_hz", 5.0); + int fs_in = configuration->property("GNSS-SDR.internal_fs_sps", fs_in_deprecated); + bool dump = configuration->property(role + ".dump", false); + float pll_bw_hz = configuration->property(role + ".pll_bw_hz", 5.0); if (FLAGS_pll_bw_hz != 0.0) pll_bw_hz = static_cast(FLAGS_pll_bw_hz); - dll_bw_hz = configuration->property(role + ".dll_bw_hz", 0.5); + float dll_bw_hz = configuration->property(role + ".dll_bw_hz", 0.5); if (FLAGS_dll_bw_hz != 0.0) dll_bw_hz = static_cast(FLAGS_dll_bw_hz); - pll_bw_narrow_hz = configuration->property(role + ".pll_bw_narrow_hz", 2.0); - dll_bw_narrow_hz = configuration->property(role + ".dll_bw_narrow_hz", 0.25); - int extend_correlation_symbols; - extend_correlation_symbols = configuration->property(role + ".extend_correlation_symbols", 1); - early_late_space_chips = configuration->property(role + ".early_late_space_chips", 0.15); - very_early_late_space_chips = configuration->property(role + ".very_early_late_space_chips", 0.6); - early_late_space_narrow_chips = configuration->property(role + ".early_late_space_narrow_chips", 0.15); - very_early_late_space_narrow_chips = configuration->property(role + ".very_early_late_space_narrow_chips", 0.6); - + float pll_bw_narrow_hz = configuration->property(role + ".pll_bw_narrow_hz", 2.0); + float dll_bw_narrow_hz = configuration->property(role + ".dll_bw_narrow_hz", 0.25); + int extend_correlation_symbols = configuration->property(role + ".extend_correlation_symbols", 1); + float early_late_space_chips = configuration->property(role + ".early_late_space_chips", 0.15); + float very_early_late_space_chips = configuration->property(role + ".very_early_late_space_chips", 0.6); + float early_late_space_narrow_chips = configuration->property(role + ".early_late_space_narrow_chips", 0.15); + float very_early_late_space_narrow_chips = configuration->property(role + ".very_early_late_space_narrow_chips", 0.6); bool track_pilot = configuration->property(role + ".track_pilot", false); - + if (extend_correlation_symbols < 1) + { + extend_correlation_symbols = 1; + std::cout << TEXT_RED << "WARNING: Galileo E1. extend_correlation_symbols must be bigger than 0. Coherent integration has been set to 1 symbol (4 ms)" << TEXT_RESET << std::endl; + } + else if (!track_pilot and extend_correlation_symbols > 1) + { + extend_correlation_symbols = 1; + std::cout << TEXT_RED << "WARNING: Extended coherent integration is not allowed in Galileo E1 when tracking the data component. Coherent integration has been set to 4 ms (1 symbol)" << TEXT_RESET << std::endl; + } std::string default_dump_filename = "./track_ch"; - dump_filename = configuration->property(role + ".dump_filename", - default_dump_filename); //unused! - vector_length = std::round(fs_in / (Galileo_E1_CODE_CHIP_RATE_HZ / Galileo_E1_B_CODE_LENGTH_CHIPS)); + std::string dump_filename = configuration->property(role + ".dump_filename", default_dump_filename); //unused! + int vector_length = std::round(fs_in / (Galileo_E1_CODE_CHIP_RATE_HZ / Galileo_E1_B_CODE_LENGTH_CHIPS)); //################# MAKE TRACKING GNURadio object ################### if (item_type.compare("gr_complex") == 0) @@ -138,7 +132,6 @@ GalileoE1DllPllVemlTracking::GalileoE1DllPllVemlTracking( } channel_ = 0; - DLOG(INFO) << "tracking(" << tracking_->unique_id() << ")"; } diff --git a/src/algorithms/tracking/adapters/galileo_e5a_dll_pll_tracking.cc b/src/algorithms/tracking/adapters/galileo_e5a_dll_pll_tracking.cc index 87c11f48a..be0030888 100644 --- a/src/algorithms/tracking/adapters/galileo_e5a_dll_pll_tracking.cc +++ b/src/algorithms/tracking/adapters/galileo_e5a_dll_pll_tracking.cc @@ -40,6 +40,7 @@ #include "configuration_interface.h" #include "Galileo_E5a.h" #include "gnss_sdr_flags.h" +#include "display.h" #include using google::LogMessage; @@ -50,55 +51,63 @@ GalileoE5aDllPllTracking::GalileoE5aDllPllTracking( { DLOG(INFO) << "role " << role; //################# CONFIGURATION PARAMETERS ######################## - int fs_in; - int vector_length; - int f_if; - bool dump; - std::string dump_filename; - std::string item_type; std::string default_item_type = "gr_complex"; - float pll_bw_hz; - float dll_bw_hz; - float pll_bw_narrow_hz; - float dll_bw_narrow_hz; - int ti_ms; - float early_late_space_chips; - item_type = configuration->property(role + ".item_type", default_item_type); - //vector_length = configuration->property(role + ".vector_length", 2048); + std::string item_type = configuration->property(role + ".item_type", default_item_type); int fs_in_deprecated = configuration->property("GNSS-SDR.internal_fs_hz", 12000000); - fs_in = configuration->property("GNSS-SDR.internal_fs_sps", fs_in_deprecated); - f_if = configuration->property(role + ".if", 0); - dump = configuration->property(role + ".dump", false); - pll_bw_hz = configuration->property(role + ".pll_bw_hz", 20.0); + int fs_in = configuration->property("GNSS-SDR.internal_fs_sps", fs_in_deprecated); + bool dump = configuration->property(role + ".dump", false); + unified_ = configuration->property(role + ".unified", false); + float pll_bw_hz = configuration->property(role + ".pll_bw_hz", 20.0); if (FLAGS_pll_bw_hz != 0.0) pll_bw_hz = static_cast(FLAGS_pll_bw_hz); - dll_bw_hz = configuration->property(role + ".dll_bw_hz", 20.0); + float dll_bw_hz = configuration->property(role + ".dll_bw_hz", 20.0); if (FLAGS_dll_bw_hz != 0.0) dll_bw_hz = static_cast(FLAGS_dll_bw_hz); - pll_bw_narrow_hz = configuration->property(role + ".pll_bw_narrow_hz", 5.0); - dll_bw_narrow_hz = configuration->property(role + ".dll_bw_narrow_hz", 2.0); - ti_ms = configuration->property(role + ".ti_ms", 3); - - early_late_space_chips = configuration->property(role + ".early_late_space_chips", 0.5); + float pll_bw_narrow_hz = configuration->property(role + ".pll_bw_narrow_hz", 5.0); + float dll_bw_narrow_hz = configuration->property(role + ".dll_bw_narrow_hz", 2.0); + int ti_ms = configuration->property(role + ".ti_ms", 3); + float early_late_space_chips = configuration->property(role + ".early_late_space_chips", 0.5); std::string default_dump_filename = "./track_ch"; - dump_filename = configuration->property(role + ".dump_filename", - default_dump_filename); //unused! - vector_length = std::round(fs_in / (Galileo_E5a_CODE_CHIP_RATE_HZ / Galileo_E5a_CODE_LENGTH_CHIPS)); - + std::string dump_filename = configuration->property(role + ".dump_filename", default_dump_filename); //unused! + int vector_length = std::round(fs_in / (Galileo_E5a_CODE_CHIP_RATE_HZ / Galileo_E5a_CODE_LENGTH_CHIPS)); + int extend_correlation_symbols = configuration->property(role + ".extend_correlation_symbols", 1); + float early_late_space_narrow_chips = configuration->property(role + ".early_late_space_narrow_chips", 0.15); + bool track_pilot = configuration->property(role + ".track_pilot", false); + if (extend_correlation_symbols < 1) + { + extend_correlation_symbols = 1; + std::cout << TEXT_RED << "WARNING: Galileo E5a. extend_correlation_symbols must be bigger than 0. Coherent integration has been set to 1 symbol (1 ms)" << TEXT_RESET << std::endl; + } + else if (!track_pilot and extend_correlation_symbols > Galileo_E5a_I_SECONDARY_CODE_LENGTH) + { + extend_correlation_symbols = Galileo_E5a_I_SECONDARY_CODE_LENGTH; + std::cout << TEXT_RED << "WARNING: Galileo E5a. extend_correlation_symbols must be lower than 21 when tracking the data component. Coherent integration has been set to 20 symbols (20 ms)" << TEXT_RESET << std::endl; + } //################# MAKE TRACKING GNURadio object ################### if (item_type.compare("gr_complex") == 0) { item_size_ = sizeof(gr_complex); - tracking_ = galileo_e5a_dll_pll_make_tracking_cc( - f_if, - fs_in, - vector_length, - dump, - dump_filename, - pll_bw_hz, - dll_bw_hz, - pll_bw_narrow_hz, - dll_bw_narrow_hz, - ti_ms, - early_late_space_chips); + if (unified_) + { + char sig_[3] = "5X"; + item_size_ = sizeof(gr_complex); + tracking_unified_ = dll_pll_veml_make_tracking( + fs_in, vector_length, dump, dump_filename, + pll_bw_hz, dll_bw_hz, + pll_bw_narrow_hz, dll_bw_narrow_hz, + early_late_space_chips, + early_late_space_chips, + early_late_space_narrow_chips, + early_late_space_narrow_chips, + extend_correlation_symbols, + track_pilot, 'E', sig_); + } + else + { + tracking_ = galileo_e5a_dll_pll_make_tracking_cc( + 0, fs_in, vector_length, dump, dump_filename, + pll_bw_hz, dll_bw_hz, pll_bw_narrow_hz, + dll_bw_narrow_hz, ti_ms, + early_late_space_chips); + } } else { @@ -117,7 +126,10 @@ GalileoE5aDllPllTracking::~GalileoE5aDllPllTracking() void GalileoE5aDllPllTracking::start_tracking() { - tracking_->start_tracking(); + if (unified_) + tracking_unified_->start_tracking(); + else + tracking_->start_tracking(); } /* @@ -126,13 +138,19 @@ void GalileoE5aDllPllTracking::start_tracking() void GalileoE5aDllPllTracking::set_channel(unsigned int channel) { channel_ = channel; - tracking_->set_channel(channel); + if (unified_) + tracking_unified_->set_channel(channel); + else + tracking_->set_channel(channel); } void GalileoE5aDllPllTracking::set_gnss_synchro(Gnss_Synchro* p_gnss_synchro) { - tracking_->set_gnss_synchro(p_gnss_synchro); + if (unified_) + tracking_unified_->set_gnss_synchro(p_gnss_synchro); + else + tracking_->set_gnss_synchro(p_gnss_synchro); } void GalileoE5aDllPllTracking::connect(gr::top_block_sptr top_block) @@ -153,10 +171,16 @@ void GalileoE5aDllPllTracking::disconnect(gr::top_block_sptr top_block) gr::basic_block_sptr GalileoE5aDllPllTracking::get_left_block() { - return tracking_; + if (unified_) + return tracking_unified_; + else + return tracking_; } gr::basic_block_sptr GalileoE5aDllPllTracking::get_right_block() { - return tracking_; + if (unified_) + return tracking_unified_; + else + return tracking_; } diff --git a/src/algorithms/tracking/adapters/galileo_e5a_dll_pll_tracking.h b/src/algorithms/tracking/adapters/galileo_e5a_dll_pll_tracking.h index b56cf2945..69d5600e4 100644 --- a/src/algorithms/tracking/adapters/galileo_e5a_dll_pll_tracking.h +++ b/src/algorithms/tracking/adapters/galileo_e5a_dll_pll_tracking.h @@ -41,6 +41,7 @@ #include "tracking_interface.h" #include "galileo_e5a_dll_pll_tracking_cc.h" +#include "dll_pll_veml_tracking.h" #include class ConfigurationInterface; @@ -94,11 +95,13 @@ public: private: galileo_e5a_dll_pll_tracking_cc_sptr tracking_; + dll_pll_veml_tracking_sptr tracking_unified_; size_t item_size_; unsigned int channel_; std::string role_; unsigned int in_streams_; unsigned int out_streams_; + bool unified_; }; #endif /* GNSS_SDR_GALILEO_E5A_DLL_PLL_TRACKING_H_ */ diff --git a/src/algorithms/tracking/adapters/gps_l1_ca_dll_pll_tracking.cc b/src/algorithms/tracking/adapters/gps_l1_ca_dll_pll_tracking.cc index e642b29a1..8834cfd73 100644 --- a/src/algorithms/tracking/adapters/gps_l1_ca_dll_pll_tracking.cc +++ b/src/algorithms/tracking/adapters/gps_l1_ca_dll_pll_tracking.cc @@ -40,6 +40,7 @@ #include "configuration_interface.h" #include "GPS_L1_CA.h" #include "gnss_sdr_flags.h" +#include "display.h" #include using google::LogMessage; @@ -50,16 +51,11 @@ GpsL1CaDllPllTracking::GpsL1CaDllPllTracking( { DLOG(INFO) << "role " << role; //################# CONFIGURATION PARAMETERS ######################## - int fs_in; - int vector_length; - bool dump; - std::string dump_filename; - std::string item_type; std::string default_item_type = "gr_complex"; - item_type = configuration->property(role + ".item_type", default_item_type); + std::string item_type = configuration->property(role + ".item_type", default_item_type); int fs_in_deprecated = configuration->property("GNSS-SDR.internal_fs_hz", 2048000); - fs_in = configuration->property("GNSS-SDR.internal_fs_sps", fs_in_deprecated); - dump = configuration->property(role + ".dump", false); + int fs_in = configuration->property("GNSS-SDR.internal_fs_sps", fs_in_deprecated); + bool dump = configuration->property(role + ".dump", false); unified_ = configuration->property(role + ".unified", false); float pll_bw_hz = configuration->property(role + ".pll_bw_hz", 50.0); if (FLAGS_pll_bw_hz != 0.0) pll_bw_hz = static_cast(FLAGS_pll_bw_hz); @@ -70,10 +66,14 @@ GpsL1CaDllPllTracking::GpsL1CaDllPllTracking( float early_late_space_chips = configuration->property(role + ".early_late_space_chips", 0.5); float early_late_space_narrow_chips = configuration->property(role + ".early_late_space_narrow_chips", 0.5); std::string default_dump_filename = "./track_ch"; - dump_filename = configuration->property(role + ".dump_filename", default_dump_filename); //unused! - vector_length = std::round(fs_in / (GPS_L1_CA_CODE_RATE_HZ / GPS_L1_CA_CODE_LENGTH_CHIPS)); + std::string dump_filename = configuration->property(role + ".dump_filename", default_dump_filename); //unused! + int vector_length = std::round(fs_in / (GPS_L1_CA_CODE_RATE_HZ / GPS_L1_CA_CODE_LENGTH_CHIPS)); int symbols_extended_correlator = configuration->property(role + ".extend_correlation_symbols", 1); - if (symbols_extended_correlator < 1) symbols_extended_correlator = 1; + if (symbols_extended_correlator < 1 or symbols_extended_correlator > 20) + { + symbols_extended_correlator = 1; + std::cout << TEXT_RED << "WARNING: GPS L1 C/A. extend_correlation_symbols must be between 1 and 20. Coherent integration has been set to 1 symbol (1 ms)" << TEXT_RESET << std::endl; + } //################# MAKE TRACKING GNURadio object ################### if (item_type.compare("gr_complex") == 0) { @@ -82,14 +82,9 @@ GpsL1CaDllPllTracking::GpsL1CaDllPllTracking( char sig_[3] = "1C"; item_size_ = sizeof(gr_complex); tracking_unified_ = dll_pll_veml_make_tracking( - fs_in, - vector_length, - dump, - dump_filename, - pll_bw_hz, - dll_bw_hz, - pll_bw_narrow_hz, - dll_bw_narrow_hz, + fs_in, vector_length, dump, + dump_filename, pll_bw_hz, dll_bw_hz, + pll_bw_narrow_hz, dll_bw_narrow_hz, early_late_space_chips, early_late_space_chips, early_late_space_narrow_chips, @@ -101,13 +96,8 @@ GpsL1CaDllPllTracking::GpsL1CaDllPllTracking( else { tracking_ = gps_l1_ca_dll_pll_make_tracking_cc( - 0, - fs_in, - vector_length, - dump, - dump_filename, - pll_bw_hz, - dll_bw_hz, + 0, fs_in, vector_length, dump, + dump_filename, pll_bw_hz, dll_bw_hz, early_late_space_chips); } } diff --git a/src/algorithms/tracking/adapters/gps_l5i_dll_pll_tracking.cc b/src/algorithms/tracking/adapters/gps_l5i_dll_pll_tracking.cc index 10c180037..752c7b1ce 100644 --- a/src/algorithms/tracking/adapters/gps_l5i_dll_pll_tracking.cc +++ b/src/algorithms/tracking/adapters/gps_l5i_dll_pll_tracking.cc @@ -39,6 +39,7 @@ #include "configuration_interface.h" #include "GPS_L5.h" #include "gnss_sdr_flags.h" +#include "display.h" #include @@ -50,44 +51,61 @@ GpsL5iDllPllTracking::GpsL5iDllPllTracking( { DLOG(INFO) << "role " << role; //################# CONFIGURATION PARAMETERS ######################## - int fs_in; - int vector_length; - int f_if; - bool dump; - std::string dump_filename; - std::string item_type; std::string default_item_type = "gr_complex"; - float pll_bw_hz; - float dll_bw_hz; - float early_late_space_chips; - item_type = configuration->property(role + ".item_type", default_item_type); + std::string item_type = configuration->property(role + ".item_type", default_item_type); int fs_in_deprecated = configuration->property("GNSS-SDR.internal_fs_hz", 2048000); - fs_in = configuration->property("GNSS-SDR.internal_fs_sps", fs_in_deprecated); - f_if = configuration->property(role + ".if", 0); - dump = configuration->property(role + ".dump", false); - pll_bw_hz = configuration->property(role + ".pll_bw_hz", 50.0); + int fs_in = configuration->property("GNSS-SDR.internal_fs_sps", fs_in_deprecated); + bool dump = configuration->property(role + ".dump", false); + unified_ = configuration->property(role + ".unified", false); + float pll_bw_hz = configuration->property(role + ".pll_bw_hz", 50.0); if (FLAGS_pll_bw_hz != 0.0) pll_bw_hz = static_cast(FLAGS_pll_bw_hz); - dll_bw_hz = configuration->property(role + ".dll_bw_hz", 2.0); + float dll_bw_hz = configuration->property(role + ".dll_bw_hz", 2.0); if (FLAGS_dll_bw_hz != 0.0) dll_bw_hz = static_cast(FLAGS_dll_bw_hz); - early_late_space_chips = configuration->property(role + ".early_late_space_chips", 0.5); + float pll_bw_narrow_hz = configuration->property(role + ".pll_bw_narrow_hz", 2.0); + float dll_bw_narrow_hz = configuration->property(role + ".dll_bw_narrow_hz", 0.25); + float early_late_space_chips = configuration->property(role + ".early_late_space_chips", 0.5); std::string default_dump_filename = "./track_ch"; - dump_filename = configuration->property(role + ".dump_filename", - default_dump_filename); //unused! - vector_length = std::round(static_cast(fs_in) / (static_cast(GPS_L5i_CODE_RATE_HZ) / static_cast(GPS_L5i_CODE_LENGTH_CHIPS))); - + std::string dump_filename = configuration->property(role + ".dump_filename", default_dump_filename); //unused! + int vector_length = std::round(static_cast(fs_in) / (static_cast(GPS_L5i_CODE_RATE_HZ) / static_cast(GPS_L5i_CODE_LENGTH_CHIPS))); + int extend_correlation_symbols = configuration->property(role + ".extend_correlation_symbols", 1); + float early_late_space_narrow_chips = configuration->property(role + ".early_late_space_narrow_chips", 0.15); + bool track_pilot = configuration->property(role + ".track_pilot", false); + if (extend_correlation_symbols < 1) + { + extend_correlation_symbols = 1; + std::cout << TEXT_RED << "WARNING: GPS L5. extend_correlation_symbols must be bigger than 0. Coherent integration has been set to 1 symbol (1 ms)" << TEXT_RESET << std::endl; + } + else if (!track_pilot and extend_correlation_symbols > GPS_L5i_NH_CODE_LENGTH) + { + extend_correlation_symbols = GPS_L5i_NH_CODE_LENGTH; + std::cout << TEXT_RED << "WARNING: GPS L5. extend_correlation_symbols must be lower than 11 when tracking the data component. Coherent integration has been set to 10 symbols (10 ms)" << TEXT_RESET << std::endl; + } //################# MAKE TRACKING GNURadio object ################### if (item_type.compare("gr_complex") == 0) { item_size_ = sizeof(gr_complex); - tracking_ = gps_l5i_dll_pll_make_tracking_cc( - f_if, - fs_in, - vector_length, - dump, - dump_filename, - pll_bw_hz, - dll_bw_hz, - early_late_space_chips); + if (unified_) + { + char sig_[3] = "L5"; + item_size_ = sizeof(gr_complex); + tracking_unified_ = dll_pll_veml_make_tracking( + fs_in, vector_length, dump, dump_filename, + pll_bw_hz, dll_bw_hz, + pll_bw_narrow_hz, dll_bw_narrow_hz, + early_late_space_chips, + early_late_space_chips, + early_late_space_narrow_chips, + early_late_space_narrow_chips, + extend_correlation_symbols, + track_pilot, 'G', sig_); + } + else + { + tracking_ = gps_l5i_dll_pll_make_tracking_cc( + 0, fs_in, vector_length, dump, + dump_filename, pll_bw_hz, dll_bw_hz, + early_late_space_chips); + } } else { @@ -106,7 +124,10 @@ GpsL5iDllPllTracking::~GpsL5iDllPllTracking() void GpsL5iDllPllTracking::start_tracking() { - tracking_->start_tracking(); + if (unified_) + tracking_unified_->start_tracking(); + else + tracking_->start_tracking(); } /* @@ -115,13 +136,19 @@ void GpsL5iDllPllTracking::start_tracking() void GpsL5iDllPllTracking::set_channel(unsigned int channel) { channel_ = channel; - tracking_->set_channel(channel); + if (unified_) + tracking_unified_->set_channel(channel); + else + tracking_->set_channel(channel); } void GpsL5iDllPllTracking::set_gnss_synchro(Gnss_Synchro* p_gnss_synchro) { - tracking_->set_gnss_synchro(p_gnss_synchro); + if (unified_) + tracking_unified_->set_gnss_synchro(p_gnss_synchro); + else + tracking_->set_gnss_synchro(p_gnss_synchro); } void GpsL5iDllPllTracking::connect(gr::top_block_sptr top_block) @@ -142,10 +169,16 @@ void GpsL5iDllPllTracking::disconnect(gr::top_block_sptr top_block) gr::basic_block_sptr GpsL5iDllPllTracking::get_left_block() { - return tracking_; + if (unified_) + return tracking_unified_; + else + return tracking_; } gr::basic_block_sptr GpsL5iDllPllTracking::get_right_block() { - return tracking_; + if (unified_) + return tracking_unified_; + else + return tracking_; } diff --git a/src/algorithms/tracking/adapters/gps_l5i_dll_pll_tracking.h b/src/algorithms/tracking/adapters/gps_l5i_dll_pll_tracking.h index c54115251..472de2466 100644 --- a/src/algorithms/tracking/adapters/gps_l5i_dll_pll_tracking.h +++ b/src/algorithms/tracking/adapters/gps_l5i_dll_pll_tracking.h @@ -34,11 +34,12 @@ * ------------------------------------------------------------------------- */ -#ifndef GNSS_SDR_gps_l5i_dll_pll_tracking_H_ -#define GNSS_SDR_gps_l5i_dll_pll_tracking_H_ +#ifndef GNSS_SDR_GPS_L5i_DLL_PLL_TRACKING_H_ +#define GNSS_SDR_GPS_L5i_DLL_PLL_TRACKING_H_ #include "tracking_interface.h" #include "gps_l5i_dll_pll_tracking_cc.h" +#include "dll_pll_veml_tracking.h" #include class ConfigurationInterface; @@ -92,11 +93,13 @@ public: private: gps_l5i_dll_pll_tracking_cc_sptr tracking_; + dll_pll_veml_tracking_sptr tracking_unified_; size_t item_size_; unsigned int channel_; std::string role_; unsigned int in_streams_; unsigned int out_streams_; + bool unified_; }; -#endif // GNSS_SDR_gps_l5i_dll_pll_tracking_H_ +#endif // GNSS_SDR_GPS_L5i_DLL_PLL_TRACKING_H_ diff --git a/src/algorithms/tracking/gnuradio_blocks/dll_pll_veml_tracking.cc b/src/algorithms/tracking/gnuradio_blocks/dll_pll_veml_tracking.cc index 9d4d0b06d..c78068c38 100755 --- a/src/algorithms/tracking/gnuradio_blocks/dll_pll_veml_tracking.cc +++ b/src/algorithms/tracking/gnuradio_blocks/dll_pll_veml_tracking.cc @@ -39,6 +39,7 @@ #include "lock_detectors.h" #include "control_message_factory.h" #include "MATH_CONSTANTS.h" +#include "gnss_sdr_flags.h" #include "Galileo_E1.h" #include "galileo_e1_signal_processing.h" @@ -365,11 +366,11 @@ dll_pll_veml_tracking::dll_pll_veml_tracking( // CN0 estimation and lock detector buffers d_cn0_estimation_counter = 0; - d_Prompt_buffer = new gr_complex[DLL_PLL_CN0_ESTIMATION_SAMPLES]; + d_Prompt_buffer = new gr_complex[FLAGS_cn0_samples]; d_carrier_lock_test = 1.0; d_CN0_SNV_dB_Hz = 0.0; d_carrier_lock_fail_counter = 0; - d_carrier_lock_threshold = DLL_PLL_CARRIER_LOCK_THRESHOLD; + d_carrier_lock_threshold = FLAGS_carrier_lock_th; clear_tracking_vars(); @@ -635,7 +636,7 @@ bool dll_pll_veml_tracking::acquire_secondary() bool dll_pll_veml_tracking::cn0_and_tracking_lock_status() { // ####### CN0 ESTIMATION AND LOCK DETECTORS ###### - if (d_cn0_estimation_counter < DLL_PLL_CN0_ESTIMATION_SAMPLES) + if (d_cn0_estimation_counter < FLAGS_cn0_samples) { // fill buffer with prompt correlator output values d_Prompt_buffer[d_cn0_estimation_counter] = d_P_accu; @@ -646,11 +647,11 @@ bool dll_pll_veml_tracking::cn0_and_tracking_lock_status() { d_cn0_estimation_counter = 0; // Code lock indicator - d_CN0_SNV_dB_Hz = cn0_svn_estimator(d_Prompt_buffer, DLL_PLL_CN0_ESTIMATION_SAMPLES, static_cast(d_fs_in), static_cast(d_code_length_chips)); + d_CN0_SNV_dB_Hz = cn0_svn_estimator(d_Prompt_buffer, FLAGS_cn0_samples, static_cast(d_fs_in), static_cast(d_code_length_chips)); // Carrier lock indicator - d_carrier_lock_test = carrier_lock_detector(d_Prompt_buffer, DLL_PLL_CN0_ESTIMATION_SAMPLES); + d_carrier_lock_test = carrier_lock_detector(d_Prompt_buffer, FLAGS_cn0_samples); // Loss of lock detection - if (d_carrier_lock_test < d_carrier_lock_threshold or d_CN0_SNV_dB_Hz < DLL_PLL_MINIMUM_VALID_CN0) + if (d_carrier_lock_test < d_carrier_lock_threshold or d_CN0_SNV_dB_Hz < FLAGS_cn0_min) { d_carrier_lock_fail_counter++; } @@ -658,7 +659,7 @@ bool dll_pll_veml_tracking::cn0_and_tracking_lock_status() { if (d_carrier_lock_fail_counter > 0) d_carrier_lock_fail_counter--; } - if (d_carrier_lock_fail_counter > DLL_PLL_MAXIMUM_LOCK_FAIL_COUNTER) + if (d_carrier_lock_fail_counter > FLAGS_max_lock_fail) { std::cout << "Loss of lock in channel " << d_channel << "!" << std::endl; LOG(INFO) << "Loss of lock in channel " << d_channel << "!"; @@ -1074,25 +1075,10 @@ int dll_pll_veml_tracking::general_work(int noutput_items __attribute__((unused) d_Prompt_buffer_deque.clear(); d_current_symbol = 0; d_synchonizing = false; - // Set narrow taps delay values [chips] - d_code_loop_filter.set_DLL_BW(d_dll_bw_narrow_hz); - d_carrier_loop_filter.set_PLL_BW(d_pll_bw_narrow_hz); - if (d_veml) - { - d_local_code_shift_chips[0] = -d_very_early_late_spc_narrow_chips * static_cast(d_code_samples_per_chip); - d_local_code_shift_chips[1] = -d_early_late_spc_narrow_chips * static_cast(d_code_samples_per_chip); - d_local_code_shift_chips[3] = d_early_late_spc_narrow_chips * static_cast(d_code_samples_per_chip); - d_local_code_shift_chips[4] = d_very_early_late_spc_narrow_chips * static_cast(d_code_samples_per_chip); - } - else - { - d_local_code_shift_chips[0] = -d_early_late_spc_narrow_chips * static_cast(d_code_samples_per_chip); - d_local_code_shift_chips[2] = d_early_late_spc_narrow_chips * static_cast(d_code_samples_per_chip); - } - // UPDATE INTEGRATION TIME if (d_enable_extended_integration) { + // UPDATE INTEGRATION TIME d_extend_correlation_symbols_count = 0; float new_correlation_time = static_cast(d_extend_correlation_symbols) * static_cast(d_code_period); d_carrier_loop_filter.set_pdi(new_correlation_time); @@ -1104,6 +1090,21 @@ int dll_pll_veml_tracking::general_work(int noutput_items __attribute__((unused) std::cout << "Enabled " << d_extend_correlation_symbols << " [symbols] extended correlator for CH " << d_channel << " : Satellite " << Gnss_Satellite(systemName, d_acquisition_gnss_synchro->PRN) << std::endl; + // Set narrow taps delay values [chips] + d_code_loop_filter.set_DLL_BW(d_dll_bw_narrow_hz); + d_carrier_loop_filter.set_PLL_BW(d_pll_bw_narrow_hz); + if (d_veml) + { + d_local_code_shift_chips[0] = -d_very_early_late_spc_narrow_chips * static_cast(d_code_samples_per_chip); + d_local_code_shift_chips[1] = -d_early_late_spc_narrow_chips * static_cast(d_code_samples_per_chip); + d_local_code_shift_chips[3] = d_early_late_spc_narrow_chips * static_cast(d_code_samples_per_chip); + d_local_code_shift_chips[4] = d_very_early_late_spc_narrow_chips * static_cast(d_code_samples_per_chip); + } + else + { + d_local_code_shift_chips[0] = -d_early_late_spc_narrow_chips * static_cast(d_code_samples_per_chip); + d_local_code_shift_chips[2] = d_early_late_spc_narrow_chips * static_cast(d_code_samples_per_chip); + } } else { diff --git a/src/algorithms/tracking/gnuradio_blocks/dll_pll_veml_tracking.h b/src/algorithms/tracking/gnuradio_blocks/dll_pll_veml_tracking.h index 6d3ddef62..96ee4e288 100755 --- a/src/algorithms/tracking/gnuradio_blocks/dll_pll_veml_tracking.h +++ b/src/algorithms/tracking/gnuradio_blocks/dll_pll_veml_tracking.h @@ -32,11 +32,6 @@ #ifndef GNSS_SDR_DLL_PLL_VEML_TRACKING_H #define GNSS_SDR_DLL_PLL_VEML_TRACKING_H -#define DLL_PLL_CN0_ESTIMATION_SAMPLES 20 -#define DLL_PLL_MINIMUM_VALID_CN0 25 -#define DLL_PLL_MAXIMUM_LOCK_FAIL_COUNTER 50 -#define DLL_PLL_CARRIER_LOCK_THRESHOLD 0.85 - #include "gnss_synchro.h" #include "tracking_2nd_DLL_filter.h" #include "tracking_2nd_PLL_filter.h" From afdad07493cf81d5fed3689ac54c97fd07e77e85 Mon Sep 17 00:00:00 2001 From: Antonio Ramos Date: Tue, 20 Mar 2018 12:30:20 +0100 Subject: [PATCH 47/61] Clean code --- .../galileo_e1_dll_pll_veml_tracking.cc | 6 +++- .../adapters/galileo_e5a_dll_pll_tracking.cc | 4 +++ .../adapters/gps_l1_ca_dll_pll_tracking.cc | 18 +++++++++-- .../adapters/gps_l2_m_dll_pll_tracking.cc | 30 ++++++++----------- .../adapters/gps_l5i_dll_pll_tracking.cc | 4 +++ 5 files changed, 42 insertions(+), 20 deletions(-) diff --git a/src/algorithms/tracking/adapters/galileo_e1_dll_pll_veml_tracking.cc b/src/algorithms/tracking/adapters/galileo_e1_dll_pll_veml_tracking.cc index 3b2331531..92cfaa450 100644 --- a/src/algorithms/tracking/adapters/galileo_e1_dll_pll_veml_tracking.cc +++ b/src/algorithms/tracking/adapters/galileo_e1_dll_pll_veml_tracking.cc @@ -76,7 +76,11 @@ GalileoE1DllPllVemlTracking::GalileoE1DllPllVemlTracking( else if (!track_pilot and extend_correlation_symbols > 1) { extend_correlation_symbols = 1; - std::cout << TEXT_RED << "WARNING: Extended coherent integration is not allowed in Galileo E1 when tracking the data component. Coherent integration has been set to 4 ms (1 symbol)" << TEXT_RESET << std::endl; + std::cout << TEXT_RED << "WARNING: Galileo E1. Extended coherent integration is not allowed when tracking the data component. Coherent integration has been set to 4 ms (1 symbol)" << TEXT_RESET << std::endl; + } + if (pll_bw_narrow_hz > pll_bw_hz or dll_bw_narrow_hz > dll_bw_hz) + { + std::cout << TEXT_RED << "WARNING: Galileo E1. PLL or DLL narrow tracking bandwidth is higher than wide tracking one" << TEXT_RESET << std::endl; } std::string default_dump_filename = "./track_ch"; std::string dump_filename = configuration->property(role + ".dump_filename", default_dump_filename); //unused! diff --git a/src/algorithms/tracking/adapters/galileo_e5a_dll_pll_tracking.cc b/src/algorithms/tracking/adapters/galileo_e5a_dll_pll_tracking.cc index be0030888..ff181cf2d 100644 --- a/src/algorithms/tracking/adapters/galileo_e5a_dll_pll_tracking.cc +++ b/src/algorithms/tracking/adapters/galileo_e5a_dll_pll_tracking.cc @@ -81,6 +81,10 @@ GalileoE5aDllPllTracking::GalileoE5aDllPllTracking( extend_correlation_symbols = Galileo_E5a_I_SECONDARY_CODE_LENGTH; std::cout << TEXT_RED << "WARNING: Galileo E5a. extend_correlation_symbols must be lower than 21 when tracking the data component. Coherent integration has been set to 20 symbols (20 ms)" << TEXT_RESET << std::endl; } + if (pll_bw_narrow_hz > pll_bw_hz or dll_bw_narrow_hz > dll_bw_hz) + { + std::cout << TEXT_RED << "WARNING: Galileo E5a. PLL or DLL narrow tracking bandwidth is higher than wide tracking one" << TEXT_RESET << std::endl; + } //################# MAKE TRACKING GNURadio object ################### if (item_type.compare("gr_complex") == 0) { diff --git a/src/algorithms/tracking/adapters/gps_l1_ca_dll_pll_tracking.cc b/src/algorithms/tracking/adapters/gps_l1_ca_dll_pll_tracking.cc index 8834cfd73..9f0892222 100644 --- a/src/algorithms/tracking/adapters/gps_l1_ca_dll_pll_tracking.cc +++ b/src/algorithms/tracking/adapters/gps_l1_ca_dll_pll_tracking.cc @@ -69,10 +69,24 @@ GpsL1CaDllPllTracking::GpsL1CaDllPllTracking( std::string dump_filename = configuration->property(role + ".dump_filename", default_dump_filename); //unused! int vector_length = std::round(fs_in / (GPS_L1_CA_CODE_RATE_HZ / GPS_L1_CA_CODE_LENGTH_CHIPS)); int symbols_extended_correlator = configuration->property(role + ".extend_correlation_symbols", 1); - if (symbols_extended_correlator < 1 or symbols_extended_correlator > 20) + if (symbols_extended_correlator < 1) { symbols_extended_correlator = 1; - std::cout << TEXT_RED << "WARNING: GPS L1 C/A. extend_correlation_symbols must be between 1 and 20. Coherent integration has been set to 1 symbol (1 ms)" << TEXT_RESET << std::endl; + std::cout << TEXT_RED << "WARNING: GPS L1 C/A. extend_correlation_symbols must be bigger than 1. Coherent integration has been set to 1 symbol (1 ms)" << TEXT_RESET << std::endl; + } + else if (symbols_extended_correlator > 20) + { + symbols_extended_correlator = 20; + std::cout << TEXT_RED << "WARNING: GPS L1 C/A. extend_correlation_symbols must be lower than 21. Coherent integration has been set to 20 symbols (20 ms)" << TEXT_RESET << std::endl; + } + bool track_pilot = configuration->property(role + ".track_pilot", false); + if (track_pilot) + { + std::cout << TEXT_RED << "WARNING: GPS L1 C/A does not have pilot signal. Data tracking has been enabled" << TEXT_RESET << std::endl; + } + if (pll_bw_narrow_hz > pll_bw_hz or dll_bw_narrow_hz > dll_bw_hz) + { + std::cout << TEXT_RED << "WARNING: GPS L1 C/A. PLL or DLL narrow tracking bandwidth is higher than wide tracking one" << TEXT_RESET << std::endl; } //################# MAKE TRACKING GNURadio object ################### if (item_type.compare("gr_complex") == 0) diff --git a/src/algorithms/tracking/adapters/gps_l2_m_dll_pll_tracking.cc b/src/algorithms/tracking/adapters/gps_l2_m_dll_pll_tracking.cc index ac8b6af7a..4180f161f 100644 --- a/src/algorithms/tracking/adapters/gps_l2_m_dll_pll_tracking.cc +++ b/src/algorithms/tracking/adapters/gps_l2_m_dll_pll_tracking.cc @@ -51,34 +51,30 @@ GpsL2MDllPllTracking::GpsL2MDllPllTracking( { DLOG(INFO) << "role " << role; //################# CONFIGURATION PARAMETERS ######################## - int fs_in; - int vector_length; - bool dump; - std::string dump_filename; - std::string item_type; std::string default_item_type = "gr_complex"; - float pll_bw_hz; - float dll_bw_hz; - float early_late_space_chips; - item_type = configuration->property(role + ".item_type", default_item_type); + std::string item_type = configuration->property(role + ".item_type", default_item_type); int fs_in_deprecated = configuration->property("GNSS-SDR.internal_fs_hz", 2048000); - fs_in = configuration->property("GNSS-SDR.internal_fs_sps", fs_in_deprecated); - dump = configuration->property(role + ".dump", false); - pll_bw_hz = configuration->property(role + ".pll_bw_hz", 2.0); + int fs_in = configuration->property("GNSS-SDR.internal_fs_sps", fs_in_deprecated); + bool dump = configuration->property(role + ".dump", false); + float pll_bw_hz = configuration->property(role + ".pll_bw_hz", 2.0); if (FLAGS_pll_bw_hz != 0.0) pll_bw_hz = static_cast(FLAGS_pll_bw_hz); - dll_bw_hz = configuration->property(role + ".dll_bw_hz", 0.75); + float dll_bw_hz = configuration->property(role + ".dll_bw_hz", 0.75); if (FLAGS_dll_bw_hz != 0.0) dll_bw_hz = static_cast(FLAGS_dll_bw_hz); unified_ = configuration->property(role + ".unified", false); - early_late_space_chips = configuration->property(role + ".early_late_space_chips", 0.5); + float early_late_space_chips = configuration->property(role + ".early_late_space_chips", 0.5); std::string default_dump_filename = "./track_ch"; - dump_filename = configuration->property(role + ".dump_filename", - default_dump_filename); //unused! - vector_length = std::round(static_cast(fs_in) / (static_cast(GPS_L2_M_CODE_RATE_HZ) / static_cast(GPS_L2_M_CODE_LENGTH_CHIPS))); + std::string dump_filename = configuration->property(role + ".dump_filename", default_dump_filename); //unused! + int vector_length = std::round(static_cast(fs_in) / (static_cast(GPS_L2_M_CODE_RATE_HZ) / static_cast(GPS_L2_M_CODE_LENGTH_CHIPS))); int symbols_extended_correlator = configuration->property(role + ".extend_correlation_symbols", 1); if (symbols_extended_correlator != 1) { std::cout << TEXT_RED << "WARNING: Extended coherent integration is not allowed in GPS L2. Coherent integration has been set to 20 ms (1 symbol)" << TEXT_RESET << std::endl; } + bool track_pilot = configuration->property(role + ".track_pilot", false); + if (track_pilot) + { + std::cout << TEXT_RED << "WARNING: GPS L2 does not have pilot signal. Data tracking has been enabled" << TEXT_RESET << std::endl; + } //################# MAKE TRACKING GNURadio object ################### if (item_type.compare("gr_complex") == 0) { diff --git a/src/algorithms/tracking/adapters/gps_l5i_dll_pll_tracking.cc b/src/algorithms/tracking/adapters/gps_l5i_dll_pll_tracking.cc index 752c7b1ce..23f8c62a6 100644 --- a/src/algorithms/tracking/adapters/gps_l5i_dll_pll_tracking.cc +++ b/src/algorithms/tracking/adapters/gps_l5i_dll_pll_tracking.cc @@ -80,6 +80,10 @@ GpsL5iDllPllTracking::GpsL5iDllPllTracking( extend_correlation_symbols = GPS_L5i_NH_CODE_LENGTH; std::cout << TEXT_RED << "WARNING: GPS L5. extend_correlation_symbols must be lower than 11 when tracking the data component. Coherent integration has been set to 10 symbols (10 ms)" << TEXT_RESET << std::endl; } + if (pll_bw_narrow_hz > pll_bw_hz or dll_bw_narrow_hz > dll_bw_hz) + { + std::cout << TEXT_RED << "WARNING: GPS L5. PLL or DLL narrow tracking bandwidth is higher than wide tracking one" << TEXT_RESET << std::endl; + } //################# MAKE TRACKING GNURadio object ################### if (item_type.compare("gr_complex") == 0) { From 5a86de623b36207be6698ef3dd8a88960f7990d3 Mon Sep 17 00:00:00 2001 From: Antonio Ramos Date: Tue, 20 Mar 2018 17:24:16 +0100 Subject: [PATCH 48/61] Fix tests --- .../galileo_e1_dll_pll_veml_tracking.cc | 2 +- .../adapters/galileo_e5a_dll_pll_tracking.cc | 2 +- .../adapters/gps_l1_ca_dll_pll_tracking.cc | 2 +- .../adapters/gps_l5i_dll_pll_tracking.cc | 2 +- src/core/system_parameters/rtcm.h | 10 +- .../observables/hybrid_observables_test.cc | 208 +++++++++--------- .../gps_l1_ca_telemetry_decoder_test.cc | 3 +- .../gps_l1_ca_dll_pll_tracking_test.cc | 6 +- 8 files changed, 119 insertions(+), 116 deletions(-) diff --git a/src/algorithms/tracking/adapters/galileo_e1_dll_pll_veml_tracking.cc b/src/algorithms/tracking/adapters/galileo_e1_dll_pll_veml_tracking.cc index 92cfaa450..6c80628f7 100644 --- a/src/algorithms/tracking/adapters/galileo_e1_dll_pll_veml_tracking.cc +++ b/src/algorithms/tracking/adapters/galileo_e1_dll_pll_veml_tracking.cc @@ -78,7 +78,7 @@ GalileoE1DllPllVemlTracking::GalileoE1DllPllVemlTracking( extend_correlation_symbols = 1; std::cout << TEXT_RED << "WARNING: Galileo E1. Extended coherent integration is not allowed when tracking the data component. Coherent integration has been set to 4 ms (1 symbol)" << TEXT_RESET << std::endl; } - if (pll_bw_narrow_hz > pll_bw_hz or dll_bw_narrow_hz > dll_bw_hz) + if ((extend_correlation_symbols > 1) and (pll_bw_narrow_hz > pll_bw_hz or dll_bw_narrow_hz > dll_bw_hz)) { std::cout << TEXT_RED << "WARNING: Galileo E1. PLL or DLL narrow tracking bandwidth is higher than wide tracking one" << TEXT_RESET << std::endl; } diff --git a/src/algorithms/tracking/adapters/galileo_e5a_dll_pll_tracking.cc b/src/algorithms/tracking/adapters/galileo_e5a_dll_pll_tracking.cc index ff181cf2d..816710efc 100644 --- a/src/algorithms/tracking/adapters/galileo_e5a_dll_pll_tracking.cc +++ b/src/algorithms/tracking/adapters/galileo_e5a_dll_pll_tracking.cc @@ -81,7 +81,7 @@ GalileoE5aDllPllTracking::GalileoE5aDllPllTracking( extend_correlation_symbols = Galileo_E5a_I_SECONDARY_CODE_LENGTH; std::cout << TEXT_RED << "WARNING: Galileo E5a. extend_correlation_symbols must be lower than 21 when tracking the data component. Coherent integration has been set to 20 symbols (20 ms)" << TEXT_RESET << std::endl; } - if (pll_bw_narrow_hz > pll_bw_hz or dll_bw_narrow_hz > dll_bw_hz) + if ((extend_correlation_symbols > 1) and (pll_bw_narrow_hz > pll_bw_hz or dll_bw_narrow_hz > dll_bw_hz)) { std::cout << TEXT_RED << "WARNING: Galileo E5a. PLL or DLL narrow tracking bandwidth is higher than wide tracking one" << TEXT_RESET << std::endl; } diff --git a/src/algorithms/tracking/adapters/gps_l1_ca_dll_pll_tracking.cc b/src/algorithms/tracking/adapters/gps_l1_ca_dll_pll_tracking.cc index 9f0892222..5512836da 100644 --- a/src/algorithms/tracking/adapters/gps_l1_ca_dll_pll_tracking.cc +++ b/src/algorithms/tracking/adapters/gps_l1_ca_dll_pll_tracking.cc @@ -84,7 +84,7 @@ GpsL1CaDllPllTracking::GpsL1CaDllPllTracking( { std::cout << TEXT_RED << "WARNING: GPS L1 C/A does not have pilot signal. Data tracking has been enabled" << TEXT_RESET << std::endl; } - if (pll_bw_narrow_hz > pll_bw_hz or dll_bw_narrow_hz > dll_bw_hz) + if ((symbols_extended_correlator > 1) and (pll_bw_narrow_hz > pll_bw_hz or dll_bw_narrow_hz > dll_bw_hz)) { std::cout << TEXT_RED << "WARNING: GPS L1 C/A. PLL or DLL narrow tracking bandwidth is higher than wide tracking one" << TEXT_RESET << std::endl; } diff --git a/src/algorithms/tracking/adapters/gps_l5i_dll_pll_tracking.cc b/src/algorithms/tracking/adapters/gps_l5i_dll_pll_tracking.cc index 23f8c62a6..aa1885fd2 100644 --- a/src/algorithms/tracking/adapters/gps_l5i_dll_pll_tracking.cc +++ b/src/algorithms/tracking/adapters/gps_l5i_dll_pll_tracking.cc @@ -80,7 +80,7 @@ GpsL5iDllPllTracking::GpsL5iDllPllTracking( extend_correlation_symbols = GPS_L5i_NH_CODE_LENGTH; std::cout << TEXT_RED << "WARNING: GPS L5. extend_correlation_symbols must be lower than 11 when tracking the data component. Coherent integration has been set to 10 symbols (10 ms)" << TEXT_RESET << std::endl; } - if (pll_bw_narrow_hz > pll_bw_hz or dll_bw_narrow_hz > dll_bw_hz) + if ((extend_correlation_symbols > 1) and (pll_bw_narrow_hz > pll_bw_hz or dll_bw_narrow_hz > dll_bw_hz)) { std::cout << TEXT_RED << "WARNING: GPS L5. PLL or DLL narrow tracking bandwidth is higher than wide tracking one" << TEXT_RESET << std::endl; } diff --git a/src/core/system_parameters/rtcm.h b/src/core/system_parameters/rtcm.h index d4ac17460..434038e21 100644 --- a/src/core/system_parameters/rtcm.h +++ b/src/core/system_parameters/rtcm.h @@ -641,7 +641,6 @@ private: { public: Rtcm_Session(boost::asio::ip::tcp::socket socket, Rtcm_Listener_Room& room) : socket_(std::move(socket)), room_(room) {} - inline void start() { room_.join(shared_from_this()); @@ -665,12 +664,13 @@ private: boost::asio::async_read(socket_, boost::asio::buffer(read_msg_.data(), Rtcm_Message::header_length), [this, self](boost::system::error_code ec, std::size_t /*length*/) { - if (!ec && read_msg_.decode_header()) + if (!ec and read_msg_.decode_header()) { do_read_message_body(); } - else if (!ec && !read_msg_.decode_header()) + else if (!ec and !read_msg_.decode_header()) { + /* TODO: The commented code throws an exception. Solve it! client_says += read_msg_.data(); bool first = true; while (client_says.length() >= 80) @@ -683,6 +683,7 @@ private: std::cout << client_says.substr(0, 80) << std::endl; client_says = client_says.substr(80, client_says.length() - 80); } + */ do_read_message_header(); } else @@ -719,8 +720,7 @@ private: { auto self(shared_from_this()); boost::asio::async_write(socket_, - boost::asio::buffer(write_msgs_.front().body(), - write_msgs_.front().body_length()), + boost::asio::buffer(write_msgs_.front().body(), write_msgs_.front().body_length()), [this, self](boost::system::error_code ec, std::size_t /*length*/) { if (!ec) { diff --git a/src/tests/unit-tests/signal-processing-blocks/observables/hybrid_observables_test.cc b/src/tests/unit-tests/signal-processing-blocks/observables/hybrid_observables_test.cc index 17c140cda..5b5c9ff12 100644 --- a/src/tests/unit-tests/signal-processing-blocks/observables/hybrid_observables_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/observables/hybrid_observables_test.cc @@ -184,17 +184,17 @@ public: int configure_generator(); int generate_signal(); void check_results_carrier_phase( - arma::mat& true_ch0, - arma::mat& true_ch1, - arma::vec& true_tow_s, - arma::mat& measured_ch0, - arma::mat& measured_ch1); + arma::mat& true_ch0, + arma::mat& true_ch1, + arma::vec& true_tow_s, + arma::mat& measured_ch0, + arma::mat& measured_ch1); void check_results_code_psudorange( - arma::mat& true_ch0, - arma::mat& true_ch1, - arma::vec& true_tow_s, - arma::mat& measured_ch0, - arma::mat& measured_ch1); + arma::mat& true_ch0, + arma::mat& true_ch1, + arma::vec& true_tow_s, + arma::mat& measured_ch0, + arma::mat& measured_ch1); HybridObservablesTest() { @@ -281,23 +281,23 @@ void HybridObservablesTest::configure_receiver() // Set Tracking config->set_property("Tracking_1C.item_type", "gr_complex"); - config->set_property("Tracking_1C.if", "0"); config->set_property("Tracking_1C.dump", "true"); config->set_property("Tracking_1C.dump_filename", "./tracking_ch_"); config->set_property("Tracking_1C.pll_bw_hz", "35.0"); config->set_property("Tracking_1C.dll_bw_hz", "0.5"); config->set_property("Tracking_1C.early_late_space_chips", "0.5"); + config->set_property("Tracking_1C.unified", "true"); config->set_property("TelemetryDecoder_1C.dump", "true"); config->set_property("Observables.dump", "true"); } void HybridObservablesTest::check_results_carrier_phase( - arma::mat& true_ch0, - arma::mat& true_ch1, - arma::vec& true_tow_s, - arma::mat& measured_ch0, - arma::mat& measured_ch1) + arma::mat& true_ch0, + arma::mat& true_ch1, + arma::vec& true_tow_s, + arma::mat& measured_ch0, + arma::mat& measured_ch1) { //1. True value interpolation to match the measurement times @@ -358,12 +358,12 @@ void HybridObservablesTest::check_results_carrier_phase( << " [cycles]" << std::endl; std::cout.precision(ss); - ASSERT_LT(rmse_ch0, 5e-2); - ASSERT_LT(error_mean_ch0, 5e-2); + ASSERT_LT(rmse_ch0, 5e-2); + ASSERT_LT(error_mean_ch0, 5e-2); ASSERT_GT(error_mean_ch0, -5e-2); - ASSERT_LT(error_var_ch0, 5e-2); - ASSERT_LT(max_error_ch0, 5e-2); - ASSERT_GT(min_error_ch0, -5e-2); + ASSERT_LT(error_var_ch0, 5e-2); + ASSERT_LT(max_error_ch0, 5e-2); + ASSERT_GT(min_error_ch0, -5e-2); //5. report ss = std::cout.precision(); @@ -375,21 +375,21 @@ void HybridObservablesTest::check_results_carrier_phase( << " [cycles]" << std::endl; std::cout.precision(ss); - ASSERT_LT(rmse_ch1, 5e-2); - ASSERT_LT(error_mean_ch1, 5e-2); + ASSERT_LT(rmse_ch1, 5e-2); + ASSERT_LT(error_mean_ch1, 5e-2); ASSERT_GT(error_mean_ch1, -5e-2); - ASSERT_LT(error_var_ch1, 5e-2); - ASSERT_LT(max_error_ch1, 5e-2); - ASSERT_GT(min_error_ch1, -5e-2); + ASSERT_LT(error_var_ch1, 5e-2); + ASSERT_LT(max_error_ch1, 5e-2); + ASSERT_GT(min_error_ch1, -5e-2); } void HybridObservablesTest::check_results_code_psudorange( - arma::mat& true_ch0, - arma::mat& true_ch1, - arma::vec& true_tow_s, - arma::mat& measured_ch0, - arma::mat& measured_ch1) + arma::mat& true_ch0, + arma::mat& true_ch1, + arma::vec& true_tow_s, + arma::mat& measured_ch0, + arma::mat& measured_ch1) { //1. True value interpolation to match the measurement times @@ -438,12 +438,12 @@ void HybridObservablesTest::check_results_code_psudorange( << " [meters]" << std::endl; std::cout.precision(ss); - ASSERT_LT(rmse, 0.5); - ASSERT_LT(error_mean, 0.5); + ASSERT_LT(rmse, 0.5); + ASSERT_LT(error_mean, 0.5); ASSERT_GT(error_mean, -0.5); - ASSERT_LT(error_var, 0.5); - ASSERT_LT(max_error, 2.0); - ASSERT_GT(min_error, -2.0); + ASSERT_LT(error_var, 0.5); + ASSERT_LT(max_error, 2.0); + ASSERT_GT(min_error, -2.0); } @@ -543,7 +543,7 @@ TEST_F(HybridObservablesTest, ValidationOfResults) boost::shared_ptr tlm_msg_rx_ch2 = HybridObservablesTest_tlm_msg_rx_make(); //Observables - std::shared_ptr observables(new HybridObservables(config.get(), "Observables",3, 2)); + std::shared_ptr observables(new HybridObservables(config.get(), "Observables", 3, 2)); ASSERT_NO_THROW({ tracking_ch0->set_channel(gnss_synchro_ch0.Channel_ID); @@ -604,10 +604,10 @@ TEST_F(HybridObservablesTest, ValidationOfResults) true_observables_reader true_observables; ASSERT_NO_THROW({ - if(true_observables.open_obs_file(std::string("./obs_out.bin")) == false) - { - throw std::exception(); - } + if (true_observables.open_obs_file(std::string("./obs_out.bin")) == false) + { + throw std::exception(); + } }) << "Failure opening true observables file"; unsigned int nepoch = static_cast(true_observables.num_epochs()); @@ -620,27 +620,27 @@ TEST_F(HybridObservablesTest, ValidationOfResults) true_observables.restart(); long int epoch_counter = 0; ASSERT_NO_THROW({ - while(true_observables.read_binary_obs()) - { - if(round(true_observables.prn[0]) != gnss_synchro_ch0.PRN) - { - std::cout << "True observables SV PRN does not match " << round(true_observables.prn[1]) << std::endl; - throw std::exception(); - } - if(round(true_observables.prn[1]) != gnss_synchro_ch1.PRN) - { - std::cout << "True observables SV PRN does not match " << round(true_observables.prn[1]) << std::endl; - throw std::exception(); - } - true_ch0(epoch_counter, 0) = true_observables.gps_time_sec[0]; - true_ch0(epoch_counter, 1) = true_observables.dist_m[0]; - true_ch0(epoch_counter, 2) = true_observables.doppler_l1_hz[0]; - true_ch0(epoch_counter, 3) = true_observables.acc_carrier_phase_l1_cycles[0]; + while (true_observables.read_binary_obs()) + { + if (round(true_observables.prn[0]) != gnss_synchro_ch0.PRN) + { + std::cout << "True observables SV PRN does not match " << round(true_observables.prn[1]) << std::endl; + throw std::exception(); + } + if (round(true_observables.prn[1]) != gnss_synchro_ch1.PRN) + { + std::cout << "True observables SV PRN does not match " << round(true_observables.prn[1]) << std::endl; + throw std::exception(); + } + true_ch0(epoch_counter, 0) = true_observables.gps_time_sec[0]; + true_ch0(epoch_counter, 1) = true_observables.dist_m[0]; + true_ch0(epoch_counter, 2) = true_observables.doppler_l1_hz[0]; + true_ch0(epoch_counter, 3) = true_observables.acc_carrier_phase_l1_cycles[0]; - true_ch1(epoch_counter, 0) = true_observables.gps_time_sec[1]; - true_ch1(epoch_counter, 1) = true_observables.dist_m[1]; - true_ch1(epoch_counter, 2) = true_observables.doppler_l1_hz[1]; - true_ch1(epoch_counter, 3) = true_observables.acc_carrier_phase_l1_cycles[1]; + true_ch1(epoch_counter, 0) = true_observables.gps_time_sec[1]; + true_ch1(epoch_counter, 1) = true_observables.dist_m[1]; + true_ch1(epoch_counter, 2) = true_observables.doppler_l1_hz[1]; + true_ch1(epoch_counter, 3) = true_observables.acc_carrier_phase_l1_cycles[1]; epoch_counter++; } @@ -649,10 +649,10 @@ TEST_F(HybridObservablesTest, ValidationOfResults) //read measured values observables_dump_reader estimated_observables(2); //two channels ASSERT_NO_THROW({ - if(estimated_observables.open_obs_file(std::string("./observables.dat")) == false) - { - throw std::exception(); - } + if (estimated_observables.open_obs_file(std::string("./observables.dat")) == false) + { + throw std::exception(); + } }) << "Failure opening dump observables file"; nepoch = static_cast(estimated_observables.num_epochs()); @@ -665,43 +665,51 @@ TEST_F(HybridObservablesTest, ValidationOfResults) estimated_observables.restart(); epoch_counter = 0; long int epoch_counter2 = 0; - while(estimated_observables.read_binary_obs()) - { - if(static_cast(estimated_observables.valid[0])) + while (estimated_observables.read_binary_obs()) { - measured_ch0(epoch_counter, 0) = estimated_observables.RX_time[0]; - measured_ch0(epoch_counter, 1) = estimated_observables.TOW_at_current_symbol_s[0]; - measured_ch0(epoch_counter, 2) = estimated_observables.Carrier_Doppler_hz[0]; - measured_ch0(epoch_counter, 3) = estimated_observables.Acc_carrier_phase_hz[0]; - measured_ch0(epoch_counter, 4) = estimated_observables.Pseudorange_m[0]; - epoch_counter++; + if (static_cast(estimated_observables.valid[0])) + { + measured_ch0(epoch_counter, 0) = estimated_observables.RX_time[0]; + measured_ch0(epoch_counter, 1) = estimated_observables.TOW_at_current_symbol_s[0]; + measured_ch0(epoch_counter, 2) = estimated_observables.Carrier_Doppler_hz[0]; + measured_ch0(epoch_counter, 3) = estimated_observables.Acc_carrier_phase_hz[0]; + measured_ch0(epoch_counter, 4) = estimated_observables.Pseudorange_m[0]; + epoch_counter++; + } + if (static_cast(estimated_observables.valid[1])) + { + measured_ch1(epoch_counter2, 0) = estimated_observables.RX_time[1]; + measured_ch1(epoch_counter2, 1) = estimated_observables.TOW_at_current_symbol_s[1]; + measured_ch1(epoch_counter2, 2) = estimated_observables.Carrier_Doppler_hz[1]; + measured_ch1(epoch_counter2, 3) = estimated_observables.Acc_carrier_phase_hz[1]; + measured_ch1(epoch_counter2, 4) = estimated_observables.Pseudorange_m[1]; + epoch_counter2++; + } } - if(static_cast(estimated_observables.valid[1])) - { - measured_ch1(epoch_counter2, 0) = estimated_observables.RX_time[1]; - measured_ch1(epoch_counter2, 1) = estimated_observables.TOW_at_current_symbol_s[1]; - measured_ch1(epoch_counter2, 2) = estimated_observables.Carrier_Doppler_hz[1]; - measured_ch1(epoch_counter2, 3) = estimated_observables.Acc_carrier_phase_hz[1]; - measured_ch1(epoch_counter2, 4) = estimated_observables.Pseudorange_m[1]; - epoch_counter2++; - } - } //Cut measurement tail zeros arma::uvec index = arma::find(measured_ch0.col(0) > 0.0, 1, "last"); - if((index.size() > 0) and index(0) < (nepoch - 1)) - { measured_ch0.shed_rows(index(0) + 1, nepoch - 1); } + if ((index.size() > 0) and index(0) < (nepoch - 1)) + { + measured_ch0.shed_rows(index(0) + 1, nepoch - 1); + } index = arma::find(measured_ch1.col(0) > 0.0, 1, "last"); - if((index.size() > 0) and index(0) < (nepoch - 1)) - { measured_ch1.shed_rows(index(0) + 1, nepoch - 1); } + if ((index.size() > 0) and index(0) < (nepoch - 1)) + { + measured_ch1.shed_rows(index(0) + 1, nepoch - 1); + } //Cut measurement initial transitory of the measurements index = arma::find(measured_ch0.col(0) >= true_ch0(0, 0), 1, "first"); - if((index.size() > 0) and (index(0) > 0)) - { measured_ch0.shed_rows(0, index(0)); } + if ((index.size() > 0) and (index(0) > 0)) + { + measured_ch0.shed_rows(0, index(0)); + } index = arma::find(measured_ch1.col(0) >= true_ch1(0, 0), 1, "first"); - if((index.size() > 0) and (index(0) > 0)) - { measured_ch1.shed_rows(0, index(0)); } + if ((index.size() > 0) and (index(0) > 0)) + { + measured_ch1.shed_rows(0, index(0)); + } //Correct the clock error using true values (it is not possible for a receiver to correct //the receiver clock offset error at the observables level because it is required the @@ -709,14 +717,14 @@ TEST_F(HybridObservablesTest, ValidationOfResults) //Find the reference satellite (the nearest) and compute the receiver time offset at observable level arma::vec receiver_time_offset_s; - if(measured_ch0(0, 4) < measured_ch1(0, 4)) - { - receiver_time_offset_s = true_ch0.col(1) / GPS_C_m_s - GPS_STARTOFFSET_ms / 1000.0; - } + if (measured_ch0(0, 4) < measured_ch1(0, 4)) + { + receiver_time_offset_s = true_ch0.col(1) / GPS_C_m_s - GPS_STARTOFFSET_ms / 1000.0; + } else - { - receiver_time_offset_s = true_ch1.col(1) / GPS_C_m_s - GPS_STARTOFFSET_ms / 1000.0; - } + { + receiver_time_offset_s = true_ch1.col(1) / GPS_C_m_s - GPS_STARTOFFSET_ms / 1000.0; + } arma::vec corrected_reference_TOW_s = true_ch0.col(0) - receiver_time_offset_s; std::cout << "Receiver time offset: " << receiver_time_offset_s(0) * 1e3 << " [ms]" << std::endl; @@ -724,5 +732,5 @@ TEST_F(HybridObservablesTest, ValidationOfResults) check_results_code_psudorange(true_ch0, true_ch1, corrected_reference_TOW_s, measured_ch0, measured_ch1); check_results_carrier_phase(true_ch0, true_ch1, corrected_reference_TOW_s, measured_ch0, measured_ch1); - std::cout << "Test completed in " << elapsed_seconds.count() << " [s]" << std::endl; + std::cout << "Test completed in " << elapsed_seconds.count() << " [s]" << std::endl; } diff --git a/src/tests/unit-tests/signal-processing-blocks/telemetry_decoder/gps_l1_ca_telemetry_decoder_test.cc b/src/tests/unit-tests/signal-processing-blocks/telemetry_decoder/gps_l1_ca_telemetry_decoder_test.cc index 340e472e5..ddeeda281 100644 --- a/src/tests/unit-tests/signal-processing-blocks/telemetry_decoder/gps_l1_ca_telemetry_decoder_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/telemetry_decoder/gps_l1_ca_telemetry_decoder_test.cc @@ -265,13 +265,12 @@ void GpsL1CATelemetryDecoderTest::configure_receiver() // Set Tracking config->set_property("Tracking_1C.item_type", "gr_complex"); - config->set_property("Tracking_1C.if", "0"); config->set_property("Tracking_1C.dump", "true"); config->set_property("Tracking_1C.dump_filename", "./tracking_ch_"); config->set_property("Tracking_1C.pll_bw_hz", "20.0"); config->set_property("Tracking_1C.dll_bw_hz", "1.5"); config->set_property("Tracking_1C.early_late_space_chips", "0.5"); - + config->set_property("Tracking_1C.unified", "true"); config->set_property("TelemetryDecoder_1C.dump", "true"); } diff --git a/src/tests/unit-tests/signal-processing-blocks/tracking/gps_l1_ca_dll_pll_tracking_test.cc b/src/tests/unit-tests/signal-processing-blocks/tracking/gps_l1_ca_dll_pll_tracking_test.cc index 7ed7741da..f9357d4fd 100644 --- a/src/tests/unit-tests/signal-processing-blocks/tracking/gps_l1_ca_dll_pll_tracking_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/tracking/gps_l1_ca_dll_pll_tracking_test.cc @@ -225,11 +225,7 @@ void GpsL1CADllPllTrackingTest::configure_receiver() config->set_property("Tracking_1C.pll_bw_hz", "20.0"); config->set_property("Tracking_1C.dll_bw_hz", "2.0"); config->set_property("Tracking_1C.early_late_space_chips", "0.5"); - config->set_property("Tracking_1C.pll_bw_narrow_hz", "20.0"); - config->set_property("Tracking_1C.dll_bw_narrow_hz", "2.0"); - config->set_property("Tracking_1C.early_late_space_narrow_chips", "0.5"); config->set_property("Tracking_1C.unified", "true"); - config->set_property("Tracking_1C.extend_correlation_ms", "1"); config->set_property("Tracking_1C.dump", "true"); config->set_property("Tracking_1C.dump_filename", "./tracking_ch_"); } @@ -395,7 +391,7 @@ TEST_F(GpsL1CADllPllTrackingTest, ValidationOfResults) true_obs_data.restart(); std::cout << "Initial Doppler [Hz]=" << true_obs_data.doppler_l1_hz << " Initial code delay [Chips]=" << true_obs_data.prn_delay_chips << std::endl; - gnss_synchro.Acq_delay_samples = (GPS_L1_CA_CODE_LENGTH_CHIPS - true_obs_data.prn_delay_chips / GPS_L1_CA_CODE_LENGTH_CHIPS) * baseband_sampling_freq * GPS_L1_CA_CODE_PERIOD; + gnss_synchro.Acq_delay_samples = (GPS_L1_CA_CODE_LENGTH_CHIPS - true_obs_data.prn_delay_chips / GPS_L1_CA_CODE_LENGTH_CHIPS) * static_cast(baseband_sampling_freq) * GPS_L1_CA_CODE_PERIOD; gnss_synchro.Acq_doppler_hz = true_obs_data.doppler_l1_hz; gnss_synchro.Acq_samplestamp_samples = 0; From 583e74be644d971a70f5a0e15d3b7790960ae3a5 Mon Sep 17 00:00:00 2001 From: Antonio Ramos Date: Fri, 23 Mar 2018 15:27:31 +0100 Subject: [PATCH 49/61] Fix test --- .../gps_l1_ca_telemetry_decoder_test.cc | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/tests/unit-tests/signal-processing-blocks/telemetry_decoder/gps_l1_ca_telemetry_decoder_test.cc b/src/tests/unit-tests/signal-processing-blocks/telemetry_decoder/gps_l1_ca_telemetry_decoder_test.cc index ddeeda281..bececcd16 100644 --- a/src/tests/unit-tests/signal-processing-blocks/telemetry_decoder/gps_l1_ca_telemetry_decoder_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/telemetry_decoder/gps_l1_ca_telemetry_decoder_test.cc @@ -292,9 +292,9 @@ void GpsL1CATelemetryDecoderTest::check_results(arma::vec& true_time_s, arma::interp1(true_time_s, true_value, meas_time_s, true_value_interp); //2. RMSE - arma::vec err; + //arma::vec err = meas_value - true_value_interp + 0.001; + arma::vec err = meas_value - true_value_interp - 0.001; - err = meas_value - true_value_interp + 0.001; arma::vec err2 = arma::square(err); double rmse = sqrt(arma::mean(err2)); @@ -316,10 +316,10 @@ void GpsL1CATelemetryDecoderTest::check_results(arma::vec& true_time_s, << " [Seconds]" << std::endl; std::cout.precision(ss); - ASSERT_LT(rmse, 0.2E-6); - ASSERT_LT(error_mean, 0.2E-6); - ASSERT_GT(error_mean, -0.2E-6); - ASSERT_LT(error_var, 0.2E-6); + ASSERT_LT(rmse, 0.3E-6); + ASSERT_LT(error_mean, 0.3E-6); + ASSERT_GT(error_mean, -0.3E-6); + ASSERT_LT(error_var, 0.3E-6); ASSERT_LT(max_error, 0.5E-6); ASSERT_GT(min_error, -0.5E-6); } From a2e40eca95ad20aa3f276d0f76c8c3ffe7ae1b84 Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Thu, 29 Mar 2018 17:53:25 +0200 Subject: [PATCH 50/61] Make all tracking blocks to save the same data structure --- .../galileo_e1_tcp_connector_tracking_cc.cc | 60 ++++++++--------- ...glonass_l1_ca_dll_pll_c_aid_tracking_cc.cc | 53 ++++++++------- ...glonass_l1_ca_dll_pll_c_aid_tracking_sc.cc | 58 +++++++++-------- .../glonass_l1_ca_dll_pll_tracking_cc.cc | 51 ++++++++------- ...glonass_l2_ca_dll_pll_c_aid_tracking_cc.cc | 53 ++++++++------- ...glonass_l2_ca_dll_pll_c_aid_tracking_sc.cc | 58 +++++++++-------- .../glonass_l2_ca_dll_pll_tracking_cc.cc | 51 ++++++++------- .../gps_l1_ca_dll_pll_c_aid_tracking_cc.cc | 52 ++++++++------- ...ps_l1_ca_dll_pll_c_aid_tracking_fpga_sc.cc | 58 +++++++++-------- .../gps_l1_ca_dll_pll_c_aid_tracking_sc.cc | 58 +++++++++-------- .../gps_l1_ca_dll_pll_tracking_gpu_cc.cc | 52 ++++++++------- .../gps_l1_ca_tcp_connector_tracking_cc.cc | 65 ++++++++++--------- 12 files changed, 366 insertions(+), 303 deletions(-) diff --git a/src/algorithms/tracking/gnuradio_blocks/galileo_e1_tcp_connector_tracking_cc.cc b/src/algorithms/tracking/gnuradio_blocks/galileo_e1_tcp_connector_tracking_cc.cc index b8c70db8f..e028893ca 100644 --- a/src/algorithms/tracking/gnuradio_blocks/galileo_e1_tcp_connector_tracking_cc.cc +++ b/src/algorithms/tracking/gnuradio_blocks/galileo_e1_tcp_connector_tracking_cc.cc @@ -443,21 +443,18 @@ int Galileo_E1_Tcp_Connector_Tracking_cc::general_work(int noutput_items __attri // MULTIPLEXED FILE RECORDING - Record results to file float prompt_I; float prompt_Q; - float tmp_VE, tmp_E, tmp_P, tmp_L, tmp_VL; + float tmp_E, tmp_P, tmp_L; + float tmp_VE = 0.0; + float tmp_VL = 0.0; float tmp_float; - tmp_float = 0; - double tmp_double; - prompt_I = (*d_Prompt).real(); - prompt_Q = (*d_Prompt).imag(); - tmp_VE = std::abs(*d_Very_Early); - tmp_E = std::abs(*d_Early); - tmp_P = std::abs(*d_Prompt); - tmp_L = std::abs(*d_Late); - tmp_VL = std::abs(*d_Very_Late); - + prompt_I = d_correlator_outs[1].real(); + prompt_Q = d_correlator_outs[1].imag(); + tmp_E = std::abs(d_correlator_outs[0]); + tmp_P = std::abs(d_correlator_outs[1]); + tmp_L = std::abs(d_correlator_outs[2]); try { - // EPR + // Dump correlators output d_dump_file.write(reinterpret_cast(&tmp_VE), sizeof(float)); d_dump_file.write(reinterpret_cast(&tmp_E), sizeof(float)); d_dump_file.write(reinterpret_cast(&tmp_P), sizeof(float)); @@ -469,30 +466,33 @@ int Galileo_E1_Tcp_Connector_Tracking_cc::general_work(int noutput_items __attri // PRN start sample stamp d_dump_file.write(reinterpret_cast(&d_sample_counter), sizeof(unsigned long int)); // accumulated carrier phase - d_dump_file.write(reinterpret_cast(&d_acc_carrier_phase_rad), sizeof(float)); - + tmp_float = d_acc_carrier_phase_rad; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); // carrier and code frequency - d_dump_file.write(reinterpret_cast(&d_carrier_doppler_hz), sizeof(float)); - d_dump_file.write(reinterpret_cast(&d_code_freq_chips), sizeof(float)); - - //PLL commands + tmp_float = d_carrier_doppler_hz; d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); - d_dump_file.write(reinterpret_cast(&carr_error_filt_hz), sizeof(float)); - - //DLL commands + tmp_float = d_code_freq_chips; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); + // PLL commands + tmp_float = 0.0; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); + tmp_float = carr_error_filt_hz; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); + // DLL commands + tmp_float = 0.0; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); + tmp_float = code_error_filt_chips; d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); - d_dump_file.write(reinterpret_cast(&code_error_filt_chips), sizeof(float)); - // CN0 and carrier lock test - d_dump_file.write(reinterpret_cast(&d_CN0_SNV_dB_Hz), sizeof(float)); - d_dump_file.write(reinterpret_cast(&d_carrier_lock_test), sizeof(float)); - - // AUX vars (for debug purposes) - tmp_float = d_rem_code_phase_samples; + tmp_float = d_CN0_SNV_dB_Hz; d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); - tmp_double = static_cast(d_sample_counter + d_current_prn_length_samples); + tmp_float = d_carrier_lock_test; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); + // AUX vars (for debug purposes) + tmp_float = 0.0; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); + double tmp_double = static_cast(d_sample_counter + d_correlation_length_samples); d_dump_file.write(reinterpret_cast(&tmp_double), sizeof(double)); - // PRN unsigned int prn_ = d_acquisition_gnss_synchro->PRN; d_dump_file.write(reinterpret_cast(&prn_), sizeof(unsigned int)); diff --git a/src/algorithms/tracking/gnuradio_blocks/glonass_l1_ca_dll_pll_c_aid_tracking_cc.cc b/src/algorithms/tracking/gnuradio_blocks/glonass_l1_ca_dll_pll_c_aid_tracking_cc.cc index cbc8c4cf1..df57be51e 100644 --- a/src/algorithms/tracking/gnuradio_blocks/glonass_l1_ca_dll_pll_c_aid_tracking_cc.cc +++ b/src/algorithms/tracking/gnuradio_blocks/glonass_l1_ca_dll_pll_c_aid_tracking_cc.cc @@ -831,7 +831,9 @@ int glonass_l1_ca_dll_pll_c_aid_tracking_cc::general_work(int noutput_items __at float prompt_I; float prompt_Q; float tmp_E, tmp_P, tmp_L; - double tmp_double; + float tmp_VE = 0.0; + float tmp_VL = 0.0; + float tmp_float; prompt_I = d_correlator_outs[1].real(); prompt_Q = d_correlator_outs[1].imag(); tmp_E = std::abs(d_correlator_outs[0]); @@ -839,42 +841,45 @@ int glonass_l1_ca_dll_pll_c_aid_tracking_cc::general_work(int noutput_items __at tmp_L = std::abs(d_correlator_outs[2]); try { - // EPR + // Dump correlators output + d_dump_file.write(reinterpret_cast(&tmp_VE), sizeof(float)); d_dump_file.write(reinterpret_cast(&tmp_E), sizeof(float)); d_dump_file.write(reinterpret_cast(&tmp_P), sizeof(float)); d_dump_file.write(reinterpret_cast(&tmp_L), sizeof(float)); + d_dump_file.write(reinterpret_cast(&tmp_VL), sizeof(float)); // PROMPT I and Q (to analyze navigation symbols) d_dump_file.write(reinterpret_cast(&prompt_I), sizeof(float)); d_dump_file.write(reinterpret_cast(&prompt_Q), sizeof(float)); // PRN start sample stamp - //tmp_float=(float)d_sample_counter; d_dump_file.write(reinterpret_cast(&d_sample_counter), sizeof(unsigned long int)); // accumulated carrier phase - d_dump_file.write(reinterpret_cast(&d_acc_carrier_phase_cycles), sizeof(double)); - + tmp_float = d_acc_carrier_phase_cycles * GLONASS_TWO_PI; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); // carrier and code frequency - double if_freq_carrier = d_carrier_doppler_hz + d_if_freq + (DFRQ1_GLO * static_cast(GLONASS_PRN.at(d_acquisition_gnss_synchro->PRN))); - d_dump_file.write(reinterpret_cast(&if_freq_carrier), sizeof(double)); - d_dump_file.write(reinterpret_cast(&d_code_freq_chips), sizeof(double)); - - //PLL commands - d_dump_file.write(reinterpret_cast(&d_carr_phase_error_secs_Ti), sizeof(double)); - d_dump_file.write(reinterpret_cast(&d_carrier_doppler_hz), sizeof(double)); - - //DLL commands - d_dump_file.write(reinterpret_cast(&d_code_error_chips_Ti), sizeof(double)); - d_dump_file.write(reinterpret_cast(&d_code_error_filt_chips_Ti), sizeof(double)); - + tmp_float = d_carrier_doppler_hz; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); + tmp_float = d_code_freq_chips; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); + // PLL commands + tmp_float = 1.0 / (d_carr_phase_error_secs_Ti * CURRENT_INTEGRATION_TIME_S); + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); + tmp_float = 1.0 / (d_code_error_filt_chips_Ti * CURRENT_INTEGRATION_TIME_S); + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); + // DLL commands + tmp_float = d_code_error_chips_Ti * CURRENT_INTEGRATION_TIME_S; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); + tmp_float = d_code_error_filt_chips_Ti; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); // CN0 and carrier lock test - d_dump_file.write(reinterpret_cast(&d_CN0_SNV_dB_Hz), sizeof(double)); - d_dump_file.write(reinterpret_cast(&d_carrier_lock_test), sizeof(double)); - + tmp_float = d_CN0_SNV_dB_Hz; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); + tmp_float = d_carrier_lock_test; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); // AUX vars (for debug purposes) - tmp_double = d_code_error_chips_Ti * CURRENT_INTEGRATION_TIME_S; + tmp_float = d_code_error_chips_Ti * CURRENT_INTEGRATION_TIME_S; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); + double tmp_double = static_cast(d_sample_counter + d_correlation_length_samples); d_dump_file.write(reinterpret_cast(&tmp_double), sizeof(double)); - tmp_double = static_cast(d_sample_counter + d_correlation_length_samples); - d_dump_file.write(reinterpret_cast(&tmp_double), sizeof(double)); - // PRN unsigned int prn_ = d_acquisition_gnss_synchro->PRN; d_dump_file.write(reinterpret_cast(&prn_), sizeof(unsigned int)); diff --git a/src/algorithms/tracking/gnuradio_blocks/glonass_l1_ca_dll_pll_c_aid_tracking_sc.cc b/src/algorithms/tracking/gnuradio_blocks/glonass_l1_ca_dll_pll_c_aid_tracking_sc.cc index 48fe205b6..313756921 100644 --- a/src/algorithms/tracking/gnuradio_blocks/glonass_l1_ca_dll_pll_c_aid_tracking_sc.cc +++ b/src/algorithms/tracking/gnuradio_blocks/glonass_l1_ca_dll_pll_c_aid_tracking_sc.cc @@ -822,49 +822,55 @@ int glonass_l1_ca_dll_pll_c_aid_tracking_sc::general_work(int noutput_items __at float prompt_I; float prompt_Q; float tmp_E, tmp_P, tmp_L; - double tmp_double; + float tmp_VE = 0.0; + float tmp_VL = 0.0; + float tmp_float; prompt_I = d_correlator_outs_16sc[1].real(); prompt_Q = d_correlator_outs_16sc[1].imag(); - tmp_E = std::abs(std::complex(d_correlator_outs_16sc[0].real(), d_correlator_outs_16sc[0].imag())); - tmp_P = std::abs(std::complex(d_correlator_outs_16sc[1].real(), d_correlator_outs_16sc[1].imag())); - tmp_L = std::abs(std::complex(d_correlator_outs_16sc[2].real(), d_correlator_outs_16sc[2].imag())); + tmp_E = std::abs(gr_complex(d_correlator_outs_16sc[0].real(), d_correlator_outs_16sc[0].imag())); + tmp_P = std::abs(gr_complex(d_correlator_outs_16sc[1].real(), d_correlator_outs_16sc[1].imag())); + tmp_L = std::abs(gr_complex(d_correlator_outs_16sc[2].real(), d_correlator_outs_16sc[2].imag())); try { - // EPR + // Dump correlators output + d_dump_file.write(reinterpret_cast(&tmp_VE), sizeof(float)); d_dump_file.write(reinterpret_cast(&tmp_E), sizeof(float)); d_dump_file.write(reinterpret_cast(&tmp_P), sizeof(float)); d_dump_file.write(reinterpret_cast(&tmp_L), sizeof(float)); + d_dump_file.write(reinterpret_cast(&tmp_VL), sizeof(float)); // PROMPT I and Q (to analyze navigation symbols) d_dump_file.write(reinterpret_cast(&prompt_I), sizeof(float)); d_dump_file.write(reinterpret_cast(&prompt_Q), sizeof(float)); // PRN start sample stamp - //tmp_float=(float)d_sample_counter; d_dump_file.write(reinterpret_cast(&d_sample_counter), sizeof(unsigned long int)); // accumulated carrier phase - d_dump_file.write(reinterpret_cast(&d_acc_carrier_phase_cycles), sizeof(double)); - + tmp_float = d_acc_carrier_phase_cycles * GLONASS_TWO_PI; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); // carrier and code frequency - d_dump_file.write(reinterpret_cast(&d_carrier_doppler_hz), sizeof(double)); - d_dump_file.write(reinterpret_cast(&d_code_freq_chips), sizeof(double)); - - //PLL commands - d_dump_file.write(reinterpret_cast(&d_carr_phase_error_secs_Ti), sizeof(double)); - d_dump_file.write(reinterpret_cast(&d_carrier_doppler_hz), sizeof(double)); - - //DLL commands - d_dump_file.write(reinterpret_cast(&d_code_error_chips_Ti), sizeof(double)); - d_dump_file.write(reinterpret_cast(&d_code_error_filt_chips_Ti), sizeof(double)); - + tmp_float = d_carrier_doppler_hz; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); + tmp_float = d_code_freq_chips; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); + // PLL commands + tmp_float = 1.0 / (d_carr_phase_error_secs_Ti * CURRENT_INTEGRATION_TIME_S); + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); + tmp_float = 1.0 / (d_code_error_filt_chips_Ti * CURRENT_INTEGRATION_TIME_S); + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); + // DLL commands + tmp_float = d_code_error_chips_Ti * CURRENT_INTEGRATION_TIME_S; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); + tmp_float = d_code_error_filt_chips_Ti; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); // CN0 and carrier lock test - d_dump_file.write(reinterpret_cast(&d_CN0_SNV_dB_Hz), sizeof(double)); - d_dump_file.write(reinterpret_cast(&d_carrier_lock_test), sizeof(double)); - + tmp_float = d_CN0_SNV_dB_Hz; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); + tmp_float = d_carrier_lock_test; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); // AUX vars (for debug purposes) - tmp_double = d_code_error_chips_Ti * CURRENT_INTEGRATION_TIME_S; + tmp_float = d_code_error_chips_Ti * CURRENT_INTEGRATION_TIME_S; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); + double tmp_double = static_cast(d_sample_counter + d_correlation_length_samples); d_dump_file.write(reinterpret_cast(&tmp_double), sizeof(double)); - tmp_double = static_cast(d_sample_counter + d_correlation_length_samples); - d_dump_file.write(reinterpret_cast(&tmp_double), sizeof(double)); - // PRN unsigned int prn_ = d_acquisition_gnss_synchro->PRN; d_dump_file.write(reinterpret_cast(&prn_), sizeof(unsigned int)); diff --git a/src/algorithms/tracking/gnuradio_blocks/glonass_l1_ca_dll_pll_tracking_cc.cc b/src/algorithms/tracking/gnuradio_blocks/glonass_l1_ca_dll_pll_tracking_cc.cc index e72fafeff..d35b6159c 100644 --- a/src/algorithms/tracking/gnuradio_blocks/glonass_l1_ca_dll_pll_tracking_cc.cc +++ b/src/algorithms/tracking/gnuradio_blocks/glonass_l1_ca_dll_pll_tracking_cc.cc @@ -675,8 +675,9 @@ int Glonass_L1_Ca_Dll_Pll_Tracking_cc::general_work(int noutput_items __attribut float prompt_I; float prompt_Q; float tmp_E, tmp_P, tmp_L; - double tmp_double; - unsigned long int tmp_long; + float tmp_float; + float tmp_VE = 0.0; + float tmp_VL = 0.0; prompt_I = d_correlator_outs[1].real(); prompt_Q = d_correlator_outs[1].imag(); tmp_E = std::abs(d_correlator_outs[0]); @@ -684,41 +685,45 @@ int Glonass_L1_Ca_Dll_Pll_Tracking_cc::general_work(int noutput_items __attribut tmp_L = std::abs(d_correlator_outs[2]); try { - // EPR + // Dump correlators output + d_dump_file.write(reinterpret_cast(&tmp_VE), sizeof(float)); d_dump_file.write(reinterpret_cast(&tmp_E), sizeof(float)); d_dump_file.write(reinterpret_cast(&tmp_P), sizeof(float)); d_dump_file.write(reinterpret_cast(&tmp_L), sizeof(float)); + d_dump_file.write(reinterpret_cast(&tmp_VL), sizeof(float)); // PROMPT I and Q (to analyze navigation symbols) d_dump_file.write(reinterpret_cast(&prompt_I), sizeof(float)); d_dump_file.write(reinterpret_cast(&prompt_Q), sizeof(float)); // PRN start sample stamp - tmp_long = d_sample_counter + d_current_prn_length_samples; - d_dump_file.write(reinterpret_cast(&tmp_long), sizeof(unsigned long int)); + d_dump_file.write(reinterpret_cast(&d_sample_counter), sizeof(unsigned long int)); // accumulated carrier phase - d_dump_file.write(reinterpret_cast(&d_acc_carrier_phase_rad), sizeof(double)); - + tmp_float = d_acc_carrier_phase_rad; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); // carrier and code frequency - d_dump_file.write(reinterpret_cast(&d_carrier_frequency_hz), sizeof(double)); - d_dump_file.write(reinterpret_cast(&d_code_freq_chips), sizeof(double)); - + tmp_float = d_carrier_doppler_hz; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); + tmp_float = d_code_freq_chips; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); // PLL commands - d_dump_file.write(reinterpret_cast(&carr_error_hz), sizeof(double)); - d_dump_file.write(reinterpret_cast(&carr_error_filt_hz), sizeof(double)); - + tmp_float = carr_error_hz; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); + tmp_float = carr_error_filt_hz; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); // DLL commands - d_dump_file.write(reinterpret_cast(&code_error_chips), sizeof(double)); - d_dump_file.write(reinterpret_cast(&code_error_filt_chips), sizeof(double)); - + tmp_float = code_error_chips; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); + tmp_float = code_error_filt_chips; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); // CN0 and carrier lock test - d_dump_file.write(reinterpret_cast(&d_CN0_SNV_dB_Hz), sizeof(double)); - d_dump_file.write(reinterpret_cast(&d_carrier_lock_test), sizeof(double)); - + tmp_float = d_CN0_SNV_dB_Hz; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); + tmp_float = d_carrier_lock_test; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); // AUX vars (for debug purposes) - tmp_double = d_rem_code_phase_samples; + tmp_float = d_rem_code_phase_samples; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); + double tmp_double = static_cast(d_sample_counter + d_current_prn_length_samples); d_dump_file.write(reinterpret_cast(&tmp_double), sizeof(double)); - tmp_double = static_cast(d_sample_counter); - d_dump_file.write(reinterpret_cast(&tmp_double), sizeof(double)); - // PRN unsigned int prn_ = d_acquisition_gnss_synchro->PRN; d_dump_file.write(reinterpret_cast(&prn_), sizeof(unsigned int)); diff --git a/src/algorithms/tracking/gnuradio_blocks/glonass_l2_ca_dll_pll_c_aid_tracking_cc.cc b/src/algorithms/tracking/gnuradio_blocks/glonass_l2_ca_dll_pll_c_aid_tracking_cc.cc index d49fcd5a2..53f8f704b 100644 --- a/src/algorithms/tracking/gnuradio_blocks/glonass_l2_ca_dll_pll_c_aid_tracking_cc.cc +++ b/src/algorithms/tracking/gnuradio_blocks/glonass_l2_ca_dll_pll_c_aid_tracking_cc.cc @@ -828,7 +828,9 @@ int glonass_l2_ca_dll_pll_c_aid_tracking_cc::general_work(int noutput_items __at float prompt_I; float prompt_Q; float tmp_E, tmp_P, tmp_L; - double tmp_double; + float tmp_VE = 0.0; + float tmp_VL = 0.0; + float tmp_float; prompt_I = d_correlator_outs[1].real(); prompt_Q = d_correlator_outs[1].imag(); tmp_E = std::abs(d_correlator_outs[0]); @@ -836,42 +838,45 @@ int glonass_l2_ca_dll_pll_c_aid_tracking_cc::general_work(int noutput_items __at tmp_L = std::abs(d_correlator_outs[2]); try { - // EPR + // Dump correlators output + d_dump_file.write(reinterpret_cast(&tmp_VE), sizeof(float)); d_dump_file.write(reinterpret_cast(&tmp_E), sizeof(float)); d_dump_file.write(reinterpret_cast(&tmp_P), sizeof(float)); d_dump_file.write(reinterpret_cast(&tmp_L), sizeof(float)); + d_dump_file.write(reinterpret_cast(&tmp_VL), sizeof(float)); // PROMPT I and Q (to analyze navigation symbols) d_dump_file.write(reinterpret_cast(&prompt_I), sizeof(float)); d_dump_file.write(reinterpret_cast(&prompt_Q), sizeof(float)); // PRN start sample stamp - //tmp_float=(float)d_sample_counter; d_dump_file.write(reinterpret_cast(&d_sample_counter), sizeof(unsigned long int)); // accumulated carrier phase - d_dump_file.write(reinterpret_cast(&d_acc_carrier_phase_cycles), sizeof(double)); - + tmp_float = d_acc_carrier_phase_cycles * GLONASS_TWO_PI; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); // carrier and code frequency - double if_freq_carrier = d_carrier_doppler_hz + d_if_freq + (DFRQ2_GLO * static_cast(GLONASS_PRN.at(d_acquisition_gnss_synchro->PRN))); - d_dump_file.write(reinterpret_cast(&if_freq_carrier), sizeof(double)); - d_dump_file.write(reinterpret_cast(&d_code_freq_chips), sizeof(double)); - - //PLL commands - d_dump_file.write(reinterpret_cast(&d_carr_phase_error_secs_Ti), sizeof(double)); - d_dump_file.write(reinterpret_cast(&d_carrier_doppler_hz), sizeof(double)); - - //DLL commands - d_dump_file.write(reinterpret_cast(&d_code_error_chips_Ti), sizeof(double)); - d_dump_file.write(reinterpret_cast(&d_code_error_filt_chips_Ti), sizeof(double)); - + tmp_float = d_carrier_doppler_hz; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); + tmp_float = d_code_freq_chips; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); + // PLL commands + tmp_float = 1.0 / (d_carr_phase_error_secs_Ti * CURRENT_INTEGRATION_TIME_S); + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); + tmp_float = 1.0 / (d_code_error_filt_chips_Ti * CURRENT_INTEGRATION_TIME_S); + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); + // DLL commands + tmp_float = d_code_error_chips_Ti * CURRENT_INTEGRATION_TIME_S; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); + tmp_float = d_code_error_filt_chips_Ti; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); // CN0 and carrier lock test - d_dump_file.write(reinterpret_cast(&d_CN0_SNV_dB_Hz), sizeof(double)); - d_dump_file.write(reinterpret_cast(&d_carrier_lock_test), sizeof(double)); - + tmp_float = d_CN0_SNV_dB_Hz; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); + tmp_float = d_carrier_lock_test; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); // AUX vars (for debug purposes) - tmp_double = d_code_error_chips_Ti * CURRENT_INTEGRATION_TIME_S; + tmp_float = d_code_error_chips_Ti * CURRENT_INTEGRATION_TIME_S; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); + double tmp_double = static_cast(d_sample_counter + d_correlation_length_samples); d_dump_file.write(reinterpret_cast(&tmp_double), sizeof(double)); - tmp_double = static_cast(d_sample_counter + d_correlation_length_samples); - d_dump_file.write(reinterpret_cast(&tmp_double), sizeof(double)); - // PRN unsigned int prn_ = d_acquisition_gnss_synchro->PRN; d_dump_file.write(reinterpret_cast(&prn_), sizeof(unsigned int)); diff --git a/src/algorithms/tracking/gnuradio_blocks/glonass_l2_ca_dll_pll_c_aid_tracking_sc.cc b/src/algorithms/tracking/gnuradio_blocks/glonass_l2_ca_dll_pll_c_aid_tracking_sc.cc index 9e96f5e39..decc5d5ca 100644 --- a/src/algorithms/tracking/gnuradio_blocks/glonass_l2_ca_dll_pll_c_aid_tracking_sc.cc +++ b/src/algorithms/tracking/gnuradio_blocks/glonass_l2_ca_dll_pll_c_aid_tracking_sc.cc @@ -820,49 +820,55 @@ int glonass_l2_ca_dll_pll_c_aid_tracking_sc::general_work(int noutput_items __at float prompt_I; float prompt_Q; float tmp_E, tmp_P, tmp_L; - double tmp_double; + float tmp_VE = 0.0; + float tmp_VL = 0.0; + float tmp_float; prompt_I = d_correlator_outs_16sc[1].real(); prompt_Q = d_correlator_outs_16sc[1].imag(); - tmp_E = std::abs(std::complex(d_correlator_outs_16sc[0].real(), d_correlator_outs_16sc[0].imag())); - tmp_P = std::abs(std::complex(d_correlator_outs_16sc[1].real(), d_correlator_outs_16sc[1].imag())); - tmp_L = std::abs(std::complex(d_correlator_outs_16sc[2].real(), d_correlator_outs_16sc[2].imag())); + tmp_E = std::abs(gr_complex(d_correlator_outs_16sc[0].real(), d_correlator_outs_16sc[0].imag())); + tmp_P = std::abs(gr_complex(d_correlator_outs_16sc[1].real(), d_correlator_outs_16sc[1].imag())); + tmp_L = std::abs(gr_complex(d_correlator_outs_16sc[2].real(), d_correlator_outs_16sc[2].imag())); try { - // EPR + // Dump correlators output + d_dump_file.write(reinterpret_cast(&tmp_VE), sizeof(float)); d_dump_file.write(reinterpret_cast(&tmp_E), sizeof(float)); d_dump_file.write(reinterpret_cast(&tmp_P), sizeof(float)); d_dump_file.write(reinterpret_cast(&tmp_L), sizeof(float)); + d_dump_file.write(reinterpret_cast(&tmp_VL), sizeof(float)); // PROMPT I and Q (to analyze navigation symbols) d_dump_file.write(reinterpret_cast(&prompt_I), sizeof(float)); d_dump_file.write(reinterpret_cast(&prompt_Q), sizeof(float)); // PRN start sample stamp - //tmp_float=(float)d_sample_counter; d_dump_file.write(reinterpret_cast(&d_sample_counter), sizeof(unsigned long int)); // accumulated carrier phase - d_dump_file.write(reinterpret_cast(&d_acc_carrier_phase_cycles), sizeof(double)); - + tmp_float = d_acc_carrier_phase_cycles * GLONASS_TWO_PI; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); // carrier and code frequency - d_dump_file.write(reinterpret_cast(&d_carrier_doppler_hz), sizeof(double)); - d_dump_file.write(reinterpret_cast(&d_code_freq_chips), sizeof(double)); - - //PLL commands - d_dump_file.write(reinterpret_cast(&d_carr_phase_error_secs_Ti), sizeof(double)); - d_dump_file.write(reinterpret_cast(&d_carrier_doppler_hz), sizeof(double)); - - //DLL commands - d_dump_file.write(reinterpret_cast(&d_code_error_chips_Ti), sizeof(double)); - d_dump_file.write(reinterpret_cast(&d_code_error_filt_chips_Ti), sizeof(double)); - + tmp_float = d_carrier_doppler_hz; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); + tmp_float = d_code_freq_chips; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); + // PLL commands + tmp_float = 1.0 / (d_carr_phase_error_secs_Ti * CURRENT_INTEGRATION_TIME_S); + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); + tmp_float = 1.0 / (d_code_error_filt_chips_Ti * CURRENT_INTEGRATION_TIME_S); + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); + // DLL commands + tmp_float = d_code_error_chips_Ti * CURRENT_INTEGRATION_TIME_S; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); + tmp_float = d_code_error_filt_chips_Ti; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); // CN0 and carrier lock test - d_dump_file.write(reinterpret_cast(&d_CN0_SNV_dB_Hz), sizeof(double)); - d_dump_file.write(reinterpret_cast(&d_carrier_lock_test), sizeof(double)); - + tmp_float = d_CN0_SNV_dB_Hz; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); + tmp_float = d_carrier_lock_test; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); // AUX vars (for debug purposes) - tmp_double = d_code_error_chips_Ti * CURRENT_INTEGRATION_TIME_S; + tmp_float = d_code_error_chips_Ti * CURRENT_INTEGRATION_TIME_S; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); + double tmp_double = static_cast(d_sample_counter + d_correlation_length_samples); d_dump_file.write(reinterpret_cast(&tmp_double), sizeof(double)); - tmp_double = static_cast(d_sample_counter + d_correlation_length_samples); - d_dump_file.write(reinterpret_cast(&tmp_double), sizeof(double)); - // PRN unsigned int prn_ = d_acquisition_gnss_synchro->PRN; d_dump_file.write(reinterpret_cast(&prn_), sizeof(unsigned int)); diff --git a/src/algorithms/tracking/gnuradio_blocks/glonass_l2_ca_dll_pll_tracking_cc.cc b/src/algorithms/tracking/gnuradio_blocks/glonass_l2_ca_dll_pll_tracking_cc.cc index 166c60574..f6428bc5c 100644 --- a/src/algorithms/tracking/gnuradio_blocks/glonass_l2_ca_dll_pll_tracking_cc.cc +++ b/src/algorithms/tracking/gnuradio_blocks/glonass_l2_ca_dll_pll_tracking_cc.cc @@ -675,8 +675,9 @@ int Glonass_L2_Ca_Dll_Pll_Tracking_cc::general_work(int noutput_items __attribut float prompt_I; float prompt_Q; float tmp_E, tmp_P, tmp_L; - double tmp_double; - unsigned long int tmp_long; + float tmp_float; + float tmp_VE = 0.0; + float tmp_VL = 0.0; prompt_I = d_correlator_outs[1].real(); prompt_Q = d_correlator_outs[1].imag(); tmp_E = std::abs(d_correlator_outs[0]); @@ -684,41 +685,45 @@ int Glonass_L2_Ca_Dll_Pll_Tracking_cc::general_work(int noutput_items __attribut tmp_L = std::abs(d_correlator_outs[2]); try { - // EPR + // Dump correlators output + d_dump_file.write(reinterpret_cast(&tmp_VE), sizeof(float)); d_dump_file.write(reinterpret_cast(&tmp_E), sizeof(float)); d_dump_file.write(reinterpret_cast(&tmp_P), sizeof(float)); d_dump_file.write(reinterpret_cast(&tmp_L), sizeof(float)); + d_dump_file.write(reinterpret_cast(&tmp_VL), sizeof(float)); // PROMPT I and Q (to analyze navigation symbols) d_dump_file.write(reinterpret_cast(&prompt_I), sizeof(float)); d_dump_file.write(reinterpret_cast(&prompt_Q), sizeof(float)); // PRN start sample stamp - tmp_long = d_sample_counter + d_current_prn_length_samples; - d_dump_file.write(reinterpret_cast(&tmp_long), sizeof(unsigned long int)); + d_dump_file.write(reinterpret_cast(&d_sample_counter), sizeof(unsigned long int)); // accumulated carrier phase - d_dump_file.write(reinterpret_cast(&d_acc_carrier_phase_rad), sizeof(double)); - + tmp_float = d_acc_carrier_phase_rad; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); // carrier and code frequency - d_dump_file.write(reinterpret_cast(&d_carrier_frequency_hz), sizeof(double)); - d_dump_file.write(reinterpret_cast(&d_code_freq_chips), sizeof(double)); - + tmp_float = d_carrier_doppler_hz; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); + tmp_float = d_code_freq_chips; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); // PLL commands - d_dump_file.write(reinterpret_cast(&carr_error_hz), sizeof(double)); - d_dump_file.write(reinterpret_cast(&carr_error_filt_hz), sizeof(double)); - + tmp_float = carr_error_hz; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); + tmp_float = carr_error_filt_hz; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); // DLL commands - d_dump_file.write(reinterpret_cast(&code_error_chips), sizeof(double)); - d_dump_file.write(reinterpret_cast(&code_error_filt_chips), sizeof(double)); - + tmp_float = code_error_chips; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); + tmp_float = code_error_filt_chips; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); // CN0 and carrier lock test - d_dump_file.write(reinterpret_cast(&d_CN0_SNV_dB_Hz), sizeof(double)); - d_dump_file.write(reinterpret_cast(&d_carrier_lock_test), sizeof(double)); - + tmp_float = d_CN0_SNV_dB_Hz; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); + tmp_float = d_carrier_lock_test; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); // AUX vars (for debug purposes) - tmp_double = d_rem_code_phase_samples; + tmp_float = d_rem_code_phase_samples; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); + double tmp_double = static_cast(d_sample_counter + d_current_prn_length_samples); d_dump_file.write(reinterpret_cast(&tmp_double), sizeof(double)); - tmp_double = static_cast(d_sample_counter); - d_dump_file.write(reinterpret_cast(&tmp_double), sizeof(double)); - // PRN unsigned int prn_ = d_acquisition_gnss_synchro->PRN; d_dump_file.write(reinterpret_cast(&prn_), sizeof(unsigned int)); diff --git a/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_c_aid_tracking_cc.cc b/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_c_aid_tracking_cc.cc index 703ef118d..c242a10b8 100644 --- a/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_c_aid_tracking_cc.cc +++ b/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_c_aid_tracking_cc.cc @@ -810,7 +810,9 @@ int gps_l1_ca_dll_pll_c_aid_tracking_cc::general_work(int noutput_items __attrib float prompt_I; float prompt_Q; float tmp_E, tmp_P, tmp_L; - double tmp_double; + float tmp_VE = 0.0; + float tmp_VL = 0.0; + float tmp_float; prompt_I = d_correlator_outs[1].real(); prompt_Q = d_correlator_outs[1].imag(); tmp_E = std::abs(d_correlator_outs[0]); @@ -818,41 +820,45 @@ int gps_l1_ca_dll_pll_c_aid_tracking_cc::general_work(int noutput_items __attrib tmp_L = std::abs(d_correlator_outs[2]); try { - // EPR + // Dump correlators output + d_dump_file.write(reinterpret_cast(&tmp_VE), sizeof(float)); d_dump_file.write(reinterpret_cast(&tmp_E), sizeof(float)); d_dump_file.write(reinterpret_cast(&tmp_P), sizeof(float)); d_dump_file.write(reinterpret_cast(&tmp_L), sizeof(float)); + d_dump_file.write(reinterpret_cast(&tmp_VL), sizeof(float)); // PROMPT I and Q (to analyze navigation symbols) d_dump_file.write(reinterpret_cast(&prompt_I), sizeof(float)); d_dump_file.write(reinterpret_cast(&prompt_Q), sizeof(float)); // PRN start sample stamp - //tmp_float=(float)d_sample_counter; d_dump_file.write(reinterpret_cast(&d_sample_counter), sizeof(unsigned long int)); // accumulated carrier phase - d_dump_file.write(reinterpret_cast(&d_acc_carrier_phase_cycles), sizeof(double)); - + tmp_float = d_acc_carrier_phase_cycles * GPS_TWO_PI; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); // carrier and code frequency - d_dump_file.write(reinterpret_cast(&d_carrier_doppler_hz), sizeof(double)); - d_dump_file.write(reinterpret_cast(&d_code_freq_chips), sizeof(double)); - - //PLL commands - d_dump_file.write(reinterpret_cast(&d_carr_phase_error_secs_Ti), sizeof(double)); - d_dump_file.write(reinterpret_cast(&d_carrier_doppler_hz), sizeof(double)); - - //DLL commands - d_dump_file.write(reinterpret_cast(&d_code_error_chips_Ti), sizeof(double)); - d_dump_file.write(reinterpret_cast(&d_code_error_filt_chips_Ti), sizeof(double)); - + tmp_float = d_carrier_doppler_hz; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); + tmp_float = d_code_freq_chips; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); + // PLL commands + tmp_float = 1.0 / (d_carr_phase_error_secs_Ti * CURRENT_INTEGRATION_TIME_S); + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); + tmp_float = 1.0 / (d_code_error_filt_chips_Ti * CURRENT_INTEGRATION_TIME_S);; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); + // DLL commands + tmp_float = d_code_error_chips_Ti * CURRENT_INTEGRATION_TIME_S; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); + tmp_float = d_code_error_filt_chips_Ti; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); // CN0 and carrier lock test - d_dump_file.write(reinterpret_cast(&d_CN0_SNV_dB_Hz), sizeof(double)); - d_dump_file.write(reinterpret_cast(&d_carrier_lock_test), sizeof(double)); - + tmp_float = d_CN0_SNV_dB_Hz; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); + tmp_float = d_carrier_lock_test; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); // AUX vars (for debug purposes) - tmp_double = d_code_error_chips_Ti * CURRENT_INTEGRATION_TIME_S; + tmp_float = d_code_error_chips_Ti * CURRENT_INTEGRATION_TIME_S; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); + double tmp_double = static_cast(d_sample_counter + d_correlation_length_samples); d_dump_file.write(reinterpret_cast(&tmp_double), sizeof(double)); - tmp_double = static_cast(d_sample_counter + d_correlation_length_samples); - d_dump_file.write(reinterpret_cast(&tmp_double), sizeof(double)); - // PRN unsigned int prn_ = d_acquisition_gnss_synchro->PRN; d_dump_file.write(reinterpret_cast(&prn_), sizeof(unsigned int)); diff --git a/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_c_aid_tracking_fpga_sc.cc b/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_c_aid_tracking_fpga_sc.cc index 42509b2de..1d1561a21 100644 --- a/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_c_aid_tracking_fpga_sc.cc +++ b/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_c_aid_tracking_fpga_sc.cc @@ -632,49 +632,55 @@ int gps_l1_ca_dll_pll_c_aid_tracking_fpga_sc::general_work( float prompt_I; float prompt_Q; float tmp_E, tmp_P, tmp_L; - double tmp_double; + float tmp_VE = 0.0; + float tmp_VL = 0.0; + float tmp_float; prompt_I = d_correlator_outs_16sc[1].real(); prompt_Q = d_correlator_outs_16sc[1].imag(); - tmp_E = std::abs(std::complex(d_correlator_outs_16sc[0].real(), d_correlator_outs_16sc[0].imag())); - tmp_P = std::abs(std::complex(d_correlator_outs_16sc[1].real(), d_correlator_outs_16sc[1].imag())); - tmp_L = std::abs(std::complex(d_correlator_outs_16sc[2].real(), d_correlator_outs_16sc[2].imag())); + tmp_E = std::abs(gr_complex(d_correlator_outs_16sc[0].real(), d_correlator_outs_16sc[0].imag())); + tmp_P = std::abs(gr_complex(d_correlator_outs_16sc[1].real(), d_correlator_outs_16sc[1].imag())); + tmp_L = std::abs(gr_complex(d_correlator_outs_16sc[2].real(), d_correlator_outs_16sc[2].imag())); try { - // EPR + // Dump correlators output + d_dump_file.write(reinterpret_cast(&tmp_VE), sizeof(float)); d_dump_file.write(reinterpret_cast(&tmp_E), sizeof(float)); d_dump_file.write(reinterpret_cast(&tmp_P), sizeof(float)); d_dump_file.write(reinterpret_cast(&tmp_L), sizeof(float)); + d_dump_file.write(reinterpret_cast(&tmp_VL), sizeof(float)); // PROMPT I and Q (to analyze navigation symbols) d_dump_file.write(reinterpret_cast(&prompt_I), sizeof(float)); d_dump_file.write(reinterpret_cast(&prompt_Q), sizeof(float)); // PRN start sample stamp - //tmp_float=(float)d_sample_counter; d_dump_file.write(reinterpret_cast(&d_sample_counter), sizeof(unsigned long int)); // accumulated carrier phase - d_dump_file.write(reinterpret_cast(&d_acc_carrier_phase_cycles), sizeof(double)); - + tmp_float = d_acc_carrier_phase_cycles * GPS_TWO_PI; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); // carrier and code frequency - d_dump_file.write(reinterpret_cast(&d_carrier_doppler_hz), sizeof(double)); - d_dump_file.write(reinterpret_cast(&d_code_freq_chips), sizeof(double)); - - //PLL commands - d_dump_file.write(reinterpret_cast(&d_carr_phase_error_secs_Ti), sizeof(double)); - d_dump_file.write(reinterpret_cast(&d_carrier_doppler_hz), sizeof(double)); - - //DLL commands - d_dump_file.write(reinterpret_cast(&d_code_error_chips_Ti), sizeof(double)); - d_dump_file.write(reinterpret_cast(&d_code_error_filt_chips_Ti), sizeof(double)); - + tmp_float = d_carrier_doppler_hz; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); + tmp_float = d_code_freq_chips; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); + // PLL commands + tmp_float = 1.0 / (d_carr_phase_error_secs_Ti * CURRENT_INTEGRATION_TIME_S); + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); + tmp_float = 1.0 / (d_code_error_filt_chips_Ti * CURRENT_INTEGRATION_TIME_S); + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); + // DLL commands + tmp_float = d_code_error_chips_Ti * CURRENT_INTEGRATION_TIME_S; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); + tmp_float = d_code_error_filt_chips_Ti; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); // CN0 and carrier lock test - d_dump_file.write(reinterpret_cast(&d_CN0_SNV_dB_Hz), sizeof(double)); - d_dump_file.write(reinterpret_cast(&d_carrier_lock_test), sizeof(double)); - + tmp_float = d_CN0_SNV_dB_Hz; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); + tmp_float = d_carrier_lock_test; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); // AUX vars (for debug purposes) - tmp_double = d_code_error_chips_Ti * CURRENT_INTEGRATION_TIME_S; + tmp_float = d_code_error_chips_Ti * CURRENT_INTEGRATION_TIME_S; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); + double tmp_double = static_cast(d_sample_counter + d_correlation_length_samples); d_dump_file.write(reinterpret_cast(&tmp_double), sizeof(double)); - tmp_double = static_cast(d_sample_counter + d_correlation_length_samples); - d_dump_file.write(reinterpret_cast(&tmp_double), sizeof(double)); - // PRN unsigned int prn_ = d_acquisition_gnss_synchro->PRN; d_dump_file.write(reinterpret_cast(&prn_), sizeof(unsigned int)); diff --git a/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_c_aid_tracking_sc.cc b/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_c_aid_tracking_sc.cc index aa26a24f4..9a4332f06 100644 --- a/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_c_aid_tracking_sc.cc +++ b/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_c_aid_tracking_sc.cc @@ -812,49 +812,55 @@ int gps_l1_ca_dll_pll_c_aid_tracking_sc::general_work(int noutput_items __attrib float prompt_I; float prompt_Q; float tmp_E, tmp_P, tmp_L; - double tmp_double; + float tmp_VE = 0.0; + float tmp_VL = 0.0; + float tmp_float; prompt_I = d_correlator_outs_16sc[1].real(); prompt_Q = d_correlator_outs_16sc[1].imag(); - tmp_E = std::abs(std::complex(d_correlator_outs_16sc[0].real(), d_correlator_outs_16sc[0].imag())); - tmp_P = std::abs(std::complex(d_correlator_outs_16sc[1].real(), d_correlator_outs_16sc[1].imag())); - tmp_L = std::abs(std::complex(d_correlator_outs_16sc[2].real(), d_correlator_outs_16sc[2].imag())); + tmp_E = std::abs(gr_complex(d_correlator_outs_16sc[0].real(), d_correlator_outs_16sc[0].imag())); + tmp_P = std::abs(gr_complex(d_correlator_outs_16sc[1].real(), d_correlator_outs_16sc[1].imag())); + tmp_L = std::abs(gr_complex(d_correlator_outs_16sc[2].real(), d_correlator_outs_16sc[2].imag())); try { - // EPR + // Dump correlators output + d_dump_file.write(reinterpret_cast(&tmp_VE), sizeof(float)); d_dump_file.write(reinterpret_cast(&tmp_E), sizeof(float)); d_dump_file.write(reinterpret_cast(&tmp_P), sizeof(float)); d_dump_file.write(reinterpret_cast(&tmp_L), sizeof(float)); + d_dump_file.write(reinterpret_cast(&tmp_VL), sizeof(float)); // PROMPT I and Q (to analyze navigation symbols) d_dump_file.write(reinterpret_cast(&prompt_I), sizeof(float)); d_dump_file.write(reinterpret_cast(&prompt_Q), sizeof(float)); // PRN start sample stamp - //tmp_float=(float)d_sample_counter; d_dump_file.write(reinterpret_cast(&d_sample_counter), sizeof(unsigned long int)); // accumulated carrier phase - d_dump_file.write(reinterpret_cast(&d_acc_carrier_phase_cycles), sizeof(double)); - + tmp_float = d_acc_carrier_phase_cycles * GPS_TWO_PI; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); // carrier and code frequency - d_dump_file.write(reinterpret_cast(&d_carrier_doppler_hz), sizeof(double)); - d_dump_file.write(reinterpret_cast(&d_code_freq_chips), sizeof(double)); - - //PLL commands - d_dump_file.write(reinterpret_cast(&d_carr_phase_error_secs_Ti), sizeof(double)); - d_dump_file.write(reinterpret_cast(&d_carrier_doppler_hz), sizeof(double)); - - //DLL commands - d_dump_file.write(reinterpret_cast(&d_code_error_chips_Ti), sizeof(double)); - d_dump_file.write(reinterpret_cast(&d_code_error_filt_chips_Ti), sizeof(double)); - + tmp_float = d_carrier_doppler_hz; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); + tmp_float = d_code_freq_chips; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); + // PLL commands + tmp_float = 1.0 / (d_carr_phase_error_secs_Ti * CURRENT_INTEGRATION_TIME_S); + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); + tmp_float = 1.0 / (d_code_error_filt_chips_Ti * CURRENT_INTEGRATION_TIME_S); + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); + // DLL commands + tmp_float = d_code_error_chips_Ti * CURRENT_INTEGRATION_TIME_S; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); + tmp_float = d_code_error_filt_chips_Ti; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); // CN0 and carrier lock test - d_dump_file.write(reinterpret_cast(&d_CN0_SNV_dB_Hz), sizeof(double)); - d_dump_file.write(reinterpret_cast(&d_carrier_lock_test), sizeof(double)); - + tmp_float = d_CN0_SNV_dB_Hz; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); + tmp_float = d_carrier_lock_test; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); // AUX vars (for debug purposes) - tmp_double = d_code_error_chips_Ti * CURRENT_INTEGRATION_TIME_S; + tmp_float = d_code_error_chips_Ti * CURRENT_INTEGRATION_TIME_S; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); + double tmp_double = static_cast(d_sample_counter + d_correlation_length_samples); d_dump_file.write(reinterpret_cast(&tmp_double), sizeof(double)); - tmp_double = static_cast(d_sample_counter + d_correlation_length_samples); - d_dump_file.write(reinterpret_cast(&tmp_double), sizeof(double)); - // PRN unsigned int prn_ = d_acquisition_gnss_synchro->PRN; d_dump_file.write(reinterpret_cast(&prn_), sizeof(unsigned int)); diff --git a/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_tracking_gpu_cc.cc b/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_tracking_gpu_cc.cc index bdbf2771b..759128d0b 100644 --- a/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_tracking_gpu_cc.cc +++ b/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_tracking_gpu_cc.cc @@ -468,7 +468,9 @@ int Gps_L1_Ca_Dll_Pll_Tracking_GPU_cc::general_work(int noutput_items __attribut float prompt_I; float prompt_Q; float tmp_E, tmp_P, tmp_L; - double tmp_double; + float tmp_VE = 0.0; + float tmp_VL = 0.0; + float tmp_float; prompt_I = d_correlator_outs[1].real(); prompt_Q = d_correlator_outs[1].imag(); tmp_E = std::abs(d_correlator_outs[0]); @@ -476,41 +478,45 @@ int Gps_L1_Ca_Dll_Pll_Tracking_GPU_cc::general_work(int noutput_items __attribut tmp_L = std::abs(d_correlator_outs[2]); try { - // EPR + // Dump correlators output + d_dump_file.write(reinterpret_cast(&tmp_VE), sizeof(float)); d_dump_file.write(reinterpret_cast(&tmp_E), sizeof(float)); d_dump_file.write(reinterpret_cast(&tmp_P), sizeof(float)); d_dump_file.write(reinterpret_cast(&tmp_L), sizeof(float)); + d_dump_file.write(reinterpret_cast(&tmp_VL), sizeof(float)); // PROMPT I and Q (to analyze navigation symbols) d_dump_file.write(reinterpret_cast(&prompt_I), sizeof(float)); d_dump_file.write(reinterpret_cast(&prompt_Q), sizeof(float)); // PRN start sample stamp - //tmp_float=(float)d_sample_counter; d_dump_file.write(reinterpret_cast(&d_sample_counter), sizeof(unsigned long int)); // accumulated carrier phase - d_dump_file.write(reinterpret_cast(&d_acc_carrier_phase_cycles), sizeof(double)); - + tmp_float = d_acc_carrier_phase_cycles * GPS_TWO_PI; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); // carrier and code frequency - d_dump_file.write(reinterpret_cast(&d_carrier_doppler_hz), sizeof(double)); - d_dump_file.write(reinterpret_cast(&d_code_freq_chips), sizeof(double)); - - //PLL commands - d_dump_file.write(reinterpret_cast(&carr_phase_error_secs_Ti), sizeof(double)); - d_dump_file.write(reinterpret_cast(&d_carrier_doppler_hz), sizeof(double)); - - //DLL commands - d_dump_file.write(reinterpret_cast(&code_error_chips_Ti), sizeof(double)); - d_dump_file.write(reinterpret_cast(&code_error_filt_chips), sizeof(double)); - + tmp_float = d_carrier_doppler_hz; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); + tmp_float = d_code_freq_chips; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); + // PLL commands + tmp_float = 1.0 / (d_carr_phase_error_secs_Ti * CURRENT_INTEGRATION_TIME_S); + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); + tmp_float = 1.0 / (d_code_error_filt_chips_Ti * CURRENT_INTEGRATION_TIME_S); + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); + // DLL commands + tmp_float = d_code_error_chips_Ti * CURRENT_INTEGRATION_TIME_S; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); + tmp_float = d_code_error_filt_chips_Ti; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); // CN0 and carrier lock test - d_dump_file.write(reinterpret_cast(&d_CN0_SNV_dB_Hz), sizeof(double)); - d_dump_file.write(reinterpret_cast(&d_carrier_lock_test), sizeof(double)); - + tmp_float = d_CN0_SNV_dB_Hz; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); + tmp_float = d_carrier_lock_test; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); // AUX vars (for debug purposes) - tmp_double = d_rem_code_phase_samples; + tmp_float = d_code_error_chips_Ti * CURRENT_INTEGRATION_TIME_S; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); + double tmp_double = static_cast(d_sample_counter + d_correlation_length_samples); d_dump_file.write(reinterpret_cast(&tmp_double), sizeof(double)); - tmp_double = static_cast(d_sample_counter + d_correlation_length_samples); - d_dump_file.write(reinterpret_cast(&tmp_double), sizeof(double)); - // PRN unsigned int prn_ = d_acquisition_gnss_synchro->PRN; d_dump_file.write(reinterpret_cast(&prn_), sizeof(unsigned int)); diff --git a/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_tcp_connector_tracking_cc.cc b/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_tcp_connector_tracking_cc.cc index f2d709c21..f4fe4c018 100644 --- a/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_tcp_connector_tracking_cc.cc +++ b/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_tcp_connector_tracking_cc.cc @@ -482,48 +482,55 @@ int Gps_L1_Ca_Tcp_Connector_Tracking_cc::general_work(int noutput_items __attrib float prompt_I; float prompt_Q; float tmp_E, tmp_P, tmp_L; + float tmp_VE = 0.0; + float tmp_VL = 0.0; float tmp_float; - prompt_I = (*d_Prompt).real(); - prompt_Q = (*d_Prompt).imag(); - tmp_E = std::abs(*d_Early); - tmp_P = std::abs(*d_Prompt); - tmp_L = std::abs(*d_Late); + prompt_I = d_correlator_outs[1].real(); + prompt_Q = d_correlator_outs[1].imag(); + tmp_E = std::abs(d_correlator_outs[0]); + tmp_P = std::abs(d_correlator_outs[1]); + tmp_L = std::abs(d_correlator_outs[2]); try { - // EPR + // Dump correlators output + d_dump_file.write(reinterpret_cast(&tmp_VE), sizeof(float)); d_dump_file.write(reinterpret_cast(&tmp_E), sizeof(float)); d_dump_file.write(reinterpret_cast(&tmp_P), sizeof(float)); d_dump_file.write(reinterpret_cast(&tmp_L), sizeof(float)); + d_dump_file.write(reinterpret_cast(&tmp_VL), sizeof(float)); // PROMPT I and Q (to analyze navigation symbols) d_dump_file.write(reinterpret_cast(&prompt_I), sizeof(float)); d_dump_file.write(reinterpret_cast(&prompt_Q), sizeof(float)); // PRN start sample stamp - //tmp_float=(float)d_sample_counter; d_dump_file.write(reinterpret_cast(&d_sample_counter), sizeof(unsigned long int)); // accumulated carrier phase - d_dump_file.write(reinterpret_cast(&d_acc_carrier_phase_rad), sizeof(float)); - - // carrier and code frequency - d_dump_file.write(reinterpret_cast(&d_carrier_doppler_hz), sizeof(float)); - d_dump_file.write(reinterpret_cast(&d_code_freq_hz), sizeof(float)); - - //PLL commands - d_dump_file.write(reinterpret_cast(&carr_error), sizeof(float)); - d_dump_file.write(reinterpret_cast(&carr_nco), sizeof(float)); - - //DLL commands - d_dump_file.write(reinterpret_cast(&code_error), sizeof(float)); - d_dump_file.write(reinterpret_cast(&code_nco), sizeof(float)); - - // CN0 and carrier lock test - d_dump_file.write(reinterpret_cast(&d_CN0_SNV_dB_Hz), sizeof(float)); - d_dump_file.write(reinterpret_cast(&d_carrier_lock_test), sizeof(float)); - - // AUX vars (for debug purposes) - tmp_float = 0; + tmp_float = d_acc_carrier_phase_rad; d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); - d_dump_file.write(reinterpret_cast(&d_sample_counter_seconds), sizeof(double)); - + // carrier and code frequency + tmp_float = d_carrier_doppler_hz; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); + tmp_float = d_code_freq_hz; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); + // PLL commands + tmp_float = 0.0; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); + tmp_float = carr_error; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); + // DLL commands + tmp_float = 0.0; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); + tmp_float = code_error; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); + // CN0 and carrier lock test + tmp_float = d_CN0_SNV_dB_Hz; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); + tmp_float = d_carrier_lock_test; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); + // AUX vars (for debug purposes) + tmp_float = 0.0; + d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); + double tmp_double = static_cast(d_sample_counter + d_correlation_length_samples); + d_dump_file.write(reinterpret_cast(&tmp_double), sizeof(double)); // PRN unsigned int prn_ = d_acquisition_gnss_synchro->PRN; d_dump_file.write(reinterpret_cast(&prn_), sizeof(unsigned int)); From 9458fe6e5784e4f5c42826e3642d4ac61950bb80 Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Fri, 30 Mar 2018 10:33:11 +0200 Subject: [PATCH 51/61] Cleanup of Matlab/Octave code --- src/utils/matlab/dll_pll_veml_plot_sample.m | 119 ++++--- .../galileo_e1_dll_pll_veml_plot_sample.m | 113 ++++--- .../matlab/galileo_e5a_dll_pll_plot_sample.m | 142 +++++---- .../matlab/glonass_ca_dll_pll_plot_sample.m | 105 ++++--- .../matlab/gps_l1_ca_dll_pll_plot_sample.m | 105 ++++--- .../gps_l1_ca_pvt_plot_sample_agilent_cap2.m | 68 ++-- .../matlab/gps_l1_ca_pvt_raw_plot_sample.m | 26 +- .../matlab/gps_l1_ca_telemetry_plot_sample.m | 59 ++-- src/utils/matlab/help_script1.m | 31 +- src/utils/matlab/help_script2.m | 27 +- .../matlab/hybrid_observables_plot_sample.m | 69 +++-- .../libs/dll_pll_veml_read_tracking_dump.m | 172 +++++------ ...lileo_e1_dll_pll_veml_read_tracking_dump.m | 153 --------- .../glonass_ca_dll_pll_read_tracking_dump.m | 191 ------------ ...gps_l1_ca_dll_fll_pll_read_tracking_dump.m | 178 ----------- .../gps_l1_ca_dll_pll_read_tracking_dump.m | 214 +++++++------ .../matlab/libs/gps_l1_ca_pvt_read_pvt_dump.m | 170 +++++----- .../matlab/libs/gps_l1_ca_read_pvt_raw_dump.m | 83 +++-- .../libs/gps_l1_ca_read_telemetry_dump.m | 103 ++++--- src/utils/matlab/libs/plotNavigation.m | 172 +++++------ src/utils/matlab/libs/plotTracking.m | 290 +++++++++--------- src/utils/matlab/libs/plotVEMLTracking.m | 243 ++++++++------- src/utils/matlab/libs/read_complex_binary.m | 58 ++-- .../matlab/libs/read_complex_char_binary.m | 62 ++-- .../matlab/libs/read_complex_short_binary.m | 62 ++-- .../libs/read_hybrid_observables_dump.m | 105 ++++--- .../libs/read_true_sim_observables_dump.m | 93 ++++-- src/utils/matlab/plotTrackingE5a.m | 243 ++++++++------- src/utils/matlab/plot_acq_grid.m | 58 ++-- src/utils/matlab/plot_acq_grid_gsoc.m | 62 ++-- src/utils/matlab/plot_acq_grid_gsoc_e5.m | 69 ++--- src/utils/matlab/plot_acq_grid_gsoc_glonass.m | 63 ++-- 32 files changed, 1681 insertions(+), 2027 deletions(-) delete mode 100644 src/utils/matlab/libs/galileo_e1_dll_pll_veml_read_tracking_dump.m delete mode 100644 src/utils/matlab/libs/glonass_ca_dll_pll_read_tracking_dump.m delete mode 100644 src/utils/matlab/libs/gps_l1_ca_dll_fll_pll_read_tracking_dump.m diff --git a/src/utils/matlab/dll_pll_veml_plot_sample.m b/src/utils/matlab/dll_pll_veml_plot_sample.m index 15b86f098..247d9e6df 100644 --- a/src/utils/matlab/dll_pll_veml_plot_sample.m +++ b/src/utils/matlab/dll_pll_veml_plot_sample.m @@ -1,37 +1,36 @@ -% /*! -% * \file dll_pll_vml_plot_sample.m -% * \brief Read GNSS-SDR Tracking dump binary file using the provided -% function and plot some internal variables -% * \author Javier Arribas, 2011. jarribas(at)cttc.es -% * \author Antonio Ramos, 2018. antonio.ramos(at)cttc.es -% * ------------------------------------------------------------------------- -% * -% * Copyright (C) 2010-2018 (see AUTHORS file for a list of contributors) -% * -% * GNSS-SDR is a software defined Global Navigation -% * Satellite Systems receiver -% * -% * This file is part of GNSS-SDR. -% * -% * GNSS-SDR is free software: you can redistribute it and/or modify -% * it under the terms of the GNU General Public License as published by -% * the Free Software Foundation, either version 3 of the License, or -% * at your option) any later version. -% * -% * GNSS-SDR is distributed in the hope that it will be useful, -% * but WITHOUT ANY WARRANTY; without even the implied warranty of -% * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% * GNU General Public License for more details. -% * -% * You should have received a copy of the GNU General Public License -% * along with GNSS-SDR. If not, see . -% * -% * ------------------------------------------------------------------------- -% */ +% Reads GNSS-SDR Tracking dump binary file using the provided +% function and plots some internal variables +% Javier Arribas, 2011. jarribas(at)cttc.es +% Antonio Ramos, 2018. antonio.ramos(at)cttc.es +% ------------------------------------------------------------------------- +% +% Copyright (C) 2010-2018 (see AUTHORS file for a list of contributors) +% +% GNSS-SDR is a software defined Global Navigation +% Satellite Systems receiver +% +% This file is part of GNSS-SDR. +% +% GNSS-SDR is free software: you can redistribute it and/or modify +% it under the terms of the GNU General Public License as published by +% the Free Software Foundation, either version 3 of the License, or +% at your option) any later version. +% +% GNSS-SDR is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with GNSS-SDR. If not, see . +% +% ------------------------------------------------------------------------- +% + close all; clear all; -if ~exist('dll_pll_veml_read_tracking_dump.m','file') +if ~exist('dll_pll_veml_read_tracking_dump.m', 'file') addpath('./libs') end @@ -44,40 +43,40 @@ path = '/dump_dir/'; %% CHANGE THIS PATH for N=1:1:channels tracking_log_path = [path 'track_ch_' num2str(N+first_channel-1) '.dat']; %% CHANGE track_ch BY YOUR dump_filename - GNSS_tracking(N)= dll_pll_veml_read_tracking_dump(tracking_log_path); + GNSS_tracking(N)= dll_pll_veml_read_tracking_dump(tracking_log_path); end % GNSS-SDR format conversion to MATLAB GPS receiver for N=1:1:channels - trackResults(N).status = 'T'; %fake track - trackResults(N).codeFreq = GNSS_tracking(N).code_freq_hz.'; - trackResults(N).carrFreq = GNSS_tracking(N).carrier_doppler_hz.'; - trackResults(N).dllDiscr = GNSS_tracking(N).code_error.'; - trackResults(N).dllDiscrFilt = GNSS_tracking(N).code_nco.'; - trackResults(N).pllDiscr = GNSS_tracking(N).carr_error.'; - trackResults(N).pllDiscrFilt = GNSS_tracking(N).carr_nco.'; - - trackResults(N).I_P = GNSS_tracking(N).P.'; - trackResults(N).Q_P = zeros(1,length(GNSS_tracking(N).P)); - - trackResults(N).I_VE = GNSS_tracking(N).VE.'; - trackResults(N).I_E = GNSS_tracking(N).E.'; - trackResults(N).I_L = GNSS_tracking(N).L.'; - trackResults(N).I_VL = GNSS_tracking(N).VL.'; - trackResults(N).Q_VE = zeros(1,length(GNSS_tracking(N).VE)); - trackResults(N).Q_E = zeros(1,length(GNSS_tracking(N).E)); - trackResults(N).Q_L = zeros(1,length(GNSS_tracking(N).L)); - trackResults(N).Q_VL = zeros(1,length(GNSS_tracking(N).VL)); - trackResults(N).data_I = GNSS_tracking(N).prompt_I.'; - trackResults(N).data_Q = GNSS_tracking(N).prompt_Q.'; - trackResults(N).PRN = GNSS_tracking(N).PRN.'; - trackResults(N).CNo = GNSS_tracking(N).CN0_SNV_dB_Hz.'; - - % Use original MATLAB tracking plot function - settings.numberOfChannels = channels; - settings.msToProcess = length(GNSS_tracking(N).E)*coherent_integration_time_ms; - plotVEMLTracking(N,trackResults,settings) + trackResults(N).status = 'T'; %fake track + trackResults(N).codeFreq = GNSS_tracking(N).code_freq_hz.'; + trackResults(N).carrFreq = GNSS_tracking(N).carrier_doppler_hz.'; + trackResults(N).dllDiscr = GNSS_tracking(N).code_error.'; + trackResults(N).dllDiscrFilt = GNSS_tracking(N).code_nco.'; + trackResults(N).pllDiscr = GNSS_tracking(N).carr_error.'; + trackResults(N).pllDiscrFilt = GNSS_tracking(N).carr_nco.'; + + trackResults(N).I_P = GNSS_tracking(N).P.'; + trackResults(N).Q_P = zeros(1,length(GNSS_tracking(N).P)); + + trackResults(N).I_VE = GNSS_tracking(N).VE.'; + trackResults(N).I_E = GNSS_tracking(N).E.'; + trackResults(N).I_L = GNSS_tracking(N).L.'; + trackResults(N).I_VL = GNSS_tracking(N).VL.'; + trackResults(N).Q_VE = zeros(1,length(GNSS_tracking(N).VE)); + trackResults(N).Q_E = zeros(1,length(GNSS_tracking(N).E)); + trackResults(N).Q_L = zeros(1,length(GNSS_tracking(N).L)); + trackResults(N).Q_VL = zeros(1,length(GNSS_tracking(N).VL)); + trackResults(N).data_I = GNSS_tracking(N).prompt_I.'; + trackResults(N).data_Q = GNSS_tracking(N).prompt_Q.'; + trackResults(N).PRN = GNSS_tracking(N).PRN.'; + trackResults(N).CNo = GNSS_tracking(N).CN0_SNV_dB_Hz.'; + + % Use original MATLAB tracking plot function + settings.numberOfChannels = channels; + settings.msToProcess = length(GNSS_tracking(N).E) * coherent_integration_time_ms; + plotVEMLTracking(N, trackResults, settings) end diff --git a/src/utils/matlab/galileo_e1_dll_pll_veml_plot_sample.m b/src/utils/matlab/galileo_e1_dll_pll_veml_plot_sample.m index 19bc3de13..fb04ccd71 100644 --- a/src/utils/matlab/galileo_e1_dll_pll_veml_plot_sample.m +++ b/src/utils/matlab/galileo_e1_dll_pll_veml_plot_sample.m @@ -1,36 +1,35 @@ -% /*! -% * \file galileo_l1_ca_dll_pll_vml_plot_sample.m -% * \brief Read GNSS-SDR Tracking dump binary file using the provided -% function and plot some internal variables -% * \author Javier Arribas, 2011. jarribas(at)cttc.es -% * ------------------------------------------------------------------------- -% * -% * Copyright (C) 2010-2011 (see AUTHORS file for a list of contributors) -% * -% * GNSS-SDR is a software defined Global Navigation -% * Satellite Systems receiver -% * -% * This file is part of GNSS-SDR. -% * -% * GNSS-SDR is free software: you can redistribute it and/or modify -% * it under the terms of the GNU General Public License as published by -% * the Free Software Foundation, either version 3 of the License, or -% * at your option) any later version. -% * -% * GNSS-SDR is distributed in the hope that it will be useful, -% * but WITHOUT ANY WARRANTY; without even the implied warranty of -% * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% * GNU General Public License for more details. -% * -% * You should have received a copy of the GNU General Public License -% * along with GNSS-SDR. If not, see . -% * -% * ------------------------------------------------------------------------- -% */ +% Reads GNSS-SDR Tracking dump binary file using the provided +% function and plots some internal variables +% Javier Arribas, 2011. jarribas(at)cttc.es +% ------------------------------------------------------------------------- +% +% Copyright (C) 2010-2018 (see AUTHORS file for a list of contributors) +% +% GNSS-SDR is a software defined Global Navigation +% Satellite Systems receiver +% +% This file is part of GNSS-SDR. +% +% GNSS-SDR is free software: you can redistribute it and/or modify +% it under the terms of the GNU General Public License as published by +% the Free Software Foundation, either version 3 of the License, or +% at your option) any later version. +% +% GNSS-SDR is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with GNSS-SDR. If not, see . +% +% ------------------------------------------------------------------------- +% + close all; clear all; -if ~exist('galileo_e1_dll_pll_veml_read_tracking_dump.m','file') +if ~exist('dll_pll_veml_read_tracking_dump.m', 'file') addpath('./libs') end @@ -42,38 +41,38 @@ path = '/Users/carlesfernandez/git/cttc/build/'; %% CHANGE THIS PATH for N=1:1:channels tracking_log_path = [path 'track_ch' num2str(N+first_channel-1) '.dat']; %% CHANGE track_ch BY YOUR dump_filename - GNSS_tracking(N)= galileo_e1_dll_pll_veml_read_tracking_dump(tracking_log_path); + GNSS_tracking(N) = dll_pll_veml_read_tracking_dump(tracking_log_path); end % GNSS-SDR format conversion to MATLAB GPS receiver for N=1:1:channels - trackResults(N).status = 'T'; %fake track - trackResults(N).codeFreq = GNSS_tracking(N).code_freq_hz.'; - trackResults(N).carrFreq = GNSS_tracking(N).carrier_doppler_hz.'; - trackResults(N).dllDiscr = GNSS_tracking(N).code_error.'; - trackResults(N).dllDiscrFilt = GNSS_tracking(N).code_nco.'; - trackResults(N).pllDiscr = GNSS_tracking(N).carr_error.'; - trackResults(N).pllDiscrFilt = GNSS_tracking(N).carr_nco.'; - - trackResults(N).I_P = GNSS_tracking(N).prompt_I.'; - trackResults(N).Q_P = GNSS_tracking(N).prompt_Q.'; - - trackResults(N).I_VE = GNSS_tracking(N).VE.'; - trackResults(N).I_E = GNSS_tracking(N).E.'; - trackResults(N).I_L = GNSS_tracking(N).L.'; - trackResults(N).I_VL = GNSS_tracking(N).VL.'; - trackResults(N).Q_VE = zeros(1,length(GNSS_tracking(N).VE)); - trackResults(N).Q_E = zeros(1,length(GNSS_tracking(N).E)); - trackResults(N).Q_L = zeros(1,length(GNSS_tracking(N).L)); - trackResults(N).Q_VL = zeros(1,length(GNSS_tracking(N).VL)); - trackResults(N).PRN = GNSS_tracking(N).PRN.'; - trackResults(N).CNo = GNSS_tracking(N).CN0_SNV_dB_Hz.'; - - % Use original MATLAB tracking plot function - settings.numberOfChannels = channels; - settings.msToProcess = length(GNSS_tracking(N).E)*4; - plotVEMLTracking(N,trackResults,settings) + trackResults(N).status = 'T'; %fake track + trackResults(N).codeFreq = GNSS_tracking(N).code_freq_hz.'; + trackResults(N).carrFreq = GNSS_tracking(N).carrier_doppler_hz.'; + trackResults(N).dllDiscr = GNSS_tracking(N).code_error.'; + trackResults(N).dllDiscrFilt = GNSS_tracking(N).code_nco.'; + trackResults(N).pllDiscr = GNSS_tracking(N).carr_error.'; + trackResults(N).pllDiscrFilt = GNSS_tracking(N).carr_nco.'; + + trackResults(N).I_P = GNSS_tracking(N).prompt_I.'; + trackResults(N).Q_P = GNSS_tracking(N).prompt_Q.'; + + trackResults(N).I_VE = GNSS_tracking(N).VE.'; + trackResults(N).I_E = GNSS_tracking(N).E.'; + trackResults(N).I_L = GNSS_tracking(N).L.'; + trackResults(N).I_VL = GNSS_tracking(N).VL.'; + trackResults(N).Q_VE = zeros(1,length(GNSS_tracking(N).VE)); + trackResults(N).Q_E = zeros(1,length(GNSS_tracking(N).E)); + trackResults(N).Q_L = zeros(1,length(GNSS_tracking(N).L)); + trackResults(N).Q_VL = zeros(1,length(GNSS_tracking(N).VL)); + trackResults(N).PRN = GNSS_tracking(N).PRN.'; + trackResults(N).CNo = GNSS_tracking(N).CN0_SNV_dB_Hz.'; + + % Use original MATLAB tracking plot function + settings.numberOfChannels = channels; + settings.msToProcess = length(GNSS_tracking(N).E)*4; + plotVEMLTracking(N, trackResults, settings) end diff --git a/src/utils/matlab/galileo_e5a_dll_pll_plot_sample.m b/src/utils/matlab/galileo_e5a_dll_pll_plot_sample.m index 54ee9d81e..40660f06a 100644 --- a/src/utils/matlab/galileo_e5a_dll_pll_plot_sample.m +++ b/src/utils/matlab/galileo_e5a_dll_pll_plot_sample.m @@ -1,33 +1,31 @@ -% /*! -% * \file galileo_e5a_dll_pll_plot_sample.m -% * \brief Read GNSS-SDR Tracking dump binary file using the provided -% function and plot some internal variables -% * \author Javier Arribas, Marc Sales 2014. jarribas(at)cttc.es -% marcsales92@gmail.com -% * ------------------------------------------------------------------------- -% * -% * Copyright (C) 2010-2014 (see AUTHORS file for a list of contributors) -% * -% * GNSS-SDR is a software defined Global Navigation -% * Satellite Systems receiver -% * -% * This file is part of GNSS-SDR. -% * -% * GNSS-SDR is free software: you can redistribute it and/or modify -% * it under the terms of the GNU General Public License as published by -% * the Free Software Foundation, either version 3 of the License, or -% * at your option) any later version. -% * -% * GNSS-SDR is distributed in the hope that it will be useful, -% * but WITHOUT ANY WARRANTY; without even the implied warranty of -% * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% * GNU General Public License for more details. -% * -% * You should have received a copy of the GNU General Public License -% * along with GNSS-SDR. If not, see . -% * -% * ------------------------------------------------------------------------- -% */ +% Reads GNSS-SDR Tracking dump binary file using the provided +% function and plots some internal variables +% Javier Arribas, Marc Sales 2014. jarribas(at)cttc.es, marcsales92@gmail.com +% ------------------------------------------------------------------------- +% +% Copyright (C) 2010-2018 (see AUTHORS file for a list of contributors) +% +% GNSS-SDR is a software defined Global Navigation +% Satellite Systems receiver +% +% This file is part of GNSS-SDR. +% +% GNSS-SDR is free software: you can redistribute it and/or modify +% it under the terms of the GNU General Public License as published by +% the Free Software Foundation, either version 3 of the License, or +% at your option) any later version. +% +% GNSS-SDR is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with GNSS-SDR. If not, see . +% +% ------------------------------------------------------------------------- +% + close all; clear all; @@ -44,54 +42,54 @@ path = '/Users/carlesfernandez/git/cttc/build/'; %% CHANGE THIS PATH for N=1:1:channels tracking_log_path = [path 'tracking_ch_' num2str(N+first_channel-1) '.dat']; %% CHANGE tracking_ch_ BY YOUR dump_filename - GNSS_tracking(N)= gps_l1_ca_dll_pll_read_tracking_dump(tracking_log_path); + GNSS_tracking(N) = gps_l1_ca_dll_pll_read_tracking_dump(tracking_log_path); end % GNSS-SDR format conversion to MATLAB GPS receiver for N=1:1:channels - trackResults(N).status = 'T'; %fake track - trackResults(N).codeFreq = GNSS_tracking(N).code_freq_hz.'; - trackResults(N).carrFreq = GNSS_tracking(N).carrier_doppler_hz.'; - trackResults(N).dllDiscr = GNSS_tracking(N).code_error.'; - trackResults(N).dllDiscrFilt = GNSS_tracking(N).code_nco.'; - trackResults(N).pllDiscr = GNSS_tracking(N).carr_error.'; - trackResults(N).pllDiscrFilt = GNSS_tracking(N).carr_nco.'; - - trackResults(N).I_PN = GNSS_tracking(N).prompt_I.'; - trackResults(N).Q_PN = GNSS_tracking(N).prompt_Q.'; - trackResults(N).Q_P = zeros(1,length(GNSS_tracking(N).P)); - trackResults(N).I_P = GNSS_tracking(N).P.'; - - trackResults(N).I_E = GNSS_tracking(N).E.'; - trackResults(N).I_L = GNSS_tracking(N).L.'; - trackResults(N).Q_E = zeros(1,length(GNSS_tracking(N).E)); - trackResults(N).Q_L = zeros(1,length(GNSS_tracking(N).E)); - trackResults(N).PRN = GNSS_tracking(N).PRN.'; - - % Use original MATLAB tracking plot function - settings.numberOfChannels = channels; - settings.msToProcess = length(GNSS_tracking(N).E); - plotTrackingE5a(N,trackResults,settings) + trackResults(N).status = 'T'; %fake track + trackResults(N).codeFreq = GNSS_tracking(N).code_freq_hz.'; + trackResults(N).carrFreq = GNSS_tracking(N).carrier_doppler_hz.'; + trackResults(N).dllDiscr = GNSS_tracking(N).code_error.'; + trackResults(N).dllDiscrFilt = GNSS_tracking(N).code_nco.'; + trackResults(N).pllDiscr = GNSS_tracking(N).carr_error.'; + trackResults(N).pllDiscrFilt = GNSS_tracking(N).carr_nco.'; + + trackResults(N).I_PN = GNSS_tracking(N).prompt_I.'; + trackResults(N).Q_PN = GNSS_tracking(N).prompt_Q.'; + trackResults(N).Q_P = zeros(1,length(GNSS_tracking(N).P)); + trackResults(N).I_P = GNSS_tracking(N).P.'; + + trackResults(N).I_E = GNSS_tracking(N).E.'; + trackResults(N).I_L = GNSS_tracking(N).L.'; + trackResults(N).Q_E = zeros(1,length(GNSS_tracking(N).E)); + trackResults(N).Q_L = zeros(1,length(GNSS_tracking(N).E)); + trackResults(N).PRN = GNSS_tracking(N).PRN.'; + + % Use original MATLAB tracking plot function + settings.numberOfChannels = channels; + settings.msToProcess = length(GNSS_tracking(N).E); + plotTrackingE5a(N, trackResults, settings) end for N=1:1:channels -% figure; -% plot([GNSS_tracking(N).E,GNSS_tracking(N).P,GNSS_tracking(N).L],'-*'); -% title(['Early, Prompt, and Late correlator absolute value output for channel ' num2str(N)']); -% figure; -% plot(GNSS_tracking(N).prompt_I,GNSS_tracking(N).prompt_Q,'+'); -% title(['Navigation constellation plot for channel ' num2str(N)]); -% figure; -% -% plot(GNSS_tracking(N).prompt_Q,'r'); -% hold on; -% plot(GNSS_tracking(N).prompt_I); -% title(['Navigation symbols I(red) Q(blue) for channel ' num2str(N)]); -% - figure; - t=0:length(GNSS_tracking(N).carrier_doppler_hz)-1; - t=t/1000; - plot(t,GNSS_tracking(N).carrier_doppler_hz/1000); - xlabel('Time(s)');ylabel('Doppler(KHz)');title(['Doppler frequency channel ' num2str(N)]); + % figure; + % plot([GNSS_tracking(N).E, GNSS_tracking(N).P, GNSS_tracking(N).L],'-*'); + % title(['Early, Prompt, and Late correlator absolute value output for channel ' num2str(N)']); + % figure; + % plot(GNSS_tracking(N).prompt_I, GNSS_tracking(N).prompt_Q, '+'); + % title(['Navigation constellation plot for channel ' num2str(N)]); + % figure; + % + % plot(GNSS_tracking(N).prompt_Q,'r'); + % hold on; + % plot(GNSS_tracking(N).prompt_I); + % title(['Navigation symbols I(red) Q(blue) for channel ' num2str(N)]); + % + figure; + t = 0:length(GNSS_tracking(N).carrier_doppler_hz)-1; + t = t/1000; + plot(t, GNSS_tracking(N).carrier_doppler_hz / 1000); + xlabel('Time(s)'); ylabel('Doppler(KHz)'); title(['Doppler frequency channel ' num2str(N)]); end \ No newline at end of file diff --git a/src/utils/matlab/glonass_ca_dll_pll_plot_sample.m b/src/utils/matlab/glonass_ca_dll_pll_plot_sample.m index 7cb6753b4..304429641 100644 --- a/src/utils/matlab/glonass_ca_dll_pll_plot_sample.m +++ b/src/utils/matlab/glonass_ca_dll_pll_plot_sample.m @@ -1,36 +1,35 @@ -% /*! -% * \file glonass_ca_dll_pll_plot_sample.m -% * \brief Read GNSS-SDR Tracking dump binary file using the provided -% function and plot some internal variables -% * \author Damian Miralles, 2017. dmiralles2009(at)gmail.com -% * ------------------------------------------------------------------------- -% * -% * Copyright (C) 2010-2011 (see AUTHORS file for a list of contributors) -% * -% * GNSS-SDR is a software defined Global Navigation -% * Satellite Systems receiver -% * -% * This file is part of GNSS-SDR. -% * -% * GNSS-SDR is free software: you can redistribute it and/or modify -% * it under the terms of the GNU General Public License as published by -% * the Free Software Foundation, either version 3 of the License, or -% * at your option) any later version. -% * -% * GNSS-SDR is distributed in the hope that it will be useful, -% * but WITHOUT ANY WARRANTY; without even the implied warranty of -% * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% * GNU General Public License for more details. -% * -% * You should have received a copy of the GNU General Public License -% * along with GNSS-SDR. If not, see . -% * -% * ------------------------------------------------------------------------- -% */ +% Reads GNSS-SDR Tracking dump binary file using the provided +% function and plots some internal variables +% Damian Miralles, 2017. dmiralles2009(at)gmail.com +% ------------------------------------------------------------------------- +% +% Copyright (C) 2010-2018 (see AUTHORS file for a list of contributors) +% +% GNSS-SDR is a software defined Global Navigation +% Satellite Systems receiver +% +% This file is part of GNSS-SDR. +% +% GNSS-SDR is free software: you can redistribute it and/or modify +% it under the terms of the GNU General Public License as published by +% the Free Software Foundation, either version 3 of the License, or +% at your option) any later version. +% +% GNSS-SDR is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with GNSS-SDR. If not, see . +% +% ------------------------------------------------------------------------- +% + close all; clear all; -if ~exist('glonass_ca_dll_pll_read_tracking_dump.m','file') +if ~exist('dll_pll_veml_read_tracking_dump.m', 'file') addpath('./libs') end @@ -43,32 +42,32 @@ path = '/archive/'; %% CHANGE THIS PATH for N=1:1:channels tracking_log_path = [path 'glo_tracking_ch_' num2str(N+first_channel-1) '.dat']; %% CHANGE epl_tracking_ch_ BY YOUR dump_filename - GNSS_tracking(N)= glonass_ca_dll_pll_read_tracking_dump(tracking_log_path); + GNSS_tracking(N) = dll_pll_veml_read_tracking_dump(tracking_log_path); end % GNSS-SDR format conversion to MATLAB GPS receiver for N=1:1:channels - trackResults(N).status = 'T'; %fake track - trackResults(N).codeFreq = GNSS_tracking(N).code_freq_hz.'; - trackResults(N).carrFreq = GNSS_tracking(N).carrier_freq_hz.'; - trackResults(N).dllDiscr = GNSS_tracking(N).code_error.'; - trackResults(N).dllDiscrFilt = GNSS_tracking(N).code_nco.'; - trackResults(N).pllDiscr = GNSS_tracking(N).carr_error.'; - trackResults(N).pllDiscrFilt = GNSS_tracking(N).carr_nco.'; - - trackResults(N).I_P = GNSS_tracking(N).prompt_I.'; - trackResults(N).Q_P = GNSS_tracking(N).prompt_Q.'; - - trackResults(N).I_E = GNSS_tracking(N).E.'; - trackResults(N).I_L = GNSS_tracking(N).L.'; - trackResults(N).Q_E = zeros(1,length(GNSS_tracking(N).E)); - trackResults(N).Q_L = zeros(1,length(GNSS_tracking(N).E)); - trackResults(N).CNo = GNSS_tracking(N).CN0_SNV_dB_Hz.'; - trackResults(N).PRN = ones(1,length(GNSS_tracking(N).E)); - - % Use original MATLAB tracking plot function - settings.numberOfChannels = channels; - settings.msToProcess = length(GNSS_tracking(N).E); - plotTracking(N,trackResults,settings); + trackResults(N).status = 'T'; %fake track + trackResults(N).codeFreq = GNSS_tracking(N).code_freq_hz.'; + trackResults(N).carrFreq = GNSS_tracking(N).carrier_freq_hz.'; + trackResults(N).dllDiscr = GNSS_tracking(N).code_error.'; + trackResults(N).dllDiscrFilt = GNSS_tracking(N).code_nco.'; + trackResults(N).pllDiscr = GNSS_tracking(N).carr_error.'; + trackResults(N).pllDiscrFilt = GNSS_tracking(N).carr_nco.'; + + trackResults(N).I_P = GNSS_tracking(N).prompt_I.'; + trackResults(N).Q_P = GNSS_tracking(N).prompt_Q.'; + + trackResults(N).I_E = GNSS_tracking(N).E.'; + trackResults(N).I_L = GNSS_tracking(N).L.'; + trackResults(N).Q_E = zeros(1,length(GNSS_tracking(N).E)); + trackResults(N).Q_L = zeros(1,length(GNSS_tracking(N).E)); + trackResults(N).CNo = GNSS_tracking(N).CN0_SNV_dB_Hz.'; + trackResults(N).PRN = ones(1,length(GNSS_tracking(N).E)); + + % Use original MATLAB tracking plot function + settings.numberOfChannels = channels; + settings.msToProcess = length(GNSS_tracking(N).E); + plotTracking(N, trackResults, settings) end diff --git a/src/utils/matlab/gps_l1_ca_dll_pll_plot_sample.m b/src/utils/matlab/gps_l1_ca_dll_pll_plot_sample.m index 22ef63f79..c86b9a2f3 100644 --- a/src/utils/matlab/gps_l1_ca_dll_pll_plot_sample.m +++ b/src/utils/matlab/gps_l1_ca_dll_pll_plot_sample.m @@ -1,36 +1,35 @@ -% /*! -% * \file gps_l1_ca_dll_pll_plot_sample.m -% * \brief Read GNSS-SDR Tracking dump binary file using the provided -% function and plot some internal variables -% * \author Javier Arribas, 2011. jarribas(at)cttc.es -% * ------------------------------------------------------------------------- -% * -% * Copyright (C) 2010-2011 (see AUTHORS file for a list of contributors) -% * -% * GNSS-SDR is a software defined Global Navigation -% * Satellite Systems receiver -% * -% * This file is part of GNSS-SDR. -% * -% * GNSS-SDR is free software: you can redistribute it and/or modify -% * it under the terms of the GNU General Public License as published by -% * the Free Software Foundation, either version 3 of the License, or -% * at your option) any later version. -% * -% * GNSS-SDR is distributed in the hope that it will be useful, -% * but WITHOUT ANY WARRANTY; without even the implied warranty of -% * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% * GNU General Public License for more details. -% * -% * You should have received a copy of the GNU General Public License -% * along with GNSS-SDR. If not, see . -% * -% * ------------------------------------------------------------------------- -% */ +% Reads GNSS-SDR Tracking dump binary file using the provided +% function and plots some internal variables +% Javier Arribas, 2011. jarribas(at)cttc.es +% ------------------------------------------------------------------------- +% +% Copyright (C) 2010-2018 (see AUTHORS file for a list of contributors) +% +% GNSS-SDR is a software defined Global Navigation +% Satellite Systems receiver +% +% This file is part of GNSS-SDR. +% +% GNSS-SDR is free software: you can redistribute it and/or modify +% it under the terms of the GNU General Public License as published by +% the Free Software Foundation, either version 3 of the License, or +% at your option) any later version. +% +% GNSS-SDR is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with GNSS-SDR. If not, see . +% +% ------------------------------------------------------------------------- +% + close all; clear all; -if ~exist('gps_l1_ca_dll_pll_read_tracking_dump.m','file') +if ~exist('dll_pll_veml_read_tracking_dump.m', 'file') addpath('./libs') end @@ -43,34 +42,34 @@ path = '/archive/'; %% CHANGE THIS PATH for N=1:1:channels tracking_log_path = [path 'glo_tracking_ch_' num2str(N+first_channel-1) '.dat']; %% CHANGE epl_tracking_ch_ BY YOUR dump_filename - GNSS_tracking(N)= gps_l1_ca_dll_pll_read_tracking_dump(tracking_log_path); + GNSS_tracking(N) = dll_pll_veml_read_tracking_dump(tracking_log_path); end % GNSS-SDR format conversion to MATLAB GPS receiver for N=1:1:channels - trackResults(N).status = 'T'; %fake track - trackResults(N).codeFreq = GNSS_tracking(N).code_freq_hz.'; - trackResults(N).carrFreq = GNSS_tracking(N).carrier_doppler_hz.'; - trackResults(N).dllDiscr = GNSS_tracking(N).code_error.'; - trackResults(N).dllDiscrFilt = GNSS_tracking(N).code_nco.'; - trackResults(N).pllDiscr = GNSS_tracking(N).carr_error.'; - trackResults(N).pllDiscrFilt = GNSS_tracking(N).carr_nco.'; - - trackResults(N).I_P = GNSS_tracking(N).prompt_I.'; - trackResults(N).Q_P = GNSS_tracking(N).prompt_Q.'; - - trackResults(N).I_E = GNSS_tracking(N).E.'; - trackResults(N).I_L = GNSS_tracking(N).L.'; - trackResults(N).Q_E = zeros(1,length(GNSS_tracking(N).E)); - trackResults(N).Q_L = zeros(1,length(GNSS_tracking(N).E)); - trackResults(N).PRN = ones(1,length(GNSS_tracking(N).E)); - trackResults(N).CNo = GNSS_tracking(N).CN0_SNV_dB_Hz.'; - - % Use original MATLAB tracking plot function - settings.numberOfChannels = channels; - settings.msToProcess = length(GNSS_tracking(N).E); - plotTracking(N,trackResults,settings) + trackResults(N).status = 'T'; %fake track + trackResults(N).codeFreq = GNSS_tracking(N).code_freq_hz.'; + trackResults(N).carrFreq = GNSS_tracking(N).carrier_doppler_hz.'; + trackResults(N).dllDiscr = GNSS_tracking(N).code_error.'; + trackResults(N).dllDiscrFilt = GNSS_tracking(N).code_nco.'; + trackResults(N).pllDiscr = GNSS_tracking(N).carr_error.'; + trackResults(N).pllDiscrFilt = GNSS_tracking(N).carr_nco.'; + + trackResults(N).I_P = GNSS_tracking(N).prompt_I.'; + trackResults(N).Q_P = GNSS_tracking(N).prompt_Q.'; + + trackResults(N).I_E = GNSS_tracking(N).E.'; + trackResults(N).I_L = GNSS_tracking(N).L.'; + trackResults(N).Q_E = zeros(1,length(GNSS_tracking(N).E)); + trackResults(N).Q_L = zeros(1,length(GNSS_tracking(N).E)); + trackResults(N).PRN = ones(1,length(GNSS_tracking(N).E)); + trackResults(N).CNo = GNSS_tracking(N).CN0_SNV_dB_Hz.'; + + % Use original MATLAB tracking plot function + settings.numberOfChannels = channels; + settings.msToProcess = length(GNSS_tracking(N).E); + plotTracking(N, trackResults, settings) end diff --git a/src/utils/matlab/gps_l1_ca_pvt_plot_sample_agilent_cap2.m b/src/utils/matlab/gps_l1_ca_pvt_plot_sample_agilent_cap2.m index aa26c38ae..b30b46a2b 100644 --- a/src/utils/matlab/gps_l1_ca_pvt_plot_sample_agilent_cap2.m +++ b/src/utils/matlab/gps_l1_ca_pvt_plot_sample_agilent_cap2.m @@ -1,32 +1,30 @@ -% /*! -% * \file gps_l1_ca_pvt_plot_sample.m -% * \brief Read GNSS-SDR PVT dump binary file using the provided -% function and plot some internal variables -% * \author Javier Arribas, 2011. jarribas(at)cttc.es -% * ------------------------------------------------------------------------- -% * -% * Copyright (C) 2010-2011 (see AUTHORS file for a list of contributors) -% * -% * GNSS-SDR is a software defined Global Navigation -% * Satellite Systems receiver -% * -% * This file is part of GNSS-SDR. -% * -% * GNSS-SDR is free software: you can redistribute it and/or modify -% * it under the terms of the GNU General Public License as published by -% * the Free Software Foundation, either version 3 of the License, or -% * at your option) any later version. -% * -% * GNSS-SDR is distributed in the hope that it will be useful, -% * but WITHOUT ANY WARRANTY; without even the implied warranty of -% * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% * GNU General Public License for more details. -% * -% * You should have received a copy of the GNU General Public License -% * along with GNSS-SDR. If not, see . -% * -% * ------------------------------------------------------------------------- -% */ +% Readx GNSS-SDR PVT dump binary file using the provided +% function and plotx some internal variables +% Javier Arribas, 2011. jarribas(at)cttc.es +% ------------------------------------------------------------------------- +% +% Copyright (C) 2010-2018 (see AUTHORS file for a list of contributors) +% +% GNSS-SDR is a software defined Global Navigation +% Satellite Systems receiver +% +% This file is part of GNSS-SDR. +% +% GNSS-SDR is free software: you can redistribute it and/or modify +% it under the terms of the GNU General Public License as published by +% the Free Software Foundation, either version 3 of the License, or +% at your option) any later version. +% +% GNSS-SDR is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with GNSS-SDR. If not, see . +% +% ------------------------------------------------------------------------- +% close all; clear all; @@ -63,17 +61,17 @@ h=35; [X, Y, Z]=geo2cart(lat, long, h, 5); % geographical to cartesian conversion %=== Convert to UTM coordinate system ============================= -utmZone = findUtmZone(lat_deg, long_deg); +utmZone = findUtmZone(lat_deg, long_deg); - [settings.truePosition.E, ... - settings.truePosition.N, ... - settings.truePosition.U] = cart2utm(X, Y, Z, utmZone); +[settings.truePosition.E, ... + settings.truePosition.N, ... + settings.truePosition.U] = cart2utm(X, Y, Z, utmZone); for k=1:1:length(navSolutions.X) [navSolutions.E(k), ... - navSolutions.N(k), ... - navSolutions.U(k)]=cart2utm(navSolutions.X(k), navSolutions.Y(k), navSolutions.Z(k), utmZone); + navSolutions.N(k), ... + navSolutions.U(k)]=cart2utm(navSolutions.X(k), navSolutions.Y(k), navSolutions.Z(k), utmZone); end plot_skyplot=0; diff --git a/src/utils/matlab/gps_l1_ca_pvt_raw_plot_sample.m b/src/utils/matlab/gps_l1_ca_pvt_raw_plot_sample.m index 74f620a36..572924da6 100644 --- a/src/utils/matlab/gps_l1_ca_pvt_raw_plot_sample.m +++ b/src/utils/matlab/gps_l1_ca_pvt_raw_plot_sample.m @@ -1,4 +1,28 @@ % Read PVG raw dump +% ------------------------------------------------------------------------- +% +% Copyright (C) 2010-2018 (see AUTHORS file for a list of contributors) +% +% GNSS-SDR is a software defined Global Navigation +% Satellite Systems receiver +% +% This file is part of GNSS-SDR. +% +% GNSS-SDR is free software: you can redistribute it and/or modify +% it under the terms of the GNU General Public License as published by +% the Free Software Foundation, either version 3 of the License, or +% at your option) any later version. +% +% GNSS-SDR is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with GNSS-SDR. If not, see . +% +% ------------------------------------------------------------------------- +% %clear all; @@ -6,4 +30,4 @@ samplingFreq = 64e6/16; %[Hz] channels=4; path='/home/javier/workspace/gnss-sdr-ref/trunk/install/'; pvt_raw_log_path=[path 'PVT_raw.dat']; -GNSS_PVT_raw= gps_l1_ca_read_pvt_raw_dump(channels,pvt_raw_log_path); +GNSS_PVT_raw= gps_l1_ca_read_pvt_raw_dump(channels,pvt_raw_log_path); diff --git a/src/utils/matlab/gps_l1_ca_telemetry_plot_sample.m b/src/utils/matlab/gps_l1_ca_telemetry_plot_sample.m index b5e60acc1..f1b839419 100644 --- a/src/utils/matlab/gps_l1_ca_telemetry_plot_sample.m +++ b/src/utils/matlab/gps_l1_ca_telemetry_plot_sample.m @@ -1,32 +1,31 @@ -% /*! -% * \file gps_l1_ca_dll_fll_pll_plot_sample.m -% * \brief Read GNSS-SDR Tracking dump binary file using the provided -% function and plot some internal variables -% * \author Javier Arribas, 2011. jarribas(at)cttc.es -% * ------------------------------------------------------------------------- -% * -% * Copyright (C) 2010-2011 (see AUTHORS file for a list of contributors) -% * -% * GNSS-SDR is a software defined Global Navigation -% * Satellite Systems receiver -% * -% * This file is part of GNSS-SDR. -% * -% * GNSS-SDR is free software: you can redistribute it and/or modify -% * it under the terms of the GNU General Public License as published by -% * the Free Software Foundation, either version 3 of the License, or -% * at your option) any later version. -% * -% * GNSS-SDR is distributed in the hope that it will be useful, -% * but WITHOUT ANY WARRANTY; without even the implied warranty of -% * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% * GNU General Public License for more details. -% * -% * You should have received a copy of the GNU General Public License -% * along with GNSS-SDR. If not, see . -% * -% * ------------------------------------------------------------------------- -% */ +% Reads GNSS-SDR Tracking dump binary file using the provided +% function and plots some internal variables +% Javier Arribas, 2011. jarribas(at)cttc.es +% ------------------------------------------------------------------------- +% +% Copyright (C) 2010-2018 (see AUTHORS file for a list of contributors) +% +% GNSS-SDR is a software defined Global Navigation +% Satellite Systems receiver +% +% This file is part of GNSS-SDR. +% +% GNSS-SDR is free software: you can redistribute it and/or modify +% it under the terms of the GNU General Public License as published by +% the Free Software Foundation, either version 3 of the License, or +% at your option) any later version. +% +% GNSS-SDR is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with GNSS-SDR. If not, see . +% +% ------------------------------------------------------------------------- +% + %close all; %clear all; samplingFreq = 64e6/16; %[Hz] @@ -35,6 +34,6 @@ path='/home/javier/workspace/gnss-sdr-ref/trunk/install/'; clear PRN_absolute_sample_start; for N=1:1:channels telemetry_log_path=[path 'telemetry' num2str(N-1) '.dat']; - GNSS_telemetry(N)= gps_l1_ca_read_telemetry_dump(telemetry_log_path); + GNSS_telemetry(N)= gps_l1_ca_read_telemetry_dump(telemetry_log_path); end diff --git a/src/utils/matlab/help_script1.m b/src/utils/matlab/help_script1.m index 2c08a8d91..865d43b83 100644 --- a/src/utils/matlab/help_script1.m +++ b/src/utils/matlab/help_script1.m @@ -1,3 +1,28 @@ +% ------------------------------------------------------------------------- +% +% Copyright (C) 2010-2018 (see AUTHORS file for a list of contributors) +% +% GNSS-SDR is a software defined Global Navigation +% Satellite Systems receiver +% +% This file is part of GNSS-SDR. +% +% GNSS-SDR is free software: you can redistribute it and/or modify +% it under the terms of the GNU General Public License as published by +% the Free Software Foundation, either version 3 of the License, or +% at your option) any later version. +% +% GNSS-SDR is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with GNSS-SDR. If not, see . +% +% ------------------------------------------------------------------------- +% + %help script to compare GNSS-SDR Preambles starts channel=3; % From GNSS_SDR telemetry decoder @@ -25,9 +50,9 @@ error_ms=preambles_timestamp_sdr_ms(common_start_index:(common_start_index+lengt % figure % stem(tracking_loop_start+javi_subFrameStart_sample(channel,:),1000*trackResults_sdr(channel).absoluteSample(javi_subFrameStart_sample(channel,:))/settings.samplingFreq); -% +% % hold on; -% +% % plot(GNSS_observables.preamble_delay_ms(channel,:)); -% +% % plot(GNSS_observables.prn_delay_ms(channel,:),'r') \ No newline at end of file diff --git a/src/utils/matlab/help_script2.m b/src/utils/matlab/help_script2.m index 4be6bfbb8..28fadb535 100644 --- a/src/utils/matlab/help_script2.m +++ b/src/utils/matlab/help_script2.m @@ -1,4 +1,29 @@ -% compare pseudoranges +% ------------------------------------------------------------------------- +% +% Copyright (C) 2010-2018 (see AUTHORS file for a list of contributors) +% +% GNSS-SDR is a software defined Global Navigation +% Satellite Systems receiver +% +% This file is part of GNSS-SDR. +% +% GNSS-SDR is free software: you can redistribute it and/or modify +% it under the terms of the GNU General Public License as published by +% the Free Software Foundation, either version 3 of the License, or +% at your option) any later version. +% +% GNSS-SDR is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with GNSS-SDR. If not, see . +% +% ------------------------------------------------------------------------- +% + +% compare pseudoranges close all; % GNSS SDR diff --git a/src/utils/matlab/hybrid_observables_plot_sample.m b/src/utils/matlab/hybrid_observables_plot_sample.m index 45b6bf31d..3faca95b1 100644 --- a/src/utils/matlab/hybrid_observables_plot_sample.m +++ b/src/utils/matlab/hybrid_observables_plot_sample.m @@ -1,3 +1,28 @@ +% ------------------------------------------------------------------------- +% +% Copyright (C) 2010-2018 (see AUTHORS file for a list of contributors) +% +% GNSS-SDR is a software defined Global Navigation +% Satellite Systems receiver +% +% This file is part of GNSS-SDR. +% +% GNSS-SDR is free software: you can redistribute it and/or modify +% it under the terms of the GNU General Public License as published by +% the Free Software Foundation, either version 3 of the License, or +% at your option) any later version. +% +% GNSS-SDR is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with GNSS-SDR. If not, see . +% +% ------------------------------------------------------------------------- +% + % Read observables dump %clear all; @@ -41,24 +66,24 @@ title('Doppler frequency') xlabel('TOW [s]') ylabel('[Hz]'); -% +% % %read true obs from simulator (optional) % GPS_STARTOFFSET_s = 68.802e-3; -% +% % true_observables_log_path='/home/javier/git/gnss-sdr/build/obs_out.bin'; % GNSS_true_observables= read_true_sim_observables_dump(true_observables_log_path); -% +% % %correct the clock error using true values (it is not possible for a receiver to correct % %the receiver clock offset error at the observables level because it is required the % %decoding of the ephemeris data and solve the PVT equations) -% -% SPEED_OF_LIGHT_M_S = 299792458.0; -% +% +% SPEED_OF_LIGHT_M_S = 299792458.0; +% % %find the reference satellite % [~,ref_sat_ch]=min(GNSS_observables.Pseudorange_m(:,min_idx+1)); % shift_time_s=GNSS_true_observables.Pseudorange_m(ref_sat_ch,:)/SPEED_OF_LIGHT_M_S-GPS_STARTOFFSET_s; -% -% +% +% % %Compute deltas if required and interpolate to measurement time % delta_true_psudorange_m=GNSS_true_observables.Pseudorange_m(1,:)-GNSS_true_observables.Pseudorange_m(2,:); % delta_true_interp_psudorange_m=interp1(GNSS_true_observables.RX_time(1,:)-shift_time_s, ... @@ -67,23 +92,23 @@ ylabel('[Hz]'); % GNSS_true_observables.Carrier_phase_hz(1,:),GNSS_observables.RX_time(1,min_idx+1:end),'lineal','extrap'); % true_interp_acc_carrier_phase_ch2_hz=interp1(GNSS_true_observables.RX_time(1,:)-shift_time_s, ... % GNSS_true_observables.Carrier_phase_hz(2,:),GNSS_observables.RX_time(2,min_idx+1:end),'lineal','extrap'); -% +% % %Compute measurement errors -% +% % delta_measured_psudorange_m=GNSS_observables.Pseudorange_m(1,min_idx+1:end)-GNSS_observables.Pseudorange_m(2,min_idx+1:end); % psudorange_error_m=delta_measured_psudorange_m-delta_true_interp_psudorange_m; % psudorange_rms_m=sqrt(sum(psudorange_error_m.^2)/length(psudorange_error_m)) -% +% % acc_carrier_error_ch1_hz=GNSS_observables.Carrier_phase_hz(1,min_idx+1:end)-true_interp_acc_carrier_phase_ch1_hz... % -GNSS_observables.Carrier_phase_hz(1,min_idx+1)+true_interp_acc_carrier_phase_ch1_hz(1); -% +% % acc_phase_rms_ch1_hz=sqrt(sum(acc_carrier_error_ch1_hz.^2)/length(acc_carrier_error_ch1_hz)) -% +% % acc_carrier_error_ch2_hz=GNSS_observables.Carrier_phase_hz(2,min_idx+1:end)-true_interp_acc_carrier_phase_ch2_hz... % -GNSS_observables.Carrier_phase_hz(2,min_idx+1)+true_interp_acc_carrier_phase_ch2_hz(1); % acc_phase_rms_ch2_hz=sqrt(sum(acc_carrier_error_ch2_hz.^2)/length(acc_carrier_error_ch2_hz)) -% -% +% +% % %plot results % figure; % plot(GNSS_true_observables.RX_time(1,:),delta_true_psudorange_m,'g'); @@ -92,25 +117,25 @@ ylabel('[Hz]'); % title('TRUE vs. measured Pseudoranges [m]') % xlabel('TOW [s]') % ylabel('[m]'); -% +% % figure; % plot(GNSS_observables.RX_time(1,min_idx+1:end),psudorange_error_m) % title('Pseudoranges error [m]') % xlabel('TOW [s]') % ylabel('[m]'); -% +% % figure; % plot(GNSS_observables.RX_time(1,min_idx+1:end),acc_carrier_error_ch1_hz) % title('Accumulated carrier phase error CH1 [hz]') % xlabel('TOW [s]') % ylabel('[hz]'); -% +% % figure; % plot(GNSS_observables.RX_time(1,min_idx+1:end),acc_carrier_error_ch2_hz) % title('Accumulated carrier phase error CH2 [hz]') % xlabel('TOW [s]') % ylabel('[hz]'); -% -% -% -% +% +% +% +% diff --git a/src/utils/matlab/libs/dll_pll_veml_read_tracking_dump.m b/src/utils/matlab/libs/dll_pll_veml_read_tracking_dump.m index daa2324dd..8405c9cf3 100644 --- a/src/utils/matlab/libs/dll_pll_veml_read_tracking_dump.m +++ b/src/utils/matlab/libs/dll_pll_veml_read_tracking_dump.m @@ -1,130 +1,128 @@ -% /*! -% * \file dll_pll_veml_read_tracking_dump.m -% * \brief Read GNSS-SDR Tracking dump binary file into MATLAB. -% * \author Luis Esteve, 2012. luis(at)epsilon-formacion.com -% * ------------------------------------------------------------------------- -% * -% * Copyright (C) 2010-2012 (see AUTHORS file for a list of contributors) -% * -% * GNSS-SDR is a software defined Global Navigation -% * Satellite Systems receiver -% * -% * This file is part of GNSS-SDR. -% * -% * GNSS-SDR is free software: you can redistribute it and/or modify -% * it under the terms of the GNU General Public License as published by -% * the Free Software Foundation, either version 3 of the License, or -% * at your option) any later version. -% * -% * GNSS-SDR is distributed in the hope that it will be useful, -% * but WITHOUT ANY WARRANTY; without even the implied warranty of -% * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% * GNU General Public License for more details. -% * -% * You should have received a copy of the GNU General Public License -% * along with GNSS-SDR. If not, see . -% * -% * ------------------------------------------------------------------------- -% */ +% Usage: dll_pll_veml_read_tracking_dump (filename, [count]) +% +% Opens GNSS-SDR tracking binary log file .dat and returns the contents + +% Read GNSS-SDR Tracking dump binary file into MATLAB. +% Luis Esteve, 2012. luis(at)epsilon-formacion.com +% ------------------------------------------------------------------------- +% +% Copyright (C) 2010-2018 (see AUTHORS file for a list of contributors) +% +% GNSS-SDR is a software defined Global Navigation +% Satellite Systems receiver +% +% This file is part of GNSS-SDR. +% +% GNSS-SDR is free software: you can redistribute it and/or modify +% it under the terms of the GNU General Public License as published by +% the Free Software Foundation, either version 3 of the License, or +% at your option) any later version. +% +% GNSS-SDR is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with GNSS-SDR. If not, see . +% +% ------------------------------------------------------------------------- +% function [GNSS_tracking] = dll_pll_veml_read_tracking_dump (filename, count) - %% usage: dll_pll_veml_read_tracking_dump (filename, [count]) - %% - %% open GNSS-SDR tracking binary log file .dat and return the contents - %% - m = nargchk (1,2,nargin); - - num_float_vars = 17; - num_unsigned_long_int_vars = 1; - num_double_vars = 1; - num_unsigned_int_vars = 1; - - if(~isempty(strfind(computer('arch'), '64'))) - % 64-bit computer - double_size_bytes = 8; - unsigned_long_int_size_bytes = 8; - float_size_bytes = 4; - unsigned_int_size_bytes = 4; - else - double_size_bytes = 8; - unsigned_long_int_size_bytes = 4; - float_size_bytes = 4; - unsigned_int_size_bytes = 4; - end - - skip_bytes_each_read = float_size_bytes * num_float_vars + unsigned_long_int_size_bytes * num_unsigned_long_int_vars + ... - double_size_bytes * num_double_vars + num_unsigned_int_vars*unsigned_int_size_bytes; - - bytes_shift = 0; - - if (m) +m = nargchk (1,2,nargin); + +num_float_vars = 17; +num_unsigned_long_int_vars = 1; +num_double_vars = 1; +num_unsigned_int_vars = 1; + +if(~isempty(strfind(computer('arch'), '64'))) + % 64-bit computer + double_size_bytes = 8; + unsigned_long_int_size_bytes = 8; + float_size_bytes = 4; + unsigned_int_size_bytes = 4; +else + double_size_bytes = 8; + unsigned_long_int_size_bytes = 4; + float_size_bytes = 4; + unsigned_int_size_bytes = 4; +end + +skip_bytes_each_read = float_size_bytes * num_float_vars + unsigned_long_int_size_bytes * num_unsigned_long_int_vars + ... + double_size_bytes * num_double_vars + num_unsigned_int_vars*unsigned_int_size_bytes; + +bytes_shift = 0; + +if (m) usage (m); - end +end - if (nargin < 2) +if (nargin < 2) count = Inf; - end - %loops_counter = fread (f, count, 'uint32',4*12); - f = fopen (filename, 'rb'); - if (f < 0) - else +end +%loops_counter = fread (f, count, 'uint32',4*12); +f = fopen (filename, 'rb'); +if (f < 0) +else v1 = fread (f, count, 'float', skip_bytes_each_read - float_size_bytes); - bytes_shift = bytes_shift + float_size_bytes; + bytes_shift = bytes_shift + float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next float v2 = fread (f, count, 'float', skip_bytes_each_read - float_size_bytes); - bytes_shift = bytes_shift + float_size_bytes; + bytes_shift = bytes_shift + float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next float v3 = fread (f, count, 'float', skip_bytes_each_read - float_size_bytes); - bytes_shift = bytes_shift + float_size_bytes; + bytes_shift = bytes_shift + float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next float v4 = fread (f, count, 'float', skip_bytes_each_read - float_size_bytes); - bytes_shift = bytes_shift + float_size_bytes; + bytes_shift = bytes_shift + float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next float v5 = fread (f, count, 'float', skip_bytes_each_read - float_size_bytes); - bytes_shift = bytes_shift + float_size_bytes; + bytes_shift = bytes_shift + float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next float v6 = fread (f, count, 'float', skip_bytes_each_read - float_size_bytes); - bytes_shift = bytes_shift + float_size_bytes; + bytes_shift = bytes_shift + float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next float v7 = fread (f, count, 'float', skip_bytes_each_read - float_size_bytes); - bytes_shift = bytes_shift + float_size_bytes; + bytes_shift = bytes_shift + float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved float v8 = fread (f, count, 'long', skip_bytes_each_read - unsigned_long_int_size_bytes); - bytes_shift = bytes_shift + unsigned_long_int_size_bytes; + bytes_shift = bytes_shift + unsigned_long_int_size_bytes; fseek(f,bytes_shift,'bof'); % move to next float v9 = fread (f, count, 'float', skip_bytes_each_read - float_size_bytes); - bytes_shift = bytes_shift + float_size_bytes; + bytes_shift = bytes_shift + float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next float v10 = fread (f, count, 'float', skip_bytes_each_read - float_size_bytes); - bytes_shift = bytes_shift + float_size_bytes; + bytes_shift = bytes_shift + float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next float v11 = fread (f, count, 'float', skip_bytes_each_read - float_size_bytes); - bytes_shift = bytes_shift + float_size_bytes; + bytes_shift = bytes_shift + float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next float v12 = fread (f, count, 'float', skip_bytes_each_read - float_size_bytes); - bytes_shift = bytes_shift + float_size_bytes; + bytes_shift = bytes_shift + float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next float v13 = fread (f, count, 'float', skip_bytes_each_read - float_size_bytes); - bytes_shift = bytes_shift + float_size_bytes; + bytes_shift = bytes_shift + float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next float v14 = fread (f, count, 'float', skip_bytes_each_read - float_size_bytes); - bytes_shift = bytes_shift + float_size_bytes; + bytes_shift = bytes_shift + float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next float v15 = fread (f, count, 'float', skip_bytes_each_read - float_size_bytes); - bytes_shift = bytes_shift + float_size_bytes; + bytes_shift = bytes_shift + float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next float v16 = fread (f, count, 'float', skip_bytes_each_read - float_size_bytes); - bytes_shift = bytes_shift + float_size_bytes; + bytes_shift = bytes_shift + float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved float v17 = fread (f, count, 'float', skip_bytes_each_read - float_size_bytes); - bytes_shift = bytes_shift + float_size_bytes; + bytes_shift = bytes_shift + float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next float v18 = fread (f, count, 'float', skip_bytes_each_read-float_size_bytes); - bytes_shift = bytes_shift + float_size_bytes; + bytes_shift = bytes_shift + float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next double - v19 = fread (f, count, 'double', skip_bytes_each_read - double_size_bytes); - bytes_shift = bytes_shift + double_size_bytes; + v19 = fread (f, count, 'double', skip_bytes_each_read - double_size_bytes); + bytes_shift = bytes_shift + double_size_bytes; fseek(f,bytes_shift,'bof'); % move to next unsigned int v20 = fread (f, count, 'uint', skip_bytes_each_read - unsigned_int_size_bytes); fclose (f); @@ -149,5 +147,5 @@ function [GNSS_tracking] = dll_pll_veml_read_tracking_dump (filename, count) GNSS_tracking.var1 = v18; GNSS_tracking.var2 = v19; GNSS_tracking.PRN = v20; - end - +end + diff --git a/src/utils/matlab/libs/galileo_e1_dll_pll_veml_read_tracking_dump.m b/src/utils/matlab/libs/galileo_e1_dll_pll_veml_read_tracking_dump.m deleted file mode 100644 index 0ccb1bb40..000000000 --- a/src/utils/matlab/libs/galileo_e1_dll_pll_veml_read_tracking_dump.m +++ /dev/null @@ -1,153 +0,0 @@ -% /*! -% * \file galileo_e1_dll_pll_veml_read_tracking_dump.m -% * \brief Read GNSS-SDR Tracking dump binary file into MATLAB. -% * \author Luis Esteve, 2012. luis(at)epsilon-formacion.com -% * ------------------------------------------------------------------------- -% * -% * Copyright (C) 2010-2012 (see AUTHORS file for a list of contributors) -% * -% * GNSS-SDR is a software defined Global Navigation -% * Satellite Systems receiver -% * -% * This file is part of GNSS-SDR. -% * -% * GNSS-SDR is free software: you can redistribute it and/or modify -% * it under the terms of the GNU General Public License as published by -% * the Free Software Foundation, either version 3 of the License, or -% * at your option) any later version. -% * -% * GNSS-SDR is distributed in the hope that it will be useful, -% * but WITHOUT ANY WARRANTY; without even the implied warranty of -% * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% * GNU General Public License for more details. -% * -% * You should have received a copy of the GNU General Public License -% * along with GNSS-SDR. If not, see . -% * -% * ------------------------------------------------------------------------- -% */ - -function [GNSS_tracking] = galileo_e1_dll_pll_veml_read_tracking_dump (filename, count) - %% usage: galileo_e1_dll_pll_veml_read_tracking_dump (filename, [count]) - %% - %% open GNSS-SDR tracking binary log file .dat and return the contents - %% - - m = nargchk (1,2,nargin); - - num_float_vars = 17; - num_unsigned_long_int_vars = 1; - num_double_vars = 1; - num_unsigned_int_vars = 1; - - if(~isempty(strfind(computer('arch'), '64'))) - % 64-bit computer - double_size_bytes = 8; - unsigned_long_int_size_bytes = 8; - float_size_bytes = 4; - unsigned_int_size_bytes = 4; - else - double_size_bytes = 8; - unsigned_long_int_size_bytes = 4; - float_size_bytes = 4; - unsigned_int_size_bytes = 4; - end - - skip_bytes_each_read = float_size_bytes * num_float_vars + unsigned_long_int_size_bytes * num_unsigned_long_int_vars + ... - double_size_bytes * num_double_vars + num_unsigned_int_vars*unsigned_int_size_bytes; - - bytes_shift = 0; - - if (m) - usage (m); - end - - if (nargin < 2) - count = Inf; - end - %loops_counter = fread (f, count, 'uint32',4*12); - f = fopen (filename, 'rb'); - if (f < 0) - else - v1 = fread (f, count, 'float', skip_bytes_each_read - float_size_bytes); - bytes_shift = bytes_shift + float_size_bytes; - fseek(f,bytes_shift,'bof'); % move to next float - v2 = fread (f, count, 'float', skip_bytes_each_read - float_size_bytes); - bytes_shift = bytes_shift + float_size_bytes; - fseek(f,bytes_shift,'bof'); % move to next float - v3 = fread (f, count, 'float', skip_bytes_each_read - float_size_bytes); - bytes_shift = bytes_shift + float_size_bytes; - fseek(f,bytes_shift,'bof'); % move to next float - v4 = fread (f, count, 'float', skip_bytes_each_read - float_size_bytes); - bytes_shift = bytes_shift + float_size_bytes; - fseek(f,bytes_shift,'bof'); % move to next float - v5 = fread (f, count, 'float', skip_bytes_each_read - float_size_bytes); - bytes_shift = bytes_shift + float_size_bytes; - fseek(f,bytes_shift,'bof'); % move to next float - v6 = fread (f, count, 'float', skip_bytes_each_read - float_size_bytes); - bytes_shift = bytes_shift + float_size_bytes; - fseek(f,bytes_shift,'bof'); % move to next float - v7 = fread (f, count, 'float', skip_bytes_each_read - float_size_bytes); - bytes_shift = bytes_shift + float_size_bytes; - fseek(f,bytes_shift,'bof'); % move to next interleaved float - v8 = fread (f, count, 'long', skip_bytes_each_read - unsigned_long_int_size_bytes); - bytes_shift = bytes_shift + unsigned_long_int_size_bytes; - fseek(f,bytes_shift,'bof'); % move to next float - v9 = fread (f, count, 'float', skip_bytes_each_read - float_size_bytes); - bytes_shift = bytes_shift + float_size_bytes; - fseek(f,bytes_shift,'bof'); % move to next float - v10 = fread (f, count, 'float', skip_bytes_each_read - float_size_bytes); - bytes_shift = bytes_shift + float_size_bytes; - fseek(f,bytes_shift,'bof'); % move to next float - v11 = fread (f, count, 'float', skip_bytes_each_read - float_size_bytes); - bytes_shift = bytes_shift + float_size_bytes; - fseek(f,bytes_shift,'bof'); % move to next float - v12 = fread (f, count, 'float', skip_bytes_each_read - float_size_bytes); - bytes_shift = bytes_shift + float_size_bytes; - fseek(f,bytes_shift,'bof'); % move to next float - v13 = fread (f, count, 'float', skip_bytes_each_read - float_size_bytes); - bytes_shift = bytes_shift + float_size_bytes; - fseek(f,bytes_shift,'bof'); % move to next float - v14 = fread (f, count, 'float', skip_bytes_each_read - float_size_bytes); - bytes_shift = bytes_shift + float_size_bytes; - fseek(f,bytes_shift,'bof'); % move to next float - v15 = fread (f, count, 'float', skip_bytes_each_read - float_size_bytes); - bytes_shift = bytes_shift + float_size_bytes; - fseek(f,bytes_shift,'bof'); % move to next float - v16 = fread (f, count, 'float', skip_bytes_each_read - float_size_bytes); - bytes_shift = bytes_shift + float_size_bytes; - fseek(f,bytes_shift,'bof'); % move to next interleaved float - v17 = fread (f, count, 'float', skip_bytes_each_read - float_size_bytes); - bytes_shift = bytes_shift + float_size_bytes; - fseek(f,bytes_shift,'bof'); % move to next float - v18 = fread (f, count, 'float', skip_bytes_each_read-float_size_bytes); - bytes_shift = bytes_shift + float_size_bytes; - fseek(f,bytes_shift,'bof'); % move to next double - v19 = fread (f, count, 'double', skip_bytes_each_read - double_size_bytes); - bytes_shift = bytes_shift + double_size_bytes; - fseek(f,bytes_shift,'bof'); % move to next unsigned int - v20 = fread (f, count, 'uint', skip_bytes_each_read - unsigned_int_size_bytes); - fclose (f); - - GNSS_tracking.VE = v1; - GNSS_tracking.E = v2; - GNSS_tracking.P = v3; - GNSS_tracking.L = v4; - GNSS_tracking.VL = v5; - GNSS_tracking.prompt_I = v6; - GNSS_tracking.prompt_Q = v7; - GNSS_tracking.PRN_start_sample = v8; - GNSS_tracking.acc_carrier_phase_rad = v9; - GNSS_tracking.carrier_doppler_hz = v10; - GNSS_tracking.code_freq_hz = v11; - GNSS_tracking.carr_error = v12; - GNSS_tracking.carr_nco = v13; - GNSS_tracking.code_error = v14; - GNSS_tracking.code_nco = v15; - GNSS_tracking.CN0_SNV_dB_Hz = v16; - GNSS_tracking.carrier_lock_test = v17; - GNSS_tracking.var1 = v18; - GNSS_tracking.var2 = v19; - GNSS_tracking.PRN = v20; - end - diff --git a/src/utils/matlab/libs/glonass_ca_dll_pll_read_tracking_dump.m b/src/utils/matlab/libs/glonass_ca_dll_pll_read_tracking_dump.m deleted file mode 100644 index 7141d1970..000000000 --- a/src/utils/matlab/libs/glonass_ca_dll_pll_read_tracking_dump.m +++ /dev/null @@ -1,191 +0,0 @@ -% /*! -% * \file glonass_ca_dll_pll_read_tracking_dump.m -% * \brief Read GNSS-SDR Tracking dump binary file into MATLAB. -% * \author Damian Miralles, 2017. dmiralles2009(at)gmail.com -% * ------------------------------------------------------------------------- -% * -% * Copyright (C) 2010-2011 (see AUTHORS file for a list of contributors) -% * -% * GNSS-SDR is a software defined Global Navigation -% * Satellite Systems receiver -% * -% * This file is part of GNSS-SDR. -% * -% * GNSS-SDR is free software: you can redistribute it and/or modify -% * it under the terms of the GNU General Public License as published by -% * the Free Software Foundation, either version 3 of the License, or -% * at your option) any later version. -% * -% * GNSS-SDR is distributed in the hope that it will be useful, -% * but WITHOUT ANY WARRANTY; without even the implied warranty of -% * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% * GNU General Public License for more details. -% * -% * You should have received a copy of the GNU General Public License -% * along with GNSS-SDR. If not, see . -% * -% * ------------------------------------------------------------------------- -% */ -function [GNSS_tracking] = glonass_ca_dll_pll_read_tracking_dump (filename, count) - - %% usage: gps_l1_ca_dll_pll_read_tracking_dump_64bits (filename, [count]) - %% - %% open GNSS-SDR tracking binary log file .dat and return the contents - %% - - narginchk (1,2); - num_float_vars=5; - num_unsigned_long_int_vars=1; - num_double_vars=11; - num_unsigned_int_vars=1; - double_size_bytes=8; - unsigned_long_int_size_bytes=8; - float_size_bytes=4; - long_int_size_bytes=4; - - skip_bytes_each_read=float_size_bytes*num_float_vars+unsigned_long_int_size_bytes*num_unsigned_long_int_vars+double_size_bytes*num_double_vars+long_int_size_bytes*num_unsigned_int_vars; - bytes_shift=0; - - if (nargin < 2) - %count = Inf; - file_stats = dir(filename); - %round num bytes to read to integer number of samples (to protect the script from binary - %dump end file transitory) - count = (file_stats.bytes - mod(file_stats.bytes,skip_bytes_each_read))/skip_bytes_each_read; - end - %loops_counter = fread (f, count, 'uint32',4*12); - f = fopen (filename, 'rb'); - if (f < 0) - else - v1 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); - bytes_shift=bytes_shift+float_size_bytes; - fseek(f,bytes_shift,'bof'); % move to next interleaved float - v2 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); - bytes_shift=bytes_shift+float_size_bytes; - fseek(f,bytes_shift,'bof'); % move to next interleaved float - v3 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); - bytes_shift=bytes_shift+float_size_bytes; - fseek(f,bytes_shift,'bof'); % move to next interleaved float - v4 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); - bytes_shift=bytes_shift+float_size_bytes; - fseek(f,bytes_shift,'bof'); % move to next interleaved float - v5 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); - bytes_shift=bytes_shift+float_size_bytes; - fseek(f,bytes_shift,'bof'); % move to next interleaved unsigned_long_int - v6 = fread (f, count, 'uint64',skip_bytes_each_read-unsigned_long_int_size_bytes); - bytes_shift=bytes_shift+unsigned_long_int_size_bytes; - fseek(f,bytes_shift,'bof'); % move to next interleaved double - v7 = fread (f, count, 'float64',skip_bytes_each_read-double_size_bytes); - bytes_shift=bytes_shift+double_size_bytes; - fseek(f,bytes_shift,'bof'); % move to next interleaved double - v8 = fread (f, count, 'float64',skip_bytes_each_read-double_size_bytes); - bytes_shift=bytes_shift+double_size_bytes; - fseek(f,bytes_shift,'bof'); % move to next interleaved double - v9 = fread (f, count, 'float64',skip_bytes_each_read-double_size_bytes); - bytes_shift=bytes_shift+double_size_bytes; - fseek(f,bytes_shift,'bof'); % move to next interleaved double - v10 = fread (f, count, 'float64',skip_bytes_each_read-double_size_bytes); - bytes_shift=bytes_shift+double_size_bytes; - fseek(f,bytes_shift,'bof'); % move to next interleaved double - v11 = fread (f, count, 'float64',skip_bytes_each_read-double_size_bytes); - bytes_shift=bytes_shift+double_size_bytes; - fseek(f,bytes_shift,'bof'); % move to next interleaved double - v12 = fread (f, count, 'float64',skip_bytes_each_read-double_size_bytes); - bytes_shift=bytes_shift+double_size_bytes; - fseek(f,bytes_shift,'bof'); % move to next interleaved double - v13 = fread (f, count, 'float64',skip_bytes_each_read-double_size_bytes); - bytes_shift=bytes_shift+double_size_bytes; - fseek(f,bytes_shift,'bof'); % move to next interleaved double - v14 = fread (f, count, 'float64',skip_bytes_each_read-double_size_bytes); - bytes_shift=bytes_shift+double_size_bytes; - fseek(f,bytes_shift,'bof'); % move to next interleaved double - v15 = fread (f, count, 'float64',skip_bytes_each_read-double_size_bytes); - bytes_shift=bytes_shift+double_size_bytes; - fseek(f,bytes_shift,'bof'); % move to next interleaved double - v16 = fread (f, count, 'float64',skip_bytes_each_read-double_size_bytes); - bytes_shift=bytes_shift+double_size_bytes; - fseek(f,bytes_shift,'bof'); % move to next interleaved double - v17 = fread (f, count, 'float64',skip_bytes_each_read-double_size_bytes); - bytes_shift=bytes_shift+double_size_bytes; - fseek(f,bytes_shift,'bof'); % move to next interleaved double - v18 = fread (f, count, 'uint32',skip_bytes_each_read-double_size_bytes); - fclose (f); - - %%%%%%%% output vars %%%%%%%% - -% // EPR -% d_dump_file.write(reinterpret_cast(&tmp_E), sizeof(float)); -% d_dump_file.write(reinterpret_cast(&tmp_P), sizeof(float)); -% d_dump_file.write(reinterpret_cast(&tmp_L), sizeof(float)); -% // PROMPT I and Q (to analyze navigation symbols) -% d_dump_file.write(reinterpret_cast(&prompt_I), sizeof(float)); -% d_dump_file.write(reinterpret_cast(&prompt_Q), sizeof(float)); -% // PRN start sample stamp -% //tmp_float=(float)d_sample_counter; -% d_dump_file.write(reinterpret_cast(&d_sample_counter), sizeof(unsigned long int)); -% // accumulated carrier phase -% d_dump_file.write(reinterpret_cast(&d_acc_carrier_phase_rad), sizeof(double)); -% -% // carrier and code frequency -% d_dump_file.write(reinterpret_cast(&d_carrier_doppler_hz), sizeof(double)); -% d_dump_file.write(reinterpret_cast(&d_code_freq_chips), sizeof(double)); -% -% //PLL commands -% d_dump_file.write(reinterpret_cast(&carr_phase_error_secs_Ti), sizeof(double)); -% d_dump_file.write(reinterpret_cast(&d_carrier_doppler_hz), sizeof(double)); -% -% //DLL commands -% d_dump_file.write(reinterpret_cast(&code_error_chips_Ti), sizeof(double)); -% d_dump_file.write(reinterpret_cast(&code_error_filt_chips), sizeof(double)); -% -% // CN0 and carrier lock test -% d_dump_file.write(reinterpret_cast(&d_CN0_SNV_dB_Hz), sizeof(double)); -% d_dump_file.write(reinterpret_cast(&d_carrier_lock_test), sizeof(double)); -% -% // AUX vars (for debug purposes) -% tmp_double = d_rem_code_phase_samples; -% d_dump_file.write(reinterpret_cast(&tmp_double), sizeof(double)); -% tmp_double = static_cast(d_sample_counter + d_current_prn_length_samples); -% d_dump_file.write(reinterpret_cast(&tmp_double), sizeof(double)); -% // PRN -% unsigned int prn_ = d_acquisition_gnss_synchro->PRN; -% d_dump_file.write(reinterpret_cast(&prn_), sizeof(unsigned int)); - E=v1; - P=v2; - L=v3; - prompt_I=v4; - prompt_Q=v5; - PRN_start_sample=v6; - acc_carrier_phase_rad=v7; - carrier_freq_hz=v8; - code_freq_hz=v9; - carr_error=v10; - carr_nco=v11; - code_error=v12; - code_nco=v13; - CN0_SNV_dB_Hz=v14; - carrier_lock_test=v15; - var1=v16; - var2=v17; - PRN=v18; - - GNSS_tracking.E=E; - GNSS_tracking.P=P; - GNSS_tracking.L=L; - GNSS_tracking.prompt_I=prompt_I; - GNSS_tracking.prompt_Q=prompt_Q; - GNSS_tracking.PRN_start_sample=PRN_start_sample; - GNSS_tracking.acc_carrier_phase_rad=acc_carrier_phase_rad; - GNSS_tracking.carrier_freq_hz=carrier_freq_hz; - GNSS_tracking.code_freq_hz=code_freq_hz; - GNSS_tracking.carr_error=carr_error; - GNSS_tracking.carr_nco=carr_nco; - GNSS_tracking.code_error=code_error; - GNSS_tracking.code_nco=code_nco; - GNSS_tracking.CN0_SNV_dB_Hz=CN0_SNV_dB_Hz; - GNSS_tracking.carrier_lock_test=carrier_lock_test; - GNSS_tracking.d_rem_code_phase_samples=var1; - GNSS_tracking.var2=var2; - GNSS_tracking.PRN=PRN; - end - diff --git a/src/utils/matlab/libs/gps_l1_ca_dll_fll_pll_read_tracking_dump.m b/src/utils/matlab/libs/gps_l1_ca_dll_fll_pll_read_tracking_dump.m deleted file mode 100644 index d7f7bb58a..000000000 --- a/src/utils/matlab/libs/gps_l1_ca_dll_fll_pll_read_tracking_dump.m +++ /dev/null @@ -1,178 +0,0 @@ -% /*! -% * \file gps_l1_ca_dll_fll_pll_read_tracking_dump.m -% * \brief Read GNSS-SDR Tracking dump binary file into MATLAB. -% * \author Javier Arribas, 2011. jarribas(at)cttc.es -% * ------------------------------------------------------------------------- -% * -% * Copyright (C) 2010-2011 (see AUTHORS file for a list of contributors) -% * -% * GNSS-SDR is a software defined Global Navigation -% * Satellite Systems receiver -% * -% * This file is part of GNSS-SDR. -% * -% * GNSS-SDR is free software: you can redistribute it and/or modify -% * it under the terms of the GNU General Public License as published by -% * the Free Software Foundation, either version 3 of the License, or -% * at your option) any later version. -% * -% * GNSS-SDR is distributed in the hope that it will be useful, -% * but WITHOUT ANY WARRANTY; without even the implied warranty of -% * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% * GNU General Public License for more details. -% * -% * You should have received a copy of the GNU General Public License -% * along with GNSS-SDR. If not, see . -% * -% * ------------------------------------------------------------------------- -% */ -function [GNSS_tracking] = gps_l1_ca_dll_fll_pll_read_tracking_dump (filename, samplingFreq, count) - - %% usage: gps_l1_ca_dll_fll_pll_read_tracking_dump (filename, [count]) - %% - %% open GNSS-SDR tracking binary log file .dat and return the contents - %% - - m = nargchk (1,3,nargin); - num_float_vars=16; - num_double_vars=1; - double_size_bytes=8; - float_size_bytes=4; - skip_bytes_each_read=float_size_bytes*num_float_vars+double_size_bytes*num_double_vars; - bytes_shift=0; - if (m) - usage (m); - end - - if (nargin < 3) - count = Inf; - end - %loops_counter = fread (f, count, 'uint32',4*12); - f = fopen (filename, 'rb'); - if (f < 0) - else - v1 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); - bytes_shift=bytes_shift+float_size_bytes; - fseek(f,bytes_shift,'bof'); % move to next interleaved float - v2 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); - bytes_shift=bytes_shift+float_size_bytes; - fseek(f,bytes_shift,'bof'); % move to next interleaved float - v3 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); - bytes_shift=bytes_shift+float_size_bytes; - fseek(f,bytes_shift,'bof'); % move to next interleaved float - v4 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); - bytes_shift=bytes_shift+float_size_bytes; - fseek(f,bytes_shift,'bof'); % move to next interleaved float - v5 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); - bytes_shift=bytes_shift+float_size_bytes; - fseek(f,bytes_shift,'bof'); % move to next interleaved float - v6 = fread (f, count, 'uint32',skip_bytes_each_read-float_size_bytes); - bytes_shift=bytes_shift+float_size_bytes; - fseek(f,bytes_shift,'bof'); % move to next interleaved float - v7 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); - bytes_shift=bytes_shift+float_size_bytes; - fseek(f,bytes_shift,'bof'); % move to next interleaved float - v8 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); - bytes_shift=bytes_shift+float_size_bytes; - fseek(f,bytes_shift,'bof'); % move to next interleaved float - v9 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); - bytes_shift=bytes_shift+float_size_bytes; - fseek(f,bytes_shift,'bof'); % move to next interleaved float - v10 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); - bytes_shift=bytes_shift+float_size_bytes; - fseek(f,bytes_shift,'bof'); % move to next interleaved float - v11 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); - bytes_shift=bytes_shift+float_size_bytes; - fseek(f,bytes_shift,'bof'); % move to next interleaved float - v12 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); - bytes_shift=bytes_shift+float_size_bytes; - fseek(f,bytes_shift,'bof'); % move to next interleaved float - v13 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); - bytes_shift=bytes_shift+float_size_bytes; - fseek(f,bytes_shift,'bof'); % move to next interleaved float - v14 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); - bytes_shift=bytes_shift+float_size_bytes; - fseek(f,bytes_shift,'bof'); % move to next interleaved float - v15 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); - bytes_shift=bytes_shift+float_size_bytes; - fseek(f,bytes_shift,'bof'); % move to next interleaved float - v16 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); - bytes_shift=bytes_shift+float_size_bytes; - fseek(f,bytes_shift,'bof'); % move to next interleaved float - v17 = fread (f, count, 'float64',skip_bytes_each_read-double_size_bytes); - fclose (f); - - %%%%%%%% output vars %%%%%%%% - -% // EPR -% d_dump_file.write((char*)&tmp_E, sizeof(float)); -% d_dump_file.write((char*)&tmp_P, sizeof(float)); -% d_dump_file.write((char*)&tmp_L, sizeof(float)); -% // PROMPT I and Q (to analyze navigation symbols) -% d_dump_file.write((char*)&prompt_I, sizeof(float)); -% d_dump_file.write((char*)&prompt_Q, sizeof(float)); -% // PRN start sample stamp -% //tmp_float=(float)d_sample_counter; -% d_dump_file.write((char*)&d_sample_counter, sizeof(unsigned long int)); -% // accumulated carrier phase -% d_dump_file.write((char*)&d_acc_carrier_phase_rad, sizeof(float)); -% -% // carrier and code frequency -% d_dump_file.write((char*)&d_carrier_doppler_hz, sizeof(float)); -% d_dump_file.write((char*)&d_code_freq_hz, sizeof(float)); -% -% //PLL commands -% d_dump_file.write((char*)&PLL_discriminator_hz, sizeof(float)); -% d_dump_file.write((char*)&carr_nco_hz, sizeof(float)); -% -% //DLL commands -% d_dump_file.write((char*)&code_error_chips, sizeof(float)); -% d_dump_file.write((char*)&d_code_phase_samples, sizeof(float)); -% -% // CN0 and carrier lock test -% d_dump_file.write((char*)&d_CN0_SNV_dB_Hz, sizeof(float)); -% d_dump_file.write((char*)&d_carrier_lock_test, sizeof(float)); -% -% // AUX vars (for debug purposes) -% tmp_float=0; -% d_dump_file.write((char*)&tmp_float, sizeof(float)); -% d_dump_file.write((char*)&d_sample_counter_seconds, sizeof(double)); - - E=v1; - P=v2; - L=v3; - prompt_I=v4; - prompt_Q=v5; - PRN_start_sample=v6; - acc_carrier_phase_rad=v7; - carrier_doppler_hz=v8; - code_freq_hz=v9; - PLL_discriminator_hz=v10; - carr_nco_hz=v11; - code_error_chips=v12; - code_phase_samples=v13; - CN0_SNV_dB_Hz=v14; - carrier_lock_test=v15; - var1=v16; - var2=v17; - - GNSS_tracking.E=E; - GNSS_tracking.P=P; - GNSS_tracking.L=L; - GNSS_tracking.prompt_I=prompt_I; - GNSS_tracking.prompt_Q=prompt_Q; - GNSS_tracking.PRN_start_sample=PRN_start_sample; - GNSS_tracking.acc_carrier_phase_rad=acc_carrier_phase_rad; - GNSS_tracking.carrier_doppler_hz=carrier_doppler_hz; - GNSS_tracking.code_freq_hz=code_freq_hz; - GNSS_tracking.PLL_discriminator_hz=PLL_discriminator_hz; - GNSS_tracking.carr_nco=carr_nco_hz; - GNSS_tracking.code_error_chips=code_error_chips; - GNSS_tracking.code_phase_samples=code_phase_samples; - GNSS_tracking.CN0_SNV_dB_Hz=CN0_SNV_dB_Hz; - GNSS_tracking.carrier_lock_test=carrier_lock_test; - GNSS_tracking.var1=var1; - GNSS_tracking.var2=var2; - GNSS_tracking.prn_delay_ms=1000*(GNSS_tracking.var2+GNSS_tracking.var1)./samplingFreq; - end - diff --git a/src/utils/matlab/libs/gps_l1_ca_dll_pll_read_tracking_dump.m b/src/utils/matlab/libs/gps_l1_ca_dll_pll_read_tracking_dump.m index 4a060118f..1346816eb 100644 --- a/src/utils/matlab/libs/gps_l1_ca_dll_pll_read_tracking_dump.m +++ b/src/utils/matlab/libs/gps_l1_ca_dll_pll_read_tracking_dump.m @@ -1,158 +1,156 @@ -% /*! -% * \file gps_l1_ca_dll_pll_read_tracking_dump.m -% * \brief Read GNSS-SDR Tracking dump binary file into MATLAB. -% * \author Javier Arribas, 2011. jarribas(at)cttc.es -% * ------------------------------------------------------------------------- -% * -% * Copyright (C) 2010-2011 (see AUTHORS file for a list of contributors) -% * -% * GNSS-SDR is a software defined Global Navigation -% * Satellite Systems receiver -% * -% * This file is part of GNSS-SDR. -% * -% * GNSS-SDR is free software: you can redistribute it and/or modify -% * it under the terms of the GNU General Public License as published by -% * the Free Software Foundation, either version 3 of the License, or -% * at your option) any later version. -% * -% * GNSS-SDR is distributed in the hope that it will be useful, -% * but WITHOUT ANY WARRANTY; without even the implied warranty of -% * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% * GNU General Public License for more details. -% * -% * You should have received a copy of the GNU General Public License -% * along with GNSS-SDR. If not, see . -% * -% * ------------------------------------------------------------------------- -% */ +% Usage: gps_l1_ca_dll_pll_read_tracking_dump_64bits (filename, [count]) +% +% Opens GNSS-SDR tracking binary log file .dat and returns the contents + +% Read GNSS-SDR Tracking dump binary file into MATLAB. +% Javier Arribas, 2011. jarribas(at)cttc.es +% ------------------------------------------------------------------------- +% +% Copyright (C) 2010-2018 (see AUTHORS file for a list of contributors) +% +% GNSS-SDR is a software defined Global Navigation +% Satellite Systems receiver +% +% This file is part of GNSS-SDR. +% +% GNSS-SDR is free software: you can redistribute it and/or modify +% it under the terms of the GNU General Public License as published by +% the Free Software Foundation, either version 3 of the License, or +% at your option) any later version. +% +% GNSS-SDR is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with GNSS-SDR. If not, see . +% +% ------------------------------------------------------------------------- +% + function [GNSS_tracking] = gps_l1_ca_dll_pll_read_tracking_dump (filename, count) - %% usage: gps_l1_ca_dll_pll_read_tracking_dump_64bits (filename, [count]) - %% - %% open GNSS-SDR tracking binary log file .dat and return the contents - %% +m = nargchk (1,2,nargin); +num_float_vars=5; +num_unsigned_long_int_vars=1; +num_double_vars=11; +num_unsigned_int_vars=1; +double_size_bytes=8; +unsigned_long_int_size_bytes=8; +float_size_bytes=4; +long_int_size_bytes=4; - m = nargchk (1,2,nargin); - num_float_vars=5; - num_unsigned_long_int_vars=1; - num_double_vars=11; - num_unsigned_int_vars=1; - double_size_bytes=8; - unsigned_long_int_size_bytes=8; - float_size_bytes=4; - long_int_size_bytes=4; - - skip_bytes_each_read=float_size_bytes*num_float_vars+unsigned_long_int_size_bytes*num_unsigned_long_int_vars+double_size_bytes*num_double_vars+long_int_size_bytes*num_unsigned_int_vars; - bytes_shift=0; - if (m) +skip_bytes_each_read=float_size_bytes*num_float_vars+unsigned_long_int_size_bytes*num_unsigned_long_int_vars+double_size_bytes*num_double_vars+long_int_size_bytes*num_unsigned_int_vars; +bytes_shift=0; +if (m) usage (m); - end +end - if (nargin < 2) +if (nargin < 2) %count = Inf; file_stats = dir(filename); %round num bytes to read to integer number of samples (to protect the script from binary %dump end file transitory) count = (file_stats.bytes - mod(file_stats.bytes,skip_bytes_each_read))/skip_bytes_each_read; - end - %loops_counter = fread (f, count, 'uint32',4*12); - f = fopen (filename, 'rb'); - if (f < 0) - else +end +%loops_counter = fread (f, count, 'uint32',4*12); +f = fopen (filename, 'rb'); +if (f < 0) +else v1 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); - bytes_shift=bytes_shift+float_size_bytes; + bytes_shift=bytes_shift+float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved float v2 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); - bytes_shift=bytes_shift+float_size_bytes; + bytes_shift=bytes_shift+float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved float v3 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); - bytes_shift=bytes_shift+float_size_bytes; + bytes_shift=bytes_shift+float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved float v4 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); - bytes_shift=bytes_shift+float_size_bytes; + bytes_shift=bytes_shift+float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved float v5 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); - bytes_shift=bytes_shift+float_size_bytes; + bytes_shift=bytes_shift+float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved unsigned_long_int v6 = fread (f, count, 'uint64',skip_bytes_each_read-unsigned_long_int_size_bytes); - bytes_shift=bytes_shift+unsigned_long_int_size_bytes; + bytes_shift=bytes_shift+unsigned_long_int_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved double v7 = fread (f, count, 'float64',skip_bytes_each_read-double_size_bytes); - bytes_shift=bytes_shift+double_size_bytes; + bytes_shift=bytes_shift+double_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved double v8 = fread (f, count, 'float64',skip_bytes_each_read-double_size_bytes); - bytes_shift=bytes_shift+double_size_bytes; + bytes_shift=bytes_shift+double_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved double v9 = fread (f, count, 'float64',skip_bytes_each_read-double_size_bytes); - bytes_shift=bytes_shift+double_size_bytes; + bytes_shift=bytes_shift+double_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved double v10 = fread (f, count, 'float64',skip_bytes_each_read-double_size_bytes); - bytes_shift=bytes_shift+double_size_bytes; + bytes_shift=bytes_shift+double_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved double v11 = fread (f, count, 'float64',skip_bytes_each_read-double_size_bytes); - bytes_shift=bytes_shift+double_size_bytes; + bytes_shift=bytes_shift+double_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved double v12 = fread (f, count, 'float64',skip_bytes_each_read-double_size_bytes); - bytes_shift=bytes_shift+double_size_bytes; + bytes_shift=bytes_shift+double_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved double v13 = fread (f, count, 'float64',skip_bytes_each_read-double_size_bytes); - bytes_shift=bytes_shift+double_size_bytes; + bytes_shift=bytes_shift+double_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved double v14 = fread (f, count, 'float64',skip_bytes_each_read-double_size_bytes); - bytes_shift=bytes_shift+double_size_bytes; + bytes_shift=bytes_shift+double_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved double v15 = fread (f, count, 'float64',skip_bytes_each_read-double_size_bytes); - bytes_shift=bytes_shift+double_size_bytes; + bytes_shift=bytes_shift+double_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved double v16 = fread (f, count, 'float64',skip_bytes_each_read-double_size_bytes); - bytes_shift=bytes_shift+double_size_bytes; + bytes_shift=bytes_shift+double_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved double v17 = fread (f, count, 'float64',skip_bytes_each_read-double_size_bytes); - bytes_shift=bytes_shift+double_size_bytes; + bytes_shift=bytes_shift+double_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved double v18 = fread (f, count, 'uint32',skip_bytes_each_read-double_size_bytes); fclose (f); %%%%%%%% output vars %%%%%%%% -% // EPR -% d_dump_file.write(reinterpret_cast(&tmp_E), sizeof(float)); -% d_dump_file.write(reinterpret_cast(&tmp_P), sizeof(float)); -% d_dump_file.write(reinterpret_cast(&tmp_L), sizeof(float)); -% // PROMPT I and Q (to analyze navigation symbols) -% d_dump_file.write(reinterpret_cast(&prompt_I), sizeof(float)); -% d_dump_file.write(reinterpret_cast(&prompt_Q), sizeof(float)); -% // PRN start sample stamp -% //tmp_float=(float)d_sample_counter; -% d_dump_file.write(reinterpret_cast(&d_sample_counter), sizeof(unsigned long int)); -% // accumulated carrier phase -% d_dump_file.write(reinterpret_cast(&d_acc_carrier_phase_rad), sizeof(double)); -% -% // carrier and code frequency -% d_dump_file.write(reinterpret_cast(&d_carrier_doppler_hz), sizeof(double)); -% d_dump_file.write(reinterpret_cast(&d_code_freq_chips), sizeof(double)); -% -% //PLL commands -% d_dump_file.write(reinterpret_cast(&carr_phase_error_secs_Ti), sizeof(double)); -% d_dump_file.write(reinterpret_cast(&d_carrier_doppler_hz), sizeof(double)); -% -% //DLL commands -% d_dump_file.write(reinterpret_cast(&code_error_chips_Ti), sizeof(double)); -% d_dump_file.write(reinterpret_cast(&code_error_filt_chips), sizeof(double)); -% -% // CN0 and carrier lock test -% d_dump_file.write(reinterpret_cast(&d_CN0_SNV_dB_Hz), sizeof(double)); -% d_dump_file.write(reinterpret_cast(&d_carrier_lock_test), sizeof(double)); -% -% // AUX vars (for debug purposes) -% tmp_double = d_rem_code_phase_samples; -% d_dump_file.write(reinterpret_cast(&tmp_double), sizeof(double)); -% tmp_double = static_cast(d_sample_counter + d_current_prn_length_samples); -% d_dump_file.write(reinterpret_cast(&tmp_double), sizeof(double)); -% // PRN -% unsigned int prn_ = d_acquisition_gnss_synchro->PRN; -% d_dump_file.write(reinterpret_cast(&prn_), sizeof(unsigned int)); + % // EPR + % d_dump_file.write(reinterpret_cast(&tmp_E), sizeof(float)); + % d_dump_file.write(reinterpret_cast(&tmp_P), sizeof(float)); + % d_dump_file.write(reinterpret_cast(&tmp_L), sizeof(float)); + % // PROMPT I and Q (to analyze navigation symbols) + % d_dump_file.write(reinterpret_cast(&prompt_I), sizeof(float)); + % d_dump_file.write(reinterpret_cast(&prompt_Q), sizeof(float)); + % // PRN start sample stamp + % //tmp_float=(float)d_sample_counter; + % d_dump_file.write(reinterpret_cast(&d_sample_counter), sizeof(unsigned long int)); + % // accumulated carrier phase + % d_dump_file.write(reinterpret_cast(&d_acc_carrier_phase_rad), sizeof(double)); + % + % // carrier and code frequency + % d_dump_file.write(reinterpret_cast(&d_carrier_doppler_hz), sizeof(double)); + % d_dump_file.write(reinterpret_cast(&d_code_freq_chips), sizeof(double)); + % + % //PLL commands + % d_dump_file.write(reinterpret_cast(&carr_phase_error_secs_Ti), sizeof(double)); + % d_dump_file.write(reinterpret_cast(&d_carrier_doppler_hz), sizeof(double)); + % + % //DLL commands + % d_dump_file.write(reinterpret_cast(&code_error_chips_Ti), sizeof(double)); + % d_dump_file.write(reinterpret_cast(&code_error_filt_chips), sizeof(double)); + % + % // CN0 and carrier lock test + % d_dump_file.write(reinterpret_cast(&d_CN0_SNV_dB_Hz), sizeof(double)); + % d_dump_file.write(reinterpret_cast(&d_carrier_lock_test), sizeof(double)); + % + % // AUX vars (for debug purposes) + % tmp_double = d_rem_code_phase_samples; + % d_dump_file.write(reinterpret_cast(&tmp_double), sizeof(double)); + % tmp_double = static_cast(d_sample_counter + d_current_prn_length_samples); + % d_dump_file.write(reinterpret_cast(&tmp_double), sizeof(double)); + % // PRN + % unsigned int prn_ = d_acquisition_gnss_synchro->PRN; + % d_dump_file.write(reinterpret_cast(&prn_), sizeof(unsigned int)); E=v1; P=v2; L=v3; @@ -190,5 +188,5 @@ function [GNSS_tracking] = gps_l1_ca_dll_pll_read_tracking_dump (filename, count GNSS_tracking.d_rem_code_phase_samples=var1; GNSS_tracking.var2=var2; GNSS_tracking.PRN=PRN; - end - +end + diff --git a/src/utils/matlab/libs/gps_l1_ca_pvt_read_pvt_dump.m b/src/utils/matlab/libs/gps_l1_ca_pvt_read_pvt_dump.m index d52958a53..ce538a755 100644 --- a/src/utils/matlab/libs/gps_l1_ca_pvt_read_pvt_dump.m +++ b/src/utils/matlab/libs/gps_l1_ca_pvt_read_pvt_dump.m @@ -1,39 +1,40 @@ -% /*! -% * \file gps_l1_ca_pvt_read_pvt_dump.m -% * \brief Read GNSS-SDR PVT lib dump binary file into MATLAB. The resulting +% +% \file gps_l1_ca_pvt_read_pvt_dump.m +% \brief Read GNSS-SDR PVT lib dump binary file into MATLAB. The resulting % structure is compatible with the K.Borre MATLAB-based receiver. -% * \author Javier Arribas, 2011. jarribas(at)cttc.es -% * ------------------------------------------------------------------------- -% * -% * Copyright (C) 2010-2011 (see AUTHORS file for a list of contributors) -% * -% * GNSS-SDR is a software defined Global Navigation -% * Satellite Systems receiver -% * -% * This file is part of GNSS-SDR. -% * -% * GNSS-SDR is free software: you can redistribute it and/or modify -% * it under the terms of the GNU General Public License as published by -% * the Free Software Foundation, either version 3 of the License, or -% * at your option) any later version. -% * -% * GNSS-SDR is distributed in the hope that it will be useful, -% * but WITHOUT ANY WARRANTY; without even the implied warranty of -% * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% * GNU General Public License for more details. -% * -% * You should have received a copy of the GNU General Public License -% * along with GNSS-SDR. If not, see . -% * -% * ------------------------------------------------------------------------- -% */ +% \author Javier Arribas, 2011. jarribas(at)cttc.es +% ------------------------------------------------------------------------- +% +% Copyright (C) 2010-2018 (see AUTHORS file for a list of contributors) +% +% GNSS-SDR is a software defined Global Navigation +% Satellite Systems receiver +% +% This file is part of GNSS-SDR. +% +% GNSS-SDR is free software: you can redistribute it and/or modify +% it under the terms of the GNU General Public License as published by +% the Free Software Foundation, either version 3 of the License, or +% at your option) any later version. +% +% GNSS-SDR is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with GNSS-SDR. If not, see . +% +% ------------------------------------------------------------------------- +% + function [navSolutions] = gps_l1_ca_pvt_read_pvt_dump (filename, count) - %% usage: gps_l1_ca_pvt_read_pvt_dump (filename, [count]) - %% - %% open GNSS-SDR PVT binary log file .dat and return the contents - %% -% +%% usage: gps_l1_ca_pvt_read_pvt_dump (filename, [count]) +%% +%% open GNSS-SDR PVT binary log file .dat and return the contents +%% +% % // PVT GPS time % tmp_double=GPS_current_time; % d_dump_file.write((char*)&tmp_double, sizeof(double)); @@ -58,57 +59,56 @@ function [navSolutions] = gps_l1_ca_pvt_read_pvt_dump (filename, count) % // GEO user position Height [m] % tmp_double=d_height_m; % d_dump_file.write((char*)&tmp_double, sizeof(double)); - - m = nargchk (1,2,nargin); - num_double_vars=8; - double_size_bytes=8; - skip_bytes_each_read=double_size_bytes*num_double_vars; - bytes_shift=0; - if (m) - usage (m); - end - if (nargin < 3) +m = nargchk (1,2,nargin); +num_double_vars=8; +double_size_bytes=8; +skip_bytes_each_read=double_size_bytes*num_double_vars; +bytes_shift=0; +if (m) + usage (m); +end + +if (nargin < 3) count = Inf; - end - %loops_counter = fread (f, count, 'uint32',4*12); - f = fopen (filename, 'rb'); - if (f < 0) - else - GPS_current_time = fread (f, count, 'float64',skip_bytes_each_read-double_size_bytes); - bytes_shift=bytes_shift+double_size_bytes; - fseek(f,bytes_shift,'bof'); % move to next interleaved - ECEF_X = fread (f, count, 'float64',skip_bytes_each_read-double_size_bytes); - bytes_shift=bytes_shift+double_size_bytes; - fseek(f,bytes_shift,'bof'); % move to next interleaved - ECEF_Y = fread (f, count, 'float64',skip_bytes_each_read-double_size_bytes); - bytes_shift=bytes_shift+double_size_bytes; - fseek(f,bytes_shift,'bof'); % move to next interleaved - ECEF_Z = fread (f, count, 'float64',skip_bytes_each_read-double_size_bytes); - bytes_shift=bytes_shift+double_size_bytes; - fseek(f,bytes_shift,'bof'); % move to next interleaved - Clock_Offset = fread (f, count, 'float64',skip_bytes_each_read-double_size_bytes); - bytes_shift=bytes_shift+double_size_bytes; - fseek(f,bytes_shift,'bof'); % move to next interleaved - Lat = fread (f, count, 'float64',skip_bytes_each_read-double_size_bytes); - bytes_shift=bytes_shift+double_size_bytes; - fseek(f,bytes_shift,'bof'); % move to next interleaved - Long = fread (f, count, 'float64',skip_bytes_each_read-double_size_bytes); - bytes_shift=bytes_shift+double_size_bytes; - fseek(f,bytes_shift,'bof'); % move to next interleaved - Height = fread (f, count, 'float64',skip_bytes_each_read-double_size_bytes); - bytes_shift=bytes_shift+double_size_bytes; - fseek(f,bytes_shift,'bof'); % move to next interleaved - fclose (f); - end - - navSolutions.X=ECEF_X.'; - navSolutions.Y=ECEF_Y.'; - navSolutions.Z=ECEF_Z.'; - navSolutions.dt=Clock_Offset.'; - navSolutions.latitude=Lat.'; - navSolutions.longitude=Long.'; - navSolutions.height=Height.'; - navSolutions.TransmitTime=GPS_current_time.'; - - \ No newline at end of file +end +%loops_counter = fread (f, count, 'uint32',4*12); +f = fopen (filename, 'rb'); +if (f < 0) +else + GPS_current_time = fread (f, count, 'float64',skip_bytes_each_read-double_size_bytes); + bytes_shift=bytes_shift+double_size_bytes; + fseek(f,bytes_shift,'bof'); % move to next interleaved + ECEF_X = fread (f, count, 'float64',skip_bytes_each_read-double_size_bytes); + bytes_shift=bytes_shift+double_size_bytes; + fseek(f,bytes_shift,'bof'); % move to next interleaved + ECEF_Y = fread (f, count, 'float64',skip_bytes_each_read-double_size_bytes); + bytes_shift=bytes_shift+double_size_bytes; + fseek(f,bytes_shift,'bof'); % move to next interleaved + ECEF_Z = fread (f, count, 'float64',skip_bytes_each_read-double_size_bytes); + bytes_shift=bytes_shift+double_size_bytes; + fseek(f,bytes_shift,'bof'); % move to next interleaved + Clock_Offset = fread (f, count, 'float64',skip_bytes_each_read-double_size_bytes); + bytes_shift=bytes_shift+double_size_bytes; + fseek(f,bytes_shift,'bof'); % move to next interleaved + Lat = fread (f, count, 'float64',skip_bytes_each_read-double_size_bytes); + bytes_shift=bytes_shift+double_size_bytes; + fseek(f,bytes_shift,'bof'); % move to next interleaved + Long = fread (f, count, 'float64',skip_bytes_each_read-double_size_bytes); + bytes_shift=bytes_shift+double_size_bytes; + fseek(f,bytes_shift,'bof'); % move to next interleaved + Height = fread (f, count, 'float64',skip_bytes_each_read-double_size_bytes); + bytes_shift=bytes_shift+double_size_bytes; + fseek(f,bytes_shift,'bof'); % move to next interleaved + fclose (f); +end + +navSolutions.X=ECEF_X.'; +navSolutions.Y=ECEF_Y.'; +navSolutions.Z=ECEF_Z.'; +navSolutions.dt=Clock_Offset.'; +navSolutions.latitude=Lat.'; +navSolutions.longitude=Long.'; +navSolutions.height=Height.'; +navSolutions.TransmitTime=GPS_current_time.'; + diff --git a/src/utils/matlab/libs/gps_l1_ca_read_pvt_raw_dump.m b/src/utils/matlab/libs/gps_l1_ca_read_pvt_raw_dump.m index b363bc1a5..b818b326b 100644 --- a/src/utils/matlab/libs/gps_l1_ca_read_pvt_raw_dump.m +++ b/src/utils/matlab/libs/gps_l1_ca_read_pvt_raw_dump.m @@ -1,27 +1,52 @@ -% Javier Arribas 2011 +% ------------------------------------------------------------------------- +% +% Copyright (C) 2010-2018 (see AUTHORS file for a list of contributors) +% +% GNSS-SDR is a software defined Global Navigation +% Satellite Systems receiver +% +% This file is part of GNSS-SDR. +% +% GNSS-SDR is free software: you can redistribute it and/or modify +% it under the terms of the GNU General Public License as published by +% the Free Software Foundation, either version 3 of the License, or +% at your option) any later version. +% +% GNSS-SDR is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with GNSS-SDR. If not, see . +% +% ------------------------------------------------------------------------- +% +% Javier Arribas 2011 + function [pvt_raw] = gps_l1_ca_read_pvt_raw_dump (channels, filename, count) - %% usage: read_tracking_dat (filename, [count]) - %% - %% open GNSS-SDR pvt binary log file .dat and return the contents - %% +%% usage: read_tracking_dat (filename, [count]) +%% +%% open GNSS-SDR pvt binary log file .dat and return the contents +%% - m = nargchk (1,2,nargin); - num_double_vars=3; - double_size_bytes=8; - skip_bytes_each_read=double_size_bytes*num_double_vars*channels; - bytes_shift=0; - if (m) +m = nargchk (1,2,nargin); +num_double_vars=3; +double_size_bytes=8; +skip_bytes_each_read=double_size_bytes*num_double_vars*channels; +bytes_shift=0; +if (m) usage (m); - end +end - if (nargin < 3) +if (nargin < 3) count = Inf; - end - %loops_counter = fread (f, count, 'uint32',4*12); - f = fopen (filename, 'rb'); - if (f < 0) - else +end +%loops_counter = fread (f, count, 'uint32',4*12); +f = fopen (filename, 'rb'); +if (f < 0) +else for N=1:1:channels pvt_raw.Pseudorange_m(N,:) = fread (f, count, 'float64',skip_bytes_each_read-double_size_bytes); bytes_shift=bytes_shift+double_size_bytes; @@ -33,17 +58,17 @@ function [pvt_raw] = gps_l1_ca_read_pvt_raw_dump (channels, filename, count) bytes_shift=bytes_shift+double_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved end - + fclose (f); %%%%%%%% output vars %%%%%%%% -% for (unsigned int i=0; i. +% +% ------------------------------------------------------------------------- +% +% Javier Arribas 2011 + function [telemetry] = gps_l1_ca_read_telemetry_dump (filename, count) - %% usage: read_tracking_dat (filename, [count]) - %% - %% open GNSS-SDR tracking binary log file .dat and return the contents - %% +%% usage: read_tracking_dat (filename, [count]) +%% +%% open GNSS-SDR tracking binary log file .dat and return the contents +%% - m = nargchk (1,2,nargin); - num_double_vars=3; - double_size_bytes=8; - skip_bytes_each_read=double_size_bytes*num_double_vars; - bytes_shift=0; - if (m) +m = nargchk (1,2,nargin); +num_double_vars=3; +double_size_bytes=8; +skip_bytes_each_read=double_size_bytes*num_double_vars; +bytes_shift=0; +if (m) usage (m); - end +end - if (nargin < 3) +if (nargin < 3) count = Inf; - end - %loops_counter = fread (f, count, 'uint32',4*12); - f = fopen (filename, 'rb'); - if (f < 0) - else - telemetry.preamble_delay_ms = fread (f, count, 'float64',skip_bytes_each_read-double_size_bytes); - bytes_shift=bytes_shift+double_size_bytes; - fseek(f,bytes_shift,'bof'); % move to next interleaved - telemetry.prn_delay_ms = fread (f, count, 'float64',skip_bytes_each_read-double_size_bytes); - bytes_shift=bytes_shift+double_size_bytes; - fseek(f,bytes_shift,'bof'); % move to next interleaved - telemetry.Preamble_symbol_counter = fread (f, count, 'float64',skip_bytes_each_read-double_size_bytes); - bytes_shift=bytes_shift+double_size_bytes; - fseek(f,bytes_shift,'bof'); % move to next interleaved - +end +%loops_counter = fread (f, count, 'uint32',4*12); +f = fopen (filename, 'rb'); +if (f < 0) +else + telemetry.preamble_delay_ms = fread (f, count, 'float64',skip_bytes_each_read-double_size_bytes); + bytes_shift=bytes_shift+double_size_bytes; + fseek(f,bytes_shift,'bof'); % move to next interleaved + telemetry.prn_delay_ms = fread (f, count, 'float64',skip_bytes_each_read-double_size_bytes); + bytes_shift=bytes_shift+double_size_bytes; + fseek(f,bytes_shift,'bof'); % move to next interleaved + telemetry.Preamble_symbol_counter = fread (f, count, 'float64',skip_bytes_each_read-double_size_bytes); + bytes_shift=bytes_shift+double_size_bytes; + fseek(f,bytes_shift,'bof'); % move to next interleaved + fclose (f); %%%%%%%% output vars %%%%%%%% -% { -% double tmp_double; -% tmp_double = current_synchro_data.Preamble_delay_ms; -% d_dump_file.write((char*)&tmp_double, sizeof(double)); -% tmp_double = current_synchro_data.Prn_delay_ms; -% d_dump_file.write((char*)&tmp_double, sizeof(double)); -% tmp_double = current_synchro_data.Preamble_symbol_counter; -% d_dump_file.write((char*)&tmp_double, sizeof(double)); -% } - end - + % { + % double tmp_double; + % tmp_double = current_synchro_data.Preamble_delay_ms; + % d_dump_file.write((char*)&tmp_double, sizeof(double)); + % tmp_double = current_synchro_data.Prn_delay_ms; + % d_dump_file.write((char*)&tmp_double, sizeof(double)); + % tmp_double = current_synchro_data.Preamble_symbol_counter; + % d_dump_file.write((char*)&tmp_double, sizeof(double)); + % } +end + diff --git a/src/utils/matlab/libs/plotNavigation.m b/src/utils/matlab/libs/plotNavigation.m index 057a1926d..fd6af14d8 100644 --- a/src/utils/matlab/libs/plotNavigation.m +++ b/src/utils/matlab/libs/plotNavigation.m @@ -1,42 +1,8 @@ -% /*! -% * \file plotNavigation.m -% * \brief -% Functions plots variations of coordinates over time and a 3D position -% plot. It plots receiver coordinates in UTM system or coordinate offsets if -% the true UTM receiver coordinates are provided. -% * \author Darius Plausinaitis -% * Modified by Javier Arribas, 2011. jarribas(at)cttc.es -% * ------------------------------------------------------------------------- -% * -% * Copyright (C) 2010-2011 (see AUTHORS file for a list of contributors) -% * -% * GNSS-SDR is a software defined Global Navigation -% * Satellite Systems receiver -% * -% * This file is part of GNSS-SDR. -% * -% * GNSS-SDR is free software: you can redistribute it and/or modify -% * it under the terms of the GNU General Public License as published by -% * the Free Software Foundation, either version 3 of the License, or -% * at your option) any later version. -% * -% * GNSS-SDR is distributed in the hope that it will be useful, -% * but WITHOUT ANY WARRANTY; without even the implied warranty of -% * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% * GNU General Public License for more details. -% * -% * You should have received a copy of the GNU General Public License -% * along with GNSS-SDR. If not, see . -% * -% * ------------------------------------------------------------------------- -% */ - -function plotNavigation(navSolutions, settings,plot_skyplot) -%Functions plots variations of coordinates over time and a 3D position -%plot. It plots receiver coordinates in UTM system or coordinate offsets if -%the true UTM receiver coordinates are provided. +% Function plots variations of coordinates over time and a 3D position +% plot. It plots receiver coordinates in UTM system or coordinate offsets if +% the true UTM receiver coordinates are provided. % -%plotNavigation(navSolutions, settings) +% plotNavigation(navSolutions, settings) % % Inputs: % navSolutions - Results from navigation solution function. It @@ -47,47 +13,77 @@ function plotNavigation(navSolutions, settings,plot_skyplot) % plot_skyplot - If ==1 then use satellite coordinates to plot the % the satellite positions +% Darius Plausinaitis +% Modified by Javier Arribas, 2011. jarribas(at)cttc.es +% ------------------------------------------------------------------------- +% +% Copyright (C) 2010-2018 (see AUTHORS file for a list of contributors) +% +% GNSS-SDR is a software defined Global Navigation +% Satellite Systems receiver +% +% This file is part of GNSS-SDR. +% +% GNSS-SDR is free software: you can redistribute it and/or modify +% it under the terms of the GNU General Public License as published by +% the Free Software Foundation, either version 3 of the License, or +% at your option) any later version. +% +% GNSS-SDR is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with GNSS-SDR. If not, see . +% +% ------------------------------------------------------------------------- +% + +function plotNavigation(navSolutions, settings,plot_skyplot) + + %% Plot results in the necessary data exists ============================== if (~isempty(navSolutions)) - + %% If reference position is not provided, then set reference position %% to the average postion if isnan(settings.truePosition.E) || isnan(settings.truePosition.N) ... - || isnan(settings.truePosition.U) - - %=== Compute mean values ========================================== + || isnan(settings.truePosition.U) + + %=== Compute mean values ========================================== % Remove NaN-s or the output of the function MEAN will be NaN. refCoord.E = mean(navSolutions.E(~isnan(navSolutions.E))); refCoord.N = mean(navSolutions.N(~isnan(navSolutions.N))); refCoord.U = mean(navSolutions.U(~isnan(navSolutions.U))); - + %Also convert geodetic coordinates to deg:min:sec vector format meanLongitude = dms2mat(deg2dms(... mean(navSolutions.longitude(~isnan(navSolutions.longitude)))), -5); meanLatitude = dms2mat(deg2dms(... mean(navSolutions.latitude(~isnan(navSolutions.latitude)))), -5); - - LatLong_str=[num2str(meanLatitude(1)), 'º', ... - num2str(meanLatitude(2)), '''', ... - num2str(meanLatitude(3)), '''''', ... - ',', ... - num2str(meanLongitude(1)), 'º', ... - num2str(meanLongitude(2)), '''', ... - num2str(meanLongitude(3)), ''''''] - - + + LatLong_str=[num2str(meanLatitude(1)), '??', ... + num2str(meanLatitude(2)), '''', ... + num2str(meanLatitude(3)), '''''', ... + ',', ... + num2str(meanLongitude(1)), '??', ... + num2str(meanLongitude(2)), '''', ... + num2str(meanLongitude(3)), ''''''] + + refPointLgText = ['Mean Position\newline Lat: ', ... - num2str(meanLatitude(1)), '{\circ}', ... - num2str(meanLatitude(2)), '{\prime}', ... - num2str(meanLatitude(3)), '{\prime}{\prime}', ... - '\newline Lng: ', ... - num2str(meanLongitude(1)), '{\circ}', ... - num2str(meanLongitude(2)), '{\prime}', ... - num2str(meanLongitude(3)), '{\prime}{\prime}', ... - '\newline Hgt: ', ... - num2str(mean(navSolutions.height(~isnan(navSolutions.height))), '%+6.1f')]; - + num2str(meanLatitude(1)), '{\circ}', ... + num2str(meanLatitude(2)), '{\prime}', ... + num2str(meanLatitude(3)), '{\prime}{\prime}', ... + '\newline Lng: ', ... + num2str(meanLongitude(1)), '{\circ}', ... + num2str(meanLongitude(2)), '{\prime}', ... + num2str(meanLongitude(3)), '{\prime}{\prime}', ... + '\newline Hgt: ', ... + num2str(mean(navSolutions.height(~isnan(navSolutions.height))), '%+6.1f')]; + else % compute the mean error for static receiver mean_position.E = mean(navSolutions.E(~isnan(navSolutions.E))); @@ -100,55 +96,55 @@ if (~isempty(navSolutions)) error_meters=sqrt((mean_position.E-refCoord.E)^2+(mean_position.N-refCoord.N)^2+(mean_position.U-refCoord.U)^2); refPointLgText = ['Reference Position, Mean 3D error = ' num2str(error_meters) ' [m]']; - end - + end + figureNumber = 300; % The 300 is chosen for more convenient handling of the open % figure windows, when many figures are closed and reopened. Figures % drawn or opened by the user, will not be "overwritten" by this % function if the auto numbering is not used. - + %=== Select (or create) and clear the figure ========================== figure(figureNumber); clf (figureNumber); set (figureNumber, 'Name', 'Navigation solutions'); - + %--- Draw axes -------------------------------------------------------- handles(1, 1) = subplot(4, 2, 1 : 4); handles(3, 1) = subplot(4, 2, [5, 7]); - handles(3, 2) = subplot(4, 2, [6, 8]); - -%% Plot all figures ======================================================= - + handles(3, 2) = subplot(4, 2, [6, 8]); + + %% Plot all figures ======================================================= + %--- Coordinate differences in UTM system ----------------------------- plot(handles(1, 1), [(navSolutions.E - refCoord.E)', ... - (navSolutions.N - refCoord.N)',... - (navSolutions.U - refCoord.U)']); - + (navSolutions.N - refCoord.N)',... + (navSolutions.U - refCoord.U)']); + title (handles(1, 1), 'Coordinates variations in UTM system'); legend(handles(1, 1), 'E', 'N', 'U'); xlabel(handles(1, 1), ['Measurement period: ', ... - num2str(settings.navSolPeriod), 'ms']); + num2str(settings.navSolPeriod), 'ms']); ylabel(handles(1, 1), 'Variations (m)'); grid (handles(1, 1)); - axis (handles(1, 1), 'tight'); - + axis (handles(1, 1), 'tight'); + %--- Position plot in UTM system -------------------------------------- plot3 (handles(3, 1), navSolutions.E - refCoord.E, ... - navSolutions.N - refCoord.N, ... - navSolutions.U - refCoord.U, '+'); + navSolutions.N - refCoord.N, ... + navSolutions.U - refCoord.U, '+'); hold (handles(3, 1), 'on'); - + %Plot the reference point plot3 (handles(3, 1), 0, 0, 0, 'r+', 'LineWidth', 1.5, 'MarkerSize', 10); hold (handles(3, 1), 'off'); view (handles(3, 1), 0, 90); axis (handles(3, 1), 'equal'); - grid (handles(3, 1), 'minor'); + grid (handles(3, 1), 'minor'); legend(handles(3, 1), 'Measurements', refPointLgText); - + title (handles(3, 1), 'Positions in UTM system (3D plot)'); xlabel(handles(3, 1), 'East (m)'); ylabel(handles(3, 1), 'North (m)'); @@ -157,14 +153,14 @@ if (~isempty(navSolutions)) if (plot_skyplot==1) %--- Satellite sky plot ----------------------------------------------- skyPlot(handles(3, 2), ... - navSolutions.channel.az, ... - navSolutions.channel.el, ... - navSolutions.channel.PRN(:, 1)); - + navSolutions.channel.az, ... + navSolutions.channel.el, ... + navSolutions.channel.PRN(:, 1)); + title (handles(3, 2), ['Sky plot (mean PDOP: ', ... - num2str(mean(navSolutions.DOP(2,:))), ')']); + num2str(mean(navSolutions.DOP(2,:))), ')']); end - + else disp('plotNavigation: No navigation data to plot.'); end % if (~isempty(navSolutions)) diff --git a/src/utils/matlab/libs/plotTracking.m b/src/utils/matlab/libs/plotTracking.m index 9abe9c729..e8d6ede85 100644 --- a/src/utils/matlab/libs/plotTracking.m +++ b/src/utils/matlab/libs/plotTracking.m @@ -1,7 +1,7 @@ function plotTracking(channelList, trackResults, settings) -%This function plots the tracking results for the given channel list. +% This function plots the tracking results for the given channel list. % -%plotTracking(channelList, trackResults, settings) +% plotTracking(channelList, trackResults, settings) % % Inputs: % channelList - list of channels to be plotted. @@ -10,7 +10,7 @@ function plotTracking(channelList, trackResults, settings) %-------------------------------------------------------------------------- % SoftGNSS v3.0 -% +% % Copyright (C) Darius Plausinaitis % Written by Darius Plausinaitis %-------------------------------------------------------------------------- @@ -30,160 +30,158 @@ function plotTracking(channelList, trackResults, settings) %USA. %-------------------------------------------------------------------------- -%CVS record: -%$Id: plotTracking.m,v 1.5.2.23 2006/08/14 14:45:14 dpl Exp $ % Protection - if the list contains incorrect channel numbers channelList = intersect(channelList, 1:settings.numberOfChannels); %=== For all listed channels ============================================== for channelNr = channelList - -%% Select (or create) and clear the figure ================================ + + %% Select (or create) and clear the figure ================================ % The number 200 is added just for more convenient handling of the open % figure windows, when many figures are closed and reopened. % Figures drawn or opened by the user, will not be "overwritten" by % this function. - + figure(channelNr +200); clf(channelNr +200); set(channelNr +200, 'Name', ['Channel ', num2str(channelNr), ... - ' (PRN ', ... - num2str(trackResults(channelNr).PRN(end-1)), ... - ') results']); - -%% Draw axes ============================================================== - % Row 1 - handles(1, 1) = subplot(4, 3, 1); - handles(1, 2) = subplot(4, 3, [2 3]); - % Row 2 - handles(2, 1) = subplot(4, 3, 4); - handles(2, 2) = subplot(4, 3, [5 6]); - % Row 3 - handles(3, 1) = subplot(4, 3, 7); - handles(3, 2) = subplot(4, 3, 8); - handles(3, 3) = subplot(4, 3, 9); - % Row 4 - handles(4, 1) = subplot(4, 3, 10); - handles(4, 2) = subplot(4, 3, 11); - handles(4, 3) = subplot(4, 3, 12); - - -%% Plot all figures ======================================================= - - timeAxisInSeconds = (1:settings.msToProcess)/1000; - - %----- Discrete-Time Scatter Plot --------------------------------- - plot(handles(1, 1), trackResults(channelNr).I_P,... - trackResults(channelNr).Q_P, ... - '.'); - - grid (handles(1, 1)); - axis (handles(1, 1), 'equal'); - title (handles(1, 1), 'Discrete-Time Scatter Plot'); - xlabel(handles(1, 1), 'I prompt'); - ylabel(handles(1, 1), 'Q prompt'); - - %----- Nav bits --------------------------------------------------- - plot (handles(1, 2), timeAxisInSeconds, ... - trackResults(channelNr).I_P); - - grid (handles(1, 2)); - title (handles(1, 2), 'Bits of the navigation message'); - xlabel(handles(1, 2), 'Time (s)'); - axis (handles(1, 2), 'tight'); - - %----- PLL discriminator unfiltered-------------------------------- - plot (handles(2, 1), timeAxisInSeconds, ... - trackResults(channelNr).pllDiscr, 'r'); - - grid (handles(2, 1)); - axis (handles(2, 1), 'tight'); - xlabel(handles(2, 1), 'Time (s)'); - ylabel(handles(2, 1), 'Amplitude'); - title (handles(2, 1), 'Raw PLL discriminator'); - - %----- Correlation ------------------------------------------------ - plot(handles(2, 2), timeAxisInSeconds, ... - [sqrt(trackResults(channelNr).I_E.^2 + ... - trackResults(channelNr).Q_E.^2)', ... - sqrt(trackResults(channelNr).I_P.^2 + ... - trackResults(channelNr).Q_P.^2)', ... - sqrt(trackResults(channelNr).I_L.^2 + ... - trackResults(channelNr).Q_L.^2)'], ... - '-*'); - - grid (handles(2, 2)); - title (handles(2, 2), 'Correlation results'); - xlabel(handles(2, 2), 'Time (s)'); - axis (handles(2, 2), 'tight'); - - hLegend = legend(handles(2, 2), '$\sqrt{I_{E}^2 + Q_{E}^2}$', ... - '$\sqrt{I_{P}^2 + Q_{P}^2}$', ... - '$\sqrt{I_{L}^2 + Q_{L}^2}$'); - - %set interpreter from tex to latex. This will draw \sqrt correctly - set(hLegend, 'Interpreter', 'Latex'); - - %----- PLL discriminator filtered---------------------------------- - plot (handles(3, 1), timeAxisInSeconds, ... - trackResults(channelNr).pllDiscrFilt(1:settings.msToProcess), 'b'); - - grid (handles(3, 1)); - axis (handles(3, 1), 'tight'); - xlabel(handles(3, 1), 'Time (s)'); - ylabel(handles(3, 1), 'Amplitude'); - title (handles(3, 1), 'Filtered PLL discriminator'); - - %----- DLL discriminator unfiltered-------------------------------- - plot (handles(3, 2), timeAxisInSeconds, ... - trackResults(channelNr).dllDiscr, 'r'); - - grid (handles(3, 2)); - axis (handles(3, 2), 'tight'); - xlabel(handles(3, 2), 'Time (s)'); - ylabel(handles(3, 2), 'Amplitude'); - title (handles(3, 2), 'Raw DLL discriminator'); - - %----- DLL discriminator filtered---------------------------------- - plot (handles(3, 3), timeAxisInSeconds, ... - trackResults(channelNr).dllDiscrFilt, 'b'); - - grid (handles(3, 3)); - axis (handles(3, 3), 'tight'); - xlabel(handles(3, 3), 'Time (s)'); - ylabel(handles(3, 3), 'Amplitude'); - title (handles(3, 3), 'Filtered DLL discriminator'); - - %----- CNo for signal---------------------------------- - plot (handles(4, 1), timeAxisInSeconds, ... - trackResults(channelNr).CNo(1:settings.msToProcess), 'b'); - - grid (handles(4, 1)); - axis (handles(4, 1), 'tight'); - xlabel(handles(4, 1), 'Time (s)'); - ylabel(handles(4, 1), 'CNo (dB-Hz)'); - title (handles(4, 1), 'Carrier to Noise Ratio'); - - %----- Carrier Frequency -------------------------------- - plot (handles(4, 2), timeAxisInSeconds(2:end), ... - trackResults(channelNr).carrFreq(2:settings.msToProcess), 'Color',[0.42 0.25 0.39]); - - grid (handles(4, 2)); - axis (handles(4, 2)); - xlabel(handles(4, 2), 'Time (s)'); - ylabel(handles(4, 2), 'Freq (hz)'); - title (handles(4, 2), 'Carrier Freq'); - - %----- Code Frequency---------------------------------- - %--- Skip sample 0 to help with results display - plot (handles(4, 3), timeAxisInSeconds(2:end), ... - trackResults(channelNr).codeFreq(2:settings.msToProcess), 'Color',[0.2 0.3 0.49]); - - grid (handles(4, 3)); - axis (handles(4, 3), 'tight'); - xlabel(handles(4, 3), 'Time (s)'); - ylabel(handles(4, 3), 'Freq (Hz)'); - title (handles(4, 3), 'Code Freq'); - + ' (PRN ', ... + num2str(trackResults(channelNr).PRN(end-1)), ... + ') results']); + + %% Draw axes ============================================================== + % Row 1 + handles(1, 1) = subplot(4, 3, 1); + handles(1, 2) = subplot(4, 3, [2 3]); + % Row 2 + handles(2, 1) = subplot(4, 3, 4); + handles(2, 2) = subplot(4, 3, [5 6]); + % Row 3 + handles(3, 1) = subplot(4, 3, 7); + handles(3, 2) = subplot(4, 3, 8); + handles(3, 3) = subplot(4, 3, 9); + % Row 4 + handles(4, 1) = subplot(4, 3, 10); + handles(4, 2) = subplot(4, 3, 11); + handles(4, 3) = subplot(4, 3, 12); + + + %% Plot all figures ======================================================= + + timeAxisInSeconds = (1:settings.msToProcess)/1000; + + %----- Discrete-Time Scatter Plot --------------------------------- + plot(handles(1, 1), trackResults(channelNr).I_P,... + trackResults(channelNr).Q_P, ... + '.'); + + grid (handles(1, 1)); + axis (handles(1, 1), 'equal'); + title (handles(1, 1), 'Discrete-Time Scatter Plot'); + xlabel(handles(1, 1), 'I prompt'); + ylabel(handles(1, 1), 'Q prompt'); + + %----- Nav bits --------------------------------------------------- + plot (handles(1, 2), timeAxisInSeconds, ... + trackResults(channelNr).I_P); + + grid (handles(1, 2)); + title (handles(1, 2), 'Bits of the navigation message'); + xlabel(handles(1, 2), 'Time (s)'); + axis (handles(1, 2), 'tight'); + + %----- PLL discriminator unfiltered-------------------------------- + plot (handles(2, 1), timeAxisInSeconds, ... + trackResults(channelNr).pllDiscr, 'r'); + + grid (handles(2, 1)); + axis (handles(2, 1), 'tight'); + xlabel(handles(2, 1), 'Time (s)'); + ylabel(handles(2, 1), 'Amplitude'); + title (handles(2, 1), 'Raw PLL discriminator'); + + %----- Correlation ------------------------------------------------ + plot(handles(2, 2), timeAxisInSeconds, ... + [sqrt(trackResults(channelNr).I_E.^2 + ... + trackResults(channelNr).Q_E.^2)', ... + sqrt(trackResults(channelNr).I_P.^2 + ... + trackResults(channelNr).Q_P.^2)', ... + sqrt(trackResults(channelNr).I_L.^2 + ... + trackResults(channelNr).Q_L.^2)'], ... + '-*'); + + grid (handles(2, 2)); + title (handles(2, 2), 'Correlation results'); + xlabel(handles(2, 2), 'Time (s)'); + axis (handles(2, 2), 'tight'); + + hLegend = legend(handles(2, 2), '$\sqrt{I_{E}^2 + Q_{E}^2}$', ... + '$\sqrt{I_{P}^2 + Q_{P}^2}$', ... + '$\sqrt{I_{L}^2 + Q_{L}^2}$'); + + %set interpreter from tex to latex. This will draw \sqrt correctly + set(hLegend, 'Interpreter', 'Latex'); + + %----- PLL discriminator filtered---------------------------------- + plot (handles(3, 1), timeAxisInSeconds, ... + trackResults(channelNr).pllDiscrFilt(1:settings.msToProcess), 'b'); + + grid (handles(3, 1)); + axis (handles(3, 1), 'tight'); + xlabel(handles(3, 1), 'Time (s)'); + ylabel(handles(3, 1), 'Amplitude'); + title (handles(3, 1), 'Filtered PLL discriminator'); + + %----- DLL discriminator unfiltered-------------------------------- + plot (handles(3, 2), timeAxisInSeconds, ... + trackResults(channelNr).dllDiscr, 'r'); + + grid (handles(3, 2)); + axis (handles(3, 2), 'tight'); + xlabel(handles(3, 2), 'Time (s)'); + ylabel(handles(3, 2), 'Amplitude'); + title (handles(3, 2), 'Raw DLL discriminator'); + + %----- DLL discriminator filtered---------------------------------- + plot (handles(3, 3), timeAxisInSeconds, ... + trackResults(channelNr).dllDiscrFilt, 'b'); + + grid (handles(3, 3)); + axis (handles(3, 3), 'tight'); + xlabel(handles(3, 3), 'Time (s)'); + ylabel(handles(3, 3), 'Amplitude'); + title (handles(3, 3), 'Filtered DLL discriminator'); + + %----- CNo for signal---------------------------------- + plot (handles(4, 1), timeAxisInSeconds, ... + trackResults(channelNr).CNo(1:settings.msToProcess), 'b'); + + grid (handles(4, 1)); + axis (handles(4, 1), 'tight'); + xlabel(handles(4, 1), 'Time (s)'); + ylabel(handles(4, 1), 'CNo (dB-Hz)'); + title (handles(4, 1), 'Carrier to Noise Ratio'); + + %----- Carrier Frequency -------------------------------- + plot (handles(4, 2), timeAxisInSeconds(2:end), ... + trackResults(channelNr).carrFreq(2:settings.msToProcess), 'Color',[0.42 0.25 0.39]); + + grid (handles(4, 2)); + axis (handles(4, 2)); + xlabel(handles(4, 2), 'Time (s)'); + ylabel(handles(4, 2), 'Freq (hz)'); + title (handles(4, 2), 'Carrier Freq'); + + %----- Code Frequency---------------------------------- + %--- Skip sample 0 to help with results display + plot (handles(4, 3), timeAxisInSeconds(2:end), ... + trackResults(channelNr).codeFreq(2:settings.msToProcess), 'Color',[0.2 0.3 0.49]); + + grid (handles(4, 3)); + axis (handles(4, 3), 'tight'); + xlabel(handles(4, 3), 'Time (s)'); + ylabel(handles(4, 3), 'Freq (Hz)'); + title (handles(4, 3), 'Code Freq'); + end % for channelNr = channelList diff --git a/src/utils/matlab/libs/plotVEMLTracking.m b/src/utils/matlab/libs/plotVEMLTracking.m index f3846e164..40cab0bb6 100644 --- a/src/utils/matlab/libs/plotVEMLTracking.m +++ b/src/utils/matlab/libs/plotVEMLTracking.m @@ -1,7 +1,7 @@ function plotVEMLTracking(channelList, trackResults, settings) -%This function plots the tracking results for the given channel list. +% This function plots the tracking results for the given channel list. % -%plotTracking(channelList, trackResults, settings) +% plotTracking(channelList, trackResults, settings) % % Inputs: % channelList - list of channels to be plotted. @@ -10,7 +10,7 @@ function plotVEMLTracking(channelList, trackResults, settings) %-------------------------------------------------------------------------- % SoftGNSS v3.0 -% +% % Copyright (C) Darius Plausinaitis % Written by Darius Plausinaitis %-------------------------------------------------------------------------- @@ -30,136 +30,133 @@ function plotVEMLTracking(channelList, trackResults, settings) %USA. %-------------------------------------------------------------------------- -%CVS record: -%$Id: plotTracking.m,v 1.5.2.23 2006/08/14 14:45:14 dpl Exp $ - % Protection - if the list contains incorrect channel numbers channelList = intersect(channelList, 1:settings.numberOfChannels); %=== For all listed channels ============================================== for channelNr = channelList - -%% Select (or create) and clear the figure ================================ + + %% Select (or create) and clear the figure ================================ % The number 200 is added just for more convenient handling of the open % figure windows, when many figures are closed and reopened. % Figures drawn or opened by the user, will not be "overwritten" by % this function. - + figure(channelNr +200); clf(channelNr +200); set(channelNr +200, 'Name', ['Channel ', num2str(channelNr), ... - ' (PRN ', ... - num2str(trackResults(channelNr).PRN(end-1)), ... - ') results']); - -%% Draw axes ============================================================== - % Row 1 - handles(1, 1) = subplot(3, 3, 1); - handles(1, 2) = subplot(3, 3, [2 3]); - % Row 2 - handles(2, 1) = subplot(3, 3, 4); - handles(2, 2) = subplot(3, 3, [5 6]); - % Row 3 - handles(3, 1) = subplot(3, 3, 7); - handles(3, 2) = subplot(3, 3, 8); - handles(3, 3) = subplot(3, 3, 9); - -%% Plot all figures ======================================================= - - timeAxisInSeconds = (1:4:settings.msToProcess)/1000; - - %----- Discrete-Time Scatter Plot --------------------------------- - plot(handles(1, 1), trackResults(channelNr).data_I,... - trackResults(channelNr).data_Q, ... - '.'); - - grid (handles(1, 1)); - axis (handles(1, 1), 'equal'); - title (handles(1, 1), 'Discrete-Time Scatter Plot'); - xlabel(handles(1, 1), 'I prompt'); - ylabel(handles(1, 1), 'Q prompt'); - - %----- Nav bits --------------------------------------------------- - t = (1:length(trackResults(channelNr).data_I)); - plot (handles(1, 2), t, ... - trackResults(channelNr).data_I); - - grid (handles(1, 2)); - title (handles(1, 2), 'Bits of the navigation message'); - xlabel(handles(1, 2), 'Time (s)'); - axis (handles(1, 2), 'tight'); - - %----- PLL discriminator unfiltered-------------------------------- - t = (1:length(trackResults(channelNr).pllDiscr)); - plot (handles(2, 1), t, ... - trackResults(channelNr).pllDiscr, 'r'); - - grid (handles(2, 1)); - axis (handles(2, 1), 'tight'); - xlabel(handles(2, 1), 'Time (s)'); - ylabel(handles(2, 1), 'Amplitude'); - title (handles(2, 1), 'Raw PLL discriminator'); - - %----- Correlation ------------------------------------------------ - t = (1:length(trackResults(channelNr).I_VE)); - plot(handles(2, 2), t, ... - [sqrt(trackResults(channelNr).I_VE.^2 + ... - trackResults(channelNr).Q_VE.^2)', ... - sqrt(trackResults(channelNr).I_E.^2 + ... - trackResults(channelNr).Q_E.^2)', ... - sqrt(trackResults(channelNr).I_P.^2 + ... - trackResults(channelNr).Q_P.^2)', ... - sqrt(trackResults(channelNr).I_L.^2 + ... - trackResults(channelNr).Q_L.^2)', ... - sqrt(trackResults(channelNr).I_VL.^2 + ... - trackResults(channelNr).Q_VL.^2)'], ... - '-*'); - - grid (handles(2, 2)); - title (handles(2, 2), 'Correlation results'); - xlabel(handles(2, 2), 'Time (s)'); - axis (handles(2, 2), 'tight'); - - hLegend = legend(handles(2, 2), '$\sqrt{I_{VE}^2 + Q_{VE}^2}$', ... - '$\sqrt{I_{E}^2 + Q_{E}^2}$', ... - '$\sqrt{I_{P}^2 + Q_{P}^2}$', ... - '$\sqrt{I_{L}^2 + Q_{L}^2}$', ... - '$\sqrt{I_{VL}^2 + Q_{VL}^2}$'); - - %set interpreter from tex to latex. This will draw \sqrt correctly - set(hLegend, 'Interpreter', 'Latex'); - - %----- PLL discriminator filtered---------------------------------- - t = (1:length(trackResults(channelNr).pllDiscrFilt)); - plot (handles(3, 1), t, ... - trackResults(channelNr).pllDiscrFilt, 'b'); - - grid (handles(3, 1)); - axis (handles(3, 1), 'tight'); - xlabel(handles(3, 1), 'Time (s)'); - ylabel(handles(3, 1), 'Amplitude'); - title (handles(3, 1), 'Filtered PLL discriminator'); - - %----- DLL discriminator unfiltered-------------------------------- - t = (1:length(trackResults(channelNr).dllDiscr)); - plot (handles(3, 2), t, ... - trackResults(channelNr).dllDiscr, 'r'); - - grid (handles(3, 2)); - axis (handles(3, 2), 'tight'); - xlabel(handles(3, 2), 'Time (s)'); - ylabel(handles(3, 2), 'Amplitude'); - title (handles(3, 2), 'Raw DLL discriminator'); - - %----- DLL discriminator filtered---------------------------------- - t = (1:length(trackResults(channelNr).dllDiscrFilt)); - plot (handles(3, 3), t, ... - trackResults(channelNr).dllDiscrFilt, 'b'); - - grid (handles(3, 3)); - axis (handles(3, 3), 'tight'); - xlabel(handles(3, 3), 'Time (s)'); - ylabel(handles(3, 3), 'Amplitude'); - title (handles(3, 3), 'Filtered DLL discriminator'); - + ' (PRN ', ... + num2str(trackResults(channelNr).PRN(end-1)), ... + ') results']); + + %% Draw axes ============================================================== + % Row 1 + handles(1, 1) = subplot(3, 3, 1); + handles(1, 2) = subplot(3, 3, [2 3]); + % Row 2 + handles(2, 1) = subplot(3, 3, 4); + handles(2, 2) = subplot(3, 3, [5 6]); + % Row 3 + handles(3, 1) = subplot(3, 3, 7); + handles(3, 2) = subplot(3, 3, 8); + handles(3, 3) = subplot(3, 3, 9); + + %% Plot all figures ======================================================= + + timeAxisInSeconds = (1:4:settings.msToProcess)/1000; + + %----- Discrete-Time Scatter Plot --------------------------------- + plot(handles(1, 1), trackResults(channelNr).data_I,... + trackResults(channelNr).data_Q, ... + '.'); + + grid (handles(1, 1)); + axis (handles(1, 1), 'equal'); + title (handles(1, 1), 'Discrete-Time Scatter Plot'); + xlabel(handles(1, 1), 'I prompt'); + ylabel(handles(1, 1), 'Q prompt'); + + %----- Nav bits --------------------------------------------------- + t = (1:length(trackResults(channelNr).data_I)); + plot (handles(1, 2), t, ... + trackResults(channelNr).data_I); + + grid (handles(1, 2)); + title (handles(1, 2), 'Bits of the navigation message'); + xlabel(handles(1, 2), 'Time (s)'); + axis (handles(1, 2), 'tight'); + + %----- PLL discriminator unfiltered-------------------------------- + t = (1:length(trackResults(channelNr).pllDiscr)); + plot (handles(2, 1), t, ... + trackResults(channelNr).pllDiscr, 'r'); + + grid (handles(2, 1)); + axis (handles(2, 1), 'tight'); + xlabel(handles(2, 1), 'Time (s)'); + ylabel(handles(2, 1), 'Amplitude'); + title (handles(2, 1), 'Raw PLL discriminator'); + + %----- Correlation ------------------------------------------------ + t = (1:length(trackResults(channelNr).I_VE)); + plot(handles(2, 2), t, ... + [sqrt(trackResults(channelNr).I_VE.^2 + ... + trackResults(channelNr).Q_VE.^2)', ... + sqrt(trackResults(channelNr).I_E.^2 + ... + trackResults(channelNr).Q_E.^2)', ... + sqrt(trackResults(channelNr).I_P.^2 + ... + trackResults(channelNr).Q_P.^2)', ... + sqrt(trackResults(channelNr).I_L.^2 + ... + trackResults(channelNr).Q_L.^2)', ... + sqrt(trackResults(channelNr).I_VL.^2 + ... + trackResults(channelNr).Q_VL.^2)'], ... + '-*'); + + grid (handles(2, 2)); + title (handles(2, 2), 'Correlation results'); + xlabel(handles(2, 2), 'Time (s)'); + axis (handles(2, 2), 'tight'); + + hLegend = legend(handles(2, 2), '$\sqrt{I_{VE}^2 + Q_{VE}^2}$', ... + '$\sqrt{I_{E}^2 + Q_{E}^2}$', ... + '$\sqrt{I_{P}^2 + Q_{P}^2}$', ... + '$\sqrt{I_{L}^2 + Q_{L}^2}$', ... + '$\sqrt{I_{VL}^2 + Q_{VL}^2}$'); + + %set interpreter from tex to latex. This will draw \sqrt correctly + set(hLegend, 'Interpreter', 'Latex'); + + %----- PLL discriminator filtered---------------------------------- + t = (1:length(trackResults(channelNr).pllDiscrFilt)); + plot (handles(3, 1), t, ... + trackResults(channelNr).pllDiscrFilt, 'b'); + + grid (handles(3, 1)); + axis (handles(3, 1), 'tight'); + xlabel(handles(3, 1), 'Time (s)'); + ylabel(handles(3, 1), 'Amplitude'); + title (handles(3, 1), 'Filtered PLL discriminator'); + + %----- DLL discriminator unfiltered-------------------------------- + t = (1:length(trackResults(channelNr).dllDiscr)); + plot (handles(3, 2), t, ... + trackResults(channelNr).dllDiscr, 'r'); + + grid (handles(3, 2)); + axis (handles(3, 2), 'tight'); + xlabel(handles(3, 2), 'Time (s)'); + ylabel(handles(3, 2), 'Amplitude'); + title (handles(3, 2), 'Raw DLL discriminator'); + + %----- DLL discriminator filtered---------------------------------- + t = (1:length(trackResults(channelNr).dllDiscrFilt)); + plot (handles(3, 3), t, ... + trackResults(channelNr).dllDiscrFilt, 'b'); + + grid (handles(3, 3)); + axis (handles(3, 3), 'tight'); + xlabel(handles(3, 3), 'Time (s)'); + ylabel(handles(3, 3), 'Amplitude'); + title (handles(3, 3), 'Filtered DLL discriminator'); + end % for channelNr = channelList diff --git a/src/utils/matlab/libs/read_complex_binary.m b/src/utils/matlab/libs/read_complex_binary.m index a201b99bb..dc26a459f 100644 --- a/src/utils/matlab/libs/read_complex_binary.m +++ b/src/utils/matlab/libs/read_complex_binary.m @@ -1,50 +1,54 @@ +% Usage: read_complex_binary (filename, [count], [start_sample]) % -% Copyright 2001 Free Software Foundation, Inc. +% Opens filename and returns the contents as a column vector, +% treating them as 32 bit complex numbers % -% This file is part of GNU Radio + +% ------------------------------------------------------------------------- % -% GNU Radio is free software; you can redistribute it and/or modify +% Copyright (C) 2010-2018 (see AUTHORS file for a list of contributors) +% +% GNSS-SDR is a software defined Global Navigation +% Satellite Systems receiver +% +% This file is part of GNSS-SDR. +% +% GNSS-SDR is free software: you can redistribute it and/or modify % it under the terms of the GNU General Public License as published by -% the Free Software Foundation; either version 3, or (at your option) -% any later version. +% the Free Software Foundation, either version 3 of the License, or +% at your option) any later version. % -% GNU Radio is distributed in the hope that it will be useful, +% GNSS-SDR is distributed in the hope that it will be useful, % but WITHOUT ANY WARRANTY; without even the implied warranty of % MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the % GNU General Public License for more details. % % You should have received a copy of the GNU General Public License -% along with GNU Radio; see the file COPYING. If not, write to -% the Free Software Foundation, Inc., 51 Franklin Street, -% Boston, MA 02110-1301, USA. +% along with GNSS-SDR. If not, see . +% +% ------------------------------------------------------------------------- % function v = read_complex_binary (filename, count, start_sample) - %% usage: read_complex_binary (filename, [count], [start_sample]) - %% - %% open filename and return the contents as a column vector, - %% treating them as 32 bit complex numbers - %% - - m = nargchk (1,2,nargin); - if (m) +m = nargchk (1,2,nargin); +if (m) %usage (m); - end +end - if (nargin < 2) +if (nargin < 2) count = Inf; start_sample=0; - end +end - if (nargin < 3) +if (nargin < 3) start_sample=0; - end - - f = fopen (filename, 'rb'); - if (f < 0) +end + +f = fopen (filename, 'rb'); +if (f < 0) v = 0; - else +else if (start_sample>0) bytes_per_sample=4; fseek(f,start_sample*bytes_per_sample,'bof'); @@ -54,4 +58,4 @@ function v = read_complex_binary (filename, count, start_sample) v = t(1,:) + t(2,:)*i; [r, c] = size (v); v = reshape (v, c, r); - end +end diff --git a/src/utils/matlab/libs/read_complex_char_binary.m b/src/utils/matlab/libs/read_complex_char_binary.m index cafaedcc7..e339ec158 100644 --- a/src/utils/matlab/libs/read_complex_char_binary.m +++ b/src/utils/matlab/libs/read_complex_char_binary.m @@ -1,48 +1,52 @@ +% Usage: read_complex_binary (filename, [count]) % -% Copyright 2001 Free Software Foundation, Inc. -% -% This file is part of GNU Radio -% -% GNU Radio is free software; you can redistribute it and/or modify +% Opens filename and returns the contents as a column vector, +% treating them as 32 bit complex numbers +% + +% ------------------------------------------------------------------------- +% +% Copyright (C) 2010-2018 (see AUTHORS file for a list of contributors) +% +% GNSS-SDR is a software defined Global Navigation +% Satellite Systems receiver +% +% This file is part of GNSS-SDR. +% +% GNSS-SDR is free software: you can redistribute it and/or modify % it under the terms of the GNU General Public License as published by -% the Free Software Foundation; either version 3, or (at your option) -% any later version. -% -% GNU Radio is distributed in the hope that it will be useful, +% the Free Software Foundation, either version 3 of the License, or +% at your option) any later version. +% +% GNSS-SDR is distributed in the hope that it will be useful, % but WITHOUT ANY WARRANTY; without even the implied warranty of % MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the % GNU General Public License for more details. -% +% % You should have received a copy of the GNU General Public License -% along with GNU Radio; see the file COPYING. If not, write to -% the Free Software Foundation, Inc., 51 Franklin Street, -% Boston, MA 02110-1301, USA. -% +% along with GNSS-SDR. If not, see . +% +% ------------------------------------------------------------------------- +% function v = read_complex_char_binary (filename, count) - %% usage: read_complex_binary (filename, [count]) - %% - %% open filename and return the contents as a column vector, - %% treating them as 32 bit complex numbers - %% - - m = nargchk (1,2,nargin); - if (m) +m = nargchk (1,2,nargin); +if (m) usage (m); - end +end - if (nargin < 2) +if (nargin < 2) count = Inf; - end +end - f = fopen (filename, 'rb'); - if (f < 0) +f = fopen (filename, 'rb'); +if (f < 0) v = 0; - else +else t = fread (f, [2, count], 'int8'); fclose (f); v = t(1,:) + t(2,:)*i; [r, c] = size (v); v = reshape (v, c, r); - end +end diff --git a/src/utils/matlab/libs/read_complex_short_binary.m b/src/utils/matlab/libs/read_complex_short_binary.m index 55118528b..1d4e80bef 100644 --- a/src/utils/matlab/libs/read_complex_short_binary.m +++ b/src/utils/matlab/libs/read_complex_short_binary.m @@ -1,48 +1,52 @@ +% Usage: read_complex_binary (filename, [count]) % -% Copyright 2001 Free Software Foundation, Inc. -% -% This file is part of GNU Radio -% -% GNU Radio is free software; you can redistribute it and/or modify +% Opens filename and returns the contents as a column vector, +% treating them as 32 bit complex numbers +% + +% ------------------------------------------------------------------------- +% +% Copyright (C) 2010-2018 (see AUTHORS file for a list of contributors) +% +% GNSS-SDR is a software defined Global Navigation +% Satellite Systems receiver +% +% This file is part of GNSS-SDR. +% +% GNSS-SDR is free software: you can redistribute it and/or modify % it under the terms of the GNU General Public License as published by -% the Free Software Foundation; either version 3, or (at your option) -% any later version. -% -% GNU Radio is distributed in the hope that it will be useful, +% the Free Software Foundation, either version 3 of the License, or +% at your option) any later version. +% +% GNSS-SDR is distributed in the hope that it will be useful, % but WITHOUT ANY WARRANTY; without even the implied warranty of % MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the % GNU General Public License for more details. -% +% % You should have received a copy of the GNU General Public License -% along with GNU Radio; see the file COPYING. If not, write to -% the Free Software Foundation, Inc., 51 Franklin Street, -% Boston, MA 02110-1301, USA. -% +% along with GNSS-SDR. If not, see . +% +% ------------------------------------------------------------------------- +% function v = read_complex_short_binary (filename, count) - %% usage: read_complex_binary (filename, [count]) - %% - %% open filename and return the contents as a column vector, - %% treating them as 32 bit complex numbers - %% - - m = nargchk (1,2,nargin); - if (m) +m = nargchk (1,2,nargin); +if (m) usage (m); - end +end - if (nargin < 2) +if (nargin < 2) count = Inf; - end +end - f = fopen (filename, 'rb'); - if (f < 0) +f = fopen (filename, 'rb'); +if (f < 0) v = 0; - else +else t = fread (f, [2, count], 'short'); fclose (f); v = t(1,:) + t(2,:)*i; [r, c] = size (v); v = reshape (v, c, r); - end +end diff --git a/src/utils/matlab/libs/read_hybrid_observables_dump.m b/src/utils/matlab/libs/read_hybrid_observables_dump.m index b14090a2a..3d8cc3703 100644 --- a/src/utils/matlab/libs/read_hybrid_observables_dump.m +++ b/src/utils/matlab/libs/read_hybrid_observables_dump.m @@ -1,27 +1,52 @@ -% Javier Arribas 2011 +% Usage: read_tracking_dat (filename, [count]) +% +% Opens GNSS-SDR tracking binary log file .dat and returns the contents +% + +% ------------------------------------------------------------------------- +% +% Copyright (C) 2010-2018 (see AUTHORS file for a list of contributors) +% +% GNSS-SDR is a software defined Global Navigation +% Satellite Systems receiver +% +% This file is part of GNSS-SDR. +% +% GNSS-SDR is free software: you can redistribute it and/or modify +% it under the terms of the GNU General Public License as published by +% the Free Software Foundation, either version 3 of the License, or +% at your option) any later version. +% +% GNSS-SDR is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with GNSS-SDR. If not, see . +% +% ------------------------------------------------------------------------- +% +% Javier Arribas 2011 + function [observables] = read_hybrid_observables_dump (channels, filename, count) - %% usage: read_tracking_dat (filename, [count]) - %% - %% open GNSS-SDR tracking binary log file .dat and return the contents - %% - - m = nargchk (1,2,nargin); - num_double_vars=7; - double_size_bytes=8; - skip_bytes_each_read=double_size_bytes*num_double_vars*channels; - bytes_shift=0; - if (m) +m = nargchk (1,2,nargin); +num_double_vars=7; +double_size_bytes=8; +skip_bytes_each_read=double_size_bytes*num_double_vars*channels; +bytes_shift=0; +if (m) usage (m); - end +end - if (nargin < 3) +if (nargin < 3) count = Inf; - end - %loops_counter = fread (f, count, 'uint32',4*12); - f = fopen (filename, 'rb'); - if (f < 0) - else +end +%loops_counter = fread (f, count, 'uint32',4*12); +f = fopen (filename, 'rb'); +if (f < 0) +else for N=1:1:channels observables.RX_time(N,:) = fread (f, count, 'float64',skip_bytes_each_read-double_size_bytes); bytes_shift=bytes_shift+double_size_bytes; @@ -45,27 +70,27 @@ function [observables] = read_hybrid_observables_dump (channels, filename, count bytes_shift=bytes_shift+double_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved end - + fclose (f); %%%%%%%% output vars %%%%%%%% -% double tmp_double; -% for (unsigned int i = 0; i < d_nchannels; i++) -% { -% tmp_double = current_gnss_synchro[i].RX_time; -% d_dump_file.write((char*)&tmp_double, sizeof(double)); -% tmp_double = current_gnss_synchro[i].TOW_at_current_symbol_s; -% d_dump_file.write((char*)&tmp_double, sizeof(double)); -% tmp_double = current_gnss_synchro[i].Carrier_Doppler_hz; -% d_dump_file.write((char*)&tmp_double, sizeof(double)); -% tmp_double = current_gnss_synchro[i].Carrier_phase_rads/GPS_TWO_PI; -% d_dump_file.write((char*)&tmp_double, sizeof(double)); -% tmp_double = current_gnss_synchro[i].Pseudorange_m; -% d_dump_file.write((char*)&tmp_double, sizeof(double)); -% tmp_double = current_gnss_synchro[i].PRN; -% d_dump_file.write((char*)&tmp_double, sizeof(double)); -% tmp_double = current_gnss_synchro[i].Flag_valid_pseudorange; -% d_dump_file.write((char*)&tmp_double, sizeof(double)); -% } - end - + % double tmp_double; + % for (unsigned int i = 0; i < d_nchannels; i++) + % { + % tmp_double = current_gnss_synchro[i].RX_time; + % d_dump_file.write((char*)&tmp_double, sizeof(double)); + % tmp_double = current_gnss_synchro[i].TOW_at_current_symbol_s; + % d_dump_file.write((char*)&tmp_double, sizeof(double)); + % tmp_double = current_gnss_synchro[i].Carrier_Doppler_hz; + % d_dump_file.write((char*)&tmp_double, sizeof(double)); + % tmp_double = current_gnss_synchro[i].Carrier_phase_rads/GPS_TWO_PI; + % d_dump_file.write((char*)&tmp_double, sizeof(double)); + % tmp_double = current_gnss_synchro[i].Pseudorange_m; + % d_dump_file.write((char*)&tmp_double, sizeof(double)); + % tmp_double = current_gnss_synchro[i].PRN; + % d_dump_file.write((char*)&tmp_double, sizeof(double)); + % tmp_double = current_gnss_synchro[i].Flag_valid_pseudorange; + % d_dump_file.write((char*)&tmp_double, sizeof(double)); + % } +end + diff --git a/src/utils/matlab/libs/read_true_sim_observables_dump.m b/src/utils/matlab/libs/read_true_sim_observables_dump.m index af2001b69..04c45f989 100644 --- a/src/utils/matlab/libs/read_true_sim_observables_dump.m +++ b/src/utils/matlab/libs/read_true_sim_observables_dump.m @@ -1,29 +1,54 @@ -% Javier Arribas 2011 +% Usage: read_true_sim_observables_dump (filename, [count]) +% +% Opens gnss-sdr-sim observables dump and reads all chennels +% + +% ------------------------------------------------------------------------- +% +% Copyright (C) 2010-2018 (see AUTHORS file for a list of contributors) +% +% GNSS-SDR is a software defined Global Navigation +% Satellite Systems receiver +% +% This file is part of GNSS-SDR. +% +% GNSS-SDR is free software: you can redistribute it and/or modify +% it under the terms of the GNU General Public License as published by +% the Free Software Foundation, either version 3 of the License, or +% at your option) any later version. +% +% GNSS-SDR is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with GNSS-SDR. If not, see . +% +% ------------------------------------------------------------------------- +% +% Javier Arribas 2011 + function [observables] = read_true_sim_observables_dump (filename, count) - %% usage: read_true_sim_observables_dump (filename, [count]) - %% - %% open gnss-sdr-sim observables dump and read all chennels - %% +m = nargchk (1,2,nargin); +channels=12; %Simulator always use 12 channels +num_double_vars=7; +double_size_bytes=8; +skip_bytes_each_read=double_size_bytes*num_double_vars*channels; +bytes_shift=0; - m = nargchk (1,2,nargin); - channels=12; %Simulator always use 12 channels - num_double_vars=7; - double_size_bytes=8; - skip_bytes_each_read=double_size_bytes*num_double_vars*channels; - bytes_shift=0; - - if (m) +if (m) usage (m); - end +end - if (nargin < 2) +if (nargin < 2) count = Inf; - end - %loops_counter = fread (f, count, 'uint32',4*12); - f = fopen (filename, 'rb'); - if (f < 0) - else +end +%loops_counter = fread (f, count, 'uint32',4*12); +f = fopen (filename, 'rb'); +if (f < 0) +else for N=1:1:channels observables.RX_time(N,:) = fread (f, count, 'float64',skip_bytes_each_read-double_size_bytes); bytes_shift=bytes_shift+double_size_bytes; @@ -47,19 +72,19 @@ function [observables] = read_true_sim_observables_dump (filename, count) bytes_shift=bytes_shift+double_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved end - + fclose (f); -% %%%%%%%% output vars %%%%%%%% -% for(int i=0;i<12;i++) -% { -% d_dump_file.read((char *) &gps_time_sec[i], sizeof(double)); -% d_dump_file.read((char *) &doppler_l1_hz, sizeof(double)); -% d_dump_file.read((char *) &acc_carrier_phase_l1_cycles[i], sizeof(double)); -% d_dump_file.read((char *) &dist_m[i], sizeof(double)); -% d_dump_file.read((char *) &true_dist_m[i], sizeof(double)); -% d_dump_file.read((char *) &carrier_phase_l1_cycles[i], sizeof(double)); -% d_dump_file.read((char *) &prn[i], sizeof(double)); -% } - end - + % %%%%%%%% output vars %%%%%%%% + % for(int i=0;i<12;i++) + % { + % d_dump_file.read((char *) &gps_time_sec[i], sizeof(double)); + % d_dump_file.read((char *) &doppler_l1_hz, sizeof(double)); + % d_dump_file.read((char *) &acc_carrier_phase_l1_cycles[i], sizeof(double)); + % d_dump_file.read((char *) &dist_m[i], sizeof(double)); + % d_dump_file.read((char *) &true_dist_m[i], sizeof(double)); + % d_dump_file.read((char *) &carrier_phase_l1_cycles[i], sizeof(double)); + % d_dump_file.read((char *) &prn[i], sizeof(double)); + % } +end + diff --git a/src/utils/matlab/plotTrackingE5a.m b/src/utils/matlab/plotTrackingE5a.m index b017accf3..d8966caaf 100644 --- a/src/utils/matlab/plotTrackingE5a.m +++ b/src/utils/matlab/plotTrackingE5a.m @@ -1,7 +1,7 @@ function plotTracking(channelList, trackResults, settings) -%This function plots the tracking results for the given channel list. +% This function plots the tracking results for the given channel list. % -%plotTracking(channelList, trackResults, settings) +% plotTracking(channelList, trackResults, settings) % % Inputs: % channelList - list of channels to be plotted. @@ -10,144 +10,141 @@ function plotTracking(channelList, trackResults, settings) %-------------------------------------------------------------------------- % SoftGNSS v3.0 -% +% % Copyright (C) Darius Plausinaitis % Written by Darius Plausinaitis %-------------------------------------------------------------------------- -%This program is free software; you can redistribute it and/or -%modify it under the terms of the GNU General Public License -%as published by the Free Software Foundation; either version 2 -%of the License, or (at your option) any later version. +% This program is free software; you can redistribute it and/or +% modify it under the terms of the GNU General Public License +% as published by the Free Software Foundation; either version 2 +% of the License, or (at your option) any later version. % -%This program is distributed in the hope that it will be useful, -%but WITHOUT ANY WARRANTY; without even the implied warranty of -%MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -%GNU General Public License for more details. +% This program is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU General Public License for more details. % -%You should have received a copy of the GNU General Public License -%along with this program; if not, write to the Free Software -%Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, -%USA. +% You should have received a copy of the GNU General Public License +% along with this program; if not, write to the Free Software +% Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, +% USA. %-------------------------------------------------------------------------- -%CVS record: -%$Id: plotTracking.m,v 1.5.2.23 2006/08/14 14:45:14 dpl Exp $ - % Protection - if the list contains incorrect channel numbers channelList = intersect(channelList, 1:settings.numberOfChannels); %=== For all listed channels ============================================== for channelNr = channelList - -%% Select (or create) and clear the figure ================================ + + %% Select (or create) and clear the figure ================================ % The number 200 is added just for more convenient handling of the open % figure windows, when many figures are closed and reopened. % Figures drawn or opened by the user, will not be "overwritten" by % this function. - + figure(channelNr +200); clf(channelNr +200); set(channelNr +200, 'Name', ['Channel ', num2str(channelNr), ... - ' (PRN ', ... - num2str(trackResults(channelNr).PRN), ... - ') results']); - -%% Draw axes ============================================================== - % Row 1 - handles(1, 1) = subplot(3, 3, 1); - handles(1, 2) = subplot(3, 3, [2 3]); - % Row 2 - handles(2, 1) = subplot(3, 3, 4); - handles(2, 2) = subplot(3, 3, [5 6]); - % Row 3 - handles(3, 1) = subplot(3, 3, 7); - handles(3, 2) = subplot(3, 3, 8); - handles(3, 3) = subplot(3, 3, 9); - -%% Plot all figures ======================================================= - - timeAxisInSeconds = (1:settings.msToProcess-1)/1000; - - %----- Discrete-Time Scatter Plot --------------------------------- - plot(handles(1, 1), trackResults(channelNr).I_PN,... - trackResults(channelNr).Q_PN, ... - '.'); - - grid (handles(1, 1)); - axis (handles(1, 1), 'equal'); - title (handles(1, 1), 'Discrete-Time Scatter Plot'); - xlabel(handles(1, 1), 'I prompt'); - ylabel(handles(1, 1), 'Q prompt'); - - %----- Nav bits --------------------------------------------------- - plot (handles(1, 2), timeAxisInSeconds, ... - trackResults(channelNr).I_PN(1:settings.msToProcess-1)); - - grid (handles(1, 2)); - title (handles(1, 2), 'Bits of the navigation message'); - xlabel(handles(1, 2), 'Time (s)'); - axis (handles(1, 2), 'tight'); - - %----- PLL discriminator unfiltered-------------------------------- - plot (handles(2, 1), timeAxisInSeconds, ... - trackResults(channelNr).pllDiscr(1:settings.msToProcess-1), 'r'); - - grid (handles(2, 1)); - axis (handles(2, 1), 'tight'); - xlabel(handles(2, 1), 'Time (s)'); - ylabel(handles(2, 1), 'Amplitude'); - title (handles(2, 1), 'Raw PLL discriminator'); - - %----- Correlation ------------------------------------------------ - plot(handles(2, 2), timeAxisInSeconds, ... - [sqrt(trackResults(channelNr).I_E(1:settings.msToProcess-1).^2 + ... - trackResults(channelNr).Q_E(1:settings.msToProcess-1).^2)', ... - sqrt(trackResults(channelNr).I_P(1:settings.msToProcess-1).^2 + ... - trackResults(channelNr).Q_P(1:settings.msToProcess-1).^2)', ... - sqrt(trackResults(channelNr).I_L(1:settings.msToProcess-1).^2 + ... - trackResults(channelNr).Q_L(1:settings.msToProcess-1).^2)'], ... - '-*'); - - grid (handles(2, 2)); - title (handles(2, 2), 'Correlation results'); - xlabel(handles(2, 2), 'Time (s)'); - axis (handles(2, 2), 'tight'); - - hLegend = legend(handles(2, 2), '$\sqrt{I_{E}^2 + Q_{E}^2}$', ... - '$\sqrt{I_{P}^2 + Q_{P}^2}$', ... - '$\sqrt{I_{L}^2 + Q_{L}^2}$'); - - %set interpreter from tex to latex. This will draw \sqrt correctly - set(hLegend, 'Interpreter', 'Latex'); - - %----- PLL discriminator filtered---------------------------------- - plot (handles(3, 1), timeAxisInSeconds, ... - trackResults(channelNr).pllDiscrFilt(1:settings.msToProcess-1), 'b'); - - grid (handles(3, 1)); - axis (handles(3, 1), 'tight'); - xlabel(handles(3, 1), 'Time (s)'); - ylabel(handles(3, 1), 'Amplitude'); - title (handles(3, 1), 'Filtered PLL discriminator'); - - %----- DLL discriminator unfiltered-------------------------------- - plot (handles(3, 2), timeAxisInSeconds, ... - trackResults(channelNr).dllDiscr(1:settings.msToProcess-1), 'r'); - - grid (handles(3, 2)); - axis (handles(3, 2), 'tight'); - xlabel(handles(3, 2), 'Time (s)'); - ylabel(handles(3, 2), 'Amplitude'); - title (handles(3, 2), 'Raw DLL discriminator'); - - %----- DLL discriminator filtered---------------------------------- - plot (handles(3, 3), timeAxisInSeconds, ... - trackResults(channelNr).dllDiscrFilt(1:settings.msToProcess-1), 'b'); - - grid (handles(3, 3)); - axis (handles(3, 3), 'tight'); - xlabel(handles(3, 3), 'Time (s)'); - ylabel(handles(3, 3), 'Amplitude'); - title (handles(3, 3), 'Filtered DLL discriminator'); - + ' (PRN ', ... + num2str(trackResults(channelNr).PRN), ... + ') results']); + + %% Draw axes ============================================================== + % Row 1 + handles(1, 1) = subplot(3, 3, 1); + handles(1, 2) = subplot(3, 3, [2 3]); + % Row 2 + handles(2, 1) = subplot(3, 3, 4); + handles(2, 2) = subplot(3, 3, [5 6]); + % Row 3 + handles(3, 1) = subplot(3, 3, 7); + handles(3, 2) = subplot(3, 3, 8); + handles(3, 3) = subplot(3, 3, 9); + + %% Plot all figures ======================================================= + + timeAxisInSeconds = (1:settings.msToProcess-1)/1000; + + %----- Discrete-Time Scatter Plot --------------------------------- + plot(handles(1, 1), trackResults(channelNr).I_PN,... + trackResults(channelNr).Q_PN, ... + '.'); + + grid (handles(1, 1)); + axis (handles(1, 1), 'equal'); + title (handles(1, 1), 'Discrete-Time Scatter Plot'); + xlabel(handles(1, 1), 'I prompt'); + ylabel(handles(1, 1), 'Q prompt'); + + %----- Nav bits --------------------------------------------------- + plot (handles(1, 2), timeAxisInSeconds, ... + trackResults(channelNr).I_PN(1:settings.msToProcess-1)); + + grid (handles(1, 2)); + title (handles(1, 2), 'Bits of the navigation message'); + xlabel(handles(1, 2), 'Time (s)'); + axis (handles(1, 2), 'tight'); + + %----- PLL discriminator unfiltered-------------------------------- + plot (handles(2, 1), timeAxisInSeconds, ... + trackResults(channelNr).pllDiscr(1:settings.msToProcess-1), 'r'); + + grid (handles(2, 1)); + axis (handles(2, 1), 'tight'); + xlabel(handles(2, 1), 'Time (s)'); + ylabel(handles(2, 1), 'Amplitude'); + title (handles(2, 1), 'Raw PLL discriminator'); + + %----- Correlation ------------------------------------------------ + plot(handles(2, 2), timeAxisInSeconds, ... + [sqrt(trackResults(channelNr).I_E(1:settings.msToProcess-1).^2 + ... + trackResults(channelNr).Q_E(1:settings.msToProcess-1).^2)', ... + sqrt(trackResults(channelNr).I_P(1:settings.msToProcess-1).^2 + ... + trackResults(channelNr).Q_P(1:settings.msToProcess-1).^2)', ... + sqrt(trackResults(channelNr).I_L(1:settings.msToProcess-1).^2 + ... + trackResults(channelNr).Q_L(1:settings.msToProcess-1).^2)'], ... + '-*'); + + grid (handles(2, 2)); + title (handles(2, 2), 'Correlation results'); + xlabel(handles(2, 2), 'Time (s)'); + axis (handles(2, 2), 'tight'); + + hLegend = legend(handles(2, 2), '$\sqrt{I_{E}^2 + Q_{E}^2}$', ... + '$\sqrt{I_{P}^2 + Q_{P}^2}$', ... + '$\sqrt{I_{L}^2 + Q_{L}^2}$'); + + %set interpreter from tex to latex. This will draw \sqrt correctly + set(hLegend, 'Interpreter', 'Latex'); + + %----- PLL discriminator filtered---------------------------------- + plot (handles(3, 1), timeAxisInSeconds, ... + trackResults(channelNr).pllDiscrFilt(1:settings.msToProcess-1), 'b'); + + grid (handles(3, 1)); + axis (handles(3, 1), 'tight'); + xlabel(handles(3, 1), 'Time (s)'); + ylabel(handles(3, 1), 'Amplitude'); + title (handles(3, 1), 'Filtered PLL discriminator'); + + %----- DLL discriminator unfiltered-------------------------------- + plot (handles(3, 2), timeAxisInSeconds, ... + trackResults(channelNr).dllDiscr(1:settings.msToProcess-1), 'r'); + + grid (handles(3, 2)); + axis (handles(3, 2), 'tight'); + xlabel(handles(3, 2), 'Time (s)'); + ylabel(handles(3, 2), 'Amplitude'); + title (handles(3, 2), 'Raw DLL discriminator'); + + %----- DLL discriminator filtered---------------------------------- + plot (handles(3, 3), timeAxisInSeconds, ... + trackResults(channelNr).dllDiscrFilt(1:settings.msToProcess-1), 'b'); + + grid (handles(3, 3)); + axis (handles(3, 3), 'tight'); + xlabel(handles(3, 3), 'Time (s)'); + ylabel(handles(3, 3), 'Amplitude'); + title (handles(3, 3), 'Filtered DLL discriminator'); + end % for channelNr = channelList diff --git a/src/utils/matlab/plot_acq_grid.m b/src/utils/matlab/plot_acq_grid.m index 523f3d03a..b1d63ed58 100644 --- a/src/utils/matlab/plot_acq_grid.m +++ b/src/utils/matlab/plot_acq_grid.m @@ -1,36 +1,32 @@ -% /*! -% * \file plot_acq_grid.m -% * \brief Read GNSS-SDR Acquisition dump .mat file using the provided -% function and plot acquisition grid of acquisition statistic of PRN sat +% Reads GNSS-SDR Acquisition dump .mat file using the provided +% function and plots acquisition grid of acquisition statistic of PRN sat +% Antonio Ramos, 2017. antonio.ramos(at)cttc.es +% ------------------------------------------------------------------------- +% +% Copyright (C) 2010-2018 (see AUTHORS file for a list of contributors) +% +% GNSS-SDR is a software defined Global Navigation +% Satellite Systems receiver +% +% This file is part of GNSS-SDR. +% +% GNSS-SDR is free software: you can redistribute it and/or modify +% it under the terms of the GNU General Public License as published by +% the Free Software Foundation, either version 3 of the License, or +% at your option) any later version. +% +% GNSS-SDR is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with GNSS-SDR. If not, see . +% +% ------------------------------------------------------------------------- % -% -% * \author Antonio Ramos, 2017. antonio.ramos(at)cttc.es -% * ------------------------------------------------------------------------- -% * -% * Copyright (C) 2010-2017 (see AUTHORS file for a list of contributors) -% * -% * GNSS-SDR is a software defined Global Navigation -% * Satellite Systems receiver -% * -% * This file is part of GNSS-SDR. -% * -% * GNSS-SDR is free software: you can redistribute it and/or modify -% * it under the terms of the GNU General Public License as published by -% * the Free Software Foundation, either version 3 of the License, or -% * at your option) any later version. -% * -% * GNSS-SDR is distributed in the hope that it will be useful, -% * but WITHOUT ANY WARRANTY; without even the implied warranty of -% * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% * GNU General Public License for more details. -% * -% * You should have received a copy of the GNU General Public License -% * along with GNSS-SDR. If not, see . -% * -% * ------------------------------------------------------------------------- -% */ -%%%%%%%%% ¡¡¡ CONFIGURE !!! %%%%%%%%%%%%% +%%%%%%%%% ?????? CONFIGURE !!! %%%%%%%%%%%%% path = '/archive/'; file = 'acq'; diff --git a/src/utils/matlab/plot_acq_grid_gsoc.m b/src/utils/matlab/plot_acq_grid_gsoc.m index c38d5ea18..155de2528 100644 --- a/src/utils/matlab/plot_acq_grid_gsoc.m +++ b/src/utils/matlab/plot_acq_grid_gsoc.m @@ -1,37 +1,35 @@ -% /*! -% * \file plot_acq_grid_gsoc.m -% * \brief Read GNSS-SDR Acquisition dump binary file using the provided -% function and plot acquisition grid of acquisition statistic of PRN sat +% Reads GNSS-SDR Acquisition dump binary file using the provided +% function and plots acquisition grid of acquisition statistic of PRN sat % -% This function analyzes a experiment performed by Luis Esteve in the framework +% This function analyzes a experiment performed by Luis Esteve in the framework % of the Google Summer of Code (GSoC) 2012, with the collaboration of Javier Arribas -% and Carles Fernández, related to the extension of GNSS-SDR to Galileo. +% and Carles Fern??ndez, related to the extension of GNSS-SDR to Galileo. +% +% Luis Esteve, 2012. luis(at)epsilon-formacion.com +% ------------------------------------------------------------------------- +% +% Copyright (C) 2010-2018 (see AUTHORS file for a list of contributors) +% +% GNSS-SDR is a software defined Global Navigation +% Satellite Systems receiver +% +% This file is part of GNSS-SDR. +% +% GNSS-SDR is free software: you can redistribute it and/or modify +% it under the terms of the GNU General Public License as published by +% the Free Software Foundation, either version 3 of the License, or +% at your option) any later version. +% +% GNSS-SDR is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with GNSS-SDR. If not, see . +% +% ------------------------------------------------------------------------- % -% * \author Luis Esteve, 2012. luis(at)epsilon-formacion.com -% * ------------------------------------------------------------------------- -% * -% * Copyright (C) 2010-2011 (see AUTHORS file for a list of contributors) -% * -% * GNSS-SDR is a software defined Global Navigation -% * Satellite Systems receiver -% * -% * This file is part of GNSS-SDR. -% * -% * GNSS-SDR is free software: you can redistribute it and/or modify -% * it under the terms of the GNU General Public License as published by -% * the Free Software Foundation, either version 3 of the License, or -% * at your option) any later version. -% * -% * GNSS-SDR is distributed in the hope that it will be useful, -% * but WITHOUT ANY WARRANTY; without even the implied warranty of -% * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% * GNU General Public License for more details. -% * -% * You should have received a copy of the GNU General Public License -% * along with GNSS-SDR. If not, see . -% * -% * ------------------------------------------------------------------------- -% */ function plot_acq_grid_gsoc(sat) @@ -61,7 +59,7 @@ for k=Doppler_min_Hz:Doppler_step_Hz:Doppler_max_Hz index=index+1; filename=['test_statistics_E_1C_sat_' num2str(sat) '_doppler_' num2str(k) '.dat']; acq_grid(index,:)=abs(read_complex_binary (filename)); - end +end maximum_correlation_peak = max(max(acq_grid)) diff --git a/src/utils/matlab/plot_acq_grid_gsoc_e5.m b/src/utils/matlab/plot_acq_grid_gsoc_e5.m index 2259c1b93..00ed7b226 100644 --- a/src/utils/matlab/plot_acq_grid_gsoc_e5.m +++ b/src/utils/matlab/plot_acq_grid_gsoc_e5.m @@ -1,39 +1,38 @@ -% /*! -% * \file plot_acq_grid_gsoc_e5.m -% * \brief Read GNSS-SDR Acquisition dump binary file using the provided -% function and plot acquisition grid of acquisition statistic of PRN sat. -% CAF input must be 0 or 1 depending if the user desires to read the file -% that resolves doppler ambiguity or not. +% Reads GNSS-SDR Acquisition dump binary file using the provided +% function and plot acquisition grid of acquisition statistic of PRN sat. +% CAF input must be 0 or 1 depending if the user desires to read the file +% that resolves doppler ambiguity or not. % -% This function analyzes a experiment performed by Marc Sales in the framework -% of the Google Summer of Code (GSoC) 2014, with the collaboration of Luis Esteve, Javier Arribas -% and Carles Fernández, related to the extension of GNSS-SDR to Galileo. +% This function analyzes a experiment performed by Marc Sales in the framework +% of the Google Summer of Code (GSoC) 2014, with the collaboration of Luis Esteve, Javier Arribas +% and Carles Fernandez, related to the extension of GNSS-SDR to Galileo. +% +% Marc Sales marcsales92(at)gmail.com, +% Luis Esteve, 2014. luis(at)epsilon-formacion.com +% ------------------------------------------------------------------------- +% +% Copyright (C) 2010-2018 (see AUTHORS file for a list of contributors) +% +% GNSS-SDR is a software defined Global Navigation +% Satellite Systems receiver +% +% This file is part of GNSS-SDR. +% +% GNSS-SDR is free software: you can redistribute it and/or modify +% it under the terms of the GNU General Public License as published by +% the Free Software Foundation, either version 3 of the License, or +% at your option) any later version. +% +% GNSS-SDR is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with GNSS-SDR. If not, see . +% +% ------------------------------------------------------------------------- % -% * \author Marc Sales marcsales92(at)gmail.com, Luis Esteve, 2014. luis(at)epsilon-formacion.com -% * ------------------------------------------------------------------------- -% * -% * Copyright (C) 2010-2014 (see AUTHORS file for a list of contributors) -% * -% * GNSS-SDR is a software defined Global Navigation -% * Satellite Systems receiver -% * -% * This file is part of GNSS-SDR. -% * -% * GNSS-SDR is free software: you can redistribute it and/or modify -% * it under the terms of the GNU General Public License as published by -% * the Free Software Foundation, either version 3 of the License, or -% * at your option) any later version. -% * -% * GNSS-SDR is distributed in the hope that it will be useful, -% * but WITHOUT ANY WARRANTY; without even the implied warranty of -% * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% * GNU General Public License for more details. -% * -% * You should have received a copy of the GNU General Public License -% * along with GNSS-SDR. If not, see . -% * -% * ------------------------------------------------------------------------- -% */ function plot_acq_grid_gsoc_e5(sat,CAF) @@ -127,7 +126,7 @@ myFile = java.io.File(file); flen = length(myFile); num_samples=flen/8; % 8 bytes (2 single floats) per complex sample -for k=1:num_samples +for k=1:num_samples a(1:2) = fread(fid, 2, 'float'); x(k) = a(1) + a(2)*1i; k=k+1; diff --git a/src/utils/matlab/plot_acq_grid_gsoc_glonass.m b/src/utils/matlab/plot_acq_grid_gsoc_glonass.m index 9742e5107..9cc6b3ec3 100644 --- a/src/utils/matlab/plot_acq_grid_gsoc_glonass.m +++ b/src/utils/matlab/plot_acq_grid_gsoc_glonass.m @@ -1,37 +1,34 @@ -% /*! -% * \file plot_acq_grid_gsoc.m -% * \brief Read GNSS-SDR Acquisition dump binary file using the provided -% function and plot acquisition grid of acquisition statistic of PRN sat +% Reads GNSS-SDR Acquisition dump binary file using the provided +% function and plots acquisition grid of acquisition statistic of PRN sat % -% This function analyzes a experiment performed by Luis Esteve in the framework +% This function analyzes a experiment performed by Luis Esteve in the framework % of the Google Summer of Code (GSoC) 2012, with the collaboration of Javier Arribas -% and Carles Fernández, related to the extension of GNSS-SDR to Galileo. +% and Carles Fernandez, related to the extension of GNSS-SDR to Galileo. +% +% ------------------------------------------------------------------------- +% +% Copyright (C) 2010-2018 (see AUTHORS file for a list of contributors) +% +% GNSS-SDR is a software defined Global Navigation +% Satellite Systems receiver +% +% This file is part of GNSS-SDR. +% +% GNSS-SDR is free software: you can redistribute it and/or modify +% it under the terms of the GNU General Public License as published by +% the Free Software Foundation, either version 3 of the License, or +% at your option) any later version. +% +% GNSS-SDR is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with GNSS-SDR. If not, see . +% +% ------------------------------------------------------------------------- % -% * \author Luis Esteve, 2012. luis(at)epsilon-formacion.com -% * ------------------------------------------------------------------------- -% * -% * Copyright (C) 2010-2011 (see AUTHORS file for a list of contributors) -% * -% * GNSS-SDR is a software defined Global Navigation -% * Satellite Systems receiver -% * -% * This file is part of GNSS-SDR. -% * -% * GNSS-SDR is free software: you can redistribute it and/or modify -% * it under the terms of the GNU General Public License as published by -% * the Free Software Foundation, either version 3 of the License, or -% * at your option) any later version. -% * -% * GNSS-SDR is distributed in the hope that it will be useful, -% * but WITHOUT ANY WARRANTY; without even the implied warranty of -% * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% * GNU General Public License for more details. -% * -% * You should have received a copy of the GNU General Public License -% * along with GNSS-SDR. If not, see . -% * -% * ------------------------------------------------------------------------- -% */ function plot_acq_grid_gsoc_glonass(sat) @@ -62,9 +59,9 @@ for k=Doppler_min_Hz:Doppler_step_Hz:Doppler_max_Hz index=index+1; filename=['acquisition_R_1G_sat_' num2str(sat) '_doppler_' num2str(k) '.dat']; acq_grid(index,:)=abs(read_complex_binary (filename)); - end +end - acq_grid = acq_grid.^2; +acq_grid = acq_grid.^2; maximum_correlation_peak = max(max(acq_grid)) From 62aa9dffb6597d336e6857412766690c18924a20 Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Fri, 30 Mar 2018 10:45:19 +0200 Subject: [PATCH 52/61] Remove unused files --- src/utils/gnuplot/4_GPS_3_GAL.plt | 41 - .../4_GPS_3_GAL_GNSS_SDR_solutions.txt | 1001 ----------------- .../4_GPS_3_GAL_accuracy_precision.jpeg | Bin 47887 -> 0 bytes .../gnuplot/8_GALILEO_accuracy_precision.jpeg | Bin 53272 -> 0 bytes .../gnuplot/8_GAL_GNSS_SDR_solutions.txt | 1001 ----------------- src/utils/gnuplot/8_GPS.plt | 40 - .../gnuplot/8_GPS_GNSS_SDR_solutions.txt | 1001 ----------------- .../gnuplot/8_GPS_accuracy_precision.jpeg | Bin 55402 -> 0 bytes src/utils/gnuplot/8_Galileo.plt | 40 - .../gnuplot/8_sat_accuracy_precision.jpeg | Bin 50195 -> 0 bytes .../gnuplot/8_sat_accuracy_precision.plt | 50 - .../4_GPS_3_GAL_GNSS_SDR_statitics.txt | 23 - .../statistics/8_GAL_GNSS_SDR_statitics.txt | 23 - .../statistics/8_GPS_GNSS_SDR_statitics.txt | 23 - 14 files changed, 3243 deletions(-) delete mode 100644 src/utils/gnuplot/4_GPS_3_GAL.plt delete mode 100644 src/utils/gnuplot/4_GPS_3_GAL_GNSS_SDR_solutions.txt delete mode 100644 src/utils/gnuplot/4_GPS_3_GAL_accuracy_precision.jpeg delete mode 100644 src/utils/gnuplot/8_GALILEO_accuracy_precision.jpeg delete mode 100644 src/utils/gnuplot/8_GAL_GNSS_SDR_solutions.txt delete mode 100644 src/utils/gnuplot/8_GPS.plt delete mode 100644 src/utils/gnuplot/8_GPS_GNSS_SDR_solutions.txt delete mode 100644 src/utils/gnuplot/8_GPS_accuracy_precision.jpeg delete mode 100644 src/utils/gnuplot/8_Galileo.plt delete mode 100644 src/utils/gnuplot/8_sat_accuracy_precision.jpeg delete mode 100644 src/utils/gnuplot/8_sat_accuracy_precision.plt delete mode 100644 src/utils/gnuplot/statistics/4_GPS_3_GAL_GNSS_SDR_statitics.txt delete mode 100644 src/utils/gnuplot/statistics/8_GAL_GNSS_SDR_statitics.txt delete mode 100644 src/utils/gnuplot/statistics/8_GPS_GNSS_SDR_statitics.txt diff --git a/src/utils/gnuplot/4_GPS_3_GAL.plt b/src/utils/gnuplot/4_GPS_3_GAL.plt deleted file mode 100644 index 5a59f2aff..000000000 --- a/src/utils/gnuplot/4_GPS_3_GAL.plt +++ /dev/null @@ -1,41 +0,0 @@ -#set terminal pdf color font "Bold,14" -#set output "IFEN_accuracy.pdf" - -set terminal jpeg font "Helvetica, 14" -set output "4_GPS_3_GAL_accuracy_precision.jpeg" - -set grid -set xrange [-10:10] -set yrange [-5:15] -set ylabel "North [m]" -set xlabel "East [m]" - -set key Left left -set title "IFEN simulated data, 4 GPS, 8 Gal - Accuracy and Precision" -#file1="8_GPS_GNSS_SDR_solutions.txt" -#file2="8_GAL_GNSS_SDR_solutions.txt" -file3="4_GPS_3_GAL_GNSS_SDR_solutions.txt" - -#values to copy from statistic file -DRMS= 3.077806456 -DUE_DRMS= 6.155612912 -CEP= 2.565164055 - - -#difference with respect to the reference position -#values to copy from statistic file -delta_E= -1.812 # combined -delta_N= 3.596 # combined - -set parametric -#dummy variable is t for curves, u/v for surfaces -set size square -set angle degree -set trange [0:360] -#radius_6_GPS=6 - -plot file3 u 9:10 with points pointsize 0.3 lc rgb "green" notitle,\ -DRMS*sin(t)+delta_E,DRMS*cos(t)+delta_N lw 3 lc rgb "black" title "DRMS",\ -DUE_DRMS*sin(t)+delta_E,DUE_DRMS*cos(t)+delta_N lw 2 lc rgb "gray" title "2DRMS",\ -CEP*sin(t)+delta_E,CEP*cos(t)+delta_N lw 1 lc rgb "black" title "CEP" - diff --git a/src/utils/gnuplot/4_GPS_3_GAL_GNSS_SDR_solutions.txt b/src/utils/gnuplot/4_GPS_3_GAL_GNSS_SDR_solutions.txt deleted file mode 100644 index 8e4462747..000000000 --- a/src/utils/gnuplot/4_GPS_3_GAL_GNSS_SDR_solutions.txt +++ /dev/null @@ -1,1001 +0,0 @@ - time X [m] Y [m] Z [m] Long [deg] Lat [deg] h [m] E(Acc) [m] N(Acc) [m] Up(Acc) [m] E(Pre) [m] N(Pre) [m] Up(Pre) [m] Tot Sat Gal GPS GDOP -2013-Sep-20 09:11:16 4171693.97233 872117.53398 4730015.03429 11.80796 48.17154 533.09677 -3.02276 4.40094 8.50611 -1.20980 0.80488 -0.48942 7 3 4 2.38 -2013-Sep-20 09:11:16 4171693.33830 872116.34933 4730014.33700 11.80795 48.17154 532.00164 -4.05260 4.57900 7.41098 -2.23964 0.98294 -1.58455 7 3 4 2.38 -2013-Sep-20 09:11:16 4171693.05315 872118.15688 4730014.15668 11.80798 48.17154 531.92781 -2.22494 4.39110 7.33715 -0.41198 0.79504 -1.65838 7 3 4 2.38 -2013-Sep-20 09:11:16 4171692.12670 872118.20356 4730011.97295 11.80798 48.17153 529.70220 -1.98967 3.60338 5.11154 -0.17671 0.00732 -3.88399 7 3 4 2.38 -2013-Sep-20 09:11:16 4171696.84323 872121.85875 4730020.07446 11.80801 48.17154 539.31673 0.62302 5.00884 14.72607 2.43598 1.41277 5.73054 7 3 4 2.38 -2013-Sep-20 09:11:16 4171693.35432 872119.69457 4730016.43049 11.80800 48.17155 534.02857 -0.78142 5.45339 9.43792 1.03154 1.85733 0.44238 7 3 4 2.38 -2013-Sep-20 09:11:16 4171693.12694 872119.79577 4730015.98216 11.80800 48.17155 533.55988 -0.63583 5.30481 8.96922 1.17713 1.70875 -0.02631 7 3 4 2.38 -2013-Sep-20 09:11:16 4171696.96879 872121.82141 4730019.17596 11.80801 48.17154 538.72409 0.56077 4.32373 14.13343 2.37373 0.72767 5.13790 7 3 4 2.38 -2013-Sep-20 09:11:16 4171694.15949 872120.93965 4730016.49439 11.80801 48.17154 534.77171 0.27255 4.71888 10.18105 2.08550 1.12282 1.18552 7 3 4 2.38 -2013-Sep-20 09:11:16 4171693.75614 872120.79377 4730017.69730 11.80801 48.17155 535.38484 0.21229 5.83754 10.79418 2.02525 2.24148 1.79865 7 3 4 2.38 -2013-Sep-20 09:11:16 4171695.61533 872122.42037 4730020.91833 11.80802 48.17156 539.22062 1.42402 6.38158 14.62996 3.23698 2.78552 5.63443 7 3 4 2.38 -2013-Sep-20 09:11:16 4171694.88778 872121.15270 4730019.60309 11.80801 48.17155 537.59264 0.33206 6.22839 13.00198 2.14502 2.63233 4.00645 7 3 4 2.38 -2013-Sep-20 09:11:16 4171693.43914 872118.88386 4730017.86310 11.80798 48.17156 535.04081 -1.59233 6.47055 10.45015 0.22063 2.87448 1.45462 7 3 4 2.38 -2013-Sep-20 09:11:16 4171692.22580 872118.12648 4730014.50631 11.80798 48.17154 531.64410 -2.08540 5.23236 7.05344 -0.27244 1.63630 -1.94209 7 3 4 2.38 -2013-Sep-20 09:11:16 4171694.15704 872116.07742 4730015.59062 11.80795 48.17154 533.43313 -4.48630 4.85933 8.84247 -2.67334 1.26327 -0.15306 7 3 4 2.38 -2013-Sep-20 09:11:16 4171693.05163 872116.15088 4730014.39550 11.80795 48.17154 531.83101 -4.18818 4.85737 7.24035 -2.37522 1.26131 -1.75518 7 3 4 2.38 -2013-Sep-20 09:11:16 4171691.44820 872115.16638 4730012.34165 11.80794 48.17154 529.11954 -4.82374 4.80727 4.52888 -3.01078 1.21121 -4.46665 7 3 4 2.38 -2013-Sep-20 09:11:16 4171685.37039 872113.72974 4730008.72245 11.80794 48.17156 522.25911 -4.98626 7.04568 -2.33155 -3.17330 3.44962 -11.32708 7 3 4 2.38 -2013-Sep-20 09:11:16 4171690.06034 872116.43183 4730013.82510 11.80796 48.17156 529.49163 -3.30106 6.61590 4.90098 -1.48811 3.01984 -4.09455 7 3 4 2.38 -2013-Sep-20 09:11:16 4171691.23714 872116.64891 4730014.88922 11.80796 48.17156 531.08239 -3.32939 6.43413 6.49173 -1.51643 2.83807 -2.50380 7 3 4 2.38 -2013-Sep-20 09:11:16 4171693.21171 872117.89698 4730015.57287 11.80797 48.17154 533.05111 -2.51180 5.25955 8.46046 -0.69884 1.66349 -0.53507 7 3 4 2.38 -2013-Sep-20 09:11:16 4171690.94846 872116.12466 4730012.76005 11.80795 48.17155 529.23586 -3.78347 5.30468 4.64520 -1.97051 1.70861 -4.35033 7 3 4 2.38 -2013-Sep-20 09:11:16 4171691.01303 872116.67548 4730012.29188 11.80796 48.17154 529.00432 -3.25752 4.86136 4.41366 -1.44456 1.26530 -4.58187 7 3 4 2.38 -2013-Sep-20 09:11:17 4171686.92529 872115.59058 4730009.79479 11.80796 48.17155 524.32713 -3.48298 6.34298 -0.26352 -1.67003 2.74693 -9.25905 7 3 4 2.38 -2013-Sep-20 09:11:17 4171689.09965 872117.40230 4730013.21592 11.80798 48.17156 528.54302 -2.15454 6.76235 3.95236 -0.34158 3.16630 -5.04317 7 3 4 2.38 -2013-Sep-20 09:11:17 4171693.82864 872118.34509 4730017.17592 11.80798 48.17155 534.70949 -2.19941 5.81033 10.11883 -0.38645 2.21427 1.12330 7 3 4 2.38 -2013-Sep-20 09:11:17 4171691.85980 872118.16204 4730017.17833 11.80798 48.17156 533.40107 -1.97569 7.27587 8.81041 -0.16274 3.67981 -0.18512 7 3 4 2.38 -2013-Sep-20 09:11:17 4171691.77791 872117.74707 4730016.15426 11.80797 48.17156 532.52790 -2.36513 6.71592 7.93724 -0.55217 3.11986 -1.05829 7 3 4 2.38 -2013-Sep-20 09:11:17 4171690.71021 872117.27718 4730014.77869 11.80797 48.17156 530.74179 -2.60659 6.64895 6.15114 -0.79363 3.05288 -2.84440 7 3 4 2.38 -2013-Sep-20 09:11:17 4171689.81704 872118.53772 4730015.06359 11.80799 48.17156 530.54306 -1.18995 7.29820 5.95240 0.62301 3.70214 -3.04313 7 3 4 2.38 -2013-Sep-20 09:11:17 4171691.55376 872116.79531 4730016.19778 11.80796 48.17156 532.28412 -3.25088 7.05356 7.69347 -1.43793 3.45749 -1.30207 7 3 4 2.38 -2013-Sep-20 09:11:17 4171693.82776 872118.45535 4730018.91249 11.80798 48.17156 536.01796 -2.09131 6.95229 11.42730 -0.27835 3.35622 2.43177 7 3 4 2.38 -2013-Sep-20 09:11:17 4171694.19655 872118.91481 4730019.87640 11.80798 48.17156 537.03965 -1.71703 7.25607 12.44900 0.09593 3.66001 3.45347 7 3 4 2.38 -2013-Sep-20 09:11:17 4171691.86539 872117.99083 4730016.02995 11.80798 48.17156 532.52565 -2.14443 6.53204 7.93499 -0.33147 2.93598 -1.06054 7 3 4 2.38 -2013-Sep-20 09:11:17 4171693.15533 872117.98759 4730017.59780 11.80797 48.17156 534.53554 -2.41156 6.63729 9.94488 -0.59860 3.04122 0.94935 7 3 4 2.38 -2013-Sep-20 09:11:17 4171692.18121 872115.90348 4730016.83466 11.80795 48.17156 533.04657 -4.25223 7.15664 8.45591 -2.43927 3.56057 -0.53962 7 3 4 2.38 -2013-Sep-20 09:11:17 4171688.42657 872114.52355 4730012.03638 11.80794 48.17156 526.83185 -4.83464 6.90560 2.24119 -3.02169 3.30954 -6.75434 7 3 4 2.38 -2013-Sep-20 09:11:17 4171686.83368 872114.31800 4730010.30785 11.80794 48.17156 524.47597 -4.70988 6.94600 -0.11468 -2.89693 3.34994 -9.11022 7 3 4 2.38 -2013-Sep-20 09:11:17 4171689.01630 872114.65818 4730011.81674 11.80794 48.17155 527.07153 -4.82353 6.30846 2.48087 -3.01057 2.71240 -6.51466 7 3 4 2.38 -2013-Sep-20 09:11:17 4171689.59940 872113.40135 4730012.50944 11.80792 48.17156 527.79681 -6.17309 6.53677 3.20615 -4.36014 2.94071 -5.78938 7 3 4 2.38 -2013-Sep-20 09:11:17 4171691.49667 872115.40807 4730015.71094 11.80794 48.17156 531.69477 -4.59708 6.98205 7.10411 -2.78412 3.38598 -1.89142 7 3 4 2.38 -2013-Sep-20 09:11:17 4171690.13679 872116.03487 4730014.42512 11.80796 48.17156 529.93447 -3.70527 7.02083 5.34381 -1.89231 3.42477 -3.65172 7 3 4 2.38 -2013-Sep-20 09:11:17 4171688.48177 872115.80343 4730011.69753 11.80796 48.17156 526.79005 -3.59313 6.44420 2.19940 -1.78018 2.84814 -6.79613 7 3 4 2.38 -2013-Sep-20 09:11:17 4171691.34954 872115.59222 4730014.29031 11.80795 48.17155 530.56528 -4.38672 6.11386 5.97463 -2.57377 2.51780 -3.02091 7 3 4 2.38 -2013-Sep-20 09:11:17 4171692.31645 872117.07132 4730015.85773 11.80796 48.17155 532.56628 -3.13678 6.22840 7.97562 -1.32382 2.63234 -1.01991 7 3 4 2.38 -2013-Sep-20 09:11:17 4171693.22291 872119.00896 4730017.72048 11.80799 48.17156 534.81045 -1.42563 6.51407 10.21980 0.38733 2.91801 1.22427 7 3 4 2.38 -2013-Sep-20 09:11:17 4171692.72321 872118.13057 4730016.70730 11.80798 48.17155 533.60942 -2.18318 6.33679 9.01876 -0.37022 2.74073 0.02323 7 3 4 2.38 -2013-Sep-20 09:11:17 4171693.24503 872117.69714 4730017.55960 11.80797 48.17156 534.52598 -2.71422 6.59068 9.93533 -0.90126 2.99461 0.93980 7 3 4 2.38 -2013-Sep-20 09:11:18 4171691.08816 872116.06995 4730015.06700 11.80795 48.17156 531.03859 -3.86561 6.74964 6.44794 -2.05265 3.15358 -2.54760 7 3 4 2.38 -2013-Sep-20 09:11:18 4171690.44418 872115.43965 4730013.68149 11.80795 48.17156 529.49979 -4.35079 6.39145 4.90913 -2.53783 2.79539 -4.08640 7 3 4 2.38 -2013-Sep-20 09:11:18 4171698.43425 872119.48630 4730014.15842 11.80798 48.17150 535.62326 -2.02481 0.26471 11.03261 -0.21185 -3.33135 2.03707 7 3 4 2.38 -2013-Sep-20 09:11:18 4171699.68595 872120.78596 4730016.26269 11.80799 48.17150 538.18571 -1.00878 0.55692 13.59506 0.80418 -3.03914 4.59952 7 3 4 2.38 -2013-Sep-20 09:11:18 4171697.25383 872120.30384 4730014.30052 11.80799 48.17151 535.07014 -0.98301 1.09579 10.47949 0.82995 -2.50027 1.48396 7 3 4 2.38 -2013-Sep-20 09:11:18 4171693.89224 872119.29061 4730011.05323 11.80799 48.17151 530.31775 -1.28691 1.53652 5.72710 0.52605 -2.05954 -3.26844 7 3 4 2.38 -2013-Sep-20 09:11:18 4171693.99654 872119.23313 4730012.34424 11.80799 48.17152 531.33999 -1.36451 2.33020 6.74933 0.44845 -1.26586 -2.24620 7 3 4 2.38 -2013-Sep-20 09:11:18 4171695.13076 872120.86904 4730013.19185 11.80801 48.17151 532.93524 0.00468 1.81875 8.34458 1.81764 -1.77731 -0.65095 7 3 4 2.38 -2013-Sep-20 09:11:18 4171694.40997 872119.59890 4730012.76392 11.80799 48.17152 531.97250 -1.09109 2.25276 7.38185 0.72187 -1.34330 -1.61369 7 3 4 2.38 -2013-Sep-20 09:11:18 4171691.49595 872119.36997 4730010.96923 11.80800 48.17153 528.70172 -0.71887 3.21620 4.11107 1.09409 -0.37986 -4.88447 7 3 4 2.38 -2013-Sep-20 09:11:18 4171694.91929 872120.89919 4730015.36048 11.80801 48.17153 534.41725 0.07747 3.41466 9.82660 1.89042 -0.18140 0.83106 7 3 4 2.38 -2013-Sep-20 09:11:18 4171696.49958 872120.85127 4730016.56994 11.80800 48.17153 536.34353 -0.29282 3.07593 11.75288 1.52014 -0.52013 2.75734 7 3 4 2.38 -2013-Sep-20 09:11:18 4171696.90910 872121.40991 4730017.29374 11.80801 48.17153 537.22644 0.17019 3.17476 12.63578 1.98315 -0.42131 3.64025 7 3 4 2.38 -2013-Sep-20 09:11:18 4171697.26759 872120.99996 4730017.00067 11.80800 48.17152 537.18613 -0.30445 2.78034 12.59547 1.50851 -0.81572 3.59994 7 3 4 2.38 -2013-Sep-20 09:11:18 4171698.17413 872122.27525 4730017.12289 11.80802 48.17152 538.04303 0.75835 2.00619 13.45237 2.57131 -1.58987 4.45684 7 3 4 2.38 -2013-Sep-20 09:11:18 4171696.15179 872121.89065 4730015.37314 11.80802 48.17152 535.36656 0.79573 2.37297 10.77590 2.60869 -1.22309 1.78037 7 3 4 2.38 -2013-Sep-20 09:11:18 4171695.18910 872122.07684 4730014.71611 11.80802 48.17152 534.27394 1.17498 2.60857 9.68329 2.98794 -0.98750 0.68775 7 3 4 2.38 -2013-Sep-20 09:11:18 4171696.78909 872120.50855 4730013.65031 11.80800 48.17151 534.31021 -0.68753 0.96992 9.71955 1.12543 -2.62614 0.72402 7 3 4 2.38 -2013-Sep-20 09:11:18 4171696.91691 872120.01392 4730013.44362 11.80799 48.17151 534.17213 -1.19785 0.81427 9.58148 0.61511 -2.78179 0.58594 7 3 4 2.38 -2013-Sep-20 09:11:18 4171696.73519 872120.20544 4730013.29070 11.80799 48.17151 533.96569 -0.97320 0.81562 9.37504 0.83976 -2.78044 0.37950 7 3 4 2.38 -2013-Sep-20 09:11:18 4171695.42505 872121.01961 4730012.32164 11.80801 48.17151 532.49947 0.09184 1.00080 7.90881 1.90480 -2.59526 -1.08672 7 3 4 2.38 -2013-Sep-20 09:11:18 4171695.87389 872120.48848 4730014.33209 11.80800 48.17152 534.21805 -0.51990 2.09519 9.62740 1.29306 -1.50088 0.63186 7 3 4 2.38 -2013-Sep-20 09:11:18 4171695.90048 872119.75316 4730013.94614 11.80799 48.17152 533.84748 -1.24511 1.93053 9.25682 0.56785 -1.66553 0.26129 7 3 4 2.38 -2013-Sep-20 09:11:18 4171696.74939 872120.68241 4730014.13398 11.80800 48.17151 534.66842 -0.50923 1.29492 10.07776 1.30373 -2.30114 1.08223 7 3 4 2.38 -2013-Sep-20 09:11:18 4171690.28984 872120.16318 4730010.86429 11.80801 48.17153 527.94444 0.30436 3.90497 3.35378 2.11732 0.30891 -5.64175 7 3 4 2.38 -2013-Sep-20 09:11:19 4171689.17640 872120.49096 4730009.94144 11.80802 48.17153 526.57467 0.85305 4.05166 1.98401 2.66601 0.45560 -7.01152 7 3 4 2.38 -2013-Sep-20 09:11:19 4171695.08288 872120.24787 4730014.08012 11.80800 48.17152 533.48111 -0.59355 2.54078 8.89045 1.21941 -1.05528 -0.10508 7 3 4 2.38 -2013-Sep-20 09:11:19 4171697.78397 872121.75338 4730016.49995 11.80801 48.17152 537.25293 0.32736 1.95490 12.66228 2.14032 -1.64116 3.66674 7 3 4 2.38 -2013-Sep-20 09:11:19 4171696.86836 872122.35693 4730016.35705 11.80802 48.17152 536.63112 1.10551 2.43539 12.04046 2.91847 -1.16067 3.04493 7 3 4 2.38 -2013-Sep-20 09:11:19 4171697.83682 872122.88929 4730018.34490 11.80802 48.17152 538.81720 1.42842 2.97356 14.22655 3.24138 -0.62251 5.23101 7 3 4 2.38 -2013-Sep-20 09:11:19 4171694.71701 872121.43601 4730015.63471 11.80801 48.17153 534.56280 0.64432 3.66323 9.97215 2.45728 0.06717 0.97662 7 3 4 2.38 -2013-Sep-20 09:11:19 4171691.80256 872117.66279 4730011.39013 11.80797 48.17153 528.98252 -2.45267 3.53357 4.39187 -0.63971 -0.06249 -4.60366 7 3 4 2.38 -2013-Sep-20 09:11:19 4171690.41152 872117.25164 4730010.27956 11.80797 48.17153 527.19082 -2.57046 3.87022 2.60016 -0.75750 0.27416 -6.39537 7 3 4 2.38 -2013-Sep-20 09:11:19 4171692.07568 872117.33262 4730011.41932 11.80797 48.17153 529.13751 -2.83174 3.40418 4.54685 -1.01878 -0.19188 -4.44868 7 3 4 2.38 -2013-Sep-20 09:11:19 4171691.61815 872117.65543 4730010.80166 11.80797 48.17153 528.42265 -2.42214 3.27675 3.83199 -0.60918 -0.31931 -5.16354 7 3 4 2.38 -2013-Sep-20 09:11:19 4171695.46147 872118.75829 4730013.87402 11.80798 48.17152 533.37139 -2.12908 2.35433 8.78073 -0.31612 -1.24173 -0.21480 7 3 4 2.38 -2013-Sep-20 09:11:19 4171696.08218 872120.66208 4730014.38537 11.80800 48.17152 534.41743 -0.39260 1.95233 9.82677 1.42036 -1.64374 0.83124 7 3 4 2.38 -2013-Sep-20 09:11:19 4171691.21510 872119.56773 4730011.98245 11.80800 48.17153 529.30036 -0.46783 4.06661 4.70971 1.34513 0.47055 -4.28582 7 3 4 2.38 -2013-Sep-20 09:11:19 4171693.34029 872120.71321 4730015.51992 11.80801 48.17154 533.47992 0.21853 4.70103 8.88926 2.03149 1.10497 -0.10627 7 3 4 2.38 -2013-Sep-20 09:11:19 4171695.08296 872120.74421 4730017.59124 11.80800 48.17154 536.16518 -0.10773 4.80661 11.57453 1.70523 1.21055 2.57900 7 3 4 2.38 -2013-Sep-20 09:11:19 4171696.95736 872120.77579 4730018.50428 11.80800 48.17153 538.07343 -0.46038 4.04356 13.48277 1.35258 0.44750 4.48724 7 3 4 2.38 -2013-Sep-20 09:11:19 4171696.21489 872120.63733 4730016.75060 11.80800 48.17153 536.26311 -0.44398 3.43668 11.67245 1.36898 -0.15938 2.67692 7 3 4 2.38 -2013-Sep-20 09:11:19 4171696.08334 872121.02813 4730015.74784 11.80801 48.17152 535.48337 -0.03454 2.80430 10.89271 1.77843 -0.79177 1.89718 7 3 4 2.38 -2013-Sep-20 09:11:19 4171699.46538 872122.79974 4730018.14445 11.80802 48.17151 539.71873 1.00751 1.66569 15.12807 2.82047 -1.93037 6.13254 7 3 4 2.38 -2013-Sep-20 09:11:19 4171697.17088 872121.27785 4730016.31399 11.80801 48.17152 536.64924 -0.01264 2.35056 12.05859 1.80032 -1.24550 3.06306 7 3 4 2.38 -2013-Sep-20 09:11:19 4171695.44672 872120.32287 4730016.13813 11.80800 48.17153 535.26237 -0.59460 3.63646 10.67171 1.21836 0.04040 1.67618 7 3 4 2.38 -2013-Sep-20 09:11:19 4171693.00983 872119.13721 4730014.84526 11.80799 48.17154 532.54640 -1.25649 4.73244 7.95575 0.55647 1.13638 -1.03979 7 3 4 2.38 -2013-Sep-20 09:11:19 4171692.70593 872118.50845 4730013.09221 11.80798 48.17153 530.95594 -1.80977 3.88085 6.36528 0.00319 0.28479 -2.63025 7 3 4 2.38 -2013-Sep-20 09:11:19 4171695.84252 872119.33060 4730015.73359 11.80798 48.17153 535.08389 -1.64686 3.22929 10.49323 0.16610 -0.36678 1.49770 7 3 4 2.38 -2013-Sep-20 09:11:19 4171696.51959 872119.93155 4730015.12635 11.80799 48.17152 535.15540 -1.19717 2.23884 10.56474 0.61579 -1.35723 1.56921 7 3 4 2.38 -2013-Sep-20 09:11:20 4171692.85378 872119.16464 4730012.29481 11.80799 48.17153 530.54783 -1.19771 3.14118 5.95717 0.61525 -0.45488 -3.03836 7 3 4 2.38 -2013-Sep-20 09:11:20 4171690.07850 872117.72466 4730010.22010 11.80798 48.17153 526.99367 -2.03931 4.00134 2.40302 -0.22635 0.40528 -6.59252 7 3 4 2.38 -2013-Sep-20 09:11:20 4171692.98867 872118.92389 4730013.65917 11.80799 48.17153 531.61967 -1.46097 3.98939 7.02901 0.35199 0.39333 -1.96652 7 3 4 2.38 -2013-Sep-20 09:11:20 4171694.02280 872118.47920 4730015.30830 11.80798 48.17154 533.46290 -2.10787 4.40274 8.87224 -0.29491 0.80667 -0.12329 7 3 4 2.38 -2013-Sep-20 09:11:20 4171694.02652 872119.35278 4730016.01707 11.80799 48.17154 534.11268 -1.25353 4.73951 9.52202 0.55943 1.14345 0.52649 7 3 4 2.38 -2013-Sep-20 09:11:20 4171693.98481 872119.32145 4730016.08920 11.80799 48.17154 534.13492 -1.27567 4.82281 9.54427 0.53729 1.22674 0.54873 7 3 4 2.38 -2013-Sep-20 09:11:20 4171694.41452 872119.07699 4730014.83638 11.80798 48.17153 533.44854 -1.60288 3.71115 8.85788 0.21008 0.11509 -0.13765 7 3 4 2.38 -2013-Sep-20 09:11:20 4171695.54442 872118.07932 4730016.21266 11.80797 48.17153 535.07550 -2.81066 3.95700 10.48485 -0.99770 0.36093 1.48931 7 3 4 2.38 -2013-Sep-20 09:11:20 4171692.77379 872115.55724 4730014.29761 11.80794 48.17154 531.49568 -4.71240 5.08525 6.90502 -2.89945 1.48919 -2.09051 7 3 4 2.38 -2013-Sep-20 09:11:20 4171691.63001 872116.29920 4730015.24560 11.80796 48.17156 531.55668 -3.75209 6.43858 6.96602 -1.93914 2.84252 -2.02951 7 3 4 2.38 -2013-Sep-20 09:11:20 4171692.43177 872117.84749 4730015.60467 11.80797 48.17155 532.55892 -2.40063 5.85717 7.96826 -0.58767 2.26111 -1.02727 7 3 4 2.38 -2013-Sep-20 09:11:20 4171690.93293 872117.88614 4730015.00514 11.80798 48.17156 531.13903 -2.05609 6.54467 6.54837 -0.24314 2.94861 -2.44716 7 3 4 2.38 -2013-Sep-20 09:11:20 4171690.12255 872117.31940 4730013.31246 11.80797 48.17155 529.27138 -2.44500 6.09331 4.68072 -0.63204 2.49725 -4.31481 7 3 4 2.38 -2013-Sep-20 09:11:20 4171690.57084 872117.32037 4730013.29541 11.80797 48.17155 529.55145 -2.53579 5.75482 4.96079 -0.72283 2.15876 -4.03474 7 3 4 2.38 -2013-Sep-20 09:11:20 4171690.32708 872117.65406 4730012.80684 11.80798 48.17155 529.07380 -2.15928 5.55590 4.48315 -0.34632 1.95984 -4.51239 7 3 4 2.38 -2013-Sep-20 09:11:20 4171690.74432 872118.59802 4730013.31712 11.80799 48.17155 529.85524 -1.32068 5.44794 5.26458 0.49228 1.85188 -3.73095 7 3 4 2.38 -2013-Sep-20 09:11:20 4171695.46123 872119.99967 4730019.08700 11.80799 48.17155 537.42506 -0.91393 5.64177 12.83440 0.89903 2.04570 3.83887 7 3 4 2.38 -2013-Sep-20 09:11:20 4171697.78958 872121.40278 4730020.58578 11.80801 48.17154 540.25328 -0.01696 4.72912 15.66262 1.79600 1.13305 6.66709 7 3 4 2.38 -2013-Sep-20 09:11:20 4171697.65886 872120.73541 4730021.23065 11.80800 48.17155 540.55739 -0.64346 5.35629 15.96673 1.16950 1.76022 6.97120 7 3 4 2.38 -2013-Sep-20 09:11:20 4171694.20680 872119.75356 4730016.29950 11.80799 48.17154 534.49551 -0.89813 4.73525 9.90485 0.91483 1.13919 0.90932 7 3 4 2.38 -2013-Sep-20 09:11:20 4171693.00595 872120.15279 4730016.85468 11.80800 48.17155 534.17978 -0.26161 5.92050 9.58912 1.55135 2.32444 0.59359 7 3 4 2.38 -2013-Sep-20 09:11:20 4171695.73142 872121.45594 4730019.20489 11.80801 48.17155 537.88803 0.45624 5.30127 13.29737 2.26920 1.70521 4.30184 7 3 4 2.38 -2013-Sep-20 09:11:20 4171693.12915 872119.60495 4730015.58147 11.80799 48.17154 533.23671 -0.82307 5.06507 8.64605 0.98989 1.46901 -0.34948 7 3 4 2.38 -2013-Sep-20 09:11:20 4171688.46031 872118.71115 4730011.75505 11.80800 48.17155 527.21572 -0.74256 6.05485 2.62506 1.07040 2.45879 -6.37047 7 3 4 2.38 -2013-Sep-20 09:11:20 4171691.32987 872118.55563 4730014.88759 11.80799 48.17155 531.40192 -1.48199 6.07467 6.81126 0.33097 2.47861 -2.18427 7 3 4 2.38 -2013-Sep-20 09:11:21 4171689.56331 872118.20704 4730013.19481 11.80799 48.17155 528.93978 -1.46171 6.28739 4.34912 0.35125 2.69133 -4.64641 7 3 4 2.38 -2013-Sep-20 09:11:21 4171685.92672 872117.71725 4730010.60163 11.80799 48.17156 524.56671 -1.19697 7.28512 -0.02395 0.61598 3.68906 -9.01948 7 3 4 2.38 -2013-Sep-20 09:11:21 4171689.55584 872117.74212 4730015.45929 11.80798 48.17157 530.55883 -1.91527 7.87392 5.96817 -0.10231 4.27786 -3.02736 7 3 4 2.38 -2013-Sep-20 09:11:21 4171691.81410 872118.12623 4730017.71418 11.80798 48.17157 533.76564 -2.00139 7.67202 9.17498 -0.18843 4.07596 0.17945 7 3 4 2.38 -2013-Sep-20 09:11:21 4171689.64397 872116.59344 4730014.84388 11.80796 48.17157 530.00103 -3.05767 7.57438 5.41037 -1.24471 3.97832 -3.58516 7 3 4 2.38 -2013-Sep-20 09:11:21 4171691.95807 872115.89947 4730014.75436 11.80795 48.17155 531.35024 -4.21050 5.93264 6.75958 -2.39754 2.33658 -2.23595 7 3 4 2.38 -2013-Sep-20 09:11:21 4171694.41446 872116.84871 4730015.87431 11.80795 48.17154 533.91781 -3.78400 4.74316 9.32715 -1.97104 1.14710 0.33162 7 3 4 2.38 -2013-Sep-20 09:11:21 4171692.43479 872115.10007 4730014.47253 11.80794 48.17155 531.34234 -5.09053 5.51887 6.75168 -3.27757 1.92281 -2.24385 7 3 4 2.38 -2013-Sep-20 09:11:21 4171689.58404 872113.24592 4730011.76733 11.80792 48.17155 527.21260 -6.32209 6.07676 2.62194 -4.50913 2.48070 -6.37360 7 3 4 2.38 -2013-Sep-20 09:11:21 4171687.85016 872113.63447 4730009.92018 11.80793 48.17155 524.75737 -5.58695 6.05030 0.16671 -3.77399 2.45424 -8.82882 7 3 4 2.38 -2013-Sep-20 09:11:21 4171691.22319 872115.50950 4730013.20333 11.80795 48.17155 529.66156 -4.44183 5.49372 5.07090 -2.62888 1.89766 -3.92463 7 3 4 2.38 -2013-Sep-20 09:11:21 4171693.69204 872115.61457 4730015.27022 11.80794 48.17154 532.82767 -4.84420 5.05539 8.23701 -3.03124 1.45933 -0.75852 7 3 4 2.38 -2013-Sep-20 09:11:21 4171693.07652 872115.21531 4730014.89055 11.80794 48.17155 532.08847 -5.10905 5.31202 7.49781 -3.29610 1.71595 -1.49772 7 3 4 2.38 -2013-Sep-20 09:11:21 4171695.51663 872117.05085 4730017.93873 11.80795 48.17155 536.20318 -3.81168 5.28522 11.61252 -1.99872 1.68915 2.61699 7 3 4 2.38 -2013-Sep-20 09:11:21 4171696.10233 872118.79374 4730020.28856 11.80798 48.17155 538.57433 -2.22552 6.15937 13.98367 -0.41256 2.56330 4.98814 7 3 4 2.38 -2013-Sep-20 09:11:21 4171693.70936 872116.51201 4730016.36786 11.80795 48.17155 533.77935 -3.96929 5.63794 9.18869 -2.15633 2.04187 0.19316 7 3 4 2.38 -2013-Sep-20 09:11:21 4171695.52706 872116.89264 4730019.52815 11.80795 48.17155 537.37275 -3.96867 6.36172 12.78209 -2.15571 2.76566 3.78656 7 3 4 2.38 -2013-Sep-20 09:11:21 4171694.44896 872118.09480 4730017.13388 11.80797 48.17155 535.04895 -2.57134 5.36801 10.45830 -0.75838 1.77195 1.46276 7 3 4 2.38 -2013-Sep-20 09:11:21 4171691.96117 872116.26242 4730014.94807 11.80795 48.17155 531.54614 -3.85586 6.00422 6.95548 -2.04291 2.40816 -2.04005 7 3 4 2.38 -2013-Sep-20 09:11:21 4171692.04492 872115.02243 4730015.45873 11.80794 48.17156 531.81210 -5.08675 6.47277 7.22144 -3.27379 2.87671 -1.77409 7 3 4 2.38 -2013-Sep-20 09:11:21 4171690.01681 872114.32817 4730014.17249 11.80793 48.17156 529.43499 -5.35130 7.20009 4.84433 -3.53835 3.60403 -4.15120 7 3 4 2.38 -2013-Sep-20 09:11:21 4171690.92253 872114.53345 4730015.36082 11.80793 48.17156 530.93973 -5.33570 7.30068 6.34907 -3.52275 3.70462 -2.64646 7 3 4 2.38 -2013-Sep-20 09:11:21 4171688.97339 872114.44988 4730013.49620 11.80794 48.17157 528.26653 -5.01865 7.49156 3.67587 -3.20569 3.89550 -5.31966 7 3 4 2.38 -2013-Sep-20 09:11:21 4171690.74024 872115.51489 4730015.40365 11.80795 48.17156 530.98658 -4.33773 7.31256 6.39592 -2.52477 3.71649 -2.59961 7 3 4 2.38 -2013-Sep-20 09:11:21 4171688.97210 872115.14013 4730013.87611 11.80795 48.17157 528.64297 -4.34274 7.64062 4.05231 -2.52978 4.04456 -4.94322 7 3 4 2.38 -2013-Sep-20 09:11:22 4171688.32594 872114.70694 4730017.04771 11.80794 48.17159 530.52536 -4.63454 10.29311 5.93469 -2.82158 6.69705 -3.06084 7 3 4 2.38 -2013-Sep-20 09:11:22 4171686.97520 872114.42977 4730012.67178 11.80794 48.17157 526.34508 -4.62944 8.40225 1.75442 -2.81648 4.80619 -7.24111 7 3 4 2.38 -2013-Sep-20 09:11:22 4171693.30293 872116.44529 4730018.38098 11.80795 48.17156 535.00500 -3.95143 7.28711 10.41434 -2.13847 3.69105 1.41881 7 3 4 2.38 -2013-Sep-20 09:11:22 4171692.15763 872116.48477 4730017.47188 11.80796 48.17157 533.58533 -3.67842 7.51016 8.99467 -1.86546 3.91410 -0.00086 7 3 4 2.38 -2013-Sep-20 09:11:22 4171689.71754 872114.78005 4730014.66291 11.80794 48.17157 529.66673 -4.84774 7.67653 5.07607 -3.03478 4.08047 -3.91946 7 3 4 2.38 -2013-Sep-20 09:11:22 4171688.12062 872115.53051 4730014.92965 11.80795 48.17158 528.92545 -3.78638 8.90475 4.33479 -1.97343 5.30869 -4.66074 7 3 4 2.38 -2013-Sep-20 09:11:22 4171692.01243 872116.52714 4730016.72361 11.80796 48.17156 532.93876 -3.60724 7.11059 8.34810 -1.79428 3.51452 -0.64743 7 3 4 2.38 -2013-Sep-20 09:11:22 4171688.32605 872114.48080 4730011.21123 11.80794 48.17156 526.14554 -4.85592 6.43514 1.55488 -3.04296 2.83908 -7.44065 7 3 4 2.38 -2013-Sep-20 09:11:22 4171693.82006 872115.87957 4730015.88761 11.80794 48.17155 533.40745 -4.61100 5.33335 8.81679 -2.79804 1.73729 -0.17874 7 3 4 2.38 -2013-Sep-20 09:11:22 4171693.99055 872115.07751 4730018.31302 11.80793 48.17156 535.21657 -5.43097 6.94882 10.62591 -3.61801 3.35275 1.63038 7 3 4 2.38 -2013-Sep-20 09:11:22 4171690.26858 872114.65413 4730016.10207 11.80794 48.17157 531.08165 -5.08376 8.25360 6.49099 -3.27080 4.65754 -2.50454 7 3 4 2.38 -2013-Sep-20 09:11:22 4171692.16940 872116.63112 4730016.93195 11.80796 48.17156 533.21066 -3.53757 7.11918 8.62000 -1.72461 3.52312 -0.37553 7 3 4 2.38 -2013-Sep-20 09:11:22 4171691.79160 872116.37251 4730016.01418 11.80796 48.17156 532.24487 -3.71340 6.82211 7.65421 -1.90044 3.22605 -1.34132 7 3 4 2.38 -2013-Sep-20 09:11:22 4171689.71748 872115.07017 4730014.27800 11.80794 48.17156 529.41947 -4.56375 7.37564 4.82881 -2.75079 3.77958 -4.16672 7 3 4 2.38 -2013-Sep-20 09:11:22 4171691.78194 872116.39084 4730017.56959 11.80796 48.17157 533.40007 -3.69348 7.86367 8.80941 -1.88053 4.26761 -0.18612 7 3 4 2.38 -2013-Sep-20 09:11:22 4171691.89938 872114.84708 4730015.13309 11.80794 48.17156 531.45052 -5.22861 6.38850 6.85986 -3.41565 2.79244 -2.13567 7 3 4 2.38 -2013-Sep-20 09:11:22 4171689.87221 872113.72188 4730013.12886 11.80793 48.17156 528.48020 -5.91517 6.70201 3.88954 -4.10221 3.10595 -5.10599 7 3 4 2.38 -2013-Sep-20 09:11:22 4171689.10012 872113.31458 4730014.50949 11.80792 48.17157 528.94937 -6.15586 8.24800 4.35871 -4.34290 4.65194 -4.63682 7 3 4 2.38 -2013-Sep-20 09:11:22 4171687.89357 872112.65870 4730013.17745 11.80792 48.17157 527.07968 -6.55096 8.33970 2.48902 -4.73800 4.74364 -6.50651 7 3 4 2.38 -2013-Sep-20 09:11:22 4171690.62468 872115.64810 4730016.32879 11.80795 48.17157 531.61869 -4.18369 7.99351 7.02803 -2.37073 4.39745 -1.96750 7 3 4 2.38 -2013-Sep-20 09:11:22 4171689.75297 872115.64942 4730014.07272 11.80795 48.17156 529.36873 -4.00402 7.12453 4.77807 -2.19106 3.52847 -4.21746 7 3 4 2.38 -2013-Sep-20 09:11:22 4171693.28810 872116.93910 4730017.31292 11.80796 48.17156 534.26684 -3.46504 6.51033 9.67619 -1.65208 2.91427 0.68065 7 3 4 2.38 -2013-Sep-20 09:11:22 4171695.98563 872118.16653 4730021.78172 11.80797 48.17156 539.52518 -2.81558 7.33592 14.93452 -1.00262 3.73985 5.93899 7 3 4 2.38 -2013-Sep-20 09:11:22 4171697.11783 872120.37174 4730022.28911 11.80799 48.17156 540.94329 -0.88873 6.51224 16.35263 0.92423 2.91618 7.35710 7 3 4 2.38 -2013-Sep-20 09:11:22 4171695.48569 872119.38854 4730020.67335 11.80799 48.17156 538.53969 -1.51712 6.77505 13.94903 0.29584 3.17899 4.95350 7 3 4 2.38 -2013-Sep-20 09:11:23 4171695.47061 872118.34524 4730020.12538 11.80797 48.17156 537.97915 -2.53527 6.57970 13.38849 -0.72231 2.98364 4.39296 7 3 4 2.38 -2013-Sep-20 09:11:23 4171692.81562 872117.25637 4730018.29186 11.80796 48.17156 534.73117 -3.05779 7.45944 10.14051 -1.24483 3.86337 1.14498 7 3 4 2.38 -2013-Sep-20 09:11:23 4171692.16092 872114.76973 4730016.10991 11.80793 48.17156 532.33857 -5.35784 6.86097 7.74791 -3.54488 3.26491 -1.24762 7 3 4 2.38 -2013-Sep-20 09:11:23 4171692.87697 872114.47291 4730017.48267 11.80793 48.17156 533.78839 -5.79490 7.29946 9.19773 -3.98195 3.70340 0.20220 7 3 4 2.38 -2013-Sep-20 09:11:23 4171692.86069 872116.07764 4730017.23552 11.80795 48.17156 533.81260 -4.22081 6.90182 9.22194 -2.40785 3.30575 0.22641 7 3 4 2.38 -2013-Sep-20 09:11:23 4171693.87686 872118.40258 4730018.95306 11.80798 48.17156 536.07304 -2.15301 6.95157 11.48238 -0.34005 3.35551 2.48685 7 3 4 2.38 -2013-Sep-20 09:11:23 4171694.98367 872119.17613 4730019.43245 11.80798 48.17155 537.25834 -1.62231 6.34605 12.66768 0.19065 2.74998 3.67215 7 3 4 2.38 -2013-Sep-20 09:11:23 4171695.21549 872119.60786 4730019.65619 11.80799 48.17155 537.63531 -1.24716 6.26035 13.04465 0.56580 2.66428 4.04912 7 3 4 2.38 -2013-Sep-20 09:11:23 4171695.99088 872119.06174 4730019.64147 11.80798 48.17155 538.05598 -1.94039 5.76825 13.46532 -0.12743 2.17219 4.46979 7 3 4 2.38 -2013-Sep-20 09:11:23 4171692.45117 872118.44593 4730017.51592 11.80798 48.17156 534.07741 -1.81883 7.02639 9.48675 -0.00587 3.43033 0.49122 7 3 4 2.38 -2013-Sep-20 09:11:23 4171687.29885 872117.29525 4730012.83925 11.80798 48.17157 527.07219 -1.89082 7.84095 2.48153 -0.07787 4.24489 -6.51400 7 3 4 2.38 -2013-Sep-20 09:11:23 4171683.14258 872114.63254 4730008.28239 11.80796 48.17157 520.60012 -3.64668 8.23945 -3.99054 -1.83372 4.64339 -12.98607 7 3 4 2.38 -2013-Sep-20 09:11:23 4171686.28035 872115.76735 4730009.89013 11.80796 48.17156 524.00129 -3.17797 6.85001 -0.58937 -1.36501 3.25395 -9.58490 7 3 4 2.38 -2013-Sep-20 09:11:23 4171687.67267 872117.00778 4730014.37423 11.80798 48.17158 528.42077 -2.24871 8.63580 3.83011 -0.43575 5.03974 -5.16542 7 3 4 2.38 -2013-Sep-20 09:11:23 4171687.19397 872117.35970 4730014.17360 11.80798 48.17158 528.00680 -1.80628 8.79749 3.41614 0.00668 5.20143 -5.57939 7 3 4 2.38 -2013-Sep-20 09:11:23 4171688.80661 872116.60744 4730014.62659 11.80797 48.17157 529.29440 -2.87262 8.03808 4.70374 -1.05966 4.44202 -4.29179 7 3 4 2.38 -2013-Sep-20 09:11:23 4171688.60392 872118.37171 4730014.15304 11.80799 48.17157 529.04999 -1.10420 7.60108 4.45934 0.70876 4.00502 -4.53620 7 3 4 2.38 -2013-Sep-20 09:11:23 4171688.03548 872117.48240 4730014.82352 11.80798 48.17158 529.05717 -1.85837 8.59844 4.46651 -0.04542 5.00238 -4.52902 7 3 4 2.38 -2013-Sep-20 09:11:23 4171691.45022 872117.54123 4730019.00948 11.80797 48.17158 534.41345 -2.49956 8.89047 9.82279 -0.68660 5.29441 0.82726 7 3 4 2.38 -2013-Sep-20 09:11:23 4171688.58405 872116.29982 4730014.90400 11.80796 48.17157 529.31385 -3.12818 8.43232 4.72319 -1.31523 4.83626 -4.27234 7 3 4 2.38 -2013-Sep-20 09:11:23 4171692.02985 872117.87410 4730018.06185 11.80797 48.17157 534.13113 -2.29234 7.78497 9.54047 -0.47938 4.18890 0.54494 7 3 4 2.38 -2013-Sep-20 09:11:23 4171690.47194 872116.45149 4730016.02004 11.80796 48.17157 531.39856 -3.36604 7.77650 6.80790 -1.55309 4.18044 -2.18763 7 3 4 2.38 -2013-Sep-20 09:11:23 4171692.92686 872118.76633 4730018.34805 11.80798 48.17156 535.05172 -1.60255 7.18553 10.46106 0.21041 3.58947 1.46553 7 3 4 2.38 -2013-Sep-20 09:11:23 4171694.75491 872120.57368 4730019.23097 11.80800 48.17155 537.14960 -0.20752 6.16543 12.55894 1.60544 2.56937 3.56341 7 3 4 2.38 -2013-Sep-20 09:11:23 4171692.01646 872118.24976 4730016.57278 11.80798 48.17156 533.06409 -1.92189 6.74439 8.47343 -0.10893 3.14832 -0.52210 7 3 4 2.38 -2013-Sep-20 09:11:24 4171691.01468 872116.28329 4730014.34412 11.80796 48.17155 530.48109 -3.64175 6.28861 5.89043 -1.82879 2.69255 -3.10510 7 3 4 2.38 -2013-Sep-20 09:11:24 4171689.06716 872114.68632 4730012.29307 11.80794 48.17156 527.46351 -4.80640 6.58474 2.87285 -2.99344 2.98868 -6.12268 7 3 4 2.38 -2013-Sep-20 09:11:24 4171694.73608 872119.44056 4730010.88709 11.80799 48.17150 530.76527 -1.31281 0.78738 6.17462 0.50015 -2.80868 -2.82092 7 3 4 2.38 -2013-Sep-20 09:11:24 4171693.72087 872119.68492 4730011.32274 11.80799 48.17151 530.46052 -0.86588 1.78113 5.86987 0.94708 -1.81493 -3.12567 7 3 4 2.38 -2013-Sep-20 09:11:24 4171693.94370 872118.06655 4730011.54638 11.80797 48.17152 530.55176 -2.49560 2.01452 5.96111 -0.68264 -1.58154 -3.03442 7 3 4 2.38 -2013-Sep-20 09:11:24 4171692.12249 872117.40179 4730009.68968 11.80797 48.17152 527.88867 -2.77361 2.20599 3.29802 -0.96065 -1.39007 -5.69752 7 3 4 2.38 -2013-Sep-20 09:11:24 4171693.86774 872119.69170 4730012.79420 11.80799 48.17152 531.65378 -0.88929 2.65430 7.06312 0.92367 -0.94177 -1.93241 7 3 4 2.38 -2013-Sep-20 09:11:24 4171693.32531 872117.33516 4730012.51212 11.80796 48.17153 530.76789 -3.08496 3.22113 6.17724 -1.27201 -0.37493 -2.81830 7 3 4 2.38 -2013-Sep-20 09:11:24 4171692.47192 872117.94517 4730010.57339 11.80797 48.17152 528.84942 -2.31323 2.45762 4.25877 -0.50027 -1.13844 -4.73676 7 3 4 2.38 -2013-Sep-20 09:11:24 4171695.01986 872119.00377 4730014.00965 11.80798 48.17152 533.21767 -1.79843 2.72945 8.62701 0.01453 -0.86661 -0.36852 7 3 4 2.38 -2013-Sep-20 09:11:24 4171694.88813 872120.33154 4730015.53964 11.80800 48.17153 534.45295 -0.47180 3.64342 9.86229 1.34116 0.04736 0.86676 7 3 4 2.38 -2013-Sep-20 09:11:24 4171695.65854 872119.35883 4730015.62841 11.80798 48.17153 534.88926 -1.58158 3.28902 10.29861 0.23138 -0.30704 1.30307 7 3 4 2.38 -2013-Sep-20 09:11:24 4171692.29963 872117.57776 4730012.46967 11.80797 48.17153 530.09982 -2.63762 3.90394 5.50916 -0.82466 0.30788 -3.48637 7 3 4 2.38 -2013-Sep-20 09:11:24 4171692.03831 872116.55714 4730014.60814 11.80796 48.17155 531.38342 -3.58316 5.67631 6.79276 -1.77020 2.08025 -2.20277 7 3 4 2.38 -2013-Sep-20 09:11:24 4171692.67337 872117.02064 4730013.77478 11.80796 48.17154 531.24026 -3.25943 4.58668 6.64960 -1.44647 0.99062 -2.34593 7 3 4 2.38 -2013-Sep-20 09:11:24 4171695.89232 872118.66842 4730018.17083 11.80797 48.17154 536.84212 -2.30521 4.91933 12.25146 -0.49225 1.32327 3.25593 7 3 4 2.38 -2013-Sep-20 09:11:24 4171693.74490 872118.23743 4730015.79962 11.80797 48.17154 533.61459 -2.28765 4.96996 9.02394 -0.47470 1.37390 0.02841 7 3 4 2.38 -2013-Sep-20 09:11:24 4171694.70598 872117.25327 4730014.62039 11.80796 48.17153 533.22897 -3.44766 3.63261 8.63832 -1.63470 0.03655 -0.35722 7 3 4 2.38 -2013-Sep-20 09:11:24 4171692.92441 872118.47677 4730011.63261 11.80798 48.17152 530.00662 -1.88548 2.75292 5.41597 -0.07253 -0.84314 -3.57956 7 3 4 2.38 -2013-Sep-20 09:11:24 4171691.52667 872118.87196 4730011.44362 11.80799 48.17153 529.00730 -1.21263 3.58611 4.41665 0.60032 -0.00995 -4.57889 7 3 4 2.38 -2013-Sep-20 09:11:24 4171694.25462 872121.51872 4730015.11176 11.80802 48.17153 533.88257 0.81989 3.63911 9.29192 2.63285 0.04305 0.29638 7 3 4 2.38 -2013-Sep-20 09:11:24 4171696.05999 872118.78231 4730016.87878 11.80798 48.17153 536.00435 -2.22805 3.91800 11.41370 -0.41509 0.32194 2.41816 7 3 4 2.38 -2013-Sep-20 09:11:24 4171691.43406 872115.78258 4730012.57313 11.80795 48.17154 529.36688 -4.21768 4.87799 4.77623 -2.40472 1.28193 -4.21931 7 3 4 2.38 -2013-Sep-20 09:11:24 4171689.02374 872114.43196 4730010.05337 11.80794 48.17154 525.73154 -5.04649 5.16153 1.14088 -3.23353 1.56547 -7.85465 7 3 4 2.38 -2013-Sep-20 09:11:24 4171689.82579 872114.00495 4730009.74249 11.80793 48.17154 525.96520 -5.62860 4.43432 1.37454 -3.81564 0.83826 -7.62099 7 3 4 2.38 -2013-Sep-20 09:11:25 4171692.94276 872114.53020 4730013.00038 11.80793 48.17154 530.49920 -5.75229 4.25348 5.90855 -3.93933 0.65742 -3.08698 7 3 4 2.38 -2013-Sep-20 09:11:25 4171696.43597 872116.98179 4730015.20824 11.80795 48.17152 534.75928 -4.06741 2.80422 10.16862 -2.25445 -0.79184 1.17309 7 3 4 2.38 -2013-Sep-20 09:11:25 4171697.42899 872118.36885 4730017.32999 11.80797 48.17153 537.17781 -2.91290 3.28345 12.58716 -1.09994 -0.31262 3.59163 7 3 4 2.38 -2013-Sep-20 09:11:25 4171697.33026 872116.57227 4730016.99697 11.80794 48.17153 536.62004 -4.65126 3.40731 12.02938 -2.83830 -0.18876 3.03385 7 3 4 2.38 -2013-Sep-20 09:11:25 4171696.09689 872117.06043 4730016.70701 11.80795 48.17153 535.66546 -3.92104 4.03909 11.07481 -2.10808 0.44302 2.07928 7 3 4 2.38 -2013-Sep-20 09:11:25 4171696.46879 872118.51743 4730018.06942 11.80797 48.17154 537.12226 -2.57098 4.45426 12.53161 -0.75802 0.85820 3.53608 7 3 4 2.38 -2013-Sep-20 09:11:25 4171693.42590 872118.06426 4730015.15919 11.80797 48.17154 532.90551 -2.39188 4.80193 8.31486 -0.57892 1.20587 -0.68067 7 3 4 2.38 -2013-Sep-20 09:11:25 4171690.58025 872116.64729 4730012.69413 11.80796 48.17155 529.01769 -3.19656 5.44958 4.42704 -1.38360 1.85352 -4.56850 7 3 4 2.38 -2013-Sep-20 09:11:25 4171691.12781 872116.15449 4730011.72512 11.80795 48.17154 528.58583 -3.79098 4.47912 3.99518 -1.97802 0.88306 -5.00036 7 3 4 2.38 -2013-Sep-20 09:11:25 4171691.82827 872116.67823 4730011.86627 11.80796 48.17153 529.21974 -3.42165 3.98249 4.62908 -1.60869 0.38643 -4.36645 7 3 4 2.38 -2013-Sep-20 09:11:25 4171693.99266 872119.22471 4730014.41203 11.80799 48.17153 532.87711 -1.37197 3.71332 8.28645 0.44099 0.11726 -0.70908 7 3 4 2.38 -2013-Sep-20 09:11:25 4171692.83202 872118.52777 4730016.42282 11.80798 48.17155 533.52267 -1.81665 6.00714 8.93202 -0.00369 2.41108 -0.06352 7 3 4 2.38 -2013-Sep-20 09:11:25 4171698.55650 872121.22407 4730021.03271 11.80800 48.17154 541.06256 -0.34883 4.49505 16.47190 1.46413 0.89899 7.47637 7 3 4 2.38 -2013-Sep-20 09:11:25 4171695.04048 872119.56744 4730016.57388 11.80799 48.17154 535.21878 -1.25090 4.33855 10.62813 0.56206 0.74249 1.63259 7 3 4 2.38 -2013-Sep-20 09:11:25 4171695.90497 872120.45805 4730017.43063 11.80800 48.17153 536.54305 -0.55605 4.14358 11.95240 1.25691 0.54751 2.95686 7 3 4 2.38 -2013-Sep-20 09:11:25 4171696.09424 872119.26173 4730016.89450 11.80798 48.17153 536.10385 -1.76578 3.83040 11.51320 0.04718 0.23433 2.51766 7 3 4 2.38 -2013-Sep-20 09:11:25 4171692.61374 872118.10090 4730013.36178 11.80798 48.17154 531.04101 -2.18982 4.19002 6.45035 -0.37686 0.59396 -2.54518 7 3 4 2.38 -2013-Sep-20 09:11:25 4171694.36270 872118.03702 4730015.73834 11.80797 48.17154 533.94487 -2.61025 4.50905 9.35422 -0.79729 0.91298 0.35868 7 3 4 2.38 -2013-Sep-20 09:11:25 4171697.04059 872118.20076 4730017.98789 11.80797 48.17153 537.39156 -2.99795 4.03113 12.80091 -1.18499 0.43506 3.80537 7 3 4 2.38 -2013-Sep-20 09:11:25 4171696.55999 872119.84549 4730019.06078 11.80799 48.17154 538.10175 -1.28968 4.84638 13.51109 0.52328 1.25032 4.51556 7 3 4 2.38 -2013-Sep-20 09:11:25 4171695.29187 872119.57062 4730017.30793 11.80799 48.17154 535.93029 -1.29924 4.64425 11.33963 0.51372 1.04819 2.34410 7 3 4 2.38 -2013-Sep-20 09:11:25 4171693.87880 872117.74562 4730015.08127 11.80797 48.17154 533.09961 -2.79646 4.46822 8.50896 -0.98350 0.87216 -0.48657 7 3 4 2.38 -2013-Sep-20 09:11:25 4171695.65525 872119.19908 4730016.35068 11.80798 48.17153 535.40351 -1.73728 3.79747 10.81285 0.07568 0.20140 1.81732 7 3 4 2.38 -2013-Sep-20 09:11:25 4171699.08051 872120.38503 4730018.46706 11.80799 48.17152 539.37834 -1.27734 2.52976 14.78769 0.53562 -1.06631 5.79215 7 3 4 2.38 -2013-Sep-20 09:11:25 4171698.36821 872119.86609 4730016.97570 11.80798 48.17152 537.73126 -1.63954 2.13383 13.14061 0.17342 -1.46224 4.14507 7 3 4 2.38 -2013-Sep-20 09:11:26 4171695.45471 872119.69750 4730014.47563 11.80799 48.17152 533.94343 -1.20836 2.61727 9.35278 0.60460 -0.97879 0.35725 7 3 4 2.38 -2013-Sep-20 09:11:26 4171691.42837 872117.31443 4730011.78606 11.80797 48.17153 528.98574 -2.71708 4.12367 4.39509 -0.90412 0.52761 -4.60044 7 3 4 2.38 -2013-Sep-20 09:11:26 4171696.71907 872121.11664 4730009.75732 11.80800 48.17148 531.44664 -0.07799 -1.66798 6.85599 1.73497 -5.26404 -2.13955 7 3 4 2.38 -2013-Sep-20 09:11:26 4171696.53243 872121.77257 4730011.51404 11.80801 48.17149 532.72333 0.60225 -0.46030 8.13268 2.41521 -4.05636 -0.86286 7 3 4 2.38 -2013-Sep-20 09:11:26 4171697.99796 872122.74733 4730013.99782 11.80802 48.17150 535.66382 1.25649 -0.02142 11.07316 3.06945 -3.61748 2.07763 7 3 4 2.38 -2013-Sep-20 09:11:26 4171696.37638 872121.71039 4730011.34412 11.80801 48.17149 532.48636 0.57332 -0.45033 7.89571 2.38628 -4.04639 -1.09983 7 3 4 2.38 -2013-Sep-20 09:11:26 4171698.35090 872122.14956 4730013.71091 11.80801 48.17149 535.59885 0.59915 -0.37904 11.00820 2.41211 -3.97510 2.01266 7 3 4 2.38 -2013-Sep-20 09:11:26 4171703.46376 872123.87039 4730019.69749 11.80802 48.17149 543.63218 1.23731 -0.37817 19.04153 3.05027 -3.97423 10.04599 7 3 4 2.38 -2013-Sep-20 09:11:26 4171700.56430 872122.35069 4730016.45134 11.80801 48.17150 539.11320 0.34309 -0.19650 14.52254 2.15606 -3.79257 5.52701 7 3 4 2.38 -2013-Sep-20 09:11:26 4171698.23291 872121.53889 4730013.56136 11.80801 48.17149 535.32705 0.02555 -0.29960 10.73639 1.83851 -3.89566 1.74086 7 3 4 2.38 -2013-Sep-20 09:11:26 4171697.16465 872121.43782 4730013.15708 11.80801 48.17150 534.31466 0.14522 0.22536 9.72400 1.95818 -3.37070 0.72847 7 3 4 2.38 -2013-Sep-20 09:11:26 4171698.34796 872120.87849 4730014.23452 11.80800 48.17150 535.81363 -0.64442 0.16612 11.22297 1.16854 -3.42995 2.22744 7 3 4 2.38 -2013-Sep-20 09:11:26 4171695.76204 872118.60876 4730013.18849 11.80797 48.17151 533.03637 -2.33696 1.70071 8.44571 -0.52400 -1.89535 -0.54982 7 3 4 2.38 -2013-Sep-20 09:11:26 4171699.44609 872120.90827 4730017.97351 11.80799 48.17151 539.32063 -0.83998 1.85417 14.72997 0.97298 -1.74189 5.73444 7 3 4 2.38 -2013-Sep-20 09:11:26 4171698.64752 872119.43110 4730014.89668 11.80798 48.17150 536.30506 -2.12248 0.60993 11.71440 -0.30952 -2.98614 2.71887 7 3 4 2.38 -2013-Sep-20 09:11:26 4171697.55984 872120.17978 4730014.86997 11.80799 48.17151 535.67731 -1.16707 1.27128 11.08665 0.64589 -2.32479 2.09112 7 3 4 2.38 -2013-Sep-20 09:11:26 4171697.01947 872118.31837 4730015.09299 11.80797 48.17152 535.23671 -2.87851 2.09797 10.64606 -1.06555 -1.49809 1.65052 7 3 4 2.38 -2013-Sep-20 09:11:26 4171696.65306 872117.98772 4730014.86804 11.80796 48.17152 534.78477 -3.12718 2.26563 10.19412 -1.31422 -1.33044 1.19859 7 3 4 2.38 -2013-Sep-20 09:11:26 4171697.36222 872119.83651 4730014.54769 11.80799 48.17151 535.26130 -1.46263 1.25283 10.67065 0.35033 -2.34323 1.67512 7 3 4 2.38 -2013-Sep-20 09:11:26 4171696.52404 872118.30901 4730013.17213 11.80797 48.17151 533.48070 -2.78630 1.17972 8.89004 -0.97334 -2.41634 -0.10549 7 3 4 2.38 -2013-Sep-20 09:11:26 4171698.86385 872121.33989 4730017.74518 11.80800 48.17152 538.82931 -0.29835 2.06076 14.23865 1.51461 -1.53531 5.24312 7 3 4 2.38 -2013-Sep-20 09:11:26 4171696.58909 872119.79233 4730014.38210 11.80799 48.17151 534.62719 -1.34768 1.71304 10.03654 0.46528 -1.88303 1.04100 7 3 4 2.38 -2013-Sep-20 09:11:26 4171700.46335 872121.06357 4730017.83751 11.80799 48.17151 539.90455 -0.89613 0.99783 15.31389 0.91683 -2.59824 6.31836 7 3 4 2.38 -2013-Sep-20 09:11:26 4171700.66830 872121.68466 4730017.35859 11.80800 48.17150 539.76623 -0.33013 0.43424 15.17557 1.48283 -3.16182 6.18004 7 3 4 2.38 -2013-Sep-20 09:11:26 4171700.85203 872122.99020 4730019.80879 11.80802 48.17151 541.89009 0.91019 1.73522 17.29943 2.72315 -1.86085 8.30390 7 3 4 2.38 -2013-Sep-20 09:11:27 4171698.23027 872122.52875 4730017.15334 11.80802 48.17152 538.13696 0.99500 1.94689 13.54630 2.80797 -1.64917 4.55077 7 3 4 2.38 -2013-Sep-20 09:11:27 4171696.75157 872120.64933 4730014.79814 11.80800 48.17151 535.16023 -0.54206 1.74131 10.56957 1.27090 -1.85475 1.57404 7 3 4 2.38 -2013-Sep-20 09:11:27 4171696.76416 872119.87706 4730013.78979 11.80799 48.17151 534.31169 -1.30056 1.17741 9.72103 0.51240 -2.41865 0.72550 7 3 4 2.38 -2013-Sep-20 09:11:27 4171698.92258 872120.43430 4730016.84209 11.80799 48.17151 538.07113 -1.19680 1.55373 13.48048 0.61616 -2.04234 4.48494 7 3 4 2.38 -2013-Sep-20 09:11:27 4171699.32516 872119.95899 4730019.37041 11.80798 48.17152 540.15303 -1.74442 3.01872 15.56238 0.06854 -0.57735 6.56684 7 3 4 2.38 -2013-Sep-20 09:11:27 4171696.62232 872119.48749 4730015.38510 11.80798 48.17152 535.35466 -1.65286 2.40418 10.76401 0.16010 -1.19188 1.76847 7 3 4 2.38 -2013-Sep-20 09:11:27 4171695.82406 872119.99204 4730012.96060 11.80799 48.17151 533.09582 -0.99563 1.29258 8.50517 0.81733 -2.30348 -0.49037 7 3 4 2.38 -2013-Sep-20 09:11:27 4171697.16384 872120.84539 4730013.40883 11.80800 48.17150 534.42087 -0.43451 0.48418 9.83022 1.37845 -3.11188 0.83468 7 3 4 2.38 -2013-Sep-20 09:11:27 4171694.88333 872120.47935 4730010.82835 11.80800 48.17150 530.95939 -0.32614 0.48241 6.36873 1.48682 -3.11365 -2.62680 7 3 4 2.38 -2013-Sep-20 09:11:27 4171697.97785 872121.99028 4730014.31845 11.80801 48.17150 535.78629 0.51958 0.32252 11.19563 2.33254 -3.27354 2.20010 7 3 4 2.38 -2013-Sep-20 09:11:27 4171698.45984 872122.18730 4730016.08542 11.80801 48.17151 537.44446 0.61380 1.11932 12.85381 2.42676 -2.47674 3.85827 7 3 4 2.38 -2013-Sep-20 09:11:27 4171701.78809 872123.72444 4730018.20614 11.80802 48.17150 541.40713 1.43735 -0.12830 16.81648 3.25031 -3.72436 7.82094 7 3 4 2.38 -2013-Sep-20 09:11:27 4171696.37122 872121.62406 4730011.62400 11.80801 48.17150 532.67977 0.48988 -0.24675 8.08911 2.30284 -3.84281 -0.90642 7 3 4 2.38 -2013-Sep-20 09:11:27 4171695.20851 872120.51676 4730010.85522 11.80800 48.17150 531.19679 -0.35606 0.25745 6.60614 1.45690 -3.33861 -2.38940 7 3 4 2.38 -2013-Sep-20 09:11:27 4171697.02880 872121.39072 4730013.54692 11.80801 48.17150 534.51004 0.12691 0.59162 9.91939 1.93988 -3.00445 0.92385 7 3 4 2.38 -2013-Sep-20 09:11:27 4171698.35699 872122.09135 4730015.74924 11.80801 48.17151 537.11373 0.54092 0.98476 12.52307 2.35388 -2.61130 3.52754 7 3 4 2.38 -2013-Sep-20 09:11:27 4171696.79047 872123.00365 4730015.42316 11.80803 48.17151 535.97264 1.75448 1.77078 11.38198 3.56744 -1.82529 2.38645 7 3 4 2.38 -2013-Sep-20 09:11:27 4171695.26064 872122.85392 4730013.27502 11.80803 48.17151 533.35288 1.92098 1.47683 8.76223 3.73394 -2.11923 -0.23331 7 3 4 2.38 -2013-Sep-20 09:11:27 4171698.51176 872122.27968 4730016.83279 11.80801 48.17151 538.04786 0.69360 1.56578 13.45721 2.50656 -2.03028 4.46167 7 3 4 2.38 -2013-Sep-20 09:11:27 4171697.06947 872120.76356 4730013.38628 11.80800 48.17150 534.33130 -0.49530 0.55045 9.74065 1.31766 -3.04561 0.74511 7 3 4 2.38 -2013-Sep-20 09:11:27 4171699.70373 872120.05775 4730016.30475 11.80798 48.17150 538.12928 -1.72522 0.68304 13.53862 0.08774 -2.91303 4.54309 7 3 4 2.38 -2013-Sep-20 09:11:27 4171696.10559 872119.77345 4730013.66015 11.80799 48.17151 533.77103 -1.26721 1.58710 9.18038 0.54575 -2.00896 0.18485 7 3 4 2.38 -2013-Sep-20 09:11:27 4171699.19207 872119.76258 4730016.24054 11.80798 48.17151 537.70715 -1.90945 1.05842 13.11649 -0.09649 -2.53764 4.12096 7 3 4 2.38 -2013-Sep-20 09:11:27 4171694.38017 872117.19225 4730010.17298 11.80796 48.17151 529.69399 -3.44071 0.91355 5.10334 -1.62775 -2.68251 -3.89220 7 3 4 2.38 -2013-Sep-20 09:11:27 4171694.22234 872117.85273 4730011.09932 11.80797 48.17151 530.37136 -2.76191 1.54574 5.78070 -0.94896 -2.05032 -3.21483 7 3 4 2.38 -2013-Sep-20 09:11:28 4171695.11148 872119.04029 4730014.07009 11.80798 48.17152 533.32750 -1.78143 2.69736 8.73684 0.03153 -0.89870 -0.25869 7 3 4 2.38 -2013-Sep-20 09:11:28 4171698.15677 872119.96893 4730018.03728 11.80799 48.17152 538.39830 -1.49561 2.98033 13.80764 0.31735 -0.61574 4.81211 7 3 4 2.38 -2013-Sep-20 09:11:28 4171692.57672 872118.00723 4730011.52180 11.80798 48.17152 529.63301 -2.27394 3.00422 5.04235 -0.46098 -0.59184 -3.95318 7 3 4 2.38 -2013-Sep-20 09:11:28 4171695.70734 872120.86786 4730014.12594 11.80800 48.17152 534.00749 -0.11447 2.02133 9.41684 1.69849 -1.57473 0.42130 7 3 4 2.38 -2013-Sep-20 09:11:28 4171697.26853 872120.68400 4730015.72391 11.80800 48.17152 536.19225 -0.61391 1.97637 11.60160 1.19905 -1.61969 2.60607 7 3 4 2.38 -2013-Sep-20 09:11:28 4171694.52444 872120.43586 4730012.73190 11.80800 48.17152 532.13760 -0.29526 2.02030 7.54694 1.51769 -1.57576 -1.44859 7 3 4 2.38 -2013-Sep-20 09:11:28 4171692.39192 872118.57243 4730011.27480 11.80798 48.17152 529.40545 -1.68288 2.88810 4.81480 0.13008 -0.70796 -4.18073 7 3 4 2.38 -2013-Sep-20 09:11:28 4171692.78390 872117.78744 4730010.16343 11.80797 48.17152 528.72607 -2.53147 1.98071 4.13542 -0.71851 -1.61535 -4.86012 7 3 4 2.38 -2013-Sep-20 09:11:28 4171691.87487 872117.15786 4730009.97550 11.80797 48.17152 527.90672 -2.96171 2.61440 3.31606 -1.14875 -0.98165 -5.67947 7 3 4 2.38 -2013-Sep-20 09:11:28 4171699.73964 872121.31398 4730017.51368 11.80800 48.17151 539.22498 -0.50293 1.27154 14.63432 1.31003 -2.32453 5.63879 7 3 4 2.38 -2013-Sep-20 09:11:28 4171696.61637 872120.95475 4730015.62866 11.80800 48.17152 535.73250 -0.21543 2.34723 11.14185 1.59753 -1.24883 2.14631 7 3 4 2.38 -2013-Sep-20 09:11:28 4171699.45129 872122.06901 4730018.32541 11.80801 48.17151 539.74464 0.29513 1.90808 15.15399 2.10809 -1.68799 6.15845 7 3 4 2.38 -2013-Sep-20 09:11:28 4171697.16364 872119.64857 4730015.64253 11.80798 48.17152 535.92184 -1.60596 2.15647 11.33118 0.20700 -1.43959 2.33565 7 3 4 2.38 -2013-Sep-20 09:11:28 4171693.87384 872118.79801 4730011.97069 11.80798 48.17152 530.92216 -1.76532 2.23691 6.33150 0.04764 -1.35915 -2.66403 7 3 4 2.38 -2013-Sep-20 09:11:28 4171690.82398 872118.69498 4730010.21216 11.80799 48.17153 527.60682 -1.24207 3.30434 3.01617 0.57089 -0.29171 -5.97937 7 3 4 2.38 -2013-Sep-20 09:11:28 4171691.81943 872118.46771 4730010.90035 11.80798 48.17153 528.73842 -1.66823 3.07190 4.14777 0.14473 -0.52416 -4.84776 7 3 4 2.38 -2013-Sep-20 09:11:28 4171695.31081 872120.55540 4730015.15712 11.80800 48.17153 534.47438 -0.33917 3.04589 9.88373 1.47379 -0.55017 0.88819 7 3 4 2.38 -2013-Sep-20 09:11:28 4171696.57652 872120.27903 4730016.16587 11.80799 48.17152 536.01457 -0.86870 2.83759 11.42392 0.94426 -0.75847 2.42838 7 3 4 2.38 -2013-Sep-20 09:11:28 4171698.61181 872122.98260 4730016.69875 11.80802 48.17151 538.10922 1.36117 1.29624 13.51857 3.17413 -2.29982 4.52303 7 3 4 2.38 -2013-Sep-20 09:11:28 4171695.15391 872121.11126 4730014.38076 11.80801 48.17152 533.86931 0.23703 2.55782 9.27866 2.04999 -1.03825 0.28312 7 3 4 2.38 -2013-Sep-20 09:11:28 4171694.64640 872120.83946 4730012.58297 11.80801 48.17151 532.16131 0.07484 1.77048 7.57066 1.88780 -1.82558 -1.42488 7 3 4 2.38 -2013-Sep-20 09:11:28 4171691.63031 872119.31195 4730011.21968 11.80799 48.17153 528.96813 -0.80316 3.29407 4.37747 1.00980 -0.30198 -4.61806 7 3 4 2.38 -2013-Sep-20 09:11:28 4171689.25703 872118.79877 4730009.74856 11.80799 48.17153 526.25265 -0.81983 4.12224 1.66199 0.99313 0.52619 -7.33354 7 3 4 2.38 -2013-Sep-20 09:11:28 4171689.90162 872120.13573 4730011.28216 11.80801 48.17154 527.99864 0.35694 4.47099 3.40798 2.16989 0.87493 -5.58755 7 3 4 2.38 -2013-Sep-20 09:11:28 4171691.77881 872120.72587 4730012.57524 11.80801 48.17153 530.26812 0.55045 3.87419 5.67746 2.36341 0.27813 -3.31807 7 3 4 2.38 -2013-Sep-20 09:11:29 4171692.45743 872120.72748 4730014.45920 11.80801 48.17154 532.11516 0.41316 4.63540 7.52450 2.22612 1.03934 -1.47103 7 3 4 2.38 -2013-Sep-20 09:11:29 4171692.88042 872119.50118 4730013.40565 11.80799 48.17153 531.43888 -0.87374 3.81125 6.84823 0.93922 0.21519 -2.14731 7 3 4 2.38 -2013-Sep-20 09:11:29 4171693.25078 872118.94429 4730013.69045 11.80799 48.17153 531.81687 -1.49464 3.81597 7.22621 0.31832 0.21990 -1.76932 7 3 4 2.38 -2013-Sep-20 09:11:29 4171689.33849 872117.64902 4730011.45198 11.80798 48.17155 527.41821 -1.96192 5.37416 2.82756 -0.14896 1.77810 -6.16797 7 3 4 2.38 -2013-Sep-20 09:11:29 4171691.67619 872118.95441 4730014.83285 11.80799 48.17155 531.64162 -1.16252 5.72476 7.05096 0.65043 2.12870 -1.94457 7 3 4 2.38 -2013-Sep-20 09:11:29 4171690.74721 872117.78260 4730015.28347 11.80798 48.17156 531.21106 -2.11943 6.88154 6.62040 -0.30648 3.28548 -2.37513 7 3 4 2.38 -2013-Sep-20 09:11:29 4171693.06028 872118.23964 4730018.20147 11.80798 48.17156 534.95771 -2.14540 7.07077 10.36705 -0.33244 3.47471 1.37152 7 3 4 2.38 -2013-Sep-20 09:11:29 4171695.36513 872118.22820 4730018.55966 11.80797 48.17155 536.72763 -2.62825 5.63029 12.13698 -0.81529 2.03422 3.14145 7 3 4 2.38 -2013-Sep-20 09:11:29 4171694.87433 872119.42778 4730018.09010 11.80799 48.17155 536.22106 -1.35362 5.49221 11.63041 0.45934 1.89615 2.63488 7 3 4 2.38 -2013-Sep-20 09:11:29 4171698.50407 872122.34864 4730022.07376 11.80802 48.17154 541.95753 0.76268 5.05610 17.36688 2.57564 1.46003 8.37135 7 3 4 2.38 -2013-Sep-20 09:11:29 4171699.62995 872122.88747 4730024.16930 11.80802 48.17155 544.32751 1.05971 5.55027 19.73685 2.87267 1.95421 10.74132 7 3 4 2.38 -2013-Sep-20 09:11:29 4171696.84794 872121.87700 4730020.45151 11.80801 48.17154 539.60325 0.63992 5.25408 15.01260 2.45288 1.65801 6.01707 7 3 4 2.38 -2013-Sep-20 09:11:29 4171699.64875 872122.48073 4730022.82808 11.80801 48.17154 543.28487 0.65774 4.70412 18.69421 2.47070 1.10805 9.69868 7 3 4 2.38 -2013-Sep-20 09:11:29 4171695.56689 872120.80957 4730017.99886 11.80800 48.17154 536.79375 -0.14278 4.71553 12.20309 1.67018 1.11946 3.20756 7 3 4 2.38 -2013-Sep-20 09:11:29 4171694.09739 872120.41500 4730016.23289 11.80800 48.17154 534.46472 -0.22830 4.66978 9.87407 1.58466 1.07371 0.87853 7 3 4 2.38 -2013-Sep-20 09:11:29 4171689.51731 872117.48823 4730013.34802 11.80798 48.17156 528.92582 -2.15590 6.53273 4.33516 -0.34294 2.93667 -4.66037 7 3 4 2.38 -2013-Sep-20 09:11:29 4171692.20834 872119.52321 4730015.80457 11.80800 48.17155 532.79070 -0.71465 5.89794 8.20004 1.09831 2.30188 -0.79549 7 3 4 2.38 -2013-Sep-20 09:11:29 4171690.26954 872116.58989 4730011.80842 11.80796 48.17154 528.14705 -3.18916 5.09428 3.55640 -1.37621 1.49822 -5.43914 7 3 4 2.38 -2013-Sep-20 09:11:29 4171692.63805 872117.70373 4730014.79942 11.80797 48.17154 532.07393 -2.58356 5.19162 7.48327 -0.77060 1.59555 -1.51226 7 3 4 2.38 -2013-Sep-20 09:11:29 4171695.05242 872117.86474 4730016.05879 11.80797 48.17154 534.61039 -2.92001 4.24596 10.01973 -1.10706 0.64990 1.02420 7 3 4 2.38 -2013-Sep-20 09:11:29 4171696.28618 872119.29977 4730017.75940 11.80798 48.17154 536.87882 -1.76782 4.26141 12.28816 0.04514 0.66534 3.29263 7 3 4 2.38 -2013-Sep-20 09:11:29 4171696.24372 872119.42877 4730018.64861 11.80798 48.17154 537.53129 -1.63286 4.86573 12.94064 0.18010 1.26966 3.94510 7 3 4 2.38 -2013-Sep-20 09:11:29 4171694.47531 872120.14495 4730017.91560 11.80800 48.17155 535.92844 -0.56997 5.55751 11.33778 1.24299 1.96145 2.34225 7 3 4 2.38 -2013-Sep-20 09:11:29 4171692.02413 872118.75371 4730015.57320 11.80799 48.17155 532.39304 -1.43017 5.99533 7.80238 0.38279 2.39927 -1.19315 7 3 4 2.38 -2013-Sep-20 09:11:29 4171692.68112 872118.02196 4730015.16433 11.80797 48.17155 532.41738 -2.28088 5.35504 7.82672 -0.46792 1.75898 -1.16881 7 3 4 2.38 -2013-Sep-20 09:11:30 4171698.26892 872120.32798 4730019.17740 11.80799 48.17153 539.37006 -1.16711 3.60414 14.77941 0.64585 0.00807 5.78387 7 3 4 2.38 -2013-Sep-20 09:11:30 4171693.83005 872119.05864 4730014.08610 11.80799 48.17153 532.50543 -1.50125 3.63988 7.91478 0.31171 0.04382 -1.08076 7 3 4 2.38 -2013-Sep-20 09:11:30 4171698.20908 872122.93997 4730015.33242 11.80802 48.17150 536.82239 1.40186 0.68527 12.23174 3.21482 -2.91079 3.23620 7 3 4 2.38 -2013-Sep-20 09:11:30 4171695.97666 872120.12333 4730013.88632 11.80799 48.17151 533.90315 -0.89835 1.77862 9.31250 0.91461 -1.81744 0.31696 7 3 4 2.38 -2013-Sep-20 09:11:30 4171696.92966 872121.12356 4730013.16645 11.80800 48.17150 534.12535 -0.11430 0.45093 9.53470 1.69866 -3.14513 0.53916 7 3 4 2.38 -2013-Sep-20 09:11:30 4171697.32508 872121.12276 4730014.01853 11.80800 48.17150 535.01829 -0.19600 0.73090 10.42764 1.61696 -2.86517 1.43211 7 3 4 2.38 -2013-Sep-20 09:11:30 4171696.65321 872122.10532 4730013.16538 11.80802 48.17150 534.07807 0.90325 0.50214 9.48742 2.71621 -3.09392 0.49188 7 3 4 2.38 -2013-Sep-20 09:11:30 4171698.16121 872123.04957 4730013.98422 11.80803 48.17150 535.80150 1.51893 -0.19564 11.21084 3.33190 -3.79170 2.21531 7 3 4 2.38 -2013-Sep-20 09:11:30 4171699.64704 872122.89464 4730015.46791 11.80802 48.17150 537.85585 1.06324 -0.26627 13.26520 2.87620 -3.86233 4.26966 7 3 4 2.38 -2013-Sep-20 09:11:30 4171700.85327 872122.27936 4730017.03292 11.80801 48.17150 539.72546 0.21413 -0.00854 15.13481 2.02710 -3.60461 6.13927 7 3 4 2.38 -2013-Sep-20 09:11:30 4171696.34753 872120.12522 4730014.30993 11.80799 48.17151 534.46116 -0.97240 1.79033 9.87050 0.84056 -1.80573 0.87497 7 3 4 2.38 -2013-Sep-20 09:11:30 4171700.59557 872122.80469 4730018.34648 11.80802 48.17151 540.60772 0.78109 0.97533 16.01707 2.59405 -2.62073 7.02153 7 3 4 2.38 -2013-Sep-20 09:11:30 4171698.96544 872121.46834 4730015.70480 11.80800 48.17150 537.39278 -0.19341 0.60633 12.80212 1.61955 -2.98973 3.80659 7 3 4 2.38 -2013-Sep-20 09:11:30 4171692.62677 872118.77648 4730009.87217 11.80799 48.17151 528.54145 -1.53120 1.75027 3.95080 0.28176 -1.84579 -5.04474 7 3 4 2.38 -2013-Sep-20 09:11:30 4171693.56977 872118.49947 4730009.84089 11.80798 48.17151 529.09592 -1.99532 1.08384 4.50526 -0.18236 -2.51222 -4.49027 7 3 4 2.38 -2013-Sep-20 09:11:30 4171696.54106 872121.05589 4730014.78581 11.80800 48.17151 535.06910 -0.10102 1.82464 10.47844 1.71194 -1.77142 1.48291 7 3 4 2.38 -2013-Sep-20 09:11:30 4171699.28641 872121.68572 4730017.28730 11.80801 48.17151 538.81116 -0.04631 1.39445 14.22051 1.76665 -2.20161 5.22497 7 3 4 2.38 -2013-Sep-20 09:11:30 4171697.35350 872120.28275 4730015.59475 11.80799 48.17151 536.09672 -1.02406 1.88944 11.50606 0.78890 -1.70663 2.51053 7 3 4 2.38 -2013-Sep-20 09:11:30 4171697.41420 872120.14113 4730014.05201 11.80799 48.17151 534.96746 -1.17510 0.83790 10.37680 0.63786 -2.75817 1.38127 7 3 4 2.38 -2013-Sep-20 09:11:30 4171698.63958 872121.94094 4730017.48684 11.80801 48.17152 538.57243 0.33587 1.96040 13.98178 2.14883 -1.63566 4.98624 7 3 4 2.38 -2013-Sep-20 09:11:30 4171694.74321 872121.15456 4730014.74022 11.80801 48.17153 533.87498 0.36346 3.09049 9.28432 2.17642 -0.50557 0.28879 7 3 4 2.38 -2013-Sep-20 09:11:30 4171697.29040 872123.02076 4730016.70891 11.80803 48.17152 537.25940 1.66893 2.26100 12.66875 3.48189 -1.33506 3.67321 7 3 4 2.38 -2013-Sep-20 09:11:30 4171694.96024 872122.44852 4730013.85495 11.80803 48.17152 533.53358 1.58563 2.14450 8.94293 3.39859 -1.45156 -0.05261 7 3 4 2.38 -2013-Sep-20 09:11:30 4171693.89942 872122.01331 4730011.53162 11.80802 48.17151 531.05048 1.37670 1.43517 6.45982 3.18966 -2.16089 -2.53571 7 3 4 2.38 -2013-Sep-20 09:11:30 4171698.12185 872124.00491 4730015.22298 11.80804 48.17150 536.82924 2.46211 0.51352 12.23859 4.27507 -3.08254 3.24305 7 3 4 2.38 -2013-Sep-20 09:11:31 4171701.76915 872124.39407 4730017.25623 11.80803 48.17149 540.77833 2.09668 -0.85009 16.18767 3.90964 -4.44615 7.19214 7 3 4 2.38 -2013-Sep-20 09:11:31 4171701.62926 872123.10073 4730015.49390 11.80802 48.17148 539.19732 0.85934 -1.72614 14.60667 2.67230 -5.32221 5.61113 7 3 4 2.38 -2013-Sep-20 09:11:31 4171696.83396 872120.51495 4730012.08727 11.80800 48.17150 533.17567 -0.69045 -0.10618 8.58502 1.12251 -3.70224 -0.41052 7 3 4 2.38 -2013-Sep-20 09:11:31 4171697.41331 872121.31794 4730013.75052 11.80801 48.17150 534.90282 -0.02301 0.45804 10.31216 1.78996 -3.13802 1.31663 7 3 4 2.38 -2013-Sep-20 09:11:31 4171696.98600 872120.95555 4730013.18712 11.80800 48.17150 534.15461 -0.29029 0.44923 9.56395 1.52267 -3.14683 0.56842 7 3 4 2.38 -2013-Sep-20 09:11:31 4171694.04482 872120.43889 4730011.38615 11.80800 48.17151 530.82213 -0.19415 1.47217 6.23148 1.61881 -2.12389 -2.76405 7 3 4 2.38 -2013-Sep-20 09:11:31 4171698.00385 872123.47444 4730014.18133 11.80803 48.17150 535.90363 1.96702 -0.01420 11.31297 3.77998 -3.61026 2.31744 7 3 4 2.38 -2013-Sep-20 09:11:31 4171696.78061 872121.42378 4730014.12273 11.80801 48.17151 534.78159 0.21006 1.15161 10.19094 2.02302 -2.44446 1.19540 7 3 4 2.38 -2013-Sep-20 09:11:31 4171695.68997 872120.95522 4730012.45193 11.80801 48.17151 532.76070 -0.02540 0.90428 8.17005 1.78756 -2.69178 -0.82549 7 3 4 2.38 -2013-Sep-20 09:11:31 4171696.79229 872123.24570 4730012.80506 11.80803 48.17150 534.05600 1.99103 -0.01348 9.46534 3.80400 -3.60954 0.46981 7 3 4 2.38 -2013-Sep-20 09:11:31 4171696.84384 872123.37869 4730012.15739 11.80803 48.17149 533.62519 2.11066 -0.50329 9.03454 3.92362 -4.09935 0.03900 7 3 4 2.38 -2013-Sep-20 09:11:31 4171700.89634 872123.35249 4730017.20702 11.80802 48.17150 540.02976 1.25575 -0.08748 15.43911 3.06871 -3.68354 6.44357 7 3 4 2.38 -2013-Sep-20 09:11:31 4171697.98251 872119.90541 4730014.38778 11.80799 48.17150 535.55647 -1.52212 0.68326 10.96581 0.29084 -2.91281 1.97028 7 3 4 2.38 -2013-Sep-20 09:11:31 4171697.69756 872121.97965 4730014.15532 11.80801 48.17150 535.48031 0.56653 0.41978 10.88966 2.37949 -3.17628 1.89412 7 3 4 2.38 -2013-Sep-20 09:11:31 4171700.52680 872122.92218 4730016.59934 11.80802 48.17150 539.27699 0.91016 -0.15759 14.68633 2.72312 -3.75365 5.69080 7 3 4 2.38 -2013-Sep-20 09:11:31 4171698.39552 872121.11229 4730014.63178 11.80800 48.17150 536.17260 -0.42530 0.36071 11.58194 1.38766 -3.23535 2.58641 7 3 4 2.38 -2013-Sep-20 09:11:31 4171699.86931 872122.24930 4730015.30119 11.80801 48.17149 537.78865 0.38606 -0.44118 13.19799 2.19902 -4.03724 4.20246 7 3 4 2.38 -2013-Sep-20 09:11:31 4171698.03849 872122.27009 4730013.20913 11.80802 48.17149 535.03745 0.78106 -0.50419 10.44680 2.59402 -4.10025 1.45126 7 3 4 2.38 -2013-Sep-20 09:11:31 4171699.01237 872121.03175 4730015.15030 11.80800 48.17150 536.95066 -0.63036 0.26888 12.36000 1.18260 -3.32718 3.36447 7 3 4 2.38 -2013-Sep-20 09:11:31 4171700.38797 872122.29167 4730016.49317 11.80801 48.17150 539.02120 0.32141 -0.03100 14.43055 2.13437 -3.62706 5.43501 7 3 4 2.38 -2013-Sep-20 09:11:31 4171699.84155 872123.17397 4730018.40310 11.80802 48.17151 540.20808 1.29684 1.50675 15.61743 3.10981 -2.08931 6.62190 7 3 4 2.38 -2013-Sep-20 09:11:31 4171696.45219 872121.13268 4730015.80448 11.80801 48.17152 535.78062 -0.00767 2.55710 11.18997 1.80529 -1.03896 2.19443 7 3 4 2.38 -2013-Sep-20 09:11:31 4171697.41566 872121.08123 4730017.47779 11.80800 48.17152 537.64941 -0.25519 2.97815 13.05875 1.55777 -0.61792 4.06322 7 3 4 2.38 -2013-Sep-20 09:11:31 4171698.47013 872122.57172 4730018.46835 11.80802 48.17152 539.27927 0.98798 2.64238 14.68861 2.80094 -0.95369 5.69308 7 3 4 2.38 -2013-Sep-20 09:11:31 4171699.76482 872122.20683 4730018.91852 11.80801 48.17152 540.41008 0.36587 2.05393 15.81942 2.17883 -1.54214 6.82389 7 3 4 2.38 -2013-Sep-20 09:11:32 4171699.67571 872122.06987 4730017.84856 11.80801 48.17151 539.53594 0.25005 1.42624 14.94529 2.06301 -2.16982 5.94975 7 3 4 2.38 -2013-Sep-20 09:11:32 4171700.17402 872121.07050 4730017.18905 11.80799 48.17150 539.23342 -0.83014 0.77534 14.64277 0.98282 -2.82072 5.64723 7 3 4 2.38 -2013-Sep-20 09:11:32 4171699.94684 872120.69430 4730017.57383 11.80799 48.17151 539.32050 -1.15189 1.25502 14.72985 0.66107 -2.34105 5.73431 7 3 4 2.38 -2013-Sep-20 09:11:32 4171695.86171 872120.08078 4730012.05899 11.80799 48.17150 532.46068 -0.91648 0.65030 7.87002 0.89648 -2.94576 -1.12551 7 3 4 2.38 -2013-Sep-20 09:11:32 4171692.74376 872119.90583 4730009.63812 11.80800 48.17151 528.59753 -0.44970 1.33665 4.00688 1.36326 -2.25941 -4.98866 7 3 4 2.38 -2013-Sep-20 09:11:32 4171693.11802 872121.32357 4730009.95869 11.80802 48.17151 529.27420 0.86146 1.06128 4.68355 2.67442 -2.53478 -4.31199 7 3 4 2.38 -2013-Sep-20 09:11:32 4171694.62019 872121.63663 4730011.20999 11.80802 48.17150 531.22992 0.86051 0.75239 6.63927 2.67347 -2.84367 -2.35627 7 3 4 2.38 -2013-Sep-20 09:11:32 4171693.08701 872120.82783 4730010.58198 11.80801 48.17151 529.65074 0.38255 1.57516 5.06009 2.19551 -2.02090 -3.93544 7 3 4 2.38 -2013-Sep-20 09:11:32 4171693.56567 872120.52789 4730013.26995 11.80801 48.17153 531.92520 -0.00899 3.06439 7.33454 1.80397 -0.53167 -1.66099 7 3 4 2.38 -2013-Sep-20 09:11:32 4171695.48776 872121.01770 4730013.87497 11.80801 48.17152 533.69760 0.07713 1.99127 9.10694 1.89009 -1.60479 0.11141 7 3 4 2.38 -2013-Sep-20 09:11:32 4171696.54161 872120.89515 4730015.08405 11.80800 48.17152 535.26976 -0.25847 2.04764 10.67910 1.55449 -1.54842 1.68357 7 3 4 2.38 -2013-Sep-20 09:11:32 4171698.14005 872121.86835 4730014.99570 11.80801 48.17150 536.38018 0.36704 0.67446 11.78952 2.18000 -2.92160 2.79399 7 3 4 2.38 -2013-Sep-20 09:11:32 4171696.95949 872121.14289 4730014.46102 11.80800 48.17151 535.11211 -0.10149 1.28957 10.52145 1.71147 -2.30649 1.52592 7 3 4 2.38 -2013-Sep-20 09:11:32 4171696.00914 872119.82210 4730013.46721 11.80799 48.17151 533.57095 -1.19985 1.52136 8.98029 0.61311 -2.07470 -0.01524 7 3 4 2.38 -2013-Sep-20 09:11:32 4171701.40291 872121.95208 4730017.87108 11.80800 48.17150 540.66415 -0.21869 0.19944 16.07349 1.59427 -3.39662 7.07796 7 3 4 2.38 -2013-Sep-20 09:11:32 4171695.65275 872121.52404 4730015.60274 11.80801 48.17152 535.16185 0.53900 2.94598 10.57119 2.35196 -0.65009 1.57566 7 3 4 2.38 -2013-Sep-20 09:11:32 4171697.42165 872120.31319 4730016.56531 11.80799 48.17152 536.86857 -1.00820 2.48235 12.27791 0.80476 -1.11371 3.28238 7 3 4 2.38 -2013-Sep-20 09:11:32 4171698.96464 872121.97876 4730017.99457 11.80801 48.17152 539.16812 0.30637 2.05615 14.57747 2.11933 -1.53992 5.58194 7 3 4 2.38 -2013-Sep-20 09:11:32 4171695.54423 872120.87815 4730017.16218 11.80800 48.17154 536.16486 -0.07102 4.16361 11.57421 1.74194 0.56755 2.57867 7 3 4 2.38 -2013-Sep-20 09:11:32 4171690.17505 872117.83562 4730010.78609 11.80798 48.17154 527.49359 -1.95045 4.29145 2.90293 -0.13749 0.69540 -6.09260 7 3 4 2.38 -2013-Sep-20 09:11:32 4171692.12620 872119.79749 4730013.83103 11.80800 48.17154 531.30394 -0.42937 4.59987 6.71328 1.38359 1.00380 -2.28225 7 3 4 2.38 -2013-Sep-20 09:11:32 4171691.00390 872118.66875 4730012.66655 11.80799 48.17154 529.54957 -1.30456 4.81397 4.95891 0.50839 1.21791 -4.03662 7 3 4 2.38 -2013-Sep-20 09:11:32 4171695.61142 872119.94615 4730017.12012 11.80799 48.17154 536.05020 -0.99704 4.22866 11.45954 0.81592 0.63260 2.46401 7 3 4 2.38 -2013-Sep-20 09:11:32 4171697.07143 872119.70939 4730017.66332 11.80799 48.17153 537.37573 -1.52756 3.56213 12.78507 0.28540 -0.03393 3.78954 7 3 4 2.38 -2013-Sep-20 09:11:32 4171695.53907 872118.93159 4730014.25243 11.80798 48.17152 533.72766 -1.97533 2.52366 9.13700 -0.16237 -1.07240 0.14147 7 3 4 2.38 -2013-Sep-20 09:11:33 4171693.38314 872116.17409 4730011.24903 11.80795 48.17152 529.70601 -4.23330 2.51364 5.11535 -2.42034 -1.08242 -3.88018 7 3 4 2.38 -2013-Sep-20 09:11:33 4171694.17525 872118.25789 4730014.26288 11.80797 48.17153 532.75322 -2.35569 3.62810 8.16256 -0.54273 0.03204 -0.83297 7 3 4 2.38 -2013-Sep-20 09:11:33 4171696.14932 872119.23864 4730016.09468 11.80798 48.17153 535.54067 -1.79966 3.26034 10.95002 0.01330 -0.33572 1.95448 7 3 4 2.38 -2013-Sep-20 09:11:33 4171695.66794 872118.17743 4730016.54258 11.80797 48.17153 535.41536 -2.73990 4.07197 10.82470 -0.92694 0.47591 1.82917 7 3 4 2.38 -2013-Sep-20 09:11:33 4171692.65960 872117.00697 4730014.22706 11.80796 48.17154 531.56642 -3.26999 4.90043 6.97576 -1.45703 1.30437 -2.01977 7 3 4 2.38 -2013-Sep-20 09:11:33 4171694.86981 872118.65044 4730015.24167 11.80798 48.17153 533.98953 -2.11358 3.71441 9.39888 -0.30062 0.11834 0.40335 7 3 4 2.38 -2013-Sep-20 09:11:33 4171696.18617 872118.65764 4730015.63173 11.80797 48.17152 535.14048 -2.37590 3.01331 10.54982 -0.56294 -0.58275 1.55429 7 3 4 2.38 -2013-Sep-20 09:11:33 4171694.95458 872117.40193 4730013.79240 11.80796 48.17152 532.79457 -3.35301 2.87643 8.20391 -1.54005 -0.71963 -0.79162 7 3 4 2.38 -2013-Sep-20 09:11:33 4171695.80329 872119.19935 4730016.04300 11.80798 48.17153 535.27092 -1.76730 3.48426 10.68026 0.04566 -0.11181 1.68473 7 3 4 2.38 -2013-Sep-20 09:11:33 4171697.16613 872119.18397 4730018.03988 11.80798 48.17153 537.64643 -2.06124 3.82431 13.05578 -0.24828 0.22824 4.06025 7 3 4 2.38 -2013-Sep-20 09:11:33 4171695.34082 872118.39122 4730017.32410 11.80797 48.17154 535.81334 -2.46370 4.79916 11.22268 -0.65074 1.20310 2.22715 7 3 4 2.38 -2013-Sep-20 09:11:33 4171697.92042 872119.02717 4730019.71352 11.80797 48.17154 539.36453 -2.36908 4.41421 14.77388 -0.55612 0.81814 5.77835 7 3 4 2.38 -2013-Sep-20 09:11:33 4171696.31809 872117.99340 4730017.19117 11.80796 48.17153 536.29795 -3.05308 4.05837 11.70730 -1.24012 0.46231 2.71176 7 3 4 2.38 -2013-Sep-20 09:11:33 4171694.49039 872117.01224 4730014.71444 11.80796 48.17153 533.12542 -3.63947 3.88932 8.53477 -1.82651 0.29326 -0.46076 7 3 4 2.38 -2013-Sep-20 09:11:33 4171692.15456 872116.40968 4730011.34855 11.80796 48.17153 529.01031 -3.75129 3.44018 4.41966 -1.93833 -0.15588 -4.57588 7 3 4 2.38 -2013-Sep-20 09:11:33 4171693.74161 872117.77649 4730014.38891 11.80797 48.17153 532.49836 -2.73817 4.10184 7.90770 -0.92521 0.50578 -1.08783 7 3 4 2.38 -2013-Sep-20 09:11:33 4171691.32930 872116.91961 4730011.11749 11.80796 48.17153 528.36901 -3.08327 3.81026 3.77835 -1.27031 0.21420 -5.21718 7 3 4 2.38 -2013-Sep-20 09:11:33 4171689.40517 872115.46055 4730007.98031 11.80795 48.17153 524.57618 -4.11772 3.34396 -0.01447 -2.30476 -0.25210 -9.01001 7 3 4 2.38 -2013-Sep-20 09:11:33 4171691.52175 872117.27570 4730011.72622 11.80797 48.17153 528.99682 -2.77411 4.02156 4.40617 -0.96115 0.42550 -4.58937 7 3 4 2.38 -2013-Sep-20 09:11:33 4171694.24856 872118.10446 4730013.56436 11.80797 48.17153 532.25964 -2.52088 3.13217 7.66899 -0.70792 -0.46389 -1.32655 7 3 4 2.38 -2013-Sep-20 09:11:33 4171695.03155 872118.08511 4730015.18106 11.80797 48.17153 533.97281 -2.70004 3.64222 9.38215 -0.88708 0.04616 0.38662 7 3 4 2.38 -2013-Sep-20 09:11:33 4171694.44460 872119.92811 4730015.27935 11.80800 48.17153 533.91440 -0.77593 3.85485 9.32375 1.03703 0.25879 0.32821 7 3 4 2.38 -2013-Sep-20 09:11:33 4171692.51924 872117.20533 4730012.79137 11.80796 48.17153 530.43206 -3.04711 4.01510 5.84141 -1.23415 0.41904 -3.15413 7 3 4 2.38 -2013-Sep-20 09:11:33 4171694.14532 872118.05045 4730014.36843 11.80797 48.17153 532.78402 -2.55262 3.75195 8.19337 -0.73966 0.15589 -0.80217 7 3 4 2.38 -2013-Sep-20 09:11:33 4171694.60358 872119.09435 4730015.78673 11.80798 48.17154 534.28247 -1.62459 4.20440 9.69182 0.18837 0.60834 0.69629 7 3 4 2.38 -2013-Sep-20 09:11:34 4171697.71712 872118.76036 4730018.49023 11.80797 48.17153 538.28388 -2.58864 3.78735 13.69322 -0.77567 0.19129 4.69769 7 3 4 2.38 -2013-Sep-20 09:11:34 4171698.50526 872120.06490 4730020.36119 11.80799 48.17154 540.37053 -1.47298 4.26134 15.77987 0.33998 0.66527 6.78434 7 3 4 2.38 -2013-Sep-20 09:11:34 4171700.01562 872119.60757 4730020.38900 11.80798 48.17153 541.31480 -2.22970 3.24800 16.72414 -0.41674 -0.34807 7.72861 7 3 4 2.38 -2013-Sep-20 09:11:34 4171703.02134 872119.88652 4730021.20011 11.80797 48.17151 543.91936 -2.57172 1.55410 19.32871 -0.75876 -2.04197 10.33317 7 3 4 2.38 -2013-Sep-20 09:11:34 4171700.68918 872119.11903 4730020.19398 11.80797 48.17152 541.54250 -2.84574 2.70115 16.95185 -1.03278 -0.89491 7.95631 7 3 4 2.38 -2013-Sep-20 09:11:34 4171695.91369 872118.29525 4730016.78767 11.80797 48.17153 535.77449 -2.67486 4.03822 11.18383 -0.86190 0.44215 2.18830 7 3 4 2.38 -2013-Sep-20 09:11:34 4171692.19223 872116.24494 4730011.91046 11.80795 48.17153 529.43112 -3.92026 3.81256 4.84047 -2.10730 0.21650 -4.15507 7 3 4 2.38 -2013-Sep-20 09:11:34 4171692.60351 872115.67836 4730012.42184 11.80794 48.17153 530.00333 -4.55901 3.94003 5.41268 -2.74605 0.34397 -3.58286 7 3 4 2.38 -2013-Sep-20 09:11:34 4171692.30553 872116.47974 4730011.77706 11.80796 48.17153 529.43772 -3.71361 3.60516 4.84707 -1.90065 0.00910 -4.14847 7 3 4 2.38 -2013-Sep-20 09:11:34 4171692.75250 872116.39083 4730014.49148 11.80795 48.17154 531.74001 -3.89211 5.10296 7.14935 -2.07915 1.50690 -1.84618 7 3 4 2.38 -2013-Sep-20 09:11:34 4171693.38938 872117.92347 4730014.57571 11.80797 48.17154 532.42768 -2.52222 4.46091 7.83702 -0.70926 0.86485 -1.15851 7 3 4 2.38 -2013-Sep-20 09:11:34 4171693.41935 872118.32627 4730013.77584 11.80798 48.17153 531.90619 -2.13408 3.84420 7.31554 -0.32112 0.24814 -1.67999 7 3 4 2.38 -2013-Sep-20 09:11:34 4171693.32380 872117.47642 4730014.12891 11.80797 48.17154 531.99093 -2.94639 4.27895 7.40027 -1.13343 0.68288 -1.59526 7 3 4 2.38 -2013-Sep-20 09:11:34 4171692.65694 872118.51198 4730013.90922 11.80798 48.17154 531.53323 -1.79628 4.46092 6.94258 0.01668 0.86486 -2.05296 7 3 4 2.38 -2013-Sep-20 09:11:34 4171691.90780 872118.74806 4730013.12016 11.80799 48.17154 530.48846 -1.41189 4.44509 5.89780 0.40106 0.84903 -3.09773 7 3 4 2.38 -2013-Sep-20 09:11:34 4171691.70153 872117.98405 4730014.60682 11.80798 48.17155 531.35731 -2.11753 5.70350 6.76666 -0.30458 2.10744 -2.22888 7 3 4 2.38 -2013-Sep-20 09:11:34 4171694.24309 872119.02442 4730017.39279 11.80798 48.17155 535.23435 -1.61927 5.54908 10.64369 0.19369 1.95302 1.64816 7 3 4 2.38 -2013-Sep-20 09:11:34 4171693.32101 872117.94897 4730015.87242 11.80797 48.17155 533.35276 -2.48327 5.37167 8.76210 -0.67031 1.77561 -0.23343 7 3 4 2.38 -2013-Sep-20 09:11:34 4171696.72265 872120.43472 4730018.33754 11.80800 48.17154 537.74942 -0.74620 4.15556 13.15877 1.06676 0.55950 4.16324 7 3 4 2.38 -2013-Sep-20 09:11:34 4171695.24415 872118.29192 4730016.16456 11.80797 48.17153 534.87266 -2.54111 4.11152 10.28200 -0.72815 0.51546 1.28647 7 3 4 2.38 -2013-Sep-20 09:11:34 4171697.46090 872121.11818 4730018.27307 11.80800 48.17153 538.27658 -0.22828 3.46990 13.68593 1.58469 -0.12617 4.69039 7 3 4 2.38 -2013-Sep-20 09:11:34 4171698.36143 872121.15813 4730019.08653 11.80800 48.17153 539.47604 -0.37345 3.34948 14.88538 1.43951 -0.24659 5.88985 7 3 4 2.38 -2013-Sep-20 09:11:34 4171698.97376 872121.73982 4730018.37301 11.80801 48.17152 539.42346 0.07062 2.33831 14.83281 1.88358 -1.25775 5.83728 7 3 4 2.38 -2013-Sep-20 09:11:34 4171695.05377 872118.90064 4730014.60167 11.80798 48.17153 533.66687 -1.90632 3.11526 9.07622 -0.09336 -0.48080 0.08068 7 3 4 2.38 -2013-Sep-20 09:11:34 4171693.98799 872119.37912 4730015.20478 11.80799 48.17154 533.48585 -1.21987 4.22187 8.89519 0.59309 0.62581 -0.10034 7 3 4 2.38 -2013-Sep-20 09:11:35 4171691.59768 872118.10163 4730013.07446 11.80798 48.17154 530.16374 -1.98119 4.73938 5.57308 -0.16823 1.14332 -3.42245 7 3 4 2.38 -2013-Sep-20 09:11:35 4171692.69617 872117.92132 4730012.70509 11.80797 48.17153 530.58098 -2.38247 3.71933 5.99033 -0.56951 0.12327 -3.00521 7 3 4 2.38 -2013-Sep-20 09:11:35 4171688.53303 872116.05191 4730008.85767 11.80796 48.17154 524.74133 -3.36041 4.47502 0.15067 -1.54745 0.87896 -8.84486 7 3 4 2.38 -2013-Sep-20 09:11:35 4171691.67697 872117.48426 4730012.70439 11.80797 48.17154 529.85549 -2.60172 4.52888 5.26483 -0.78876 0.93282 -3.73070 7 3 4 2.38 -2013-Sep-20 09:11:35 4171692.43862 872117.97018 4730014.46605 11.80797 48.17154 531.73169 -2.28194 5.07412 7.14103 -0.46898 1.47806 -1.85450 7 3 4 2.38 -2013-Sep-20 09:11:35 4171694.64348 872118.29297 4730016.79061 11.80797 48.17154 534.94719 -2.41717 4.96698 10.35653 -0.60421 1.37092 1.36100 7 3 4 2.38 -2013-Sep-20 09:11:35 4171692.44947 872117.08023 4730013.09106 11.80796 48.17154 530.59275 -3.15528 4.28492 6.00210 -1.34232 0.68886 -2.99343 7 3 4 2.38 -2013-Sep-20 09:11:35 4171692.69437 872116.96410 4730013.10921 11.80796 48.17153 530.75030 -3.31907 4.13611 6.15964 -1.50611 0.54005 -2.83589 7 3 4 2.38 -2013-Sep-20 09:11:35 4171692.00709 872116.98460 4730014.64964 11.80796 48.17155 531.45229 -3.15836 5.66159 6.86163 -1.34540 2.06552 -2.13390 7 3 4 2.38 -2013-Sep-20 09:11:35 4171693.38478 872118.56309 4730016.72597 11.80798 48.17155 534.11422 -1.89519 5.80075 9.52356 -0.08223 2.20469 0.52803 7 3 4 2.38 -2013-Sep-20 09:11:35 4171691.92834 872116.68487 4730015.17580 11.80796 48.17155 531.75205 -3.43563 6.11562 7.16139 -1.62268 2.51956 -1.83414 7 3 4 2.38 -2013-Sep-20 09:11:35 4171692.17088 872116.15307 4730016.47838 11.80795 48.17156 532.80841 -4.00581 6.88851 8.21775 -2.19285 3.29245 -0.77778 7 3 4 2.38 -2013-Sep-20 09:11:35 4171691.32198 872116.78377 4730013.64684 11.80796 48.17155 530.23042 -3.21475 5.52314 5.63976 -1.40179 1.92708 -3.35577 7 3 4 2.38 -2013-Sep-20 09:11:35 4171692.39347 872118.10994 4730015.52382 11.80798 48.17155 532.50948 -2.13590 5.79117 7.91883 -0.32294 2.19511 -1.07670 7 3 4 2.38 -2013-Sep-20 09:11:35 4171692.04443 872118.25264 4730015.06071 11.80798 48.17155 531.95602 -1.92479 5.71514 7.36537 -0.11183 2.11908 -1.63016 7 3 4 2.38 -2013-Sep-20 09:11:35 4171694.27706 872119.00306 4730015.56449 11.80798 48.17154 533.89126 -1.64712 4.30827 9.30060 0.16584 0.71220 0.30507 7 3 4 2.38 -2013-Sep-20 09:11:35 4171693.83391 872118.08116 4730015.68319 11.80797 48.17154 533.56462 -2.45884 4.85122 8.97396 -0.64588 1.25516 -0.02157 7 3 4 2.38 -2013-Sep-20 09:11:35 4171692.03784 872117.65284 4730014.08187 11.80797 48.17154 531.14049 -2.51055 5.15861 6.54983 -0.69760 1.56255 -2.44570 7 3 4 2.38 -2013-Sep-20 09:11:35 4171689.29288 872116.72334 4730011.77685 11.80797 48.17155 527.50418 -2.85867 5.76523 2.91352 -1.04571 2.16917 -6.08201 7 3 4 2.38 -2013-Sep-20 09:11:35 4171689.57005 872117.26138 4730012.39955 11.80797 48.17155 528.22254 -2.38874 5.89631 3.63189 -0.57578 2.30026 -5.36364 7 3 4 2.38 -2013-Sep-20 09:11:35 4171690.50515 872117.27741 4730012.22343 11.80797 48.17154 528.70393 -2.56440 5.09437 4.11327 -0.75144 1.49831 -4.88226 7 3 4 2.38 -2013-Sep-20 09:11:35 4171692.20620 872117.64868 4730014.79210 11.80797 48.17155 531.77905 -2.54908 5.51011 7.18840 -0.73612 1.91405 -1.80714 7 3 4 2.38 -2013-Sep-20 09:11:35 4171691.46176 872116.40297 4730014.09906 11.80796 48.17155 530.60667 -3.61609 5.78084 6.01602 -1.80313 2.18478 -2.97952 7 3 4 2.38 -2013-Sep-20 09:11:35 4171688.67955 872114.80607 4730010.46651 11.80794 48.17155 525.86577 -4.60986 5.63106 1.27511 -2.79690 2.03500 -7.72042 7 3 4 2.38 -2013-Sep-20 09:11:35 4171685.65827 872113.70093 4730005.62804 11.80794 48.17154 520.13733 -5.07336 4.77643 -4.45333 -3.26041 1.18037 -13.44886 7 3 4 2.38 -2013-Sep-20 09:11:36 4171687.42392 872115.84245 4730007.08054 11.80796 48.17153 522.66450 -3.33847 4.13074 -1.92616 -1.52552 0.53468 -10.92169 7 3 4 2.38 -2013-Sep-20 09:11:36 4171691.85291 872116.53905 4730011.65024 11.80796 48.17153 529.05585 -3.56293 3.84167 4.46519 -1.74998 0.24561 -4.53034 7 3 4 2.38 -2013-Sep-20 09:11:36 4171702.17441 872123.29327 4730015.12890 11.80802 48.17148 539.30748 0.93624 -2.39654 14.71683 2.74920 -5.99261 5.72129 7 3 4 2.38 -2013-Sep-20 09:11:36 4171700.34949 872123.48151 4730013.28926 11.80803 48.17148 536.77109 1.49394 -2.32106 12.18044 3.30690 -5.91712 3.18490 7 3 4 2.38 -2013-Sep-20 09:11:36 4171698.36269 872122.64152 4730011.34768 11.80802 48.17148 533.91274 1.07829 -2.03869 9.32208 2.89125 -5.63476 0.32654 7 3 4 2.38 -2013-Sep-20 09:11:36 4171696.60207 872121.53814 4730010.82027 11.80801 48.17149 532.21984 0.35854 -0.93803 7.62919 2.17150 -4.53409 -1.36635 7 3 4 2.38 -2013-Sep-20 09:11:36 4171697.57430 872122.02479 4730010.79413 11.80801 48.17148 532.90144 0.63594 -1.73879 8.31078 2.44890 -5.33485 -0.68475 7 3 4 2.38 -2013-Sep-20 09:11:36 4171696.69283 872121.57935 4730009.73856 11.80801 48.17148 531.47868 0.38030 -1.73190 6.88803 2.19326 -5.32796 -2.10751 7 3 4 2.38 -2013-Sep-20 09:11:36 4171703.24765 872124.67207 4730015.28909 11.80803 48.17147 540.31562 2.06625 -3.28275 15.72496 3.87921 -6.87882 6.72943 7 3 4 2.38 -2013-Sep-20 09:11:36 4171698.26339 872123.31328 4730011.79445 11.80803 48.17148 534.27249 1.75615 -1.77075 9.68184 3.56911 -5.36681 0.68630 7 3 4 2.38 -2013-Sep-20 09:11:36 4171700.81223 872123.77116 4730015.44258 11.80803 48.17149 538.71723 1.68277 -1.26668 14.12657 3.49573 -4.86274 5.13103 7 3 4 2.38 -2013-Sep-20 09:11:36 4171699.70693 872123.18767 4730014.44119 11.80802 48.17149 537.16989 1.33781 -1.03936 12.57923 3.15077 -4.63542 3.58370 7 3 4 2.38 -2013-Sep-20 09:11:36 4171700.16685 872123.40235 4730013.89245 11.80803 48.17148 537.09052 1.45383 -1.77351 12.49987 3.26679 -5.36957 3.50433 7 3 4 2.38 -2013-Sep-20 09:11:36 4171701.92191 872123.96064 4730015.45634 11.80803 48.17148 539.47772 1.64116 -2.09577 14.88707 3.45413 -5.69183 5.89153 7 3 4 2.38 -2013-Sep-20 09:11:36 4171703.21904 872122.72662 4730016.09006 11.80801 48.17148 540.62828 0.16782 -2.43107 16.03763 1.98078 -6.02713 7.04209 7 3 4 2.38 -2013-Sep-20 09:11:36 4171699.46488 872120.20662 4730011.84254 11.80799 48.17148 534.66868 -1.53063 -2.14131 10.07803 0.28233 -5.73737 1.08249 7 3 4 2.38 -2013-Sep-20 09:11:36 4171700.06437 872120.75578 4730013.49475 11.80799 48.17148 536.36610 -1.11577 -1.56043 11.77544 0.69720 -5.15650 2.77991 7 3 4 2.38 -2013-Sep-20 09:11:36 4171698.39779 872122.36705 4730012.19598 11.80802 48.17148 534.53029 0.80245 -1.45671 9.93964 2.61541 -5.05277 0.94410 7 3 4 2.38 -2013-Sep-20 09:11:36 4171698.10795 872122.13058 4730011.03036 11.80801 48.17148 533.44027 0.63029 -1.98661 8.84961 2.44325 -5.58267 -0.14593 7 3 4 2.38 -2013-Sep-20 09:11:36 4171700.57115 872121.69513 4730012.42067 11.80800 48.17147 536.02477 -0.29999 -2.78961 11.43412 1.51297 -6.38568 2.43858 7 3 4 2.38 -2013-Sep-20 09:11:36 4171700.93226 872123.28020 4730013.87904 11.80802 48.17148 537.56352 1.17763 -2.32209 12.97286 2.99059 -5.91815 3.97733 7 3 4 2.38 -2013-Sep-20 09:11:36 4171700.75112 872123.91081 4730014.83915 11.80803 48.17148 538.24674 1.83197 -1.64583 13.65609 3.64493 -5.24190 4.66055 7 3 4 2.38 -2013-Sep-20 09:11:36 4171699.17370 872122.97452 4730014.21297 11.80802 48.17149 536.62265 1.23828 -0.77014 12.03199 3.05124 -4.36620 3.03646 7 3 4 2.38 -2013-Sep-20 09:11:36 4171697.49318 872121.43767 4730013.31685 11.80801 48.17150 534.64815 0.07784 0.09232 10.05750 1.89081 -3.50374 1.06196 7 3 4 2.38 -2013-Sep-20 09:11:36 4171698.70603 872122.24915 4730016.39227 11.80801 48.17151 537.84226 0.62396 1.13496 13.25161 2.43692 -2.46110 4.25607 7 3 4 2.38 -2013-Sep-20 09:11:37 4171699.64980 872124.38108 4730017.70586 11.80804 48.17151 539.72811 2.51766 0.99756 15.13745 4.33062 -2.59851 6.14192 7 3 4 2.38 -2013-Sep-20 09:11:37 4171701.49619 872124.71381 4730018.21005 11.80804 48.17150 541.35452 2.46551 -0.06365 16.76386 4.27847 -3.65971 7.76833 7 3 4 2.38 -2013-Sep-20 09:11:37 4171698.10948 872121.94558 4730013.16343 11.80801 48.17149 535.00546 0.44889 -0.53696 10.41481 2.26185 -4.13303 1.41927 7 3 4 2.38 -2013-Sep-20 09:11:37 4171700.34254 872122.31617 4730013.71245 11.80801 48.17148 536.92285 0.35468 -1.85607 12.33220 2.16765 -5.45213 3.33666 7 3 4 2.38 -2013-Sep-20 09:11:37 4171697.29126 872120.77181 4730009.92721 11.80800 48.17148 531.89969 -0.53261 -1.91944 7.30904 1.28036 -5.51550 -1.68650 7 3 4 2.38 -2013-Sep-20 09:11:37 4171696.36468 872121.95418 4730012.70064 11.80802 48.17150 533.52280 0.81436 0.42570 8.93214 2.62732 -3.17036 -0.06339 7 3 4 2.38 -2013-Sep-20 09:11:37 4171693.52071 872120.35141 4730010.85368 11.80800 48.17151 530.07130 -0.17253 1.51267 5.48065 1.64043 -2.08338 -3.51489 7 3 4 2.38 -2013-Sep-20 09:11:37 4171694.21808 872119.87618 4730012.26684 11.80800 48.17152 531.51469 -0.78041 2.01894 6.92404 1.03255 -1.57712 -2.07149 7 3 4 2.38 -2013-Sep-20 09:11:37 4171699.64725 872121.47435 4730016.27362 11.80800 48.17150 538.26253 -0.32705 0.48747 13.67188 1.48592 -3.10859 4.67634 7 3 4 2.38 -2013-Sep-20 09:11:37 4171698.45869 872121.37156 4730013.69074 11.80800 48.17149 535.54801 -0.18444 -0.35247 10.95735 1.62852 -3.94854 1.96182 7 3 4 2.38 -2013-Sep-20 09:11:37 4171701.44532 872124.96146 4730017.51253 11.80804 48.17149 540.83535 2.71833 -0.52948 16.24470 4.53129 -4.12554 7.24916 7 3 4 2.38 -2013-Sep-20 09:11:37 4171702.43442 872123.59979 4730019.67027 11.80802 48.17150 542.90302 1.18308 0.39572 18.31237 2.99604 -3.20034 9.31683 7 3 4 2.38 -2013-Sep-20 09:11:37 4171702.96263 872122.89897 4730018.84735 11.80801 48.17149 542.53900 0.38899 -0.43148 17.94835 2.20195 -4.02755 8.95281 7 3 4 2.38 -2013-Sep-20 09:11:37 4171698.45328 872122.05874 4730015.58370 11.80801 48.17150 537.04878 0.48930 0.80911 12.45813 2.30226 -2.78696 3.46259 7 3 4 2.38 -2013-Sep-20 09:11:37 4171694.86074 872120.85417 4730011.98381 11.80801 48.17151 531.85678 0.04538 1.21232 7.26613 1.85834 -2.38374 -1.72940 7 3 4 2.38 -2013-Sep-20 09:11:37 4171698.16079 872123.11351 4730014.34445 11.80803 48.17150 536.07837 1.58161 0.03515 11.48772 3.39457 -3.56091 2.49218 7 3 4 2.38 -2013-Sep-20 09:11:37 4171697.67216 872122.75126 4730012.57389 11.80802 48.17149 534.39064 1.32701 -0.73402 9.79999 3.13997 -4.33008 0.80445 7 3 4 2.38 -2013-Sep-20 09:11:37 4171694.36918 872121.78246 4730010.44551 11.80802 48.17150 530.51632 1.05461 0.40340 5.92567 2.86757 -3.19266 -3.06987 7 3 4 2.38 -2013-Sep-20 09:11:37 4171697.53091 872123.01992 4730013.18609 11.80803 48.17150 534.79128 1.61889 -0.26367 10.20062 3.43185 -3.85973 1.20509 7 3 4 2.38 -2013-Sep-20 09:11:37 4171692.58084 872120.04686 4730007.38116 11.80800 48.17150 526.82867 -0.27831 -0.07120 2.23801 1.53465 -3.66726 -6.75752 7 3 4 2.38 -2013-Sep-20 09:11:37 4171697.22903 872123.06997 4730013.30691 11.80803 48.17150 534.69107 1.72966 0.02946 10.10042 3.54262 -3.56661 1.10488 7 3 4 2.38 -2013-Sep-20 09:11:37 4171702.00159 872124.81621 4730018.74878 11.80804 48.17150 542.09984 2.46232 -0.08861 17.50919 4.27528 -3.68467 8.51365 7 3 4 2.38 -2013-Sep-20 09:11:37 4171699.03849 872122.26550 4730014.44172 11.80801 48.17149 536.60808 0.57194 -0.41085 12.01742 2.38490 -4.00691 3.02189 7 3 4 2.38 -2013-Sep-20 09:11:37 4171698.33644 872122.90021 4730015.37846 11.80802 48.17150 536.93441 1.33687 0.62915 12.34376 3.14983 -2.96691 3.34822 7 3 4 2.38 -2013-Sep-20 09:11:37 4171696.92941 872120.61157 4730013.48427 11.80800 48.17150 534.29215 -0.61541 0.74113 9.70149 1.19755 -2.85493 0.70596 7 3 4 2.38 -2013-Sep-20 09:11:38 4171694.83003 872120.11307 4730012.00876 11.80800 48.17151 531.75419 -0.67375 1.36436 7.16353 1.13921 -2.23170 -1.83200 7 3 4 2.38 -2013-Sep-20 09:11:38 4171694.29561 872119.66756 4730012.90690 11.80799 48.17152 532.01377 -1.00048 2.42105 7.42311 0.81248 -1.17501 -1.57242 7 3 4 2.38 -2013-Sep-20 09:11:38 4171695.78459 872120.74693 4730014.06901 11.80800 48.17152 533.99900 -0.24865 1.94546 9.40834 1.56431 -1.65060 0.41281 7 3 4 2.38 -2013-Sep-20 09:11:38 4171695.17829 872121.34806 4730014.52255 11.80801 48.17152 534.02320 0.46383 2.59849 9.43255 2.27679 -0.99757 0.43701 7 3 4 2.38 -2013-Sep-20 09:11:38 4171695.80358 872122.35036 4730013.77441 11.80802 48.17151 534.01070 1.31697 1.49064 9.42004 3.12993 -2.10542 0.42451 7 3 4 2.38 -2013-Sep-20 09:11:38 4171699.41036 872121.69219 4730014.61764 11.80800 48.17149 536.90368 -0.06534 -0.47734 12.31303 1.74763 -4.07340 3.31749 7 3 4 2.38 -2013-Sep-20 09:11:38 4171700.28814 872122.43242 4730014.60054 11.80801 48.17149 537.56496 0.47960 -1.24185 12.97430 2.29256 -4.83791 3.97877 7 3 4 2.38 -2013-Sep-20 09:11:38 4171699.79749 872122.58613 4730014.21584 11.80802 48.17149 536.97899 0.73046 -1.16398 12.38834 2.54343 -4.76004 3.39280 7 3 4 2.38 -2013-Sep-20 09:11:38 4171699.66989 872122.71737 4730015.47941 11.80802 48.17150 537.85515 0.88504 -0.24824 13.26449 2.69800 -3.84431 4.26896 7 3 4 2.38 -2013-Sep-20 09:11:38 4171697.21377 872123.15776 4730014.82130 11.80803 48.17151 535.82153 1.81871 1.03715 11.23087 3.63167 -2.55892 2.23534 7 3 4 2.38 -2013-Sep-20 09:11:38 4171699.69550 872122.49414 4730015.72594 11.80801 48.17150 538.02510 0.66129 -0.06847 13.43445 2.47426 -3.66453 4.43891 7 3 4 2.38 -2013-Sep-20 09:11:38 4171697.25407 872120.78000 4730013.58386 11.80800 48.17150 534.60127 -0.51698 0.54507 10.01062 1.29598 -3.05099 1.01508 7 3 4 2.38 -2013-Sep-20 09:11:38 4171698.16324 872120.67313 4730016.30488 11.80799 48.17151 537.20774 -0.80763 1.71289 12.61709 1.00533 -1.88317 3.62155 7 3 4 2.38 -2013-Sep-20 09:11:38 4171697.97309 872120.26700 4730015.56609 11.80799 48.17151 536.47768 -1.16626 1.42081 11.88703 0.64670 -2.17525 2.89149 7 3 4 2.38 -2013-Sep-20 09:11:38 4171698.82470 872120.58311 4730015.21194 11.80799 48.17150 536.81285 -1.03111 0.51528 12.22219 0.78185 -3.08078 3.22666 7 3 4 2.38 -2013-Sep-20 09:11:38 4171694.43013 872119.04176 4730011.61351 11.80798 48.17151 531.05241 -1.64056 1.55579 6.46176 0.17240 -2.04027 -2.53378 7 3 4 2.38 -2013-Sep-20 09:11:38 4171695.84638 872119.56749 4730012.40505 11.80799 48.17151 532.63849 -1.41578 0.97053 8.04783 0.39718 -2.62553 -0.94770 7 3 4 2.38 -2013-Sep-20 09:11:38 4171697.41641 872119.98976 4730016.13799 11.80799 48.17152 536.50260 -1.32372 2.25051 11.91194 0.48924 -1.34555 2.91641 7 3 4 2.38 -2013-Sep-20 09:11:38 4171699.76849 872120.99660 4730019.67286 11.80799 48.17152 540.80940 -0.81950 2.73886 16.21875 0.99346 -0.85720 7.22322 7 3 4 2.38 -2013-Sep-20 09:11:38 4171694.59151 872118.85066 4730013.62077 11.80798 48.17152 532.62738 -1.86064 2.80588 8.03673 -0.04768 -0.79018 -0.95880 7 3 4 2.38 -2013-Sep-20 09:11:38 4171694.13454 872119.45492 4730012.78140 11.80799 48.17152 531.78609 -1.17566 2.48726 7.19543 0.63730 -1.10880 -1.80010 7 3 4 2.38 -2013-Sep-20 09:11:38 4171696.24993 872121.46734 4730014.67759 11.80801 48.17151 534.85456 0.36130 1.90207 10.26391 2.17426 -1.69400 1.26837 7 3 4 2.38 -2013-Sep-20 09:11:38 4171699.76420 872121.32297 4730017.51433 11.80800 48.17151 539.24273 -0.49915 1.25269 14.65208 1.31381 -2.34337 5.65654 7 3 4 2.38 -2013-Sep-20 09:11:38 4171698.01040 872122.58019 4730017.73545 11.80802 48.17152 538.43420 1.09035 2.48763 13.84354 2.90331 -1.10843 4.84801 7 3 4 2.38 -2013-Sep-20 09:11:38 4171697.67112 872121.11745 4730014.13566 11.80800 48.17150 535.33073 -0.27201 0.55742 10.74008 1.54095 -3.03864 1.74454 7 3 4 2.38 -2013-Sep-20 09:11:39 4171693.79715 872119.40079 4730011.39850 11.80799 48.17151 530.52799 -1.15961 1.81934 5.93734 0.65335 -1.77672 -3.05820 7 3 4 2.38 -2013-Sep-20 09:11:39 4171692.08147 872118.93678 4730010.56863 11.80799 48.17152 528.72632 -1.26271 2.58803 4.13566 0.55024 -1.00803 -4.85987 7 3 4 2.38 -2013-Sep-20 09:11:39 4171690.16639 872119.31617 4730010.17264 11.80800 48.17153 527.23288 -0.49946 3.66290 2.64223 1.31350 0.06685 -6.35331 7 3 4 2.38 -2013-Sep-20 09:11:39 4171692.21881 872119.84399 4730011.10044 11.80800 48.17152 529.33606 -0.40281 2.70419 4.74540 1.41015 -0.89187 -4.25013 7 3 4 2.38 -2013-Sep-20 09:11:39 4171691.87990 872117.85327 4730010.63123 11.80797 48.17152 528.49351 -2.28204 2.94201 3.90285 -0.46909 -0.65405 -5.09268 7 3 4 2.38 -2013-Sep-20 09:11:39 4171696.55132 872119.18229 4730014.96199 11.80798 48.17152 534.95139 -1.93707 2.22034 10.36073 -0.12411 -1.37572 1.36520 7 3 4 2.38 -2013-Sep-20 09:11:39 4171695.05237 872118.76362 4730013.87209 11.80798 48.17152 533.10361 -2.04015 2.65062 8.51296 -0.22719 -0.94545 -0.48258 7 3 4 2.38 -2013-Sep-20 09:11:39 4171695.87467 872119.95571 4730014.95823 11.80799 48.17152 534.61243 -1.04156 2.59343 10.02177 0.77140 -1.00263 1.02624 7 3 4 2.38 -2013-Sep-20 09:11:39 4171694.16429 872117.99137 4730012.43457 11.80797 48.17152 531.34734 -2.61433 2.45743 6.75668 -0.80137 -1.13863 -2.23885 7 3 4 2.38 -2013-Sep-20 09:11:39 4171695.76512 872119.78539 4730014.68413 11.80799 48.17152 534.31342 -1.18585 2.51651 9.72277 0.62711 -1.07955 0.72724 7 3 4 2.38 -2013-Sep-20 09:11:39 4171696.20366 872119.20794 4730013.69935 11.80798 48.17151 533.78709 -1.84083 1.62794 9.19644 -0.02787 -1.96813 0.20090 7 3 4 2.38 -2013-Sep-20 09:11:39 4171698.78340 872120.28432 4730018.09366 11.80799 48.17152 538.89241 -1.31512 2.51279 14.30176 0.49784 -1.08328 5.30622 7 3 4 2.38 -2013-Sep-20 09:11:39 4171693.86027 872118.25440 4730012.53331 11.80797 48.17152 531.25835 -2.29466 2.70491 6.66769 -0.48170 -0.89115 -2.32784 7 3 4 2.38 -2013-Sep-20 09:11:39 4171694.06245 872118.48650 4730013.59975 11.80798 48.17153 532.21666 -2.10883 3.23327 7.62600 -0.29587 -0.36279 -1.36953 7 3 4 2.38 -2013-Sep-20 09:11:39 4171695.31115 872119.04283 4730015.42568 11.80798 48.17153 534.46830 -1.81980 3.45539 9.87764 -0.00684 -0.14067 0.88211 7 3 4 2.38 -2013-Sep-20 09:11:39 4171693.04180 872118.02664 4730012.21014 11.80797 48.17153 530.45217 -2.35010 3.12109 5.86151 -0.53714 -0.47497 -3.13402 7 3 4 2.38 -2013-Sep-20 09:11:39 4171692.17508 872118.54262 4730012.68151 11.80798 48.17153 530.30803 -1.66769 3.98894 5.71738 0.14527 0.39288 -3.27816 7 3 4 2.38 -2013-Sep-20 09:11:39 4171694.61132 872119.91889 4730015.43289 11.80799 48.17153 534.13639 -0.81908 3.83706 9.54573 0.99388 0.24100 0.55020 7 3 4 2.38 -2013-Sep-20 09:11:39 4171696.15203 872119.93442 4730016.20250 11.80799 48.17153 535.71774 -1.11915 3.22418 11.12709 0.69381 -0.37188 2.13155 7 3 4 2.38 -2013-Sep-20 09:11:39 4171695.44371 872117.84380 4730014.88587 11.80797 48.17153 533.98897 -3.02059 3.18153 9.39831 -1.20763 -0.41453 0.40278 7 3 4 2.38 -2013-Sep-20 09:11:39 4171696.30208 872118.95604 4730014.86039 11.80798 48.17152 534.68210 -2.10753 2.36886 10.09145 -0.29457 -1.22720 1.09592 7 3 4 2.38 -2013-Sep-20 09:11:39 4171698.60622 872120.97748 4730017.56997 11.80800 48.17152 538.48111 -0.60038 2.18708 13.89046 1.21259 -1.40898 4.89493 7 3 4 2.38 -2013-Sep-20 09:11:39 4171697.45801 872118.92845 4730016.51467 11.80797 48.17152 536.66559 -2.37108 2.63321 12.07494 -0.55812 -0.96286 3.07941 7 3 4 2.38 -2013-Sep-20 09:11:39 4171695.72625 872119.64693 4730013.85104 11.80799 48.17152 533.64838 -1.31343 2.01038 9.05773 0.49953 -1.58568 0.06219 7 3 4 2.38 -2013-Sep-20 09:11:39 4171696.32005 872120.51919 4730013.86689 11.80800 48.17151 534.16686 -0.58114 1.45484 9.57620 1.23182 -2.14122 0.58067 7 3 4 2.38 -2013-Sep-20 09:11:40 4171695.33687 872118.75088 4730013.43363 11.80798 48.17152 532.96088 -2.11084 2.15264 8.37023 -0.29788 -1.44342 -0.62531 7 3 4 2.38 -2013-Sep-20 09:11:40 4171694.68260 872118.20552 4730014.53494 11.80797 48.17153 533.27999 -2.51078 3.44747 8.68934 -0.69782 -0.14859 -0.30620 7 3 4 2.38 -2013-Sep-20 09:11:40 4171694.06620 872117.71535 4730014.07924 11.80797 48.17153 532.47115 -2.86444 3.66789 7.88050 -1.05148 0.07183 -1.11503 7 3 4 2.38 -2013-Sep-20 09:11:40 4171694.39674 872117.51677 4730014.24135 11.80796 48.17153 532.78062 -3.12645 3.56520 8.18997 -1.31350 -0.03086 -0.80557 7 3 4 2.38 -2013-Sep-20 09:11:40 4171694.80846 872118.27311 4730015.16754 11.80797 48.17153 533.84276 -2.47036 3.76725 9.25210 -0.65740 0.17119 0.25657 7 3 4 2.38 -2013-Sep-20 09:11:40 4171693.79398 872118.40667 4730015.70730 11.80798 48.17154 533.60094 -2.13204 4.84680 9.01028 -0.31908 1.25073 0.01475 7 3 4 2.38 -2013-Sep-20 09:11:40 4171691.52330 872117.94043 4730013.40438 11.80798 48.17154 530.33902 -2.12376 5.03824 5.74836 -0.31080 1.44218 -3.24717 7 3 4 2.38 -2013-Sep-20 09:11:40 4171687.46651 872116.76168 4730010.21652 11.80797 48.17155 525.15451 -2.44741 6.05091 0.56385 -0.63445 2.45486 -8.43168 7 3 4 2.38 -2013-Sep-20 09:11:40 4171688.87934 872117.39717 4730010.33489 11.80798 48.17154 526.25172 -2.11448 5.00247 1.66106 -0.30152 1.40641 -7.33447 7 3 4 2.38 -2013-Sep-20 09:11:40 4171691.57456 872117.85122 4730012.30358 11.80798 48.17154 529.54006 -2.22157 4.28033 4.94940 -0.40861 0.68427 -4.04613 7 3 4 2.38 -2013-Sep-20 09:11:40 4171692.99793 872119.69936 4730013.52572 11.80800 48.17153 531.63210 -0.70381 3.77540 7.04145 1.10915 0.17934 -1.95409 7 3 4 2.38 -2013-Sep-20 09:11:40 4171695.73595 872119.86307 4730015.18328 11.80799 48.17152 534.67692 -1.10385 2.85882 10.08627 0.70911 -0.73724 1.09073 7 3 4 2.38 -2013-Sep-20 09:11:40 4171697.73933 872120.51530 4730018.24373 11.80799 48.17153 538.35420 -0.87538 3.33917 13.76355 0.93758 -0.25689 4.76801 7 3 4 2.38 -2013-Sep-20 09:11:40 4171698.66937 872121.08516 4730017.61373 11.80800 48.17152 538.56965 -0.50790 2.15379 13.97899 1.30507 -1.44228 4.98346 7 3 4 2.38 -2013-Sep-20 09:11:40 4171699.90232 872120.94129 4730018.61923 11.80799 48.17152 540.10411 -0.90102 1.94701 15.51346 0.91194 -1.64906 6.51792 7 3 4 2.38 -2013-Sep-20 09:11:40 4171695.14191 872119.32307 4730013.24628 11.80799 48.17152 532.77210 -1.51086 2.08265 8.18145 0.30210 -1.51341 -0.81409 7 3 4 2.38 -2013-Sep-20 09:11:40 4171693.83963 872117.89918 4730011.28914 11.80797 48.17152 530.26931 -2.63813 1.94439 5.67866 -0.82517 -1.65167 -3.31688 7 3 4 2.38 -2013-Sep-20 09:11:40 4171693.45120 872117.75738 4730012.00099 11.80797 48.17152 530.52683 -2.69744 2.72405 5.93617 -0.88449 -0.87201 -3.05936 7 3 4 2.38 -2013-Sep-20 09:11:40 4171696.17673 872119.11094 4730016.47948 11.80798 48.17153 535.82787 -1.93026 3.51645 11.23721 -0.11730 -0.07961 2.24168 7 3 4 2.38 -2013-Sep-20 09:11:40 4171694.28757 872118.42380 4730013.85877 11.80798 48.17153 532.54806 -2.21628 3.25137 7.95741 -0.40332 -0.34469 -1.03812 7 3 4 2.38 -2013-Sep-20 09:11:40 4171694.33180 872119.00660 4730017.03950 11.80798 48.17154 535.02657 -1.65486 5.25149 10.43592 0.15810 1.65543 1.44039 7 3 4 2.38 -2013-Sep-20 09:11:40 4171696.78354 872119.58199 4730017.33727 11.80798 48.17153 536.92745 -1.59335 3.57409 12.33679 0.21961 -0.02197 3.34126 7 3 4 2.38 -2013-Sep-20 09:11:40 4171695.68705 872119.92995 4730014.88622 11.80799 48.17152 534.43277 -1.02838 2.68618 9.84212 0.78458 -0.90989 0.84658 7 3 4 2.38 -2013-Sep-20 09:11:40 4171694.22509 872117.83827 4730013.24941 11.80797 48.17152 531.97331 -2.77663 2.97985 7.38266 -0.96367 -0.61622 -1.61287 7 3 4 2.38 -2013-Sep-20 09:11:40 4171689.96012 872116.83412 4730008.65859 11.80797 48.17153 525.63132 -2.88678 3.18209 1.04066 -1.07382 -0.41396 -7.95487 7 3 4 2.38 -2013-Sep-20 09:11:41 4171691.38027 872116.65118 4730010.70121 11.80796 48.17153 528.05545 -3.35645 3.53639 3.46480 -1.54350 -0.05967 -5.53073 7 3 4 2.38 -2013-Sep-20 09:11:41 4171694.48496 872118.35256 4730014.77576 11.80797 48.17153 533.35049 -2.32640 3.72981 8.75983 -0.51344 0.13375 -0.23570 7 3 4 2.38 -2013-Sep-20 09:11:41 4171695.15594 872119.22320 4730014.74376 11.80798 48.17153 533.88346 -1.61149 3.08631 9.29281 0.20147 -0.50975 0.29728 7 3 4 2.38 -2013-Sep-20 09:11:41 4171694.36281 872118.11227 4730012.24363 11.80797 48.17152 531.35115 -2.53661 2.16685 6.76050 -0.72365 -1.42921 -2.23504 7 3 4 2.38 -2013-Sep-20 09:11:41 4171697.55286 872117.95070 4730015.08511 11.80796 48.17151 535.52886 -3.34756 1.75974 10.93820 -1.53459 -1.83632 1.94267 7 3 4 2.38 -2013-Sep-20 09:11:41 4171695.39658 872118.61666 4730013.68242 11.80798 48.17152 533.16693 -2.25444 2.29548 8.57627 -0.44148 -1.30059 -0.41926 7 3 4 2.38 -2013-Sep-20 09:11:41 4171696.61744 872118.19582 4730016.00506 11.80797 48.17152 535.63716 -2.91620 3.01815 11.04651 -1.10324 -0.57791 2.05097 7 3 4 2.38 -2013-Sep-20 09:11:41 4171697.99483 872117.76112 4730017.54330 11.80796 48.17153 537.62320 -3.62356 3.10565 13.03255 -1.81060 -0.49041 4.03701 7 3 4 2.38 -2013-Sep-20 09:11:41 4171697.22129 872118.55258 4730015.78005 11.80797 48.17152 535.91237 -2.69055 2.37326 11.32171 -0.87759 -1.22280 2.32618 7 3 4 2.38 -2013-Sep-20 09:11:41 4171695.01079 872117.79503 4730017.05893 11.80797 48.17154 535.31895 -2.97973 4.95395 10.72829 -1.16677 1.35788 1.73276 7 3 4 2.38 -2013-Sep-20 09:11:41 4171695.93041 872119.29437 4730016.21431 11.80798 48.17153 535.49452 -1.70031 3.49130 10.90386 0.11265 -0.10476 1.90833 7 3 4 2.38 -2013-Sep-20 09:11:41 4171695.56906 872119.77451 4730017.03642 11.80799 48.17154 535.93675 -1.15638 4.22991 11.34609 0.65658 0.63385 2.35056 7 3 4 2.38 -2013-Sep-20 09:11:41 4171693.12963 872118.09894 4730014.50123 11.80797 48.17154 532.22656 -2.29731 4.57394 7.63590 -0.48435 0.97788 -1.35963 7 3 4 2.38 -2013-Sep-20 09:11:41 4171696.52198 872120.82464 4730016.38005 11.80800 48.17152 536.21302 -0.32347 2.93702 11.62237 1.48949 -0.65904 2.62684 7 3 4 2.38 -2013-Sep-20 09:11:41 4171691.34314 872119.34149 4730010.42458 11.80800 48.17152 528.19223 -0.71548 2.96876 3.60158 1.09748 -0.62729 -5.39395 7 3 4 2.38 -2013-Sep-20 09:11:41 4171690.38503 872117.03700 4730009.77749 11.80797 48.17153 526.77012 -2.77514 3.58744 2.17947 -0.96218 -0.00862 -6.81607 7 3 4 2.38 -2013-Sep-20 09:11:41 4171689.38901 872116.05489 4730009.12805 11.80796 48.17153 525.50198 -3.53265 4.03055 0.91132 -1.71970 0.43450 -8.08421 7 3 4 2.38 -2013-Sep-20 09:11:41 4171692.10762 872115.88953 4730012.13024 11.80795 48.17153 529.49116 -4.25083 4.07504 4.90050 -2.43787 0.47898 -4.09503 7 3 4 2.38 -2013-Sep-20 09:11:41 4171693.73028 872116.71035 4730012.32584 11.80795 48.17152 530.80818 -3.77943 2.89680 6.21752 -1.96647 -0.69926 -2.77801 7 3 4 2.38 -2013-Sep-20 09:11:41 4171695.88788 872117.94738 4730015.89837 11.80797 48.17153 535.04751 -3.01009 3.51701 10.45686 -1.19713 -0.07906 1.46132 7 3 4 2.38 -2013-Sep-20 09:11:41 4171696.59137 872116.51166 4730015.39974 11.80794 48.17152 534.93926 -4.55938 2.89029 10.34860 -2.74642 -0.70578 1.35307 7 3 4 2.38 -2013-Sep-20 09:11:41 4171694.75802 872117.46824 4730015.97118 11.80796 48.17154 534.29881 -3.24789 4.46272 9.70816 -1.43493 0.86665 0.71262 7 3 4 2.38 -2013-Sep-20 09:11:41 4171695.06116 872118.25049 4730016.81629 11.80797 48.17154 535.23318 -2.54422 4.68594 10.64252 -0.73126 1.08988 1.64699 7 3 4 2.38 -2013-Sep-20 09:11:41 4171695.29744 872117.66510 4730016.27334 11.80796 48.17154 534.90296 -3.16558 4.24077 10.31230 -1.35262 0.64471 1.31677 7 3 4 2.38 -2013-Sep-20 09:11:41 4171692.03997 872115.19745 4730012.67715 11.80794 48.17154 529.76008 -4.91442 4.59465 5.16942 -3.10146 0.99859 -3.82611 7 3 4 2.38 -2013-Sep-20 09:11:42 4171691.69622 872114.23758 4730012.73861 11.80793 48.17154 529.45048 -5.78363 5.03273 4.85982 -3.97067 1.43667 -4.13571 7 3 4 2.38 -2013-Sep-20 09:11:42 4171695.00838 872115.54893 4730015.26337 11.80794 48.17153 533.67290 -5.17781 4.10073 9.08224 -3.36485 0.50467 0.08671 7 3 4 2.38 -2013-Sep-20 09:11:42 4171699.50719 872122.00144 4730017.06109 11.80801 48.17151 538.82981 0.21755 1.03442 14.23916 2.03051 -2.56164 5.24362 7 3 4 2.38 -2013-Sep-20 09:11:42 4171700.05510 872123.05700 4730014.20350 11.80802 48.17148 537.20222 1.13865 -1.43190 12.61157 2.95161 -5.02796 3.61603 7 3 4 2.38 -2013-Sep-20 09:11:42 4171702.86397 872123.27704 4730016.61287 11.80802 48.17148 540.86118 0.77925 -1.90735 16.27053 2.59221 -5.50342 7.27499 7 3 4 2.38 -2013-Sep-20 09:11:42 4171702.46330 872123.85432 4730016.19581 11.80802 48.17148 540.36764 1.42631 -1.98128 15.77699 3.23927 -5.57735 6.78145 7 3 4 2.38 -2013-Sep-20 09:11:42 4171702.92321 872124.25454 4730017.67412 11.80803 48.17149 541.82404 1.72394 -1.39186 17.23339 3.53691 -4.98793 8.23785 7 3 4 2.38 -2013-Sep-20 09:11:42 4171698.55279 872121.74361 4730012.80693 11.80801 48.17149 535.00164 0.16048 -1.06726 10.41099 1.97344 -4.66332 1.41545 7 3 4 2.38 -2013-Sep-20 09:11:42 4171698.56858 872122.85636 4730014.22743 11.80802 48.17149 536.22229 1.24645 -0.30111 11.63163 3.05941 -3.89718 2.63610 7 3 4 2.38 -2013-Sep-20 09:11:42 4171698.63660 872122.01350 4730013.73672 11.80801 48.17149 535.78601 0.40750 -0.54946 11.19536 2.22047 -4.14552 2.19982 7 3 4 2.38 -2013-Sep-20 09:11:42 4171695.47402 872120.96570 4730010.91597 11.80801 48.17150 531.47665 0.02905 0.03585 6.88600 1.84201 -3.56021 -2.10954 7 3 4 2.38 -2013-Sep-20 09:11:42 4171699.36836 872123.58556 4730014.99974 11.80803 48.17149 537.41937 1.79656 -0.48059 12.82872 3.60952 -4.07665 3.83318 7 3 4 2.38 -2013-Sep-20 09:11:42 4171697.58076 872122.67576 4730013.87027 11.80802 48.17150 535.28666 1.27181 0.20873 10.69601 3.08478 -3.38733 1.70047 7 3 4 2.38 -2013-Sep-20 09:11:42 4171696.03990 872120.80185 4730012.23244 11.80800 48.17150 532.80465 -0.24713 0.52606 8.21399 1.56583 -3.07000 -0.78154 7 3 4 2.38 -2013-Sep-20 09:11:42 4171694.05788 872120.73886 4730009.97158 11.80801 48.17150 529.81754 0.09680 0.47353 5.22689 1.90976 -3.12253 -3.76865 7 3 4 2.38 -2013-Sep-20 09:11:42 4171698.53561 872123.88715 4730014.99414 11.80804 48.17150 536.91274 2.26217 0.07708 12.32209 4.07513 -3.51898 3.32655 7 3 4 2.38 -2013-Sep-20 09:11:42 4171695.42063 872120.97375 4730009.95379 11.80801 48.17149 530.72593 0.04785 -0.56811 6.13528 1.86081 -4.16417 -2.86026 7 3 4 2.38 -2013-Sep-20 09:11:42 4171698.07027 872120.71496 4730013.70568 11.80800 48.17150 535.21598 -0.74767 0.04091 10.62532 1.06529 -3.55515 1.62979 7 3 4 2.38 -2013-Sep-20 09:11:42 4171701.26008 872121.99655 4730019.84528 11.80800 48.17151 542.04805 -0.14594 1.61344 17.45739 1.66703 -1.98263 8.46186 7 3 4 2.38 -2013-Sep-20 09:11:42 4171699.49519 872120.46778 4730015.50319 11.80799 48.17150 537.45182 -1.28120 0.23806 12.86117 0.53177 -3.35801 3.86564 7 3 4 2.38 -2013-Sep-20 09:11:42 4171697.62291 872119.52208 4730012.74119 11.80798 48.17150 534.04247 -1.82376 -0.09413 9.45181 -0.01080 -3.69019 0.45628 7 3 4 2.38 -2013-Sep-20 09:11:42 4171694.62236 872117.78011 4730012.59924 11.80797 48.17152 531.74024 -2.91485 2.26535 7.14958 -1.10190 -1.33071 -1.84595 7 3 4 2.38 -2013-Sep-20 09:11:42 4171693.65536 872120.88448 4730012.01297 11.80801 48.17152 531.09578 0.32171 2.10632 6.50513 2.13467 -1.48974 -2.49041 7 3 4 2.38 -2013-Sep-20 09:11:42 4171698.21532 872121.54179 4730013.42874 11.80801 48.17149 535.21714 0.03199 -0.37566 10.62649 1.84495 -3.97172 1.63095 7 3 4 2.38 -2013-Sep-20 09:11:42 4171697.70221 872121.88561 4730014.48438 11.80801 48.17150 535.71571 0.47353 0.65018 11.12506 2.28649 -2.94588 2.12952 7 3 4 2.38 -2013-Sep-20 09:11:43 4171698.97632 872123.21397 4730017.21291 11.80803 48.17151 538.76187 1.51305 1.33799 14.17122 3.32602 -2.25808 5.17568 7 3 4 2.38 -2013-Sep-20 09:11:43 4171696.85572 872122.71205 4730013.22186 11.80803 48.17150 534.33515 1.45570 0.29960 9.74450 3.26866 -3.29646 0.74896 7 3 4 2.38 -2013-Sep-20 09:11:43 4171696.42934 872121.11511 4730013.79256 11.80801 48.17151 534.26414 -0.02019 1.23469 9.67348 1.79277 -2.36137 0.67795 7 3 4 2.38 -2013-Sep-20 09:11:43 4171698.56946 872121.85359 4730017.01072 11.80801 48.17151 538.15996 0.26472 1.70734 13.56931 2.07768 -1.88873 4.57377 7 3 4 2.38 -2013-Sep-20 09:11:43 4171696.55399 872121.21738 4730013.93058 11.80801 48.17151 534.46232 0.05440 1.22023 9.87166 1.86736 -2.37584 0.87613 7 3 4 2.38 -2013-Sep-20 09:11:43 4171696.31907 872121.98156 4730013.79148 11.80802 48.17151 534.30960 0.85049 1.18228 9.71894 2.66345 -2.41378 0.72341 7 3 4 2.38 -2013-Sep-20 09:11:43 4171696.80005 872123.09704 4730014.63144 11.80803 48.17151 535.40169 1.84394 1.22155 10.81104 3.65690 -2.37451 1.81550 7 3 4 2.38 -2013-Sep-20 09:11:43 4171693.03799 872122.24869 4730010.30908 11.80803 48.17151 529.60930 1.78338 1.21226 5.01864 3.59634 -2.38380 -3.97689 7 3 4 2.38 -2013-Sep-20 09:11:43 4171693.81796 872120.83701 4730010.44067 11.80801 48.17151 530.02385 0.24197 0.94639 5.43320 2.05493 -2.64967 -3.56233 7 3 4 2.38 -2013-Sep-20 09:11:43 4171694.21596 872120.72049 4730010.56374 11.80801 48.17150 530.35948 0.04647 0.75594 5.76882 1.85943 -2.84012 -3.22671 7 3 4 2.38 -2013-Sep-20 09:11:43 4171692.16679 872119.68621 4730009.92033 11.80800 48.17152 528.40121 -0.54660 1.97917 3.81056 1.26636 -1.61689 -5.18498 7 3 4 2.38 -2013-Sep-20 09:11:43 4171692.27281 872120.21499 4730009.08908 11.80800 48.17151 527.92318 -0.05070 1.26685 3.33253 1.76226 -2.32921 -5.66301 7 3 4 2.38 -2013-Sep-20 09:11:43 4171695.36635 872121.38607 4730012.84612 11.80801 48.17151 532.90197 0.46255 1.33751 8.31132 2.27551 -2.25855 -0.68422 7 3 4 2.38 -2013-Sep-20 09:11:43 4171696.26085 872123.52719 4730014.68452 11.80804 48.17151 535.14796 2.37532 1.58464 10.55731 4.18828 -2.01142 1.56177 7 3 4 2.38 -2013-Sep-20 09:11:43 4171697.76869 872122.52374 4730015.07427 11.80802 48.17151 536.28575 1.08456 0.89779 11.69510 2.89752 -2.69828 2.69956 7 3 4 2.38 -2013-Sep-20 09:11:43 4171700.38135 872122.61149 4730017.36812 11.80801 48.17150 539.71249 0.63581 0.50857 15.12184 2.44878 -3.08749 6.12630 7 3 4 2.38 -2013-Sep-20 09:11:43 4171698.41908 872121.91985 4730015.78451 11.80801 48.17151 537.15713 0.36035 0.98915 12.56648 2.17331 -2.60691 3.57094 7 3 4 2.38 -2013-Sep-20 09:11:43 4171697.57350 872121.72657 4730015.50262 11.80801 48.17151 536.36872 0.34419 1.44738 11.77806 2.15715 -2.14869 2.78253 7 3 4 2.38 -2013-Sep-20 09:11:43 4171697.19139 872121.37009 4730014.50789 11.80801 48.17151 535.32942 0.07345 1.11704 10.73876 1.88641 -2.47902 1.74323 7 3 4 2.38 -2013-Sep-20 09:11:43 4171696.55256 872120.62970 4730012.92228 11.80800 48.17150 533.62984 -0.52055 0.63844 9.03919 1.29241 -2.95762 0.04366 7 3 4 2.38 -2013-Sep-20 09:11:43 4171696.00737 872121.68610 4730013.47920 11.80801 48.17151 533.83310 0.62506 1.24642 9.24245 2.43802 -2.34964 0.24691 7 3 4 2.38 -2013-Sep-20 09:11:43 4171698.02769 872122.71453 4730016.32578 11.80802 48.17151 537.41342 1.21831 1.51442 12.82276 3.03127 -2.08164 3.82723 7 3 4 2.38 -2013-Sep-20 09:11:43 4171695.51216 872121.87054 4730013.65028 11.80802 48.17151 533.66248 0.90693 1.69358 9.07183 2.71989 -1.90248 0.07630 7 3 4 2.38 -2013-Sep-20 09:11:43 4171694.11996 872121.87562 4730013.28058 11.80802 48.17152 532.47889 1.19679 2.46169 7.88823 3.00975 -1.13437 -1.10730 7 3 4 2.38 -2013-Sep-20 09:11:43 4171696.32565 872122.41884 4730016.65483 11.80802 48.17152 536.50717 1.27716 3.02038 11.91652 3.09012 -0.57568 2.92098 7 3 4 2.38 -2013-Sep-20 09:11:44 4171701.72617 872123.74264 4730020.76439 11.80803 48.17151 543.27546 1.46783 1.62019 18.68481 3.28079 -1.97587 9.68927 7 3 4 2.38 -2013-Sep-20 09:11:44 4171699.69382 872123.25741 4730017.85349 11.80802 48.17151 539.71350 1.40876 1.23524 15.12284 3.22172 -2.36082 6.12731 7 3 4 2.38 -2013-Sep-20 09:11:44 4171699.96868 872123.80145 4730018.80916 11.80803 48.17151 540.67928 1.88503 1.58915 16.08862 3.69800 -2.00692 7.09309 7 3 4 2.38 -2013-Sep-20 09:11:44 4171698.46443 872122.88125 4730017.60887 11.80802 48.17152 538.67736 1.29212 2.02615 14.08670 3.10509 -1.56992 5.09117 7 3 4 2.38 -2013-Sep-20 09:11:44 4171699.82504 872121.57159 4730018.33994 11.80800 48.17151 539.93157 -0.26825 1.72100 15.34092 1.54471 -1.87506 6.34538 7 3 4 2.38 -2013-Sep-20 09:11:44 4171700.84983 872122.18664 4730018.04104 11.80801 48.17150 540.46176 0.12408 0.68043 15.87110 1.93704 -2.91564 6.87557 7 3 4 2.38 -2013-Sep-20 09:11:44 4171700.02603 872122.20930 4730017.32739 11.80801 48.17150 539.39531 0.31484 0.80189 14.80465 2.12780 -2.79417 5.80912 7 3 4 2.38 -2013-Sep-20 09:11:44 4171700.88321 872123.24985 4730018.35492 11.80802 48.17150 540.86252 1.15796 0.70329 16.27187 2.97093 -2.89277 7.27633 7 3 4 2.38 -2013-Sep-20 09:11:44 4171699.83229 872121.74728 4730019.16219 11.80800 48.17152 540.57298 -0.09775 2.23729 15.98232 1.71521 -1.35877 6.98679 7 3 4 2.38 -2013-Sep-20 09:11:44 4171700.22968 872121.74100 4730019.46993 11.80800 48.17152 541.06084 -0.18523 2.15363 16.47019 1.62774 -1.44243 7.47465 7 3 4 2.38 -2013-Sep-20 09:11:44 4171697.28353 872121.38206 4730016.80158 11.80801 48.17152 537.10033 0.06631 2.57768 12.50967 1.87927 -1.01838 3.51414 7 3 4 2.38 -2013-Sep-20 09:11:44 4171696.66765 872122.03823 4730016.49416 11.80802 48.17152 536.55877 0.83462 2.72182 11.96811 2.64758 -0.87424 2.97258 7 3 4 2.38 -2013-Sep-20 09:11:44 4171693.19642 872120.51544 4730014.10717 11.80801 48.17153 532.30631 0.05439 3.89396 7.71565 1.86734 0.29790 -1.27988 7 3 4 2.38 -2013-Sep-20 09:11:44 4171692.61581 872119.70169 4730012.42552 11.80800 48.17153 530.56317 -0.62333 3.32002 5.97252 1.18963 -0.27604 -3.02302 7 3 4 2.38 -2013-Sep-20 09:11:44 4171697.69682 872121.49580 4730017.11493 11.80801 48.17152 537.61914 0.09307 2.46787 13.02848 1.90603 -1.12819 4.03295 7 3 4 2.38 -2013-Sep-20 09:11:44 4171698.44362 872120.94650 4730015.41258 11.80800 48.17151 536.76318 -0.59743 0.87163 12.17253 1.21553 -2.72444 3.17700 7 3 4 2.38 -2013-Sep-20 09:11:44 4171697.33366 872119.76933 4730013.73028 11.80799 48.17150 534.62440 -1.52255 0.73877 10.03375 0.29041 -2.85729 1.03821 7 3 4 2.38 -2013-Sep-20 09:11:44 4171694.84682 872118.06826 4730012.21083 11.80797 48.17151 531.63666 -2.67873 1.79867 7.04600 -0.86578 -1.79739 -1.94953 7 3 4 2.38 -2013-Sep-20 09:11:44 4171698.92932 872121.20174 4730017.61631 11.80800 48.17152 538.75717 -0.44698 1.94812 14.16651 1.36598 -1.64794 5.17098 7 3 4 2.38 -2013-Sep-20 09:11:44 4171697.31480 872120.42952 4730013.96343 11.80799 48.17150 534.87592 -0.87247 0.80734 10.28527 0.94049 -2.78872 1.28973 7 3 4 2.38 -2013-Sep-20 09:11:44 4171695.54700 872119.09827 4730011.73559 11.80798 48.17151 531.88018 -1.81379 0.81398 7.28952 -0.00083 -2.78208 -1.70601 7 3 4 2.38 -2013-Sep-20 09:11:44 4171695.92415 872119.30021 4730011.71264 11.80798 48.17150 532.13684 -1.69331 0.49279 7.54618 0.11965 -3.10327 -1.44935 7 3 4 2.38 -2013-Sep-20 09:11:44 4171696.75421 872120.61532 4730012.83664 11.80800 48.17150 533.69571 -0.57588 0.43644 9.10506 1.23708 -3.15962 0.10952 7 3 4 2.38 -2013-Sep-20 09:11:44 4171697.18058 872119.80199 4730015.06296 11.80799 48.17151 535.52198 -1.45926 1.73421 10.93132 0.35370 -1.86185 1.93579 7 3 4 2.38 -2013-Sep-20 09:11:44 4171695.47432 872118.56029 4730015.20119 11.80797 48.17153 534.34169 -2.32552 3.26025 9.75103 -0.51256 -0.33582 0.75550 7 3 4 2.38 -2013-Sep-20 09:11:45 4171696.92106 872118.97485 4730014.38560 11.80798 48.17151 534.73494 -2.21579 1.59789 10.14429 -0.40283 -1.99818 1.14876 7 3 4 2.38 -2013-Sep-20 09:11:45 4171700.65103 872119.72245 4730018.41479 11.80798 48.17151 540.27419 -2.24728 1.45042 15.68353 -0.43432 -2.14564 6.68800 7 3 4 2.38 -2013-Sep-20 09:11:45 4171699.00412 872118.91495 4730015.80963 11.80797 48.17151 537.14768 -2.70068 1.03738 12.55703 -0.88772 -2.55868 3.56149 7 3 4 2.38 -2013-Sep-20 09:11:45 4171695.14395 872117.65192 4730012.45209 11.80796 48.17151 531.95358 -3.14707 1.80633 7.36292 -1.33411 -1.78973 -1.63261 7 3 4 2.38 -2013-Sep-20 09:11:45 4171695.72429 872117.61892 4730013.84708 11.80796 48.17152 533.36738 -3.29812 2.31840 8.77673 -1.48516 -1.27766 -0.21880 7 3 4 2.38 -2013-Sep-20 09:11:45 4171692.99613 872116.43126 4730011.66933 11.80795 48.17152 529.80166 -3.90238 3.03700 5.21100 -2.08942 -0.55906 -3.78453 7 3 4 2.38 -2013-Sep-20 09:11:45 4171693.67503 872117.79312 4730014.50836 11.80797 48.17154 532.54617 -2.70826 4.22753 7.95551 -0.89530 0.63147 -1.04002 7 3 4 2.38 -2013-Sep-20 09:11:45 4171692.48662 872117.98010 4730012.96774 11.80797 48.17153 530.64792 -2.28205 4.03837 6.05726 -0.46909 0.44231 -2.93827 7 3 4 2.38 -2013-Sep-20 09:11:45 4171692.44667 872118.05416 4730014.36462 11.80798 48.17154 531.67283 -2.20138 4.98780 7.08218 -0.38843 1.39174 -1.91336 7 3 4 2.38 -2013-Sep-20 09:11:45 4171695.24201 872118.44845 4730017.21097 11.80797 48.17154 535.67235 -2.38746 4.78706 11.08169 -0.57450 1.19100 2.08616 7 3 4 2.38 -2013-Sep-20 09:11:45 4171696.04418 872118.28056 4730016.91440 11.80797 48.17153 535.95210 -2.71594 4.02979 11.36144 -0.90298 0.43373 2.36591 7 3 4 2.38 -2013-Sep-20 09:11:45 4171694.47708 872119.30626 4730017.63950 11.80799 48.17155 535.60940 -1.39127 5.49997 11.01874 0.42169 1.90391 2.02321 7 3 4 2.38 -2013-Sep-20 09:11:45 4171696.35878 872116.78607 4730016.71307 11.80795 48.17153 535.80350 -4.24319 3.89395 11.21284 -2.43023 0.29789 2.21731 7 3 4 2.38 -2013-Sep-20 09:11:45 4171693.48997 872116.69908 4730015.98826 11.80796 48.17155 533.37880 -3.74129 5.51627 8.78814 -1.92833 1.92021 -0.20739 7 3 4 2.38 -2013-Sep-20 09:11:45 4171693.77693 872115.78824 4730015.74331 11.80794 48.17155 533.25930 -4.69157 5.28251 8.66865 -2.87861 1.68644 -0.32688 7 3 4 2.38 -2013-Sep-20 09:11:45 4171695.04067 872115.25115 4730016.09580 11.80793 48.17154 534.27362 -5.47590 4.67773 9.68296 -3.66294 1.08167 0.68743 7 3 4 2.38 -2013-Sep-20 09:11:45 4171695.11661 872115.64506 4730016.33873 11.80794 48.17154 534.55797 -5.10586 4.72429 9.96731 -3.29290 1.12823 0.97178 7 3 4 2.38 -2013-Sep-20 09:11:45 4171693.90853 872116.71688 4730015.53304 11.80795 48.17154 533.31527 -3.80951 4.90469 8.72461 -1.99655 1.30862 -0.27092 7 3 4 2.38 -2013-Sep-20 09:11:45 4171689.58510 872114.57640 4730009.33773 11.80794 48.17154 525.58446 -5.01998 4.25280 0.99380 -3.20702 0.65674 -8.00173 7 3 4 2.38 -2013-Sep-20 09:11:45 4171693.83445 872116.27714 4730013.86054 11.80795 48.17153 531.96063 -4.22478 3.91037 7.36998 -2.41182 0.31431 -1.62555 7 3 4 2.38 -2013-Sep-20 09:11:45 4171693.08298 872116.17766 4730014.45916 11.80795 48.17154 531.90257 -4.16838 4.87286 7.31191 -2.35543 1.27680 -1.68362 7 3 4 2.38 -2013-Sep-20 09:11:45 4171699.66080 872119.51994 4730019.51757 11.80798 48.17152 540.42188 -2.24287 2.93900 15.83122 -0.42991 -0.65707 6.83569 7 3 4 2.38 -2013-Sep-20 09:11:45 4171694.41608 872117.01813 4730015.70995 11.80796 48.17154 533.81952 -3.61850 4.60654 9.22886 -1.80554 1.01048 0.23333 7 3 4 2.38 -2013-Sep-20 09:11:45 4171693.77605 872114.30763 4730015.24612 11.80792 48.17154 532.68620 -6.14067 5.17733 8.09554 -4.32771 1.58127 -0.89999 7 3 4 2.38 -2013-Sep-20 09:11:45 4171697.20011 872117.04643 4730020.44194 11.80795 48.17155 539.16679 -4.16050 5.72740 14.57613 -2.34754 2.13133 5.58060 7 3 4 2.38 -2013-Sep-20 09:11:46 4171697.12070 872116.79851 4730020.87803 11.80795 48.17155 539.40607 -4.38692 6.11395 14.81541 -2.57396 2.51788 5.81988 7 3 4 2.38 -2013-Sep-20 09:11:46 4171694.73166 872116.52792 4730018.25628 11.80795 48.17155 535.85601 -4.16292 6.14927 11.26535 -2.34996 2.55320 2.26982 7 3 4 2.38 -2013-Sep-20 09:11:46 4171690.49338 872113.93585 4730014.10998 11.80793 48.17156 529.64597 -5.83284 6.87063 5.05531 -4.01988 3.27457 -3.94022 7 3 4 2.38 -2013-Sep-20 09:11:46 4171690.57820 872114.69383 4730015.26692 11.80794 48.17156 530.66687 -5.10826 7.46475 6.07621 -3.29530 3.86869 -2.91932 7 3 4 2.38 -2013-Sep-20 09:11:46 4171690.23836 872115.37738 4730013.71589 11.80795 48.17156 529.38257 -4.36963 6.57401 4.79191 -2.55667 2.97795 -4.20362 7 3 4 2.38 -2013-Sep-20 09:11:46 4171692.10423 872115.81241 4730015.94300 11.80795 48.17156 532.31948 -4.32562 6.63202 7.72882 -2.51266 3.03596 -1.26671 7 3 4 2.38 -2013-Sep-20 09:11:46 4171695.46646 872116.88487 4730018.42845 11.80795 48.17155 536.51269 -3.96388 5.67372 11.92203 -2.15092 2.07765 2.92650 7 3 4 2.38 -2013-Sep-20 09:11:46 4171697.54324 872117.66769 4730020.00643 11.80796 48.17154 539.15105 -3.62260 5.09196 14.56039 -1.80964 1.49589 5.56486 7 3 4 2.38 -2013-Sep-20 09:11:46 4171695.03344 872117.76110 4730017.28683 11.80797 48.17154 535.49892 -3.01758 5.09458 10.90826 -1.20462 1.49852 1.91273 7 3 4 2.38 -2013-Sep-20 09:11:46 4171689.54412 872116.02111 4730011.78724 11.80796 48.17155 527.58010 -3.59746 5.69599 2.98944 -1.78450 2.09993 -6.00609 7 3 4 2.38 -2013-Sep-20 09:11:46 4171689.48613 872115.32541 4730010.69518 11.80795 48.17154 526.63356 -4.26656 5.11606 2.04291 -2.45361 1.52000 -6.95263 7 3 4 2.38 -2013-Sep-20 09:11:46 4171693.23548 872117.08600 4730014.57851 11.80796 48.17154 532.21501 -3.31048 4.70273 7.62435 -1.49752 1.10667 -1.37118 7 3 4 2.38 -2013-Sep-20 09:11:46 4171691.70133 872117.74483 4730013.08448 11.80797 48.17154 530.19018 -2.35165 4.72487 5.59952 -0.53869 1.12881 -3.39601 7 3 4 2.38 -2013-Sep-20 09:11:46 4171691.47294 872118.64957 4730012.90322 11.80799 48.17154 530.02949 -1.41931 4.63262 5.43883 0.39364 1.03656 -3.55670 7 3 4 2.38 -2013-Sep-20 09:11:46 4171695.69404 872119.79656 4730016.92255 11.80799 48.17153 535.93649 -1.16038 4.05945 11.34583 0.65258 0.46339 2.35030 7 3 4 2.38 -2013-Sep-20 09:11:46 4171693.37434 872119.48021 4730016.03558 11.80799 48.17154 533.71813 -0.99534 5.20810 9.12747 0.81762 1.61204 0.13194 7 3 4 2.38 -2013-Sep-20 09:11:46 4171689.11622 872116.91119 4730012.31483 11.80797 48.17155 527.81537 -2.63865 6.22423 3.22472 -0.82569 2.62817 -5.77082 7 3 4 2.38 -2013-Sep-20 09:11:46 4171691.05673 872116.23852 4730012.20286 11.80796 48.17154 528.90688 -3.69418 4.83675 4.31623 -1.88122 1.24069 -4.67930 7 3 4 2.38 -2013-Sep-20 09:11:46 4171687.08951 872113.62082 4730006.48254 11.80793 48.17154 521.69741 -5.44466 4.31460 -2.89324 -3.63170 0.71854 -11.88878 7 3 4 2.38 -2013-Sep-20 09:11:46 4171690.26826 872114.92558 4730010.28529 11.80794 48.17154 526.78414 -4.81799 4.33322 2.19348 -3.00503 0.73716 -6.80205 7 3 4 2.38 -2013-Sep-20 09:11:46 4171693.27401 872116.30711 4730014.21569 11.80795 48.17154 531.86351 -4.08076 4.55143 7.27285 -2.26781 0.95537 -1.72268 7 3 4 2.38 -2013-Sep-20 09:11:46 4171692.45740 872117.10685 4730011.34158 11.80796 48.17153 529.29794 -3.13085 3.10835 4.70729 -1.31789 -0.48771 -4.28824 7 3 4 2.38 -2013-Sep-20 09:11:46 4171696.82856 872118.37766 4730015.96814 11.80797 48.17152 535.77228 -2.78141 2.81182 11.18163 -0.96845 -0.78424 2.18610 7 3 4 2.38 -2013-Sep-20 09:11:46 4171695.06796 872117.24465 4730014.73665 11.80796 48.17153 533.55072 -3.53016 3.44744 8.96007 -1.71720 -0.14863 -0.03546 7 3 4 2.38 -2013-Sep-20 09:11:46 4171693.40375 872117.89376 4730013.65089 11.80797 48.17153 531.74387 -2.55424 3.83820 7.15322 -0.74128 0.24214 -1.84231 7 3 4 2.38 -2013-Sep-20 09:11:47 4171690.98939 872116.75487 4730013.46748 11.80796 48.17155 529.87572 -3.17497 5.65052 5.28506 -1.36201 2.05445 -3.71047 7 3 4 2.38 -2013-Sep-20 09:11:47 4171693.70057 872118.08841 4730015.47165 11.80797 48.17154 533.32093 -2.42445 4.80629 8.73028 -0.61149 1.21023 -0.26526 7 3 4 2.38 -2013-Sep-20 09:11:47 4171694.65632 872118.68334 4730016.61781 11.80798 48.17154 534.88008 -2.03768 4.78286 10.28942 -0.22472 1.18679 1.29389 7 3 4 2.38 -2013-Sep-20 09:11:47 4171695.13273 872119.09675 4730017.61723 11.80798 48.17154 535.99221 -1.73051 5.03885 11.40156 0.08245 1.44279 2.40602 7 3 4 2.38 -2013-Sep-20 09:11:47 4171695.76351 872119.75086 4730017.44981 11.80799 48.17154 536.36849 -1.21932 4.36739 11.77784 0.59364 0.77132 2.78231 7 3 4 2.38 -2013-Sep-20 09:11:47 4171688.74263 872115.93827 4730010.16230 11.80796 48.17154 525.83478 -3.51453 5.20953 1.24412 -1.70158 1.61347 -7.75141 7 3 4 2.38 -2013-Sep-20 09:11:47 4171692.87624 872116.89737 4730013.33047 11.80796 48.17154 531.02479 -3.42160 4.16119 6.43414 -1.60864 0.56513 -2.56140 7 3 4 2.38 -2013-Sep-20 09:11:47 4171694.70101 872116.03797 4730013.68317 11.80794 48.17153 532.36151 -4.63622 3.19651 7.77086 -2.82326 -0.39955 -1.22467 7 3 4 2.38 -2013-Sep-20 09:11:47 4171693.80431 872117.50124 4730014.65832 11.80797 48.17154 532.70248 -3.02043 4.27775 8.11182 -1.20747 0.68169 -0.88371 7 3 4 2.38 -2013-Sep-20 09:11:47 4171695.18654 872118.38732 4730016.21216 11.80797 48.17154 534.88354 -2.43594 4.17073 10.29289 -0.62298 0.57466 1.29735 7 3 4 2.38 -2013-Sep-20 09:11:47 4171693.64297 872117.00661 4730016.10385 11.80796 48.17155 533.60678 -3.47157 5.43488 9.01612 -1.65861 1.83882 0.02059 7 3 4 2.38 -2013-Sep-20 09:11:47 4171697.91174 872119.55583 4730020.38997 11.80798 48.17154 539.93507 -1.84982 4.79106 15.34441 -0.03686 1.19499 6.34888 7 3 4 2.38 -2013-Sep-20 09:11:47 4171695.89818 872117.83302 4730017.46794 11.80796 48.17154 536.20819 -3.12414 4.57369 11.61753 -1.31118 0.97762 2.62200 7 3 4 2.38 -2013-Sep-20 09:11:47 4171692.66435 872117.87699 4730015.50583 11.80797 48.17155 532.64111 -2.41935 5.61712 8.05046 -0.60639 2.02106 -0.94508 7 3 4 2.38 -2013-Sep-20 09:11:47 4171690.61610 872116.25976 4730012.31716 11.80796 48.17154 528.70731 -3.58322 5.23113 4.11665 -1.77027 1.63507 -4.87888 7 3 4 2.38 -2013-Sep-20 09:11:47 4171691.78895 872116.15843 4730015.51246 11.80795 48.17156 531.84007 -3.92240 6.52208 7.24941 -2.10945 2.92602 -1.74612 7 3 4 2.38 -2013-Sep-20 09:11:47 4171689.92838 872115.73951 4730011.57532 11.80795 48.17155 527.63460 -3.95173 5.31733 3.04394 -2.13877 1.72127 -5.95159 7 3 4 2.38 -2013-Sep-20 09:11:47 4171689.76279 872114.81080 4730012.01678 11.80794 48.17155 527.72872 -4.82690 5.87412 3.13806 -3.01395 2.27806 -5.85747 7 3 4 2.38 -2013-Sep-20 09:11:47 4171693.97631 872117.04790 4730016.44802 11.80796 48.17155 534.08648 -3.49937 5.41498 9.49582 -1.68641 1.81892 0.50029 7 3 4 2.38 -2013-Sep-20 09:11:47 4171693.08580 872117.06716 4730016.84567 11.80796 48.17155 533.80409 -3.29828 6.32675 9.21343 -1.48533 2.73069 0.21790 7 3 4 2.38 -2013-Sep-20 09:11:47 4171694.63630 872118.22336 4730017.54640 11.80797 48.17155 535.49617 -2.48384 5.48688 10.90551 -0.67088 1.89082 1.90998 7 3 4 2.38 -2013-Sep-20 09:11:47 4171694.59244 872117.66422 4730017.34097 11.80796 48.17155 535.23817 -3.02217 5.46712 10.64751 -1.20921 1.87106 1.65198 7 3 4 2.38 -2013-Sep-20 09:11:47 4171692.89093 872116.27044 4730016.17331 11.80795 48.17155 533.06715 -4.03827 6.14197 8.47649 -2.22531 2.54591 -0.51904 7 3 4 2.38 -2013-Sep-20 09:11:47 4171689.08251 872116.36285 4730013.17182 11.80796 48.17156 528.35712 -3.16849 6.90395 3.76646 -1.35553 3.30789 -5.22907 7 3 4 2.38 -2013-Sep-20 09:11:47 4171689.00221 872116.96672 4730012.74135 11.80797 48.17156 528.06635 -2.56096 6.58336 3.47569 -0.74800 2.98730 -5.51984 7 3 4 2.38 -2013-Sep-20 09:11:48 4171690.27934 872118.28668 4730014.53656 11.80799 48.17156 530.41787 -1.53028 6.64781 5.82721 0.28267 3.05175 -3.16832 7 3 4 2.38 -2013-Sep-20 09:11:48 4171689.61503 872117.12584 4730012.29829 11.80797 48.17155 528.15796 -2.53062 5.81664 3.56730 -0.71766 2.22058 -5.42823 7 3 4 2.38 -2013-Sep-20 09:11:48 4171697.69484 872121.83809 4730013.51198 11.80801 48.17150 534.97984 0.42852 0.01431 10.38918 2.24148 -3.58175 1.39365 7 3 4 2.38 -2013-Sep-20 09:11:48 4171699.41323 872123.69735 4730016.94187 11.80803 48.17150 538.91109 1.89680 0.76485 14.32043 3.70976 -2.83121 5.32490 7 3 4 2.38 -2013-Sep-20 09:11:48 4171697.23671 872121.16590 4730014.83677 11.80800 48.17151 535.57620 -0.13569 1.33446 10.98554 1.67727 -2.26160 1.99001 7 3 4 2.38 -2013-Sep-20 09:11:48 4171696.11857 872121.32280 4730013.75751 11.80801 48.17151 534.06349 0.24669 1.40631 9.47284 2.05965 -2.18975 0.47730 7 3 4 2.38 -2013-Sep-20 09:11:48 4171693.93048 872120.74206 4730009.50335 11.80801 48.17150 529.38591 0.12600 0.25369 4.79526 1.93896 -3.34237 -4.20028 7 3 4 2.38 -2013-Sep-20 09:11:48 4171691.22392 872118.98947 4730008.27636 11.80799 48.17151 526.46563 -1.03566 1.67674 1.87498 0.77730 -1.91931 -7.12055 7 3 4 2.38 -2013-Sep-20 09:11:48 4171692.62390 872118.99280 4730010.34910 11.80799 48.17152 528.92448 -1.31888 2.03744 4.33382 0.49408 -1.55862 -4.66171 7 3 4 2.38 -2013-Sep-20 09:11:48 4171695.67185 872120.23092 4730011.82413 11.80800 48.17150 532.18222 -0.73067 0.60925 7.59157 1.08229 -2.98681 -1.40397 7 3 4 2.38 -2013-Sep-20 09:11:48 4171697.26857 872121.23280 4730013.48790 11.80800 48.17150 534.60103 -0.07672 0.40145 10.01037 1.73624 -3.19461 1.01484 7 3 4 2.38 -2013-Sep-20 09:11:48 4171696.38356 872119.30156 4730013.56797 11.80798 48.17151 533.81941 -1.78600 1.39483 9.22876 0.02696 -2.20123 0.23322 7 3 4 2.38 -2013-Sep-20 09:11:48 4171696.99760 872119.95043 4730012.74478 11.80799 48.17150 533.69540 -1.27651 0.29904 9.10474 0.53645 -3.29702 0.10921 7 3 4 2.38 -2013-Sep-20 09:11:48 4171699.47353 872121.03693 4730016.38304 11.80800 48.17150 538.17097 -0.71966 0.75385 13.58031 1.09330 -2.84222 4.58478 7 3 4 2.38 -2013-Sep-20 09:11:48 4171700.83789 872121.89492 4730016.81861 11.80800 48.17150 539.50327 -0.15902 -0.08163 14.91261 1.65394 -3.67769 5.91708 7 3 4 2.38 -2013-Sep-20 09:11:48 4171700.21047 872121.18047 4730016.26686 11.80800 48.17150 538.58505 -0.72996 0.11698 13.99440 1.08300 -3.47909 4.99886 7 3 4 2.38 -2013-Sep-20 09:11:48 4171698.07341 872122.61021 4730017.05131 11.80802 48.17152 537.96965 1.10684 1.98084 13.37900 2.91980 -1.61522 4.38346 7 3 4 2.38 -2013-Sep-20 09:11:48 4171695.61837 872120.94942 4730015.36464 11.80801 48.17152 534.88356 -0.01643 2.89988 10.29290 1.79653 -0.69618 1.29737 7 3 4 2.38 -2013-Sep-20 09:11:48 4171696.03979 872122.28542 4730016.25204 11.80802 48.17152 536.00223 1.20507 2.98060 11.41157 3.01803 -0.61547 2.41604 7 3 4 2.38 -2013-Sep-20 09:11:48 4171698.28626 872123.80253 4730016.93000 11.80804 48.17151 538.18092 2.23037 1.56288 13.59026 4.04333 -2.03318 4.59473 7 3 4 2.38 -2013-Sep-20 09:11:48 4171698.84194 872122.23112 4730016.23664 11.80801 48.17151 537.81256 0.57850 0.93479 13.22190 2.39146 -2.66127 4.22637 7 3 4 2.38 -2013-Sep-20 09:11:48 4171697.44208 872121.25846 4730015.52416 11.80800 48.17151 536.23510 -0.08712 1.62898 11.64445 1.72584 -1.96709 2.64891 7 3 4 2.38 -2013-Sep-20 09:11:48 4171693.20144 872117.82225 4730012.34069 11.80797 48.17153 530.62577 -2.58284 3.12288 6.03511 -0.76989 -0.47318 -2.96042 7 3 4 2.38 -2013-Sep-20 09:11:48 4171694.69339 872117.78625 4730012.08336 11.80797 48.17151 531.40304 -2.92337 1.86857 6.81238 -1.11041 -1.72749 -2.18315 7 3 4 2.38 -2013-Sep-20 09:11:48 4171692.48650 872117.23476 4730009.59715 11.80797 48.17151 528.03455 -3.01159 1.90425 3.44390 -1.19863 -1.69181 -5.55163 7 3 4 2.38 -2013-Sep-20 09:11:49 4171694.63009 872117.83856 4730013.18767 11.80797 48.17152 532.19173 -2.85922 2.64323 7.60107 -1.04626 -0.95283 -1.39446 7 3 4 2.38 -2013-Sep-20 09:11:49 4171695.74003 872117.84020 4730015.05488 11.80796 48.17153 534.30784 -3.08475 3.07867 9.71719 -1.27179 -0.51740 0.72165 7 3 4 2.38 -2013-Sep-20 09:11:49 4171696.17236 872118.73918 4730015.00220 11.80797 48.17152 534.67350 -2.29326 2.59113 10.08284 -0.48030 -1.00494 1.08731 7 3 4 2.38 -2013-Sep-20 09:11:49 4171695.14836 872118.29528 4730015.81412 11.80797 48.17153 534.54946 -2.51822 3.94717 9.95880 -0.70526 0.35110 0.96327 7 3 4 2.38 -2013-Sep-20 09:11:49 4171697.09466 872120.86564 4730017.06207 11.80800 48.17152 537.10067 -0.40054 2.96791 12.51001 1.41243 -0.62815 3.51448 7 3 4 2.38 -2013-Sep-20 09:11:49 4171694.39566 872119.69092 4730013.92643 11.80799 48.17152 532.84197 -0.99809 3.02444 8.25131 0.81487 -0.57162 -0.74422 7 3 4 2.38 -2013-Sep-20 09:11:49 4171695.22683 872120.00869 4730014.99482 11.80799 48.17153 534.22401 -0.85713 3.08227 9.63336 0.95583 -0.51379 0.63783 7 3 4 2.38 -2013-Sep-20 09:11:49 4171698.17039 872119.79034 4730016.98170 11.80798 48.17152 537.59625 -1.67321 2.29366 13.00560 0.13975 -1.30240 4.01006 7 3 4 2.38 -2013-Sep-20 09:11:49 4171700.00517 872121.16161 4730019.98118 11.80800 48.17152 541.21617 -0.70641 2.74668 16.62552 1.10655 -0.84938 7.62998 7 3 4 2.38 -2013-Sep-20 09:11:49 4171696.70779 872119.77758 4730015.76720 11.80799 48.17152 535.73477 -1.38640 2.55244 11.14411 0.42656 -1.04362 2.14858 7 3 4 2.38 -2013-Sep-20 09:11:49 4171696.66262 872119.97368 4730016.26361 11.80799 48.17152 536.10194 -1.18520 2.88654 11.51129 0.62776 -0.70952 2.51575 7 3 4 2.38 -2013-Sep-20 09:11:49 4171694.37549 872117.67545 4730012.91449 11.80797 48.17152 531.79970 -2.96678 2.67161 7.20905 -1.15382 -0.92445 -1.78648 7 3 4 2.38 -2013-Sep-20 09:11:49 4171692.78864 872120.42133 4730012.62848 11.80801 48.17153 530.92544 0.04571 3.21959 6.33478 1.85867 -0.37647 -2.66075 7 3 4 2.38 -2013-Sep-20 09:11:49 4171691.67008 872119.95033 4730012.44513 11.80800 48.17153 529.99435 -0.18642 3.98498 5.40370 1.62654 0.38893 -3.59184 7 3 4 2.38 -2013-Sep-20 09:11:49 4171693.85862 872119.59939 4730014.13942 11.80799 48.17153 532.63761 -0.97779 3.57215 8.04695 0.83517 -0.02391 -0.94858 7 3 4 2.38 -2013-Sep-20 09:11:49 4171693.43125 872119.70259 4730014.30431 11.80800 48.17153 532.49557 -0.78931 3.97809 7.90492 1.02365 0.38203 -1.09061 7 3 4 2.38 -2013-Sep-20 09:11:49 4171692.15580 872118.33429 4730011.81589 11.80798 48.17153 529.62201 -1.86766 3.45748 5.03135 -0.05470 -0.13858 -3.96418 7 3 4 2.38 -2013-Sep-20 09:11:49 4171693.77406 872119.05065 4730014.29676 11.80799 48.17153 532.62477 -1.49761 3.82243 8.03411 0.31535 0.22637 -0.96142 7 3 4 2.38 -2013-Sep-20 09:11:49 4171693.03195 872117.05363 4730012.14337 11.80796 48.17153 530.26319 -3.30051 3.23211 5.67254 -1.48755 -0.36395 -3.32300 7 3 4 2.38 -2013-Sep-20 09:11:49 4171697.31607 872120.67877 4730017.74234 11.80800 48.17153 537.72659 -0.62876 3.28858 13.13594 1.18420 -0.30748 4.14040 7 3 4 2.38 -2013-Sep-20 09:11:49 4171694.36044 872119.19236 4730013.68970 11.80799 48.17152 532.57454 -1.47889 2.96828 7.98388 0.33407 -0.62778 -1.01165 7 3 4 2.38 -2013-Sep-20 09:11:49 4171692.59801 872115.73907 4730012.36764 11.80795 48.17153 529.96764 -4.49845 3.89863 5.37699 -2.68550 0.30257 -3.61855 7 3 4 2.38 -2013-Sep-20 09:11:49 4171689.94758 872115.41950 4730009.77543 11.80795 48.17154 526.26228 -4.26890 4.15177 1.67163 -2.45594 0.55571 -7.32391 7 3 4 2.38 -2013-Sep-20 09:11:49 4171693.74943 872117.74347 4730013.76650 11.80797 48.17153 532.03517 -2.77209 3.68609 7.44451 -0.95913 0.09002 -1.55102 7 3 4 2.38 -2013-Sep-20 09:11:49 4171693.95887 872116.76591 4730014.97435 11.80795 48.17154 532.93851 -3.77182 4.48790 8.34785 -1.95886 0.89184 -0.64768 7 3 4 2.38 -2013-Sep-20 09:11:50 4171697.75983 872117.97296 4730016.75180 11.80796 48.17152 536.90892 -3.36812 2.71690 12.31827 -1.55516 -0.87916 3.32274 7 3 4 2.38 -2013-Sep-20 09:11:50 4171700.12216 872119.45928 4730020.01987 11.80797 48.17152 541.08905 -2.39666 2.94673 16.49840 -0.58370 -0.64933 7.50286 7 3 4 2.38 -2013-Sep-20 09:11:50 4171696.75390 872120.02024 4730016.38795 11.80799 48.17152 536.26053 -1.15831 2.89578 11.66987 0.65465 -0.70028 2.67434 7 3 4 2.38 -2013-Sep-20 09:11:50 4171696.62038 872120.59208 4730017.36975 11.80800 48.17153 536.98299 -0.57125 3.56074 12.39234 1.24171 -0.03532 3.39681 7 3 4 2.38 -2013-Sep-20 09:11:50 4171696.76241 872119.51678 4730017.25801 11.80798 48.17153 536.84570 -1.65286 3.54659 12.25505 0.16010 -0.04947 3.25951 7 3 4 2.38 -2013-Sep-20 09:11:50 4171695.56478 872119.08565 4730016.07613 11.80798 48.17153 535.12439 -1.82979 3.69765 10.53373 -0.01683 0.10159 1.53820 7 3 4 2.38 -2013-Sep-20 09:11:50 4171698.53396 872119.98790 4730018.83850 11.80798 48.17153 539.24414 -1.55422 3.23665 14.65348 0.25874 -0.35941 5.65795 7 3 4 2.38 -2013-Sep-20 09:11:50 4171695.87045 872116.53449 4730013.98515 11.80795 48.17152 533.41769 -4.38952 2.46923 8.82703 -2.57656 -1.12683 -0.16850 7 3 4 2.38 -2013-Sep-20 09:11:50 4171697.97419 872117.72189 4730017.39427 11.80796 48.17152 537.49332 -3.65773 3.02731 12.90267 -1.84477 -0.56876 3.90713 7 3 4 2.38 -2013-Sep-20 09:11:50 4171695.07700 872116.24279 4730014.04631 11.80794 48.17153 532.90550 -4.51267 3.13321 8.31484 -2.69972 -0.46285 -0.68069 7 3 4 2.38 -2013-Sep-20 09:11:50 4171690.26871 872114.89262 4730008.97535 11.80794 48.17153 525.80384 -4.85034 3.46430 1.21318 -3.03738 -0.13176 -7.78235 7 3 4 2.38 -2013-Sep-20 09:11:50 4171692.75955 872114.89066 4730013.60601 11.80793 48.17154 530.88007 -5.36197 4.73605 6.28942 -3.54901 1.13999 -2.70612 7 3 4 2.38 -2013-Sep-20 09:11:50 4171691.95948 872114.55133 4730013.66356 11.80793 48.17155 530.35437 -5.53039 5.40972 5.76372 -3.71744 1.81366 -3.23182 7 3 4 2.38 -2013-Sep-20 09:11:50 4171695.09852 872116.36994 4730016.05607 11.80795 48.17154 534.43446 -4.39263 4.43844 9.84380 -2.57967 0.84238 0.84827 7 3 4 2.38 -2013-Sep-20 09:11:50 4171695.34463 872117.88389 4730016.13615 11.80797 48.17153 534.86140 -2.96107 4.08150 10.27074 -1.14811 0.48543 1.27521 7 3 4 2.38 -2013-Sep-20 09:11:50 4171697.40948 872116.71951 4730016.92576 11.80794 48.17153 536.63879 -4.52335 3.27958 12.04813 -2.71039 -0.31648 3.05260 7 3 4 2.38 -2013-Sep-20 09:11:50 4171694.45550 872115.82908 4730014.01599 11.80794 48.17153 532.42074 -4.79045 3.62939 7.83009 -2.97749 0.03332 -1.16545 7 3 4 2.38 -2013-Sep-20 09:11:50 4171692.99165 872115.24509 4730014.73675 11.80794 48.17155 531.92252 -5.06254 5.26681 7.33186 -3.24958 1.67075 -1.66367 7 3 4 2.38 -2013-Sep-20 09:11:50 4171691.74799 872114.79843 4730012.34905 11.80794 48.17154 529.27054 -5.24525 4.64965 4.67988 -3.43229 1.05359 -4.31565 7 3 4 2.38 -2013-Sep-20 09:11:50 4171693.02877 872116.02999 4730016.51231 11.80795 48.17155 533.37692 -4.30184 6.30418 8.78626 -2.48888 2.70812 -0.20927 7 3 4 2.38 -2013-Sep-20 09:11:50 4171694.68827 872114.31880 4730015.55856 11.80792 48.17154 533.51602 -6.31641 4.71864 8.92536 -4.50345 1.12257 -0.07017 7 3 4 2.38 -2013-Sep-20 09:11:50 4171693.77761 872115.95720 4730015.67837 11.80794 48.17154 533.23442 -4.52632 5.21293 8.64376 -2.71336 1.61687 -0.35177 7 3 4 2.38 -2013-Sep-20 09:11:50 4171694.19630 872116.39989 4730015.12616 11.80795 48.17154 533.15667 -4.17868 4.47178 8.56601 -2.36572 0.87572 -0.42952 7 3 4 2.38 -2013-Sep-20 09:11:50 4171696.24240 872117.91645 4730019.78765 11.80796 48.17155 538.17280 -3.11291 5.85692 13.58214 -1.29995 2.26085 4.58661 7 3 4 2.38 -2013-Sep-20 09:11:50 4171694.55237 872117.87145 4730016.31592 11.80797 48.17154 534.47647 -2.81112 4.78114 9.88582 -0.99816 1.18508 0.89029 7 3 4 2.38 -2013-Sep-20 09:11:51 4171698.37532 872118.47241 4730019.27226 11.80797 48.17153 539.25698 -3.00518 3.87273 14.66632 -1.19222 0.27666 5.67079 7 3 4 2.38 -2013-Sep-20 09:11:51 4171695.64513 872116.77343 4730017.51389 11.80795 48.17154 535.93263 -4.10953 4.95047 11.34198 -2.29657 1.35441 2.34645 7 3 4 2.38 -2013-Sep-20 09:11:51 4171697.24627 872118.24946 4730017.71783 11.80797 48.17153 537.33124 -2.99237 3.69357 12.74059 -1.17941 0.09751 3.74506 7 3 4 2.38 -2013-Sep-20 09:11:51 4171694.97997 872117.37612 4730016.79286 11.80796 48.17154 535.04340 -3.38347 4.86285 10.45274 -1.57051 1.26679 1.45721 7 3 4 2.38 -2013-Sep-20 09:11:51 4171697.09886 872117.20407 4730018.29927 11.80795 48.17154 537.52560 -3.98547 4.34826 12.93495 -2.17251 0.75219 3.93941 7 3 4 2.38 -2013-Sep-20 09:11:51 4171696.40555 872118.35142 4730018.90254 11.80797 48.17154 537.67912 -2.72053 5.08132 13.08847 -0.90757 1.48525 4.09293 7 3 4 2.38 -2013-Sep-20 09:11:51 4171696.82261 872116.98598 4730016.79506 11.80795 48.17153 536.19465 -4.14242 3.57984 11.60400 -2.32946 -0.01623 2.60847 7 3 4 2.38 -2013-Sep-20 09:11:51 4171695.04422 872116.60407 4730017.14060 11.80795 48.17154 535.23910 -4.15233 5.16563 10.64844 -2.33937 1.56957 1.65291 7 3 4 2.38 -2013-Sep-20 09:11:51 4171696.83739 872117.80959 4730018.86994 11.80796 48.17154 537.86279 -3.33927 4.82721 13.27213 -1.52631 1.23115 4.27660 7 3 4 2.38 -2013-Sep-20 09:11:51 4171696.88781 872118.11252 4730019.84086 11.80796 48.17155 538.66052 -3.05306 5.39176 14.06986 -1.24010 1.79569 5.07433 7 3 4 2.38 -2013-Sep-20 09:11:51 4171698.31688 872119.10025 4730020.39935 11.80797 48.17154 540.14435 -2.37867 4.57128 15.55370 -0.56571 0.97521 6.55816 7 3 4 2.38 -2013-Sep-20 09:11:51 4171695.78621 872118.04903 4730016.47168 11.80797 48.17153 535.42222 -2.88978 3.95801 10.83156 -1.07682 0.36194 1.83603 7 3 4 2.38 -2013-Sep-20 09:11:51 4171692.38286 872118.07919 4730014.09759 11.80798 48.17154 531.43561 -2.16383 4.85244 6.84496 -0.35087 1.25638 -2.15058 7 3 4 2.38 -2013-Sep-20 09:11:51 4171692.35887 872118.42735 4730013.38822 11.80798 48.17154 530.93888 -1.81813 4.34377 6.34822 -0.00517 0.74771 -2.64731 7 3 4 2.38 -2013-Sep-20 09:11:51 4171692.60829 872118.53458 4730015.06669 11.80798 48.17155 532.36704 -1.76420 5.26488 7.77639 0.04875 1.66881 -1.21914 7 3 4 2.38 -2013-Sep-20 09:11:51 4171693.86023 872119.67146 4730015.99694 11.80799 48.17154 534.03262 -0.90757 4.79877 9.44196 0.90539 1.20271 0.44643 7 3 4 2.38 -2013-Sep-20 09:11:51 4171693.24262 872118.83673 4730016.25767 11.80798 48.17155 533.70981 -1.59826 5.55040 9.11915 0.21470 1.95434 0.12362 7 3 4 2.38 -2013-Sep-20 09:11:51 4171689.72170 872117.48003 4730010.70157 11.80798 48.17154 527.08614 -2.20574 4.61997 2.49548 -0.39279 1.02391 -6.50005 7 3 4 2.38 -2013-Sep-20 09:11:51 4171692.52581 872118.33884 4730014.59485 11.80798 48.17154 531.93489 -1.93892 5.04021 7.34423 -0.12596 1.44415 -1.65130 7 3 4 2.38 -2013-Sep-20 09:11:51 4171693.43458 872119.60432 4730017.75909 11.80799 48.17155 535.05865 -0.88619 6.29465 10.46799 0.92677 2.69859 1.47246 7 3 4 2.38 -2013-Sep-20 09:11:51 4171690.49018 872116.37434 4730013.42103 11.80796 48.17155 529.46330 -3.44530 6.04167 4.87264 -1.63234 2.44561 -4.12289 7 3 4 2.38 -2013-Sep-20 09:11:51 4171689.25240 872116.47891 4730013.04403 11.80796 48.17156 528.38864 -3.08965 6.67711 3.79798 -1.27669 3.08106 -5.19755 7 3 4 2.38 -2013-Sep-20 09:11:51 4171690.69340 872117.89639 4730013.86928 11.80798 48.17155 530.13768 -1.99704 5.96031 5.54703 -0.18408 2.36425 -3.44850 7 3 4 2.38 -2013-Sep-20 09:11:51 4171687.90866 872116.38325 4730011.14049 11.80797 48.17156 526.07998 -2.90831 6.40231 1.48933 -1.09536 2.80625 -7.50620 7 3 4 2.38 -2013-Sep-20 09:11:51 4171689.50675 872118.23332 4730012.14242 11.80799 48.17155 528.12227 -1.42441 5.62280 3.53161 0.38855 2.02674 -5.46392 7 3 4 2.38 -2013-Sep-20 09:11:52 4171690.09269 872116.77902 4730012.74738 11.80797 48.17155 528.75707 -2.96784 5.82063 4.16642 -1.15488 2.22457 -4.82912 7 3 4 2.38 -2013-Sep-20 09:11:52 4171692.00020 872117.10328 4730016.50027 11.80796 48.17156 532.84299 -3.04078 6.88271 8.25233 -1.22782 3.28664 -0.74320 7 3 4 2.38 -2013-Sep-20 09:11:52 4171689.01089 872115.62661 4730011.29080 11.80795 48.17155 526.80825 -3.87450 5.81399 2.21759 -2.06154 2.21794 -6.77794 7 3 4 2.38 -2013-Sep-20 09:11:52 4171687.99712 872116.24031 4730010.84236 11.80796 48.17155 525.89607 -3.06633 6.16077 1.30542 -1.25337 2.56471 -7.69011 7 3 4 2.38 -2013-Sep-20 09:11:52 4171686.24000 872115.26520 4730009.72699 11.80796 48.17156 523.78486 -3.66124 6.84721 -0.80580 -1.84828 3.25115 -9.80133 7 3 4 2.38 -2013-Sep-20 09:11:52 4171692.85561 872117.24077 4730015.10000 11.80796 48.17155 532.37674 -3.08124 5.30399 7.78609 -1.26828 1.70792 -1.20945 7 3 4 2.38 -2013-Sep-20 09:11:52 4171693.22025 872118.15040 4730017.42974 11.80798 48.17156 534.47490 -2.26548 6.45304 9.88424 -0.45253 2.85697 0.88871 7 3 4 2.38 -2013-Sep-20 09:11:52 4171693.55565 872117.16666 4730015.95114 11.80796 48.17155 533.45783 -3.29704 5.37232 8.86718 -1.48408 1.77626 -0.12835 7 3 4 2.38 -2013-Sep-20 09:11:52 4171690.96482 872116.76181 4730016.21891 11.80796 48.17157 531.91084 -3.16315 7.50231 7.32018 -1.35020 3.90625 -1.67535 7 3 4 2.38 -2013-Sep-20 09:11:52 4171691.23538 872117.56932 4730016.96099 11.80797 48.17157 532.75062 -2.42810 7.67674 8.15996 -0.61514 4.08068 -0.83557 7 3 4 2.38 -2013-Sep-20 09:11:52 4171690.59725 872115.76944 4730017.40408 11.80795 48.17158 532.41859 -4.05930 8.71213 7.82793 -2.24634 5.11607 -1.16760 7 3 4 2.38 -2013-Sep-20 09:11:52 4171690.85914 872115.78250 4730015.10104 11.80795 48.17156 530.87523 -4.10012 6.98321 6.28457 -2.28716 3.38715 -2.71096 7 3 4 2.38 -2013-Sep-20 09:11:52 4171687.57249 872115.36900 4730011.85321 11.80795 48.17156 526.25320 -3.83231 7.27748 1.66254 -2.01936 3.68142 -7.33299 7 3 4 2.38 -2013-Sep-20 09:11:52 4171689.60871 872116.13960 4730012.73699 11.80796 48.17155 528.34614 -3.49469 6.26420 3.75548 -1.68173 2.66815 -5.24005 7 3 4 2.38 -2013-Sep-20 09:11:52 4171687.40524 872116.51402 4730012.25067 11.80797 48.17157 526.59645 -2.67729 7.48994 2.00579 -0.86433 3.89388 -6.98974 7 3 4 2.38 -2013-Sep-20 09:11:52 4171689.07301 872115.14207 4730012.66794 11.80795 48.17156 527.80886 -4.36149 6.76098 3.21820 -2.54854 3.16492 -5.77733 7 3 4 2.38 -2013-Sep-20 09:11:52 4171688.24740 872115.72461 4730013.02406 11.80796 48.17157 527.61476 -3.62233 7.51183 3.02410 -1.80937 3.91577 -5.97143 7 3 4 2.38 -2013-Sep-20 09:11:52 4171689.64800 872115.67283 4730012.14075 11.80795 48.17155 527.86380 -3.95963 5.90909 3.27314 -2.14667 2.31303 -5.72239 7 3 4 2.38 -2013-Sep-20 09:11:52 4171691.27013 872116.01790 4730015.52910 11.80795 48.17156 531.49462 -3.95380 6.93302 6.90396 -2.14084 3.33696 -2.09157 7 3 4 2.38 -2013-Sep-20 09:11:52 4171692.17933 872116.72878 4730015.28157 11.80796 48.17155 532.00070 -3.44402 5.99640 7.41004 -1.63106 2.40034 -1.58549 7 3 4 2.38 -2013-Sep-20 09:11:52 4171696.95168 872118.42600 4730019.89214 11.80797 48.17155 538.78320 -2.75929 5.33158 14.19254 -0.94633 1.73551 5.19701 7 3 4 2.38 -2013-Sep-20 09:11:52 4171695.79975 872118.53080 4730018.78050 11.80797 48.17155 537.21720 -2.42099 5.41443 12.62654 -0.60803 1.81837 3.63101 7 3 4 2.38 -2013-Sep-20 09:11:52 4171693.44918 872117.45165 4730015.12135 11.80797 48.17154 532.80890 -2.99629 4.85313 8.21825 -1.18333 1.25707 -0.77729 7 3 4 2.38 -2013-Sep-20 09:11:52 4171696.91616 872119.35273 4730018.88611 11.80798 48.17154 538.13685 -1.84490 4.54525 13.54619 -0.03194 0.94919 4.55066 7 3 4 2.38 -2013-Sep-20 09:11:52 4171697.77986 872120.40746 4730020.41721 11.80799 48.17154 539.98549 -0.98923 4.77555 15.39484 0.82373 1.17948 6.39931 7 3 4 2.38 -2013-Sep-20 09:11:53 4171694.80653 872117.67543 4730020.27882 11.80796 48.17156 537.56857 -3.05501 7.26852 12.97791 -1.24205 3.67246 3.98238 7 3 4 2.38 -2013-Sep-20 09:11:53 4171694.05497 872116.07051 4730019.09673 11.80795 48.17156 535.97811 -4.47217 7.27307 11.38745 -2.65921 3.67700 2.39192 7 3 4 2.38 -2013-Sep-20 09:11:53 4171693.48086 872116.46808 4730017.50238 11.80795 48.17156 534.46957 -3.96553 6.56792 9.87891 -2.15258 2.97185 0.88338 7 3 4 2.38 -2013-Sep-20 09:11:53 4171693.55370 872117.95188 4730017.84278 11.80797 48.17156 534.97327 -2.52803 6.51555 10.38261 -0.71507 2.91949 1.38708 7 3 4 2.38 -2013-Sep-20 09:11:53 4171694.24129 872118.36007 4730017.03530 11.80798 48.17155 534.87613 -2.26918 5.41328 10.28547 -0.45623 1.81722 1.28994 7 3 4 2.38 -2013-Sep-20 09:11:53 4171689.65452 872114.76628 4730013.47883 11.80794 48.17156 528.74141 -4.84832 6.93493 4.15075 -3.03536 3.33887 -4.84478 7 3 4 2.38 -2013-Sep-20 09:11:53 4171687.60106 872114.30672 4730012.83696 11.80794 48.17157 526.85992 -4.87795 8.07469 2.26926 -3.06499 4.47863 -6.72627 7 3 4 2.38 -2013-Sep-20 09:11:53 4171687.25192 872114.90764 4730011.57511 11.80795 48.17156 525.77375 -4.21830 7.39617 1.18309 -2.40535 3.80011 -7.81244 7 3 4 2.38 -2013-Sep-20 09:11:53 4171687.71972 872114.85189 4730011.84202 11.80795 48.17156 526.27041 -4.36860 7.24148 1.67975 -2.55564 3.64542 -7.31578 7 3 4 2.38 -2013-Sep-20 09:11:53 4171688.12430 872115.33868 4730012.68062 11.80795 48.17156 527.22582 -3.97491 7.43143 2.63516 -2.16195 3.83537 -6.36037 7 3 4 2.38 -2013-Sep-20 09:11:53 4171689.03967 872115.23753 4730013.41406 11.80795 48.17156 528.35608 -4.26123 7.26834 3.76542 -2.44827 3.67228 -5.23011 7 3 4 2.38 -2013-Sep-20 09:11:53 4171690.64438 872115.56369 4730013.94193 11.80795 48.17156 529.84147 -4.27035 6.40021 5.25081 -2.45739 2.80414 -3.74472 7 3 4 2.38 -2013-Sep-20 09:11:53 4171692.71611 872114.69113 4730015.46940 11.80793 48.17155 532.21299 -5.54839 6.04085 7.62233 -3.73543 2.44479 -1.37320 7 3 4 2.38 -2013-Sep-20 09:11:53 4171691.22275 872114.73262 4730015.42079 11.80794 48.17156 531.20758 -5.20218 7.09134 6.61692 -3.38922 3.49527 -2.37861 7 3 4 2.38 -2013-Sep-20 09:11:53 4171690.08443 872114.56734 4730014.62927 11.80794 48.17156 529.85215 -5.13103 7.41893 5.26148 -3.31807 3.82287 -3.73404 7 3 4 2.38 -2013-Sep-20 09:11:53 4171690.84764 872115.02594 4730017.08521 11.80794 48.17157 532.24297 -4.83832 8.43021 7.65231 -3.02536 4.83415 -1.34322 7 3 4 2.38 -2013-Sep-20 09:11:53 4171692.57768 872115.43641 4730018.09924 11.80794 48.17157 534.18394 -4.79055 7.78203 9.59328 -2.97759 4.18597 0.59775 7 3 4 2.38 -2013-Sep-20 09:11:53 4171686.42411 872112.06870 4730011.60333 11.80791 48.17157 524.86696 -6.82777 8.45167 0.27630 -5.01482 4.85561 -8.71923 7 3 4 2.38 -2013-Sep-20 09:11:53 4171686.46206 872112.35102 4730012.68539 11.80792 48.17158 525.73656 -6.55919 9.10257 1.14590 -4.74624 5.50651 -7.84963 7 3 4 2.38 -2013-Sep-20 09:11:53 4171688.75169 872112.40442 4730015.91620 11.80791 48.17158 529.64592 -6.97546 9.57906 5.05525 -5.16250 5.98300 -3.94027 7 3 4 2.38 -2013-Sep-20 09:11:53 4171689.42812 872114.48165 4730016.45616 11.80794 48.17158 530.77331 -5.08060 9.12905 6.18265 -3.26764 5.53299 -2.81288 7 3 4 2.38 -2013-Sep-20 09:11:53 4171688.31794 872114.85852 4730015.25997 11.80795 48.17158 529.20869 -4.48453 9.08359 4.61803 -2.67157 5.48753 -4.37750 7 3 4 2.38 -2013-Sep-20 09:11:53 4171686.67064 872113.32616 4730013.89299 11.80793 48.17158 526.90563 -5.64737 9.60710 2.31497 -3.83441 6.01104 -6.68056 7 3 4 2.38 -2013-Sep-20 09:11:53 4171687.62632 872113.30638 4730013.45230 11.80793 48.17158 527.19841 -5.86230 8.61916 2.60775 -4.04934 5.02311 -6.38778 7 3 4 2.38 -2013-Sep-20 09:11:53 4171687.54589 872111.64922 4730012.96994 11.80791 48.17158 526.56033 -7.46793 8.60882 1.96967 -5.65498 5.01277 -7.02586 7 3 4 2.38 -2013-Sep-20 09:11:54 4171691.51168 872114.32802 4730017.48494 11.80793 48.17157 532.87906 -5.65734 8.31888 8.28840 -3.84439 4.72282 -0.70713 7 3 4 2.38 -2013-Sep-20 09:11:54 4171691.82504 872114.51984 4730017.95495 11.80793 48.17157 533.46002 -5.53371 8.37453 8.86936 -3.72075 4.77846 -0.12617 7 3 4 2.38 -2013-Sep-20 09:11:54 4171695.55088 872118.26611 4730015.58240 11.80797 48.17153 534.63557 -2.62914 3.50349 10.04492 -0.81618 -0.09258 1.04939 7 3 4 2.38 -2013-Sep-20 09:11:54 4171696.67499 872119.86523 4730017.70657 11.80799 48.17153 537.17043 -1.29390 3.85636 12.57977 0.51906 0.26030 3.58424 7 3 4 2.38 -2013-Sep-20 09:11:54 4171696.06520 872118.54670 4730018.58839 11.80797 48.17154 537.24951 -2.45974 5.09027 12.65885 -0.64678 1.49421 3.66332 7 3 4 2.38 -2013-Sep-20 09:11:54 4171697.44169 872118.51567 4730016.78197 11.80797 48.17152 536.79779 -2.77179 2.88632 12.20713 -0.95883 -0.70975 3.21160 7 3 4 2.38 -2013-Sep-20 09:11:54 4171696.18880 872118.12150 4730016.40404 11.80797 48.17153 535.64451 -2.90123 3.60821 11.05385 -1.08827 0.01214 2.05832 7 3 4 2.38 -2013-Sep-20 09:11:54 4171696.77683 872119.67325 4730018.08203 11.80799 48.17153 537.49048 -1.50265 4.06176 12.89982 0.31031 0.46570 3.90429 7 3 4 2.38 -2013-Sep-20 09:11:54 4171699.02001 872120.06924 4730019.85566 11.80798 48.17153 540.33046 -1.57407 3.54810 15.73981 0.23889 -0.04797 6.74427 7 3 4 2.38 -2013-Sep-20 09:11:54 4171698.82588 872120.41467 4730019.60166 11.80799 48.17153 540.06160 -1.19622 3.46762 15.47095 0.61674 -0.12844 6.47541 7 3 4 2.38 -2013-Sep-20 09:11:54 4171697.29935 872120.15303 4730017.94527 11.80799 48.17153 537.79515 -1.13995 3.51628 13.20449 0.67301 -0.07978 4.20896 7 3 4 2.38 -2013-Sep-20 09:11:54 4171694.66465 872117.64772 4730013.33391 11.80796 48.17152 532.29721 -3.05310 2.74465 7.70656 -1.24014 -0.85141 -1.28898 7 3 4 2.38 -2013-Sep-20 09:11:54 4171692.11116 872116.62846 4730011.91759 11.80796 48.17153 529.43585 -3.52826 3.81797 4.84519 -1.71530 0.22191 -4.15034 7 3 4 2.38 -2013-Sep-20 09:11:54 4171693.99142 872117.41529 4730014.03835 11.80796 48.17153 532.35092 -3.14284 3.74092 7.76027 -1.32988 0.14486 -1.23527 7 3 4 2.38 -2013-Sep-20 09:11:54 4171691.72624 872116.29942 4730011.10037 11.80795 48.17153 528.53073 -3.77157 3.60389 3.94008 -1.95861 0.00783 -5.05545 7 3 4 2.38 -2013-Sep-20 09:11:54 4171695.11009 872118.59125 4730018.09022 11.80798 48.17155 536.26089 -2.22069 5.44788 11.67024 -0.40773 1.85182 2.67471 7 3 4 2.38 -2013-Sep-20 09:11:54 4171694.25695 872117.25575 4730016.38096 11.80796 48.17154 534.24807 -3.35334 5.13387 9.65741 -1.54038 1.53781 0.66188 7 3 4 2.38 -2013-Sep-20 09:11:54 4171693.02937 872116.83171 4730014.57371 11.80796 48.17154 532.04218 -3.51721 4.88864 7.45152 -1.70425 1.29257 -1.54401 7 3 4 2.38 -2013-Sep-20 09:11:54 4171691.02841 872116.92619 4730010.81756 11.80797 48.17153 527.95000 -3.01526 3.82869 3.35934 -1.20231 0.23263 -5.63619 7 3 4 2.38 -2013-Sep-20 09:11:54 4171692.96774 872117.52886 4730011.19043 11.80797 48.17152 529.57606 -2.82219 2.57096 4.98540 -1.00924 -1.02510 -4.01013 7 3 4 2.38 -2013-Sep-20 09:11:54 4171693.60390 872117.65830 4730013.73263 11.80797 48.17153 531.90331 -2.82567 3.78262 7.31265 -1.01271 0.18656 -1.68288 7 3 4 2.38 -2013-Sep-20 09:11:54 4171696.10904 872118.55041 4730016.02482 11.80797 48.17153 535.36840 -2.46507 3.34808 10.77775 -0.65211 -0.24798 1.78222 7 3 4 2.38 -2013-Sep-20 09:11:54 4171693.62821 872117.58298 4730016.42395 11.80797 48.17155 533.91432 -2.90438 5.57123 9.32367 -1.09142 1.97517 0.32814 7 3 4 2.38 -2013-Sep-20 09:11:54 4171696.74863 872117.80728 4730016.31728 11.80796 48.17153 535.90243 -3.32336 3.18993 11.31177 -1.51040 -0.40613 2.31624 7 3 4 2.38 -2013-Sep-20 09:11:54 4171696.73840 872119.19594 4730018.25690 11.80798 48.17154 537.53056 -1.96199 4.27919 12.93990 -0.14903 0.68313 3.94437 7 3 4 2.38 -2013-Sep-20 09:11:55 4171693.85869 872119.28301 4730015.82901 11.80799 48.17154 533.85347 -1.28748 4.74714 9.26281 0.52547 1.15108 0.26728 7 3 4 2.38 -2013-Sep-20 09:11:55 4171692.22913 872118.76933 4730014.20304 11.80799 48.17154 531.50802 -1.45683 4.92966 6.91736 0.35613 1.33360 -2.07817 7 3 4 2.38 -2013-Sep-20 09:11:55 4171693.70261 872119.31345 4730015.79369 11.80799 48.17154 533.72941 -1.22575 4.83278 9.13876 0.58720 1.23672 0.14322 7 3 4 2.38 -2013-Sep-20 09:11:55 4171693.19882 872119.82288 4730014.85422 11.80800 48.17154 532.77002 -0.62401 4.49602 8.17937 1.18895 0.89996 -0.81616 7 3 4 2.38 -2013-Sep-20 09:11:55 4171692.32530 872118.05042 4730012.73710 11.80798 48.17153 530.38036 -2.18021 3.99150 5.78970 -0.36725 0.39544 -3.20583 7 3 4 2.38 -2013-Sep-20 09:11:55 4171696.58322 872119.06658 4730017.54688 11.80798 48.17153 536.88253 -2.05686 3.93858 12.29188 -0.24390 0.34252 3.29635 7 3 4 2.38 -2013-Sep-20 09:11:55 4171694.54147 872118.56212 4730014.96255 11.80798 48.17153 533.55516 -2.13284 3.78121 8.96450 -0.31988 0.18515 -0.03103 7 3 4 2.38 -2013-Sep-20 09:11:55 4171693.85205 872117.08864 4730013.83536 11.80796 48.17153 532.06411 -3.43407 3.75701 7.47345 -1.62111 0.16094 -1.52208 7 3 4 2.38 -2013-Sep-20 09:11:55 4171694.94468 872116.72352 4730015.78012 11.80795 48.17154 534.17666 -4.01505 4.31271 9.58601 -2.20209 0.71665 0.59048 7 3 4 2.38 -2013-Sep-20 09:11:55 4171695.16755 872118.14930 4730016.69910 11.80797 48.17154 535.20150 -2.66504 4.54562 10.61084 -0.85208 0.94955 1.61531 7 3 4 2.38 -2013-Sep-20 09:11:55 4171693.61509 872117.19836 4730016.43394 11.80796 48.17155 533.86071 -3.27818 5.64611 9.27006 -1.46522 2.05005 0.27452 7 3 4 2.38 -2013-Sep-20 09:11:55 4171693.09688 872117.15469 4730014.25086 11.80796 48.17154 531.88976 -3.21488 4.57484 7.29910 -1.40192 0.97878 -1.69643 7 3 4 2.38 -2013-Sep-20 09:11:55 4171693.16336 872118.85560 4730015.04595 11.80798 48.17154 532.75774 -1.56356 4.79724 8.16708 0.24939 1.20117 -0.82845 7 3 4 2.38 -2013-Sep-20 09:11:55 4171691.17820 872116.93284 4730013.18172 11.80796 48.17155 529.81033 -3.03940 5.29509 5.21967 -1.22644 1.69903 -3.77586 7 3 4 2.38 -2013-Sep-20 09:11:55 4171696.49781 872119.37470 4730018.74999 11.80798 48.17154 537.76532 -1.73779 4.75625 13.17466 0.07517 1.16019 4.17913 7 3 4 2.38 -2013-Sep-20 09:11:55 4171694.73266 872118.56638 4730016.69162 11.80798 48.17154 534.96896 -2.16780 4.79423 10.37830 -0.35484 1.19817 1.38277 7 3 4 2.38 -2013-Sep-20 09:11:55 4171691.58568 872117.19325 4730013.85910 11.80797 48.17155 530.61661 -2.86789 5.40993 6.02595 -1.05493 1.81387 -2.96958 7 3 4 2.38 -2013-Sep-20 09:11:55 4171691.02426 872116.64629 4730013.51827 11.80796 48.17155 529.92150 -3.28839 5.67551 5.33085 -1.47543 2.07945 -3.66469 7 3 4 2.38 -2013-Sep-20 09:11:55 4171691.44401 872116.22770 4730013.94906 11.80795 48.17155 530.45940 -3.78401 5.72048 5.86874 -1.97106 2.12442 -3.12679 7 3 4 2.38 -2013-Sep-20 09:11:55 4171690.78676 872117.59316 4730015.54571 11.80797 48.17156 531.40642 -2.31296 7.05647 6.81577 -0.50000 3.46041 -2.17977 7 3 4 2.38 -2013-Sep-20 09:11:55 4171688.22556 872116.06109 4730011.55007 11.80796 48.17156 526.54808 -3.28850 6.49345 1.95743 -1.47554 2.89739 -7.03811 7 3 4 2.38 -2013-Sep-20 09:11:55 4171689.65593 872115.23434 4730014.26024 11.80795 48.17156 529.38846 -4.39046 7.38365 4.79780 -2.57750 3.78759 -4.19773 7 3 4 2.38 -2013-Sep-20 09:11:55 4171689.83049 872114.17239 4730013.38866 11.80793 48.17156 528.70804 -5.46566 6.83700 4.11738 -3.65270 3.24094 -4.87815 7 3 4 2.38 -2013-Sep-20 09:11:55 4171691.12185 872113.74860 4730014.77388 11.80792 48.17156 530.52538 -6.14473 6.88354 5.93472 -4.33177 3.28748 -3.06081 7 3 4 2.38 -2013-Sep-20 09:11:55 4171694.18539 872116.30189 4730019.20345 11.80795 48.17156 536.17434 -4.27238 7.21383 11.58368 -2.45942 3.61777 2.58815 7 3 4 2.38 -2013-Sep-20 09:11:56 4171699.19494 872117.78896 4730022.47860 11.80795 48.17155 542.08794 -3.84189 5.51745 17.49728 -2.02893 1.92138 8.50175 7 3 4 2.38 -2013-Sep-20 09:11:56 4171696.77203 872117.52171 4730019.27596 11.80796 48.17154 538.08338 -3.60768 5.18956 13.49272 -1.79472 1.59350 4.49719 7 3 4 2.38 diff --git a/src/utils/gnuplot/4_GPS_3_GAL_accuracy_precision.jpeg b/src/utils/gnuplot/4_GPS_3_GAL_accuracy_precision.jpeg deleted file mode 100644 index c76d689f707e259ee0e7de2e6fe76f38f7aad520..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 47887 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 diff --git a/src/utils/gnuplot/8_GALILEO_accuracy_precision.jpeg b/src/utils/gnuplot/8_GALILEO_accuracy_precision.jpeg deleted file mode 100644 index ef45b9140f0569bd5a4f764c90126f23cc5bc083..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53272 zcmdqJcUY6nyDl0!(gM;!2ukltl^PN00xAO1MMO#{(u0I9y$J{i2q;y$bm_g9(2-CR zKm-I5KnN1T$+ybh=dAB{eruhz_aEn+m&|o>C3$DwXXcri=f0nNa`pXc9YC+EsiO%X zA|e7jC;S1f@Bk(CCmL!`4WB6TIJ^{her@l-<9kQqHjj{xmy??VkB+VukM1K4Egs*y zw}r)cJbY|joV@*cRCp9_Q(Y|q)Bz;K#DBdA7b)RIMoC6SN=imWK|xMQLq$VFO+`&j zOLv`~mX3jrnwp-4o`I2xnVFde$jZjT#CDyDndz@eh)4+ckdj>^BfG{#OHIr4|M`S5*Cq>m6N}#ps4;pLsLszN7v}7v5Dz3GjqF__OBcqot(YAeSH0({%^wHMnpzM z$Hbh^EUr<<7T=J!~thTPcp|R;(b4yQeU;n`1(D2Cg%|C(W8|1Hb@hhhKI zE(CyvgorSBBn$vB;L<2RRtWI_&2qkUI)E`~K*m*vY-r9Mo+OvTo=nwWAniQSmt}LP z7D>`p?KMtj%L03YspNh@AfpD%v=}R86W`fzxPPq(as^;i_DAju_NM&2R_h)JH9q%9222 z8+!DJR}NQef_5xk`9_Y~$q=2UF{6U%Ivv`nyYNyozgxjEdGu{+UXULyGd^$*D`yrj zw}f}+@08MDmM`B_idRabvu zRhjGdd|rH|N&11RW0)K9eL9bE!-}94JneMqpl3f4#JQWEOEGs)pG0r9gLvrKYq#mT z;tAgd*ebZ#NfB|fXt42->?n$M$pkMMbt}SSaJ(hOai~^(>i&iMgZD7@2PwAG4eX0L z+8e&MLTlk)>zym(!?a|lp<1UO(1Y=W?i0NNB*>X?v{|#%&HNVE)zgc9!CI^&m?J<$ z8X?c1}9F!E{6k4zXtCFb(?K$bI%beJ}eW`mD z!#^s-o_-x3xW{K|h%{Wv>&_LP#oek#+Hg7sfiONNZ`{IB2{u~vJ6REZZ=)aI(4HvP zFL`zH=*`JEAdpi7)_EZjH1nrA2_}vy=mRr|ODfA2LgoA46xCYqzFX?$DtgP8?1F!o zXzs{t_~Eshl)zx>M{hj!Wv%i})EdK2MXS?L6r92W8^f(nVT#dAJyqg*D#Ct;CVR>0 zPT0CG{nwpbA(BIA%8&~gX&du8D*%Hsg-`i-2@r_QKh)1Kh{OiAtSqZ3d$K0M zh+imoWl!E_p8!sFfG;bR71leWTS`K`tEr)#gLt87ao+Yh7Z`6*<lhFrDm}61tWPd$tJRLALuV}VZ`k{~1){8F|lWoSL z^#LGN(W*R?#uXLU=>{gpLd-D{xp_!;f;0Da&$Ks1H*^9W_f!%yZV}s?acyeav5|K4 zyMB5Vq8giDr+f#cuQZ^_Iqh@Fz2z>GV=^ter<6u|%{Gl>V4YjjICOiyE%me=Ta5z0 z1ylWM0Me*bMt&}Xq;v4@WuX1%Tg2q0NdtCLd6?pZp%KfY9}_7lnjYK8;DFeKjQ|ir zvTu!AS#5*UJ(feGBue}@7N<|1M^@O#*!F|h{%+Idl*8j6B~(jl6PmO>YYlk=T#)s{ zo;@>|C|Nr^L0PB54C~Ol<10PvN6Mhdp>o()|hOnBQSN*ZH!OYY}R&{bZ^G z414emo5m#WLH7HgfPLDbmE;#6dNXILBmh9NbC<8Xl1 zLK{EXj&2HbHThlel%MY#-4P#z!N;{VPo-Ig=!AVY}m;hr|X|UibDCc7gMPxRf zl{*fZ;AhZ${h9TBlnJYx{Nr*@O5tXy5jFO4ui%EWen#XKfHY|C3V@Cw479m>yfWAU z8TAcV>Te#Dx!rQ^@bG9^hap-1{CwcYQhfX*#malr6xgH7A{k(0?(If&LPt2th7;Rp z!CR`64>dGo^<$aOZoF0`_A|OD6u`3F_ZrBY5peMWrWB6M4c$;u@UgO$-8(MaX`#z2 zY0GNp|C4^*{PM$kMe=*srJ=|1+i61-O;gr(=w?EDC`$Gn#Db+z%i(&34ZJ6)~-QN!!i`%U3CR?qeXd&7GK^@8{7 zO38qyk6m*uY=N!5_X z!phQgokU`wN!4O&!;jZ}rCJx`J|NE8-N~#>vQE8Zaqg4EA&~zEhSrQ+y=i}4Px51b zuY`#Pb%O=pjg3lxpSS54p8g6D77CNY_=Wm_IjXWz38Fn5#_!L})0={eLLm-fez#U! zRyO=-J#N1APLPMC+e>s?unKa+H!;)rlO&;CDco<%gZJlb^hv}kwhG7+_1-->(~iVoglM+W4yrZVf^)b z(+8^~@vq?=Qt>`j=`*K=XxG8+Lk^r)nk=!5;%X6Aw zRW{vBUS&W48MB_oY+_BpcbkTyiQI)pS_<`T#%7@TsCxYb%x?- zQR3HC-20oj<;-mEPs(uJg_o{S>X;of*gs{EO7r!lqP)vTGfC0$*ybiq2>aUyV{>{m zcTz5oQH?6tS)+TjiZ!xHv@oo7<~34Ct{i0>i)6pmSK2DnMgB_>xYT%Pq6qHJ;nc$j zv?8P1)G(sDQ`HA;Dy4e1Ui=l4E7y3BUp)VQ*C;X5`0n~6ikbJO108Z`eEEem&IK#$ zjx>zPmBHvioBBZC5hZVN##O`RF%{cz-MNQL1sNfI5|w4!)j^qaU%PM=HtYAq7!lEV~TLFlOz#L72VXg zMz2!|UF!1?>E21_uMLSUP4F1DwvyaRpcJ`K=-F?RGd2N7v6S&aFSRp zCkKjnoL>dDq_;7nMJ|oGWo_@QvD}q2JG-vk4j5^~7r)N>s#_T;3tY-WcBHMVfcs5f zL*^&-P|>iP!Nubx=YD@QaG{A3pI(uQlpP4DY=+52Dga1+I*SfOJ+9~s_x?9~%iFQ)%eF`Zazl#ghr zW?X?$D9R-Vm($9l(i6VeaB@0i|7t8{p7h^B&<)MjZY@#C)8s;aW(kpO=8*)!tw9+0 zzTbr=B$!^6!>NO3`k)wnb}CSSvLaXdAYeR0Y9a2pOw;+S)3%&hAyy*zvfvr2QuN~oiw3-^r9uB08kvhaPo*^xRX}d z0_~uSIf#&q1i#8-gsNMm@3^`)4B?qoKZ=d5wKxPMQ=RKHd{=r2D5@K928MMKbt0c* zDNfVT?g=OQT6#0ek1?X=t##?Ui|ffq=)QjYe)DU2vSfL_xHNH)QMire)IAVeP){xh zn^yvJ!~XsPdpud~;^WVYK26V>ZJgGERC3;x_yqaJXHU)J!!XpXgRt)&)Lp(TZITMqbK*#$c4@Sk|3*BcON?5-O zTI|BQ9!>z$aF)35-ATVQD&CQDSiIctB|h8XEw8?rdgg_+dpLAJ9C2P}lkfeAqE{7w z*6I@{L3M`z4g~d_VVr$Ibro;)3lVAWlg$Nc>w2aZ$9@r4WM_zT(svPScgb#b2v5U& zP;gotCx*Ke2}SJV;Od1TJ zzU<}E!SpWl%%L{jep4_nBlp)C3s0~kaNTL|b{5Ca$;N$CPP=Chq+J+#dOe%@XPEzh z2wg}LjDmCTbk+#epzj-oS>MSR%yM|^fZodvl+i1ksIicFwaZz=Z~sbTwdRwQOwm(G zg=#xYMt3kh>?vUfeY1#DsEgE>?q{{WHskta`h<;3;&T|q5g%>X+xj32w*e`y$%Pq0 z|81Y`+h9NgR{*X~`?zYdpKBz_es(CCjE8|ws4JP@vRLcSlHrGTpRK^Uh_*W%UX*Ph>3No zzY2We5xcFJ@SE9W?w8Yvhj^#2U*q+=o40`&?{#P$tTc zlA*4#15a>u-^-630!frGzRNsi>Po0lzoJ1yxua-)dgpZ3swii>Vn6Kr!NUkMnlNE= zG2vqtIol9vlVI0sN@&SIFlGIc4c$)DD$k5-o0_dZ%8+g+)K;QSqKBtJty2YV+QQ*AwX9`kbDzi)Ts8Lg+4{yhBJM=FeD zXb=~+23>;8=mAq;%Qdh``Pl1l-Fdsts4fn>V8@Qi%Q|m6y)ed!$i>Pm?dLrDz)0vnyA(_I|pElJv-$q0wlfiJ?jsO zd3+B<3ww+Al;-%2sF!Ha15FIBnk3S*;2+ z-Byah({KUT7vefNS8&qUe#knU9TL3Qac7}n#l5$ssK02n1?}ux3OVg2YrFlR7RYZ8 z@unHExBYh9bV3&kI8R#7%|-!ZY#IdPgKn=tjm*#v5%5S?WyxX$HgXnWy(^Ic^bjAl zNbQh)(#;xljjJVeKbRiR;uL(H5XD^q>KkmX@8rEWR_?@VwP^$v9+du zB2v=LRby}7Pzbt(Z9+-*!V|-hnnkXkuv&eJ?;*%9;%Pn?<8r(G;+^&UP2yvvw;I3K zb=uzW1Gy5$i5eF?kLSU;MX6)bBhcZN4QP0nvORMD&0Y7C4ObM`3niyl0iT)c-r>zD z;%|MW>1)10^|K-AIyPeiw4aKm=xYSgwb|rjrSCUjXuO>N93+Wnnibc@ztH~f7U5Y_ zCKC!9kYH8Psjm6*2^fv1#JZ#Mdfl-C$u(%dC`s??*w+#z;*FVKzMq@wj+ag7ol6sC zs!sR~u-PU~Q1U9LMaESu2hD&0Fn@cbWPH|YT)~R7iTObD2E=IA35QD!^;Of{P?CU z;eM?zbz(Z9)sg4g0|w;oNq8>E41VDbOi1r;cDD_^gm*Ov61EWMXpmKr@tRb5KNsq~ zoVptby_o(cNrk&Hjg!WJ`cxIOjplsTt~;aSWSi$+CCvAX=^j-U)#mePhc_!9cttFa z#{v!^M;jYj5glT<7ndJ#UZ0@lJ$cMHHH>Z5%M>dK%JGs&@fV3Fik!yLg?@3HWf4Z( z+Li}h1IRx~gxzKELeZ(ExZvU`E*O&okNn-vs)?b?Lz;PyCOGJ)j~7$h$>*>gGr=%5 z#y;#q-)X~b6!GIhgr%iRoO8XiZ(NT6KpM(9Re(0=iKfqsP7^+^q7(BaEnz#ZAeY3d zZxoIb0~GHxgLMdFl!RwkhL#KlH#N3y?5#z0+(aiuNCa_fl{~ZFGodB1taZMblpP;k z1Xf_Uv$j=s=Mfv#F4zqmB@bdeA#7z?+UQxl@U$H^vv3*0;;|?@EBxYSi&G#2XdtdRh!trF(me`c<#cCD46r%P(6 zujNG*jtc`!3U&a7Hi5~OkQC84iw$w9Bm9C+hdy{>(g%7Vv6&^Bd2r?ub4UJ=8NDXV zHr#a)O9(Y^(|DG>+cj=DajF^3tNqg|y_*qn_Jz z@(Iff7OHfO*qkaXc%v%GfweEt2KjN7qBUG23Z)Xc;-+tg%rxips5cbTpbGs#toM#p zIrYq#i3r^k3X?}2hPGS*x@=;aI><4gXm2Q<;X72+Y{uJFrDXO5Qb=z}5n#Z_ljitc zh+h}h^%}^FvWehU#5Bd(VpBcVUEOu-2{=EGYWLkwMzi`1UvsN?eUjCce(pmau-Fp* z=fK90;E6S1Jw@11Lj>_uoUSOfLYq7wFrs#6+w?;E@|_izxdJJ-ubh82k!$8ky#rfy zzGHp}mC%2qh@t}Wmef%XgQ*Wy@0LUQK_3KxIFuR$IMp7Op1scNT=owtQ` z`X!wI==lDLI9BNYwFNj_nm<#BmaZ$VxdPBS;}tk!&^C)z;5zePHv7O++D?19wU?LM zh{gjr{KuN0at)D<1J8wabhW9njj#j{%B=Y35;Pxz4#l+ z>#F%3tn(!^e9dyFjnnGw`L?YP2lfehImN8fGN%r{%hVugoV1=h=&$$-sO(h^qP20# zm7Gm1P)RsRR!*<8SiZZ;^kLDAEjc{b;5N}Oo4>XFG`J@l<9EsG9u2~hAP@1zrW2h+ zL5wRnzqufpy&zs}5k}rHRTrCD?Rfgy5iiw7$i~%2+TY240CJ9?yT{fApm}bZic`m2 z0s7sUf=1sMgcrc>FPJ_9vtI#_6q7I~r#Ghy=8f4M&pv1A*(|l~Wm8k&l_C1w z86Lz1)18NDZM5oJYzX#IbJ7Z$Cyr|8U5KhB?WdO*)a4W{BOYIWfeQF=Cct`T;nDmo zw;Ip17T5W+6?Ts>{XoFrqq4SbLMYDt8_bIDZ_$dyDJkvXr7;a@=@BKAI*Arm=0_U! zfrZb@)p&ImH@J0F%6pahF$E}K)D>VoOO*t352M=ZRcf_YyMw=pi4XlPu4OQN1!y?P z&qcehj!pH&hP+!+V;dj>fGn>7|Dm@Y6XH?#{-aj?P%75oe+8(mXIC9`mf0Jgw;C-X;&$U{O!C?a4rt=c)c!*p z3po0R?updLw<O`hYkh^w||aq*3TK$Ifglm8-a0W*E+Hxk}&ja&>EQ{XH^NVphUmxIe_>LWP2J-* z{+q9A{e5+MQ_1uXeQ^lJjb`m5KuSKeR&)a)XQ!$%5TQjg*NLf%ucl$FB{w|!0sc*YZ~q^x zj{iS%0$~hqZ-*S#rtoLh@6G{9Hb^kW$dLnv@GZ5=56neTw_8t7zx1NZxelbK?8 zFf3Ww_v_M9^XgM}uFS=IU4spb)DUnfjQI*cIT%wsqs)GxZl;>V)Dk#W>W=)j?GW}d`Tap- zf>~5%$`=4>XzYbU513n(19orDR1e+RXGjH2HG2NcY=>i|VYZJb#aDB4Jy67k1LuzQ zK`$7`J;VejwMinabf0OA`Mz1Lb9IpJGkdRnUF*ry+Pf?9_S(N3Nqz(q6SBs6UA5}1T?(vdmfD5h2Kz$7ligShi3 zv2F*FtUuputsGP$t)5I;tU7Zz&AF{Yyv@3fHlZtAZ0qmHmk$7!f$MA0sw~*J64lR0 z@bw*T!LJFprk1H{RBMa{JHlMO5*I^TXff`x@f(3gEK#(e=ph5Z)+6(g$`1Vg*Zj zs}biEb! zLa=kE<_fT>c!4LNRFc2F4MvXSk%E6Z{S~%_bAs^d)tv-16Y{sW3;uTJzf?#FECg`` zHUsJKYae5G9~*&e4<2A`nNQlj%%y#DG_U7-{5*wxwbUj4b!`os?GTq1#V@M=8BWt+ z`9k*2qMM9VCL2Q9%Ne%@BDN5_cM`_b!{OQsCG3-BJEztA*P713wnwQWOL@{`qlYU? zZpv+T9}nQpHTTGv9^WH#*!8@Z(W0HT3-RaJd3&c%+iY$4{d*XlspG5d8~GO`pN$WK z=C;iP^M;RLGpBj-N^R{42_Nv{7mApK70f*rq5N3DUquw$JFO-WTC7qzyD(n~VTj#b zPvsl_>gvZw{4AdFor3IVV*=o82zFQsY#qMvd*2bfc)WG~fwR#er+GqpLWsEkucsjt zcC-%B!XblOalmH?QGkiyXaek?WhbW5Nq{#(GMxA?C^Khb4!hJK!-k^B#Z@b_=O z3X+_Nb|LnYVwD+@mkxTddV%tfXZ8>FUwp8g7Unh8u$`cMLiCA_^OWGLsn4*(SAZ9< z2n<=Fv}xHw8iCR~f`Hh;zaGv9pF}$UY-8VOckgHQ>@CG9VC2I$9=d*;uaaqIIATMK zyF0kurr-%g#vk3I_z*N1Ox6b8xB_r~hnAp9qQz3z3F+*5|A#H)pM6gotG~3B$Cank zeEC^J8(aBN`nuvVW-VzwhtRko;+8A9_!G%+dDUA}7G0Bj0#AM{?VsM?`osuB%@zH) z4IMaq^9OPoftAESPMX(fB&?`?6hUEe2PW2t`{nX=}I`x?^9 zT&pvoI7wE$1YXw)1D*O{s$;x6>2|ES2*AmEu}!T2(qi?|WWm?Zq|D)d%B}E7;reRz z*5cP%$%YutoWe?Z_3G`3~^Rjfd!? z10Tt55E!d}p%ygB!3Y%{%*qH+2CeIBOhOEiqH%lUx<`x8q%AaO`maBzwS$1i?g@rT z0RxL+bhF+`h~XeUgieVC)<6=VjuaB(^<%vQ=en>YW_;C6A0I&x=go}@NWZT0sc|HE(-TR^k4{_9Xc@ZM_<$i zn}hB&pRZpU)*~k*Rm?@LWZQ!*pyGK+My6u*R{#>2_+{>MtQqEPUA1H#;#i@X6AoOsE0~!kx%RnL)mnL?C*&*+r z55Gmw-!CLz`6j1o>1AmFqqxjpLz2O}hjBLRoQLFk#qv>uu?LmzoM!lmmv^}4*LKZq z84#Rfzpf4c2vLoh#F-%vDWRslEwEMI>}MJ?;_)0s13Q}?(LBcA95fJP7k=08quw|Re}uuLlwN))``>ic~4-o|6|2qq!ZQ#AC`A6DM`>f zTG=xZ#pFY0G%;LDOHK=Ujyd#0rXxN*VdS1&bcH4>%-xQi959tCOPE>$@2m@B*O|C$ z+4AnZyPccvQpGQfzTD6vvAozbfL!zCa`Mn6)7RhSnoo*YW?fd&7n~&9>oY!N>v^^3 zw^5@y2lwwsCO<}k|Nm`ZON!_k3{B>jUltqg1M4nR+yzIDRTthLojGvcX$|`2b>@+Hjw&B4U2ZR` z7}ROg5qPh8`U`y+>Zy5lOTP$8u_fkz!-oVe#*;`?y{d>9%g~$$oIM0)+@i>E7M_q7 zmN4Yvvu?AyUo-QlnPasoTOeHt^2}OP}>;2A| zhy+u8yt$YKee;qaJVj??b6HApBMZ>1;V@jfTvRmMtJCIx^Zh{jF8VOXll(+L|Fgf~ z4-u%cH~ApqC4TY(yeM!4tCrsPHfom@$D)SgB&fdf+!13v z03n9~oJ_{D9hteq26>+ONImWT{Qes1oLbm9U#_ZtFK?B?m(AIOC)2yOg{#W%M(p%_ zpnen0BySi6CfibvnU%Q}iHSaIm|i^0Lx3DE_*M@OnMh&K}s9%SpHfg{h3?(PD}BOI`A?%tY|>1$}n8klo^!C<~j z%oia?`(-^vohZc9@KzyYC++a5)0vp~tc(kXm}N@y5(xfIZDSiD^=2chB;T1;%IS^Z zhg4^AFXtrLKmIpKTqwNAJXK#nkIs@{&nLjW`UE+C~UdJVX;mdl=xm4HNK{m{}93z*u4tig+=`jnSrTPca(zN*>`+zx)z)@-+ zT2AsfR=z6V!Q)MO==o`U?zbOppwmQ5N1bZ+=buRg^tQm+e}1V0FT)8 zznCh-AYR{YL+~;t3yyy`Ze4C|eDRF1VpqUk5}J`Vy8=wJ6SyxDc+ef3H@c~7U-IEM z3{6Ip{GW!Q+Ua`NTT=(WX*FREqhU;2(Kk}N*x7k`mEpaeh=Se@1kkeaXh^CF?)lb!1$Y}g zF|f7|Y?4H@wOs*54eQ7zz)`Y$dCV}ibuNnjU^>(O`5Mc;GsN1WvQ*I6j6U?B3rsw$Ud-iMKEw8|g?I_t8Q4cqHiTn+-&pnDcAxXj!Nk8w48uhun5;yg9^ z1nE9{dZ56yktG;|i7UWH4^*-@h<@%Q6=TMTRT@2K=EEHU`r5@yJ#sYq(8oiD{Lfrew}D% zmGQEwUIjAP0t&}zt>OAbY>EcS+Hqf6v)Fz_IvI^Er7*{Cf7%QQM0B`e zz=W+g7JLJL6Qe1k(T7U+6J(^)J%D67-L1Y#=cH+&IxP=;}s~;$YbG@IF;hv}vrkL!d&N zo@%x`)i6f|YRi_kJ)*s5h&kkWqW1NI_Vz)C^=i;whsd0L{VbjXThKkfb1luip*2TD z`{nZy(&y&Z6Bp4hJReCgZH0Cza8%<&Iu{2o{Q415r=ZYIr0Co_etM37iDIexWuM0Z z_-r{LUgU?r1$!F2F3mXY#{C?&W@E%1osL&09=^^d9o8?( z!TL9fa5ot+J=9dU)q>4-CPlu!A$LOKPCgH(>8K+LI>go$Gnpnd*jzD)Ud_3T3oPt* zzs#}sKMj}KshW51@b$~mNV!#&B0Y5Q@(HIG%ftZ$*o9}D45GkE5L7ol!btRXWId97 zR(5oQSBq3vPe*Lxp7En=8_u`lMe>Cn!!5p>Ym-5f$1CJmF|r z-uqc)VS?FjX#DiYEdwIgP{!*D6_30wokkI`L8a=}7NSWfl7cm|!br*F^2}}4#y$|e z%qx=Xe>BoeH>lJZP47nsy?eL%Ztdk+f{Z@Mv{l{+p&pHjUhd~fF?~J#L*M~fh(WXR zt0#9A#!avp5YN=cv?AxM76Ic|jSZ?ss*}FyyNdC+&d~BVf)OXQtTx{)D48W~8{U4% z^z+w-%PpAjDt$OKI_7530??ey5)I`T4VWI4S^P{_G%rh;wz2Xb8H^{|Is#f3fD8@@ z4!?~rI>aUY6#@<=7!83 zHGDj2vhs4bgK6q_r_Ab39OTR!o~+l_r#o1^Wl8w@S^q^+S;wyBylWoh^raS-Yq-x zi0J8w{mW@F<6o)z9;CJv1@`t$N?Hfq)|A#CJqDRQ>u@T3*MD-@Ay)JQo#$)Vs;aI@ zJZaUGa0QpZ+xt5y7_ncwq zE<0&xqC4{NS2Yq&3jHxN@TMdhXNn=|XQ9_|E#9@hGZ*w7;q6JIEk5;__x=V^p3@6* z>0x+1L636RBB)>PjYK=DQm?m@wL=j4MDjYsFPEo%rryILEkM2+4AKp`ZdDMEpnr(}7Ifv?B*YEtg-*?vo zR`|vtvVC#h1MIg*D}b9L)Ez+T`r6}MtH5Z$hxOd|PYv7X{`J0tSP%yBraXY4)-! z%cEp%dd-_|A;Cu9iH2pj-w>FUSJ;&Ty<*54`!;Tx)~8Nlhx;4N@<@BSw*_HLw6VQB z>+1=<#kqMU%eZ^(QO0w&jxs{ofr&YSW=T%=T!Wu>l3X$lAnA;03c}rsl|~lDCfj*f zc=xJE4caO(13mL>x=o=>;|oI1!>{7IEK1*{PPq9=*-yV(V(Ddjram+KIIV#->iQ&Z zY+N^DzQCuf+Yf1_(V)aP^INzwKiwn(b?c=ju|{81_=NmTRm+sZoIt4GzAHMZ--a1S z^b*EjzNS_B)6~v1uD9_|=*;^3_FMO+Sjcy8)NvWY`ewsNXq!0eqipvV5NV$|mSw$zyBd z#hAq#;x2GHG>MwW5ZsRP;#rYCo9k>HIcp{dfD+(&TKKSV+q9? z9-3e}fZLB)Ky}G33!?J9yl<-5=~2~Y@*9Rr;0qwnRLN!eh3eA&s^L;w(J>yLCpp%& zQm4E>;gRcM>HC>5;NbRb%C&Ctir#YZ!hW;&K%O1 z@H{5lOY`$RN&`dDcy2?U<9i(M|1Ixh`cHcl9(I?!6S@bHvf_M3vT|G1GMd}!OUd2k z!e(XfE^{1hoGdRu|!=q>M=tBw0YADFq*7JmI_2R&9F*%^gb!c^525RQiYF)5HO z`h`%Wm73#E-tN?t^Qf=;?0E%H$OupnOX0ZC)B2jBJ1yo?+}S)Q&=`6%U~fD(a8xAZ zW$LK0{x3~~Ipg8G0FQgzuKxf&5LoB`tK7reng%P5K122|H(6gt3r4~ueI%5J>#ev~ z$JdBLMm1v%NWK!{L6Ffst{mn(!KnIDSBXlShjjrK%@5D$>nWc&T_bI+x;_4m&QO`E z<}wFz`T6v)PW|*ybm+n`T^TN^u-IC)e4Lp1FZeZxdpf_qp+R42T-=qPajEAkkM>K_ zcR#=NH0mhaIC9pUsy_=@fN;JF*t+IDz&zd)fgt?|>mt@91UH|E`!lN=01Ktwr0Zh3 zWwc+9QqNoybp$2hci;IESDC2h<(p}}ISPJZw%G8oRcu>(#zURP+3K~_N1!Bka^iR9 z7luHmCkQL^j?7o5O`e$tHy!B|f0v$W0TxseNH`in-uPc#tN5WmIG7k+7*fhD8d z4jCVRtt`0t4?diO;#7(>oFL9w_F3i#UBRY^=l9+XUAsBu5#f^JsjxXo9%0n+%A!(P zeAhf&ftFDu)l<3T60!YGtrs)Fs}l3M-c@DwH)3Eh_x!%qod~bjpM66GLAL<}jSHPf z+aK5V_W8u;)8a)eW0QkIPmSytVw#iULv-_9EnlyOg~$q3oGYso={fm0|FO?Ttc*B( zi}-XuRa={X#Us)s#M6J>IO*3OK_=7`m<4L`x7I?yYJT|pPmHhlZh!P12RzHK+dvae z3KvzDIi)*6oP=^$nL~-ydHA9<1_-qD(01w*xrCC|)z)WA(rZF`#kZ^6m?S3oHhuuE z-}dV62Uu2v(D73+tE{z07tAXix#BOvt^ki(zgj4@KkDU+WZl0UJf^9 zey&XV!N@w_`e=lp|G83zhWqtZsKtOPoxW06 z2A)6A6H`CB0x>*da$@Nbe6J&|M1CjZao5J-^Guq@dNYH_eGySTi>EVU)AQ4hRoX;} zNh9y+(8a}zzD!Mq3siYK7|?&LbP}yJT5KpY*n4``aQ2!=P->_r6v2gJPP7Hyw~8DYQ|FILwcqMLf#Mej%MPW0fX>{}QIg`z)PJDRF3 z9FkLt$h1{+-?3+7{(ve_H#yrfm@rupn29$}*zz|Q7WCE7@zmTlLbbc2fdI zig7(lk_A&E#2YKi+H9OUvz|uS-$aJUM5=QRjC}AnGnaZ8zqGV*$bz5FW9;CAF=LVv zItU;N{SeRAJ~zE|@d|Y$>@HrJ1+a!JnKAPwItm6$=?Hk;aQ1V_0=Q-FUl`$dE)#G8 zm=|XQxuWQdSY@Y5=Va>~dE{V}wbHM*iK{<^H=S153K{!lD&6^zz5cZ+>q$NJzcgF*e`gW?Wtclc2idPA_IcnJIi~x3taC+L?PwF zst+X_#;LUz4t_NRiU1q+3v9-fNmuxunV1BpUjuE5QI+H{!jeZi+HH~v`bQj7_)~1< z7c4QDHfTidPf~RKxm$xf)p?R?zF%~eowRu`ZH3011n)7(NkqROaF~HVwkaBCbnyyW zwbYMSt--qI|IAQTo?6iOma07uo?di);+Mqn=%i}^oNe}&LFvJ z6u`l|@uvcvVyUNd*fXT7LwArAM*i0hhSvKEK!$yV8hskEZ$7Bs@_vvt`-`e~-RW~u zgMMRlxTDE~<8;@6YJ}H1cs~%87y0Lx4ZV+HD7XB~Zx;Mq&8!)#VeWEYlf2+q>LqQ{ zIFpB19hs9{sMvL)>s1Ur>vz~1$Sf9TQc~NCRQ0^frRra-jvU2Xr7mfzItlIj27P{P zt-(6b3S_`ZV6^&zDWJSo7=g+H&V5C30oOYfvYZPInaKr76ORU@b}gvb2iTSCr0RKF zLcNtFX&sMu&5iS-Tpu(Z(nfv~pZVqYq@}_G7e5u#ws;>Xp6%7h)QHTb`hG(br2Dn* zhezYb<&g!;*5Bp`c!9W%N@8N{QJ~GnS$8`#?&+VTIGn8WDMwLf)bD|;XWbUfrY?`h z2gd+X#DgMX!oAE#_KQDF9y|Iq1zF`g9WVb(I@Nzi>hRS!hI6Fr$E_F8Y~KI z78EhP{kjdp8Y)#;zy6%-O8#j5^dxREgKtg@HT!8M_keU(;${kpQ#1KNtp?|Qy$YYpijSt|3NOQ4W_^Mu?&SZ3r>53KX{t>u?V zxjY#jQ92HqaV6;D%nOYPcV(h-EMcLI{A~Yelm{DL{w&VI$!vSg&i;l;qWmug#Stb= zUWv+vK5h4offBlwyCQBrH>uKiITD^4l?V+S>vY!_2#xAj3+#_nmQIvg8|t%UIR{2) zyv`+Std9{ucYJno;2(&3&EG&yIm@)0DiZd3!-GGH7dkvFyU_Sg_7oVytYv;_RYFO@ zqT=@@(eI^tCiGRVvsKf)8(XA++jqM9wf>WE1CSzMSH4`@u0yZJz@ldAt>vBhF85my z01j%oyX(B=P*f(@DLd-)wIa?rxwz;k^9HNul=m{TZ-Gy@sy_)3wBWQ4U>0`nVIFTuLp*@NK828z z-(~wmo%T1#ZJIw!*o!Rm%1vj)R_70lRQkk;nX>MyN$kZ-za&Y86Ssj+)3Ju@!L>Ww zasO>KY*9fSGPj5G!#2>#O?aNR`ahk)AMKC!8|P9 zd2)L=>5isW5EsdVF#$s(^vOHDPfke?AKBmK=6x?(zVQu9xo}zy1JZd(H|g~C3U}T) zwzxJV)b59oQnmpMOYZ_+=IR{il65u?Ff_U3#%m$3yXBoF`T;px*<`6BawQ1_nUa0Y6>uOvdW2+?bTAZmzi5D^4H5WP(FIt0OB zkPv0`E_(Fn5u>;0(WA$xGdjTx34<{?&wAhep6fbi?Y-7Md+#sjgO6M@F6Oz*|M$BI zk8yvAdh>7NuZ8%dEnNnmHFgbTxC#@>d9#w2#>rKgTB4Zm4e?|q-leS^`WBnCq4ZU{ zTbG6~5ps(p1xeLpA|5y;oiB)9uAo*)X`}PO`h)$|Q8yI61rqc$``}766fqS7vJ2=!EMq z$&RUZZLC3W0Gpq0C(E3qGmDXan~n39*97!fu2$y{+1FaB+ z=LygJ7L6bfHB8;>z~&Crqs;|s$k$a&{f)FnGoc!WoL409rT(R1aO z_Jp5i0D;B01dVGKE}w8l9XwUw)06(O|8&Zq^}w@xySnAQ`0=v{)r4Eq^=fvBwH+S@ zbZ_c(nuh6p-dDq~_IbIghXjayFf7v-dE*sbpMGYlDWI)mX1;ml`(um1?vhWdI7k&bENslKsN;-eNWQJ@Q;T~ybbuNAmnf1<&psC{T5t&xI`lv_( zeT=G&LRi}Njn(4yXC>wLMTyP8Q14e?XMD)4shl?^9Jf;Ac-p>4s5H4HaZ0Y*_ZNdL zR$+H=L0DM&D-NPUZ zkK(i3m+%q~JbxgNIcHP-aDrhYyFKXp14ONev*ZI7=M@28Ba1^bd%cP`J4L|Xr};U1 zNYq~<2pL|>86_J25-PR2))n)IlcF)3FHSP<>AVU8gAx-(a(_i;$XnAQnJCqs+iASM zlR`P^o-o|Wh?AP=TSfGjg>|7Eq0&!gg4v*r-X*&%gJEhJw&hm&A`ffU80L4TEhMkn zSs`Yxz(V(h9V2z5DSFoL=Z|J0@h)Y4T!GLb<>%m#*S&9>_ywM zB;V;JRrZPW>Ea!3)j047t92aD%zf}wohixP$T#$Rt<%vih3)p7zP?^6n?GCH;#Fu1 zPI{$NHS4K!$e3fExecA$o_-7o?V{^)&5z&!wP4eW&>mFFN~f?nmYccD0O%n}A-{u; zrtoJBcsH=7iG6Z|sqo~^FVCQt%E@2<^LrS~Nv-6uQ>W`tz?5erBD8febL)y?_}?JyMci$g!;}&VE{WMcZMR zsW3w)>u|}v)o8dq+{h$n;2XkA!#d9O@)<6pFQ3+DB5ajaq`F-eldU^@(5~c18ZYtC zgJW;3bNh|$*VmFcEb}FEv#EOeh!0jYvJHJmAJAsLJB$) zXj&P~#CQvCFK;m&SrZFb2*eRyz2|CnbzUcR(b~LZ_NBhtEAyA=z|9WK!Dc;BCwo}`# zb9+JD8=gZTTT#3Fo~g+2`vN1OY>PJ)%@=O$U#P#w-^J9d_Y?T*rheB_cGf+1K@uv% z-`hK_pOjkBOA0jyiXLV{Kd@nB#Pa|}ka=GgUsTOu)m@8- z;dA`F@~29a2zJ*2D;iuFM|m|6CpL-^$+nv)A8$N+ zq`N7W>?BUVp=g$q#{58w#Hm2+7hVDvQU(*iki17xaRu(@K2}9&$@@15mNw@msa8bd5u%QmDy8ci*i|w;^|q-qm~^t@|ENHKe9?J zDW6;~M5B6|7SOiN0pBMG<%HdP*QF|HgT^O!qVb=yC3;(}MrVIMbUtH7a0`hz*b zdQMpsy9zB_NrZ#77N;RnDUPSwy~BoTCu~Cv1osdq93hxlaJcV3^%h0em@nQLCsl=< zb{O+EON6HzGZ@zqv{pjx_b35b5l5GL+x4 zZ=LR0Df#?3aZ!+?=8$Rpt&`+c; za+Z0u?ulSC<-qIO^gaEaEZ-}I^o5dSh-q5bX=eUVeu}*#xaolu)tOZk#QRPvve)C4 ze*AIehX5N2a+lVIzB87#&uJ<8CI#?9C-Y&}MEDJdC5^jqx-sj$PDLCadX*8^t3M~v z6>BAcsSck%1*aA5elbNb{3Wt)c6LD8!L!eXee?WfY0t54??LiC7j&Go!4l9B^c4`_ z2tg_0T-VxK8fwY+kdAP!#uS}aEr-aL)67qMnVPIA#og0i!HdlOLBT;Q{@~1LpCw4>`tyR=*oG<=T)#WjRIKQ+lmh>c^no zHQhx5DNt^1m&5MPAlf>Nd$Z_M<@#$%inJjW%9Z95fbHaKOr{#QiN1dUJdx7h$;Q+s z*Rc-6_@V*#{!$3`1RL4A%>50i+o#3a)!>p*T`*Cy+hxPZi7f3|`Ln4S@!U*1-$^a5 z;1Wb69#vf{n2n>y%A?hLgQQR448e3^8i3Lu&Q`TEy2rFY#mz@!al{(}>b2=RoBTX} zoNU=sFER^*$rkLUjG!%5db2#Dg&>ex{0PGg$CkM{l`>6V5;r2M#5UQ)TEOwuD-Ypf zF=7YZMXyfQbm{%nG{f7PsSahuOY1CeQVeC?$|zj5mo>GAI`p=5nnVQ~cXt~a0{zbv z%RBP>Lh7nVgV|az8R0N0Pjsc)lurn)r4}a~$hp(Hs-}-Si4UxZ`MhoN=2u_d>Z1{{ z4yO$oGgzzbOZZ@R6y=Dsy?nZB_Gdfdtpdwmq8C44Vt%LQaXQP}QDy^knyU^;rZo@1Rcs?~=wPg3=t<(ya2kk!N2i`iWQBEgwCLvV( z7JAMwC~1U6vlEOo`5s%>{JTZ*foNdiy9)nd1)qdoF#xX_Tr0j?m`0i-x}=P^HiF9)Ki`x7GN=KF!9w#ph$-h;5d zIH@G+1fR>Mt~rs+nuA6A8?MaXPdwKfS9ZZJHL@rUFp zi%V9;{tign1Fc%uG%eBLF7|e$9C48p@A|gGssC$w^27Bj^b+Wob*M)T%yqrm`&0yh zorsYrYfaxftl9FgA<-`*r0gfAbk$MNPC$}4=x+y z*W0R4)?G`xw{oWw*Ix-8QES4?uGF)c`3%$ser9NBtLt#&)pER4DCsQ8WZsN_^}MJ# z-3gu=tQ|LMBoNCN8*8scGoqU(O!)J8Fmvct%I2xQhVn_z*s_{ldM-9n5aDOG*tEP_ zvz-&tEk}^rS3+FP_jKKGm6GSeDLYH<@BP3f{VHp-EM4hWO%*6~Lc{SH%Q^2Th6{}& zwhxXzAi+^ER%|^w;=Q*sTE2@MJVqMzc1-6~o*&WX?=DRdqh4jZ?xiM|AF{Yy5^thXN16K82N$q}UGE?z8IuBu7327{X zngq`~50c7z*p>fm=J)SekTl9Q(AD~Lw~)<>vYh4j12)f0X~+rKLw-RsrY$(3oAZw3 zQ4BJ@Ea;O~33YftX(Ta$6C0lZdoaUsfPD3l)!&*wj)vm+dztM$N*+<3H~JXf`cH$X zhlD#L>z4B9u6RTO)xbquV}~abM2ERZAY$9*IjHO=J>1mNHk~(RRJ>B-1m|M-<*r`& zt)XeZR9W|PM-Ef(AyFUo=gq@3SOZdLxa*fYOlOw)?iRZjjRy1~r)qtMQFhfW(T>HAIz=-n67hcNp~$6W$#@&UWv#BpM1wy`~xvnzpc&F zLwnY!Z$b*Ld*E<5+KIq~QwF*0i^gWC*Rw2^Wkhry8ypb(zvcyv{Uv&H^EaR?ozcJh zK4mIBYv*eb_vg3P5k}0!0W3r~_kFZt+NC)z__Fu3QySCMlmA{^S2$%+IRwJdfM%jK zGW9KZ-DouR$PHG_U8}?&aB0wM6kwH)S{9gpc1I-UX0e`0j1kqH_b+dq-gz#Fpk({q z@4t-~_v@y<;0~b%2Iv_8gSKwCo8^${Sh(Am6`b#UGd#Rl<7P)S!bYYb?#ZiXszd_s zh=?eO_-~Bl*{am62B~O!U1+JZiFREOk6A<%rf-?e*rRsoDN4lf&v9YV`ACHy4@D!}vE~?XR=! z5)}@s?zjGiIu&D?T4@>q^* zUUy&G&Rwo(f8$a(HEVS|R+IkHoyT0AjK^R06<8wG&2~$uH|+T2eSs>Gfm6fvvl4em zsN8!OswVEn7CqaOUU}IAcHlbMp$-vFOyT8X!FJ4uvU$8xVy$-BJUNf&;ikmQVXiIrX!~C0ydNsQ;iIkm_F3DkB)i&huX25Z|Dk;=hsir$(@p=(o+_7j z+kyjR!tsJ5l1lK-yI-%eYwJegmr7D2W8BRcM#NbTtQhRb|@LC~#1(=b^{w0p(9p8+nKt ziok7Vve!wC0lyPfqyf9;-Nx#SaT`n>5JuQI*c;8gx%|5yAUn;~qDvWim`+$TiOEEN z*#8XhKJ~837tHD?yLs5{t*bV@Rd4YX!h1yTYcDl>ut;FSm*J`}Ig~#GK6r8*7*IXl z%YK2SjzG`6Z98J*kN?$8AKt5e;|}P1Vo=I=4!c{Jcj}2~NpWkOxoR_p9w3xafQutc z2SeYV+kvRZJ)M48-}ZIJT`Z8!NTC1FA!#kJ#E1OBtsk6n=KlH**H1%m4|y93V2`ir z2zOjKfN%9!Gry#w0zEFL;?!MPVVGVnPMFYRM#VM!UbKl7N~+=?R?lQ+i~NOJ>$*i4 z0w`p~A|I?5KVI)D6BUAc4ifc7?KA%oRM0exwR|vJbf9<7M77)0@)`e+?_1Br1dV?! z31{0>py~|zhYdE%$t&{tx&-?l@DMmd&YT+<)<-J@AJpbrb|s8tHwM6XfONR@Nfoj(an=E&6*o%DKLy5w`Ceaf~&1`@cwfl$)-6b-th zu_?>o0c2S(AjSt%Hc%+sRcpm%qW6P1)v$^gMc_TRx6KQpSxSGZPx+_6GnsOzrxm4) zT2m^y>QY{{2H)RV60qv>R>&KF!hnNJg>v=cM^v;@iy zZ9W{lEbSb?P#=V$ulRbq>eFLTxs1K}cZBh(1&6c05AN`0R;b<26edS5$QSEXiFOG+ zW-CN)&O!>JTCeh~MR^%6BdrvGQvRjJ=Rz0a53Nf%w}4(^Py5H+j?3dX#Sh=VQ~`ub2P!CC;-O3FMZzRwFw3lN3|>!yr8K($S7d3aqC0(fMEk>k z*Zt&Xt`V#7WFP(USN<$&UK;kU3c^sxbw%F2PKg$*(qQdfU>$5&iPM>yP@R06I-9&D zFD=#`$Ze&1XYoOgSpEG?2Zv-D(TT4}mlGFH60Ug5@X2bTV@*|Vg~s^H=s8PR(>xFs#MB~hta%);Vp#`{ah%;z2^gDA2#CE@xolr- z*=cU>)SS6ESHrmgx>cVtnyl(rj&=3xnRLDQ`PHFC_=IGtP8<>sjH4$Grz+@yOP)7EUf8q#$xUyGU@EukYtjN=e2mTkavIBP2a{?>h$dZ zmJYoDa6> z8z+K2`~s#5WHvZJ*mV<}fmU5-NAjF~^B32L4dQmr!Nb@=Zx4_6nRM-WPoAS<{0z%s zVlk&;ILkF~R6bolm6u5IpkTegDk8{Ru?+yWpGrh{f%U6q8mijv?}aI)39)cw@dz=n?o82D?H-l~H9D6GnQYb;U+>hyBqfiqvH z5&7M0Xh#FBiQp7Xu1$NYq_34Un`2QVTk!=~I;|s~+fvc$A|Tu&$NzlpFhCdmtJUcu zIO7B~ahfrS2UqQ-Bai;ZXRInjVb}a$U2@Dz5in{Jd%2R>6JIQe+pP<1U+ID_NYoCCvy^N_56t;Tr18ITj9AJ6--O(t6sZ zzH;s^1oL3QIus|ZA{n&E9EZaA^~jmKTo?ny7x~WFiP>1;RVi|1VT!JyDFVHxpeZ{V za~Ea$N_J(iEt7Zu5m?1!w#+}ufIDTR2BTjM}`Cs3RM=4<^d59XpSda0w2 z;W)!`r2QNs9=RN`$ZS72Tqe0P&+V{viHHRM(Y2r#@o@eP-XU14FKtSKMX}GfEM}+ zJvomyGhmtei=Al7JLG>-*D$IYY%HG<4aV*Dt|h6gaE8eq4GtYc#<2&iOy@C=*6{6X zcm9nHzHx46RUF~vl^%<=HBWsz|1 z$Oh$grg@}XW3}xkXXDnqvOteA=f;;EW3!t}m2{7uMVoH;*<7#q%u{!dh)nWibwD%{ zup)8B$r<-ihqWg3j<_;lj-CDD(BU2FTBz+I0qP}Krx___xMrhWhUe>7MC3ryMhULS zvdz&OHn>=40kJ|{Is+8n@tdKX2^5g*LN&nJf+fP|H3f6tki08PY&|y zp|`8Qv%m-?FuBm6nMoWTR;DB)zN1QH{@-Ap8~^W={eQIm|75HBzfF|nr>ia}HH68H zb4901>9pJxtNwBPUm}L9E17|n^Gf>sQuXUrdjqVdK!;QEScCr`9nL*=aevDK<5;h_ zL!I#dh-A@QZ68?qlr7-%`Nou-PrTbke*RoYK(E%DLj-r!SA|UWPurMte7DkYc`37xi;q8p|-Ct&3$24`buH^JyRmOK}wgV#k!7x?_)G+}fY; z%+|mxJ!*bZx!mHL;i0WmRfzSgjmi9KpS*G8uV`*~E)C}m=GgDP=)%+8STkzD22S@h zE!djOwF^o|;PtR~H5#TRAu4KW2+V0-p2gt7Q}Z-YzU*sn)?kGXbF?TxWTbr|^aK{C zzeHdB4*bfY1_rYrE!5G%G} zbsyHaa~?3P)(wh>RjSE`^O?Oxk)Zgyo8|i}pJoUhIqE-bQ#&bRZk#E`6SO(G8&+3O zLPT3~AH#HT+GwSptoj(om`_vfR0?Hb!al&L85gY9p5E`6%C5L4GxubCY82v5>7~`8 zJ!*r(@}3?y2j7R?SE_I7Q=)>NJnsbGMTWd~Wf`bL{Va9FdSnw*yM}5WzJjoji&M%9` z4QKCreXi+|q-||M>Z6YmF%tv%H}Lmywx5yErnR86UTQK^D9iYvmOQRn1g!Ud3!1M> zLn=Pe=-NN@@jA;NcH6htqD^5(7?SyQ=>tw{^g-~5)lBCjsKc3RN8=n`Y&`}paV6GZ z{48BY_y@Di>#yP(cb}ZrM6k&sjG{&YP6m9HsB3>85yMF9ah0fSQAVhi0rqxEvFV5l zPgnXL+1A|;IiTL}40jfJ2WW>_5a~y4+g%r=DwxCSGMqPxw0|OcODWQfG!jJPU+5ZO zHsa@~kTS#+FT1X#Q5Zcl!sZ$^MI+<|dKB(YEDSk9yJ+#pbKlj!<0EFU6_(s#jx^FC z*U>ac6&}-kqgUQKsce^lKp0J~Hmz=M2i?B0&iU)47$$;I%f)!3zGF6m1+fl=E05c! zKnCSw)l~FC=o8OUB&(4$`3nysUdHA;g}uqq7;f|9xy}bOiWD#*T+*clcwuM7u}|Yb z$gN%a)Dg4Xhjbk-7w)5slkD^JGw1NRv*d{SOI?kCGJp0aIF`q1Zh&hHy8ZStI#W~0Rx`U5^P=@g&O zv>?4=b1F2nMg0*iHbqPw0-7sh)vIE&EY2DWzULuUxw=ImYjIs9heC>U_$Rnr_LY>s zL}b)aHMf&WCL|Gl9Bwm;U|s&$wNw<4wi$LE%pMrHXWVLhkj4{UfsZML<@H)Y{tKz>|9 zAZN53XLtd|w=%GBkHu%~U@+Pms+yKsCt-arNh@**HKCl}hLD42aj2jA<2owwc1_se zqBjJFjvo>S)`&4d1I)nZvlw44IPsRModM^O7QO6wTKCJzsO|iD*TGKG;BhNjobu;o zTx4$wG)vaU_5NKG*R1w4G7nZu3(H@}xly-k-|nX`sgaGJJNnziS#+8ROjh1Dn~M%J zcJ6f8Sl&Er^BUBu1TVKWBlE@UfBb4tBHlY&rF*MH*SpScG@?5Fdp}z+f#PXmw%~%j z)37c#ooLH-jz}dxXVu3-BPb2k)!24R?>i3fMm%mMmXlja2<(v^QlD@Xwo-Y#N_aLU zD!PF*TH#F;RQ%C*n^CcNjoKTqlTiJh_|-+?{Mks1XXrG-X>eu5?;*&`H;pqw-Z)7g zvG-Zc=*%!J+03%TEp2&mcKLTlvV`WKwkn;`4Z$*G7lLQc`R&|)=q-R{%>Tj{iEa!?xCFP|(+Y_5+rW)Gt^KLUpg&C?C(nOqM#$dv zx-*hyBVJ6CcT4gFjF($KwE^VX_JADw%HS_ivg_`Zxl!E@iOOYNgN~+Y#3H}d*52`< zVKft$s?f1~-8I8kv?hr}#927N7zxz8`3#DRI{}gt2NIoRxPUxP=jv??Uu<>N*g*Md zD35t%)IuZwhdw>%6~QGD%QK0XDk3DxaEg5S3b7C}9pHC!^p z6fLNf{ao~q<4Yla&K)N$EA-RwhLDELMhaLdc$C13a|I4K5-_Dkb@VXHZF z;^4!k(9Oab4Y)|ru9%^;E<^P>9?+UJ^{p7WJ2X%l(p|IcU! zRM#fh_k;P{(%E%U6YzFU7F)-RqyE6sP%4BNqrm(kYw%`L4tMf%S18m%DsrFPjHp z|1eEf;r_^HAR0dIO2c`kqE?pk*fAo{S2i>dwM6)m1n&4x&*!HFS3XZ4nwWof`YB=3 z^1!=MDgR#B-~__%&!7a6NxkIUCzd}V?{aR!4V4=?^n(xThIls5w`p&GGaMeAJ`xE= zq7ckgb6b{2Z+JfZj(FVql2g9^W5hC`aCrY+pUNb~phZioJR${ptnx5UcowxPw?Vb@ zBKzsF?&vEFbmtaHI6e44Jj5v||5u8?qH*SFds#-C%tGAanQeYstltE^m4eRZfv|&| zHd;fXP`b%65=N0M-9ify{HFBK_WSy0A{Kg`e}$SwbY@!pQOo!0SyoZ&F6z2 z)$6CbW)nT}Z`@wQaY5o8dvS`J;jIyIVX867#`3o3$G1SROEp~!?B4pN|*_83t-7u=#F3C&r zx7$cg`Tew6AH@g2MTsdqXKmN}-xNU}{dabc6f+qBU$^PR8yS<#FpuSgkJss0uf3?- zXg#m(1d2YNwb)1d%wOfYG-LbbXLmO-gArxyum{u}JrRNTsKE`YVXl6gjhCRb(!S1A zAMk}Q@Hw5GzxMckZ<7pC*}?PTFs|qKNYG=2aE7}XdXMtQsQV+{~2J3`&U z+sZ+)#B}cJKvEm2xThnCiq@H^O4j$N^xL!0*HZV!W&jW9UILje_VHkVG;ko~C+rnQ zI;sjiUHxZUmy7ve(^<2B3*l82?4mA{HP$WkLy*Mo$&}euJm}^cHM~=F3S?ad*wlkr zU6qh0J7(Z8Nk2<>DrI+}glxAt1Ev*0Sq}5!n;X8VI`?UXhU;}NQn0nC(@bnOsw)o9 z2M{lNX7NcO&UEq;m)Rz@9%iy;&qsxhi49n*y!djuHEftYo29qLn*exreo9dk%1g}x zmF^`xz)_=Jf7Yh=ehYrk9DOXTcF1JX4RIDaQSl~Ad!42Bxac*b{dEa|xwTDkXs(hX zsrSfw?2=P5+OpPSmcW&owT;RTKlH9^~7 zihCMZOR@@6o|jl zFCBu%zL?_`F|h&h#nwNHv8>Rikb9O(Cgw}cO&atMqBKXpYSFD&Py$w^G0PEemeY{> zu7TRc>46Zp8PLOGUG$|Og|^(VGTN{)lvCK(qGxzoizZ#;HB5uwAqm~0=CHi+yvsR! zq8^kjQmHZR8~WkZCIuh0zjD(p4b>8CV4I`M=vZ4p7ys>wNtl zi`1sr?XW{U#M&MuzYCF6qQtAV#HiOd(e?uX79wlbqcD$efv)BmIjqi|VEcVnffEtF z2)J>S)-QEqIPV?=vzzmTuJ=-V`rYh`Y*&ZS-C6c;e4`?fAwB#e>7kbcIEycy_+vW_ zc14I2DC`qhI*VK`LO!(LE!$s>3YFC+bV@=SR`=d21>#g{eMM4OwPZ8)Dn zZ>%YGi!QJZl{7Z@$-*{l`vx) z+*xlIJNOhkX)^^fuXb+rS)$z!Am0mk(@`Hfr6II7Q|11G!@`xknBtx?H*D4Zdsxyt?+fP$SEuXGfeVhZ97L3d1@|tWLb3QBwYZX>%rBkF?0nIKR3U~uTVmWV% zN+>a_S1dsT$O>m_s^9v%Gnl6}c|MF9B(bu8Qv&-^)tC5^j6up`VqyLX&K*WW9T&`s zlcOfxC5T5*={PZJ5hl{UMe$e{ej~5ACcu5Q$moBkDa-QGgAO-5-5t!1<>;tfTte<# z(8soh_x~hEKevS!Ck|Bf!(Wy~+~6w>n5B*c)4Fx?12#O4hm(k9eFbhXf-y<*s<|b6`Y<1yvFf%u~-I;;c zX)WLRA3qKSWF_TO5v?Dcr4x9>KTa)Mv7gjDS@|%85aq%5>ypO5`=RaT6d=M9goh-CmI^{a1C#CyLbn zUEwIti$UWSgMj3FpmaNOk zi%Obj`*CylzhlsxwENc<)f>Pn0nrrO0N}?gr1*Pz_XxuPe*+wCz`i=a@H_RxM@np8 z=DS`RuUxHOBy>zHo$uV(`Cq!)1jvg7U4Zp)L+SGFMR+meDWfL{xF#(I=gN}0Y01uX zXIS}O=p*IY&{E(9j4Q#-YT~GWF|J)!i>&mpMiI467CJg)*@*|0qzu0vhF>OvzGGY9 zw7iOh+L$i418{!`2|*0%hi;0*dt*kv8LdB)W1E7Gt_=BAh~}M0TxYuB5iLF`hj8IB zavXuYzD4SBDdR+V6p4oX*($k|{s(~_Ijs&2UM*X8J~N9u7}2IN=|#R4x=%kMSS!SR z52G3+2^J%K4`EZh5A*JvX|Qx0;3R7|MhUvwa)5}lqQTw1mXyI>meNDa%F>3!iOp-0 zL9+iLXX8}d@2cZ`FL`BP3IuHV8!$CZ<++ZA7|WWlW#XZl>n!n{(DxnfAXmV(X;rka_j6`q0@r6zw-N};)x z$tE&YJ>c(qcH?Q~Vo>FH+ogKS#(B}N6(c|YKt}l!y!qMhb=JVGs{ibl0eB_x!C^9Q zYu1Wdt2L!3ErZ{&{R7S$X-MXlLH^EfJBESz4gPcaj>oWkiL0`)@gq@NTL-0>;PG}_ zKiJEg(f@VV>!g;NnfKP7-;?}BQ~z;24V%B5S$t3I z+X)-6nc2?48Cd*)g`h*26KGwt2$|l+${x;ZpXX*@M?+u4PTWwOSkY?cU*(ETU-?yd zpR^^iRxK;*Qz}@XKEHjbdgKAStbWGh;A3AstK;-q-t1Kj$maA2tqO?OV4j$h9xz=n z=OQfF@|kOfx49GHiKUcAsPa~UI00uqc%9KMwb0kh>O5w6g^!k*tO5qN=@n z@`Q2Wr=!fYAKIeSd6rlxm zM@oth(#6Jc39jEa>8E*pn=Fp(vWTO`F}}C;Yxgi?sGqx78FQe{vn>5syN*;xAEwfI zk@DrrXIuwk^V?15Ir-s=d^q`j0%yuVt5P)N2qZ0)#_(x=LMg-X=2ygdX3RV8*ZPKu zVmCoKGWrcE>$Nz;;0L(+H4kcN?IrMuioO{MoWS!MxOBDb|KjFvOG>yP56JfB3WbcQ zZv&yK{BKIsz&z5J+zP5|gk^xQeJ-4N8$yE9Jo&|Yg;rNXK)Yto6~XCreVqaPsVXDC zLY_?H@1w=m0m-{7%PSVn2pCN%&Uan68M8c)!aP&Wlema@qXH6VLdOyFS0$xz9(uz4 z)K1T*3f`A!*zy~vvYu9qeQri7qPOCfT2c@l-&L3UHC&`NRs}7)YIo}suZlrrn5OUU>$lQqYS@F~+3l+84Mo=JB_-B%l1k49VJVk54N8v~A1W?7mtQitf+DX74N; zXw}dCUhI(9Lxci2LVNhZAw;Celq-)KK;yS%w3UAPY@7kM>;IR?@**z~laG4V8Zy8NTzKUm#$}RJWAghS zt-1!J!%J|%k39pqRauHdcCc_>yQBwi$o;XcLmczTTd2hl<*Uj+x|~p{k$$9T4>cz% z8E~Q3w#aO>ajxFwbpFwe2XlidS1(+SWn{$~f0~aOp2TuAVHW$0jpqrxm?Qi>zZHr} zkeDAsM)BCA_rj7C_MuXy!pXey+!hBEvDXlGGU@zntpDQU%g8^%mAoN;{9=XsJ_Y2yR{M>Ai9$x*GfEbAvLL0oWoF9OWeYv&r*r9bRi4VU z{QnU!{!BzfLPSJ<%oz`CPW}KAib+KtobA9PsC-{A%ZF}H{~BFT){`kDw4_6P5nhzw zmqB)(eeGQ@-P_Q>5U0XU57PMR&^{qm>6)gFEazRGX>EyV=jF%Fsv4#_()gG8i2NRp zb5Cr>dytm%p=}w)J z4b2ns3L>Iw?})B<8eNqa z9<{E=VZ>`lgNStprTziO=98A;3NXYtE3Gkam3g6R;Ul3^%xS&Q*_%CvVV)1deMe-i zeV?0MBeXY!!V43H;J@j=?!DbbU6t~s$C)-}NC?QN9$y~E+GS-dB)^F{<4hJefV2tg z|8AMb>&@UH#W>$N52Bp_qpoVHB4@U_*8WS=zVtZp82F6}S)tDwyWd7`CZ($I3a8fL zRS2WgRU)FIAW>V|pqdNRaL36_R=VT@_>Os*K2%<#2WN|A1U9RkEI7N~Vpm0uS&?5h zgqhZP22O-|v+8OJc_A}X?oTor*2qJ&ELjIyP?rVAirPx@SQDk*$=Z$z-%JKC?nxgx zyW2S5u^jzM>|n#_$;?b~ax<~8moHL)*2n1j5B=CIudS~EB~{s*n?{qB?#n9?P17HL z1CPS?uRVZ_@c+o6oPWj${ttUzjYqmTgnjZORuPer1fiy02pAm_QG{9CQKP=SsP6xH zXCCbQIH*w2PryPmmL~JIdg|lu-XL~#u9Ds?{&D5cor}63K7p08pXz6gmPM#ie|=Dw zffG!n#Hi|;A>_>;`?@pz|>?g$FA41)yM!>)B9`w7Re-Z z9PMk~PuR=81wtIrx(A$S>KF>lqA|`IRSuHMVoX8{I{o^??y!Hr1x9GOherd_EkW5O z*z`~9;KEv96J;C2iBvJbiqxWYV}gZR+Axy+*(!xQ0dq07WqZ~4lcj*M`a#MWlWG#I zh?_Hii|BK0)qjd%WYbfP0vY#)-wo3^``&(pYz^+Wi{s(`=HNHyZcf zeUs%&GNad3a|q(<&-)|E_ejm`RMOBq3=xdExkj=-$cBAF>%tP$SZOa=vLvX`UfHnj z{vkwViRQaxe^u5|@1n0-f@hIxf4{y!$=RxY^rQh^|@`Cl+*e5KA-X{JVJjXP^q0FOv&)CDc zauNLGOP}J1`}Zw|(M+#zDJQW+)HgMx)w-?g1|&!j$vFr}4g!MYR+KE!1xQA6&Y_W(C^>_GWDE!r zB@5l;oF!+F21F2~8?b34c&B0QQ+KUfxX;=9+*`Nm{Ght{)AfCGj@fg3?-=8G`zV-_ z%6-DRL31LEYLupH?o`6GJlZMHngx@TSbbg(Gm;9PrH5*IDZYBDvj#k74g1U6qpNvg zfi=tB$1O2)vS$r1p*KU7(*f@3V~c$g19mC91_+{290hY;eB&A%sk~;L*nKx~LG6o6 zAtR~(%ZxIcw@EHfJ2-Bp2A^cy@@-r3Ni+2vsHmi@Q5Whkl zR@d{5FHGq2d>8vdgGZ6!(@`q!rT^y;1ZI&^@IkKbOg zOOLVD{zQQH0FV@^{~=?_Fy>P0=SyjnuE{&Yl+|Dvuf)PLpWE{aN}*HVxf@LbCi!B9 z-!3EY`ctM${p&2EMU5^5nLW=MEUG}yeDLDk2a4BNlFy7i_6-xdh=4YNRTbpb;cCkj z*pSPZ+Odgr9^buMB}#xgun)dKQ?eBg$?oHvwY;t7BHl1Omy*GMLPdf-{G2 z9;XhAGT!R1ZsquL4HeEgF-g7fKzzXnW-rO3dZ-s&JEpqn>g&NYRWE?)=m{Xk@U6t~ zjgUJ^1%}lqHb!WMIL_X2&nR#%YLL}jvaxJ0hE)=lc1ZQCn1&W%2HNGM6OLUqCa#-M zn+Oi5Kaz*+j9rAk;uC8=En_=!kQ`RlnV;h}lrrT;$-P*W{szJ;45`^A#C&S6+Cl<* z`|K?ixQ)3$uaOtLqt5ec582Qrq-aK7b9!%Ddo35`dbT zvT786gWqTlZMZB0)7EfrQ1O6lvVB1)e`Ix~Er|sR=MPGE; zX1(8Ai(J!@8xlwLPCJ=s-tSI&eDNr*wiawiPdB|;jMy^%$IPCng9^TF`mUYF9*c%Y zI&_wMYvu+%Fi~RWiyT_`BZ1^+OqfjNW-h2a;CUR{nMdN~EVbu_9F(J<#?6V#dF)=1 zA~PBs6Sbb=C)@{<;f+_64Mgjr(qrVV1Pm`>p;+Pt)C;3)nFJ+wb)WCWMsRQx;9+N6 zW={lxT0mYES+xnoP{XNa2?&4;lRV86V~M6l)5AwGa&#xU1q!e1>j>mKuKReXC)B7U z2p1$$Go&gm)}p~d-b1dPxn$#CgvcNct^|&vC0TLQ{=F_sGZE(b0~fhxwaWH#Z&(&x z$LjivBit9mzdE6q(1Zd#GqMnY z__l!G(fN?Q(m-27pr7m!Z2R3Qtbb2#d_6&QVA#jyQ@zaUD?4n!rH3V=rl?H78R&mg zGg7&OMwSwg(_wK)30^Bp)=-kkOgabS%MGg3Gb+1Tn`{^=!N*$#0Dxbfu39GE>h~OG zXNoLIjVQ1;R6>Uh+@e>P%ae!}OBRm7c1AE8Gm=DF&M2FT^n4UlIe+;B}q8dr&D zL2LW1B`oJ`092`9`x|KQOJ@d6-zFcREYz%(e)oa#0=G%N3PADXFy9D`1~r^#$3Q7~ z4sO!=qak&K_lgmOwLU_7T*xARWoe7b5~BK=LX|LXct(%ELo)wTNOZ+Hkn3U;#$Pph zY-;lQ!1daiCz`H=t-)6k$!|YjC7k70^X$tfA+&ne<4)1V%bz5b>gAql4q=T)l$>|b ziC)-$L~GQE_oI1rCLi-6{VZ!%8qcEpkDOjJ;-Q#o7MY4!NJ3g0x| zC8oaSRv`bZkM`iVSe zwfeZKl6{hwt9G(P1PEexMt`3QC~5K1^2|VyWBu1)gEv>Jt!k)W45WxS(=Di6k!b74 zRi-U(@N$-A?wjhKHSJP0d=uvBQs9%s!otmp6&#PpC#3hTM%+Uc!eXaQ_8j@@Y1Hgs(s~x zGQ|V`=hlnk$z^+?JzDq=KdyvJLz20ZETbrS*@$_ATR}clG-&S%bi{n~5a~R;f_+Es z{=N)+!{#&0b6CozBAUYLSE&9~*o5M$`d;jQ&cQ(Va%;w7JxmQy%pxlrt)qU$6*TL6*b8{E__+Mc(v^ zp2uxHFCb0$C=BE;fA9%)7L0*y==q8#Qxf5VQchQZ?OTCxhunAbUmDvY_zV+A#hwU0!Gc3jp)7v$evQF+Nh z{`qZ(_)SR}ByUSZY0a$Hsi<}>*d?jdB3eLWMbz^;Eir5%s7FQ^pD`OzK^NO;iK6JT zc(pDm4ahfT>sNU+OD3cCN-2Uw5pZf2YEg_nNbLks$DVCr`_ zyTuQO?w9`VjQ>+TC_V%`?3c-n03#jt$C_EdNJn?~U?BBr4y5}t2AJr0-Gj5V$?0fN z&SCWGTHocX=7F4ACP;`$L3;Myr|p|~VSnyIfBbCnG|w5m%eAwlbMy^lJCgpv++{Y` zXG3B{0{EhTVszriim)3Wl^n}EpJ~oOU+&dy4DO2@ANtHE2+?jxSI?E|LCIRhj(dy@ zl0VM1GH(X&t=-()QIPCjzuLF@GG;o~?q@mZ-{D;Hqi9%h4qFd!K$`+926+ob}$|^|@%zxPG;i9u=Aj+IK(o7QnA44d~YNei=Bk zu>w9-_S*W9gZ{;_xd>;{?w7grpB1+M(q{$9X?cso5GndD#ty1hWWQUnbtvLz=mTI` z)D|x*J>5Pw8;GL}8L0^}peZ3dO(VlzyyxFQ9`VE#=NzX!9 zg>DOOYHW(qF}Y=v<$@o&znkp;Q48hGIZvW6{!KpokA+~L+xxJ7Z!|SUxl+GMU96KV zyecj=ZDEH6h6}m!(7lII3%CDQ8I-4U(Az)t#%neLHnv{g&yk-~L@1_7Tj^F0m6+6x zi{1H1OxNR*6~hUFnuuWqz+SDq+ual)r<*;u^?&}ZRPdhu#o^|M;nrUQ81%*P&%*0} z^>Y=j@&JV$NNex;k$xk*6v~^cj}D73cwub3tR8hSz3;8s+cBA*8o`fwj@TOSed4>L zK_>&JHT>|v8*K^kXZ)y*4icAT?TN?q8mXmmYIoB$Mi1<23Fv7@^|psieYH7a+4^i0 zSozJTKW;qsF8Kz!jPV)Qn!HZ5OtcKxZH;-;m96IzOKLZittE@T1$8*)(%Ry)svum6 z?3%^ieXcRPyh%-uPVk~Mwx7$XGM*pA!NXd0(|yxV(7T1TWBBB6#$=5`c=l$OOI_Ao zsWC4)q!wTIq%+5?z~UsQ!-oykj)VO8PS|N>JqR`e|91)u06e$t!z*?cOcmmv+AQE) zQmpYv>PZUo-oNG39bn!s$s$B6E^ZQN=eqywm^2l5Z2%_lc}*=o;;V5m&s<-h5=t#R z=0s^|b{BxVucnF0W zw`8T1RE2#N#cnx^K?$&s1U;n|uK0OO8iTKqZ`E&iggjDbmGdu6x{VX;Cp5cuq%e11HQ_m4!FCj3-cGeu_qXOI63G05|8rW zbZxD(J#?}T>y%jP785wL)D3mq(F*UVw~5Q@L+SRxKB6h1E%72!Q>Ks8t08&|vku55 zza&Mp{n_AS1QA!vCJXo&q-=wRed_X9hgHp11lvNrv-e@O`tc-x7#fx=8PtyTlXS+|t#Bl8@y2{ej*EqMJ#`B(b-T`;Pv}gYZ+cKR z^hQZb;8wkbg)=;ZG~>7}n~@~jJ!L8^MvK(S@Wae=9-5m*Z$#>rh;0W?XNEN{ok{e5 z2M1kxME<2#-ITi)qVdWi3=y_tJU`!RYVx@7=?!U%n}c+om2%qgKIcXJGr7srXX4*L zT-$Oweny@j{4yRL!<>84V?A?b0k{#4oP?ORy+ehc&9oZ#4RV1OkCSDxi-j^(#fA5& zAG96$wI)5EAX-Xos3X|IEfU|pt6raSWgiR?4Gpf27kN0@&yAhgRfJz9;OV4I8IvzC zLucfQC;A~^+m;JIkkQJ!w8=n7w{-Li#M!l=+4aqKttUkS@9p)wA)0vv98RBaHE6AV zzX=PcCBrqxV4(e_a7WGsXn$c~5I!+Nd#^IU5J4p81=7FFHLBq^4Dx527VjccZp2;; zPOU>)%GrMI_Hgq>bt@S*DE$5xN9;tl*#vwyb6V@zCvi&HPsdoX`-5eWo_^w+VSPGW ztiEA?y{>a}$9%%yVT~@tofk&HxH{$3dAy>3VkZA4Ez(s^2tHrr8hgL3MbmEn(5g>x zR`<~P=*^bm!r6|75@_ak@y^e6-W<{Se5rr^KFF~gtJyb891AA-ejj^_0AP#6zZ&Pb z&)V{imCkNwx&fUJ%XLSAp8{Ml=;Ib4v)tyOzrV--9Zq%MHDo|`<~=P9T$_>;37p9Q z2pyZmKT5-YouB!c=>h41=t1v$wZ;1#j$-gQuUGb0FYxcKb>h6zMsJfvcscNRT`M@o$Yw`vaVn@$Z|V@ro}%Kl@a8Dn?k;Q zl%u0qT=85dTkYEmDuhl9+HD-+IH0v$1v_0?x{QMuYX6Ce>^3^bnMqxjOQXlFG(ij% zjGll~*{|#qNA5Rn=e*hHc5(j59e?M=7)N++rhJp;&m+R`jxK75(gb9GKW|kJ=qxap1U>_#`+Goh3Z5T=^89l>I7FqERuFir}t2& zeJw8_DNV_%q9Ii! zJOF51b4gtC0%M^JLU<;+;r>ItYD>Xqo{XZ)3u>Mc0*q7RPIV7lDV#X+$*{v1h!qWH zynAUlrUhQqG&Tq?(e4ynYb<-xHGqw$jqT#S2JI)<@@xYXZr+yp7l4Z*^DKOqZ+LMH zoL(={lM$CyeIhw5+06@oxL%W%R?jBg#x(exQm^W%goX0JGxc6LOGXgWrSE6^KXy|y zKWXw=rQg(0Qyt8oC*}DDf;6lpyJdSuk(%3`x5L*<4tgF-AFq5C5_s8=`m!!ofsMaY zeyvAPfBi_syrO0u|4=!fBpMk0^O%!XD@kEmiJ!YiR6Kjv_zkP|WzG##rNR98LK*r> zGys*Vk?W~*mG0lK_aj~385aIvX|oNGjXmStqkj}B%8gX)9X;6LWDEUQ6dZX%!#QFb zDHmeej-Fz@+ep$8FClE&qHGw-j7XubN^C9PUCeo#_})vslUWLNlZH1pwlq^Ax+&Sd zoHbVLiBoCahTZ85UmMYQyaXa_@_}vD&2&k)4(h{{7A5ZDaYsE_HgiHvN{=a@kUR=6 z7s}`A=PX_jXn8@qyPm>e_>dy5_(GNseu^7wnl9^}KO@MCQa7+(2{7Z7t@c~e&w=#@ z3c0u^h%(%;#dv0W#_B@84A=_@xZLp#kar=l>u%IWTV0EZ8pPLAF7~#S$ATQ&eH88f6rLIr?W6{ zNA_yAMM=;3;RCpW>x!SZ0~0-Je~ycuSzSWR&em8rO_t%(?sRP*k5#@u=Yqg1(%^aw zl|RS0@hw_M?pXt1y8ZZ#eh5t=qkESUXM;0S!DL@Nvd5VxY|`nK;Qh-YkrbX4>>sq0 z?&Xr`Bhdx6f_blu3>Qqz6sLqWsn$DnSfpe?rF*G_#z@s>IQy4#l*k4(f+(Q(2yA2Tu*IyM-TG{AQ8;O`xiY+|0sVz`?(e_Yo zVw7KJVXk-k)kTgw>YWh`;qS4!WnEWnJ4`6v?{>71V)#0e09#d{j8gD6#Q2k>&aQtJVsD18}L zx8MiqkzCB3w5Wa`k5#cGH8+^9I0ZVqOPbDxpYFgje1k_&lZnF=ZYlpWXRq)?S4fR- zpJ}Fi$g4SOSX|$Ba_T|3&Q8a=>_%7q&Tj-THdLSlegD&a1l}>5MK8PT1uU)$<)NWR z0XBF$85=I1vHQUH{Khy0c+>w1p8p?64u7RT;HUn!@5Hp^XAl9E7|Lyf%uiY*4}p{f zyR-OvN&@zoSxfdf*^k0E=Uu;dZr{g~pBMXFmzRd$Bt6(bSJlte+#AivQ?9gaQdb!y zOKXbL)qB6g0>^@2HKKZCbo&cm@Np(tR9Iy?MzWJwGw=yC%z=Ffk@5$t@e;t`+b{d| zdr?of4tZU5?p(g3kf^&zw#aG4Rn8J5+VeSHDzo7agdTm<00T!HF&WlFI$u>^m8ZR* z9>0%89goL{{{ox;v73?hNt5VdTK@3uJN+*g5`Y}dr(x}~+lgo7h=s%Xuh;)r$hrNe z`sXG|L4v=+80-8lvU^eY9S-@OlCNL8gZt5Xk!O+9lD(WFM6_pDLyErP=QaIrZ>Ik9 ziPKhaU*f&SX{W6P;2kF4D$!I+{;j9)e z2%3SSSe@?tG@qBi%rV}~zR5x=a7MeN=3EGo)*3Ui~l0pdutd04hAOHhCsB zgXwwy4HR|8230{(7s@PQqtY@Spr1Mk(2LP~xi7h3cWjS+wjCZ?$jcKutmw!A8;{8` zV@!KGr(=pR$nTmP#A9cxl(vdv6QsM)oHvLRhDPFCiXZVfjjQaue{nOhB-lX?$lE!b{HR z3fsX4G?-wZ6_2G8e3GMdBC7c~@S_k42T0Gsk%322-=&nj3XDx2!8g!5GX(w_W8md) zpgnIE%VkVxH<~&evtVb~`Oy14jBh>4NVB?u zS@EKrS-K~)XK2gdDlJ!01xwZGlN0Um!2Fm z3O|Hja0vN!+B@p{Ct*AN0g>`NKM&|hBD6(t?ye{sjNU4uBhDC+%Ft&K;hOl&mJFp3xp;FIFWx}M_|WwjM5n} zLv$I8T*UwiSIYNVXaz3-3A9HhoZ_Cb2Cnp=0PZ7~_TQHP+_Q4C72D`is5i2w9SC5O zef!4Y1lyvyoV%|Zh1Cd^bA85?GHS!O$wjj%jMM*iFN^KLz#a}rcn9u|3!b=t=SCLP zmgN+73SCwpCSwaz9;L?M>S}?sKp=qOKg0dcuj`+TC8j-6QDjsu$`!x?G^%HB0xQ|A~IIU_&AXdBS z^JZL~YYCjcXfl5Ctvh=J?~@Tk4na`OeU?gC6R|~zf0t0r`>L$u{zrP<&xNm-<~Qe@ zp9pz+`}y*A0Z(CtqpjD%VciY z)Gtv^lOu-TZ|w?O!@~Pl4=eAOAJMB9mt(rOZGz;+e@e*f;1wqb%Na!rMm}&w1UQ_X za0VU-20Gk2eQ{O-9L5qJo!Ne^SbDS!+xPkqB-O~bH{beoI;8m;lw~qN7;wP7gNe?) zI^k^uo0a3TtCYUAqCB>fw!~*{bIClKL;Zt z>#eNv<|Rn9jJ+ng8gKVA_oEuYOe1K*0_Zoj9Rh?<;t4Az;s#*=#BcFL&kbH+@c6-+ zHE#5aoQ7e_+-`WwD!9wB>EV1w04~P5#Ap#x-9x?XP&2h{WfbXE#u{WZ>C400;aJ=; z%&c_R3NN43?Rm2~0P3>ix=8mn!3W7U;v zv!%wh9WZY7eZSi!L<){9sEePh%^|%PjoEyz*XFawSS6~MazTcvgY^UsT?39sC%DK% zbUHA#l{bqLREqH`(*p3tzH(WQWG9O^-gBjl{2BAknD$Fcn__?I*j`>;iWpN z&xhWq#k@YIf^?u0Cd33Zz%ly@rH~gIC=TC!jydz{w^_ZlVYj#M-|=Z9_ILBm-oRlA zgkD44X}*DRToEEO=2rRgh;3XeN!KT6tUdWMzKdayl*5n1OGR3<43r-82plh?i{b*t zkRqLg;8@PKj@B!SELyNkg6kg$KCE}zbqu{t?Vb691`EWv3S!Y2HIof!uLCTdFqc9* zleUodyCuuu@b@SjQ3o=+S2|8(?^}l6a=OEEVA2-NVL#i9q7ebY&_BkTFJZ{{J8!&G zD>8OfQK;5B+iU=0--u|1pX_MV5HLh~DiRZz_Hs`i+mACyZunQ#1N6K_08Uy4;akOTJJnxhNjT7qe2p+s z(uFmpAbesdYM3eG1ZSNQb$I3<2%g_rvJ6)^$`-z=0oL^Le_L@7!|>FVLOa}!{0=;Z zflDVp3QwW~Cs*RbpUF1V^4PRI%==jRM4}RtWLt!Rt&~kg1h67=!&8=wbF@wFn+#dI z9?w3zf1A~oU4dG_AA_e9aaA$f&O`P{b&BaXF~mlmG`CCYyBOp3AZ%>gn~ah z5kupR3T=~Os*e!bK42k-ICfH-a*uw1)r%O^u9uKUxkcX+eq*Ea$C{g>duRkQ>-|W4 zM31^HVxtqbOUe~#gFG>%eKQ6X*l2o59pmQ0ta3F&cP;59JB}UU3&stx-I||`a$1kV z=Xbz%$1-NX)^lNaXHP#(7gEVmVxhiFZ`Y$d6)?awW5^jbO6W2F8HFQ-+3iaO{;nQh zhqDToRQEI;l1LX-JBCvA6ul+b*(G`=b19LFd7)6D7a!@}yvGkpB%GWdNAR;nVRLGF zhEbI${Fs$daCan`yO2x!;id<*0TYESAK%N7@- z@U{@j(8!G|59EydSq9>6yt!JRNZ+&<{iCXcGZ1K(hlT0rHoI`5yD}1ft%NFhsUR6I&plKr&V|FeDt#5&F@Y-IKZB0dAT+Qotgl|%#*&qCR! zT|ehaAFaNX>dq)!)UbJ59es^h$78R!cUZzRm5cW4@}1Eg8R-}I?G2&wL_`db9cKi- zG`j*}$w)p(ckWklEIEMfc5|XB~Yt{ji>O)Spnp}Ot_8-77AZ?jS^p?ubn;{Yrl>x>*}0pR-Bwu(}#r=Dm2aYfN3x^&QFK+G|-PL;LojiAcS=u1N z^zn4k3H52BIY#?f395(*Mt_<;c%&yQ?8VK25-jv}r;DDt@6tS1t*qyEH>l^sbr?t* zT5YB}`Vakrg~cRbAdu#|S$F^kMrg&A93wxnB3>zWaBWM!?og<7v+>bd1qb@|<3>#ecuzW z*(1P$*yvCLe(mcc^WR-Xb^$iod9nh60`%@~35;*TA!`O$BmHepR%1PPp8zPyfWc*4 zZq{3Cx&StXB{!9>QmqdQdAHgD4q$CnZ-GRM68Y%YO%yFib~6rfEs zJ3WpoE%;Eg7Sv%#g^U1#B^>-fsyWWONTKLu`$6DyT3fB4T@IWEeH#z|;Bf#FR^Pc} zYoyL)g5h$1HuTzFpXMtt7GKd*w3(t#kEiAjd-?zv!zToikpJL2r*4DVhjkD9wx2ALogWi4x z(O)Ty5pxasTEk3@Le*4_aaBz@Z@?ePBXBsbJ<3VNPiN=jRUK~7Zb}lZgMmp-{$OE% zK0@S$uu#j<-g;&hXwgv)G&v8vRw|x#5GMhr(Y}cjuj&tSX5D)k8YF^spg^^ce?lS0 z5rO7GUa)&c#x5pGQ%3mVa|LaevBNB3Ahq+h=y+6K!p?M8B8lvzM zYV*iu9DD+8Rdx@isA0K zZ7nJ=iZy&*4{jpA*5#Ars@y?iIPh+UOl9}K5I>kt3g&u_E;3q{Q%vj6}9 diff --git a/src/utils/gnuplot/8_GAL_GNSS_SDR_solutions.txt b/src/utils/gnuplot/8_GAL_GNSS_SDR_solutions.txt deleted file mode 100644 index 25314d167..000000000 --- a/src/utils/gnuplot/8_GAL_GNSS_SDR_solutions.txt +++ /dev/null @@ -1,1001 +0,0 @@ - time X [m] Y [m] Z [m] Long [deg] Lat [deg] h [m] E(Acc) [m] N(Acc) [m] Up(Acc) [m] E(Pre) [m] N(Pre) [m] Up(Pre) [m] Tot Sat Gal GPS GDOP -2013-Sep-20 09:11:06 4171690.09174 872117.69124 4730009.42695 11.80798 48.17153 526.40674 -2.07473 3.46782 1.81609 -3.26635 1.54475 -11.95848 8 8 0 1.77 -2013-Sep-20 09:11:06 4171695.90195 872122.87945 4730017.22237 11.80803 48.17153 536.71635 1.81473 3.63768 12.12569 0.62312 1.71460 -1.64887 8 8 0 1.77 -2013-Sep-20 09:11:06 4171695.87749 872123.03123 4730016.66439 11.80803 48.17153 536.30532 1.96830 3.26026 11.71466 0.77668 1.33718 -2.05990 8 8 0 1.77 -2013-Sep-20 09:11:06 4171695.91773 872123.24279 4730016.35685 11.80803 48.17152 536.13130 2.16715 2.99355 11.54064 0.97554 1.07047 -2.23392 8 8 0 1.77 -2013-Sep-20 09:11:06 4171695.80487 872123.64854 4730016.04804 11.80804 48.17152 535.88289 2.58741 2.80805 11.29223 1.39580 0.88497 -2.48233 8 8 0 1.77 -2013-Sep-20 09:11:06 4171696.04572 872123.57449 4730016.18529 11.80804 48.17152 536.13228 2.46564 2.73520 11.54162 1.27403 0.81213 -2.23294 8 8 0 1.77 -2013-Sep-20 09:11:06 4171696.85509 872123.52515 4730015.79008 11.80804 48.17151 536.35940 2.25173 1.88882 11.76875 1.06011 -0.03425 -2.00582 8 8 0 1.77 -2013-Sep-20 09:11:06 4171696.91214 872123.33123 4730015.96118 11.80803 48.17152 536.49768 2.05024 1.99089 11.90702 0.85862 0.06781 -1.86754 8 8 0 1.77 -2013-Sep-20 09:11:06 4171696.23707 872123.07517 4730016.02781 11.80803 48.17152 536.07170 1.93773 2.56675 11.48104 0.74612 0.64368 -2.29352 8 8 0 1.77 -2013-Sep-20 09:11:06 4171696.58685 872123.30575 4730016.13060 11.80803 48.17152 536.40809 2.09185 2.34502 11.81744 0.90024 0.42194 -1.95712 8 8 0 1.77 -2013-Sep-20 09:11:06 4171696.87751 872123.33042 4730016.34070 11.80803 48.17152 536.75776 2.05653 2.26937 12.16711 0.86491 0.34630 -1.60746 8 8 0 1.77 -2013-Sep-20 09:11:06 4171696.53195 872123.66688 4730015.87975 11.80804 48.17152 536.23462 2.45658 2.16271 11.64396 1.26497 0.23963 -2.13060 8 8 0 1.77 -2013-Sep-20 09:11:06 4171696.57287 872123.68392 4730016.09343 11.80804 48.17152 536.42288 2.46489 2.27277 11.83222 1.27327 0.34969 -1.94234 8 8 0 1.77 -2013-Sep-20 09:11:06 4171697.02839 872123.70216 4730016.50696 11.80804 48.17152 537.03087 2.38953 2.21352 12.44021 1.19791 0.29045 -1.33435 8 8 0 1.77 -2013-Sep-20 09:11:06 4171697.69570 872123.58690 4730016.57371 11.80803 48.17151 537.50049 2.14015 1.78890 12.90984 0.94853 -0.13418 -0.86472 8 8 0 1.77 -2013-Sep-20 09:11:06 4171698.06350 872123.88883 4730016.53937 11.80804 48.17151 537.75620 2.36043 1.45168 13.16555 1.16882 -0.47139 -0.60902 8 8 0 1.77 -2013-Sep-20 09:11:06 4171698.67387 872123.60070 4730016.87180 11.80803 48.17151 538.36303 1.95350 1.27213 13.77238 0.76188 -0.65094 -0.00219 8 8 0 1.77 -2013-Sep-20 09:11:06 4171698.33898 872123.79140 4730016.61963 11.80804 48.17151 537.98254 2.20869 1.31914 13.39188 1.01707 -0.60393 -0.38268 8 8 0 1.77 -2013-Sep-20 09:11:06 4171698.10171 872124.16670 4730016.64385 11.80804 48.17151 537.89692 2.62460 1.45112 13.30627 1.43298 -0.47195 -0.46830 8 8 0 1.77 -2013-Sep-20 09:11:06 4171699.18887 872124.09479 4730017.20895 11.80804 48.17151 539.01787 2.33174 1.04601 14.42722 1.14013 -0.87707 0.65266 8 8 0 1.77 -2013-Sep-20 09:11:06 4171699.46096 872124.18783 4730017.06175 11.80804 48.17150 539.09851 2.36714 0.73520 14.50785 1.17552 -1.18787 0.73329 8 8 0 1.77 -2013-Sep-20 09:11:06 4171698.71337 872124.28852 4730016.47044 11.80804 48.17151 538.18362 2.61867 0.87078 13.59296 1.42705 -1.05230 -0.18160 8 8 0 1.77 -2013-Sep-20 09:11:06 4171698.84586 872124.44077 4730016.25661 11.80804 48.17150 538.13154 2.74060 0.60832 13.54089 1.54898 -1.31475 -0.23367 8 8 0 1.77 -2013-Sep-20 09:11:06 4171699.23296 872124.29130 4730016.74645 11.80804 48.17150 538.72885 2.51508 0.67544 14.13819 1.32346 -1.24763 0.36363 8 8 0 1.77 -2013-Sep-20 09:11:07 4171699.85309 872124.00482 4730016.76314 11.80803 48.17150 539.10700 2.10775 0.27795 14.51634 0.91614 -1.64512 0.74178 8 8 0 1.77 -2013-Sep-20 09:11:07 4171700.44920 872124.15646 4730016.95920 11.80803 48.17150 539.66292 2.13420 -0.04921 15.07227 0.94259 -1.97229 1.29770 8 8 0 1.77 -2013-Sep-20 09:11:07 4171700.84145 872124.12219 4730016.95783 11.80803 48.17149 539.91328 2.02039 -0.33099 15.32263 0.82877 -2.25407 1.54807 8 8 0 1.77 -2013-Sep-20 09:11:07 4171702.64676 872123.97936 4730018.00266 11.80803 48.17149 541.85083 1.51116 -0.92916 17.26017 0.31954 -2.85224 3.48561 8 8 0 1.77 -2013-Sep-20 09:11:07 4171702.80212 872124.05742 4730018.23628 11.80803 48.17149 542.13698 1.55577 -0.89858 17.54633 0.36415 -2.82166 3.77176 8 8 0 1.77 -2013-Sep-20 09:11:07 4171703.15548 872123.78902 4730019.14642 11.80802 48.17149 543.00921 1.22074 -0.50841 18.41855 0.02912 -2.43149 4.64399 8 8 0 1.77 -2013-Sep-20 09:11:07 4171703.66010 872123.52228 4730019.83110 11.80802 48.17149 543.81240 0.85639 -0.37918 19.22175 -0.33523 -2.30225 5.44719 8 8 0 1.77 -2013-Sep-20 09:11:07 4171704.12674 872123.19999 4730020.13818 11.80801 48.17149 544.30186 0.44543 -0.46560 19.71120 -0.74619 -2.38868 5.93664 8 8 0 1.77 -2013-Sep-20 09:11:07 4171704.39919 872123.03315 4730020.38764 11.80801 48.17149 544.64283 0.22637 -0.47251 20.05217 -0.96525 -2.39559 6.27761 8 8 0 1.77 -2013-Sep-20 09:11:07 4171704.36739 872123.08830 4730021.07685 11.80801 48.17150 545.14315 0.28685 0.00191 20.55250 -0.90477 -1.92117 6.77793 8 8 0 1.77 -2013-Sep-20 09:11:07 4171704.35253 872123.27179 4730020.94373 11.80801 48.17150 545.05931 0.46950 -0.10401 20.46865 -0.72212 -2.02709 6.69409 8 8 0 1.77 -2013-Sep-20 09:11:07 4171705.28703 872123.16709 4730021.26569 11.80801 48.17149 545.89495 0.17579 -0.55493 21.30429 -1.01583 -2.47801 7.52973 8 8 0 1.77 -2013-Sep-20 09:11:07 4171704.61945 872123.31400 4730020.46477 11.80801 48.17149 544.88241 0.45619 -0.62455 20.29176 -0.73542 -2.54763 6.51719 8 8 0 1.77 -2013-Sep-20 09:11:07 4171705.22865 872123.19679 4730020.98194 11.80801 48.17149 545.64946 0.21681 -0.70612 21.05881 -0.97481 -2.62920 7.28424 8 8 0 1.77 -2013-Sep-20 09:11:07 4171705.29153 872123.10987 4730021.28873 11.80801 48.17149 545.90725 0.11886 -0.53412 21.31659 -1.07276 -2.45720 7.54203 8 8 0 1.77 -2013-Sep-20 09:11:07 4171705.32056 872122.86269 4730021.39416 11.80800 48.17149 545.97103 -0.12903 -0.44730 21.38038 -1.32065 -2.37038 7.60581 8 8 0 1.77 -2013-Sep-20 09:11:07 4171705.21878 872122.83842 4730021.27904 11.80800 48.17149 545.81550 -0.13196 -0.44614 21.22484 -1.32357 -2.36922 7.45028 8 8 0 1.77 -2013-Sep-20 09:11:07 4171705.29993 872122.69109 4730021.34134 11.80800 48.17149 545.89478 -0.29278 -0.44130 21.30413 -1.48439 -2.36438 7.52956 8 8 0 1.77 -2013-Sep-20 09:11:07 4171705.12943 872122.44827 4730021.42910 11.80800 48.17150 545.81573 -0.49556 -0.22140 21.22508 -1.68718 -2.14448 7.45052 8 8 0 1.77 -2013-Sep-20 09:11:07 4171705.27132 872122.20763 4730021.06649 11.80800 48.17149 545.60532 -0.76015 -0.53002 21.01467 -1.95177 -2.45310 7.24010 8 8 0 1.77 -2013-Sep-20 09:11:07 4171704.46387 872122.19636 4730020.56629 11.80800 48.17150 544.70397 -0.60595 -0.27295 20.11331 -1.79757 -2.19603 6.33875 8 8 0 1.77 -2013-Sep-20 09:11:07 4171704.09102 872122.00552 4730019.84640 11.80800 48.17149 543.89811 -0.71645 -0.45200 19.30745 -1.90807 -2.37508 5.53289 8 8 0 1.77 -2013-Sep-20 09:11:07 4171704.03068 872122.16931 4730020.09435 11.80800 48.17150 544.06583 -0.54379 -0.26761 19.47518 -1.73541 -2.19068 5.70061 8 8 0 1.77 -2013-Sep-20 09:11:07 4171704.54052 872121.95102 4730019.91054 11.80799 48.17149 544.23189 -0.86179 -0.72877 19.64124 -2.05341 -2.65185 5.86667 8 8 0 1.77 -2013-Sep-20 09:11:07 4171704.52586 872121.68599 4730020.07563 11.80799 48.17149 544.30918 -1.11820 -0.56757 19.71852 -2.30982 -2.49064 5.94396 8 8 0 1.77 -2013-Sep-20 09:11:08 4171703.46781 872121.59008 4730019.42381 11.80799 48.17150 543.11970 -0.99558 -0.21592 18.52905 -2.18720 -2.13900 4.75448 8 8 0 1.77 -2013-Sep-20 09:11:08 4171703.56751 872121.39341 4730019.33126 11.80799 48.17149 543.08898 -1.20849 -0.32038 18.49832 -2.40010 -2.24346 4.72376 8 8 0 1.77 -2013-Sep-20 09:11:08 4171703.78695 872121.17941 4730019.32935 11.80799 48.17149 543.20160 -1.46286 -0.44908 18.61094 -2.65448 -2.37215 4.83638 8 8 0 1.77 -2013-Sep-20 09:11:08 4171702.38976 872121.19839 4730018.61087 11.80799 48.17150 541.75675 -1.15838 0.08795 17.16609 -2.34999 -1.83513 3.39153 8 8 0 1.77 -2013-Sep-20 09:11:08 4171701.44190 872120.89196 4730017.97117 11.80799 48.17150 540.61951 -1.26436 0.39941 16.02885 -2.45597 -1.52367 2.25429 8 8 0 1.77 -2013-Sep-20 09:11:08 4171701.17321 872120.84805 4730017.55023 11.80799 48.17150 540.12445 -1.25236 0.32134 15.53380 -2.44397 -1.60173 1.75923 8 8 0 1.77 -2013-Sep-20 09:11:08 4171700.64844 872120.79280 4730016.99803 11.80799 48.17150 539.36288 -1.19905 0.34426 14.77222 -2.39066 -1.57882 0.99766 8 8 0 1.77 -2013-Sep-20 09:11:08 4171700.72657 872120.72234 4730016.68361 11.80799 48.17150 539.16998 -1.28400 0.08833 14.57933 -2.47562 -1.83475 0.80476 8 8 0 1.77 -2013-Sep-20 09:11:08 4171700.51847 872120.71210 4730016.79140 11.80799 48.17150 539.11306 -1.25145 0.31356 14.52240 -2.44306 -1.60951 0.74784 8 8 0 1.77 -2013-Sep-20 09:11:08 4171699.59564 872120.58738 4730016.39961 11.80799 48.17150 538.20168 -1.18468 0.74438 13.61102 -2.37630 -1.17869 -0.16354 8 8 0 1.77 -2013-Sep-20 09:11:08 4171699.69147 872120.74568 4730015.50668 11.80799 48.17150 537.62047 -1.04934 0.05485 13.02982 -2.24096 -1.86823 -0.74475 8 8 0 1.77 -2013-Sep-20 09:11:08 4171699.67028 872120.96928 4730015.08224 11.80799 48.17150 537.32089 -0.82614 -0.24684 12.73023 -2.01776 -2.16992 -1.04433 8 8 0 1.77 -2013-Sep-20 09:11:08 4171699.13180 872120.92148 4730014.75810 11.80800 48.17150 536.72132 -0.76274 -0.06298 12.13066 -1.95436 -1.98605 -1.64390 8 8 0 1.77 -2013-Sep-20 09:11:08 4171698.54056 872120.79994 4730014.87738 11.80800 48.17150 536.40766 -0.76072 0.46634 11.81700 -1.95233 -1.45674 -1.95756 8 8 0 1.77 -2013-Sep-20 09:11:08 4171698.50011 872120.78189 4730014.88532 11.80800 48.17150 536.38471 -0.77011 0.50389 11.79405 -1.96173 -1.41919 -1.98051 8 8 0 1.77 -2013-Sep-20 09:11:08 4171698.01279 872120.82226 4730014.73284 11.80800 48.17150 535.95848 -0.63087 0.75149 11.36783 -1.82249 -1.17158 -2.40674 8 8 0 1.77 -2013-Sep-20 09:11:08 4171697.64538 872120.79023 4730014.75466 11.80800 48.17151 535.73052 -0.58704 1.03890 11.13987 -1.77865 -0.88417 -2.63470 8 8 0 1.77 -2013-Sep-20 09:11:08 4171697.90082 872120.86625 4730014.52607 11.80800 48.17150 535.73732 -0.56490 0.68855 11.14666 -1.75652 -1.23452 -2.62790 8 8 0 1.77 -2013-Sep-20 09:11:08 4171696.84326 872120.98850 4730014.35915 11.80800 48.17151 534.93926 -0.22883 1.32995 10.34860 -1.42044 -0.59312 -3.42596 8 8 0 1.77 -2013-Sep-20 09:11:08 4171695.60891 872120.90577 4730014.10071 11.80800 48.17152 533.92962 -0.05722 2.07051 9.33896 -1.24884 0.14744 -4.43560 8 8 0 1.77 -2013-Sep-20 09:11:08 4171695.08337 872120.85036 4730013.77167 11.80801 48.17152 533.33381 -0.00391 2.24285 8.74315 -1.19553 0.31977 -5.03141 8 8 0 1.77 -2013-Sep-20 09:11:08 4171694.09677 872120.84585 4730013.32604 11.80801 48.17152 532.35709 0.19357 2.66594 7.76644 -0.99805 0.74287 -6.00813 8 8 0 1.77 -2013-Sep-20 09:11:08 4171694.13998 872120.97457 4730013.49489 11.80801 48.17152 532.52867 0.31072 2.72741 7.93802 -0.88090 0.80433 -5.83655 8 8 0 1.77 -2013-Sep-20 09:11:08 4171693.90878 872120.92639 4730013.89902 11.80801 48.17153 532.67231 0.31087 3.17290 8.08166 -0.88075 1.24983 -5.69290 8 8 0 1.77 -2013-Sep-20 09:11:08 4171693.35721 872120.96302 4730013.44275 11.80801 48.17153 531.97727 0.45959 3.26532 7.38661 -0.73202 1.34225 -6.38795 8 8 0 1.77 -2013-Sep-20 09:11:09 4171693.26965 872120.98206 4730013.41088 11.80801 48.17153 531.89896 0.49615 3.30504 7.30831 -0.69546 1.38196 -6.46625 8 8 0 1.77 -2013-Sep-20 09:11:09 4171693.42279 872120.46546 4730013.89642 11.80801 48.17153 532.29022 -0.04085 3.59593 7.69957 -1.23247 1.67285 -6.07499 8 8 0 1.77 -2013-Sep-20 09:11:09 4171693.28081 872120.22254 4730013.87537 11.80800 48.17153 532.14870 -0.24958 3.72248 7.55805 -1.44119 1.79940 -6.21652 8 8 0 1.77 -2013-Sep-20 09:11:09 4171693.05769 872120.19556 4730014.09385 11.80800 48.17153 532.16217 -0.23033 4.03504 7.57151 -1.42195 2.11197 -6.20305 8 8 0 1.77 -2013-Sep-20 09:11:09 4171693.16991 872120.29757 4730014.99737 11.80800 48.17154 532.92260 -0.15345 4.54019 8.33194 -1.34506 2.61712 -5.44262 8 8 0 1.77 -2013-Sep-20 09:11:09 4171693.51563 872120.33168 4730015.60656 11.80800 48.17154 533.60687 -0.19080 4.68910 9.01622 -1.38242 2.76602 -4.75834 8 8 0 1.77 -2013-Sep-20 09:11:09 4171693.82702 872120.32165 4730015.89222 11.80800 48.17154 534.02164 -0.26435 4.65402 9.43098 -1.45596 2.73095 -4.34358 8 8 0 1.77 -2013-Sep-20 09:11:09 4171693.23686 872120.22858 4730015.86014 11.80800 48.17154 533.59978 -0.23468 5.07726 9.00913 -1.42629 3.15419 -4.76544 8 8 0 1.77 -2013-Sep-20 09:11:09 4171693.91039 872119.99872 4730016.40519 11.80800 48.17154 534.41423 -0.59750 4.98456 9.82357 -1.78911 3.06148 -3.95099 8 8 0 1.77 -2013-Sep-20 09:11:09 4171694.67842 872119.82583 4730017.41799 11.80799 48.17154 535.64668 -0.92389 5.12616 11.05602 -2.11551 3.20309 -2.71854 8 8 0 1.77 -2013-Sep-20 09:11:09 4171695.38824 872119.66040 4730018.64519 11.80799 48.17155 537.00190 -1.23108 5.45209 12.41124 -2.42269 3.52902 -1.36332 8 8 0 1.77 -2013-Sep-20 09:11:09 4171696.14748 872119.48348 4730019.58292 11.80798 48.17155 538.17213 -1.55962 5.55068 13.58147 -2.75124 3.62760 -0.19309 8 8 0 1.77 -2013-Sep-20 09:11:09 4171696.35202 872119.75902 4730020.40644 11.80799 48.17155 538.95689 -1.33176 5.90868 14.36624 -2.52338 3.98561 0.59167 8 8 0 1.77 -2013-Sep-20 09:11:09 4171696.88313 872119.57599 4730020.96384 11.80798 48.17155 539.69397 -1.61960 5.92094 15.10331 -2.81122 3.99786 1.32875 8 8 0 1.77 -2013-Sep-20 09:11:09 4171696.74152 872119.83100 4730021.09193 11.80799 48.17155 539.73177 -1.34102 6.07077 15.14111 -2.53263 4.14769 1.36655 8 8 0 1.77 -2013-Sep-20 09:11:09 4171697.49636 872119.43551 4730021.60929 11.80798 48.17155 540.55606 -1.88260 5.92553 15.96540 -3.07421 4.00246 2.19084 8 8 0 1.77 -2013-Sep-20 09:11:09 4171698.55101 872119.63121 4730022.17056 11.80798 48.17155 541.68946 -1.90686 5.50077 17.09880 -3.09848 3.57770 3.32424 8 8 0 1.77 -2013-Sep-20 09:11:09 4171698.65235 872119.79319 4730022.74501 11.80798 48.17155 542.20576 -1.76904 5.78526 17.61510 -2.96066 3.86219 3.84054 8 8 0 1.77 -2013-Sep-20 09:11:09 4171699.15523 872119.98931 4730023.14050 11.80798 48.17155 542.85551 -1.67998 5.65232 18.26485 -2.87160 3.72925 4.49029 8 8 0 1.77 -2013-Sep-20 09:11:09 4171699.69836 872120.06239 4730022.99798 11.80798 48.17154 543.11383 -1.71959 5.14999 18.52317 -2.91121 3.22692 4.74861 8 8 0 1.77 -2013-Sep-20 09:11:09 4171700.43395 872120.14453 4730023.06653 11.80798 48.17154 543.65630 -1.78971 4.64665 19.06565 -2.98132 2.72358 5.29108 8 8 0 1.77 -2013-Sep-20 09:11:09 4171700.99916 872120.20326 4730023.33523 11.80798 48.17154 544.23351 -1.84789 4.40465 19.64285 -3.03950 2.48157 5.86829 8 8 0 1.77 -2013-Sep-20 09:11:09 4171701.38000 872120.19520 4730023.24155 11.80798 48.17153 544.41120 -1.93370 4.06563 19.82055 -3.12532 2.14255 6.04598 8 8 0 1.77 -2013-Sep-20 09:11:09 4171701.05789 872120.68972 4730022.56067 11.80799 48.17153 543.76107 -1.38374 3.77108 19.17041 -2.57536 1.84800 5.39585 8 8 0 1.77 -2013-Sep-20 09:11:09 4171701.46908 872120.91525 4730022.18295 11.80799 48.17153 543.77882 -1.24712 3.18488 19.18816 -2.43874 1.26180 5.41360 8 8 0 1.77 -2013-Sep-20 09:11:10 4171701.58023 872120.93919 4730022.09128 11.80799 48.17153 543.78632 -1.24643 3.03902 19.19567 -2.43805 1.11595 5.42111 8 8 0 1.77 -2013-Sep-20 09:11:10 4171701.80771 872120.92451 4730022.17428 11.80799 48.17152 543.99467 -1.30735 2.93070 19.40402 -2.49897 1.00762 5.62945 8 8 0 1.77 -2013-Sep-20 09:11:10 4171702.10623 872120.94227 4730021.68139 11.80799 48.17152 543.82469 -1.35106 2.38154 19.23404 -2.54268 0.45847 5.45947 8 8 0 1.77 -2013-Sep-20 09:11:10 4171701.70547 872121.06963 4730021.31991 11.80799 48.17152 543.31111 -1.14438 2.41336 18.72045 -2.33600 0.49028 4.94589 8 8 0 1.77 -2013-Sep-20 09:11:10 4171701.29361 872121.27502 4730020.42354 11.80799 48.17152 542.40235 -0.85906 2.08465 17.81169 -2.05068 0.16157 4.03713 8 8 0 1.77 -2013-Sep-20 09:11:10 4171702.15788 872121.29444 4730020.53918 11.80799 48.17151 543.05535 -1.01690 1.52843 18.46470 -2.20852 -0.39465 4.69013 8 8 0 1.77 -2013-Sep-20 09:11:10 4171701.31166 872121.48948 4730019.49044 11.80800 48.17151 541.74810 -0.65283 1.41649 17.15744 -1.84445 -0.50658 3.38288 8 8 0 1.77 -2013-Sep-20 09:11:10 4171700.67722 872121.69934 4730018.88083 11.80800 48.17151 540.90834 -0.31758 1.44069 16.31769 -1.50920 -0.48239 2.54312 8 8 0 1.77 -2013-Sep-20 09:11:10 4171700.47169 872121.57520 4730019.02829 11.80800 48.17151 540.86711 -0.39704 1.70787 16.27645 -1.58866 -0.21521 2.50189 8 8 0 1.77 -2013-Sep-20 09:11:10 4171700.26985 872121.78261 4730018.47553 11.80800 48.17151 540.35177 -0.15272 1.45482 15.76112 -1.34433 -0.46826 1.98656 8 8 0 1.77 -2013-Sep-20 09:11:10 4171699.73759 872122.01538 4730018.01140 11.80801 48.17151 539.69024 0.18405 1.49802 15.09959 -1.00757 -0.42506 1.32502 8 8 0 1.77 -2013-Sep-20 09:11:10 4171700.16240 872121.76984 4730017.92161 11.80800 48.17151 539.86713 -0.14323 1.16572 15.27648 -1.33484 -0.75735 1.50191 8 8 0 1.77 -2013-Sep-20 09:11:10 4171699.29143 872121.89182 4730017.54829 11.80801 48.17151 539.03704 0.15440 1.53343 14.44639 -1.03722 -0.38965 0.67183 8 8 0 1.77 -2013-Sep-20 09:11:10 4171698.64043 872122.24875 4730016.64809 11.80801 48.17151 537.99001 0.63700 1.35347 13.39936 -0.55462 -0.56960 -0.37521 8 8 0 1.77 -2013-Sep-20 09:11:10 4171698.18542 872122.54080 4730015.68603 11.80802 48.17151 537.01597 1.01597 0.99921 12.42531 -0.17564 -0.92386 -1.34925 8 8 0 1.77 -2013-Sep-20 09:11:10 4171698.10300 872123.04312 4730016.01069 11.80803 48.17151 537.27263 1.52453 1.19926 12.68198 0.33292 -0.72382 -1.09259 8 8 0 1.77 -2013-Sep-20 09:11:10 4171698.38702 872122.90404 4730016.09107 11.80802 48.17151 537.49895 1.33027 1.06691 12.90830 0.13866 -0.85616 -0.86627 8 8 0 1.77 -2013-Sep-20 09:11:10 4171698.97352 872122.98792 4730016.08821 11.80802 48.17150 537.89112 1.29236 0.62443 13.30047 0.10075 -1.29864 -0.47409 8 8 0 1.77 -2013-Sep-20 09:11:10 4171699.03122 872123.03134 4730016.27658 11.80802 48.17150 538.07508 1.32306 0.70135 13.48443 0.13144 -1.22173 -0.29014 8 8 0 1.77 -2013-Sep-20 09:11:10 4171698.24631 872123.17208 4730015.22339 11.80803 48.17150 536.79713 1.62143 0.55001 12.20648 0.42982 -1.37307 -1.56809 8 8 0 1.77 -2013-Sep-20 09:11:10 4171698.34021 872123.15179 4730015.39629 11.80803 48.17150 536.98449 1.58236 0.59992 12.39384 0.39074 -1.32315 -1.38073 8 8 0 1.77 -2013-Sep-20 09:11:10 4171697.25542 872123.30277 4730015.09553 11.80803 48.17151 536.07285 1.95213 1.16755 11.48219 0.76052 -0.75553 -2.29237 8 8 0 1.77 -2013-Sep-20 09:11:10 4171696.98971 872123.22913 4730014.99540 11.80803 48.17151 535.81474 1.93442 1.30580 11.22408 0.74281 -0.61728 -2.55048 8 8 0 1.77 -2013-Sep-20 09:11:10 4171697.24527 872123.46579 4730014.80902 11.80803 48.17151 535.87498 2.11377 0.95902 11.28432 0.92216 -0.96406 -2.49024 8 8 0 1.77 -2013-Sep-20 09:11:10 4171697.63081 872123.46298 4730014.65850 11.80803 48.17150 536.01411 2.03214 0.57786 11.42346 0.84052 -1.34521 -2.35111 8 8 0 1.77 -2013-Sep-20 09:11:11 4171697.58770 872123.52009 4730014.77275 11.80803 48.17150 536.07890 2.09685 0.67678 11.48824 0.90524 -1.24629 -2.28632 8 8 0 1.77 -2013-Sep-20 09:11:11 4171697.37301 872123.46831 4730014.35261 11.80803 48.17150 535.61862 2.09010 0.56108 11.02797 0.89849 -1.36199 -2.74660 8 8 0 1.77 -2013-Sep-20 09:11:11 4171697.62418 872123.51841 4730014.53636 11.80803 48.17150 535.92634 2.08774 0.49279 11.33569 0.89612 -1.43029 -2.43888 8 8 0 1.77 -2013-Sep-20 09:11:11 4171698.05794 872123.35000 4730014.81075 11.80803 48.17150 536.39097 1.83414 0.38508 11.80032 0.64252 -1.53800 -1.97425 8 8 0 1.77 -2013-Sep-20 09:11:11 4171697.76922 872123.72142 4730014.69968 11.80804 48.17150 536.17041 2.25678 0.46496 11.57976 1.06516 -1.45812 -2.19480 8 8 0 1.77 -2013-Sep-20 09:11:11 4171697.49693 872124.08241 4730014.27280 11.80804 48.17150 535.72385 2.66585 0.32383 11.13320 1.47423 -1.59924 -2.64137 8 8 0 1.77 -2013-Sep-20 09:11:11 4171697.43463 872124.09685 4730013.67977 11.80804 48.17150 535.24326 2.69273 -0.02843 10.65260 1.50111 -1.95150 -3.12196 8 8 0 1.77 -2013-Sep-20 09:11:11 4171697.89277 872124.38960 4730013.65462 11.80804 48.17149 535.56354 2.88553 -0.42399 10.97289 1.69392 -2.34707 -2.80168 8 8 0 1.77 -2013-Sep-20 09:11:11 4171696.87298 872124.47881 4730012.99203 11.80805 48.17150 534.41628 3.18155 -0.13567 9.82563 1.98993 -2.05874 -3.94894 8 8 0 1.77 -2013-Sep-20 09:11:11 4171697.14707 872124.58215 4730013.49125 11.80805 48.17150 534.98130 3.22661 -0.01841 10.39064 2.03499 -1.94149 -3.38392 8 8 0 1.77 -2013-Sep-20 09:11:11 4171697.36153 872124.61276 4730012.93030 11.80805 48.17149 534.70748 3.21268 -0.55359 10.11682 2.02107 -2.47667 -3.65774 8 8 0 1.77 -2013-Sep-20 09:11:11 4171697.74458 872124.69070 4730013.17259 11.80805 48.17149 535.14871 3.21059 -0.68328 10.55805 2.01897 -2.60636 -3.21651 8 8 0 1.77 -2013-Sep-20 09:11:11 4171697.43006 872124.96244 4730013.10714 11.80805 48.17149 534.93171 3.54094 -0.53897 10.34105 2.34933 -2.46204 -3.43351 8 8 0 1.77 -2013-Sep-20 09:11:11 4171697.89405 872125.08445 4730013.57194 11.80805 48.17149 535.59759 3.56543 -0.58602 11.00694 2.37381 -2.50910 -2.76763 8 8 0 1.77 -2013-Sep-20 09:11:11 4171697.76316 872125.18967 4730013.17045 11.80806 48.17149 535.22734 3.69520 -0.77434 10.63668 2.50358 -2.69742 -3.13788 8 8 0 1.77 -2013-Sep-20 09:11:11 4171698.11365 872125.17006 4730013.59261 11.80805 48.17149 535.76803 3.60429 -0.74546 11.17738 2.41267 -2.66853 -2.59719 8 8 0 1.77 -2013-Sep-20 09:11:11 4171697.03236 872125.23536 4730013.06559 11.80806 48.17149 534.67837 3.88947 -0.31822 10.08772 2.69785 -2.24129 -3.68685 8 8 0 1.77 -2013-Sep-20 09:11:11 4171696.70714 872125.55944 4730012.24128 11.80806 48.17149 533.89608 4.27324 -0.68016 9.30542 3.08162 -2.60324 -4.46914 8 8 0 1.77 -2013-Sep-20 09:11:11 4171697.00094 872125.50340 4730012.20750 11.80806 48.17149 534.05504 4.15827 -0.90844 9.46439 2.96665 -2.83151 -4.31018 8 8 0 1.77 -2013-Sep-20 09:11:11 4171697.67318 872125.34472 4730012.12995 11.80806 48.17148 534.41444 3.86539 -1.42628 9.82378 2.67377 -3.34935 -3.95078 8 8 0 1.77 -2013-Sep-20 09:11:11 4171697.01248 872125.23489 4730011.74546 11.80806 48.17149 533.68165 3.89307 -1.18404 9.09100 2.70146 -3.10712 -4.68357 8 8 0 1.77 -2013-Sep-20 09:11:11 4171697.11120 872124.97548 4730011.18131 11.80805 48.17148 533.29032 3.61895 -1.59272 8.69966 2.42734 -3.51580 -5.07490 8 8 0 1.77 -2013-Sep-20 09:11:11 4171697.03702 872124.95784 4730010.96111 11.80805 48.17148 533.07541 3.61687 -1.68279 8.48475 2.42525 -3.60586 -5.28981 8 8 0 1.77 -2013-Sep-20 09:11:11 4171696.45357 872124.92561 4730010.43556 11.80806 48.17148 532.29853 3.70472 -1.60280 7.70787 2.51310 -3.52588 -6.06669 8 8 0 1.77 -2013-Sep-20 09:11:11 4171696.91253 872124.74980 4730011.04404 11.80805 48.17148 533.02755 3.43871 -1.50496 8.43689 2.24709 -3.42803 -5.33767 8 8 0 1.77 -2013-Sep-20 09:11:12 4171697.48545 872124.56586 4730011.42133 11.80805 48.17148 533.65757 3.14142 -1.64317 9.06692 1.94980 -3.56624 -4.70765 8 8 0 1.77 -2013-Sep-20 09:11:12 4171696.54723 872124.67524 4730011.11138 11.80805 48.17149 532.82908 3.44048 -1.18224 8.23842 2.24886 -3.10531 -5.53614 8 8 0 1.77 -2013-Sep-20 09:11:12 4171696.43289 872124.31922 4730011.00900 11.80805 48.17149 532.62957 3.11539 -1.11283 8.03891 1.92377 -3.03590 -5.73565 8 8 0 1.77 -2013-Sep-20 09:11:12 4171696.02901 872124.19992 4730011.12240 11.80805 48.17149 532.43413 3.08126 -0.72443 7.84348 1.88964 -2.64751 -5.93109 8 8 0 1.77 -2013-Sep-20 09:11:12 4171695.93339 872124.10071 4730011.09896 11.80805 48.17149 532.34072 3.00372 -0.65519 7.75006 1.81210 -2.57827 -6.02450 8 8 0 1.77 -2013-Sep-20 09:11:12 4171695.67926 872123.79863 4730011.38134 11.80804 48.17150 532.34401 2.76003 -0.23545 7.75335 1.56841 -2.15853 -6.02121 8 8 0 1.77 -2013-Sep-20 09:11:12 4171695.41879 872123.66780 4730011.16299 11.80804 48.17150 531.99342 2.68527 -0.17115 7.40276 1.49365 -2.09422 -6.37180 8 8 0 1.77 -2013-Sep-20 09:11:12 4171695.30856 872123.72314 4730011.51216 11.80804 48.17150 532.18919 2.76199 0.13368 7.59854 1.57038 -1.78939 -6.17603 8 8 0 1.77 -2013-Sep-20 09:11:12 4171695.28496 872123.58033 4730011.37221 11.80804 48.17150 532.05001 2.62703 0.07933 7.45936 1.43542 -1.84374 -6.31521 8 8 0 1.77 -2013-Sep-20 09:11:12 4171695.59007 872123.70800 4730011.84700 11.80804 48.17150 532.62040 2.68957 0.15397 8.02975 1.49796 -1.76911 -5.74482 8 8 0 1.77 -2013-Sep-20 09:11:12 4171695.85486 872123.86528 4730012.08200 11.80804 48.17150 532.98983 2.78934 0.09357 8.39917 1.59772 -1.82950 -5.37539 8 8 0 1.77 -2013-Sep-20 09:11:12 4171696.37295 872123.74779 4730012.72629 11.80804 48.17150 533.79208 2.56831 0.16329 9.20143 1.37670 -1.75979 -4.57314 8 8 0 1.77 -2013-Sep-20 09:11:12 4171696.98598 872123.76908 4730014.43584 11.80804 48.17151 535.46903 2.46371 0.85301 10.87838 1.27209 -1.07006 -2.89619 8 8 0 1.77 -2013-Sep-20 09:11:12 4171696.63440 872124.14644 4730014.26565 11.80804 48.17151 535.16421 2.90503 0.93841 10.57355 1.71341 -0.98466 -3.20101 8 8 0 1.77 -2013-Sep-20 09:11:12 4171695.57511 872123.89087 4730013.64608 11.80804 48.17151 533.97616 2.87163 1.33681 9.38551 1.68001 -0.58627 -4.38906 8 8 0 1.77 -2013-Sep-20 09:11:12 4171695.74185 872123.78821 4730014.52518 11.80804 48.17151 534.72606 2.73702 1.81711 10.13540 1.54540 -0.10596 -3.63916 8 8 0 1.77 -2013-Sep-20 09:11:12 4171695.89201 872124.11853 4730015.45391 11.80805 48.17152 535.56120 3.02963 2.27660 10.97054 1.83801 0.35352 -2.80402 8 8 0 1.77 -2013-Sep-20 09:11:12 4171695.93631 872124.20820 4730015.76936 11.80805 48.17152 535.83741 3.10834 2.44099 11.24676 1.91672 0.51791 -2.52780 8 8 0 1.77 -2013-Sep-20 09:11:12 4171696.33357 872124.18666 4730016.35551 11.80805 48.17152 536.53057 3.00595 2.54543 11.93991 1.81434 0.62235 -1.83465 8 8 0 1.77 -2013-Sep-20 09:11:12 4171697.09059 872124.12562 4730017.11472 11.80804 48.17152 537.58213 2.79129 2.50891 12.99147 1.59968 0.58583 -0.78309 8 8 0 1.77 -2013-Sep-20 09:11:12 4171698.16713 872123.87417 4730017.85965 11.80804 48.17152 538.80565 2.32488 2.25884 14.21499 1.13326 0.33576 0.44043 8 8 0 1.77 -2013-Sep-20 09:11:12 4171698.28094 872123.56217 4730018.14339 11.80803 48.17152 539.04879 1.99619 2.41263 14.45814 0.80457 0.48956 0.68358 8 8 0 1.77 -2013-Sep-20 09:11:12 4171697.80614 872123.80347 4730017.99993 11.80804 48.17152 538.66488 2.32954 2.62646 14.07423 1.13793 0.70339 0.29966 8 8 0 1.77 -2013-Sep-20 09:11:12 4171697.94351 872123.90236 4730018.20429 11.80804 48.17152 538.92033 2.39823 2.64748 14.32968 1.20661 0.72441 0.55511 8 8 0 1.77 -2013-Sep-20 09:11:12 4171697.61721 872123.47607 4730018.19930 11.80803 48.17152 538.64543 2.04773 2.94715 14.05477 0.85611 1.02408 0.28021 8 8 0 1.77 -2013-Sep-20 09:11:13 4171697.82659 872123.35474 4730019.40804 11.80803 48.17153 539.66624 1.88612 3.61905 15.07558 0.69450 1.69597 1.30102 8 8 0 1.77 -2013-Sep-20 09:11:13 4171697.62176 872123.44606 4730019.62303 11.80803 48.17153 539.70519 2.01742 3.89790 15.11454 0.82581 1.97482 1.33997 8 8 0 1.77 -2013-Sep-20 09:11:13 4171698.87431 872122.93110 4730020.42684 11.80802 48.17153 541.05152 1.25705 3.59891 16.46086 0.06543 1.67583 2.68630 8 8 0 1.77 -2013-Sep-20 09:11:13 4171699.44533 872122.87079 4730020.60214 11.80802 48.17153 541.54667 1.08116 3.30852 16.95601 -0.11045 1.38544 3.18145 8 8 0 1.77 -2013-Sep-20 09:11:13 4171699.59584 872123.03366 4730020.57068 11.80802 48.17153 541.64370 1.20979 3.15293 17.05304 0.01817 1.22985 3.27848 8 8 0 1.77 -2013-Sep-20 09:11:13 4171699.73775 872123.35389 4730020.38648 11.80803 48.17152 541.64279 1.49420 2.87775 17.05213 0.30259 0.95467 3.27757 8 8 0 1.77 -2013-Sep-20 09:11:13 4171699.64311 872123.35640 4730020.46653 11.80803 48.17152 541.64100 1.51603 2.99977 17.05034 0.32441 1.07670 3.27578 8 8 0 1.77 -2013-Sep-20 09:11:13 4171699.21712 872123.75488 4730020.29000 11.80803 48.17153 541.28576 1.99324 3.13200 16.69510 0.80162 1.20892 2.92054 8 8 0 1.77 -2013-Sep-20 09:11:13 4171700.25337 872123.79198 4730020.93678 11.80803 48.17152 542.44922 1.81751 2.80187 17.85856 0.62589 0.87879 4.08400 8 8 0 1.77 -2013-Sep-20 09:11:13 4171700.02449 872123.86560 4730020.94229 11.80803 48.17152 542.31395 1.93640 2.96125 17.72330 0.74479 1.03818 3.94874 8 8 0 1.77 -2013-Sep-20 09:11:13 4171699.96229 872124.35053 4730020.88645 11.80804 48.17152 542.29792 2.42380 2.89543 17.70727 1.23218 0.97236 3.93271 8 8 0 1.77 -2013-Sep-20 09:11:13 4171699.94223 872124.13060 4730020.96577 11.80804 48.17152 542.31392 2.21263 2.99650 17.72326 1.02101 1.07342 3.94870 8 8 0 1.77 -2013-Sep-20 09:11:13 4171699.95551 872124.62050 4730021.65044 11.80804 48.17153 542.89963 2.68944 3.36872 18.30897 1.49783 1.44564 4.53441 8 8 0 1.77 -2013-Sep-20 09:11:13 4171700.47702 872124.58482 4730021.68841 11.80804 48.17152 543.26349 2.54781 3.01911 18.67283 1.35619 1.09603 4.89827 8 8 0 1.77 -2013-Sep-20 09:11:13 4171700.28095 872124.73247 4730021.54846 11.80804 48.17153 543.05136 2.73245 3.04627 18.46070 1.54083 1.12319 4.68614 8 8 0 1.77 -2013-Sep-20 09:11:13 4171700.07464 872125.24764 4730021.22221 11.80805 48.17152 542.74389 3.27894 2.90062 18.15324 2.08732 0.97754 4.37867 8 8 0 1.77 -2013-Sep-20 09:11:13 4171699.91011 872125.33933 4730021.13579 11.80805 48.17152 542.58460 3.40235 2.94901 17.99394 2.21074 1.02593 4.21938 8 8 0 1.77 -2013-Sep-20 09:11:13 4171700.21068 872125.31471 4730021.20773 11.80805 48.17152 542.83105 3.31675 2.78151 18.24040 2.12514 0.85843 4.46583 8 8 0 1.77 -2013-Sep-20 09:11:13 4171699.77136 872125.25646 4730021.13332 11.80805 48.17153 542.48087 3.34963 3.06120 17.89022 2.15802 1.13812 4.11566 8 8 0 1.77 -2013-Sep-20 09:11:13 4171699.25129 872124.96823 4730020.66025 11.80805 48.17153 541.74954 3.17392 3.16899 17.15888 1.98230 1.24591 3.38432 8 8 0 1.77 -2013-Sep-20 09:11:13 4171699.53066 872124.82540 4730021.16397 11.80805 48.17153 542.28776 2.97695 3.32293 17.69710 1.78533 1.39985 3.92254 8 8 0 1.77 -2013-Sep-20 09:11:13 4171699.40051 872124.60406 4730020.82907 11.80804 48.17153 541.92305 2.78693 3.22826 17.33239 1.59531 1.30519 3.55783 8 8 0 1.77 -2013-Sep-20 09:11:13 4171699.47454 872124.44292 4730020.92136 11.80804 48.17153 542.01815 2.61405 3.26039 17.42749 1.42243 1.33731 3.65293 8 8 0 1.77 -2013-Sep-20 09:11:13 4171699.49669 872124.20162 4730020.61892 11.80804 48.17153 541.77431 2.37332 3.07932 17.18366 1.18170 1.15625 3.40910 8 8 0 1.77 -2013-Sep-20 09:11:13 4171699.25102 872124.01342 4730020.01884 11.80804 48.17152 541.14111 2.23937 2.88701 16.55046 1.04776 0.96394 2.77589 8 8 0 1.77 -2013-Sep-20 09:11:14 4171698.91414 872124.18026 4730020.25250 11.80804 48.17153 541.11808 2.47162 3.26311 16.52742 1.28000 1.34004 2.75286 8 8 0 1.77 -2013-Sep-20 09:11:14 4171698.94558 872124.04481 4730020.46691 11.80804 48.17153 541.27989 2.33261 3.40383 16.68923 1.14099 1.48076 2.91467 8 8 0 1.77 -2013-Sep-20 09:11:14 4171699.48767 872123.97380 4730021.01330 11.80803 48.17153 542.03121 2.15217 3.38366 17.44055 0.96055 1.46058 3.66599 8 8 0 1.77 -2013-Sep-20 09:11:14 4171699.71391 872124.02221 4730021.77278 11.80803 48.17153 542.75143 2.15326 3.71776 18.16078 0.96164 1.79468 4.38621 8 8 0 1.77 -2013-Sep-20 09:11:14 4171699.66049 872123.79173 4730020.83737 11.80803 48.17153 541.98809 1.93859 3.16804 17.39743 0.74697 1.24496 3.62287 8 8 0 1.77 -2013-Sep-20 09:11:14 4171699.78546 872123.84826 4730021.08573 11.80803 48.17153 542.26244 1.96835 3.23390 17.67178 0.77673 1.31082 3.89722 8 8 0 1.77 -2013-Sep-20 09:11:14 4171699.12684 872123.52202 4730020.45431 11.80803 48.17153 541.31748 1.78378 3.34294 16.72683 0.59217 1.41986 2.95226 8 8 0 1.77 -2013-Sep-20 09:11:14 4171699.18592 872123.65229 4730020.31277 11.80803 48.17153 541.26836 1.89921 3.18559 16.67770 0.70759 1.26251 2.90314 8 8 0 1.77 -2013-Sep-20 09:11:14 4171698.46715 872123.57610 4730019.81331 11.80803 48.17153 540.41658 1.97172 3.38836 15.82592 0.78010 1.46529 2.05136 8 8 0 1.77 -2013-Sep-20 09:11:14 4171698.03759 872123.49818 4730018.52927 11.80803 48.17152 539.16874 1.98334 2.85722 14.57809 0.79173 0.93415 0.80353 8 8 0 1.77 -2013-Sep-20 09:11:14 4171697.72851 872123.34570 4730018.02089 11.80803 48.17152 538.56735 1.89734 2.76687 13.97669 0.70572 0.84379 0.20213 8 8 0 1.77 -2013-Sep-20 09:11:14 4171697.60037 872123.14062 4730017.86697 11.80803 48.17152 538.34102 1.72282 2.78896 13.75037 0.53121 0.86588 -0.02420 8 8 0 1.77 -2013-Sep-20 09:11:14 4171696.84702 872122.94029 4730016.92208 11.80803 48.17152 537.11782 1.68089 2.73883 12.52717 0.48927 0.81575 -1.24740 8 8 0 1.77 -2013-Sep-20 09:11:14 4171696.87150 872123.04146 4730016.81693 11.80803 48.17152 537.06926 1.77491 2.63542 12.47860 0.58329 0.71234 -1.29596 8 8 0 1.77 -2013-Sep-20 09:11:14 4171697.51058 872122.74303 4730016.72694 11.80802 48.17152 537.37867 1.35202 2.15478 12.78801 0.16040 0.23170 -0.98655 8 8 0 1.77 -2013-Sep-20 09:11:14 4171697.26988 872122.55436 4730016.04608 11.80802 48.17151 536.68845 1.21659 1.90504 12.09779 0.02498 -0.01804 -1.67677 8 8 0 1.77 -2013-Sep-20 09:11:14 4171697.45279 872122.67920 4730016.10089 11.80802 48.17151 536.86573 1.30137 1.78915 12.27507 0.10975 -0.13393 -1.49949 8 8 0 1.77 -2013-Sep-20 09:11:14 4171698.38837 872122.65631 4730016.78045 11.80802 48.17151 537.97971 1.08751 1.56345 13.38906 -0.10411 -0.35963 -0.38551 8 8 0 1.77 -2013-Sep-20 09:11:14 4171698.62159 872122.57993 4730016.27659 11.80802 48.17151 537.74609 0.96503 1.06897 13.15543 -0.22659 -0.85411 -0.61913 8 8 0 1.77 -2013-Sep-20 09:11:14 4171698.47894 872122.27335 4730015.74495 11.80801 48.17151 537.21498 0.69412 0.86520 12.62432 -0.49749 -1.05788 -1.15024 8 8 0 1.77 -2013-Sep-20 09:11:14 4171699.10468 872122.29384 4730016.13299 11.80801 48.17150 537.91540 0.58613 0.66447 13.32474 -0.60549 -1.25861 -0.44982 8 8 0 1.77 -2013-Sep-20 09:11:14 4171698.96387 872122.26785 4730016.47982 11.80801 48.17151 538.07837 0.58950 1.00243 13.48771 -0.60211 -0.92064 -0.28685 8 8 0 1.77 -2013-Sep-20 09:11:14 4171698.90590 872122.05418 4730016.57869 11.80801 48.17151 538.08504 0.39222 1.14323 13.49438 -0.79939 -0.77985 -0.28018 8 8 0 1.77 -2013-Sep-20 09:11:14 4171699.10318 872121.94893 4730016.31025 11.80801 48.17151 537.99943 0.24882 0.83636 13.40878 -0.94279 -1.08671 -0.36579 8 8 0 1.77 -2013-Sep-20 09:11:14 4171698.64134 872122.04454 4730015.84442 11.80801 48.17151 537.36388 0.43692 0.84798 12.77323 -0.75469 -1.07509 -1.00133 8 8 0 1.77 -2013-Sep-20 09:11:15 4171698.08289 872121.82727 4730015.71550 11.80801 48.17151 536.87361 0.33853 1.20246 12.28296 -0.85309 -0.72062 -1.49160 8 8 0 1.77 -2013-Sep-20 09:11:15 4171697.99540 872121.67586 4730015.42812 11.80801 48.17151 536.58170 0.20823 1.09770 11.99104 -0.98339 -0.82537 -1.78352 8 8 0 1.77 -2013-Sep-20 09:11:15 4171697.96687 872121.49693 4730015.25202 11.80801 48.17151 536.40744 0.03891 1.02836 11.81678 -1.15270 -0.89472 -1.95778 8 8 0 1.77 -2013-Sep-20 09:11:15 4171698.49630 872121.24046 4730015.59721 11.80800 48.17151 536.97526 -0.32046 0.91152 12.38461 -1.51208 -1.01156 -1.38996 8 8 0 1.77 -2013-Sep-20 09:11:15 4171698.77450 872121.25695 4730015.85827 11.80800 48.17151 537.35364 -0.36125 0.88019 12.76299 -1.55287 -1.04289 -1.01157 8 8 0 1.77 -2013-Sep-20 09:11:15 4171699.38934 872120.96868 4730016.41940 11.80800 48.17151 538.13379 -0.76924 0.84992 13.54313 -1.96086 -1.07316 -0.23143 8 8 0 1.77 -2013-Sep-20 09:11:15 4171699.05633 872121.06619 4730016.09198 11.80800 48.17151 537.68573 -0.60564 0.85957 13.09508 -1.79726 -1.06350 -0.67949 8 8 0 1.77 -2013-Sep-20 09:11:15 4171698.63755 872121.10071 4730016.74233 11.80800 48.17151 537.90168 -0.48616 1.59348 13.31102 -1.67778 -0.32959 -0.46354 8 8 0 1.77 -2013-Sep-20 09:11:15 4171698.89157 872121.33224 4730016.92079 11.80800 48.17151 538.23207 -0.31151 1.49192 13.64142 -1.50313 -0.43116 -0.13315 8 8 0 1.77 -2013-Sep-20 09:11:15 4171699.08367 872121.74411 4730017.22679 11.80801 48.17151 538.64170 0.05233 1.49307 14.05104 -1.13928 -0.43000 0.27648 8 8 0 1.77 -2013-Sep-20 09:11:15 4171698.79269 872121.52569 4730017.46809 11.80800 48.17151 538.60174 -0.10192 1.89953 14.01109 -1.29353 -0.02355 0.23652 8 8 0 1.77 -2013-Sep-20 09:11:15 4171698.52361 872121.65880 4730017.45044 11.80801 48.17152 538.43111 0.08343 2.06373 13.84045 -1.10818 0.14065 0.06589 8 8 0 1.77 -2013-Sep-20 09:11:15 4171699.44786 872121.63614 4730018.24048 11.80800 48.17151 539.62005 -0.12788 1.91993 15.02939 -1.31950 -0.00314 1.25483 8 8 0 1.77 -2013-Sep-20 09:11:15 4171698.45350 872121.91485 4730017.62102 11.80801 48.17152 538.54739 0.34842 2.18958 13.95673 -0.84320 0.26650 0.18217 8 8 0 1.77 -2013-Sep-20 09:11:15 4171698.39682 872121.99148 4730017.57517 11.80801 48.17152 538.48668 0.43502 2.18866 13.89603 -0.75660 0.26559 0.12146 8 8 0 1.77 -2013-Sep-20 09:11:15 4171698.42624 872121.98868 4730017.76592 11.80801 48.17152 538.64764 0.42626 2.29484 14.05698 -0.76536 0.37176 0.28242 8 8 0 1.77 -2013-Sep-20 09:11:15 4171698.30969 872122.48771 4730017.39076 11.80802 48.17152 538.36011 0.93857 2.05356 13.76946 -0.25304 0.13048 -0.00511 8 8 0 1.77 -2013-Sep-20 09:11:15 4171698.20917 872122.47823 4730016.57935 11.80802 48.17151 537.68858 0.94987 1.58719 13.09792 -0.24174 -0.33588 -0.67664 8 8 0 1.77 -2013-Sep-20 09:11:15 4171697.79002 872122.42314 4730016.23356 11.80802 48.17151 537.14978 0.98172 1.67070 12.55913 -0.20990 -0.25237 -1.21544 8 8 0 1.77 -2013-Sep-20 09:11:15 4171697.66796 872122.72080 4730016.34959 11.80802 48.17151 537.19719 1.29805 1.79172 12.60653 0.10644 -0.13135 -1.16803 8 8 0 1.77 -2013-Sep-20 09:11:15 4171697.40522 872123.39023 4730016.18432 11.80803 48.17151 536.99388 2.00708 1.77107 12.40322 0.81547 -0.15201 -1.37134 8 8 0 1.77 -2013-Sep-20 09:11:15 4171697.07807 872123.45260 4730015.62570 11.80803 48.17151 536.37257 2.13508 1.62762 11.78192 0.94347 -0.29545 -1.99264 8 8 0 1.77 -2013-Sep-20 09:11:15 4171696.71097 872123.70059 4730014.69900 11.80804 48.17151 535.47625 2.45295 1.23955 10.88560 1.26133 -0.68353 -2.88897 8 8 0 1.77 -2013-Sep-20 09:11:15 4171696.56606 872123.80873 4730014.77274 11.80804 48.17151 535.45136 2.58845 1.37793 10.86071 1.39683 -0.54515 -2.91385 8 8 0 1.77 -2013-Sep-20 09:11:15 4171696.23405 872123.72735 4730014.17300 11.80804 48.17151 534.77663 2.57673 1.23253 10.18597 1.38511 -0.69055 -3.58859 8 8 0 1.77 -2013-Sep-20 09:11:16 4171695.76749 872123.87198 4730014.16296 11.80804 48.17151 534.48432 2.81377 1.54408 9.89367 1.62215 -0.37900 -3.88090 8 8 0 1.77 -2013-Sep-20 09:11:16 4171696.02416 872123.73185 4730014.57571 11.80804 48.17151 534.94030 2.62409 1.65350 10.34965 1.43247 -0.26958 -3.42491 8 8 0 1.77 -2013-Sep-20 09:11:16 4171696.60945 872124.01511 4730014.61794 11.80804 48.17151 535.39250 2.78158 1.21157 10.80185 1.58996 -0.71150 -2.97272 8 8 0 1.77 -2013-Sep-20 09:11:16 4171697.07045 872123.98186 4730014.75445 11.80804 48.17151 535.79062 2.65470 0.97145 11.19997 1.46309 -0.95163 -2.57460 8 8 0 1.77 -2013-Sep-20 09:11:16 4171696.87884 872124.23799 4730014.68182 11.80805 48.17151 535.64637 2.94462 1.02370 11.05572 1.75300 -0.89937 -2.71885 8 8 0 1.77 -2013-Sep-20 09:11:16 4171697.17294 872124.09537 4730014.96779 11.80804 48.17151 536.03199 2.74483 1.02166 11.44133 1.55322 -0.90141 -2.33323 8 8 0 1.77 -2013-Sep-20 09:11:16 4171696.89121 872124.15618 4730014.37905 11.80804 48.17151 535.41768 2.86201 0.82524 10.82702 1.67040 -1.09784 -2.94754 8 8 0 1.77 -2013-Sep-20 09:11:16 4171697.35878 872123.86389 4730015.25049 11.80804 48.17151 536.33236 2.48022 1.10994 11.74170 1.28861 -0.81314 -2.03286 8 8 0 1.77 -2013-Sep-20 09:11:16 4171697.65807 872123.73390 4730015.20797 11.80804 48.17151 536.47831 2.29174 0.88311 11.88766 1.10013 -1.03997 -1.88691 8 8 0 1.77 -2013-Sep-20 09:11:16 4171698.26866 872123.51200 4730015.81205 11.80803 48.17151 537.29675 1.94959 0.87445 12.70609 0.75798 -1.04862 -1.06847 8 8 0 1.77 -2013-Sep-20 09:11:16 4171697.98163 872123.30488 4730016.09369 11.80803 48.17151 537.29097 1.80558 1.30322 12.70032 0.61397 -0.61986 -1.07424 8 8 0 1.77 -2013-Sep-20 09:11:16 4171697.03311 872123.38044 4730016.50152 11.80803 48.17152 536.98599 2.07364 2.25551 12.39534 0.88203 0.33243 -1.37922 8 8 0 1.77 -2013-Sep-20 09:11:16 4171696.89834 872123.51321 4730017.03412 11.80804 48.17152 537.31300 2.23119 2.68875 12.72235 1.03957 0.76568 -1.05221 8 8 0 1.77 -2013-Sep-20 09:11:16 4171696.71739 872123.30362 4730016.89129 11.80803 48.17152 537.05984 2.06306 2.75744 12.46919 0.87145 0.83437 -1.30538 8 8 0 1.77 -2013-Sep-20 09:11:16 4171696.76905 872123.05492 4730017.10611 11.80803 48.17152 537.21970 1.80905 2.90095 12.62905 0.61743 0.97787 -1.14552 8 8 0 1.77 -2013-Sep-20 09:11:16 4171697.67359 872122.75588 4730017.65716 11.80802 48.17152 538.17997 1.33124 2.65429 13.58932 0.13962 0.73122 -0.18525 8 8 0 1.77 -2013-Sep-20 09:11:16 4171697.08714 872122.79009 4730017.15099 11.80803 48.17152 537.42464 1.48473 2.73925 12.83399 0.29312 0.81617 -0.94057 8 8 0 1.77 -2013-Sep-20 09:11:16 4171697.52809 872122.85648 4730017.25585 11.80803 48.17152 537.79969 1.45949 2.47744 13.20903 0.26787 0.55436 -0.56553 8 8 0 1.77 -2013-Sep-20 09:11:16 4171697.67236 872122.69889 4730017.77907 11.80802 48.17152 538.26224 1.27571 2.74518 13.67158 0.08409 0.82211 -0.10298 8 8 0 1.77 -2013-Sep-20 09:11:16 4171698.07733 872122.47063 4730018.44767 11.80802 48.17152 538.99365 0.96941 2.93050 14.40300 -0.22220 1.00742 0.62843 8 8 0 1.77 -2013-Sep-20 09:11:16 4171698.77564 872122.35047 4730018.48478 11.80802 48.17152 539.46075 0.70889 2.46424 14.87009 -0.48272 0.54117 1.09553 8 8 0 1.77 -2013-Sep-20 09:11:16 4171698.93202 872122.39536 4730018.96685 11.80802 48.17152 539.92818 0.72083 2.66483 15.33753 -0.47078 0.74175 1.56296 8 8 0 1.77 -2013-Sep-20 09:11:16 4171699.04167 872122.35148 4730018.76417 11.80801 48.17152 539.84274 0.65544 2.45638 15.25208 -0.53618 0.53331 1.47752 8 8 0 1.77 -2013-Sep-20 09:11:16 4171699.40684 872122.21730 4730019.11357 11.80801 48.17152 540.32316 0.44938 2.44351 15.73251 -0.74224 0.52044 1.95794 8 8 0 1.77 -2013-Sep-20 09:11:16 4171699.73210 872122.37134 4730019.90582 11.80801 48.17152 541.14684 0.53360 2.71113 16.55619 -0.65802 0.78806 2.78163 8 8 0 1.77 -2013-Sep-20 09:11:17 4171700.25783 872122.75230 4730020.46281 11.80802 48.17152 541.95707 0.79891 2.64105 17.36641 -0.39270 0.71798 3.59185 8 8 0 1.77 -2013-Sep-20 09:11:17 4171700.30094 872123.07921 4730020.17611 11.80802 48.17152 541.81619 1.11009 2.36855 17.22553 -0.08153 0.44548 3.45097 8 8 0 1.77 -2013-Sep-20 09:11:17 4171700.35673 872123.27467 4730019.86431 11.80802 48.17152 541.64694 1.29000 2.09012 17.05629 0.09838 0.16705 3.28173 8 8 0 1.77 -2013-Sep-20 09:11:17 4171700.64590 872123.00329 4730020.80627 11.80802 48.17152 542.50058 0.96518 2.54878 17.90993 -0.22644 0.62571 4.13536 8 8 0 1.77 -2013-Sep-20 09:11:17 4171700.78272 872122.85819 4730020.82988 11.80802 48.17152 542.58769 0.79516 2.48686 17.99703 -0.39646 0.56378 4.22247 8 8 0 1.77 -2013-Sep-20 09:11:17 4171701.25994 872122.80094 4730021.24616 11.80801 48.17152 543.20158 0.64147 2.42514 18.61093 -0.55015 0.50206 4.83636 8 8 0 1.77 -2013-Sep-20 09:11:17 4171701.62909 872122.50823 4730021.47266 11.80801 48.17152 543.57139 0.27941 2.35158 18.98074 -0.91221 0.42850 5.20618 8 8 0 1.77 -2013-Sep-20 09:11:17 4171701.71174 872122.49782 4730021.63640 11.80801 48.17152 543.74594 0.25231 2.40208 19.15528 -0.93931 0.47900 5.38072 8 8 0 1.77 -2013-Sep-20 09:11:17 4171701.59630 872122.19521 4730021.49558 11.80801 48.17152 543.52435 -0.02028 2.43851 18.93369 -1.21189 0.51543 5.15913 8 8 0 1.77 -2013-Sep-20 09:11:17 4171701.10367 872122.06529 4730021.15545 11.80800 48.17152 542.93158 -0.04665 2.59080 18.34093 -1.23826 0.66772 4.56636 8 8 0 1.77 -2013-Sep-20 09:11:17 4171701.63756 872121.95665 4730021.86297 11.80800 48.17152 543.79248 -0.26223 2.68980 19.20182 -1.45385 0.76673 5.42726 8 8 0 1.77 -2013-Sep-20 09:11:17 4171701.48390 872121.87848 4730021.77785 11.80800 48.17152 543.61808 -0.30731 2.75703 19.02742 -1.49893 0.83395 5.25286 8 8 0 1.77 -2013-Sep-20 09:11:17 4171700.98971 872121.83147 4730021.39755 11.80800 48.17152 543.00568 -0.25220 2.87102 18.41502 -1.44382 0.94795 4.64046 8 8 0 1.77 -2013-Sep-20 09:11:17 4171701.19113 872121.70623 4730021.67298 11.80800 48.17152 543.32531 -0.41600 2.92690 18.73465 -1.60762 1.00382 4.96009 8 8 0 1.77 -2013-Sep-20 09:11:17 4171700.60881 872121.66760 4730021.76511 11.80800 48.17153 543.00855 -0.33466 3.41896 18.41790 -1.52627 1.49588 4.64334 8 8 0 1.77 -2013-Sep-20 09:11:17 4171699.71756 872121.37757 4730020.94067 11.80800 48.17153 541.77285 -0.43616 3.56342 17.18220 -1.62778 1.64034 3.40763 8 8 0 1.77 -2013-Sep-20 09:11:17 4171698.26359 872121.47589 4730020.37559 11.80801 48.17154 540.41606 -0.04240 4.23206 15.82541 -1.23401 2.30898 2.05085 8 8 0 1.77 -2013-Sep-20 09:11:17 4171698.54233 872121.69538 4730020.06529 11.80801 48.17153 540.39675 0.11541 3.78835 15.80610 -1.07620 1.86527 2.03154 8 8 0 1.77 -2013-Sep-20 09:11:17 4171698.96231 872121.86345 4730019.68954 11.80801 48.17153 540.41386 0.19399 3.20581 15.82321 -0.99763 1.28273 2.04865 8 8 0 1.77 -2013-Sep-20 09:11:17 4171699.68697 872122.10618 4730019.81008 11.80801 48.17152 541.00986 0.28328 2.72064 16.41921 -0.90834 0.79756 2.64465 8 8 0 1.77 -2013-Sep-20 09:11:17 4171699.05737 872122.54860 4730019.02664 11.80802 48.17152 540.07547 0.84518 2.58992 15.48481 -0.34643 0.66684 1.71025 8 8 0 1.77 -2013-Sep-20 09:11:17 4171698.57757 872122.69473 4730018.73724 11.80802 48.17152 539.56656 1.08640 2.72458 14.97590 -0.10522 0.80151 1.20134 8 8 0 1.77 -2013-Sep-20 09:11:17 4171698.39753 872123.19964 4730017.91848 11.80803 48.17152 538.90784 1.61747 2.23288 14.31718 0.42586 0.30980 0.54262 8 8 0 1.77 -2013-Sep-20 09:11:17 4171698.07742 872123.38382 4730017.83518 11.80803 48.17152 538.66194 1.86325 2.38272 14.07128 0.67164 0.45965 0.29672 8 8 0 1.77 -2013-Sep-20 09:11:17 4171698.59805 872123.36775 4730018.14870 11.80803 48.17152 539.23322 1.74099 2.21452 14.64257 0.54937 0.29145 0.86800 8 8 0 1.77 -2013-Sep-20 09:11:18 4171699.01191 872123.35087 4730018.56290 11.80803 48.17152 539.80973 1.63978 2.19147 15.21907 0.44816 0.26839 1.44451 8 8 0 1.77 -2013-Sep-20 09:11:18 4171698.97188 872123.26281 4730018.28279 11.80803 48.17152 539.56285 1.56177 2.04728 14.97220 0.37016 0.12421 1.19763 8 8 0 1.77 -2013-Sep-20 09:11:18 4171698.71650 872123.36825 4730017.93564 11.80803 48.17152 539.15186 1.71724 1.98596 14.56120 0.52563 0.06289 0.78664 8 8 0 1.77 -2013-Sep-20 09:11:18 4171698.65601 872123.28131 4730018.10186 11.80803 48.17152 539.22436 1.64452 2.15419 14.63371 0.45290 0.23112 0.85915 8 8 0 1.77 -2013-Sep-20 09:11:18 4171698.48721 872123.23660 4730017.66980 11.80803 48.17152 538.78612 1.63530 1.99599 14.19547 0.44368 0.07291 0.42091 8 8 0 1.77 -2013-Sep-20 09:11:18 4171697.89940 872123.48445 4730017.12269 11.80803 48.17152 538.02855 1.99818 2.02206 13.43790 0.80657 0.09899 -0.33667 8 8 0 1.77 -2013-Sep-20 09:11:18 4171697.78241 872123.34420 4730016.62738 11.80803 48.17151 537.56397 1.88485 1.79845 12.97331 0.69323 -0.12463 -0.80125 8 8 0 1.77 -2013-Sep-20 09:11:18 4171697.27070 872123.21238 4730016.31093 11.80803 48.17152 536.97613 1.86052 1.98074 12.38548 0.66891 0.05767 -1.38908 8 8 0 1.77 -2013-Sep-20 09:11:18 4171697.04476 872123.45873 4730015.62691 11.80803 48.17151 536.35257 2.14789 1.65179 11.76191 0.95628 -0.27129 -2.01265 8 8 0 1.77 -2013-Sep-20 09:11:18 4171696.81462 872123.53696 4730015.41589 11.80804 48.17151 536.05578 2.27156 1.66699 11.46512 1.07995 -0.25608 -2.30944 8 8 0 1.77 -2013-Sep-20 09:11:18 4171696.73928 872123.68661 4730015.23713 11.80804 48.17151 535.89381 2.43347 1.57991 11.30315 1.24185 -0.34316 -2.47141 8 8 0 1.77 -2013-Sep-20 09:11:18 4171696.86044 872123.69440 4730015.14403 11.80804 48.17151 535.90459 2.41629 1.42827 11.31394 1.22468 -0.49481 -2.46063 8 8 0 1.77 -2013-Sep-20 09:11:18 4171696.12220 872123.86922 4730014.99001 11.80804 48.17151 535.33177 2.73849 1.83735 10.74111 1.54688 -0.08573 -3.03345 8 8 0 1.77 -2013-Sep-20 09:11:18 4171695.43422 872124.19819 4730014.59030 11.80805 48.17152 534.62971 3.20127 2.02241 10.03906 2.00966 0.09933 -3.73551 8 8 0 1.77 -2013-Sep-20 09:11:18 4171695.57757 872124.52787 4730014.86230 11.80805 48.17152 534.97097 3.49464 2.04898 10.38031 2.30303 0.12591 -3.39425 8 8 0 1.77 -2013-Sep-20 09:11:18 4171694.92657 872124.73326 4730014.20356 11.80806 48.17152 534.08317 3.82891 2.05317 9.49251 2.63730 0.13010 -4.28205 8 8 0 1.77 -2013-Sep-20 09:11:18 4171695.32272 872124.78485 4730014.57097 11.80806 48.17152 534.62258 3.79835 2.00139 10.03193 2.60673 0.07831 -3.74264 8 8 0 1.77 -2013-Sep-20 09:11:18 4171695.05832 872124.92389 4730014.45829 11.80806 48.17152 534.38500 3.98855 2.09789 9.79435 2.79693 0.17482 -3.98022 8 8 0 1.77 -2013-Sep-20 09:11:18 4171694.64429 872124.85934 4730014.41449 11.80806 48.17152 534.07328 4.01008 2.38051 9.48263 2.81847 0.45743 -4.29194 8 8 0 1.77 -2013-Sep-20 09:11:18 4171694.60342 872124.97553 4730014.06059 11.80806 48.17152 533.79875 4.13218 2.15658 9.20809 2.94056 0.23351 -4.56647 8 8 0 1.77 -2013-Sep-20 09:11:18 4171695.56341 872124.83096 4730014.66618 11.80806 48.17151 534.85695 3.79422 1.88230 10.26629 2.60260 -0.04077 -3.50827 8 8 0 1.77 -2013-Sep-20 09:11:18 4171696.13787 872124.72235 4730014.93275 11.80805 48.17151 535.41575 3.57036 1.65764 10.82510 2.37874 -0.26544 -2.94947 8 8 0 1.77 -2013-Sep-20 09:11:18 4171695.76128 872124.58792 4730014.67370 11.80805 48.17151 534.95855 3.51584 1.78006 10.36789 2.32422 -0.14302 -3.40667 8 8 0 1.77 -2013-Sep-20 09:11:18 4171695.60814 872124.58599 4730014.91591 11.80805 48.17152 535.03880 3.54529 2.05357 10.44814 2.35367 0.13050 -3.32642 8 8 0 1.77 -2013-Sep-20 09:11:18 4171695.36035 872124.32980 4730014.99277 11.80805 48.17152 534.89935 3.34522 2.32463 10.30870 2.15360 0.40155 -3.46587 8 8 0 1.77 -2013-Sep-20 09:11:19 4171695.33369 872124.19849 4730014.79623 11.80805 48.17152 534.71758 3.22214 2.23302 10.12692 2.03053 0.30994 -3.64764 8 8 0 1.77 -2013-Sep-20 09:11:19 4171696.14726 872124.20623 4730015.45887 11.80805 48.17152 535.74348 3.06323 2.08036 11.15283 1.87162 0.15728 -2.62173 8 8 0 1.77 -2013-Sep-20 09:11:19 4171696.53708 872123.99906 4730015.14245 11.80804 48.17151 535.73390 2.78068 1.61661 11.14325 1.58906 -0.30647 -2.63131 8 8 0 1.77 -2013-Sep-20 09:11:19 4171696.21012 872123.84261 4730015.34223 11.80804 48.17152 535.64799 2.69445 2.01217 11.05733 1.50283 0.08910 -2.71723 8 8 0 1.77 -2013-Sep-20 09:11:19 4171696.94605 872123.86905 4730016.27008 11.80804 48.17152 536.82338 2.56973 2.09015 12.23273 1.37811 0.16708 -1.54184 8 8 0 1.77 -2013-Sep-20 09:11:19 4171696.97450 872123.66022 4730016.09887 11.80804 48.17152 536.68588 2.35950 1.98706 12.09522 1.16788 0.06399 -1.67934 8 8 0 1.77 -2013-Sep-20 09:11:19 4171697.29007 872123.59244 4730016.21878 11.80804 48.17151 536.97198 2.22858 1.84720 12.38132 1.03696 -0.07588 -1.39324 8 8 0 1.77 -2013-Sep-20 09:11:19 4171697.07984 872123.65501 4730015.82226 11.80804 48.17151 536.54781 2.33284 1.72656 11.95716 1.14123 -0.19652 -1.81741 8 8 0 1.77 -2013-Sep-20 09:11:19 4171697.15030 872123.32240 4730016.46139 11.80803 48.17152 537.02467 1.99286 2.15212 12.43401 0.80124 0.22904 -1.34055 8 8 0 1.77 -2013-Sep-20 09:11:19 4171697.19098 872123.03451 4730016.30652 11.80803 48.17152 536.89653 1.70273 2.06307 12.30588 0.51111 0.13999 -1.46869 8 8 0 1.77 -2013-Sep-20 09:11:19 4171697.51756 872122.69345 4730016.31784 11.80802 48.17151 537.07161 1.30207 1.88442 12.48096 0.11045 -0.03865 -1.29361 8 8 0 1.77 -2013-Sep-20 09:11:19 4171696.70450 872122.76573 4730016.13499 11.80803 48.17152 536.41448 1.53919 2.34448 11.82382 0.34757 0.42141 -1.95074 8 8 0 1.77 -2013-Sep-20 09:11:19 4171696.87494 872122.64814 4730016.40702 11.80802 48.17152 536.71238 1.38921 2.41951 12.12173 0.19759 0.49644 -1.65283 8 8 0 1.77 -2013-Sep-20 09:11:19 4171697.31212 872122.47654 4730017.33342 11.80802 48.17152 537.66466 1.13178 2.74462 13.07400 -0.05983 0.82155 -0.70056 8 8 0 1.77 -2013-Sep-20 09:11:19 4171697.29013 872122.52262 4730017.32786 11.80802 48.17152 537.65245 1.18138 2.74993 13.06179 -0.01023 0.82686 -0.71277 8 8 0 1.77 -2013-Sep-20 09:11:19 4171697.10639 872122.33574 4730017.40037 11.80802 48.17152 537.56103 1.03606 2.96080 12.97037 -0.15555 1.03773 -0.80419 8 8 0 1.77 -2013-Sep-20 09:11:19 4171697.30020 872122.29259 4730017.58092 11.80802 48.17152 537.81619 0.95416 2.94643 13.22554 -0.23746 1.02335 -0.54903 8 8 0 1.77 -2013-Sep-20 09:11:19 4171697.20801 872122.53025 4730017.62047 11.80802 48.17152 537.81792 1.20566 3.00380 13.22726 0.01404 1.08073 -0.54730 8 8 0 1.77 -2013-Sep-20 09:11:19 4171698.01302 872122.35572 4730018.02466 11.80802 48.17152 538.62078 0.87009 2.71282 14.03013 -0.32153 0.78975 0.25556 8 8 0 1.77 -2013-Sep-20 09:11:19 4171697.90360 872122.47092 4730017.42859 11.80802 48.17152 538.12092 1.00524 2.37754 13.53026 -0.18637 0.45447 -0.24430 8 8 0 1.77 -2013-Sep-20 09:11:19 4171698.30651 872122.71175 4730018.19742 11.80802 48.17152 538.98969 1.15852 2.55969 14.39904 -0.03309 0.63661 0.62447 8 8 0 1.77 -2013-Sep-20 09:11:19 4171698.75000 872122.58293 4730018.09188 11.80802 48.17152 539.18297 0.94168 2.18547 14.59231 -0.24993 0.26239 0.81775 8 8 0 1.77 -2013-Sep-20 09:11:19 4171698.96093 872122.61433 4730018.01857 11.80802 48.17152 539.27032 0.92925 1.97795 14.67967 -0.26237 0.05488 0.90510 8 8 0 1.77 -2013-Sep-20 09:11:19 4171699.16651 872122.51885 4730018.41188 11.80802 48.17152 539.68457 0.79373 2.10485 15.09391 -0.39789 0.18178 1.31935 8 8 0 1.77 -2013-Sep-20 09:11:19 4171699.27467 872122.63642 4730018.51296 11.80802 48.17152 539.84654 0.88668 2.07545 15.25589 -0.30494 0.15238 1.48132 8 8 0 1.77 -2013-Sep-20 09:11:20 4171699.27310 872122.82630 4730018.51648 11.80802 48.17152 539.87405 1.07286 2.04999 15.28339 -0.11875 0.12691 1.50883 8 8 0 1.77 -2013-Sep-20 09:11:20 4171699.52307 872122.59839 4730018.68419 11.80802 48.17152 540.13109 0.79862 2.01427 15.54043 -0.39300 0.09119 1.76587 8 8 0 1.77 -2013-Sep-20 09:11:20 4171699.39555 872122.52276 4730018.53608 11.80802 48.17152 539.92716 0.75068 2.02003 15.33651 -0.44094 0.09696 1.56194 8 8 0 1.77 -2013-Sep-20 09:11:20 4171699.66411 872122.59066 4730019.46820 11.80802 48.17152 540.80631 0.76220 2.43544 16.21566 -0.42942 0.51236 2.44109 8 8 0 1.77 -2013-Sep-20 09:11:20 4171699.08064 872122.48064 4730019.46887 11.80802 48.17152 540.41091 0.77390 2.87823 15.82025 -0.41772 0.95515 2.04569 8 8 0 1.77 -2013-Sep-20 09:11:20 4171699.20437 872122.70883 4730019.42476 11.80802 48.17152 540.48995 0.97194 2.72377 15.89929 -0.21968 0.80069 2.12473 8 8 0 1.77 -2013-Sep-20 09:11:20 4171699.66187 872122.30732 4730020.19524 11.80801 48.17152 541.30792 0.48531 2.96514 16.71727 -0.70631 1.04206 2.94271 8 8 0 1.77 -2013-Sep-20 09:11:20 4171698.79254 872122.23258 4730019.96085 11.80801 48.17153 540.55558 0.59004 3.45428 15.96493 -0.60158 1.53121 2.19036 8 8 0 1.77 -2013-Sep-20 09:11:20 4171698.76187 872122.62245 4730019.44329 11.80802 48.17153 540.20311 0.97793 3.07205 15.61246 -0.21368 1.14897 1.83789 8 8 0 1.77 -2013-Sep-20 09:11:20 4171698.06897 872122.92318 4730018.43003 11.80802 48.17152 539.03681 1.41410 2.85583 14.44616 0.22248 0.93275 0.67159 8 8 0 1.77 -2013-Sep-20 09:11:20 4171697.94739 872122.73810 4730018.12768 11.80802 48.17152 538.70689 1.25781 2.77109 14.11624 0.06619 0.84801 0.34167 8 8 0 1.77 -2013-Sep-20 09:11:20 4171697.60251 872122.55050 4730017.81273 11.80802 48.17152 538.22147 1.14475 2.84120 13.63081 -0.04687 0.91812 -0.14375 8 8 0 1.77 -2013-Sep-20 09:11:20 4171697.59018 872122.39367 4730017.83808 11.80802 48.17152 538.21091 0.99377 2.89102 13.62025 -0.19785 0.96794 -0.15431 8 8 0 1.77 -2013-Sep-20 09:11:20 4171696.56053 872122.37574 4730017.29676 11.80802 48.17153 537.13296 1.18691 3.28374 12.54230 -0.00471 1.36067 -1.23226 8 8 0 1.77 -2013-Sep-20 09:11:20 4171696.92326 872122.08773 4730017.79658 11.80802 48.17153 537.70287 0.83077 3.39643 13.11222 -0.36085 1.47335 -0.66235 8 8 0 1.77 -2013-Sep-20 09:11:20 4171697.09465 872122.07369 4730017.42650 11.80802 48.17152 537.53707 0.78195 3.02675 12.94642 -0.40966 1.10367 -0.82815 8 8 0 1.77 -2013-Sep-20 09:11:20 4171697.31264 872122.04105 4730017.32319 11.80802 48.17152 537.59794 0.70540 2.80383 13.00728 -0.48622 0.88076 -0.76728 8 8 0 1.77 -2013-Sep-20 09:11:20 4171696.76097 872122.21946 4730016.73529 11.80802 48.17152 536.82410 0.99293 2.78693 12.23344 -0.19869 0.86386 -1.54112 8 8 0 1.77 -2013-Sep-20 09:11:20 4171696.84017 872121.85219 4730016.96757 11.80801 48.17152 536.99876 0.61722 2.94008 12.40810 -0.57440 1.01700 -1.36646 8 8 0 1.77 -2013-Sep-20 09:11:20 4171696.89973 872121.78744 4730017.09349 11.80801 48.17152 537.12263 0.54165 2.99048 12.53197 -0.64997 1.06741 -1.24259 8 8 0 1.77 -2013-Sep-20 09:11:20 4171696.25761 872122.04883 4730016.56199 11.80802 48.17153 536.34309 0.92890 3.06451 11.75244 -0.26271 1.14144 -2.02213 8 8 0 1.77 -2013-Sep-20 09:11:20 4171696.65603 872122.07354 4730017.12168 11.80802 48.17153 537.02359 0.87156 3.14341 12.43294 -0.32005 1.22033 -1.34162 8 8 0 1.77 -2013-Sep-20 09:11:20 4171696.16724 872122.19517 4730016.77955 11.80802 48.17153 536.46617 1.09064 3.25320 11.87552 -0.10097 1.33013 -1.89905 8 8 0 1.77 -2013-Sep-20 09:11:20 4171696.12766 872122.35818 4730017.13923 11.80802 48.17153 536.73060 1.25830 3.49708 12.13994 0.06669 1.57401 -1.63462 8 8 0 1.77 -2013-Sep-20 09:11:20 4171696.51123 872122.29424 4730017.32557 11.80802 48.17153 537.11111 1.11723 3.35135 12.52046 -0.07438 1.42827 -1.25411 8 8 0 1.77 -2013-Sep-20 09:11:21 4171697.04976 872122.26342 4730017.57212 11.80802 48.17153 537.64217 0.97686 3.12768 13.05152 -0.21476 1.20461 -0.72305 8 8 0 1.77 -2013-Sep-20 09:11:21 4171697.23816 872122.07833 4730017.34295 11.80802 48.17152 537.56913 0.75713 2.86565 12.97847 -0.43449 0.94258 -0.79609 8 8 0 1.77 -2013-Sep-20 09:11:21 4171697.53900 872122.18451 4730016.85821 11.80802 48.17152 537.41881 0.79951 2.30676 12.82815 -0.39211 0.38369 -0.94641 8 8 0 1.77 -2013-Sep-20 09:11:21 4171697.65847 872122.30906 4730016.48693 11.80802 48.17152 537.23714 0.89697 1.95302 12.64648 -0.29465 0.02994 -1.12808 8 8 0 1.77 -2013-Sep-20 09:11:21 4171697.52556 872122.12433 4730017.09298 11.80802 48.17152 537.57676 0.74335 2.48230 12.98610 -0.44827 0.55923 -0.78846 8 8 0 1.77 -2013-Sep-20 09:11:21 4171698.01397 872121.97372 4730017.35973 11.80801 48.17152 538.07380 0.49598 2.32693 13.48314 -0.69564 0.40385 -0.29142 8 8 0 1.77 -2013-Sep-20 09:11:21 4171698.80231 872122.14655 4730018.06228 11.80801 48.17152 539.13551 0.50383 2.19412 14.54485 -0.68779 0.27104 0.77029 8 8 0 1.77 -2013-Sep-20 09:11:21 4171698.71250 872122.29870 4730017.98215 11.80801 48.17152 539.03794 0.67114 2.18298 14.44728 -0.52047 0.25991 0.67272 8 8 0 1.77 -2013-Sep-20 09:11:21 4171699.10729 872122.07044 4730018.73306 11.80801 48.17152 539.82404 0.36692 2.43062 15.23338 -0.82469 0.50755 1.45882 8 8 0 1.77 -2013-Sep-20 09:11:21 4171698.28009 872122.26908 4730018.27515 11.80802 48.17152 538.96995 0.73064 2.69829 14.37930 -0.46098 0.77522 0.60473 8 8 0 1.77 -2013-Sep-20 09:11:21 4171699.19818 872122.29725 4730019.24244 11.80801 48.17152 540.29389 0.57034 2.66945 15.70323 -0.62128 0.74638 1.92867 8 8 0 1.77 -2013-Sep-20 09:11:21 4171700.69256 872121.82900 4730020.69249 11.80800 48.17152 542.28600 -0.19381 2.61793 17.69534 -1.38543 0.69485 3.92078 8 8 0 1.77 -2013-Sep-20 09:11:21 4171700.84964 872121.86280 4730021.03791 11.80800 48.17152 542.65054 -0.19286 2.72857 18.05989 -1.38448 0.80549 4.28532 8 8 0 1.77 -2013-Sep-20 09:11:21 4171701.16657 872122.08856 4730021.73122 11.80801 48.17152 543.40486 -0.03674 2.92535 18.81420 -1.22835 1.00228 5.03964 8 8 0 1.77 -2013-Sep-20 09:11:21 4171701.22798 872122.45284 4730021.79066 11.80801 48.17152 543.53895 0.30726 2.86466 18.94829 -0.88435 0.94158 5.17373 8 8 0 1.77 -2013-Sep-20 09:11:21 4171700.68390 872122.55199 4730021.56941 11.80801 48.17153 543.03244 0.51566 3.09883 18.44179 -0.67596 1.17575 4.66722 8 8 0 1.77 -2013-Sep-20 09:11:21 4171701.10633 872122.77780 4730021.66301 11.80801 48.17152 543.40876 0.65025 2.81871 18.81811 -0.54137 0.89563 5.04354 8 8 0 1.77 -2013-Sep-20 09:11:21 4171701.53388 872122.88169 4730022.32459 11.80801 48.17152 544.19502 0.66444 2.93223 19.60436 -0.52717 1.00915 5.82980 8 8 0 1.77 -2013-Sep-20 09:11:21 4171701.08281 872122.95332 4730022.42754 11.80802 48.17153 543.98705 0.82687 3.31896 19.39639 -0.36475 1.39588 5.62183 8 8 0 1.77 -2013-Sep-20 09:11:21 4171701.69585 872123.01475 4730022.72729 11.80802 48.17153 544.61897 0.76155 3.06236 20.02832 -0.43007 1.13929 6.25376 8 8 0 1.77 -2013-Sep-20 09:11:21 4171702.00964 872123.02682 4730023.12507 11.80802 48.17153 545.12187 0.70915 3.09693 20.53121 -0.48247 1.17385 6.75665 8 8 0 1.77 -2013-Sep-20 09:11:21 4171701.62224 872123.11548 4730023.00444 11.80802 48.17153 544.79118 0.87521 3.28552 20.20053 -0.31641 1.36245 6.42596 8 8 0 1.77 -2013-Sep-20 09:11:21 4171702.21595 872122.67510 4730023.60782 11.80801 48.17153 545.56826 0.32266 3.32203 20.97761 -0.86896 1.39895 7.20305 8 8 0 1.77 -2013-Sep-20 09:11:21 4171701.83706 872122.66981 4730023.60130 11.80801 48.17153 545.31534 0.39501 3.59485 20.72469 -0.79661 1.67177 6.95013 8 8 0 1.77 -2013-Sep-20 09:11:21 4171702.58636 872122.56318 4730024.14919 11.80801 48.17153 546.19819 0.13731 3.42997 21.60753 -1.05431 1.50690 7.83297 8 8 0 1.77 -2013-Sep-20 09:11:22 4171701.95182 872122.43491 4730023.93596 11.80801 48.17153 545.60757 0.14160 3.77015 21.01692 -1.05002 1.84707 7.24235 8 8 0 1.77 -2013-Sep-20 09:11:22 4171702.41310 872122.48657 4730023.94704 11.80801 48.17153 545.92400 0.09777 3.43321 21.33334 -1.09385 1.51013 7.55878 8 8 0 1.77 -2013-Sep-20 09:11:22 4171702.44279 872122.27459 4730023.48950 11.80800 48.17153 545.57352 -0.11580 3.13874 20.98286 -1.30742 1.21567 7.20830 8 8 0 1.77 -2013-Sep-20 09:11:22 4171702.64826 872122.07543 4730023.73818 11.80800 48.17153 545.86577 -0.35279 3.18509 21.27512 -1.54441 1.26201 7.50056 8 8 0 1.77 -2013-Sep-20 09:11:22 4171702.62559 872122.13798 4730023.36697 11.80800 48.17152 545.58290 -0.28693 2.94453 20.99224 -1.47855 1.02145 7.21768 8 8 0 1.77 -2013-Sep-20 09:11:22 4171702.27410 872122.14048 4730023.04507 11.80800 48.17152 545.11393 -0.21255 2.98584 20.52327 -1.40417 1.06277 6.74871 8 8 0 1.77 -2013-Sep-20 09:11:22 4171702.33847 872122.02619 4730022.91413 11.80800 48.17152 545.04279 -0.33759 2.86899 20.45213 -1.52921 0.94592 6.67757 8 8 0 1.77 -2013-Sep-20 09:11:22 4171702.47646 872122.03247 4730022.58428 11.80800 48.17152 544.88794 -0.35969 2.54741 20.29728 -1.55130 0.62433 6.52272 8 8 0 1.77 -2013-Sep-20 09:11:22 4171702.70174 872121.61386 4730022.82344 11.80799 48.17152 545.15608 -0.81554 2.60642 20.56542 -2.00716 0.68335 6.79086 8 8 0 1.77 -2013-Sep-20 09:11:22 4171702.77318 872121.79219 4730022.32239 11.80800 48.17152 544.85370 -0.65560 2.19297 20.26304 -1.84722 0.26990 6.48848 8 8 0 1.77 -2013-Sep-20 09:11:22 4171702.31283 872121.63760 4730021.65430 11.80800 48.17152 544.03427 -0.71272 2.10676 19.44361 -1.90433 0.18368 5.66905 8 8 0 1.77 -2013-Sep-20 09:11:22 4171701.63536 872121.75914 4730020.71023 11.80800 48.17152 542.90513 -0.45511 1.95275 18.31448 -1.64673 0.02968 4.53992 8 8 0 1.77 -2013-Sep-20 09:11:22 4171701.14263 872121.72429 4730020.32085 11.80800 48.17152 542.28858 -0.38840 2.05778 17.69792 -1.58002 0.13470 3.92336 8 8 0 1.77 -2013-Sep-20 09:11:22 4171701.04761 872121.94644 4730019.95171 11.80800 48.17151 541.98181 -0.15151 1.84703 17.39116 -1.34313 -0.07605 3.61659 8 8 0 1.77 -2013-Sep-20 09:11:22 4171700.80880 872121.67336 4730019.72100 11.80800 48.17151 541.61674 -0.36994 1.90899 17.02608 -1.56156 -0.01409 3.25152 8 8 0 1.77 -2013-Sep-20 09:11:22 4171700.89026 872121.57862 4730019.80591 11.80800 48.17151 541.72026 -0.47934 1.92064 17.12960 -1.67096 -0.00243 3.35504 8 8 0 1.77 -2013-Sep-20 09:11:22 4171700.47474 872121.47160 4730019.61736 11.80800 48.17152 541.29391 -0.49907 2.11429 16.70325 -1.69069 0.19121 2.92869 8 8 0 1.77 -2013-Sep-20 09:11:22 4171700.55331 872121.65886 4730018.80111 11.80800 48.17151 540.76253 -0.33185 1.48407 16.17188 -1.52347 -0.43901 2.39731 8 8 0 1.77 -2013-Sep-20 09:11:22 4171700.61488 872121.44608 4730018.76201 11.80800 48.17151 540.74454 -0.55273 1.44553 16.15389 -1.74434 -0.47754 2.37933 8 8 0 1.77 -2013-Sep-20 09:11:22 4171700.49863 872121.68465 4730018.66708 11.80800 48.17151 540.63048 -0.29541 1.43063 16.03982 -1.48703 -0.49244 2.26526 8 8 0 1.77 -2013-Sep-20 09:11:22 4171700.72713 872121.53659 4730019.24872 11.80800 48.17151 541.19285 -0.48710 1.67445 16.60219 -1.67872 -0.24863 2.82763 8 8 0 1.77 -2013-Sep-20 09:11:22 4171700.89901 872121.26161 4730018.92592 11.80799 48.17151 541.02698 -0.79143 1.37573 16.43632 -1.98305 -0.54734 2.66176 8 8 0 1.77 -2013-Sep-20 09:11:22 4171700.38213 872121.58721 4730018.76743 11.80800 48.17151 540.61591 -0.36695 1.59738 16.02525 -1.55857 -0.32569 2.25069 8 8 0 1.77 -2013-Sep-20 09:11:22 4171700.48126 872122.01041 4730018.68470 11.80801 48.17151 540.67673 0.02700 1.40538 16.08607 -1.16462 -0.51770 2.31151 8 8 0 1.77 -2013-Sep-20 09:11:22 4171700.42981 872122.09768 4730018.93777 11.80801 48.17151 540.84362 0.12296 1.59838 16.25297 -1.06866 -0.32470 2.47840 8 8 0 1.77 -2013-Sep-20 09:11:23 4171700.25674 872122.04299 4730018.60865 11.80801 48.17151 540.47794 0.10484 1.51346 15.88729 -1.08678 -0.40962 2.11272 8 8 0 1.77 -2013-Sep-20 09:11:23 4171699.16549 872122.38864 4730018.10177 11.80801 48.17151 539.43505 0.66648 1.91864 14.84440 -0.52513 -0.00443 1.06983 8 8 0 1.77 -2013-Sep-20 09:11:23 4171698.90923 872122.50577 4730017.52694 11.80802 48.17151 538.85542 0.83357 1.70434 14.26477 -0.35805 -0.21874 0.49021 8 8 0 1.77 -2013-Sep-20 09:11:23 4171698.87469 872122.60967 4730017.19972 11.80802 48.17151 538.60323 0.94234 1.49546 14.01257 -0.24928 -0.42762 0.23801 8 8 0 1.77 -2013-Sep-20 09:11:23 4171698.74918 872123.04708 4730016.52811 11.80802 48.17151 538.08054 1.39618 1.07241 13.48989 0.20456 -0.85066 -0.28468 8 8 0 1.77 -2013-Sep-20 09:11:23 4171698.16746 872123.30345 4730016.20370 11.80803 48.17151 537.49406 1.76616 1.24126 12.90341 0.57454 -0.68181 -0.87116 8 8 0 1.77 -2013-Sep-20 09:11:23 4171697.47430 872123.78172 4730015.50247 11.80804 48.17151 536.58432 2.37615 1.20625 11.99367 1.18453 -0.71682 -1.78090 8 8 0 1.77 -2013-Sep-20 09:11:23 4171696.86109 872123.68251 4730014.85597 11.80804 48.17151 535.68875 2.40452 1.23749 11.09810 1.21291 -0.68558 -2.67647 8 8 0 1.77 -2013-Sep-20 09:11:23 4171696.35236 872123.75839 4730015.45932 11.80804 48.17152 535.81660 2.58291 1.99936 11.22594 1.39129 0.07628 -2.54862 8 8 0 1.77 -2013-Sep-20 09:11:23 4171695.94794 872124.22422 4730015.25092 11.80805 48.17152 535.46088 3.12163 2.08432 10.87022 1.93001 0.16124 -2.90434 8 8 0 1.77 -2013-Sep-20 09:11:23 4171695.41651 872124.31269 4730015.18146 11.80805 48.17152 535.07428 3.31698 2.41211 10.48362 2.12537 0.48904 -3.29094 8 8 0 1.77 -2013-Sep-20 09:11:23 4171695.64186 872124.48128 4730015.07744 11.80805 48.17152 535.16689 3.43589 2.15267 10.57623 2.24427 0.22960 -3.19833 8 8 0 1.77 -2013-Sep-20 09:11:23 4171695.99033 872124.18767 4730015.78382 11.80805 48.17152 535.88065 3.07719 2.41436 11.28999 1.88557 0.49129 -2.48457 8 8 0 1.77 -2013-Sep-20 09:11:23 4171695.50380 872124.63646 4730014.95546 11.80805 48.17152 535.00705 3.61603 2.14836 10.41639 2.42442 0.22528 -3.35817 8 8 0 1.77 -2013-Sep-20 09:11:23 4171694.98197 872124.64948 4730014.60006 11.80806 48.17152 534.40335 3.73556 2.28997 9.81270 2.54395 0.36689 -3.96187 8 8 0 1.77 -2013-Sep-20 09:11:23 4171694.31828 872124.71684 4730014.54467 11.80806 48.17152 533.93802 3.93731 2.72684 9.34736 2.74570 0.80376 -4.42720 8 8 0 1.77 -2013-Sep-20 09:11:23 4171693.73938 872124.89906 4730014.04188 11.80806 48.17152 533.21034 4.23413 2.78598 8.61968 3.04252 0.86290 -5.15488 8 8 0 1.77 -2013-Sep-20 09:11:23 4171693.33447 872124.85972 4730013.39787 11.80806 48.17152 532.46076 4.27848 2.65781 7.87011 3.08687 0.73474 -5.90445 8 8 0 1.77 -2013-Sep-20 09:11:23 4171693.33025 872124.94481 4730013.19497 11.80806 48.17152 532.31843 4.36264 2.51260 7.72778 3.17102 0.58953 -6.04679 8 8 0 1.77 -2013-Sep-20 09:11:23 4171693.53122 872124.97490 4730013.15073 11.80806 48.17152 532.42077 4.35096 2.33193 7.83011 3.15935 0.40885 -5.94445 8 8 0 1.77 -2013-Sep-20 09:11:23 4171694.08680 872125.12819 4730013.06252 11.80806 48.17151 532.73863 4.38732 1.84449 8.14798 3.19571 -0.07858 -5.62659 8 8 0 1.77 -2013-Sep-20 09:11:23 4171693.49335 872125.31109 4730012.56778 11.80807 48.17151 532.00754 4.68779 1.91951 7.41688 3.49618 -0.00356 -6.35768 8 8 0 1.77 -2013-Sep-20 09:11:23 4171694.23364 872125.33371 4730012.45002 11.80807 48.17151 532.40613 4.55845 1.29758 7.81548 3.36683 -0.62549 -5.95909 8 8 0 1.77 -2013-Sep-20 09:11:23 4171694.78063 872124.95911 4730012.82499 11.80806 48.17151 532.99149 4.07984 1.20581 8.40084 2.88822 -0.71727 -5.37373 8 8 0 1.77 -2013-Sep-20 09:11:23 4171694.84330 872125.01134 4730012.54997 11.80806 48.17151 532.83460 4.11814 0.96872 8.24395 2.92652 -0.95436 -5.53062 8 8 0 1.77 -2013-Sep-20 09:11:24 4171694.78080 872124.89122 4730012.57800 11.80806 48.17151 532.79829 4.01336 1.05132 8.20763 2.82174 -0.87176 -5.56693 8 8 0 1.77 -2013-Sep-20 09:11:24 4171694.55134 872124.87342 4730012.17800 11.80806 48.17151 532.34801 4.04288 0.95463 7.75736 2.85127 -0.96845 -6.01721 8 8 0 1.77 -2013-Sep-20 09:11:24 4171694.40329 872124.59192 4730012.24326 11.80806 48.17151 532.26158 3.79764 1.14906 7.67092 2.60602 -0.77401 -6.10364 8 8 0 1.77 -2013-Sep-20 09:11:24 4171694.72814 872124.31088 4730012.39862 11.80805 48.17151 532.55105 3.45607 1.05859 7.96039 2.26445 -0.86449 -5.81417 8 8 0 1.77 -2013-Sep-20 09:11:24 4171695.27170 872124.30449 4730012.36729 11.80805 48.17150 532.88166 3.33858 0.64221 8.29101 2.14697 -1.28087 -5.48356 8 8 0 1.77 -2013-Sep-20 09:11:24 4171695.59018 872124.22692 4730012.68059 11.80805 48.17150 533.31243 3.19748 0.63069 8.72178 2.00587 -1.29239 -5.05279 8 8 0 1.77 -2013-Sep-20 09:11:24 4171695.61785 872124.16338 4730012.64843 11.80805 48.17150 533.29786 3.12963 0.59875 8.70721 1.93801 -1.32433 -5.06736 8 8 0 1.77 -2013-Sep-20 09:11:24 4171695.56272 872124.27940 4730012.24025 11.80805 48.17150 532.97356 3.25447 0.34905 8.38290 2.06285 -1.57403 -5.39166 8 8 0 1.77 -2013-Sep-20 09:11:24 4171695.98208 872123.84131 4730012.65562 11.80804 48.17150 533.49703 2.73984 0.38699 8.90638 1.54823 -1.53608 -4.86819 8 8 0 1.77 -2013-Sep-20 09:11:24 4171696.40650 872123.93324 4730012.83200 11.80804 48.17150 533.91807 2.74298 0.18104 9.32741 1.55136 -1.74204 -4.44715 8 8 0 1.77 -2013-Sep-20 09:11:24 4171697.01401 872123.56027 4730013.64619 11.80804 48.17150 534.87043 2.25358 0.33779 10.27978 1.06197 -1.58528 -3.49479 8 8 0 1.77 -2013-Sep-20 09:11:24 4171697.78434 872123.37628 4730014.04490 11.80803 48.17150 535.64528 1.91585 0.06988 11.05463 0.72423 -1.85319 -2.71994 8 8 0 1.77 -2013-Sep-20 09:11:24 4171698.57004 872123.35096 4730014.80813 11.80803 48.17150 536.72344 1.73029 0.00967 12.13279 0.53867 -1.91340 -1.64177 8 8 0 1.77 -2013-Sep-20 09:11:24 4171698.63797 872123.40502 4730015.23920 11.80803 48.17150 537.09637 1.76930 0.23936 12.50572 0.57769 -1.68371 -1.26885 8 8 0 1.77 -2013-Sep-20 09:11:24 4171699.46071 872123.29389 4730016.27388 11.80803 48.17150 538.38927 1.49216 0.34626 13.79862 0.30055 -1.57682 0.02406 8 8 0 1.77 -2013-Sep-20 09:11:24 4171699.00394 872123.28348 4730016.64307 11.80803 48.17151 538.36477 1.57544 0.92722 13.77412 0.38382 -0.99585 -0.00045 8 8 0 1.77 -2013-Sep-20 09:11:24 4171699.14968 872123.07268 4730017.00955 11.80802 48.17151 538.70422 1.33928 1.09747 14.11357 0.14767 -0.82561 0.33900 8 8 0 1.77 -2013-Sep-20 09:11:24 4171698.67452 872123.06323 4730016.30640 11.80802 48.17151 537.86881 1.42726 0.97654 13.27815 0.23564 -0.94653 -0.49641 8 8 0 1.77 -2013-Sep-20 09:11:24 4171697.86922 872123.34143 4730016.19643 11.80803 48.17151 537.29913 1.86437 1.44815 12.70848 0.67275 -0.47492 -1.06608 8 8 0 1.77 -2013-Sep-20 09:11:24 4171697.95299 872123.63161 4730016.52621 11.80803 48.17151 537.63916 2.13127 1.56274 13.04850 0.93965 -0.36034 -0.72606 8 8 0 1.77 -2013-Sep-20 09:11:24 4171698.30013 872123.37775 4730017.15193 11.80803 48.17151 538.29737 1.81174 1.76555 13.70672 0.62013 -0.15753 -0.06785 8 8 0 1.77 -2013-Sep-20 09:11:24 4171698.61127 872123.27377 4730017.20090 11.80803 48.17151 538.52278 1.64629 1.58712 13.93213 0.45467 -0.33595 0.15756 8 8 0 1.77 -2013-Sep-20 09:11:24 4171698.70536 872123.09196 4730017.81255 11.80803 48.17152 539.01516 1.44907 1.95413 14.42450 0.25746 0.03106 0.64994 8 8 0 1.77 -2013-Sep-20 09:11:24 4171699.32078 872123.10792 4730018.75535 11.80802 48.17152 540.12159 1.33877 2.13158 15.53094 0.14715 0.20850 1.75638 8 8 0 1.77 -2013-Sep-20 09:11:24 4171700.44214 872122.69263 4730019.56567 11.80802 48.17151 541.40074 0.70279 1.91741 16.81009 -0.48882 -0.00567 3.03552 8 8 0 1.77 -2013-Sep-20 09:11:25 4171700.87047 872122.61229 4730020.08077 11.80801 48.17152 542.05321 0.53650 1.96078 17.46256 -0.65512 0.03770 3.68800 8 8 0 1.77 -2013-Sep-20 09:11:25 4171702.04694 872122.35947 4730020.86237 11.80801 48.17151 543.36910 0.04828 1.66248 18.77845 -1.14333 -0.26060 5.00388 8 8 0 1.77 -2013-Sep-20 09:11:25 4171702.17856 872122.18386 4730020.40536 11.80800 48.17151 543.09052 -0.15054 1.28848 18.49986 -1.34216 -0.63460 4.72530 8 8 0 1.77 -2013-Sep-20 09:11:25 4171702.82370 872122.51184 4730020.74153 11.80801 48.17151 543.80692 0.03848 0.99212 19.21626 -1.15313 -0.93096 5.44170 8 8 0 1.77 -2013-Sep-20 09:11:25 4171703.32821 872122.39124 4730021.23514 11.80800 48.17151 544.48761 -0.18281 0.97171 19.89695 -1.37442 -0.95137 6.12239 8 8 0 1.77 -2013-Sep-20 09:11:25 4171702.96839 872122.67505 4730020.93220 11.80801 48.17151 544.06572 0.16863 0.98885 19.47506 -1.02299 -0.93423 5.70050 8 8 0 1.77 -2013-Sep-20 09:11:25 4171703.49831 872122.59217 4730021.58466 11.80801 48.17151 544.88651 -0.02094 1.05010 20.29586 -1.21255 -0.87298 6.52129 8 8 0 1.77 -2013-Sep-20 09:11:25 4171703.58810 872122.25336 4730021.80658 11.80800 48.17151 545.06425 -0.37094 1.18428 20.47359 -1.56256 -0.73880 6.69903 8 8 0 1.77 -2013-Sep-20 09:11:25 4171703.50841 872122.21588 4730022.54002 11.80800 48.17151 545.55364 -0.39132 1.73725 20.96298 -1.58294 -0.18583 7.18842 8 8 0 1.77 -2013-Sep-20 09:11:25 4171703.34375 872122.34164 4730022.80422 11.80800 48.17152 545.66017 -0.23453 2.01437 21.06951 -1.42615 0.09129 7.29495 8 8 0 1.77 -2013-Sep-20 09:11:25 4171702.78201 872122.25393 4730023.00194 11.80800 48.17152 545.42884 -0.20544 2.56932 20.83819 -1.39705 0.64624 7.06362 8 8 0 1.77 -2013-Sep-20 09:11:25 4171702.77401 872122.25906 4730022.45941 11.80800 48.17152 545.02005 -0.19878 2.21256 20.42939 -1.39040 0.28948 6.65483 8 8 0 1.77 -2013-Sep-20 09:11:25 4171702.61148 872122.29617 4730022.39868 11.80800 48.17152 544.87376 -0.12919 2.28494 20.28310 -1.32081 0.36187 6.50854 8 8 0 1.77 -2013-Sep-20 09:11:25 4171702.43756 872122.22809 4730021.98278 11.80800 48.17152 544.44103 -0.16024 2.14481 19.85037 -1.35186 0.22173 6.07581 8 8 0 1.77 -2013-Sep-20 09:11:25 4171702.41514 872122.17541 4730021.44668 11.80800 48.17151 544.01974 -0.20722 1.81167 19.42908 -1.39884 -0.11141 5.65452 8 8 0 1.77 -2013-Sep-20 09:11:25 4171702.02984 872122.18943 4730021.14974 11.80800 48.17151 543.54887 -0.11466 1.89253 18.95821 -1.30628 -0.03055 5.18365 8 8 0 1.77 -2013-Sep-20 09:11:25 4171702.26815 872121.97079 4730021.35574 11.80800 48.17151 543.82809 -0.37744 1.88943 19.23744 -1.56905 -0.03364 5.46288 8 8 0 1.77 -2013-Sep-20 09:11:25 4171702.70269 872122.03374 4730021.52410 11.80800 48.17151 544.24580 -0.40474 1.67517 19.65515 -1.59636 -0.24791 5.88058 8 8 0 1.77 -2013-Sep-20 09:11:25 4171702.39376 872122.50537 4730020.78404 11.80801 48.17151 543.55705 0.12013 1.33504 18.96639 -1.07149 -0.58804 5.19183 8 8 0 1.77 -2013-Sep-20 09:11:25 4171702.54888 872122.53675 4730020.89914 11.80801 48.17151 543.74835 0.11911 1.29387 19.15770 -1.07251 -0.62921 5.38314 8 8 0 1.77 -2013-Sep-20 09:11:25 4171702.35316 872122.91499 4730020.73096 11.80801 48.17151 543.54689 0.52940 1.26679 18.95624 -0.66222 -0.65628 5.18167 8 8 0 1.77 -2013-Sep-20 09:11:25 4171701.88670 872123.24296 4730020.01185 11.80802 48.17151 542.75131 0.94587 1.07742 18.16065 -0.24575 -0.84565 4.38609 8 8 0 1.77 -2013-Sep-20 09:11:25 4171701.13527 872123.05459 4730019.83813 11.80802 48.17151 542.10563 0.91526 1.53837 17.51498 -0.27636 -0.38470 3.74042 8 8 0 1.77 -2013-Sep-20 09:11:25 4171700.10440 872123.37547 4730018.53072 11.80802 48.17151 540.50227 1.44030 1.36942 15.91161 0.24868 -0.55365 2.13705 8 8 0 1.77 -2013-Sep-20 09:11:25 4171700.31801 872123.36362 4730018.74722 11.80802 48.17151 540.80142 1.38499 1.35981 16.21076 0.19337 -0.56327 2.43620 8 8 0 1.77 -2013-Sep-20 09:11:26 4171699.92813 872123.31133 4730018.90982 11.80802 48.17151 540.66093 1.41359 1.76059 16.07028 0.22197 -0.16249 2.29572 8 8 0 1.77 -2013-Sep-20 09:11:26 4171686.25644 872113.04668 4730002.40583 11.80793 48.17152 518.03750 -5.83618 2.29100 -6.55316 -7.02779 0.36793 -20.32772 8 8 0 1.77 -2013-Sep-20 09:11:26 4171699.56855 872122.88902 4730018.11974 11.80802 48.17151 539.77984 1.07379 1.56035 15.18919 -0.11783 -0.36273 1.41462 8 8 0 1.77 -2013-Sep-20 09:11:26 4171698.95488 872122.83635 4730017.57470 11.80802 48.17151 538.96593 1.14782 1.65249 14.37527 -0.04380 -0.27059 0.60071 8 8 0 1.77 -2013-Sep-20 09:11:26 4171698.52139 872122.91328 4730017.74223 11.80802 48.17152 538.81828 1.31183 2.06866 14.22762 0.12021 0.14558 0.45306 8 8 0 1.77 -2013-Sep-20 09:11:26 4171698.33324 872122.83087 4730017.73504 11.80802 48.17152 538.67886 1.26966 2.21366 14.08820 0.07805 0.29058 0.31364 8 8 0 1.77 -2013-Sep-20 09:11:26 4171698.57027 872122.78294 4730017.69385 11.80802 48.17152 538.79635 1.17424 2.02062 14.20570 -0.01738 0.09754 0.43113 8 8 0 1.77 -2013-Sep-20 09:11:26 4171697.87094 872122.80878 4730017.20228 11.80802 48.17152 537.97707 1.34264 2.19892 13.38641 0.15102 0.27584 -0.38815 8 8 0 1.77 -2013-Sep-20 09:11:26 4171697.41115 872122.56544 4730016.69303 11.80802 48.17152 537.26425 1.19853 2.23177 12.67360 0.00692 0.30870 -1.10097 8 8 0 1.77 -2013-Sep-20 09:11:26 4171696.96020 872122.58784 4730016.48740 11.80802 48.17152 536.81971 1.31274 2.42013 12.22905 0.12113 0.49705 -1.54551 8 8 0 1.77 -2013-Sep-20 09:11:26 4171696.33252 872122.42855 4730015.88985 11.80802 48.17152 535.94297 1.28526 2.50372 11.35232 0.09364 0.58065 -2.42225 8 8 0 1.77 -2013-Sep-20 09:11:26 4171695.66835 872122.30662 4730015.53695 11.80802 48.17152 535.22980 1.30183 2.77139 10.63914 0.11021 0.84832 -3.13542 8 8 0 1.77 -2013-Sep-20 09:11:26 4171695.62194 872121.98928 4730016.07159 11.80802 48.17153 535.55458 1.00070 3.21019 10.96393 -0.19092 1.28711 -2.81064 8 8 0 1.77 -2013-Sep-20 09:11:26 4171696.08143 872121.75290 4730016.38898 11.80801 48.17153 536.05877 0.67529 3.12275 11.46812 -0.51632 1.19968 -2.30645 8 8 0 1.77 -2013-Sep-20 09:11:26 4171695.52989 872121.73778 4730016.13000 11.80802 48.17153 535.50369 0.77335 3.35463 10.91303 -0.41826 1.43155 -2.86153 8 8 0 1.77 -2013-Sep-20 09:11:26 4171695.65018 872121.48345 4730016.54054 11.80801 48.17153 535.85342 0.49980 3.57946 11.26276 -0.69182 1.65638 -2.51180 8 8 0 1.77 -2013-Sep-20 09:11:26 4171695.38313 872121.29255 4730016.04228 11.80801 48.17153 535.28177 0.36758 3.47105 10.69111 -0.82403 1.54798 -3.08345 8 8 0 1.77 -2013-Sep-20 09:11:26 4171695.83768 872121.01103 4730015.58530 11.80801 48.17152 535.19955 -0.00100 2.87769 10.60890 -1.19262 0.95461 -3.16567 8 8 0 1.77 -2013-Sep-20 09:11:26 4171695.82594 872120.89886 4730015.42913 11.80800 48.17152 535.06021 -0.10840 2.79920 10.46956 -1.30001 0.87613 -3.30500 8 8 0 1.77 -2013-Sep-20 09:11:26 4171695.59724 872120.81960 4730015.20978 11.80800 48.17152 534.73666 -0.13918 2.83181 10.14600 -1.33079 0.90874 -3.62856 8 8 0 1.77 -2013-Sep-20 09:11:26 4171695.12172 872120.87485 4730014.56353 11.80801 48.17152 533.95223 0.01221 2.73923 9.36158 -1.17941 0.81616 -4.41299 8 8 0 1.77 -2013-Sep-20 09:11:26 4171695.14789 872120.86452 4730013.94300 11.80801 48.17152 533.50552 -0.00326 2.30789 8.91486 -1.19487 0.38481 -4.85970 8 8 0 1.77 -2013-Sep-20 09:11:26 4171695.18999 872120.81862 4730014.02310 11.80800 48.17152 533.58642 -0.05680 2.33760 8.99577 -1.24841 0.41453 -4.77879 8 8 0 1.77 -2013-Sep-20 09:11:26 4171694.99597 872120.81405 4730014.03766 11.80801 48.17152 533.47000 -0.02157 2.48952 8.87934 -1.21318 0.56645 -4.89522 8 8 0 1.77 -2013-Sep-20 09:11:26 4171694.89505 872121.09917 4730013.41178 11.80801 48.17152 532.97666 0.27817 2.10225 8.38600 -0.91345 0.17918 -5.38856 8 8 0 1.77 -2013-Sep-20 09:11:27 4171694.66456 872121.03217 4730013.18248 11.80801 48.17152 532.64619 0.25975 2.12766 8.05553 -0.93186 0.20458 -5.71903 8 8 0 1.77 -2013-Sep-20 09:11:27 4171695.13153 872121.16667 4730013.53852 11.80801 48.17152 533.23468 0.29585 2.00400 8.64403 -0.89577 0.08093 -5.13054 8 8 0 1.77 -2013-Sep-20 09:11:27 4171695.21893 872121.08356 4730013.02197 11.80801 48.17151 532.89549 0.19662 1.60844 8.30483 -0.99500 -0.31464 -5.46973 8 8 0 1.77 -2013-Sep-20 09:11:27 4171695.34719 872121.08913 4730013.23862 11.80801 48.17151 533.14141 0.17582 1.65852 8.55076 -1.01579 -0.26456 -5.22381 8 8 0 1.77 -2013-Sep-20 09:11:27 4171695.78405 872121.08917 4730013.08218 11.80801 48.17151 533.31002 0.08647 1.23555 8.71936 -1.10515 -0.68753 -5.05520 8 8 0 1.77 -2013-Sep-20 09:11:27 4171696.51473 872121.19700 4730012.97371 11.80801 48.17150 533.72090 0.04249 0.61383 9.13024 -1.14913 -1.30925 -4.64432 8 8 0 1.77 -2013-Sep-20 09:11:27 4171696.41898 872121.58683 4730013.01542 11.80801 48.17150 533.74267 0.44366 0.65204 9.15201 -0.74796 -1.27104 -4.62255 8 8 0 1.77 -2013-Sep-20 09:11:27 4171696.78157 872121.55351 4730013.08254 11.80801 48.17150 534.02483 0.33685 0.43742 9.43418 -0.85476 -1.48566 -4.34039 8 8 0 1.77 -2013-Sep-20 09:11:27 4171696.94521 872121.43326 4730013.19378 11.80801 48.17150 534.19814 0.18566 0.41058 9.60748 -1.00596 -1.51249 -4.16708 8 8 0 1.77 -2013-Sep-20 09:11:27 4171696.34722 872121.53376 4730013.01959 11.80801 48.17150 533.69169 0.40640 0.71525 9.10104 -0.78522 -1.20782 -4.67353 8 8 0 1.77 -2013-Sep-20 09:11:27 4171695.80649 872121.63805 4730013.15818 11.80801 48.17151 533.45621 0.61913 1.18618 8.86555 -0.57248 -0.73690 -4.90901 8 8 0 1.77 -2013-Sep-20 09:11:27 4171696.26694 872121.68348 4730013.63981 11.80801 48.17151 534.12187 0.56938 1.16460 9.53121 -0.62224 -0.75847 -4.24335 8 8 0 1.77 -2013-Sep-20 09:11:27 4171696.86514 872121.65469 4730014.17177 11.80801 48.17151 534.90483 0.41878 1.08745 10.31418 -0.77283 -0.83562 -3.46039 8 8 0 1.77 -2013-Sep-20 09:11:27 4171696.64572 872121.63862 4730014.60878 11.80801 48.17151 535.08503 0.44796 1.54138 10.49438 -0.74366 -0.38169 -3.28019 8 8 0 1.77 -2013-Sep-20 09:11:27 4171697.26958 872121.42909 4730014.98613 11.80801 48.17151 535.74487 0.11520 1.36996 11.15422 -1.07641 -0.55312 -2.62034 8 8 0 1.77 -2013-Sep-20 09:11:27 4171697.71455 872121.25431 4730015.45913 11.80800 48.17151 536.36394 -0.14694 1.38750 11.77329 -1.33855 -0.53558 -2.00127 8 8 0 1.77 -2013-Sep-20 09:11:27 4171697.93379 872121.15119 4730015.58951 11.80800 48.17151 536.59014 -0.29274 1.33027 11.99948 -1.48436 -0.59281 -1.77508 8 8 0 1.77 -2013-Sep-20 09:11:27 4171697.93831 872121.03476 4730015.93374 11.80800 48.17151 536.83370 -0.40763 1.57429 12.24304 -1.59924 -0.34878 -1.53152 8 8 0 1.77 -2013-Sep-20 09:11:27 4171698.05693 872120.81900 4730016.72257 11.80800 48.17152 537.46948 -0.64309 2.04674 12.87883 -1.83471 0.12367 -0.89573 8 8 0 1.77 -2013-Sep-20 09:11:27 4171698.85061 872120.85197 4730017.58196 11.80800 48.17152 538.63247 -0.77324 2.03596 14.04181 -1.96486 0.11288 0.26725 8 8 0 1.77 -2013-Sep-20 09:11:27 4171699.06065 872120.99495 4730018.08383 11.80800 48.17152 539.16305 -0.67627 2.19566 14.57240 -1.86788 0.27258 0.79783 8 8 0 1.77 -2013-Sep-20 09:11:27 4171700.12481 872120.98896 4730018.58090 11.80799 48.17151 540.22729 -0.89989 1.75190 15.63664 -2.09151 -0.17118 1.86207 8 8 0 1.77 -2013-Sep-20 09:11:27 4171700.76326 872121.27936 4730019.54425 11.80800 48.17151 541.40154 -0.74628 1.88441 16.81088 -1.93790 -0.03866 3.03632 8 8 0 1.77 -2013-Sep-20 09:11:27 4171700.78941 872121.59183 4730019.72916 11.80800 48.17152 541.59903 -0.44578 1.94100 17.00838 -1.63740 0.01793 3.23381 8 8 0 1.77 -2013-Sep-20 09:11:27 4171701.07459 872121.92558 4730020.12946 11.80800 48.17152 542.12903 -0.17744 1.94908 17.53837 -1.36906 0.02600 3.76381 8 8 0 1.77 -2013-Sep-20 09:11:28 4171700.52982 872122.32645 4730019.99796 11.80801 48.17152 541.73013 0.32642 2.19759 17.13947 -0.86520 0.27452 3.36491 8 8 0 1.77 -2013-Sep-20 09:11:28 4171700.65498 872122.59203 4730020.40760 11.80801 48.17152 542.15331 0.56077 2.33899 17.56266 -0.63085 0.41592 3.78810 8 8 0 1.77 -2013-Sep-20 09:11:28 4171701.02892 872122.65950 4730020.58537 11.80801 48.17152 542.53909 0.55029 2.17452 17.94844 -0.64133 0.25145 4.17387 8 8 0 1.77 -2013-Sep-20 09:11:28 4171701.34994 872123.10874 4730021.06532 11.80802 48.17152 543.16759 0.92433 2.19196 18.57693 -0.26729 0.26888 4.80237 8 8 0 1.77 -2013-Sep-20 09:11:28 4171701.41566 872123.29479 4730021.36912 11.80802 48.17152 543.46225 1.09300 2.31826 18.87160 -0.09862 0.39518 5.09704 8 8 0 1.77 -2013-Sep-20 09:11:28 4171700.99465 872123.57060 4730021.46935 11.80803 48.17152 543.29975 1.44912 2.65012 18.70909 0.25751 0.72704 4.93453 8 8 0 1.77 -2013-Sep-20 09:11:28 4171701.32391 872123.59479 4730022.26359 11.80802 48.17152 544.10981 1.40542 2.93596 19.51915 0.21380 1.01288 5.74459 8 8 0 1.77 -2013-Sep-20 09:11:28 4171701.51905 872123.74322 4730021.91649 11.80803 48.17152 543.99881 1.51078 2.53952 19.40816 0.31916 0.61644 5.63360 8 8 0 1.77 -2013-Sep-20 09:11:28 4171701.22378 872124.03588 4730021.56745 11.80803 48.17152 543.58592 1.85767 2.47748 18.99526 0.66605 0.55440 5.22070 8 8 0 1.77 -2013-Sep-20 09:11:28 4171701.17356 872124.18506 4730021.49768 11.80803 48.17152 543.52150 2.01397 2.44483 18.93085 0.82236 0.52176 5.15629 8 8 0 1.77 -2013-Sep-20 09:11:28 4171700.87815 872124.61377 4730021.22935 11.80804 48.17152 543.18723 2.49405 2.41597 18.59657 1.30244 0.49290 4.82201 8 8 0 1.77 -2013-Sep-20 09:11:28 4171700.53020 872124.46603 4730021.13499 11.80804 48.17152 542.86961 2.42065 2.62936 18.27895 1.22903 0.70628 4.50439 8 8 0 1.77 -2013-Sep-20 09:11:28 4171700.38751 872124.54003 4730021.76693 11.80804 48.17153 543.25745 2.52228 3.14359 18.66680 1.33066 1.22052 4.89224 8 8 0 1.77 -2013-Sep-20 09:11:28 4171700.48210 872124.29544 4730021.57373 11.80804 48.17152 543.14186 2.26351 2.98304 18.55120 1.07189 1.05997 4.77664 8 8 0 1.77 -2013-Sep-20 09:11:28 4171700.38441 872124.59308 4730020.93156 11.80804 48.17152 542.64020 2.57484 2.58065 18.04954 1.38322 0.65757 4.27498 8 8 0 1.77 -2013-Sep-20 09:11:28 4171699.43415 872124.94705 4730020.89155 11.80805 48.17153 542.03837 3.11577 3.19309 17.44771 1.92416 1.27001 3.67315 8 8 0 1.77 -2013-Sep-20 09:11:28 4171698.99007 872124.84567 4730020.49424 11.80805 48.17153 541.43860 3.10742 3.26748 16.84794 1.91580 1.34441 3.07338 8 8 0 1.77 -2013-Sep-20 09:11:28 4171698.59860 872124.96994 4730019.99661 11.80805 48.17153 540.82920 3.30916 3.20220 16.23854 2.11754 1.27912 2.46398 8 8 0 1.77 -2013-Sep-20 09:11:28 4171697.72330 872125.14159 4730019.33605 11.80805 48.17153 539.78902 3.65630 3.37392 15.19836 2.46468 1.45084 1.42380 8 8 0 1.77 -2013-Sep-20 09:11:28 4171697.44527 872125.13166 4730019.44510 11.80806 48.17153 539.68743 3.70347 3.65094 15.09677 2.51186 1.72787 1.32221 8 8 0 1.77 -2013-Sep-20 09:11:28 4171697.46512 872125.25487 4730019.99327 11.80806 48.17153 540.12566 3.82001 3.98325 15.53501 2.62839 2.06017 1.76045 8 8 0 1.77 -2013-Sep-20 09:11:28 4171697.81560 872125.36560 4730019.87160 11.80806 48.17153 540.27890 3.85668 3.62960 15.68824 2.66506 1.70652 1.91368 8 8 0 1.77 -2013-Sep-20 09:11:28 4171696.76963 872125.46839 4730018.63366 11.80806 48.17153 538.68769 4.17133 3.55124 14.09703 2.97971 1.62816 0.32247 8 8 0 1.77 -2013-Sep-20 09:11:28 4171696.98464 872125.66989 4730019.32905 11.80806 48.17153 539.37372 4.32457 3.82746 14.78306 3.13295 1.90438 1.00850 8 8 0 1.77 -2013-Sep-20 09:11:28 4171697.18226 872125.51418 4730019.42882 11.80806 48.17153 539.55581 4.13171 3.77359 14.96515 2.94010 1.85051 1.19059 8 8 0 1.77 -2013-Sep-20 09:11:29 4171696.78888 872125.47161 4730019.05047 11.80806 48.17153 539.01128 4.17055 3.81468 14.42062 2.97893 1.89160 0.64606 8 8 0 1.77 -2013-Sep-20 09:11:29 4171696.21747 872125.23603 4730018.43986 11.80806 48.17153 538.15112 4.05688 3.86016 13.56046 2.86526 1.93709 -0.21410 8 8 0 1.77 -2013-Sep-20 09:11:29 4171696.76275 872125.09584 4730018.79972 11.80806 48.17153 538.75610 3.80807 3.72381 14.16544 2.61646 1.80074 0.39088 8 8 0 1.77 -2013-Sep-20 09:11:29 4171696.28458 872125.11895 4730018.54831 11.80806 48.17153 538.25977 3.92854 3.90139 13.66911 2.73693 1.97832 -0.10545 8 8 0 1.77 -2013-Sep-20 09:11:29 4171695.51510 872125.05115 4730018.12311 11.80806 48.17154 537.43137 4.01964 4.18940 12.84071 2.82802 2.26632 -0.93385 8 8 0 1.77 -2013-Sep-20 09:11:29 4171695.70442 872124.86531 4730017.79648 11.80806 48.17153 537.28621 3.79899 3.86183 12.69555 2.60738 1.93875 -1.07901 8 8 0 1.77 -2013-Sep-20 09:11:29 4171697.02534 872124.68272 4730018.82343 11.80805 48.17153 538.88880 3.34996 3.61109 14.29814 2.15834 1.68802 0.52358 8 8 0 1.77 -2013-Sep-20 09:11:29 4171697.56713 872124.37971 4730019.39175 11.80805 48.17153 539.62460 2.94249 3.64114 15.03394 1.75087 1.71807 1.25938 8 8 0 1.77 -2013-Sep-20 09:11:29 4171698.12832 872123.99445 4730020.12268 11.80804 48.17153 540.48301 2.45055 3.77803 15.89236 1.25893 1.85495 2.11779 8 8 0 1.77 -2013-Sep-20 09:11:29 4171698.23677 872123.78912 4730019.90767 11.80804 48.17153 540.36557 2.22737 3.58684 15.77492 1.03576 1.66376 2.00036 8 8 0 1.77 -2013-Sep-20 09:11:29 4171698.12558 872123.42339 4730019.83102 11.80803 48.17153 540.18596 1.89214 3.67259 15.59531 0.70052 1.74952 1.82074 8 8 0 1.77 -2013-Sep-20 09:11:29 4171697.66725 872123.35494 4730019.71138 11.80803 48.17153 539.78828 1.91892 3.93753 15.19763 0.72731 2.01446 1.42306 8 8 0 1.77 -2013-Sep-20 09:11:29 4171697.75030 872123.45811 4730019.76202 11.80803 48.17153 539.89431 2.00291 3.89500 15.30365 0.81129 1.97192 1.52909 8 8 0 1.77 -2013-Sep-20 09:11:29 4171697.37489 872123.34486 4730019.00344 11.80803 48.17153 539.06854 1.96888 3.68019 14.47789 0.77727 1.75711 0.70332 8 8 0 1.77 -2013-Sep-20 09:11:29 4171697.56450 872122.96377 4730019.47053 11.80803 48.17153 539.48836 1.55705 3.91150 14.89771 0.36543 1.98843 1.12314 8 8 0 1.77 -2013-Sep-20 09:11:29 4171697.72707 872122.88434 4730019.91797 11.80803 48.17153 539.91705 1.44604 4.10344 15.32639 0.25443 2.18036 1.55183 8 8 0 1.77 -2013-Sep-20 09:11:29 4171698.24957 872122.89020 4730020.15076 11.80802 48.17153 540.43239 1.34485 3.87669 15.84174 0.15324 1.95362 2.06718 8 8 0 1.77 -2013-Sep-20 09:11:29 4171698.09813 872122.65932 4730020.01098 11.80802 48.17153 540.19787 1.14985 3.92914 15.60721 -0.04177 2.00606 1.83265 8 8 0 1.77 -2013-Sep-20 09:11:29 4171698.08833 872122.36723 4730019.75361 11.80802 48.17153 539.95984 0.86594 3.80918 15.36918 -0.32567 1.88611 1.59462 8 8 0 1.77 -2013-Sep-20 09:11:29 4171698.52223 872122.17729 4730019.92730 11.80801 48.17153 540.34658 0.59124 3.63750 15.75593 -0.60038 1.71442 1.98136 8 8 0 1.77 -2013-Sep-20 09:11:29 4171697.58285 872122.02297 4730019.52427 11.80801 48.17153 539.41199 0.63241 4.07741 14.82133 -0.55920 2.15434 1.04677 8 8 0 1.77 -2013-Sep-20 09:11:29 4171697.63924 872121.73716 4730019.17442 11.80801 48.17153 539.14910 0.34110 3.84655 14.55844 -0.85051 1.92347 0.78388 8 8 0 1.77 -2013-Sep-20 09:11:29 4171697.53461 872121.25933 4730018.70900 11.80800 48.17153 538.66879 -0.10520 3.68533 14.07814 -1.29681 1.76225 0.30357 8 8 0 1.77 -2013-Sep-20 09:11:29 4171697.81185 872121.15231 4730018.70755 11.80800 48.17153 538.83408 -0.26668 3.49847 14.24343 -1.45830 1.57539 0.46886 8 8 0 1.77 -2013-Sep-20 09:11:29 4171697.67496 872120.88634 4730018.42482 11.80800 48.17153 538.49775 -0.49902 3.45032 13.90709 -1.69064 1.52724 0.13253 8 8 0 1.77 -2013-Sep-20 09:11:30 4171697.95798 872120.75057 4730018.08811 11.80800 48.17153 538.41308 -0.68983 3.04004 13.82242 -1.88145 1.11697 0.04786 8 8 0 1.77 -2013-Sep-20 09:11:30 4171698.55581 872120.51012 4730017.92941 11.80799 48.17152 538.65226 -1.04753 2.53482 14.06161 -2.23915 0.61175 0.28704 8 8 0 1.77 -2013-Sep-20 09:11:30 4171698.69187 872120.08389 4730017.76410 11.80799 48.17152 538.55974 -1.49258 2.39033 13.96908 -2.68420 0.46726 0.19452 8 8 0 1.77 -2013-Sep-20 09:11:30 4171697.87169 872120.29824 4730017.38550 11.80799 48.17152 537.77148 -1.11493 2.70337 13.18082 -2.30654 0.78030 -0.59374 8 8 0 1.77 -2013-Sep-20 09:11:30 4171697.64076 872120.39637 4730017.21192 11.80799 48.17152 537.50477 -0.97163 2.74108 12.91412 -2.16324 0.81801 -0.86045 8 8 0 1.77 -2013-Sep-20 09:11:30 4171697.03278 872120.41985 4730016.60230 11.80799 48.17152 536.65684 -0.82423 2.77439 12.06618 -2.01585 0.85131 -1.70838 8 8 0 1.77 -2013-Sep-20 09:11:30 4171696.94921 872120.34663 4730016.54590 11.80799 48.17152 536.55027 -0.87880 2.80890 11.95961 -2.07041 0.88583 -1.81495 8 8 0 1.77 -2013-Sep-20 09:11:30 4171697.46511 872120.31730 4730016.54024 11.80799 48.17152 536.87882 -1.01307 2.43331 12.28817 -2.20469 0.51023 -1.48640 8 8 0 1.77 -2013-Sep-20 09:11:30 4171696.87515 872120.54066 4730015.97554 11.80800 48.17152 536.10340 -0.67371 2.45295 11.51274 -1.86533 0.52988 -2.26182 8 8 0 1.77 -2013-Sep-20 09:11:30 4171697.25109 872120.60664 4730016.19866 11.80800 48.17152 536.52407 -0.68606 2.31749 11.93341 -1.87768 0.39442 -1.84115 8 8 0 1.77 -2013-Sep-20 09:11:30 4171697.34559 872120.99690 4730015.52703 11.80800 48.17151 536.13855 -0.32339 1.74114 11.54790 -1.51501 -0.18193 -2.22667 8 8 0 1.77 -2013-Sep-20 09:11:30 4171697.94952 872121.11802 4730015.65610 11.80800 48.17151 536.64550 -0.32842 1.36827 12.05485 -1.52004 -0.55481 -1.71972 8 8 0 1.77 -2013-Sep-20 09:11:30 4171697.68473 872121.41412 4730015.38473 11.80801 48.17151 536.31085 0.01560 1.33527 11.72020 -1.17602 -0.58781 -2.05437 8 8 0 1.77 -2013-Sep-20 09:11:30 4171697.64638 872121.41032 4730014.74579 11.80801 48.17151 535.80919 0.01973 0.93771 11.21854 -1.17189 -0.98537 -2.55603 8 8 0 1.77 -2013-Sep-20 09:11:30 4171697.52681 872121.37284 4730014.26884 11.80801 48.17150 535.37063 0.00750 0.71256 10.77998 -1.18412 -1.21052 -2.99459 8 8 0 1.77 -2013-Sep-20 09:11:30 4171697.39677 872121.46519 4730014.27092 11.80801 48.17150 535.29989 0.12451 0.79471 10.70923 -1.06711 -1.12837 -3.06533 8 8 0 1.77 -2013-Sep-20 09:11:30 4171696.91048 872121.42730 4730014.21534 11.80801 48.17151 534.93586 0.18693 1.11811 10.34521 -1.00469 -0.80497 -3.42936 8 8 0 1.77 -2013-Sep-20 09:11:30 4171697.34401 872121.38274 4730014.32130 11.80801 48.17151 535.29174 0.05460 0.87936 10.70108 -1.13701 -1.04371 -3.07348 8 8 0 1.77 -2013-Sep-20 09:11:30 4171697.62437 872121.42704 4730014.61503 11.80801 48.17151 535.69967 0.04060 0.86401 11.10902 -1.15102 -1.05907 -2.66555 8 8 0 1.77 -2013-Sep-20 09:11:30 4171697.43824 872121.28637 4730014.15853 11.80800 48.17150 535.21881 -0.05902 0.71677 10.62815 -1.25063 -1.20630 -3.14641 8 8 0 1.77 -2013-Sep-20 09:11:30 4171697.18703 872121.33246 4730013.94351 11.80801 48.17150 534.90090 0.03751 0.74958 10.31024 -1.15411 -1.17350 -3.46432 8 8 0 1.77 -2013-Sep-20 09:11:30 4171697.04976 872121.55004 4730013.39163 11.80801 48.17150 534.42975 0.27858 0.44847 9.83909 -0.91304 -1.47461 -3.93547 8 8 0 1.77 -2013-Sep-20 09:11:30 4171696.25762 872121.59170 4730012.69762 11.80801 48.17150 533.40119 0.48145 0.55705 8.81054 -0.71016 -1.36602 -4.96403 8 8 0 1.77 -2013-Sep-20 09:11:30 4171696.09445 872121.84912 4730012.59140 11.80802 48.17150 533.25066 0.76682 0.56597 8.66000 -0.42480 -1.35710 -5.11456 8 8 0 1.77 -2013-Sep-20 09:11:30 4171696.35468 872122.09316 4730012.61714 11.80802 48.17150 533.47301 0.95244 0.35612 8.88236 -0.23918 -1.56696 -4.89220 8 8 0 1.77 -2013-Sep-20 09:11:31 4171695.57440 872122.03615 4730011.71188 11.80802 48.17150 532.28133 1.05630 0.33020 7.69067 -0.13531 -1.59287 -6.08389 8 8 0 1.77 -2013-Sep-20 09:11:31 4171695.30311 872122.12372 4730011.76943 11.80802 48.17150 532.15907 1.19754 0.55311 7.56841 0.00592 -1.36997 -6.20615 8 8 0 1.77 -2013-Sep-20 09:11:31 4171695.80571 872122.02064 4730012.13599 11.80802 48.17150 532.74624 0.99379 0.44670 8.15558 -0.19783 -1.47637 -5.61898 8 8 0 1.77 -2013-Sep-20 09:11:31 4171695.80804 872122.12795 4730012.24496 11.80802 48.17150 532.84360 1.09835 0.50131 8.25294 -0.09326 -1.42176 -5.52162 8 8 0 1.77 -2013-Sep-20 09:11:31 4171695.58737 872122.15744 4730012.18541 11.80802 48.17150 532.65920 1.17238 0.61806 8.06854 -0.01924 -1.30501 -5.70602 8 8 0 1.77 -2013-Sep-20 09:11:31 4171696.08043 872122.35230 4730012.01069 11.80802 48.17150 532.87746 1.26221 0.11219 8.28681 0.07060 -1.81089 -5.48776 8 8 0 1.77 -2013-Sep-20 09:11:31 4171696.60004 872122.11846 4730012.39081 11.80802 48.17150 533.46799 0.92699 0.02236 8.87733 -0.26463 -1.90071 -4.89723 8 8 0 1.77 -2013-Sep-20 09:11:31 4171697.05806 872122.17982 4730012.93349 11.80802 48.17150 534.17973 0.89332 0.04085 9.58908 -0.29829 -1.88222 -4.18549 8 8 0 1.77 -2013-Sep-20 09:11:31 4171696.98371 872122.24762 4730012.53119 11.80802 48.17150 533.84068 0.97491 -0.18355 9.25002 -0.21671 -2.10662 -4.52454 8 8 0 1.77 -2013-Sep-20 09:11:31 4171697.39306 872122.65016 4730012.35033 11.80802 48.17149 534.02806 1.28516 -0.66412 9.43741 0.09355 -2.58719 -4.33715 8 8 0 1.77 -2013-Sep-20 09:11:31 4171697.07385 872122.65968 4730012.33553 11.80802 48.17149 533.80995 1.35980 -0.44261 9.21930 0.16819 -2.36569 -4.55526 8 8 0 1.77 -2013-Sep-20 09:11:31 4171696.89636 872122.75231 4730012.64118 11.80803 48.17150 533.93449 1.48680 -0.12344 9.34383 0.29518 -2.04652 -4.43073 8 8 0 1.77 -2013-Sep-20 09:11:31 4171696.90097 872122.83998 4730012.49885 11.80803 48.17150 533.84341 1.57167 -0.23510 9.25275 0.38005 -2.15817 -4.52181 8 8 0 1.77 -2013-Sep-20 09:11:31 4171696.56988 872122.77570 4730012.12547 11.80803 48.17150 533.34028 1.57650 -0.23282 8.74962 0.38488 -2.15589 -5.02494 8 8 0 1.77 -2013-Sep-20 09:11:31 4171696.90638 872123.16968 4730012.90867 11.80803 48.17150 534.19731 1.89328 -0.01601 9.60665 0.70167 -1.93908 -4.16791 8 8 0 1.77 -2013-Sep-20 09:11:31 4171696.93262 872123.23397 4730013.37515 11.80803 48.17150 534.57081 1.95084 0.26615 9.98015 0.75922 -1.65692 -3.79441 8 8 0 1.77 -2013-Sep-20 09:11:31 4171696.44547 872123.11676 4730013.84584 11.80803 48.17151 534.58753 1.93580 0.95325 9.99688 0.74418 -0.96983 -3.77768 8 8 0 1.77 -2013-Sep-20 09:11:31 4171696.91712 872123.00276 4730014.14716 11.80803 48.17151 535.10440 1.72770 0.82757 10.51374 0.53608 -1.09551 -3.26082 8 8 0 1.77 -2013-Sep-20 09:11:31 4171696.90946 872122.96311 4730014.27723 11.80803 48.17151 535.19091 1.69045 0.92595 10.60025 0.49884 -0.99713 -3.17431 8 8 0 1.77 -2013-Sep-20 09:11:31 4171696.85995 872123.14457 4730014.79767 11.80803 48.17151 535.57116 1.87821 1.28147 10.98050 0.68659 -0.64161 -2.79406 8 8 0 1.77 -2013-Sep-20 09:11:31 4171697.06111 872122.99213 4730014.87195 11.80803 48.17151 535.73701 1.68782 1.20753 11.14636 0.49620 -0.71555 -2.62821 8 8 0 1.77 -2013-Sep-20 09:11:31 4171696.82169 872122.98291 4730014.50520 11.80803 48.17151 535.30618 1.72779 1.13897 10.71552 0.53618 -0.78410 -3.05904 8 8 0 1.77 -2013-Sep-20 09:11:31 4171696.27066 872123.20205 4730014.31034 11.80803 48.17151 534.83118 2.05506 1.37752 10.24053 0.86344 -0.54555 -3.53403 8 8 0 1.77 -2013-Sep-20 09:11:31 4171696.66869 872123.31062 4730014.51046 11.80803 48.17151 535.25494 2.07988 1.20411 10.66429 0.88827 -0.71896 -3.11027 8 8 0 1.77 -2013-Sep-20 09:11:31 4171696.89869 872123.13147 4730014.82167 11.80803 48.17151 535.61254 1.85745 1.27122 11.02188 0.66583 -0.65186 -2.75268 8 8 0 1.77 -2013-Sep-20 09:11:32 4171696.32813 872123.31435 4730014.33550 11.80803 48.17151 534.90277 2.15322 1.33526 10.31211 0.96160 -0.58782 -3.46245 8 8 0 1.77 -2013-Sep-20 09:11:32 4171696.18633 872123.20310 4730014.74184 11.80803 48.17151 535.09780 2.07334 1.72663 10.50715 0.88173 -0.19644 -3.26742 8 8 0 1.77 -2013-Sep-20 09:11:32 4171696.27298 872123.10448 4730014.63518 11.80803 48.17151 535.06143 1.95908 1.60734 10.47078 0.76746 -0.31573 -3.30379 8 8 0 1.77 -2013-Sep-20 09:11:32 4171696.10210 872123.03634 4730014.64304 11.80803 48.17151 534.94644 1.92734 1.74760 10.35579 0.73573 -0.17547 -3.41877 8 8 0 1.77 -2013-Sep-20 09:11:32 4171696.45372 872123.10537 4730014.93485 11.80803 48.17151 535.40283 1.92296 1.67523 10.81218 0.73135 -0.24785 -2.96238 8 8 0 1.77 -2013-Sep-20 09:11:32 4171695.86908 872123.18824 4730014.32371 11.80803 48.17151 534.57711 2.12371 1.68144 9.98646 0.93209 -0.24163 -3.78811 8 8 0 1.77 -2013-Sep-20 09:11:32 4171696.20607 872123.06401 4730014.80380 11.80803 48.17151 535.13787 1.93315 1.77477 10.54722 0.74153 -0.14831 -3.22735 8 8 0 1.77 -2013-Sep-20 09:11:32 4171696.15347 872123.13235 4730015.53661 11.80803 48.17152 535.65892 2.01081 2.29142 11.06826 0.81920 0.36835 -2.70630 8 8 0 1.77 -2013-Sep-20 09:11:32 4171696.10099 872122.91880 4730015.59920 11.80803 48.17152 535.64215 1.81252 2.40401 11.05150 0.62090 0.48093 -2.72306 8 8 0 1.77 -2013-Sep-20 09:11:32 4171696.24578 872122.51715 4730016.02501 11.80802 48.17152 535.99915 1.38974 2.64362 11.40849 0.19812 0.72055 -2.36607 8 8 0 1.77 -2013-Sep-20 09:11:32 4171696.72054 872122.33254 4730017.07891 11.80802 48.17152 537.06919 1.11189 3.02834 12.47853 -0.07973 1.10526 -1.29603 8 8 0 1.77 -2013-Sep-20 09:11:32 4171697.13285 872122.48619 4730018.29592 11.80802 48.17153 538.26615 1.17791 3.51581 13.67550 -0.01371 1.59273 -0.09907 8 8 0 1.77 -2013-Sep-20 09:11:32 4171697.43301 872122.61570 4730018.73323 11.80802 48.17153 538.80562 1.24326 3.56877 14.21497 0.05164 1.64570 0.44040 8 8 0 1.77 -2013-Sep-20 09:11:32 4171697.83279 872122.26746 4730019.24052 11.80802 48.17153 539.39708 0.82058 3.66860 14.80642 -0.37104 1.74552 1.03186 8 8 0 1.77 -2013-Sep-20 09:11:32 4171698.11794 872122.37574 4730020.06919 11.80802 48.17153 540.21547 0.86822 3.99675 15.62482 -0.32340 2.07367 1.85026 8 8 0 1.77 -2013-Sep-20 09:11:32 4171698.54136 872122.49566 4730021.03681 11.80802 48.17154 541.22926 0.89895 4.31494 16.63861 -0.29266 2.39186 2.86404 8 8 0 1.77 -2013-Sep-20 09:11:32 4171699.86273 872122.11376 4730022.35947 11.80801 48.17154 543.02530 0.25474 4.29148 18.43464 -0.93688 2.36841 4.66008 8 8 0 1.77 -2013-Sep-20 09:11:32 4171699.80268 872122.20783 4730021.88027 11.80801 48.17153 542.64186 0.35911 4.00136 18.05121 -0.83251 2.07828 4.27664 8 8 0 1.77 -2013-Sep-20 09:11:32 4171700.62569 872122.20454 4730022.52266 11.80801 48.17153 543.65734 0.18747 3.82999 19.06668 -1.00415 1.90691 5.29212 8 8 0 1.77 -2013-Sep-20 09:11:32 4171701.64625 872122.16838 4730023.30237 11.80800 48.17153 544.89961 -0.05677 3.61112 20.30895 -1.24838 1.68804 6.53439 8 8 0 1.77 -2013-Sep-20 09:11:32 4171700.59443 872122.18177 4730022.93324 11.80801 48.17153 543.93976 0.17158 4.13008 19.34910 -1.02004 2.20700 5.57454 8 8 0 1.77 -2013-Sep-20 09:11:32 4171700.74012 872122.23819 4730022.31783 11.80801 48.17153 543.58400 0.19700 3.60479 18.99334 -0.99462 1.68171 5.21878 8 8 0 1.77 -2013-Sep-20 09:11:32 4171700.60245 872122.27861 4730021.57296 11.80801 48.17153 542.94461 0.26473 3.20228 18.35395 -0.92688 1.27921 4.57939 8 8 0 1.77 -2013-Sep-20 09:11:32 4171700.09069 872122.54839 4730020.67258 11.80801 48.17152 541.97645 0.63353 2.93395 17.38579 -0.55809 1.01087 3.61123 8 8 0 1.77 -2013-Sep-20 09:11:32 4171700.17827 872122.49543 4730021.07262 11.80801 48.17153 542.32447 0.56377 3.14493 17.73382 -0.62785 1.22186 3.95925 8 8 0 1.77 -2013-Sep-20 09:11:33 4171700.52122 872122.39584 4730021.11704 11.80801 48.17152 542.56786 0.39610 2.93960 17.97721 -0.79551 1.01652 4.20264 8 8 0 1.77 -2013-Sep-20 09:11:33 4171700.50160 872122.53942 4730021.07448 11.80801 48.17152 542.54293 0.54066 2.90364 17.95227 -0.65095 0.98056 4.17771 8 8 0 1.77 -2013-Sep-20 09:11:33 4171699.96097 872122.36479 4730020.57774 11.80801 48.17152 541.79604 0.48036 2.99331 17.20539 -0.71126 1.07023 3.43082 8 8 0 1.77 -2013-Sep-20 09:11:33 4171699.87708 872122.52914 4730020.89270 11.80801 48.17153 541.99839 0.65840 3.23948 17.40774 -0.53322 1.31640 3.63318 8 8 0 1.77 -2013-Sep-20 09:11:33 4171700.39593 872122.36514 4730020.89595 11.80801 48.17152 542.31713 0.39169 2.88823 17.72648 -0.79993 0.96515 3.95192 8 8 0 1.77 -2013-Sep-20 09:11:33 4171700.84997 872122.28805 4730021.13728 11.80801 48.17152 542.78284 0.22332 2.72975 18.19218 -0.96829 0.80668 4.41762 8 8 0 1.77 -2013-Sep-20 09:11:33 4171700.80172 872122.66262 4730021.11873 11.80801 48.17152 542.78863 0.59983 2.69546 18.19798 -0.59178 0.77238 4.42341 8 8 0 1.77 -2013-Sep-20 09:11:33 4171701.20726 872122.54494 4730020.99090 11.80801 48.17152 542.94205 0.40166 2.33236 18.35139 -0.78996 0.40929 4.57683 8 8 0 1.77 -2013-Sep-20 09:11:33 4171701.79912 872122.61896 4730021.71637 11.80801 48.17152 543.87909 0.35300 2.37321 19.28844 -0.83862 0.45013 5.51387 8 8 0 1.77 -2013-Sep-20 09:11:33 4171701.92734 872122.66132 4730021.76378 11.80801 48.17152 544.00391 0.36823 2.30484 19.41325 -0.82339 0.38176 5.63869 8 8 0 1.77 -2013-Sep-20 09:11:33 4171701.71728 872122.99727 4730021.38595 11.80802 48.17152 543.63109 0.74005 2.15486 19.04043 -0.45157 0.23178 5.26587 8 8 0 1.77 -2013-Sep-20 09:11:33 4171701.13521 872123.10929 4730020.58580 11.80802 48.17152 542.67018 0.96881 2.02870 18.07952 -0.22281 0.10562 4.30496 8 8 0 1.77 -2013-Sep-20 09:11:33 4171701.32333 872123.10249 4730020.89961 11.80802 48.17152 543.02589 0.92366 2.10181 18.43523 -0.26796 0.17873 4.66067 8 8 0 1.77 -2013-Sep-20 09:11:33 4171702.64359 872122.60096 4730021.57231 11.80801 48.17151 544.32055 0.16257 1.66394 19.72990 -1.02904 -0.25914 5.95534 8 8 0 1.77 -2013-Sep-20 09:11:33 4171703.18094 872122.57524 4730021.77828 11.80801 48.17151 544.82130 0.02744 1.41329 20.23065 -1.16418 -0.50979 6.45608 8 8 0 1.77 -2013-Sep-20 09:11:33 4171702.50049 872122.75788 4730020.47607 11.80801 48.17151 543.43170 0.34545 1.01330 18.84105 -0.84616 -0.90978 5.06648 8 8 0 1.77 -2013-Sep-20 09:11:33 4171701.93086 872122.77874 4730020.11851 11.80801 48.17151 542.79626 0.48244 1.18713 18.20561 -0.70918 -0.73594 4.43104 8 8 0 1.77 -2013-Sep-20 09:11:33 4171702.33724 872122.68858 4730020.69325 11.80801 48.17151 543.47750 0.31103 1.28778 18.88685 -0.88059 -0.63530 5.11229 8 8 0 1.77 -2013-Sep-20 09:11:33 4171702.47075 872122.84113 4730019.74234 11.80801 48.17150 542.87691 0.43303 0.53297 18.28625 -0.75859 -1.39010 4.51169 8 8 0 1.77 -2013-Sep-20 09:11:33 4171702.13286 872123.00777 4730018.89500 11.80801 48.17150 542.04769 0.66528 0.18891 17.45704 -0.52633 -1.73416 3.68247 8 8 0 1.77 -2013-Sep-20 09:11:33 4171702.76657 872123.10940 4730019.35636 11.80801 48.17150 542.81902 0.63509 0.01889 18.22837 -0.55653 -1.90419 4.45380 8 8 0 1.77 -2013-Sep-20 09:11:33 4171702.42018 872123.04641 4730019.25701 11.80801 48.17150 542.51027 0.64431 0.21489 17.91962 -0.54731 -1.70819 4.14505 8 8 0 1.77 -2013-Sep-20 09:11:33 4171701.84028 872123.36614 4730018.86866 11.80802 48.17150 541.88597 1.07595 0.33011 17.29532 -0.11567 -1.59297 3.52075 8 8 0 1.77 -2013-Sep-20 09:11:33 4171701.14808 872123.15131 4730018.74197 11.80802 48.17150 541.31039 1.00731 0.78325 16.71974 -0.18431 -1.13982 2.94517 8 8 0 1.77 -2013-Sep-20 09:11:33 4171700.53555 872123.31218 4730017.57763 11.80802 48.17150 540.06489 1.29012 0.42898 15.47424 0.09850 -1.49410 1.69967 8 8 0 1.77 -2013-Sep-20 09:11:34 4171700.42117 872123.25576 4730017.54686 11.80802 48.17150 539.95960 1.25829 0.50049 15.36895 0.06668 -1.42258 1.59438 8 8 0 1.77 -2013-Sep-20 09:11:34 4171700.20457 872123.16736 4730017.03642 11.80802 48.17150 539.42579 1.21609 0.33154 14.83514 0.02448 -1.59154 1.06057 8 8 0 1.77 -2013-Sep-20 09:11:34 4171699.48898 872123.38902 4730016.53228 11.80803 48.17150 538.61325 1.57949 0.48346 14.02260 0.38788 -1.43962 0.24803 8 8 0 1.77 -2013-Sep-20 09:11:34 4171699.10423 872123.31378 4730016.40570 11.80803 48.17150 538.25750 1.58458 0.69115 13.66685 0.39297 -1.23193 -0.10772 8 8 0 1.77 -2013-Sep-20 09:11:34 4171698.53020 872123.35368 4730015.91311 11.80803 48.17150 537.52118 1.74110 0.77523 12.93052 0.54948 -1.14785 -0.84404 8 8 0 1.77 -2013-Sep-20 09:11:34 4171698.50153 872123.20864 4730015.82793 11.80803 48.17150 537.41920 1.60500 0.76146 12.82854 0.41338 -1.16162 -0.94602 8 8 0 1.77 -2013-Sep-20 09:11:34 4171698.36186 872122.83570 4730016.44436 11.80802 48.17151 537.73645 1.26853 1.33130 13.14580 0.07692 -0.59178 -0.62876 8 8 0 1.77 -2013-Sep-20 09:11:34 4171697.86285 872123.10170 4730016.43915 11.80803 48.17151 537.44312 1.63102 1.65122 12.85246 0.43940 -0.27185 -0.92210 8 8 0 1.77 -2013-Sep-20 09:11:34 4171697.51138 872123.13143 4730016.77232 11.80803 48.17152 537.46601 1.73204 2.12524 12.87535 0.54042 0.20216 -0.89921 8 8 0 1.77 -2013-Sep-20 09:11:34 4171696.91445 872123.48157 4730016.67884 11.80804 48.17152 537.05446 2.19692 2.44489 12.46381 1.00530 0.52182 -1.31076 8 8 0 1.77 -2013-Sep-20 09:11:34 4171697.26836 872123.33992 4730016.78699 11.80803 48.17152 537.34675 1.98584 2.28048 12.75610 0.79423 0.35741 -1.01847 8 8 0 1.77 -2013-Sep-20 09:11:34 4171697.49048 872123.06464 4730017.13771 11.80803 48.17152 537.71552 1.67093 2.39435 13.12486 0.47932 0.47127 -0.64970 8 8 0 1.77 -2013-Sep-20 09:11:34 4171697.48935 872122.81882 4730017.21277 11.80802 48.17152 537.73716 1.43055 2.48271 13.14650 0.23894 0.55963 -0.62806 8 8 0 1.77 -2013-Sep-20 09:11:34 4171697.29650 872122.92735 4730017.19523 11.80803 48.17152 537.61301 1.57625 2.59512 13.02235 0.38463 0.67205 -0.75221 8 8 0 1.77 -2013-Sep-20 09:11:34 4171696.80407 872122.82700 4730016.90491 11.80803 48.17152 537.06153 1.57879 2.77598 12.47088 0.38718 0.85290 -1.30368 8 8 0 1.77 -2013-Sep-20 09:11:34 4171696.78524 872122.99113 4730016.45835 11.80803 48.17152 536.73889 1.74330 2.46688 12.14823 0.55168 0.54380 -1.62633 8 8 0 1.77 -2013-Sep-20 09:11:34 4171697.30776 872123.19322 4730017.55162 11.80803 48.17152 537.92221 1.83418 2.78404 13.33155 0.64257 0.86097 -0.44301 8 8 0 1.77 -2013-Sep-20 09:11:34 4171697.26132 872123.54045 4730017.62032 11.80803 48.17152 537.99047 2.18358 2.81079 13.39981 0.99196 0.88772 -0.37475 8 8 0 1.77 -2013-Sep-20 09:11:34 4171696.82780 872124.11133 4730017.34288 11.80804 48.17152 537.57865 2.83109 2.85492 12.98799 1.63947 0.93184 -0.78657 8 8 0 1.77 -2013-Sep-20 09:11:34 4171697.46836 872124.32511 4730018.39105 11.80804 48.17153 538.80701 2.90926 3.05414 14.21635 1.71765 1.13106 0.44179 8 8 0 1.77 -2013-Sep-20 09:11:34 4171697.55276 872124.50549 4730018.71691 11.80805 48.17153 539.12953 3.06855 3.18239 14.53887 1.87694 1.25931 0.76431 8 8 0 1.77 -2013-Sep-20 09:11:34 4171697.55168 872124.51393 4730018.39441 11.80805 48.17152 538.88967 3.07703 2.96681 14.29902 1.88542 1.04373 0.52445 8 8 0 1.77 -2013-Sep-20 09:11:34 4171697.36481 872124.89308 4730018.29105 11.80805 48.17152 538.74240 3.48640 2.97637 14.15175 2.29478 1.05329 0.37719 8 8 0 1.77 -2013-Sep-20 09:11:34 4171697.26694 872125.02011 4730018.57381 11.80805 48.17153 538.90656 3.63077 3.21696 14.31590 2.43915 1.29388 0.54134 8 8 0 1.77 -2013-Sep-20 09:11:34 4171697.67706 872125.05021 4730019.04317 11.80805 48.17153 539.52812 3.57632 3.22625 14.93747 2.38470 1.30317 1.16291 8 8 0 1.77 -2013-Sep-20 09:11:35 4171698.65767 872124.80853 4730019.75907 11.80805 48.17152 540.66873 3.13908 3.02531 16.07807 1.94747 1.10223 2.30351 8 8 0 1.77 -2013-Sep-20 09:11:35 4171698.51682 872124.76603 4730019.92156 11.80805 48.17153 540.69206 3.12630 3.24288 16.10141 1.93468 1.31981 2.32684 8 8 0 1.77 -2013-Sep-20 09:11:35 4171697.78674 872124.63825 4730019.06154 11.80805 48.17153 539.55719 3.15063 3.22132 14.96653 1.95901 1.29824 1.19197 8 8 0 1.77 -2013-Sep-20 09:11:35 4171698.29502 872124.37519 4730019.82941 11.80804 48.17153 540.42526 2.78912 3.40280 15.83461 1.59751 1.47972 2.06004 8 8 0 1.77 -2013-Sep-20 09:11:35 4171698.28081 872124.54475 4730020.08474 11.80805 48.17153 540.62939 2.95800 3.55760 16.03873 1.76638 1.63452 2.26417 8 8 0 1.77 -2013-Sep-20 09:11:35 4171698.43010 872124.68264 4730019.54760 11.80805 48.17153 540.34542 3.06242 3.06946 15.75476 1.87080 1.14638 1.98020 8 8 0 1.77 -2013-Sep-20 09:11:35 4171698.61533 872124.57665 4730018.99425 11.80804 48.17152 540.03954 2.92077 2.58148 15.44889 1.72915 0.65841 1.67433 8 8 0 1.77 -2013-Sep-20 09:11:35 4171697.52985 872124.81035 4730017.96036 11.80805 48.17152 538.59245 3.37165 2.64807 14.00179 2.18004 0.72499 0.22723 8 8 0 1.77 -2013-Sep-20 09:11:35 4171697.44892 872124.28273 4730018.19984 11.80804 48.17152 538.64606 2.87175 2.94726 14.05540 1.68014 1.02419 0.28084 8 8 0 1.77 -2013-Sep-20 09:11:35 4171696.84425 872124.24928 4730018.11610 11.80805 48.17153 538.18437 2.96275 3.33755 13.59371 1.77114 1.41447 -0.18085 8 8 0 1.77 -2013-Sep-20 09:11:35 4171696.05476 872124.25250 4730017.70527 11.80805 48.17153 537.36331 3.12746 3.63891 12.77265 1.93584 1.71583 -1.00191 8 8 0 1.77 -2013-Sep-20 09:11:35 4171696.41720 872123.98307 4730017.99384 11.80804 48.17153 537.77816 2.78956 3.60808 13.18751 1.59794 1.68501 -0.58706 8 8 0 1.77 -2013-Sep-20 09:11:35 4171696.64325 872124.03123 4730018.07510 11.80804 48.17153 537.99286 2.79044 3.49006 13.40220 1.59882 1.56698 -0.37236 8 8 0 1.77 -2013-Sep-20 09:11:35 4171696.50813 872123.77058 4730017.61193 11.80804 48.17153 537.52395 2.56296 3.31946 12.93330 1.37135 1.39639 -0.84127 8 8 0 1.77 -2013-Sep-20 09:11:35 4171696.75877 872123.80649 4730017.11835 11.80804 48.17152 537.32468 2.54682 2.80200 12.73402 1.35521 0.87893 -1.04054 8 8 0 1.77 -2013-Sep-20 09:11:35 4171696.93473 872123.61640 4730017.06774 11.80804 48.17152 537.37588 2.32474 2.66890 12.78523 1.13313 0.74583 -0.98933 8 8 0 1.77 -2013-Sep-20 09:11:35 4171697.01026 872123.53990 4730016.75921 11.80804 48.17152 537.18485 2.23441 2.41972 12.59420 1.04280 0.49664 -1.18037 8 8 0 1.77 -2013-Sep-20 09:11:35 4171696.75450 872123.48011 4730017.12431 11.80804 48.17152 537.28179 2.22822 2.85887 12.69113 1.03660 0.93579 -1.08343 8 8 0 1.77 -2013-Sep-20 09:11:35 4171696.56156 872123.46089 4730017.25945 11.80804 48.17153 537.25391 2.24889 3.09265 12.66326 1.05728 1.16957 -1.11130 8 8 0 1.77 -2013-Sep-20 09:11:35 4171696.60040 872123.20806 4730017.40097 11.80803 48.17153 537.35022 1.99347 3.19725 12.75956 0.80185 1.27418 -1.01500 8 8 0 1.77 -2013-Sep-20 09:11:35 4171697.69286 872123.10255 4730017.47997 11.80803 48.17152 538.10783 1.66663 2.46920 13.51717 0.47501 0.54613 -0.25739 8 8 0 1.77 -2013-Sep-20 09:11:35 4171698.61452 872123.20546 4730017.82572 11.80803 48.17152 538.98116 1.57876 2.01186 14.39051 0.38714 0.08878 0.61594 8 8 0 1.77 -2013-Sep-20 09:11:35 4171698.81027 872122.96455 4730017.84947 11.80802 48.17151 539.09376 1.30289 1.92165 14.50311 0.11127 -0.00142 0.72854 8 8 0 1.77 -2013-Sep-20 09:11:35 4171698.94150 872122.88799 4730017.67845 11.80802 48.17151 539.04155 1.20110 1.72356 14.45089 0.00949 -0.19951 0.67633 8 8 0 1.77 -2013-Sep-20 09:11:35 4171698.78644 872122.53563 4730017.48346 11.80802 48.17151 538.74695 0.88792 1.76035 14.15629 -0.30369 -0.16273 0.38173 8 8 0 1.77 -2013-Sep-20 09:11:36 4171698.71258 872122.54555 4730017.47869 11.80802 48.17151 538.69653 0.91275 1.80952 14.10587 -0.27887 -0.11355 0.33131 8 8 0 1.77 -2013-Sep-20 09:11:36 4171692.08780 872117.62066 4730009.36614 11.80797 48.17152 527.65481 -2.55228 1.98215 3.06416 -3.74389 0.05907 -10.71041 8 8 0 1.77 -2013-Sep-20 09:11:36 4171699.42295 872122.68150 4730017.67368 11.80802 48.17151 539.32410 0.90046 1.40071 14.73344 -0.29116 -0.52237 0.95888 8 8 0 1.77 -2013-Sep-20 09:11:36 4171699.34739 872122.74404 4730017.51190 11.80802 48.17151 539.16276 0.97714 1.33839 14.57211 -0.21448 -0.58469 0.79754 8 8 0 1.77 -2013-Sep-20 09:11:36 4171699.57788 872122.43968 4730017.96182 11.80801 48.17151 539.60694 0.63205 1.51674 15.01629 -0.55957 -0.40634 1.24173 8 8 0 1.77 -2013-Sep-20 09:11:36 4171699.82119 872122.31826 4730018.04019 11.80801 48.17151 539.80760 0.46341 1.41005 15.21694 -0.72820 -0.51302 1.44238 8 8 0 1.77 -2013-Sep-20 09:11:36 4171699.93691 872122.20019 4730019.23629 11.80801 48.17152 540.75829 0.32416 2.14134 16.16764 -0.86746 0.21826 2.39307 8 8 0 1.77 -2013-Sep-20 09:11:36 4171700.21565 872122.29495 4730019.22303 11.80801 48.17151 540.94331 0.35987 1.91474 16.35265 -0.83175 -0.00833 2.57809 8 8 0 1.77 -2013-Sep-20 09:11:36 4171699.68289 872122.42175 4730019.28578 11.80801 48.17152 540.65959 0.59301 2.32583 16.06893 -0.59860 0.40276 2.29437 8 8 0 1.77 -2013-Sep-20 09:11:36 4171699.17586 872122.30296 4730018.98768 11.80801 48.17152 540.09026 0.58049 2.51496 15.49961 -0.61113 0.59189 1.72504 8 8 0 1.77 -2013-Sep-20 09:11:36 4171699.55863 872122.33378 4730019.24155 11.80801 48.17152 540.53350 0.53234 2.40038 15.94285 -0.65928 0.47731 2.16828 8 8 0 1.77 -2013-Sep-20 09:11:36 4171699.30149 872122.11525 4730018.45649 11.80801 48.17152 539.75084 0.37105 2.09770 15.16018 -0.82057 0.17462 1.38562 8 8 0 1.77 -2013-Sep-20 09:11:36 4171699.50347 872121.95051 4730018.67473 11.80801 48.17152 540.02283 0.16846 2.12105 15.43217 -1.02315 0.19797 1.65761 8 8 0 1.77 -2013-Sep-20 09:11:36 4171699.93110 872122.07347 4730018.97306 11.80801 48.17152 540.54106 0.20131 1.98935 15.95041 -0.99031 0.06627 2.17584 8 8 0 1.77 -2013-Sep-20 09:11:36 4171699.81615 872122.02527 4730018.75454 11.80801 48.17152 540.29662 0.17765 1.93481 15.70597 -1.01396 0.01173 1.93141 8 8 0 1.77 -2013-Sep-20 09:11:36 4171700.26621 872121.83560 4730018.56130 11.80800 48.17151 540.42053 -0.10010 1.50659 15.82988 -1.29172 -0.41648 2.05531 8 8 0 1.77 -2013-Sep-20 09:11:36 4171699.54501 872122.00064 4730018.16401 11.80801 48.17151 539.67623 0.20902 1.74250 15.08557 -0.98259 -0.18058 1.31101 8 8 0 1.77 -2013-Sep-20 09:11:36 4171699.70760 872122.10430 4730018.18608 11.80801 48.17151 539.81296 0.27722 1.62283 15.22230 -0.91439 -0.30025 1.44774 8 8 0 1.77 -2013-Sep-20 09:11:36 4171700.17929 872121.62729 4730018.70168 11.80800 48.17151 540.43997 -0.28622 1.69537 15.84931 -1.47783 -0.22770 2.07475 8 8 0 1.77 -2013-Sep-20 09:11:36 4171699.92479 872121.77983 4730017.85113 11.80800 48.17151 539.66087 -0.08482 1.29051 15.07022 -1.27644 -0.63256 1.29565 8 8 0 1.77 -2013-Sep-20 09:11:36 4171699.19856 872121.68303 4730017.00367 11.80801 48.17151 538.54211 -0.03096 1.26979 13.95145 -1.22258 -0.65329 0.17689 8 8 0 1.77 -2013-Sep-20 09:11:36 4171699.05166 872121.68371 4730017.12761 11.80801 48.17151 538.53865 -0.00024 1.45949 13.94800 -1.19186 -0.46359 0.17343 8 8 0 1.77 -2013-Sep-20 09:11:36 4171698.83178 872121.65585 4730017.32318 11.80801 48.17151 538.53704 0.01749 1.75454 13.94639 -1.17413 -0.16854 0.17183 8 8 0 1.77 -2013-Sep-20 09:11:36 4171697.67544 872121.59601 4730016.92800 11.80801 48.17152 537.47957 0.19554 2.34352 12.88891 -0.99608 0.42044 -0.88565 8 8 0 1.77 -2013-Sep-20 09:11:36 4171696.75381 872121.63033 4730015.94438 11.80801 48.17152 536.14968 0.41772 2.35452 11.55902 -0.77389 0.43145 -2.21554 8 8 0 1.77 -2013-Sep-20 09:11:37 4171696.68678 872121.53815 4730015.90502 11.80801 48.17152 536.06401 0.34121 2.39122 11.47336 -0.85041 0.46814 -2.30121 8 8 0 1.77 -2013-Sep-20 09:11:37 4171696.78946 872121.23712 4730015.64127 11.80801 48.17152 535.89343 0.02555 2.18634 11.30278 -1.16607 0.26326 -2.47179 8 8 0 1.77 -2013-Sep-20 09:11:37 4171696.27050 872121.29362 4730015.79515 11.80801 48.17152 535.67703 0.18705 2.65885 11.08638 -1.00457 0.73578 -2.68819 8 8 0 1.77 -2013-Sep-20 09:11:37 4171696.15309 872121.44701 4730015.43961 11.80801 48.17152 535.35639 0.36122 2.48399 10.76574 -0.83040 0.56092 -3.00883 8 8 0 1.77 -2013-Sep-20 09:11:37 4171696.02501 872121.40946 4730015.47945 11.80801 48.17152 535.29734 0.35067 2.60971 10.70669 -0.84095 0.68664 -3.06788 8 8 0 1.77 -2013-Sep-20 09:11:37 4171696.34332 872121.48162 4730015.55857 11.80801 48.17152 535.57393 0.35616 2.41930 10.98328 -0.83545 0.49622 -2.79128 8 8 0 1.77 -2013-Sep-20 09:11:37 4171697.09687 872121.37504 4730015.67203 11.80801 48.17152 536.13585 0.09764 1.96160 11.54519 -1.09397 0.03852 -2.22937 8 8 0 1.77 -2013-Sep-20 09:11:37 4171697.42386 872121.49349 4730015.68264 11.80801 48.17151 536.37337 0.14667 1.71211 11.78272 -1.04495 -0.21096 -1.99185 8 8 0 1.77 -2013-Sep-20 09:11:37 4171697.25907 872121.47626 4730015.53919 11.80801 48.17151 536.15656 0.16353 1.73926 11.56590 -1.02809 -0.18381 -2.20866 8 8 0 1.77 -2013-Sep-20 09:11:37 4171697.41257 872121.73226 4730016.38176 11.80801 48.17152 536.91953 0.38269 2.15019 12.32888 -0.80892 0.22711 -1.44569 8 8 0 1.77 -2013-Sep-20 09:11:37 4171696.66260 872121.97635 4730016.02795 11.80802 48.17152 536.19963 0.77509 2.42402 11.60897 -0.41653 0.50094 -2.16559 8 8 0 1.77 -2013-Sep-20 09:11:37 4171696.52940 872122.07884 4730015.80709 11.80802 48.17152 535.96209 0.90267 2.35825 11.37144 -0.28895 0.43518 -2.40313 8 8 0 1.77 -2013-Sep-20 09:11:37 4171696.42724 872122.07034 4730015.85008 11.80802 48.17152 535.92628 0.91525 2.46273 11.33562 -0.27636 0.53966 -2.43894 8 8 0 1.77 -2013-Sep-20 09:11:37 4171696.03158 872122.19825 4730015.86903 11.80802 48.17152 535.69957 1.12142 2.74445 11.10891 -0.07020 0.82137 -2.66565 8 8 0 1.77 -2013-Sep-20 09:11:37 4171696.52098 872122.29289 4730015.90855 11.80802 48.17152 536.06141 1.11391 2.39942 11.47075 -0.07770 0.47635 -2.30381 8 8 0 1.77 -2013-Sep-20 09:11:37 4171695.43143 872122.56906 4730014.70352 11.80803 48.17152 534.48993 1.60719 2.34836 9.89927 0.41558 0.42529 -3.87529 8 8 0 1.77 -2013-Sep-20 09:11:37 4171694.98794 872122.92920 4730013.97303 11.80803 48.17152 533.70525 2.05046 2.12975 9.11460 0.85885 0.20668 -4.65997 8 8 0 1.77 -2013-Sep-20 09:11:37 4171694.79285 872122.92647 4730013.76788 11.80803 48.17152 533.42466 2.08771 2.13565 8.83401 0.89609 0.21257 -4.94056 8 8 0 1.77 -2013-Sep-20 09:11:37 4171694.28728 872122.93402 4730013.96065 11.80804 48.17152 533.23931 2.19856 2.63181 8.64865 1.00694 0.70873 -5.12591 8 8 0 1.77 -2013-Sep-20 09:11:37 4171694.60212 872123.07678 4730014.43498 11.80804 48.17152 533.81775 2.27387 2.69673 9.22710 1.08225 0.77366 -4.54747 8 8 0 1.77 -2013-Sep-20 09:11:37 4171694.59957 872123.41621 4730014.86278 11.80804 48.17152 534.18118 2.60664 2.93214 9.59052 1.41502 1.00907 -4.18404 8 8 0 1.77 -2013-Sep-20 09:11:37 4171694.71925 872123.65836 4730015.04824 11.80804 48.17152 534.43054 2.81918 2.93161 9.83989 1.62756 1.00853 -3.93467 8 8 0 1.77 -2013-Sep-20 09:11:37 4171694.40657 872123.74338 4730014.91773 11.80805 48.17153 534.14079 2.96638 3.05967 9.55014 1.77477 1.13659 -4.22443 8 8 0 1.77 -2013-Sep-20 09:11:37 4171693.82276 872123.87665 4730014.40044 11.80805 48.17153 533.39241 3.21631 3.12018 8.80176 2.02469 1.19711 -4.97281 8 8 0 1.77 -2013-Sep-20 09:11:37 4171694.43490 872123.87789 4730014.61609 11.80805 48.17152 533.95287 3.09225 2.81734 9.36222 1.90063 0.89426 -4.41234 8 8 0 1.77 -2013-Sep-20 09:11:38 4171694.56204 872123.70075 4730015.20182 11.80804 48.17153 534.44815 2.89285 3.14223 9.85749 1.70123 1.21916 -3.91707 8 8 0 1.77 -2013-Sep-20 09:11:38 4171694.88830 872123.56695 4730015.54855 11.80804 48.17153 534.90123 2.69511 3.15590 10.31057 1.50350 1.23283 -3.46399 8 8 0 1.77 -2013-Sep-20 09:11:38 4171694.40509 872123.47126 4730015.61395 11.80804 48.17153 534.62147 2.70033 3.56655 10.03081 1.50871 1.64348 -3.74375 8 8 0 1.77 -2013-Sep-20 09:11:38 4171694.81287 872123.60448 4730015.55851 11.80804 48.17153 534.86454 2.74728 3.21184 10.27389 1.55567 1.28876 -3.50068 8 8 0 1.77 -2013-Sep-20 09:11:38 4171695.06552 872123.69697 4730015.22353 11.80804 48.17152 534.79248 2.78612 2.79006 10.20182 1.59450 0.86699 -3.57274 8 8 0 1.77 -2013-Sep-20 09:11:38 4171695.13714 872123.96936 4730015.17086 11.80805 48.17152 534.83716 3.03809 2.66117 10.24650 1.84647 0.73809 -3.52806 8 8 0 1.77 -2013-Sep-20 09:11:38 4171695.53773 872123.96143 4730015.20964 11.80805 48.17152 535.12647 2.94835 2.39605 10.53582 1.75673 0.47298 -3.23874 8 8 0 1.77 -2013-Sep-20 09:11:38 4171695.58338 872124.17985 4730015.02429 11.80805 48.17152 535.04797 3.15280 2.20584 10.45731 1.96118 0.28277 -3.31725 8 8 0 1.77 -2013-Sep-20 09:11:38 4171696.24390 872124.05151 4730015.98736 11.80804 48.17152 536.17926 2.89202 2.38592 11.58861 1.70040 0.46284 -2.18596 8 8 0 1.77 -2013-Sep-20 09:11:38 4171696.13432 872124.13431 4730016.24343 11.80805 48.17152 536.30983 2.99549 2.62399 11.71918 1.80387 0.70091 -2.05539 8 8 0 1.77 -2013-Sep-20 09:11:38 4171696.63458 872124.14825 4730016.13636 11.80804 48.17152 536.55853 2.90676 2.18558 11.96787 1.71515 0.26251 -1.80669 8 8 0 1.77 -2013-Sep-20 09:11:38 4171696.17818 872123.87674 4730016.26463 11.80804 48.17152 536.31912 2.73439 2.64542 11.72846 1.54278 0.72234 -2.04610 8 8 0 1.77 -2013-Sep-20 09:11:38 4171696.47039 872123.99945 4730016.03400 11.80804 48.17152 536.35476 2.79471 2.25976 11.76410 1.60309 0.33669 -2.01046 8 8 0 1.77 -2013-Sep-20 09:11:38 4171696.72307 872123.89857 4730016.65270 11.80804 48.17152 536.96696 2.64425 2.50346 12.37630 1.45264 0.58038 -1.39826 8 8 0 1.77 -2013-Sep-20 09:11:38 4171696.48511 872124.07841 4730016.49433 11.80804 48.17152 536.71816 2.86898 2.54399 12.12750 1.67737 0.62091 -1.64706 8 8 0 1.77 -2013-Sep-20 09:11:38 4171696.77053 872123.91100 4730017.14859 11.80804 48.17152 537.36915 2.64671 2.79766 12.77849 1.45509 0.87458 -0.99607 8 8 0 1.77 -2013-Sep-20 09:11:38 4171697.76226 872124.02423 4730017.93984 11.80804 48.17152 538.62159 2.55460 2.58474 14.03094 1.36299 0.66166 0.25637 8 8 0 1.77 -2013-Sep-20 09:11:38 4171697.80503 872124.02244 4730018.57734 11.80804 48.17152 539.12429 2.54410 2.97897 14.53363 1.35249 1.05589 0.75907 8 8 0 1.77 -2013-Sep-20 09:11:38 4171698.31009 872123.51650 4730019.21589 11.80803 48.17153 539.86076 1.94552 3.11359 15.27010 0.75391 1.19051 1.49554 8 8 0 1.77 -2013-Sep-20 09:11:38 4171698.69098 872123.15931 4730019.58334 11.80803 48.17153 540.33445 1.51794 3.13529 15.74380 0.32632 1.21222 1.96924 8 8 0 1.77 -2013-Sep-20 09:11:38 4171698.72521 872122.93230 4730019.69460 11.80802 48.17153 540.40872 1.28873 3.21914 15.81807 0.09711 1.29606 2.04351 8 8 0 1.77 -2013-Sep-20 09:11:38 4171698.66931 872122.71251 4730019.83349 11.80802 48.17153 540.44574 1.08503 3.38605 15.85508 -0.10658 1.46298 2.08052 8 8 0 1.77 -2013-Sep-20 09:11:38 4171699.00295 872122.78526 4730020.35876 11.80802 48.17153 541.06486 1.08797 3.48191 16.47420 -0.10364 1.55884 2.69964 8 8 0 1.77 -2013-Sep-20 09:11:38 4171700.11472 872122.80642 4730020.88670 11.80802 48.17152 542.18689 0.88117 3.01987 17.59624 -0.31044 1.09680 3.82167 8 8 0 1.77 -2013-Sep-20 09:11:38 4171699.80387 872122.80827 4730020.90225 11.80802 48.17153 541.99581 0.94660 3.25669 17.40515 -0.24502 1.33361 3.63059 8 8 0 1.77 -2013-Sep-20 09:11:39 4171699.70984 872122.81727 4730021.22894 11.80802 48.17153 542.17908 0.97465 3.54177 17.58843 -0.21697 1.61869 3.81387 8 8 0 1.77 -2013-Sep-20 09:11:39 4171699.82524 872122.89495 4730021.46017 11.80802 48.17153 542.43733 1.02707 3.59996 17.84667 -0.16454 1.67688 4.07211 8 8 0 1.77 -2013-Sep-20 09:11:39 4171700.08447 872122.55080 4730021.35202 11.80801 48.17153 542.47899 0.63716 3.39124 17.88833 -0.55446 1.46816 4.11377 8 8 0 1.77 -2013-Sep-20 09:11:39 4171700.84119 872122.18652 4730021.89322 11.80801 48.17153 543.32654 0.12574 3.25578 18.73588 -1.06588 1.33270 4.96132 8 8 0 1.77 -2013-Sep-20 09:11:39 4171701.05830 872122.04611 4730022.34280 11.80800 48.17153 543.78410 -0.05613 3.41866 19.19344 -1.24775 1.49558 5.41888 8 8 0 1.77 -2013-Sep-20 09:11:39 4171700.75315 872122.03694 4730022.10137 11.80801 48.17153 543.40375 -0.00266 3.48161 18.81310 -1.19428 1.55854 5.03853 8 8 0 1.77 -2013-Sep-20 09:11:39 4171700.56624 872121.96730 4730022.35195 11.80801 48.17153 543.45895 -0.03259 3.79568 18.86829 -1.22420 1.87260 5.09373 8 8 0 1.77 -2013-Sep-20 09:11:39 4171701.19361 872121.94916 4730022.99533 11.80800 48.17153 544.34543 -0.17872 3.76992 19.75477 -1.37034 1.84684 5.98021 8 8 0 1.77 -2013-Sep-20 09:11:39 4171700.96928 872121.74727 4730022.88855 11.80800 48.17153 544.09187 -0.33043 3.89311 19.50121 -1.52205 1.97003 5.72665 8 8 0 1.77 -2013-Sep-20 09:11:39 4171701.42617 872121.82050 4730022.90283 11.80800 48.17153 544.41076 -0.35225 3.55823 19.82010 -1.54387 1.63516 6.04554 8 8 0 1.77 -2013-Sep-20 09:11:39 4171701.53088 872121.64036 4730022.80282 11.80800 48.17153 544.38000 -0.55000 3.44263 19.78935 -1.74162 1.51955 6.01479 8 8 0 1.77 -2013-Sep-20 09:11:39 4171702.34254 872121.67101 4730022.76349 11.80800 48.17152 544.88472 -0.68609 2.81972 20.29407 -1.87771 0.89664 6.51950 8 8 0 1.77 -2013-Sep-20 09:11:39 4171702.28366 872121.18544 4730023.27272 11.80799 48.17153 545.15947 -1.14934 3.27631 20.56881 -2.34096 1.35323 6.79425 8 8 0 1.77 -2013-Sep-20 09:11:39 4171701.47633 872121.32373 4730022.14251 11.80799 48.17153 543.80916 -0.84877 3.09033 19.21850 -2.04039 1.16726 5.44394 8 8 0 1.77 -2013-Sep-20 09:11:39 4171700.83881 872121.33110 4730021.77560 11.80800 48.17153 543.12059 -0.71110 3.30951 18.52994 -1.90271 1.38643 4.75538 8 8 0 1.77 -2013-Sep-20 09:11:39 4171700.43604 872121.04586 4730021.69105 11.80799 48.17153 542.75574 -0.90788 3.59039 18.16509 -2.09949 1.66731 4.39053 8 8 0 1.77 -2013-Sep-20 09:11:39 4171700.98825 872120.91235 4730021.57206 11.80799 48.17153 543.00933 -1.15157 3.12862 18.41868 -2.34319 1.20554 4.64412 8 8 0 1.77 -2013-Sep-20 09:11:39 4171700.84387 872121.02627 4730021.07622 11.80799 48.17152 542.56116 -1.01051 2.88588 17.97050 -2.20212 0.96281 4.19594 8 8 0 1.77 -2013-Sep-20 09:11:39 4171701.81682 872121.15354 4730021.32315 11.80799 48.17152 543.39766 -1.08503 2.32151 18.80701 -2.27665 0.39843 5.03244 8 8 0 1.77 -2013-Sep-20 09:11:39 4171701.24723 872121.27623 4730020.62791 11.80799 48.17152 542.52452 -0.84838 2.25458 17.93387 -2.04000 0.33151 4.15930 8 8 0 1.77 -2013-Sep-20 09:11:39 4171701.65371 872121.36783 4730020.99764 11.80799 48.17152 543.07787 -0.84190 2.19072 18.48721 -2.03352 0.26764 4.71265 8 8 0 1.77 -2013-Sep-20 09:11:39 4171700.85918 872121.70263 4730020.19240 11.80800 48.17152 542.00488 -0.35160 2.18216 17.41422 -1.54322 0.25908 3.63966 8 8 0 1.77 -2013-Sep-20 09:11:39 4171700.56389 872121.70693 4730020.33065 11.80800 48.17152 541.91572 -0.28696 2.48907 17.32507 -1.47858 0.56600 3.55050 8 8 0 1.77 -2013-Sep-20 09:11:39 4171700.47592 872121.79982 4730019.85935 11.80800 48.17152 541.51979 -0.17803 2.22477 16.92913 -1.36965 0.30169 3.15457 8 8 0 1.77 -2013-Sep-20 09:11:39 4171701.35448 872121.62620 4730019.94851 11.80800 48.17151 542.13604 -0.52777 1.66990 17.54539 -1.71939 -0.25317 3.77082 8 8 0 1.77 -2013-Sep-20 09:11:40 4171701.03147 872121.56844 4730020.26469 11.80800 48.17152 542.15291 -0.51820 2.12517 17.56225 -1.70982 0.20209 3.78769 8 8 0 1.77 -2013-Sep-20 09:11:40 4171700.45478 872121.84957 4730019.54638 11.80800 48.17152 541.27957 -0.12501 2.02387 16.68891 -1.31663 0.10080 2.91435 8 8 0 1.77 -2013-Sep-20 09:11:40 4171699.17139 872121.87706 4730018.49289 11.80801 48.17152 539.66053 0.16452 2.25319 15.06988 -1.02710 0.33011 1.29531 8 8 0 1.77 -2013-Sep-20 09:11:40 4171697.92280 872122.10891 4730017.84977 11.80801 48.17152 538.39789 0.64697 2.69962 13.80723 -0.54465 0.77655 0.03267 8 8 0 1.77 -2013-Sep-20 09:11:40 4171697.14621 872122.20402 4730016.86091 11.80802 48.17152 537.16707 0.89897 2.59208 12.57642 -0.29264 0.66900 -1.19815 8 8 0 1.77 -2013-Sep-20 09:11:40 4171697.13207 872122.23190 4730016.85570 11.80802 48.17152 537.15776 0.92916 2.59467 12.56711 -0.26245 0.67159 -1.20746 8 8 0 1.77 -2013-Sep-20 09:11:40 4171697.40063 872122.34713 4730016.74587 11.80802 48.17152 537.26696 0.98700 2.30797 12.67631 -0.20461 0.38489 -1.09826 8 8 0 1.77 -2013-Sep-20 09:11:40 4171697.22457 872122.32399 4730016.24064 11.80802 48.17152 536.77241 1.00038 2.10297 12.18176 -0.19124 0.17989 -1.59281 8 8 0 1.77 -2013-Sep-20 09:11:40 4171698.06326 872122.22972 4730016.51706 11.80802 48.17151 537.51300 0.73648 1.68997 12.92235 -0.45514 -0.23311 -0.85222 8 8 0 1.77 -2013-Sep-20 09:11:40 4171697.48522 872122.40385 4730015.81532 11.80802 48.17151 536.63653 1.02521 1.61704 12.04588 -0.16641 -0.30604 -1.72869 8 8 0 1.77 -2013-Sep-20 09:11:40 4171697.33030 872122.67752 4730014.96153 11.80802 48.17151 535.93655 1.32479 1.11890 11.34590 0.13318 -0.80417 -2.42867 8 8 0 1.77 -2013-Sep-20 09:11:40 4171697.92837 872122.58276 4730016.00451 11.80802 48.17151 537.09120 1.10965 1.39270 12.50055 -0.08197 -0.53037 -1.27402 8 8 0 1.77 -2013-Sep-20 09:11:40 4171697.86454 872122.85176 4730015.72676 11.80802 48.17151 536.87928 1.38602 1.21301 12.28862 0.19440 -0.71007 -1.48594 8 8 0 1.77 -2013-Sep-20 09:11:40 4171698.36123 872122.55819 4730016.22885 11.80802 48.17151 537.53759 0.99702 1.23034 12.94693 -0.19459 -0.69274 -0.82763 8 8 0 1.77 -2013-Sep-20 09:11:40 4171698.45215 872122.84936 4730016.21352 11.80802 48.17151 537.62525 1.26343 1.10940 13.03460 0.07181 -0.81367 -0.73997 8 8 0 1.77 -2013-Sep-20 09:11:40 4171698.63720 872123.07349 4730016.28996 11.80803 48.17151 537.83359 1.44494 0.99124 13.24294 0.25333 -0.93184 -0.53163 8 8 0 1.77 -2013-Sep-20 09:11:40 4171698.94598 872123.06790 4730016.21553 11.80802 48.17150 537.97894 1.37628 0.71723 13.38828 0.18466 -1.20584 -0.38628 8 8 0 1.77 -2013-Sep-20 09:11:40 4171699.18545 872123.28182 4730016.61339 11.80803 48.17150 538.46092 1.53667 0.77529 13.87027 0.34506 -1.14779 0.09570 8 8 0 1.77 -2013-Sep-20 09:11:40 4171699.13623 872123.21815 4730016.21580 11.80803 48.17150 538.12384 1.48443 0.55574 13.53318 0.29281 -1.36733 -0.24138 8 8 0 1.77 -2013-Sep-20 09:11:40 4171699.18814 872123.46754 4730016.66122 11.80803 48.17150 538.52366 1.71792 0.77690 13.93301 0.52630 -1.14617 0.15844 8 8 0 1.77 -2013-Sep-20 09:11:40 4171699.92052 872123.45256 4730017.32933 11.80803 48.17150 539.49755 1.55339 0.69057 14.90689 0.36177 -1.23250 1.13233 8 8 0 1.77 -2013-Sep-20 09:11:40 4171700.45994 872123.61056 4730017.19824 11.80803 48.17150 539.77355 1.59765 0.18562 15.18290 0.40604 -1.73746 1.40834 8 8 0 1.77 -2013-Sep-20 09:11:40 4171700.16570 872123.75511 4730016.66704 11.80803 48.17150 539.20538 1.79936 0.02393 14.61473 0.60775 -1.89915 0.84016 8 8 0 1.77 -2013-Sep-20 09:11:40 4171700.52505 872123.76365 4730016.45094 11.80803 48.17149 539.28010 1.73419 -0.38360 14.68945 0.54257 -2.30667 0.91488 8 8 0 1.77 -2013-Sep-20 09:11:40 4171700.59958 872123.87449 4730016.61073 11.80803 48.17149 539.46295 1.82742 -0.34829 14.87229 0.63581 -2.27137 1.09773 8 8 0 1.77 -2013-Sep-20 09:11:41 4171700.03977 872123.41506 4730016.06913 11.80803 48.17150 538.63125 1.49228 -0.23112 14.04059 0.30066 -2.15419 0.26603 8 8 0 1.77 -2013-Sep-20 09:11:41 4171700.78730 872123.52751 4730016.16879 11.80803 48.17149 539.20883 1.44938 -0.72703 14.61818 0.25776 -2.65011 0.84361 8 8 0 1.77 -2013-Sep-20 09:11:41 4171701.15722 872123.53886 4730015.89908 11.80802 48.17149 539.25089 1.38479 -1.17844 14.66023 0.19317 -3.10152 0.88567 8 8 0 1.77 -2013-Sep-20 09:11:41 4171701.28142 872123.70878 4730016.07576 11.80803 48.17149 539.48680 1.52570 -1.17712 14.89615 0.33408 -3.10019 1.12158 8 8 0 1.77 -2013-Sep-20 09:11:41 4171701.25351 872123.61063 4730016.14594 11.80802 48.17149 539.50748 1.43533 -1.09499 14.91682 0.24372 -3.01806 1.14226 8 8 0 1.77 -2013-Sep-20 09:11:41 4171701.62854 872123.76804 4730015.83873 11.80803 48.17148 539.54487 1.51267 -1.59741 14.95422 0.32106 -3.52048 1.17965 8 8 0 1.77 -2013-Sep-20 09:11:41 4171702.32314 872123.47508 4730016.69252 11.80802 48.17148 540.59451 1.08378 -1.48997 16.00386 -0.10784 -3.41305 2.22929 8 8 0 1.77 -2013-Sep-20 09:11:41 4171701.64336 872123.25849 4730016.32060 11.80802 48.17149 539.84406 1.01088 -1.20916 15.25341 -0.18074 -3.13224 1.47884 8 8 0 1.77 -2013-Sep-20 09:11:41 4171701.58960 872123.25338 4730016.73460 11.80802 48.17149 540.11676 1.01687 -0.89307 15.52611 -0.17474 -2.81614 1.75154 8 8 0 1.77 -2013-Sep-20 09:11:41 4171701.89835 872123.10856 4730016.94835 11.80802 48.17149 540.45783 0.81194 -0.95363 15.86717 -0.37968 -2.87671 2.09261 8 8 0 1.77 -2013-Sep-20 09:11:41 4171701.05306 872123.13763 4730016.73245 11.80802 48.17149 539.74912 1.01336 -0.48552 15.15846 -0.17826 -2.40859 1.38390 8 8 0 1.77 -2013-Sep-20 09:11:41 4171701.24597 872123.32675 4730017.45947 11.80802 48.17150 540.44259 1.15900 -0.17020 15.85194 -0.03262 -2.09328 2.07737 8 8 0 1.77 -2013-Sep-20 09:11:41 4171701.42575 872123.33472 4730017.53661 11.80802 48.17150 540.61851 1.13002 -0.25110 16.02786 -0.06160 -2.17418 2.25329 8 8 0 1.77 -2013-Sep-20 09:11:41 4171701.23715 872123.28572 4730017.21918 11.80802 48.17149 540.25219 1.12065 -0.31776 15.66153 -0.07097 -2.24084 1.88697 8 8 0 1.77 -2013-Sep-20 09:11:41 4171700.90322 872122.88576 4730017.09056 11.80802 48.17150 539.88377 0.79749 -0.09900 15.29312 -0.39413 -2.02207 1.51855 8 8 0 1.77 -2013-Sep-20 09:11:41 4171700.84970 872122.84441 4730017.12197 11.80802 48.17150 539.86660 0.76796 -0.03271 15.27595 -0.42366 -1.95578 1.50138 8 8 0 1.77 -2013-Sep-20 09:11:41 4171700.57522 872122.55720 4730017.15672 11.80801 48.17150 539.67412 0.54299 0.23446 15.08346 -0.64862 -1.68862 1.30890 8 8 0 1.77 -2013-Sep-20 09:11:41 4171700.39594 872122.45672 4730017.03241 11.80801 48.17150 539.45074 0.48133 0.29764 14.86008 -0.71029 -1.62543 1.08552 8 8 0 1.77 -2013-Sep-20 09:11:41 4171700.80498 872122.29960 4730017.06307 11.80801 48.17150 539.71916 0.24383 0.04370 15.12851 -0.94779 -1.87937 1.35394 8 8 0 1.77 -2013-Sep-20 09:11:41 4171699.89102 872122.15259 4730016.48617 11.80801 48.17150 538.67260 0.28696 0.34800 14.08195 -0.90466 -1.57507 0.30739 8 8 0 1.77 -2013-Sep-20 09:11:41 4171699.47421 872122.10703 4730016.29735 11.80801 48.17150 538.25360 0.32766 0.53304 13.66294 -0.86396 -1.39004 -0.11162 8 8 0 1.77 -2013-Sep-20 09:11:41 4171699.66850 872122.11360 4730016.59772 11.80801 48.17150 538.60515 0.29433 0.59064 14.01449 -0.89729 -1.33244 0.23993 8 8 0 1.77 -2013-Sep-20 09:11:41 4171699.84307 872122.07987 4730016.22762 11.80801 48.17150 538.43872 0.22559 0.22164 13.84807 -0.96602 -1.70144 0.07350 8 8 0 1.77 -2013-Sep-20 09:11:41 4171699.30994 872121.99757 4730016.22422 11.80801 48.17150 538.07694 0.25413 0.62077 13.48628 -0.93749 -1.30230 -0.28828 8 8 0 1.77 -2013-Sep-20 09:11:41 4171699.01634 872121.81703 4730016.78096 11.80801 48.17151 538.27549 0.13749 1.23373 13.68483 -1.05413 -0.68934 -0.08973 8 8 0 1.77 -2013-Sep-20 09:11:42 4171698.67867 872121.85800 4730016.70871 11.80801 48.17151 538.00681 0.24669 1.42559 13.41616 -0.94493 -0.49748 -0.35841 8 8 0 1.77 -2013-Sep-20 09:11:42 4171697.93864 872121.93373 4730016.51253 11.80801 48.17151 537.38789 0.47225 1.82297 12.79723 -0.71937 -0.10010 -0.97733 8 8 0 1.77 -2013-Sep-20 09:11:42 4171698.65654 872121.82911 4730016.87767 11.80801 48.17151 538.11433 0.22294 1.55882 13.52367 -0.96867 -0.36425 -0.25089 8 8 0 1.77 -2013-Sep-20 09:11:42 4171698.25166 872121.75893 4730016.31071 11.80801 48.17151 537.41798 0.23710 1.48672 12.82732 -0.95452 -0.43635 -0.94724 8 8 0 1.77 -2013-Sep-20 09:11:42 4171698.08372 872121.74390 4730016.11703 11.80801 48.17151 537.16198 0.25675 1.48234 12.57132 -0.93487 -0.44073 -1.20324 8 8 0 1.77 -2013-Sep-20 09:11:42 4171698.19400 872121.69853 4730015.64966 11.80801 48.17151 536.87952 0.18977 1.09714 12.28886 -1.00184 -0.82594 -1.48570 8 8 0 1.77 -2013-Sep-20 09:11:42 4171697.44883 872121.90197 4730014.68147 11.80801 48.17151 535.69940 0.54139 0.96393 11.10875 -0.65022 -0.95914 -2.66582 8 8 0 1.77 -2013-Sep-20 09:11:42 4171697.60936 872121.97606 4730014.99269 11.80801 48.17151 536.04621 0.58106 1.04311 11.45555 -0.61055 -0.87997 -2.31901 8 8 0 1.77 -2013-Sep-20 09:11:42 4171697.30997 872121.94969 4730014.80540 11.80801 48.17151 535.70761 0.61652 1.14059 11.11696 -0.57510 -0.78248 -2.65760 8 8 0 1.77 -2013-Sep-20 09:11:42 4171696.67498 872122.30815 4730014.21412 11.80802 48.17151 534.90143 1.09734 1.15475 10.31078 -0.09428 -0.76832 -3.46379 8 8 0 1.77 -2013-Sep-20 09:11:42 4171696.14737 872122.25976 4730013.48930 11.80802 48.17151 534.01031 1.15793 1.06357 9.41965 -0.03369 -0.85951 -4.35491 8 8 0 1.77 -2013-Sep-20 09:11:42 4171695.58820 872122.25426 4730013.30308 11.80802 48.17151 533.50578 1.26698 1.34806 8.91513 0.07536 -0.57501 -4.85944 8 8 0 1.77 -2013-Sep-20 09:11:42 4171695.46016 872122.52534 4730013.66225 11.80803 48.17151 533.72681 1.55852 1.63965 9.13616 0.36690 -0.28343 -4.63840 8 8 0 1.77 -2013-Sep-20 09:11:42 4171695.53818 872122.49507 4730013.68190 11.80803 48.17151 533.78826 1.51292 1.60046 9.19761 0.32131 -0.32261 -4.57696 8 8 0 1.77 -2013-Sep-20 09:11:42 4171695.59275 872122.49625 4730014.22604 11.80803 48.17151 534.22952 1.50292 1.92337 9.63886 0.31130 0.00029 -4.13570 8 8 0 1.77 -2013-Sep-20 09:11:42 4171695.10915 872122.43456 4730014.12230 11.80803 48.17152 533.82810 1.54149 2.21632 9.23745 0.34988 0.29325 -4.53712 8 8 0 1.77 -2013-Sep-20 09:11:42 4171694.77850 872122.56472 4730013.90581 11.80803 48.17152 533.46870 1.73656 2.29326 8.87805 0.54494 0.37019 -4.89652 8 8 0 1.77 -2013-Sep-20 09:11:42 4171695.47456 872122.64284 4730014.93579 11.80803 48.17152 534.70123 1.67058 2.46055 10.11057 0.47897 0.53748 -3.66399 8 8 0 1.77 -2013-Sep-20 09:11:42 4171694.86781 872122.86137 4730014.62148 11.80803 48.17152 534.10077 2.00866 2.66017 9.51011 0.81704 0.73710 -4.26445 8 8 0 1.77 -2013-Sep-20 09:11:42 4171695.25746 872122.98096 4730015.01290 11.80803 48.17152 534.66311 2.04598 2.61878 10.07245 0.85436 0.69570 -3.70211 8 8 0 1.77 -2013-Sep-20 09:11:42 4171696.01647 872122.67914 4730015.99900 11.80803 48.17152 535.85218 1.59522 2.76882 11.26152 0.40361 0.84574 -2.51304 8 8 0 1.77 -2013-Sep-20 09:11:42 4171696.45623 872122.47580 4730015.98330 11.80802 48.17152 536.09980 1.30620 2.46861 11.50915 0.11458 0.54554 -2.26542 8 8 0 1.77 -2013-Sep-20 09:11:42 4171696.67520 872122.25393 4730015.74760 11.80802 48.17152 536.03684 1.04421 2.18554 11.44618 -0.14740 0.26247 -2.32838 8 8 0 1.77 -2013-Sep-20 09:11:42 4171696.35253 872122.63876 4730015.55226 11.80803 48.17152 535.73316 1.48693 2.23194 11.14251 0.29532 0.30886 -2.63206 8 8 0 1.77 -2013-Sep-20 09:11:42 4171696.71857 872123.03119 4730015.30768 11.80803 48.17151 535.84342 1.79615 1.74201 11.25277 0.60453 -0.18107 -2.52180 8 8 0 1.77 -2013-Sep-20 09:11:43 4171696.97698 872122.77646 4730015.99104 11.80803 48.17152 536.48654 1.49393 2.04810 11.89589 0.30231 0.12503 -1.87868 8 8 0 1.77 -2013-Sep-20 09:11:43 4171696.76492 872122.85934 4730015.55238 11.80803 48.17151 536.03255 1.61845 1.89759 11.44190 0.42684 -0.02548 -2.33267 8 8 0 1.77 -2013-Sep-20 09:11:43 4171696.84952 872123.24895 4730015.54934 11.80803 48.17151 536.13869 1.98251 1.77446 11.54803 0.79089 -0.14862 -2.22653 8 8 0 1.77 -2013-Sep-20 09:11:43 4171696.47072 872123.17954 4730015.01982 11.80803 48.17151 535.48737 1.99208 1.70819 10.89671 0.80047 -0.21489 -2.87785 8 8 0 1.77 -2013-Sep-20 09:11:43 4171697.03787 872123.03775 4730015.53349 11.80803 48.17151 536.22101 1.73724 1.65871 11.63035 0.54562 -0.26437 -2.14421 8 8 0 1.77 -2013-Sep-20 09:11:43 4171697.07897 872122.98161 4730015.23720 11.80803 48.17151 536.01940 1.67387 1.43969 11.42875 0.48226 -0.48338 -2.34582 8 8 0 1.77 -2013-Sep-20 09:11:43 4171696.47623 872123.03652 4730015.33817 11.80803 48.17152 535.70866 1.85096 1.93829 11.11801 0.65934 0.01521 -2.65656 8 8 0 1.77 -2013-Sep-20 09:11:43 4171696.14654 872123.00641 4730015.18816 11.80803 48.17152 535.37756 1.88895 2.08330 10.78691 0.69734 0.16022 -2.98766 8 8 0 1.77 -2013-Sep-20 09:11:43 4171696.39420 872123.38656 4730015.14689 11.80804 48.17151 535.56036 2.21038 1.81717 10.96970 1.01877 -0.10590 -2.80486 8 8 0 1.77 -2013-Sep-20 09:11:43 4171696.61796 872123.54419 4730015.24727 11.80804 48.17151 535.80273 2.31889 1.69688 11.21207 1.12727 -0.22620 -2.56249 8 8 0 1.77 -2013-Sep-20 09:11:43 4171696.02291 872123.50783 4730014.90679 11.80804 48.17151 535.15562 2.40507 1.90937 10.56497 1.21345 -0.01370 -3.20960 8 8 0 1.77 -2013-Sep-20 09:11:43 4171696.04014 872123.78410 4730014.70349 11.80804 48.17151 535.05308 2.67196 1.71909 10.46243 1.48035 -0.20399 -3.31213 8 8 0 1.77 -2013-Sep-20 09:11:43 4171695.70521 872123.71814 4730014.36057 11.80804 48.17151 534.56992 2.67593 1.74475 9.97926 1.48432 -0.17833 -3.79530 8 8 0 1.77 -2013-Sep-20 09:11:43 4171696.43152 872123.86969 4730015.06849 11.80804 48.17151 535.59223 2.67565 1.66399 11.00158 1.48403 -0.25908 -2.77299 8 8 0 1.77 -2013-Sep-20 09:11:43 4171696.31613 872123.79782 4730014.34803 11.80804 48.17151 534.97025 2.62892 1.27864 10.37959 1.43730 -0.64443 -3.39497 8 8 0 1.77 -2013-Sep-20 09:11:43 4171696.50031 872123.68029 4730014.81575 11.80804 48.17151 535.42296 2.47618 1.47415 10.83230 1.28456 -0.44892 -2.94226 8 8 0 1.77 -2013-Sep-20 09:11:43 4171696.49082 872123.61267 4730014.66764 11.80804 48.17151 535.29718 2.41194 1.39261 10.70653 1.22032 -0.53046 -3.06804 8 8 0 1.77 -2013-Sep-20 09:11:43 4171696.80851 872123.90828 4730015.06081 11.80804 48.17151 535.83787 2.63628 1.37803 11.24722 1.44467 -0.54505 -2.52735 8 8 0 1.77 -2013-Sep-20 09:11:43 4171696.68423 872124.27510 4730015.10958 11.80805 48.17151 535.84314 3.02076 1.44526 11.25249 1.82915 -0.47781 -2.52207 8 8 0 1.77 -2013-Sep-20 09:11:43 4171696.19785 872124.03702 4730014.73344 11.80804 48.17151 535.21287 2.88726 1.58548 10.62221 1.69564 -0.33760 -3.15235 8 8 0 1.77 -2013-Sep-20 09:11:43 4171695.80435 872124.33822 4730014.77271 11.80805 48.17151 535.02636 3.26260 1.85274 10.43571 2.07099 -0.07033 -3.33886 8 8 0 1.77 -2013-Sep-20 09:11:43 4171695.51952 872124.29262 4730014.48981 11.80805 48.17151 534.62341 3.27625 1.87878 10.03275 2.08464 -0.04430 -3.74181 8 8 0 1.77 -2013-Sep-20 09:11:43 4171695.94955 872124.34511 4730015.05820 11.80805 48.17152 535.33482 3.23964 1.93618 10.74416 2.04802 0.01310 -3.03040 8 8 0 1.77 -2013-Sep-20 09:11:43 4171695.70147 872124.15836 4730014.66480 11.80805 48.17151 534.85425 3.10760 1.88324 10.26360 1.91598 -0.03984 -3.51097 8 8 0 1.77 -2013-Sep-20 09:11:43 4171695.55169 872123.99272 4730014.04912 11.80805 48.17151 534.27510 2.97612 1.60715 9.68445 1.78450 -0.31593 -4.09012 8 8 0 1.77 -2013-Sep-20 09:11:44 4171695.33438 872123.95169 4730014.32146 11.80805 48.17152 534.33058 2.98043 1.95353 9.73992 1.78881 0.03045 -4.03464 8 8 0 1.77 -2013-Sep-20 09:11:44 4171695.74072 872123.80592 4730014.69438 11.80804 48.17152 534.85382 2.75459 1.92808 10.26317 1.56297 0.00501 -3.51140 8 8 0 1.77 -2013-Sep-20 09:11:44 4171695.29452 872123.79905 4730014.35097 11.80804 48.17152 534.30571 2.83918 2.02556 9.71505 1.64756 0.10248 -4.05951 8 8 0 1.77 -2013-Sep-20 09:11:44 4171695.54611 872123.99294 4730014.27107 11.80805 48.17151 534.43687 2.97748 1.75920 9.84622 1.78586 -0.16387 -3.92834 8 8 0 1.77 -2013-Sep-20 09:11:44 4171695.96067 872124.12538 4730014.37722 11.80805 48.17151 534.80466 3.02229 1.50743 10.21401 1.83067 -0.41564 -3.56056 8 8 0 1.77 -2013-Sep-20 09:11:44 4171695.28197 872124.16881 4730013.77999 11.80805 48.17151 533.92252 3.20368 1.59754 9.33186 2.01206 -0.32554 -4.44270 8 8 0 1.77 -2013-Sep-20 09:11:44 4171695.25290 872124.19400 4730013.19159 11.80805 48.17151 533.46854 3.23428 1.22250 8.87788 2.04266 -0.70057 -4.89668 8 8 0 1.77 -2013-Sep-20 09:11:44 4171695.24055 872123.97978 4730013.54071 11.80805 48.17151 533.69138 3.02712 1.49699 9.10073 1.83550 -0.42608 -4.67383 8 8 0 1.77 -2013-Sep-20 09:11:44 4171695.74913 872123.62641 4730014.70238 11.80804 48.17152 534.84077 2.57715 1.95466 10.25012 1.38554 0.03158 -3.52445 8 8 0 1.77 -2013-Sep-20 09:11:44 4171696.64552 872123.35533 4730015.13090 11.80803 48.17151 535.70824 2.12838 1.62797 11.11758 0.93676 -0.29511 -2.65698 8 8 0 1.77 -2013-Sep-20 09:11:44 4171696.89713 872123.09716 4730014.54717 11.80803 48.17151 535.40229 1.82418 1.09452 10.81164 0.63257 -0.82855 -2.96292 8 8 0 1.77 -2013-Sep-20 09:11:44 4171696.80211 872122.99782 4730014.37511 11.80803 48.17151 535.19849 1.74639 1.06423 10.60784 0.55477 -0.85885 -3.16672 8 8 0 1.77 -2013-Sep-20 09:11:44 4171697.00485 872122.87860 4730014.09844 11.80803 48.17150 535.10841 1.58821 0.75002 10.51776 0.39660 -1.17305 -3.25680 8 8 0 1.77 -2013-Sep-20 09:11:44 4171697.08717 872122.87208 4730013.87906 11.80803 48.17150 534.99779 1.56498 0.54467 10.40714 0.37336 -1.37841 -3.36742 8 8 0 1.77 -2013-Sep-20 09:11:44 4171698.47976 872122.72102 4730014.79958 11.80802 48.17150 536.57216 1.13215 0.16588 11.98151 -0.05947 -1.75720 -1.79305 8 8 0 1.77 -2013-Sep-20 09:11:44 4171698.43171 872122.56928 4730014.74034 11.80802 48.17150 536.47595 0.99345 0.18455 11.88530 -0.19817 -1.73852 -1.88927 8 8 0 1.77 -2013-Sep-20 09:11:44 4171699.10059 872122.19448 4730015.49516 11.80801 48.17150 537.42389 0.48972 0.25723 12.83324 -0.70190 -1.66584 -0.94133 8 8 0 1.77 -2013-Sep-20 09:11:44 4171698.68942 872122.44197 4730014.83165 11.80802 48.17150 536.69485 0.81610 0.07689 12.10419 -0.37551 -1.84618 -1.67037 8 8 0 1.77 -2013-Sep-20 09:11:44 4171698.48407 872122.73722 4730014.64980 11.80802 48.17150 536.46559 1.14712 0.06038 11.87493 -0.04449 -1.86270 -1.89963 8 8 0 1.77 -2013-Sep-20 09:11:44 4171698.56808 872122.70679 4730014.58921 11.80802 48.17150 536.47112 1.10015 -0.03667 11.88047 -0.09147 -1.95975 -1.89410 8 8 0 1.77 -2013-Sep-20 09:11:44 4171698.33519 872122.54320 4730014.29899 11.80802 48.17150 536.08052 0.98768 -0.03541 11.48986 -0.20394 -1.95849 -2.28470 8 8 0 1.77 -2013-Sep-20 09:11:44 4171698.06374 872122.36906 4730014.63007 11.80802 48.17150 536.12626 0.87276 0.40993 11.53560 -0.31885 -1.51314 -2.23896 8 8 0 1.77 -2013-Sep-20 09:11:44 4171697.35527 872122.20393 4730014.00595 11.80802 48.17150 535.17618 0.85611 0.53563 10.58552 -0.33551 -1.38745 -3.18904 8 8 0 1.77 -2013-Sep-20 09:11:44 4171696.96537 872122.23825 4730013.39245 11.80802 48.17150 534.46919 0.96950 0.40563 9.87853 -0.22212 -1.51744 -3.89603 8 8 0 1.77 -2013-Sep-20 09:11:44 4171697.14564 872122.31418 4730013.87948 11.80802 48.17150 534.96014 1.00693 0.58737 10.36949 -0.18469 -1.33571 -3.40508 8 8 0 1.77 -2013-Sep-20 09:11:45 4171697.20998 872122.45729 4730014.24081 11.80802 48.17150 535.29091 1.13384 0.75959 10.70025 -0.05777 -1.16348 -3.07431 8 8 0 1.77 -2013-Sep-20 09:11:45 4171697.55810 872122.46251 4730014.32625 11.80802 48.17150 535.58254 1.06772 0.56186 10.99189 -0.12390 -1.36122 -2.78268 8 8 0 1.77 -2013-Sep-20 09:11:45 4171698.02675 872122.31732 4730014.72367 11.80802 48.17150 536.16479 0.82969 0.50723 11.57414 -0.36192 -1.41585 -2.20042 8 8 0 1.77 -2013-Sep-20 09:11:45 4171697.85735 872122.22972 4730014.88644 11.80802 48.17150 536.16354 0.77861 0.75269 11.57289 -0.41301 -1.17038 -2.20168 8 8 0 1.77 -2013-Sep-20 09:11:45 4171698.19975 872122.30750 4730015.69228 11.80802 48.17151 536.99814 0.78468 1.02850 12.40748 -0.40694 -0.89457 -1.36708 8 8 0 1.77 -2013-Sep-20 09:11:45 4171698.11828 872122.01721 4730016.26904 11.80801 48.17151 537.33511 0.51720 1.51684 12.74445 -0.67441 -0.40624 -1.03011 8 8 0 1.77 -2013-Sep-20 09:11:45 4171698.36364 872122.02906 4730016.60572 11.80801 48.17151 537.74777 0.47859 1.56060 13.15712 -0.71302 -0.36247 -0.61745 8 8 0 1.77 -2013-Sep-20 09:11:45 4171697.97003 872122.03509 4730016.96931 11.80801 48.17152 537.76258 0.56504 2.08925 13.17192 -0.62657 0.16618 -0.60264 8 8 0 1.77 -2013-Sep-20 09:11:45 4171698.11150 872121.74281 4730017.74519 11.80801 48.17152 538.39318 0.25000 2.54807 13.80252 -0.94162 0.62500 0.02796 8 8 0 1.77 -2013-Sep-20 09:11:45 4171698.51446 872121.53447 4730018.09510 11.80801 48.17152 538.88852 -0.03639 2.51929 14.29787 -1.22801 0.59621 0.52330 8 8 0 1.77 -2013-Sep-20 09:11:45 4171699.49571 872121.44185 4730018.38053 11.80800 48.17152 539.72913 -0.32785 2.00806 15.13847 -1.51946 0.08498 1.36391 8 8 0 1.77 -2013-Sep-20 09:11:45 4171700.30319 872121.34912 4730019.28864 11.80800 48.17152 540.92026 -0.58386 2.03887 16.32961 -1.77547 0.11579 2.55505 8 8 0 1.77 -2013-Sep-20 09:11:45 4171700.18771 872121.38148 4730019.42828 11.80800 48.17152 540.95334 -0.52854 2.21129 16.36269 -1.72016 0.28821 2.58812 8 8 0 1.77 -2013-Sep-20 09:11:45 4171700.31261 872121.53254 4730019.50423 11.80800 48.17152 541.11208 -0.40624 2.14781 16.52142 -1.59786 0.22473 2.74686 8 8 0 1.77 -2013-Sep-20 09:11:45 4171700.89777 872121.61524 4730019.60038 11.80800 48.17151 541.57700 -0.44503 1.77252 16.98635 -1.63665 -0.15056 3.21178 8 8 0 1.77 -2013-Sep-20 09:11:45 4171701.43846 872121.50501 4730019.69455 11.80800 48.17151 541.98509 -0.66358 1.45776 17.39444 -1.85520 -0.46532 3.61987 8 8 0 1.77 -2013-Sep-20 09:11:45 4171701.49240 872121.42833 4730019.58022 11.80800 48.17151 541.92464 -0.74968 1.35386 17.33399 -1.94129 -0.56922 3.55943 8 8 0 1.77 -2013-Sep-20 09:11:45 4171701.07004 872121.33254 4730019.00074 11.80800 48.17151 541.20407 -0.75701 1.29007 16.61341 -1.94863 -0.63300 2.83885 8 8 0 1.77 -2013-Sep-20 09:11:45 4171700.97352 872121.32348 4730019.12476 11.80800 48.17151 541.23223 -0.74613 1.44457 16.64157 -1.93774 -0.47851 2.86701 8 8 0 1.77 -2013-Sep-20 09:11:45 4171700.89373 872121.23329 4730018.86608 11.80799 48.17151 540.97509 -0.81807 1.34399 16.38444 -2.00969 -0.57908 2.60987 8 8 0 1.77 -2013-Sep-20 09:11:45 4171701.37283 872121.32846 4730019.41306 11.80799 48.17151 541.70840 -0.82296 1.34482 17.11775 -2.01458 -0.57826 3.34319 8 8 0 1.77 -2013-Sep-20 09:11:45 4171701.83106 872120.93870 4730020.08757 11.80799 48.17151 542.45695 -1.29824 1.51987 17.86629 -2.48986 -0.40321 4.09173 8 8 0 1.77 -2013-Sep-20 09:11:45 4171700.94903 872120.81950 4730019.50724 11.80799 48.17151 541.43247 -1.23442 1.79435 16.84181 -2.42604 -0.12873 3.06725 8 8 0 1.77 -2013-Sep-20 09:11:45 4171700.77325 872120.83683 4730019.85572 11.80799 48.17152 541.57976 -1.18149 2.15232 16.98910 -2.37311 0.22925 3.21454 8 8 0 1.77 -2013-Sep-20 09:11:45 4171700.20884 872121.00436 4730018.81691 11.80799 48.17151 540.46011 -0.90200 1.84566 15.86946 -2.09362 -0.07742 2.09489 8 8 0 1.77 -2013-Sep-20 09:11:46 4171699.72112 872121.43452 4730018.67812 11.80800 48.17152 540.09702 -0.38115 2.04324 15.50636 -1.57277 0.12016 1.73180 8 8 0 1.77 diff --git a/src/utils/gnuplot/8_GPS.plt b/src/utils/gnuplot/8_GPS.plt deleted file mode 100644 index 7ff4e6bd5..000000000 --- a/src/utils/gnuplot/8_GPS.plt +++ /dev/null @@ -1,40 +0,0 @@ -#set terminal pdf color font "Bold,14" -#set output "IFEN_accuracy.pdf" - -set terminal jpeg font "Helvetica, 14" -set output "8_GPS_accuracy_precision.jpeg" - -set grid -set xrange [-8:8] -set yrange [-8:8] -set ylabel "North [m]" -set xlabel "East [m]" - -set key Left left -set title "IFEN simulated data, 8 GPS - Accuracy and Precision" -file1="8_GPS_GNSS_SDR_solutions.txt" -#file2="8_GAL_GNSS_SDR_solutions.txt" -#file3="8_GPS_GNSS_SDR_solutions.txt" - -#values to copy from statistic file -DRMS= 2.034509899 -DUE_DRMS= 4.069019799 -CEP= 1.678044871 - -#difference with respect to the reference position -#values to copy from statistic file -delta_E=-0.560 #gps -delta_N=1.323 #gps - -set parametric -#dummy variable is t for curves, u/v for surfaces -set size square -set angle degree -set trange [0:360] -#radius_6_GPS=6 - -plot file1 u 9:10 with points pointsize 0.3 lc rgb "red" notitle,\ -DRMS*sin(t)+delta_E,DRMS*cos(t)+delta_N lw 3 lc rgb "black" title "DRMS",\ -DUE_DRMS*sin(t)+delta_E,DUE_DRMS*cos(t)+delta_N lw 2 lc rgb "gray" title "2DRMS",\ -CEP*sin(t)+delta_E,CEP*cos(t)+delta_N lw 1 lc rgb "black" title "CEP" - diff --git a/src/utils/gnuplot/8_GPS_GNSS_SDR_solutions.txt b/src/utils/gnuplot/8_GPS_GNSS_SDR_solutions.txt deleted file mode 100644 index 78744a067..000000000 --- a/src/utils/gnuplot/8_GPS_GNSS_SDR_solutions.txt +++ /dev/null @@ -1,1001 +0,0 @@ - time X [m] Y [m] Z [m] Long [deg] Lat [deg] h [m] E(Acc) [m] N(Acc) [m] Up(Acc) [m] E(Pre) [m] N(Pre) [m] Up(Pre) [m] Tot Sat Gal GPS GDOP -1999-Aug-27 09:09:17 4171696.06632 872121.00018 4730014.78492 11.80800 48.17152 534.75093 -0.05841 2.17880 10.16027 0.50199 0.85511 -0.63258 8 0 8 2.00 -1999-Aug-27 09:09:17 4171695.88605 872119.68584 4730014.82036 11.80799 48.17152 534.48029 -1.30804 2.53433 9.88964 -0.74764 1.21065 -0.90322 8 0 8 2.00 -1999-Aug-27 09:09:18 4171696.40670 872119.79288 4730014.34609 11.80799 48.17151 534.48137 -1.30981 1.82197 9.89072 -0.74941 0.49829 -0.90214 8 0 8 2.00 -1999-Aug-27 09:09:18 4171698.20885 872120.51947 4730014.34802 11.80799 48.17150 535.75840 -0.96738 0.39802 11.16774 -0.40698 -0.92567 0.37488 8 0 8 2.00 -1999-Aug-27 09:09:18 4171702.27793 872120.49428 4730015.18457 11.80798 48.17148 539.03457 -1.82470 -2.00813 14.44391 -1.26430 -3.33182 3.65105 8 0 8 2.00 -1999-Aug-27 09:09:18 4171699.74782 872120.39698 4730014.70421 11.80799 48.17149 537.01172 -1.40220 -0.46825 12.42107 -0.84180 -1.79194 1.62821 8 0 8 2.00 -1999-Aug-27 09:09:18 4171699.15761 872121.32123 4730014.44286 11.80800 48.17149 536.55782 -0.37673 -0.35299 11.96717 0.18367 -1.67667 1.17431 8 0 8 2.00 -1999-Aug-27 09:09:18 4171695.94636 872120.49857 4730012.84683 11.80800 48.17151 533.16001 -0.52485 1.05026 8.56935 0.03555 -0.27343 -2.22350 8 0 8 2.00 -1999-Aug-27 09:09:18 4171695.25129 872119.76318 4730014.45124 11.80799 48.17152 533.80143 -1.10245 2.73935 9.21077 -0.54205 1.41567 -1.58208 8 0 8 2.00 -1999-Aug-27 09:09:18 4171695.16469 872121.05173 4730014.78341 11.80801 48.17152 534.16826 0.17655 2.82756 9.57760 0.73695 1.50387 -1.21525 8 0 8 2.00 -1999-Aug-27 09:09:18 4171696.64867 872121.19256 4730016.40527 11.80801 48.17152 536.36473 0.01073 2.80533 11.77407 0.57113 1.48165 0.98122 8 0 8 2.00 -1999-Aug-27 09:09:18 4171692.76552 872120.73763 4730014.38277 11.80801 48.17154 532.26070 0.36005 4.35816 7.67005 0.92045 3.03448 -3.12281 8 0 8 2.00 -1999-Aug-27 09:09:18 4171695.49138 872121.53628 4730018.18595 11.80801 48.17154 536.98304 0.58400 4.78456 12.39238 1.14439 3.46088 1.59952 8 0 8 2.00 -1999-Aug-27 09:09:18 4171696.93316 872121.12598 4730017.43636 11.80800 48.17153 537.30967 -0.11265 3.29562 12.71901 0.44775 1.97193 1.92616 8 0 8 2.00 -1999-Aug-27 09:09:18 4171697.35095 872121.67098 4730018.84384 11.80801 48.17153 538.70555 0.33532 3.84645 14.11490 0.89572 2.52276 3.32204 8 0 8 2.00 -1999-Aug-27 09:09:18 4171698.89293 872121.22674 4730019.31976 11.80800 48.17153 540.00615 -0.41506 3.10689 15.41549 0.14534 1.78320 4.62263 8 0 8 2.00 -1999-Aug-27 09:09:18 4171699.15121 872121.54749 4730016.54754 11.80800 48.17151 538.15281 -0.15395 1.02080 13.56216 0.40645 -0.30289 2.76930 8 0 8 2.00 -1999-Aug-27 09:09:18 4171694.90892 872119.71605 4730013.67957 11.80799 48.17152 532.99650 -1.07852 2.48162 8.40584 -0.51812 1.15794 -2.38701 8 0 8 2.00 -1999-Aug-27 09:09:18 4171692.41588 872119.13610 4730013.11721 11.80799 48.17153 530.87088 -1.13603 4.01338 6.28022 -0.57564 2.68970 -4.51264 8 0 8 2.00 -1999-Aug-27 09:09:18 4171699.63356 872120.55401 4730014.57715 11.80799 48.17149 536.86388 -1.22511 -0.49359 12.27323 -0.66471 -1.81728 1.48037 8 0 8 2.00 -1999-Aug-27 09:09:18 4171700.85643 872120.06378 4730014.86843 11.80798 48.17149 537.81230 -1.95520 -1.11652 13.22165 -1.39481 -2.44020 2.42879 8 0 8 2.00 -1999-Aug-27 09:09:18 4171701.89475 872121.33150 4730013.76763 11.80799 48.17147 537.84287 -0.92679 -2.80127 13.25221 -0.36639 -4.12496 2.45935 8 0 8 2.00 -1999-Aug-27 09:09:18 4171700.18412 872122.62597 4730012.58046 11.80801 48.17147 536.01822 0.69034 -2.54268 11.42757 1.25074 -3.86637 0.63471 8 0 8 2.00 -1999-Aug-27 09:09:18 4171697.57154 872120.46629 4730014.33879 11.80799 48.17151 535.32823 -0.88901 0.86481 10.73758 -0.32862 -0.45887 -0.05528 8 0 8 2.00 -1999-Aug-27 09:09:18 4171700.00459 872121.36077 4730014.31739 11.80800 48.17149 537.02263 -0.51135 -1.06045 12.43197 0.04905 -2.38414 1.63911 8 0 8 2.00 -1999-Aug-27 09:09:18 4171700.83364 872121.75541 4730014.81654 11.80800 48.17149 537.98962 -0.29471 -1.39244 13.39896 0.26568 -2.71613 2.60610 8 0 8 2.00 -1999-Aug-27 09:09:18 4171691.05768 872120.37346 4730013.62547 11.80801 48.17154 530.53186 0.35307 5.15431 5.94120 0.91347 3.83062 -4.85166 8 0 8 2.00 -1999-Aug-27 09:09:19 4171687.50657 872118.91940 4730009.49557 11.80800 48.17154 524.93791 -0.34355 5.21187 0.34725 0.21684 3.88819 -10.44560 8 0 8 2.00 -1999-Aug-27 09:09:19 4171696.71721 872119.36081 4730014.10628 11.80798 48.17151 534.44641 -1.79628 1.50144 9.85576 -1.23588 0.17775 -0.93710 8 0 8 2.00 -1999-Aug-27 09:09:19 4171696.31779 872118.42098 4730013.93628 11.80797 48.17151 533.93074 -2.63448 1.82270 9.34009 -2.07409 0.49901 -1.45277 8 0 8 2.00 -1999-Aug-27 09:09:19 4171694.85857 872119.19354 4730014.00161 11.80798 48.17152 533.13229 -1.57967 2.81279 8.54163 -1.01927 1.48911 -2.25122 8 0 8 2.00 -1999-Aug-27 09:09:19 4171696.32786 872120.53001 4730015.60726 11.80800 48.17152 535.47026 -0.57214 2.60815 10.87961 -0.01175 1.28447 0.08675 8 0 8 2.00 -1999-Aug-27 09:09:19 4171695.06688 872120.80667 4730013.61388 11.80801 48.17152 533.19951 -0.04331 2.15630 8.60885 0.51709 0.83262 -2.18401 8 0 8 2.00 -1999-Aug-27 09:09:19 4171697.29174 872119.77460 4730011.88774 11.80799 48.17149 533.22480 -1.50881 -0.46025 8.63414 -0.94842 -1.78393 -2.15871 8 0 8 2.00 -1999-Aug-27 09:09:19 4171695.80482 872120.06301 4730012.41930 11.80799 48.17151 532.68960 -0.92223 0.93480 8.09895 -0.36184 -0.38889 -2.69391 8 0 8 2.00 -1999-Aug-27 09:09:19 4171697.11970 872119.96889 4730013.32425 11.80799 48.17150 534.20942 -1.28343 0.59362 9.61877 -0.72304 -0.73007 -1.17409 8 0 8 2.00 -1999-Aug-27 09:09:19 4171697.39820 872120.76331 4730013.51870 11.80800 48.17150 534.64452 -0.56281 0.39903 10.05387 -0.00241 -0.92465 -0.73899 8 0 8 2.00 -1999-Aug-27 09:09:19 4171699.71186 872120.40542 4730015.27760 11.80799 48.17150 537.41665 -1.38658 -0.06091 12.82600 -0.82618 -1.38460 2.03314 8 0 8 2.00 -1999-Aug-27 09:09:19 4171699.30564 872122.12980 4730014.83518 11.80801 48.17149 537.05714 0.38444 -0.32261 12.46649 0.94483 -1.64630 1.67363 8 0 8 2.00 -1999-Aug-27 09:09:19 4171692.43846 872120.33396 4730012.61079 11.80801 48.17153 530.67173 0.03185 3.47653 6.08108 0.59224 2.15285 -4.71178 8 0 8 2.00 -1999-Aug-27 09:09:19 4171693.21098 872121.69044 4730014.32957 11.80802 48.17153 532.64189 1.20155 3.85249 8.05123 1.76194 2.52881 -2.74162 8 0 8 2.00 -1999-Aug-27 09:09:19 4171693.86721 872120.18962 4730014.45907 11.80800 48.17153 532.96195 -0.40181 3.68906 8.37129 0.15859 2.36538 -2.42157 8 0 8 2.00 -1999-Aug-27 09:09:19 4171698.71781 872121.40717 4730017.22188 11.80800 48.17151 538.35323 -0.20261 1.80803 13.76257 0.35779 0.48434 2.96971 8 0 8 2.00 -1999-Aug-27 09:09:19 4171699.98798 872122.00531 4730015.74601 11.80801 48.17150 538.16428 0.12295 -0.19387 13.57362 0.68335 -1.51756 2.78076 8 0 8 2.00 -1999-Aug-27 09:09:19 4171702.23571 872124.12091 4730017.33868 11.80803 48.17149 541.10706 1.73383 -1.09374 16.51640 2.29422 -2.41743 5.72354 8 0 8 2.00 -1999-Aug-27 09:09:19 4171703.66160 872123.93996 4730017.05561 11.80802 48.17148 541.80224 1.26492 -2.29494 17.21159 1.82532 -3.61863 6.41873 8 0 8 2.00 -1999-Aug-27 09:09:19 4171700.17890 872122.19994 4730016.23255 11.80801 48.17150 538.67801 0.27440 -0.03833 14.08736 0.83480 -1.36202 3.29450 8 0 8 2.00 -1999-Aug-27 09:09:19 4171697.52445 872121.64690 4730017.13141 11.80801 48.17152 537.53952 0.27625 2.58154 12.94886 0.83665 1.25786 2.15601 8 0 8 2.00 -1999-Aug-27 09:09:19 4171694.37948 872120.48604 4730017.31347 11.80800 48.17154 535.46375 -0.21648 5.17383 10.87310 0.34392 3.85015 0.08024 8 0 8 2.00 -1999-Aug-27 09:09:19 4171694.72972 872120.10541 4730015.28313 11.80800 48.17153 534.12754 -0.66073 3.62238 9.53688 -0.10034 2.29869 -1.25598 8 0 8 2.00 -1999-Aug-27 09:09:19 4171698.19767 872120.41898 4730017.15531 11.80799 48.17152 537.82923 -1.06345 2.29369 13.23857 -0.50305 0.97000 2.44571 8 0 8 2.00 -1999-Aug-27 09:09:19 4171698.26754 872119.74055 4730014.76840 11.80798 48.17150 536.00365 -1.74182 0.75434 11.41300 -1.18143 -0.56935 0.62014 8 0 8 2.00 -1999-Aug-27 09:09:20 4171696.99939 872121.56118 4730012.25156 11.80801 48.17150 533.54887 0.29979 -0.27681 8.95822 0.86018 -1.60050 -1.83464 8 0 8 2.00 -1999-Aug-27 09:09:20 4171694.21647 872121.07300 4730009.54888 11.80801 48.17150 529.65169 0.39141 0.02501 5.06104 0.95181 -1.29868 -5.73182 8 0 8 2.00 -1999-Aug-27 09:09:20 4171695.44362 872121.88269 4730012.56076 11.80802 48.17151 532.80755 0.93286 1.01512 8.21690 1.49325 -0.30857 -2.57596 8 0 8 2.00 -1999-Aug-27 09:09:20 4171694.83915 872119.52523 4730014.96864 11.80799 48.17153 533.88546 -1.25103 3.42129 9.29480 -0.69063 2.09761 -1.49805 8 0 8 2.00 -1999-Aug-27 09:09:20 4171694.83635 872120.68506 4730014.91086 11.80800 48.17153 533.99886 -0.11517 3.20795 9.40820 0.44523 1.88427 -1.38466 8 0 8 2.00 -1999-Aug-27 09:09:20 4171695.79298 872121.03515 4730014.69556 11.80801 48.17152 534.51068 0.03176 2.31324 9.92002 0.59216 0.98955 -0.87283 8 0 8 2.00 -1999-Aug-27 09:09:20 4171697.75683 872120.14324 4730014.16804 11.80799 48.17150 535.27786 -1.24315 0.66505 10.68721 -0.68275 -0.65863 -0.10565 8 0 8 2.00 -1999-Aug-27 09:09:20 4171700.33516 872120.56118 4730015.29096 11.80799 48.17149 537.85475 -1.36166 -0.53037 13.26410 -0.80127 -1.85406 2.47124 8 0 8 2.00 -1999-Aug-27 09:09:20 4171698.18473 872117.92565 4730013.18441 11.80796 48.17150 534.52161 -3.50137 0.03510 9.93096 -2.94097 -1.28858 -0.86190 8 0 8 2.00 -1999-Aug-27 09:09:20 4171695.52019 872119.15720 4730014.94197 11.80798 48.17152 534.25993 -1.75063 2.96289 9.66928 -1.19023 1.63920 -1.12358 8 0 8 2.00 -1999-Aug-27 09:09:20 4171694.88506 872120.08880 4730014.02193 11.80800 48.17152 533.28690 -0.70877 2.67051 8.69625 -0.14838 1.34683 -2.09661 8 0 8 2.00 -1999-Aug-27 09:09:20 4171693.82362 872120.37903 4730015.57385 11.80800 48.17154 533.79001 -0.20749 4.43542 9.19936 0.35291 3.11174 -1.59350 8 0 8 2.00 -1999-Aug-27 09:09:20 4171693.83316 872119.22015 4730012.33073 11.80799 48.17152 531.22150 -1.34380 2.44232 6.63084 -0.78340 1.11864 -4.16201 8 0 8 2.00 -1999-Aug-27 09:09:20 4171695.12240 872119.82948 4730012.90829 11.80799 48.17151 532.57663 -1.01118 1.79425 7.98597 -0.45078 0.47057 -2.80689 8 0 8 2.00 -1999-Aug-27 09:09:20 4171694.42510 872119.73886 4730013.51030 11.80799 48.17152 532.55765 -0.95718 2.71815 7.96699 -0.39679 1.39446 -2.82587 8 0 8 2.00 -1999-Aug-27 09:09:20 4171694.96146 872121.56456 4730012.63614 11.80802 48.17151 532.50555 0.72013 1.46557 7.91490 1.28052 0.14189 -2.87796 8 0 8 2.00 -1999-Aug-27 09:09:20 4171697.88040 872121.63481 4730016.04733 11.80801 48.17151 536.96243 0.19158 1.60079 12.37178 0.75197 0.27711 1.57892 8 0 8 2.00 -1999-Aug-27 09:09:20 4171700.17713 872123.03665 4730015.94819 11.80802 48.17149 538.57915 1.09376 -0.35426 13.98849 1.65416 -1.67795 3.19564 8 0 8 2.00 -1999-Aug-27 09:09:20 4171699.17846 872122.03655 4730016.34697 11.80801 48.17150 538.08789 0.31919 0.79259 13.49724 0.87959 -0.53110 2.70438 8 0 8 2.00 -1999-Aug-27 09:09:20 4171696.47075 872121.42370 4730014.25602 11.80801 48.17151 534.67863 0.27339 1.46651 10.08797 0.83378 0.14283 -0.70489 8 0 8 2.00 -1999-Aug-27 09:09:20 4171693.84722 872120.90043 4730014.86401 11.80801 48.17153 533.34764 0.29806 3.86531 8.75699 0.85845 2.54163 -2.03587 8 0 8 2.00 -1999-Aug-27 09:09:20 4171694.34839 872120.49578 4730014.82261 11.80800 48.17153 533.58873 -0.20059 3.53386 8.99808 0.35981 2.21018 -1.79478 8 0 8 2.00 -1999-Aug-27 09:09:20 4171695.56278 872121.11545 4730015.15883 11.80801 48.17152 534.71657 0.15747 2.77786 10.12591 0.71787 1.45417 -0.66694 8 0 8 2.00 -1999-Aug-27 09:09:20 4171688.86834 872119.94660 4730011.78669 11.80801 48.17155 527.67426 0.38325 5.58996 3.08361 0.94364 4.26627 -7.70925 8 0 8 2.00 -1999-Aug-27 09:09:20 4171693.87341 872120.97816 4730013.78871 11.80801 48.17153 532.57410 0.36878 3.11724 7.98344 0.92918 1.79355 -2.80942 8 0 8 2.00 -1999-Aug-27 09:09:21 4171692.49418 872120.61323 4730013.68775 11.80801 48.17153 531.54871 0.29381 4.11153 6.95805 0.85421 2.78785 -3.83480 8 0 8 2.00 -1999-Aug-27 09:09:21 4171688.04342 872120.08485 4730011.73852 11.80801 48.17155 527.11874 0.68739 6.13843 2.52808 1.24778 4.81474 -8.26478 8 0 8 2.00 -1999-Aug-27 09:09:21 4171690.26676 872119.77888 4730014.50173 11.80800 48.17156 530.58734 -0.06708 6.40623 5.99669 0.49332 5.08254 -4.79617 8 0 8 2.00 -1999-Aug-27 09:09:21 4171694.50317 872122.32494 4730017.54632 11.80803 48.17154 535.96895 1.55819 4.95851 11.37829 2.11859 3.63482 0.58544 8 0 8 2.00 -1999-Aug-27 09:09:21 4171692.79089 872120.98460 4730014.29909 11.80801 48.17154 532.24862 0.59660 4.24619 7.65797 1.15700 2.92251 -3.13489 8 0 8 2.00 -1999-Aug-27 09:09:21 4171698.76090 872120.39522 4730016.70553 11.80799 48.17151 537.85850 -1.20196 1.58654 13.26785 -0.64156 0.26285 2.47499 8 0 8 2.00 -1999-Aug-27 09:09:21 4171704.29728 872123.80645 4730017.80307 11.80802 48.17148 542.75595 1.00416 -2.23975 18.16530 1.56455 -3.56344 7.37244 8 0 8 2.00 -1999-Aug-27 09:09:21 4171700.64259 872121.02241 4730014.97815 11.80799 48.17149 537.88529 -0.97311 -1.03355 13.29464 -0.41271 -2.35724 2.50178 8 0 8 2.00 -1999-Aug-27 09:09:21 4171699.25135 872119.95723 4730013.41049 11.80798 48.17149 535.66361 -1.73104 -0.90187 11.07296 -1.17065 -2.22555 0.28010 8 0 8 2.00 -1999-Aug-27 09:09:21 4171698.28300 872120.98618 4730012.00275 11.80800 48.17149 534.12293 -0.52571 -1.29130 9.53228 0.03468 -2.61499 -1.26058 8 0 8 2.00 -1999-Aug-27 09:09:21 4171702.41054 872122.20164 4730014.76464 11.80800 48.17147 539.04123 -0.18061 -2.64525 14.45057 0.37979 -3.96893 3.65772 8 0 8 2.00 -1999-Aug-27 09:09:21 4171700.92649 872119.24980 4730014.63659 11.80797 48.17149 537.57420 -2.76630 -1.19811 12.98354 -2.20590 -2.52180 2.19068 8 0 8 2.00 -1999-Aug-27 09:09:21 4171700.93647 872120.16346 4730016.75805 11.80798 48.17150 539.28620 -1.87401 0.07010 14.69555 -1.31362 -1.25359 3.90269 8 0 8 2.00 -1999-Aug-27 09:09:21 4171699.13405 872119.61011 4730016.43377 11.80798 48.17151 537.79244 -2.04682 1.25285 13.20179 -1.48642 -0.07084 2.40893 8 0 8 2.00 -1999-Aug-27 09:09:21 4171698.23324 872120.78051 4730018.54953 11.80800 48.17153 538.94068 -0.71685 3.14243 14.35002 -0.15646 1.81874 3.55716 8 0 8 2.00 -1999-Aug-27 09:09:21 4171698.42739 872119.73233 4730014.62931 11.80798 48.17150 536.00324 -1.78258 0.54624 11.41259 -1.22218 -0.77745 0.61973 8 0 8 2.00 -1999-Aug-27 09:09:21 4171701.24371 872121.23133 4730018.80060 11.80799 48.17151 541.15449 -0.89161 1.04536 16.56383 -0.33121 -0.27833 5.77098 8 0 8 2.00 -1999-Aug-27 09:09:21 4171700.03882 872122.95815 4730015.46396 11.80802 48.17149 538.11733 1.04523 -0.56435 13.52667 1.60563 -1.88804 2.73381 8 0 8 2.00 -1999-Aug-27 09:09:21 4171697.74177 872121.47863 4730014.30574 11.80801 48.17150 535.55288 0.06707 0.56424 10.96223 0.62746 -0.75944 0.16937 8 0 8 2.00 -1999-Aug-27 09:09:21 4171702.02315 872123.14743 4730015.99199 11.80802 48.17148 539.83197 0.82444 -1.68839 15.24132 1.38484 -3.01208 4.44846 8 0 8 2.00 -1999-Aug-27 09:09:21 4171700.00113 872122.42775 4730015.48313 11.80801 48.17149 538.03462 0.53377 -0.44320 13.44397 1.09416 -1.76689 2.65111 8 0 8 2.00 -1999-Aug-27 09:09:21 4171701.16441 872122.64495 4730018.18176 11.80801 48.17150 540.83451 0.50832 0.47494 16.24386 1.06872 -0.84874 5.45100 8 0 8 2.00 -1999-Aug-27 09:09:21 4171697.28530 872121.05176 4730015.79983 11.80800 48.17152 536.30996 -0.25736 1.95869 11.71931 0.30304 0.63500 0.92645 8 0 8 2.00 -1999-Aug-27 09:09:21 4171694.86685 872119.29764 4730013.91022 11.80799 48.17152 533.08380 -1.47947 2.72993 8.49315 -0.91907 1.40625 -2.29971 8 0 8 2.00 -1999-Aug-27 09:09:21 4171693.51569 872119.52601 4730012.67172 11.80799 48.17152 531.31009 -0.97944 2.85465 6.71943 -0.41904 1.53096 -4.07343 8 0 8 2.00 -1999-Aug-27 09:09:22 4171690.88592 872118.61848 4730013.90752 11.80799 48.17155 530.39040 -1.32963 5.73528 5.79974 -0.76923 4.41160 -4.99312 8 0 8 2.00 -1999-Aug-27 09:09:22 4171692.52746 872119.09683 4730010.59881 11.80799 48.17152 529.06178 -1.19732 2.25845 4.47113 -0.63692 0.93477 -6.32173 8 0 8 2.00 -1999-Aug-27 09:09:22 4171697.96983 872119.63185 4730016.19910 11.80798 48.17152 536.86055 -1.78730 1.94219 12.26990 -1.22691 0.61851 1.47704 8 0 8 2.00 -1999-Aug-27 09:09:22 4171697.50798 872121.03459 4730016.00991 11.80800 48.17152 536.60952 -0.31974 1.93899 12.01887 0.24066 0.61531 1.22601 8 0 8 2.00 -1999-Aug-27 09:09:22 4171694.63478 872119.17111 4730013.22461 11.80798 48.17152 532.40416 -1.55583 2.46125 7.81351 -0.99543 1.13757 -2.97935 8 0 8 2.00 -1999-Aug-27 09:09:22 4171692.49931 872121.27124 4730014.45843 11.80802 48.17154 532.21613 0.93684 4.52143 7.62548 1.49724 3.19774 -3.16738 8 0 8 2.00 -1999-Aug-27 09:09:22 4171696.61631 872121.17587 4730014.55722 11.80801 48.17151 534.96426 0.00102 1.59900 10.37361 0.56142 0.27532 -0.41925 8 0 8 2.00 -1999-Aug-27 09:09:22 4171693.90220 872119.54058 4730010.59889 11.80799 48.17151 530.01982 -1.04427 1.18815 5.42917 -0.48387 -0.13554 -5.36369 8 0 8 2.00 -1999-Aug-27 09:09:22 4171700.29891 872120.23397 4730014.91080 11.80798 48.17149 537.50316 -1.67453 -0.70757 12.91250 -1.11414 -2.03126 2.11964 8 0 8 2.00 -1999-Aug-27 09:09:22 4171700.73872 872120.07867 4730017.23077 11.80798 48.17150 539.49778 -1.91654 0.54252 14.90713 -1.35614 -0.78117 4.11427 8 0 8 2.00 -1999-Aug-27 09:09:22 4171695.39060 872119.68205 4730016.46018 11.80799 48.17153 535.37825 -1.21037 3.98988 10.78760 -0.64998 2.66620 -0.00526 8 0 8 2.00 -1999-Aug-27 09:09:22 4171696.15920 872120.45485 4730016.73467 11.80800 48.17153 536.18998 -0.61120 3.49450 11.59933 -0.05081 2.17081 0.80647 8 0 8 2.00 -1999-Aug-27 09:09:22 4171698.77574 872122.62338 4730016.30861 11.80802 48.17151 537.87650 0.97601 0.97126 13.28584 1.53641 -0.35243 2.49299 8 0 8 2.00 -1999-Aug-27 09:09:22 4171696.06143 872121.09773 4730012.70430 11.80801 48.17150 533.21068 0.03809 0.77992 8.62003 0.59848 -0.54377 -2.17283 8 0 8 2.00 -1999-Aug-27 09:09:22 4171698.80745 872123.16248 4730015.52177 11.80803 48.17150 537.38446 1.49721 0.34119 12.79381 2.05760 -0.98250 2.00095 8 0 8 2.00 -1999-Aug-27 09:09:22 4171699.80683 872120.87722 4730013.81195 11.80799 48.17149 536.45092 -0.94420 -1.17957 11.86026 -0.38380 -2.50325 1.06740 8 0 8 2.00 -1999-Aug-27 09:09:22 4171699.60136 872121.34962 4730012.32373 11.80800 48.17148 535.27231 -0.43975 -2.09423 10.68166 0.12065 -3.41792 -0.11120 8 0 8 2.00 -1999-Aug-27 09:09:22 4171698.11557 872121.29054 4730015.23191 11.80800 48.17151 536.46136 -0.19353 0.93796 11.87070 0.36686 -0.38573 1.07785 8 0 8 2.00 -1999-Aug-27 09:09:22 4171694.36863 872118.16382 4730013.70923 11.80797 48.17153 532.45407 -2.48734 3.13217 7.86341 -1.92695 1.80848 -2.92945 8 0 8 2.00 -1999-Aug-27 09:09:22 4171695.40431 872120.65352 4730014.23353 11.80800 48.17152 533.86060 -0.26226 2.34679 9.26994 0.29813 1.02310 -1.52291 8 0 8 2.00 -1999-Aug-27 09:09:22 4171695.10118 872120.16780 4730013.76995 11.80800 48.17152 533.25100 -0.67567 2.33278 8.66034 -0.11528 1.00910 -2.13251 8 0 8 2.00 -1999-Aug-27 09:09:22 4171695.19665 872118.89598 4730012.49401 11.80798 48.17151 532.18899 -1.94012 1.60615 7.59834 -1.37972 0.28247 -3.19452 8 0 8 2.00 -1999-Aug-27 09:09:22 4171697.01626 872120.78139 4730015.94960 11.80800 48.17152 536.20904 -0.46696 2.29603 11.61839 0.09344 0.97235 0.82553 8 0 8 2.00 -1999-Aug-27 09:09:22 4171700.27502 872124.36651 4730017.07026 11.80804 48.17150 539.66064 2.37545 0.11987 15.06998 2.93585 -1.20381 4.27713 8 0 8 2.00 -1999-Aug-27 09:09:22 4171701.59082 872125.47747 4730017.55732 11.80805 48.17149 541.03412 3.19364 -0.68442 16.44347 3.75404 -2.00810 5.65061 8 0 8 2.00 -1999-Aug-27 09:09:23 4171701.74377 872123.61169 4730019.27097 11.80802 48.17150 542.15626 1.33605 0.63136 17.56561 1.89645 -0.69233 6.77275 8 0 8 2.00 -1999-Aug-27 09:09:23 4171700.40382 872123.79576 4730017.35293 11.80803 48.17150 539.87746 1.79042 0.30147 15.28681 2.35082 -1.02222 4.49395 8 0 8 2.00 -1999-Aug-27 09:09:23 4171703.87978 872122.47863 4730016.16442 11.80800 48.17147 541.08118 -0.21013 -2.82560 16.49052 0.35026 -4.14928 5.69766 8 0 8 2.00 -1999-Aug-27 09:09:23 4171703.45808 872121.08026 4730017.96397 11.80799 48.17149 541.95598 -1.49262 -1.10466 17.36532 -0.93222 -2.42835 6.57246 8 0 8 2.00 -1999-Aug-27 09:09:23 4171699.72388 872119.98180 4730016.06592 11.80798 48.17150 537.95410 -1.80369 0.52065 13.36344 -1.24329 -0.80304 2.57059 8 0 8 2.00 -1999-Aug-27 09:09:23 4171698.59992 872121.33310 4730016.93166 11.80800 48.17151 538.04990 -0.25099 1.71176 13.45925 0.30941 0.38808 2.66639 8 0 8 2.00 -1999-Aug-27 09:09:23 4171699.67899 872121.41363 4730016.82641 11.80800 48.17151 538.68688 -0.39298 0.84224 14.09623 0.16742 -0.48145 3.30337 8 0 8 2.00 -1999-Aug-27 09:09:23 4171699.62290 872121.08301 4730015.76318 11.80800 48.17150 537.81288 -0.70512 0.22449 13.22223 -0.14473 -1.09920 2.42937 8 0 8 2.00 -1999-Aug-27 09:09:23 4171701.67451 872120.80703 4730017.63286 11.80799 48.17150 540.50767 -1.39509 0.01707 15.91701 -0.83469 -1.30662 5.12415 8 0 8 2.00 -1999-Aug-27 09:09:23 4171698.45889 872121.17270 4730015.58554 11.80800 48.17151 536.93290 -0.37913 0.94135 12.34224 0.18126 -0.38234 1.54938 8 0 8 2.00 -1999-Aug-27 09:09:23 4171695.25417 872121.71540 4730013.26065 11.80802 48.17151 533.18257 0.80787 1.64556 8.59191 1.36826 0.32188 -2.20094 8 0 8 2.00 -1999-Aug-27 09:09:23 4171692.27569 872119.24784 4730009.88592 11.80799 48.17152 528.38683 -0.99798 1.94364 3.79618 -0.43758 0.61995 -6.99668 8 0 8 2.00 -1999-Aug-27 09:09:23 4171696.59465 872120.55718 4730009.69348 11.80800 48.17148 531.24150 -0.60015 -1.53450 6.65084 -0.03975 -2.85818 -4.14201 8 0 8 2.00 -1999-Aug-27 09:09:23 4171693.87027 872119.94491 4730011.79914 11.80800 48.17152 530.94852 -0.64196 1.95023 6.35786 -0.08156 0.62655 -4.43499 8 0 8 2.00 -1999-Aug-27 09:09:23 4171693.62076 872121.21537 4730013.03881 11.80801 48.17152 531.88275 0.65267 2.76523 7.29210 1.21307 1.44154 -3.50076 8 0 8 2.00 -1999-Aug-27 09:09:23 4171697.10208 872120.62247 4730013.05306 11.80800 48.17150 534.08503 -0.64007 0.32595 9.49438 -0.07967 -0.99774 -1.29848 8 0 8 2.00 -1999-Aug-27 09:09:23 4171697.20198 872122.82017 4730012.92004 11.80803 48.17150 534.35104 1.49068 -0.17073 9.76039 2.05107 -1.49442 -1.03247 8 0 8 2.00 -1999-Aug-27 09:09:23 4171696.20403 872120.73201 4730014.99257 11.80800 48.17152 534.95895 -0.34908 2.25773 10.36830 0.21132 0.93405 -0.42456 8 0 8 2.00 -1999-Aug-27 09:09:23 4171697.55230 872119.45140 4730016.34870 11.80798 48.17152 536.67484 -1.87850 2.37401 12.08418 -1.31810 1.05032 1.29133 8 0 8 2.00 -1999-Aug-27 09:09:23 4171697.71616 872120.74176 4730013.67756 11.80800 48.17150 534.96751 -0.64897 0.27635 10.37686 -0.08857 -1.04734 -0.41600 8 0 8 2.00 -1999-Aug-27 09:09:23 4171698.65261 872119.76049 4730014.52523 11.80798 48.17150 536.07655 -1.80110 0.30827 11.48589 -1.24071 -1.01542 0.69304 8 0 8 2.00 -1999-Aug-27 09:09:23 4171700.77057 872121.23510 4730016.35719 11.80799 48.17150 539.02545 -0.79110 -0.23964 14.43479 -0.23070 -1.56332 3.64193 8 0 8 2.00 -1999-Aug-27 09:09:23 4171698.88396 872119.69364 4730016.07676 11.80798 48.17151 537.37456 -1.91388 1.18444 12.78391 -1.35349 -0.13925 1.99105 8 0 8 2.00 -1999-Aug-27 09:09:23 4171700.76840 872121.17525 4730016.74354 11.80799 48.17150 539.30375 -0.84924 0.02873 14.71310 -0.28884 -1.29496 3.92024 8 0 8 2.00 -1999-Aug-27 09:09:23 4171700.63138 872121.42159 4730014.53158 11.80800 48.17149 537.59969 -0.58008 -1.38406 13.00904 -0.01968 -2.70774 2.21618 8 0 8 2.00 -1999-Aug-27 09:09:24 4171702.35156 872120.64068 4730012.37503 11.80798 48.17146 537.00910 -1.69646 -3.95786 12.41844 -1.13606 -5.28154 1.62559 8 0 8 2.00 -1999-Aug-27 09:09:24 4171699.91282 872119.01307 4730012.09608 11.80797 48.17148 534.98714 -2.79059 -2.11694 10.39648 -2.23020 -3.44063 -0.39637 8 0 8 2.00 -1999-Aug-27 09:09:24 4171699.94506 872119.81074 4730012.63023 11.80798 48.17148 535.51505 -2.01639 -1.90586 10.92440 -1.45600 -3.22955 0.13154 8 0 8 2.00 -1999-Aug-27 09:09:24 4171699.74207 872121.95179 4730014.54873 11.80801 48.17149 537.10430 0.12089 -0.80482 12.51364 0.68129 -2.12851 1.72079 8 0 8 2.00 -1999-Aug-27 09:09:24 4171700.57314 872120.42580 4730014.39324 11.80798 48.17149 537.32270 -1.54287 -1.28200 12.73204 -0.98248 -2.60569 1.93918 8 0 8 2.00 -1999-Aug-27 09:09:24 4171699.33310 872120.32239 4730014.09684 11.80799 48.17149 536.27823 -1.39034 -0.55944 11.68758 -0.82994 -1.88313 0.89472 8 0 8 2.00 -1999-Aug-27 09:09:24 4171697.14398 872120.86363 4730014.82407 11.80800 48.17151 535.46495 -0.41259 1.43971 10.87430 0.14780 0.11603 0.08144 8 0 8 2.00 -1999-Aug-27 09:09:24 4171699.48700 872120.47236 4730015.31533 11.80799 48.17150 537.30711 -1.27504 0.11805 12.71646 -0.71464 -1.20563 1.92360 8 0 8 2.00 -1999-Aug-27 09:09:24 4171696.15722 872119.33904 4730012.33941 11.80798 48.17150 532.76131 -1.70300 0.73488 8.17066 -1.14260 -0.58881 -2.62220 8 0 8 2.00 -1999-Aug-27 09:09:24 4171698.98685 872121.23890 4730014.84026 11.80800 48.17150 536.73124 -0.42238 0.04914 12.14059 0.13802 -1.27455 1.34773 8 0 8 2.00 -1999-Aug-27 09:09:24 4171695.07266 872120.95475 4730015.36847 11.80801 48.17153 534.53090 0.10046 3.29965 9.94025 0.66086 1.97596 -0.85261 8 0 8 2.00 -1999-Aug-27 09:09:24 4171698.78133 872121.41440 4730014.84369 11.80800 48.17150 536.62358 -0.20853 0.17457 12.03293 0.35187 -1.14911 1.24007 8 0 8 2.00 -1999-Aug-27 09:09:24 4171697.30593 872121.39355 4730013.75679 11.80801 48.17150 534.84771 0.07297 0.52901 10.25706 0.63337 -0.79467 -0.53580 8 0 8 2.00 -1999-Aug-27 09:09:24 4171697.12391 872121.11386 4730017.80195 11.80800 48.17153 537.70495 -0.16355 3.40215 13.11430 0.39685 2.07847 2.32144 8 0 8 2.00 -1999-Aug-27 09:09:24 4171696.56955 872120.23107 4730016.81837 11.80799 48.17153 536.48968 -0.91422 3.28515 11.89903 -0.35382 1.96146 1.10617 8 0 8 2.00 -1999-Aug-27 09:09:24 4171695.11351 872119.49595 4730017.40023 11.80799 48.17154 535.87245 -1.33583 4.84729 11.28179 -0.77543 3.52360 0.48893 8 0 8 2.00 -1999-Aug-27 09:09:24 4171694.78969 872119.62586 4730014.84672 11.80799 48.17153 533.77606 -1.14240 3.36072 9.18540 -0.58200 2.03703 -1.60745 8 0 8 2.00 -1999-Aug-27 09:09:24 4171700.33633 872120.75391 4730015.46899 11.80799 48.17149 538.01448 -1.17325 -0.44189 13.42382 -0.61285 -1.76557 2.63097 8 0 8 2.00 -1999-Aug-27 09:09:24 4171697.01167 872121.58222 4730011.88278 11.80801 48.17149 533.28496 0.31787 -0.53492 8.69431 0.87827 -1.85860 -2.09855 8 0 8 2.00 -1999-Aug-27 09:09:24 4171693.64754 872120.65812 4730011.90250 11.80801 48.17152 530.97747 0.10174 2.07286 6.38682 0.66213 0.74918 -4.40604 8 0 8 2.00 -1999-Aug-27 09:09:24 4171692.26081 872120.67325 4730011.57983 11.80801 48.17152 529.83386 0.40032 2.86681 5.24321 0.96071 1.54313 -5.54965 8 0 8 2.00 -1999-Aug-27 09:09:24 4171698.53981 872121.11428 4730015.80070 11.80800 48.17151 537.13807 -0.45288 1.03472 12.54742 0.10752 -0.28896 1.75456 8 0 8 2.00 -1999-Aug-27 09:09:24 4171696.26879 872119.69321 4730015.05164 11.80799 48.17152 534.90348 -1.37915 2.40829 10.31283 -0.81876 1.08460 -0.48003 8 0 8 2.00 -1999-Aug-27 09:09:24 4171694.69933 872118.71916 4730012.08588 11.80798 48.17151 531.53610 -2.01143 1.72366 6.94545 -1.45103 0.39998 -3.84741 8 0 8 2.00 -1999-Aug-27 09:09:24 4171699.58368 872120.67641 4730013.31263 11.80799 48.17149 535.90577 -1.09509 -1.31918 11.31512 -0.53469 -2.64287 0.52226 8 0 8 2.00 -1999-Aug-27 09:09:25 4171700.17170 872118.91897 4730014.17365 11.80797 48.17149 536.69138 -2.93567 -0.90588 12.10072 -2.37528 -2.22957 1.30786 8 0 8 2.00 -1999-Aug-27 09:09:25 4171701.64183 872119.60517 4730013.82382 11.80797 48.17148 537.48403 -2.56483 -2.31610 12.89338 -2.00443 -3.63978 2.10052 8 0 8 2.00 -1999-Aug-27 09:09:25 4171701.59558 872122.11899 4730016.02328 11.80800 48.17149 539.43582 -0.09474 -1.19885 14.84517 0.46566 -2.52253 4.05231 8 0 8 2.00 -1999-Aug-27 09:09:25 4171703.61990 872121.01985 4730016.76083 11.80798 48.17148 541.15686 -1.58486 -2.01586 16.56621 -1.02447 -3.33954 5.77335 8 0 8 2.00 -1999-Aug-27 09:09:25 4171701.09578 872121.60515 4730014.09368 11.80800 48.17148 537.60160 -0.49543 -2.04280 13.01094 0.06497 -3.36649 2.21808 8 0 8 2.00 -1999-Aug-27 09:09:25 4171699.76782 872122.63650 4730016.47835 11.80802 48.17150 538.65239 0.78584 0.35887 14.06174 1.34623 -0.96482 3.26888 8 0 8 2.00 -1999-Aug-27 09:09:25 4171694.37645 872120.50463 4730013.87324 11.80800 48.17152 532.90084 -0.19767 2.87892 8.31018 0.36273 1.55523 -2.48267 8 0 8 2.00 -1999-Aug-27 09:09:25 4171690.96030 872118.32459 4730011.48687 11.80798 48.17153 528.59510 -1.63252 4.11150 4.00445 -1.07213 2.78782 -6.78841 8 0 8 2.00 -1999-Aug-27 09:09:25 4171692.31018 872117.40922 4730011.46359 11.80797 48.17153 529.33403 -2.80474 3.25098 4.74337 -2.24435 1.92730 -6.04948 8 0 8 2.00 -1999-Aug-27 09:09:25 4171695.52334 872118.85459 4730011.18502 11.80798 48.17150 531.42122 -2.04748 0.50122 6.83057 -1.48708 -0.82247 -3.96229 8 0 8 2.00 -1999-Aug-27 09:09:25 4171696.07825 872121.17335 4730012.55148 11.80801 48.17150 533.11811 0.10865 0.65421 8.52745 0.66905 -0.66948 -2.26540 8 0 8 2.00 -1999-Aug-27 09:09:25 4171693.49768 872120.90121 4730014.34574 11.80801 48.17153 532.73339 0.37035 3.77451 8.14273 0.93075 2.45083 -2.65013 8 0 8 2.00 -1999-Aug-27 09:09:25 4171700.52163 872123.50052 4730019.02947 11.80803 48.17151 541.16334 1.47733 1.37866 16.57268 2.03772 0.05497 5.77982 8 0 8 2.00 -1999-Aug-27 09:09:25 4171696.76605 872121.18363 4730015.45778 11.80801 48.17152 535.73412 -0.02203 2.08920 11.14347 0.53837 0.76551 0.35061 8 0 8 2.00 -1999-Aug-27 09:09:25 4171693.76606 872119.32232 4730012.61168 11.80799 48.17152 531.40098 -1.23005 2.66305 6.81033 -0.66965 1.33937 -3.98253 8 0 8 2.00 -1999-Aug-27 09:09:25 4171696.20759 872119.57829 4730013.34626 11.80799 48.17151 533.57709 -1.47911 1.33312 8.98644 -0.91872 0.00943 -1.80642 8 0 8 2.00 -1999-Aug-27 09:09:25 4171697.28282 872122.01346 4730014.67278 11.80801 48.17151 535.59977 0.68449 1.06222 11.00912 1.24489 -0.26147 0.21626 8 0 8 2.00 -1999-Aug-27 09:09:25 4171697.38868 872120.59481 4730014.87393 11.80800 48.17151 535.62516 -0.72580 1.33548 11.03451 -0.16540 0.01179 0.24165 8 0 8 2.00 -1999-Aug-27 09:09:25 4171701.47703 872121.73941 4730015.89576 11.80800 48.17149 539.21161 -0.44202 -1.13954 14.62096 0.11837 -2.46322 3.82810 8 0 8 2.00 -1999-Aug-27 09:09:25 4171698.56067 872121.95165 4730015.61104 11.80801 48.17150 537.12465 0.36251 0.76535 12.53399 0.92290 -0.55834 1.74113 8 0 8 2.00 -1999-Aug-27 09:09:25 4171696.65831 872120.93186 4730015.95828 11.80800 48.17152 536.00237 -0.24642 2.53995 11.41171 0.31398 1.21627 0.61886 8 0 8 2.00 -1999-Aug-27 09:09:25 4171698.12161 872120.99480 4730015.67877 11.80800 48.17151 536.75791 -0.48425 1.27665 12.16726 0.07614 -0.04704 1.37440 8 0 8 2.00 -1999-Aug-27 09:09:25 4171699.22246 872122.04848 4730015.70174 11.80801 48.17150 537.63745 0.32186 0.32837 13.04680 0.88225 -0.99532 2.25394 8 0 8 2.00 -1999-Aug-27 09:09:25 4171701.82105 872121.33286 4730013.71505 11.80799 48.17147 537.75576 -0.91038 -2.78278 13.16510 -0.34998 -4.10647 2.37224 8 0 8 2.00 -1999-Aug-27 09:09:25 4171701.09452 872120.15846 4730011.31476 11.80798 48.17146 535.33265 -1.91125 -3.67456 10.74200 -1.35085 -4.99825 -0.05086 8 0 8 2.00 -1999-Aug-27 09:09:26 4171699.31797 872121.96160 4730011.33167 11.80801 48.17147 534.43161 0.21727 -2.64246 9.84096 0.77767 -3.96615 -0.95190 8 0 8 2.00 -1999-Aug-27 09:09:26 4171696.40654 872120.50838 4730010.91995 11.80800 48.17149 532.02594 -0.60942 -0.57192 7.43528 -0.04903 -1.89560 -3.35757 8 0 8 2.00 -1999-Aug-27 09:09:26 4171697.43050 872120.78032 4730011.77655 11.80800 48.17149 533.36978 -0.55277 -0.78897 8.77913 0.00763 -2.11265 -2.01373 8 0 8 2.00 -1999-Aug-27 09:09:26 4171694.44315 872121.78184 4730012.10140 11.80802 48.17151 531.79840 1.03887 1.45386 7.20774 1.59927 0.13018 -3.58511 8 0 8 2.00 -1999-Aug-27 09:09:26 4171694.10709 872121.73487 4730015.54433 11.80802 48.17153 534.13810 1.06166 4.00224 9.54744 1.62205 2.67856 -1.24541 8 0 8 2.00 -1999-Aug-27 09:09:26 4171695.71266 872121.88653 4730013.82285 11.80802 48.17151 533.92414 0.88156 1.65999 9.33349 1.44196 0.33631 -1.45937 8 0 8 2.00 -1999-Aug-27 09:09:26 4171699.38466 872123.23049 4730016.78694 11.80803 48.17150 538.71327 1.44566 0.75356 14.12262 2.00606 -0.57013 3.32976 8 0 8 2.00 -1999-Aug-27 09:09:26 4171704.47493 872124.91527 4730020.86486 11.80803 48.17149 545.30472 2.05316 -0.49648 20.71407 2.61356 -1.82017 9.92121 8 0 8 2.00 -1999-Aug-27 09:09:26 4171700.20851 872122.02322 4730018.07017 11.80801 48.17151 540.04252 0.09536 1.19254 15.45186 0.65576 -0.13115 4.65900 8 0 8 2.00 -1999-Aug-27 09:09:26 4171697.04585 872120.19022 4730015.12500 11.80799 48.17151 535.53323 -1.05167 1.81466 10.94257 -0.49127 0.49097 0.14972 8 0 8 2.00 -1999-Aug-27 09:09:26 4171694.95298 872119.67251 4730012.73626 11.80799 48.17151 532.31642 -1.13015 1.82703 7.72577 -0.56976 0.50334 -3.06709 8 0 8 2.00 -1999-Aug-27 09:09:26 4171698.15175 872120.05774 4730012.81519 11.80799 48.17149 534.51593 -1.40765 -0.51218 9.92528 -0.84725 -1.83586 -0.86758 8 0 8 2.00 -1999-Aug-27 09:09:26 4171695.77711 872118.64724 4730013.51632 11.80797 48.17151 533.29574 -2.30238 1.90249 8.70508 -1.74198 0.57881 -2.08777 8 0 8 2.00 -1999-Aug-27 09:09:26 4171698.30525 872120.50803 4730015.75047 11.80799 48.17151 536.86479 -0.99830 1.26475 12.27414 -0.43790 -0.05894 1.48128 8 0 8 2.00 -1999-Aug-27 09:09:26 4171700.05296 872120.23959 4730013.14219 11.80798 48.17148 536.02550 -1.61870 -1.70852 11.43485 -1.05830 -3.03221 0.64199 8 0 8 2.00 -1999-Aug-27 09:09:26 4171698.90391 872121.40123 4730014.81886 11.80800 48.17150 536.68330 -0.24650 0.07061 12.09265 0.31389 -1.25307 1.29979 8 0 8 2.00 -1999-Aug-27 09:09:26 4171700.93193 872120.91958 4730017.11237 11.80799 48.17150 539.65044 -1.13297 0.19442 15.05979 -0.57257 -1.12927 4.26693 8 0 8 2.00 -1999-Aug-27 09:09:26 4171700.82144 872120.99287 4730016.40920 11.80799 48.17150 539.06436 -1.03861 -0.20512 14.47370 -0.47822 -1.52881 3.68084 8 0 8 2.00 -1999-Aug-27 09:09:26 4171698.73942 872121.03495 4730015.08746 11.80800 48.17150 536.72608 -0.57138 0.42556 12.13543 -0.01098 -0.89812 1.34257 8 0 8 2.00 -1999-Aug-27 09:09:26 4171699.28037 872120.15913 4730013.84183 11.80798 48.17149 536.03151 -1.53936 -0.66616 11.44086 -0.97896 -1.98984 0.64800 8 0 8 2.00 -1999-Aug-27 09:09:26 4171699.43631 872122.97877 4730017.68419 11.80802 48.17151 539.38122 1.18870 1.35265 14.79056 1.74910 0.02896 3.99771 8 0 8 2.00 -1999-Aug-27 09:09:26 4171700.04339 872122.73179 4730014.54631 11.80802 48.17149 537.40564 0.82272 -1.14515 12.81498 1.38312 -2.46884 2.02213 8 0 8 2.00 -1999-Aug-27 09:09:26 4171701.70405 872121.34926 4730016.74069 11.80799 48.17149 539.93616 -0.87037 -0.68214 15.34550 -0.30998 -2.00583 4.55265 8 0 8 2.00 -1999-Aug-27 09:09:26 4171700.49068 872120.89603 4730015.81358 11.80799 48.17149 538.39140 -1.06572 -0.34633 13.80075 -0.50533 -1.67001 3.00789 8 0 8 2.00 -1999-Aug-27 09:09:26 4171699.41637 872121.95778 4730019.48264 11.80801 48.17152 540.56897 0.19340 2.72227 15.97832 0.75380 1.39858 5.18546 8 0 8 2.00 -1999-Aug-27 09:09:27 4171696.45920 872121.56947 4730015.54654 11.80801 48.17152 535.65261 0.41844 2.31336 11.06195 0.97884 0.98968 0.26910 8 0 8 2.00 -1999-Aug-27 09:09:27 4171696.05996 872119.35928 4730012.55507 11.80798 48.17151 532.86128 -1.66328 0.94655 8.27063 -1.10289 -0.37714 -2.52223 8 0 8 2.00 -1999-Aug-27 09:09:27 4171697.99070 872119.45592 4730014.78302 11.80798 48.17151 535.79498 -1.96378 1.00941 11.20433 -1.40338 -0.31428 0.41147 8 0 8 2.00 -1999-Aug-27 09:09:27 4171696.46530 872117.33389 4730015.60471 11.80796 48.17152 535.12191 -3.72876 2.99355 10.53125 -3.16836 1.66987 -0.26161 8 0 8 2.00 -1999-Aug-27 09:09:27 4171697.96490 872118.64645 4730018.65970 11.80797 48.17153 538.55637 -2.75084 3.73702 13.96571 -2.19044 2.41334 3.17285 8 0 8 2.00 -1999-Aug-27 09:09:27 4171696.15191 872118.71406 4730015.46478 11.80797 48.17152 535.00141 -2.31366 2.91836 10.41075 -1.75327 1.59467 -0.38210 8 0 8 2.00 -1999-Aug-27 09:09:27 4171695.06855 872119.28133 4730013.36696 11.80798 48.17152 532.80844 -1.53671 2.22300 8.21779 -0.97631 0.89931 -2.57507 8 0 8 2.00 -1999-Aug-27 09:09:27 4171694.93976 872119.04421 4730012.44017 11.80798 48.17151 532.00141 -1.74245 1.73501 7.41076 -1.18206 0.41132 -3.38210 8 0 8 2.00 -1999-Aug-27 09:09:27 4171693.96270 872120.09494 4730011.79726 11.80800 48.17151 531.02793 -0.51402 1.85868 6.43728 0.04637 0.53500 -4.35558 8 0 8 2.00 -1999-Aug-27 09:09:27 4171695.67092 872120.01580 4730015.35043 11.80799 48.17152 534.77987 -0.94104 2.99443 10.18921 -0.38064 1.67075 -0.60365 8 0 8 2.00 -1999-Aug-27 09:09:27 4171695.51089 872119.89420 4730015.16401 11.80799 48.17152 534.51989 -1.02733 3.00537 9.92924 -0.46693 1.68168 -0.86362 8 0 8 2.00 -1999-Aug-27 09:09:27 4171698.79940 872119.96533 4730016.72082 11.80798 48.17151 537.83636 -1.63064 1.63421 13.24570 -1.07024 0.31052 2.45284 8 0 8 2.00 -1999-Aug-27 09:09:27 4171696.28314 872120.13448 4730013.15202 11.80799 48.17151 533.55758 -0.95015 1.06367 8.96693 -0.38976 -0.26001 -1.82593 8 0 8 2.00 -1999-Aug-27 09:09:27 4171696.37664 872120.81522 4730012.71253 11.80800 48.17150 533.38403 -0.30296 0.59858 8.79338 0.25744 -0.72511 -1.99948 8 0 8 2.00 -1999-Aug-27 09:09:27 4171698.21921 872121.44258 4730014.95401 11.80800 48.17150 536.34269 -0.06592 0.65384 11.75203 0.49448 -0.66984 0.95917 8 0 8 2.00 -1999-Aug-27 09:09:27 4171697.67009 872121.57648 4730015.44628 11.80801 48.17151 536.36931 0.17752 1.36224 11.77865 0.73792 0.03855 0.98580 8 0 8 2.00 -1999-Aug-27 09:09:27 4171696.21850 872123.88290 4730015.26992 11.80804 48.17152 535.60507 2.73217 1.95169 11.01441 3.29257 0.62800 0.22156 8 0 8 2.00 -1999-Aug-27 09:09:27 4171693.60003 872122.60285 4730013.26021 11.80803 48.17152 532.22354 2.01503 2.71644 7.63289 2.57543 1.39275 -3.15997 8 0 8 2.00 -1999-Aug-27 09:09:27 4171696.14842 872121.04628 4730016.20840 11.80801 48.17153 535.87151 -0.03009 3.06121 11.28086 0.53031 1.73752 0.48800 8 0 8 2.00 -1999-Aug-27 09:09:27 4171697.47505 872120.07692 4730012.68315 11.80799 48.17150 533.97842 -1.25040 -0.10959 9.38777 -0.69000 -1.43328 -1.40509 8 0 8 2.00 -1999-Aug-27 09:09:27 4171702.50503 872120.68762 4730016.92825 11.80798 48.17149 540.50850 -1.68192 -1.04039 15.91784 -1.12152 -2.36408 5.12498 8 0 8 2.00 -1999-Aug-27 09:09:27 4171698.63401 872120.95423 4730016.25924 11.80800 48.17151 537.51940 -0.62882 1.29623 12.92874 -0.06842 -0.02746 2.13589 8 0 8 2.00 -1999-Aug-27 09:09:27 4171701.02259 872119.93443 4730017.69381 11.80798 48.17150 540.00843 -2.11581 0.66627 15.41778 -1.55542 -0.65742 4.62492 8 0 8 2.00 -1999-Aug-27 09:09:27 4171699.32600 872119.42852 4730013.73535 11.80798 48.17149 535.88225 -2.26385 -0.65904 11.29160 -1.70345 -1.98273 0.49874 8 0 8 2.00 -1999-Aug-27 09:09:27 4171698.68327 872120.18889 4730015.34896 11.80799 48.17150 536.76883 -1.38804 0.76992 12.17817 -0.82764 -0.55376 1.38531 8 0 8 2.00 -1999-Aug-27 09:09:28 4171697.81165 872120.76137 4730018.39320 11.80800 48.17153 538.54636 -0.64931 3.34859 13.95571 -0.08891 2.02490 3.16285 8 0 8 2.00 -1999-Aug-27 09:09:28 4171700.60618 872121.04086 4730021.54642 11.80799 48.17153 542.75835 -0.94759 3.37060 18.16769 -0.38720 2.04691 7.37484 8 0 8 2.00 -1999-Aug-27 09:09:28 4171696.55047 872120.56249 4730016.21715 11.80800 48.17152 536.07446 -0.58591 2.84757 11.48381 -0.02551 1.52388 0.69095 8 0 8 2.00 -1999-Aug-27 09:09:28 4171694.77522 872120.24503 4730015.14350 11.80800 48.17153 534.07225 -0.53337 3.47478 9.48160 0.02702 2.15109 -1.31126 8 0 8 2.00 -1999-Aug-27 09:09:28 4171696.01890 872119.72846 4730014.84175 11.80799 48.17152 534.58876 -1.29351 2.44520 9.99811 -0.73311 1.12152 -0.79475 8 0 8 2.00 -1999-Aug-27 09:09:28 4171692.69495 872118.97234 4730011.15892 11.80799 48.17152 529.57150 -1.35344 2.52881 4.98084 -0.79304 1.20512 -5.81202 8 0 8 2.00 -1999-Aug-27 09:09:28 4171692.84649 872118.15827 4730012.32221 11.80798 48.17153 530.42615 -2.18130 3.31822 5.83549 -1.62090 1.99453 -4.95736 8 0 8 2.00 -1999-Aug-27 09:09:28 4171696.33167 872118.55329 4730012.19501 11.80797 48.17150 532.66036 -2.50781 0.63114 8.06970 -1.94742 -0.69254 -2.72315 8 0 8 2.00 -1999-Aug-27 09:09:28 4171695.04953 872118.10498 4730012.07460 11.80797 48.17151 531.67249 -2.68428 1.55437 7.08184 -2.12388 0.23068 -3.71102 8 0 8 2.00 -1999-Aug-27 09:09:28 4171699.57214 872119.16545 4730015.97531 11.80797 48.17150 537.67612 -2.57171 0.69537 13.08547 -2.01132 -0.62831 2.29261 8 0 8 2.00 -1999-Aug-27 09:09:28 4171695.58995 872119.68773 4730014.33659 11.80799 48.17152 533.92678 -1.24560 2.42738 9.33613 -0.68520 1.10370 -1.45673 8 0 8 2.00 -1999-Aug-27 09:09:28 4171697.64843 872119.82537 4730015.04305 11.80799 48.17151 535.81574 -1.53211 1.37613 11.22508 -0.97171 0.05245 0.43223 8 0 8 2.00 -1999-Aug-27 09:09:28 4171701.31873 872121.92283 4730014.67684 11.80800 48.17148 538.22503 -0.23009 -1.86494 13.63438 0.33030 -3.18863 2.84152 8 0 8 2.00 -1999-Aug-27 09:09:28 4171698.23280 872121.40446 4730011.13211 11.80800 48.17148 533.49849 -0.10601 -1.89910 8.90784 0.45438 -3.22278 -1.88502 8 0 8 2.00 -1999-Aug-27 09:09:28 4171694.48574 872121.28277 4730010.63185 11.80801 48.17150 530.66307 0.54164 0.51885 6.07241 1.10204 -0.80483 -4.72045 8 0 8 2.00 -1999-Aug-27 09:09:28 4171696.98661 872121.61651 4730012.85476 11.80801 48.17150 533.99754 0.35656 0.12635 9.40689 0.91696 -1.19733 -1.38597 8 0 8 2.00 -1999-Aug-27 09:09:28 4171694.55711 872118.29822 4730012.32549 11.80797 48.17152 531.56436 -2.39436 2.05138 6.97371 -1.83396 0.72769 -3.81915 8 0 8 2.00 -1999-Aug-27 09:09:28 4171697.21519 872118.78904 4730014.14288 11.80797 48.17151 534.72073 -2.45785 1.24983 10.13008 -1.89746 -0.07386 -0.66278 8 0 8 2.00 -1999-Aug-27 09:09:28 4171698.48884 872120.82997 4730014.59317 11.80800 48.17150 536.16621 -0.72074 0.30995 11.57556 -0.16034 -1.01374 0.78270 8 0 8 2.00 -1999-Aug-27 09:09:28 4171697.02598 872120.55191 4730014.79281 11.80800 48.17151 535.32210 -0.69357 1.55246 10.73144 -0.13317 0.22878 -0.06142 8 0 8 2.00 -1999-Aug-27 09:09:28 4171700.54880 872121.67153 4730015.83830 11.80800 48.17149 538.55359 -0.31852 -0.49048 13.96294 0.24187 -1.81416 3.17008 8 0 8 2.00 -1999-Aug-27 09:09:28 4171696.20338 872119.55454 4730013.78848 11.80799 48.17151 533.90062 -1.50150 1.63473 9.30996 -0.94110 0.31105 -1.48289 8 0 8 2.00 -1999-Aug-27 09:09:28 4171691.21962 872118.09963 4730010.26796 11.80798 48.17153 527.82542 -1.90578 3.14377 3.23476 -1.34538 1.82008 -7.55809 8 0 8 2.00 -1999-Aug-27 09:09:28 4171692.95673 872120.63511 4730013.86484 11.80801 48.17153 531.98560 0.22058 3.88892 7.39494 0.78097 2.56524 -3.39791 8 0 8 2.00 -1999-Aug-27 09:09:28 4171694.66149 872120.50710 4730012.95803 11.80800 48.17152 532.40528 -0.25358 2.06027 7.81463 0.30682 0.73659 -2.97823 8 0 8 2.00 -1999-Aug-27 09:09:29 4171693.61758 872120.41291 4730015.09486 11.80800 48.17154 533.30322 -0.13215 4.26110 8.71257 0.42824 2.93742 -2.08029 8 0 8 2.00 -1999-Aug-27 09:09:29 4171697.51818 872120.61940 4730014.24136 11.80800 48.17151 535.24169 -0.72823 0.81540 10.65104 -0.16783 -0.50828 -0.14182 8 0 8 2.00 -1999-Aug-27 09:09:29 4171697.58106 872119.94106 4730013.36511 11.80799 48.17150 534.53723 -1.40508 0.28861 9.94658 -0.84468 -1.03508 -0.84628 8 0 8 2.00 -1999-Aug-27 09:09:29 4171696.05111 872121.86420 4730014.46920 11.80802 48.17151 534.62366 0.79044 1.84759 10.03300 1.35084 0.52390 -0.75986 8 0 8 2.00 -1999-Aug-27 09:09:29 4171695.85753 872121.21044 4730014.27483 11.80801 48.17152 534.26324 0.19013 1.95885 9.67259 0.75052 0.63516 -1.12027 8 0 8 2.00 -1999-Aug-27 09:09:29 4171692.62293 872118.65308 4730013.37197 11.80798 48.17153 531.12995 -1.65121 4.10591 6.53930 -1.09081 2.78223 -4.25356 8 0 8 2.00 -1999-Aug-27 09:09:29 4171695.36568 872119.93707 4730017.84636 11.80799 48.17154 536.42969 -0.95565 4.89362 11.83903 -0.39525 3.56993 1.04617 8 0 8 2.00 -1999-Aug-27 09:09:29 4171697.22642 872118.70625 4730016.93136 11.80797 48.17153 536.79459 -2.54118 3.11390 12.20394 -1.98079 1.79022 1.41108 8 0 8 2.00 -1999-Aug-27 09:09:29 4171695.95607 872119.34787 4730015.31159 11.80798 48.17152 534.84592 -1.65319 2.86240 10.25526 -1.09280 1.53871 -0.53759 8 0 8 2.00 -1999-Aug-27 09:09:29 4171698.15542 872121.46849 4730016.73285 11.80801 48.17151 537.63008 -0.02751 1.88273 13.03942 0.53289 0.55905 2.24657 8 0 8 2.00 -1999-Aug-27 09:09:29 4171701.43723 872124.23937 4730020.38486 11.80803 48.17151 542.87182 2.01317 1.50209 18.28117 2.57357 0.17840 7.48831 8 0 8 2.00 -1999-Aug-27 09:09:29 4171700.96003 872124.10109 4730019.91533 11.80803 48.17151 542.19158 1.97547 1.55810 17.60092 2.53587 0.23442 6.80807 8 0 8 2.00 -1999-Aug-27 09:09:29 4171702.38031 872123.37573 4730020.69746 11.80802 48.17151 543.60253 0.97482 1.15439 19.01187 1.53522 -0.16930 8.21901 8 0 8 2.00 -1999-Aug-27 09:09:29 4171698.58910 872122.10236 4730016.36782 11.80801 48.17151 537.72768 0.50421 1.22632 13.13702 1.06460 -0.09737 2.34417 8 0 8 2.00 -1999-Aug-27 09:09:29 4171696.50006 872121.11585 4730014.25520 11.80801 48.17151 534.65514 -0.03394 1.49153 10.06448 0.52646 0.16784 -0.72837 8 0 8 2.00 -1999-Aug-27 09:09:29 4171693.65296 872119.99769 4730013.74967 11.80800 48.17153 532.26729 -0.54583 3.40149 7.67664 0.01457 2.07781 -3.11622 8 0 8 2.00 -1999-Aug-27 09:09:29 4171696.20766 872122.53795 4730015.28874 11.80802 48.17152 535.42847 1.41790 2.17723 10.83782 1.97829 0.85355 0.04496 8 0 8 2.00 -1999-Aug-27 09:09:29 4171696.57512 872120.04048 4730014.10466 11.80799 48.17151 534.44520 -1.10192 1.50036 9.85455 -0.54152 0.17667 -0.93831 8 0 8 2.00 -1999-Aug-27 09:09:29 4171697.90060 872120.73898 4730015.98371 11.80800 48.17151 536.80596 -0.68943 1.68023 12.21530 -0.12903 0.35654 1.42245 8 0 8 2.00 -1999-Aug-27 09:09:29 4171700.46014 872120.72117 4730014.75355 11.80799 48.17149 537.55772 -1.23063 -1.00433 12.96707 -0.67023 -2.32801 2.17421 8 0 8 2.00 -1999-Aug-27 09:09:29 4171700.57415 872121.85123 4730013.63979 11.80800 48.17148 536.95645 -0.14781 -2.00256 12.36580 0.41258 -3.32625 1.57294 8 0 8 2.00 -1999-Aug-27 09:09:29 4171699.25826 872121.05627 4730015.58189 11.80800 48.17150 537.43611 -0.65668 0.37363 12.84546 -0.09628 -0.95006 2.05260 8 0 8 2.00 -1999-Aug-27 09:09:29 4171695.72956 872121.47831 4730013.70623 11.80801 48.17151 533.79256 0.47852 1.63214 9.20191 1.03891 0.30845 -1.59095 8 0 8 2.00 -1999-Aug-27 09:09:29 4171694.17733 872120.59947 4730012.70734 11.80800 48.17152 531.91503 -0.06409 2.23214 7.32438 0.49631 0.90846 -3.46848 8 0 8 2.00 -1999-Aug-27 09:09:29 4171696.88305 872121.03559 4730013.59697 11.80800 48.17150 534.40372 -0.19087 0.78544 9.81306 0.36952 -0.53824 -0.97979 8 0 8 2.00 -1999-Aug-27 09:09:30 4171701.64269 872122.38415 4730015.59587 11.80801 48.17148 539.18428 0.15517 -1.55868 14.59363 0.71557 -2.88236 3.80077 8 0 8 2.00 -1999-Aug-27 09:09:30 4171699.24056 872122.70098 4730014.06409 11.80802 48.17149 536.51803 0.95685 -0.87648 11.92737 1.51725 -2.20016 1.13452 8 0 8 2.00 -1999-Aug-27 09:09:30 4171694.70063 872121.52782 4730015.74840 11.80802 48.17153 534.64936 0.73753 3.73700 10.05871 1.29793 2.41331 -0.73415 8 0 8 2.00 -1999-Aug-27 09:09:30 4171694.29301 872120.14778 4730015.58621 11.80800 48.17153 534.07408 -0.52989 4.13657 9.48342 0.03050 2.81289 -1.30943 8 0 8 2.00 -1999-Aug-27 09:09:30 4171696.63353 872120.91509 4730013.77828 11.80800 48.17151 534.35949 -0.25777 1.10673 9.76884 0.30263 -0.21695 -1.02402 8 0 8 2.00 -1999-Aug-27 09:09:30 4171697.17595 872121.12871 4730014.31358 11.80800 48.17151 535.14161 -0.15966 1.03552 10.55095 0.40074 -0.28816 -0.24190 8 0 8 2.00 -1999-Aug-27 09:09:30 4171695.34992 872121.92875 4730013.10972 11.80802 48.17151 533.16173 0.99712 1.44254 8.57107 1.55751 0.11885 -2.22178 8 0 8 2.00 -1999-Aug-27 09:09:30 4171697.38489 872122.19903 4730014.86162 11.80802 48.17151 535.83244 0.84525 1.08542 11.24179 1.40565 -0.23827 0.44893 8 0 8 2.00 -1999-Aug-27 09:09:30 4171699.23888 872121.79720 4730017.57226 11.80801 48.17151 539.00769 0.07254 1.60216 14.41703 0.63294 0.27848 3.62418 8 0 8 2.00 -1999-Aug-27 09:09:30 4171699.17776 872120.17996 4730017.82589 11.80799 48.17152 538.93608 -1.49797 2.06249 14.34542 -0.93758 0.73881 3.55257 8 0 8 2.00 -1999-Aug-27 09:09:30 4171695.51540 872119.58019 4730016.51864 11.80799 48.17153 535.48938 -1.33561 3.95337 10.89872 -0.77521 2.62968 0.10587 8 0 8 2.00 -1999-Aug-27 09:09:30 4171697.54801 872120.21206 4730019.09315 11.80799 48.17153 538.82086 -1.13305 4.09143 14.23021 -0.57265 2.76775 3.43735 8 0 8 2.00 -1999-Aug-27 09:09:30 4171696.67689 872119.21265 4730015.34537 11.80798 48.17152 535.32317 -1.93305 2.37980 10.73252 -1.37265 1.05611 -0.06034 8 0 8 2.00 -1999-Aug-27 09:09:30 4171692.89505 872118.40925 4730012.50340 11.80798 48.17153 530.62711 -1.94556 3.36536 6.03645 -1.38516 2.04168 -4.75641 8 0 8 2.00 -1999-Aug-27 09:09:30 4171695.08675 872118.05343 4730010.81661 11.80797 48.17150 530.75237 -2.74235 0.69612 6.16171 -2.18195 -0.62756 -4.63115 8 0 8 2.00 -1999-Aug-27 09:09:30 4171696.36912 872120.50320 4730015.79200 11.80800 48.17152 535.63119 -0.60683 2.70535 11.04054 -0.04643 1.38167 0.24768 8 0 8 2.00 -1999-Aug-27 09:09:30 4171701.01218 872121.86039 4730021.49231 11.80800 48.17152 543.09490 -0.22848 2.91342 18.50425 0.33192 1.58973 7.71139 8 0 8 2.00 -1999-Aug-27 09:09:30 4171697.22442 872119.82387 4730017.16852 11.80799 48.17153 537.12252 -1.44681 3.10311 12.53186 -0.88641 1.77942 1.73900 8 0 8 2.00 -1999-Aug-27 09:09:30 4171700.43027 872121.72800 4730016.55302 11.80800 48.17150 539.01649 -0.23899 0.06401 14.42583 0.32140 -1.25967 3.63298 8 0 8 2.00 -1999-Aug-27 09:09:30 4171699.07333 872122.59923 4730019.15486 11.80802 48.17152 540.18834 0.89148 2.65606 15.59768 1.45187 1.33238 4.80483 8 0 8 2.00 -1999-Aug-27 09:09:30 4171692.73917 872121.47573 4730015.60356 11.80802 48.17154 533.25390 1.08792 5.07898 8.66325 1.64832 3.75530 -2.12961 8 0 8 2.00 -1999-Aug-27 09:09:30 4171692.60237 872120.97868 4730015.80892 11.80801 48.17155 533.24979 0.62938 5.39151 8.65914 1.18978 4.06782 -2.13372 8 0 8 2.00 -1999-Aug-27 09:09:30 4171690.60725 872121.56083 4730013.58654 11.80803 48.17155 530.37085 1.60749 5.27582 5.78019 2.16788 3.95213 -5.01267 8 0 8 2.00 -1999-Aug-27 09:09:30 4171688.60919 872119.24947 4730009.20002 11.80800 48.17154 525.48251 -0.24610 4.16022 0.89185 0.31430 2.83654 -9.90101 8 0 8 2.00 -1999-Aug-27 09:09:30 4171692.56569 872119.97236 4730012.02702 11.80800 48.17153 530.27045 -0.34813 3.04954 5.67980 0.21227 1.72586 -5.11306 8 0 8 2.00 -1999-Aug-27 09:09:31 4171697.72143 872120.52088 4730014.62973 11.80799 48.17151 535.65032 -0.86626 0.94119 11.05966 -0.30586 -0.38250 0.26681 8 0 8 2.00 -1999-Aug-27 09:09:31 4171701.15804 872120.80975 4730014.24601 11.80799 48.17148 537.64720 -1.28674 -1.86534 13.05655 -0.72634 -3.18903 2.26369 8 0 8 2.00 -1999-Aug-27 09:09:31 4171697.07844 872119.06255 4730011.97287 11.80798 48.17150 533.05182 -2.16215 -0.13933 8.46117 -1.60175 -1.46301 -2.33169 8 0 8 2.00 -1999-Aug-27 09:09:31 4171695.66382 872119.86198 4730011.95801 11.80799 48.17150 532.22639 -1.09016 0.76066 7.63574 -0.52976 -0.56303 -3.15712 8 0 8 2.00 -1999-Aug-27 09:09:31 4171696.86800 872120.08411 4730012.87469 11.80799 48.17150 533.72584 -1.11914 0.45982 9.13519 -0.55874 -0.86387 -1.65767 8 0 8 2.00 -1999-Aug-27 09:09:31 4171693.62714 872120.05147 4730011.93252 11.80800 48.17152 530.90373 -0.48790 2.20027 6.31308 0.07249 0.87658 -4.47978 8 0 8 2.00 -1999-Aug-27 09:09:31 4171696.07608 872122.50109 4730014.29490 11.80802 48.17151 534.59699 1.40875 1.61603 10.00634 1.96914 0.29234 -0.78652 8 0 8 2.00 -1999-Aug-27 09:09:31 4171697.83145 872122.55249 4730018.26177 11.80802 48.17152 538.70579 1.09985 2.97338 14.11513 1.66025 1.64969 3.32227 8 0 8 2.00 -1999-Aug-27 09:09:31 4171697.66400 872122.31454 4730017.84333 11.80802 48.17152 538.25221 0.90120 2.85274 13.66156 1.46160 1.52905 2.86870 8 0 8 2.00 -1999-Aug-27 09:09:31 4171695.66755 872122.91343 4730016.86073 11.80803 48.17153 536.29850 1.89596 3.56228 11.70785 2.45635 2.23860 0.91499 8 0 8 2.00 -1999-Aug-27 09:09:31 4171694.01567 872121.70181 4730015.01432 11.80802 48.17153 533.67897 1.04800 3.72050 9.08832 1.60840 2.39681 -1.70454 8 0 8 2.00 -1999-Aug-27 09:09:31 4171696.68720 872120.51201 4730018.08785 11.80800 48.17153 537.55077 -0.66330 4.00311 12.96012 -0.10290 2.67942 2.16726 8 0 8 2.00 -1999-Aug-27 09:09:31 4171698.63840 872120.13718 4730016.25562 11.80799 48.17151 537.40807 -1.42947 1.41519 12.81741 -0.86908 0.09150 2.02456 8 0 8 2.00 -1999-Aug-27 09:09:31 4171694.42403 872119.46304 4730014.68014 11.80799 48.17153 533.39101 -1.22695 3.54116 8.80035 -0.66656 2.21747 -1.99250 8 0 8 2.00 -1999-Aug-27 09:09:31 4171696.14758 872119.90882 4730014.70763 11.80799 48.17152 534.59745 -1.14330 2.23440 10.00679 -0.58291 0.91071 -0.78607 8 0 8 2.00 -1999-Aug-27 09:09:31 4171696.38179 872119.79404 4730013.91005 11.80799 48.17151 534.14036 -1.30358 1.54916 9.54971 -0.74318 0.22547 -1.24315 8 0 8 2.00 -1999-Aug-27 09:09:31 4171696.71602 872119.75736 4730013.90662 11.80799 48.17151 534.35098 -1.40788 1.30869 9.76033 -0.84748 -0.01499 -1.03253 8 0 8 2.00 -1999-Aug-27 09:09:31 4171695.07836 872119.44341 4730012.17439 11.80799 48.17151 531.94832 -1.38007 1.39580 7.35767 -0.81967 0.07211 -3.43519 8 0 8 2.00 -1999-Aug-27 09:09:31 4171698.26005 872119.83954 4730014.42735 11.80798 48.17150 535.75814 -1.64340 0.51726 11.16748 -1.08300 -0.80643 0.37462 8 0 8 2.00 -1999-Aug-27 09:09:31 4171700.50436 872121.49937 4730016.69636 11.80800 48.17150 539.14046 -0.47795 0.14043 14.54981 0.08244 -1.18326 3.75695 8 0 8 2.00 -1999-Aug-27 09:09:31 4171696.76335 872122.03322 4730017.33534 11.80802 48.17153 537.24735 0.81014 3.21377 12.65670 1.37053 1.89008 1.86384 8 0 8 2.00 -1999-Aug-27 09:09:31 4171695.66942 872122.27058 4730016.34227 11.80802 48.17153 535.82566 1.26632 3.31318 11.23501 1.82672 1.98949 0.44215 8 0 8 2.00 -1999-Aug-27 09:09:31 4171695.55052 872121.58596 4730017.65062 11.80801 48.17154 536.62952 0.62052 4.37684 12.03887 1.18092 3.05315 1.24601 8 0 8 2.00 -1999-Aug-27 09:09:31 4171695.18186 872121.93718 4730018.07277 11.80802 48.17154 536.75136 1.03975 4.87370 12.16070 1.60015 3.55002 1.36785 8 0 8 2.00 -1999-Aug-27 09:09:31 4171696.97378 872121.52652 4730016.88373 11.80801 48.17152 536.97906 0.27110 2.83636 12.38840 0.83150 1.51267 1.59554 8 0 8 2.00 -1999-Aug-27 09:09:32 4171697.21127 872121.30171 4730016.57533 11.80801 48.17152 536.87361 0.00245 2.49176 12.28295 0.56285 1.16807 1.49010 8 0 8 2.00 -1999-Aug-27 09:09:32 4171702.00213 872121.22742 4730019.01515 11.80799 48.17150 541.80891 -1.05063 0.63586 17.21826 -0.49024 -0.68783 6.42540 8 0 8 2.00 -1999-Aug-27 09:09:32 4171699.91229 872119.79111 4730017.20794 11.80798 48.17151 538.90204 -2.02890 1.17393 14.31138 -1.46850 -0.14976 3.51853 8 0 8 2.00 -1999-Aug-27 09:09:32 4171696.78514 872120.07854 4730012.13567 11.80799 48.17150 533.12032 -1.10764 0.02825 8.52967 -0.54724 -1.29543 -2.26319 8 0 8 2.00 -1999-Aug-27 09:09:32 4171694.50918 872121.14374 4730010.13249 11.80801 48.17150 530.28730 0.40075 0.18993 5.69665 0.96115 -1.13376 -5.09621 8 0 8 2.00 -1999-Aug-27 09:09:32 4171690.82123 872120.15686 4730008.30173 11.80801 48.17151 526.38098 0.18943 1.80937 1.79033 0.74983 0.48569 -9.00253 8 0 8 2.00 -1999-Aug-27 09:09:32 4171694.96114 872121.10898 4730011.62040 11.80801 48.17151 531.68630 0.27424 0.85787 7.09565 0.83464 -0.46581 -3.69721 8 0 8 2.00 -1999-Aug-27 09:09:32 4171693.94699 872121.56118 4730011.79999 11.80802 48.17151 531.21980 0.92441 1.64839 6.62915 1.48480 0.32470 -4.16371 8 0 8 2.00 -1999-Aug-27 09:09:32 4171692.86553 872120.49465 4730012.77481 11.80801 48.17153 531.09467 0.10175 3.24991 6.50401 0.66215 1.92623 -4.28884 8 0 8 2.00 -1999-Aug-27 09:09:32 4171695.47049 872120.50442 4730012.46803 11.80800 48.17151 532.56791 -0.42175 1.14383 7.97725 0.13865 -0.17985 -2.81560 8 0 8 2.00 -1999-Aug-27 09:09:32 4171696.65905 872120.46183 4730013.36098 11.80800 48.17151 534.00335 -0.70666 0.87893 9.41269 -0.14626 -0.44475 -1.38017 8 0 8 2.00 -1999-Aug-27 09:09:32 4171699.24414 872120.41123 4730013.99637 11.80799 48.17149 536.15743 -1.28518 -0.57511 11.56677 -0.72478 -1.89879 0.77392 8 0 8 2.00 -1999-Aug-27 09:09:32 4171698.00759 872120.14192 4730013.39024 11.80799 48.17150 534.86181 -1.29575 -0.03636 10.27115 -0.73535 -1.36004 -0.52171 8 0 8 2.00 -1999-Aug-27 09:09:32 4171698.83099 872120.17939 4730014.34490 11.80799 48.17150 536.11579 -1.42757 -0.00598 11.52513 -0.86717 -1.32966 0.73227 8 0 8 2.00 -1999-Aug-27 09:09:32 4171701.98181 872119.91313 4730015.72577 11.80797 48.17149 539.16523 -2.33295 -1.34260 14.57457 -1.77255 -2.66629 3.78172 8 0 8 2.00 -1999-Aug-27 09:09:32 4171694.15948 872119.82836 4730013.69402 11.80799 48.17152 532.53337 -0.81522 3.02076 7.94271 -0.25483 1.69708 -2.85015 8 0 8 2.00 -1999-Aug-27 09:09:32 4171698.92632 872119.53374 4730014.11297 11.80798 48.17150 535.91709 -2.07906 -0.13174 11.32643 -1.51866 -1.45543 0.53358 8 0 8 2.00 -1999-Aug-27 09:09:32 4171698.76445 872120.87921 4730014.03623 11.80800 48.17150 535.93785 -0.72894 -0.27001 11.34720 -0.16854 -1.59370 0.55434 8 0 8 2.00 -1999-Aug-27 09:09:32 4171696.84013 872122.10972 4730015.42929 11.80802 48.17151 535.88764 0.86931 1.87495 11.29698 1.42970 0.55127 0.50413 8 0 8 2.00 -1999-Aug-27 09:09:32 4171694.69114 872121.20485 4730013.63208 11.80801 48.17152 533.02213 0.42334 2.38178 8.43147 0.98373 1.05810 -2.36139 8 0 8 2.00 -1999-Aug-27 09:09:32 4171693.53303 872121.67741 4730014.34000 11.80802 48.17153 532.85811 1.12288 3.62654 8.26745 1.68328 2.30285 -2.52540 8 0 8 2.00 -1999-Aug-27 09:09:32 4171693.42338 872120.81205 4730013.56786 11.80801 48.17153 532.09308 0.29827 3.32353 7.50242 0.85867 1.99984 -3.29044 8 0 8 2.00 -1999-Aug-27 09:09:32 4171697.62425 872121.90305 4730015.77275 11.80801 48.17151 536.62722 0.50656 1.56360 12.03657 1.06695 0.23992 1.24371 8 0 8 2.00 -1999-Aug-27 09:09:32 4171699.26241 872121.29853 4730015.65849 11.80800 48.17150 537.52896 -0.42039 0.38475 12.93831 0.14001 -0.93894 2.14545 8 0 8 2.00 -1999-Aug-27 09:09:32 4171697.72917 872119.77985 4730013.72279 11.80798 48.17150 534.87844 -1.59319 0.44370 10.28779 -1.03279 -0.87999 -0.50507 8 0 8 2.00 -1999-Aug-27 09:09:33 4171699.42492 872118.90979 4730012.88667 11.80797 48.17149 535.24365 -2.79184 -1.21809 10.65300 -2.23144 -2.54177 -0.13986 8 0 8 2.00 -1999-Aug-27 09:09:33 4171697.62183 872120.39743 4730015.52709 11.80799 48.17151 536.23712 -0.96671 1.63111 11.64647 -0.40632 0.30743 0.85361 8 0 8 2.00 -1999-Aug-27 09:09:33 4171699.40322 872121.44393 4730018.48316 11.80800 48.17152 539.74551 -0.30688 2.14365 15.15486 0.25352 0.81997 4.36200 8 0 8 2.00 -1999-Aug-27 09:09:33 4171696.50861 872119.38235 4730016.40788 11.80798 48.17153 536.02821 -1.73251 3.18525 11.43755 -1.17211 1.86156 0.64470 8 0 8 2.00 -1999-Aug-27 09:09:33 4171696.11959 872120.27620 4730014.58602 11.80800 48.17152 534.53869 -0.77796 2.11769 9.94804 -0.21757 0.79400 -0.84482 8 0 8 2.00 -1999-Aug-27 09:09:33 4171696.40658 872120.88844 4730013.44628 11.80800 48.17151 533.96032 -0.23741 1.05491 9.36966 0.32299 -0.26877 -1.42319 8 0 8 2.00 -1999-Aug-27 09:09:33 4171699.03437 872121.01847 4730014.50770 11.80800 48.17150 536.48437 -0.64786 -0.17369 11.89371 -0.08746 -1.49738 1.10086 8 0 8 2.00 -1999-Aug-27 09:09:33 4171698.43446 872119.72760 4730014.16714 11.80798 48.17150 535.66283 -1.78866 0.23358 11.07217 -1.22826 -1.09011 0.27932 8 0 8 2.00 -1999-Aug-27 09:09:33 4171696.15422 872119.94071 4730014.97729 11.80799 48.17152 534.80707 -1.11344 2.40453 10.21642 -0.55305 1.08084 -0.57644 8 0 8 2.00 -1999-Aug-27 09:09:33 4171698.66145 872119.94665 4730016.04554 11.80798 48.17151 537.24057 -1.62069 1.28733 12.64991 -1.06029 -0.03636 1.85706 8 0 8 2.00 -1999-Aug-27 09:09:33 4171696.09688 872119.97978 4730016.50487 11.80799 48.17153 535.91324 -1.06346 3.45914 11.32258 -0.50307 2.13546 0.52973 8 0 8 2.00 -1999-Aug-27 09:09:33 4171697.51299 872119.10364 4730016.67140 11.80798 48.17152 536.84218 -2.21085 2.67092 12.25152 -1.65046 1.34723 1.45866 8 0 8 2.00 -1999-Aug-27 09:09:33 4171698.41183 872119.91092 4730016.51625 11.80798 48.17151 537.42350 -1.60458 1.78876 12.83284 -1.04419 0.46508 2.03999 8 0 8 2.00 -1999-Aug-27 09:09:33 4171698.25962 872119.88862 4730014.19551 11.80798 48.17150 535.59180 -1.59526 0.35547 11.00115 -1.03486 -0.96821 0.20829 8 0 8 2.00 -1999-Aug-27 09:09:33 4171697.02705 872120.28396 4730012.93128 11.80799 48.17150 533.89911 -0.95607 0.35108 9.30846 -0.39567 -0.97260 -1.48440 8 0 8 2.00 -1999-Aug-27 09:09:33 4171695.25583 872120.07197 4730015.60515 11.80799 48.17153 534.70636 -0.80112 3.45850 10.11571 -0.24072 2.13482 -0.67715 8 0 8 2.00 -1999-Aug-27 09:09:33 4171696.28938 872121.51344 4730014.75455 11.80801 48.17151 534.94396 0.39835 1.91759 10.35330 0.95874 0.59390 -0.43955 8 0 8 2.00 -1999-Aug-27 09:09:33 4171695.16030 872120.62723 4730011.53066 11.80800 48.17150 531.68370 -0.23806 0.72622 7.09304 0.32234 -0.59746 -3.69982 8 0 8 2.00 -1999-Aug-27 09:09:33 4171695.02384 872120.64595 4730011.62648 11.80800 48.17151 531.66857 -0.19182 0.88680 7.07792 0.36858 -0.43688 -3.71494 8 0 8 2.00 -1999-Aug-27 09:09:33 4171696.91601 872120.80654 4730012.17926 11.80800 48.17150 533.33758 -0.42182 -0.14914 8.74692 0.13858 -1.47282 -2.04594 8 0 8 2.00 -1999-Aug-27 09:09:33 4171697.64558 872120.78756 4730015.07505 11.80800 48.17151 535.96903 -0.58970 1.25284 11.37837 -0.02930 -0.07085 0.58552 8 0 8 2.00 -1999-Aug-27 09:09:33 4171693.61085 872122.11651 4730014.53447 11.80803 48.17153 533.11374 1.53678 3.63252 8.52309 2.09717 2.30883 -2.26977 8 0 8 2.00 -1999-Aug-27 09:09:33 4171694.72678 872120.98541 4730013.18655 11.80801 48.17152 532.68346 0.20125 2.09212 8.09281 0.76165 0.76844 -2.70005 8 0 8 2.00 -1999-Aug-27 09:09:33 4171696.76980 872121.56196 4730014.40681 11.80801 48.17151 535.00507 0.34753 1.32788 10.41442 0.90793 0.00419 -0.37844 8 0 8 2.00 -1999-Aug-27 09:09:33 4171693.59671 872120.25449 4730013.51466 11.80800 48.17153 532.09050 -0.28296 3.24664 7.49985 0.27744 1.92295 -3.29301 8 0 8 2.00 -1999-Aug-27 09:09:34 4171699.28132 872120.50191 4730017.23875 11.80799 48.17151 538.61011 -1.20403 1.54630 14.01946 -0.64363 0.22262 3.22660 8 0 8 2.00 -1999-Aug-27 09:09:34 4171699.86172 872122.52524 4730018.26593 11.80801 48.17151 540.03051 0.65772 1.49948 15.43986 1.21812 0.17579 4.64700 8 0 8 2.00 -1999-Aug-27 09:09:34 4171701.12598 872120.55104 4730018.00306 11.80799 48.17150 540.39051 -1.53342 0.70308 15.79985 -0.97302 -0.62061 5.00700 8 0 8 2.00 -1999-Aug-27 09:09:34 4171708.37147 872121.90570 4730019.72723 11.80798 48.17146 546.58993 -1.69009 -3.63832 21.99927 -1.12969 -4.96200 11.20641 8 0 8 2.00 -1999-Aug-27 09:09:34 4171703.20144 872119.61693 4730019.04888 11.80797 48.17150 542.39717 -2.87247 0.02918 17.80651 -2.31207 -1.29450 7.01365 8 0 8 2.00 -1999-Aug-27 09:09:34 4171700.15044 872121.29836 4730016.95583 11.80800 48.17150 539.07533 -0.60228 0.60226 14.48468 -0.04188 -0.72143 3.69182 8 0 8 2.00 -1999-Aug-27 09:09:34 4171697.86516 872120.21669 4730011.43870 11.80799 48.17149 533.32486 -1.19342 -1.24537 8.73420 -0.63302 -2.56905 -2.05866 8 0 8 2.00 -1999-Aug-27 09:09:34 4171697.96791 872119.69143 4730013.95733 11.80798 48.17150 535.19699 -1.72859 0.43946 10.60634 -1.16820 -0.88422 -0.18652 8 0 8 2.00 -1999-Aug-27 09:09:34 4171698.80346 872121.07641 4730013.12718 11.80800 48.17149 535.31286 -0.54390 -0.93479 10.72220 0.01650 -2.25847 -0.07066 8 0 8 2.00 -1999-Aug-27 09:09:34 4171697.68479 872120.31293 4730015.46101 11.80799 48.17151 536.21745 -1.06230 1.55400 11.62680 -0.50191 0.23032 0.83394 8 0 8 2.00 -1999-Aug-27 09:09:34 4171698.08641 872121.24988 4730015.79887 11.80800 48.17151 536.85924 -0.22736 1.34353 12.26858 0.33303 0.01984 1.47572 8 0 8 2.00 -1999-Aug-27 09:09:34 4171696.75518 872120.52645 4730014.06298 11.80800 48.17151 534.59801 -0.66307 1.26714 10.00736 -0.10268 -0.05655 -0.78550 8 0 8 2.00 -1999-Aug-27 09:09:34 4171694.69008 872118.20352 4730012.43216 11.80797 48.17152 531.71773 -2.51426 2.03997 7.12707 -1.95386 0.71629 -3.66578 8 0 8 2.00 -1999-Aug-27 09:09:34 4171693.92961 872120.24470 4730013.62039 11.80800 48.17153 532.38526 -0.36065 3.07583 7.79461 0.19974 1.75215 -2.99825 8 0 8 2.00 -1999-Aug-27 09:09:34 4171693.22238 872120.36607 4730013.27242 11.80800 48.17153 531.68086 -0.09714 3.34110 7.09021 0.46326 2.01742 -3.70265 8 0 8 2.00 -1999-Aug-27 09:09:34 4171692.05442 872119.12393 4730014.20866 11.80799 48.17154 531.44655 -1.07399 5.00677 6.85590 -0.51359 3.68309 -3.93696 8 0 8 2.00 -1999-Aug-27 09:09:34 4171694.53114 872121.02153 4730015.22175 11.80801 48.17153 534.07719 0.27664 3.58659 9.48654 0.83703 2.26291 -1.30632 8 0 8 2.00 -1999-Aug-27 09:09:34 4171695.81222 872120.57806 4730015.25614 11.80800 48.17152 534.87858 -0.41960 2.74276 10.28792 0.14080 1.41908 -0.50493 8 0 8 2.00 -1999-Aug-27 09:09:34 4171698.06618 872121.46356 4730016.26816 11.80801 48.17151 537.22488 -0.01407 1.63867 12.63423 0.54633 0.31498 1.84137 8 0 8 2.00 -1999-Aug-27 09:09:34 4171699.01732 872119.70030 4730014.69030 11.80798 48.17150 536.42942 -1.93465 0.16151 11.83876 -1.37426 -1.16217 1.04591 8 0 8 2.00 -1999-Aug-27 09:09:34 4171699.82202 872121.16891 4730015.59563 11.80800 48.17150 537.82974 -0.66178 -0.04558 13.23909 -0.10139 -1.36927 2.44623 8 0 8 2.00 -1999-Aug-27 09:09:34 4171702.86784 872122.43685 4730017.59790 11.80801 48.17149 541.48304 -0.04395 -1.12515 16.89239 0.51645 -2.44883 6.09953 8 0 8 2.00 -1999-Aug-27 09:09:34 4171702.63297 872122.24502 4730015.66322 11.80800 48.17148 539.86193 -0.18366 -2.21483 15.27127 0.37674 -3.53852 4.47841 8 0 8 2.00 -1999-Aug-27 09:09:34 4171698.66254 872119.63600 4730012.37379 11.80798 48.17149 534.46291 -1.92499 -1.11480 9.87225 -1.36459 -2.43848 -0.92061 8 0 8 2.00 -1999-Aug-27 09:09:34 4171697.02897 872120.82942 4730013.20924 11.80800 48.17150 534.18193 -0.42254 0.45188 9.59128 0.13786 -0.87181 -1.20158 8 0 8 2.00 -1999-Aug-27 09:09:35 4171697.35413 872121.80375 4730013.32505 11.80801 48.17150 534.61345 0.46463 0.14338 10.02280 1.02502 -1.18031 -0.77006 8 0 8 2.00 -1999-Aug-27 09:09:35 4171696.44597 872120.61282 4730010.72912 11.80800 48.17149 531.92374 -0.51526 -0.74387 7.33308 0.04514 -2.06755 -3.45977 8 0 8 2.00 -1999-Aug-27 09:09:35 4171695.36594 872120.34733 4730010.99191 11.80800 48.17150 531.37829 -0.55412 0.25962 6.78763 0.00627 -1.06407 -4.00522 8 0 8 2.00 -1999-Aug-27 09:09:35 4171696.56324 872120.79878 4730013.25491 11.80800 48.17151 533.90775 -0.35723 0.82670 9.31709 0.20316 -0.49698 -1.47577 8 0 8 2.00 -1999-Aug-27 09:09:35 4171697.56720 872121.50942 4730014.70388 11.80801 48.17151 535.73980 0.13293 0.95240 11.14915 0.69332 -0.37128 0.35629 8 0 8 2.00 -1999-Aug-27 09:09:35 4171698.25006 872119.86835 4730015.70630 11.80798 48.17151 536.70856 -1.61315 1.37308 12.11790 -1.05275 0.04940 1.32504 8 0 8 2.00 -1999-Aug-27 09:09:35 4171697.47598 872118.83529 4730014.64227 11.80797 48.17151 535.26940 -2.46594 1.38560 10.67875 -1.90555 0.06191 -0.11411 8 0 8 2.00 -1999-Aug-27 09:09:35 4171697.04959 872118.55109 4730013.83247 11.80797 48.17151 534.34886 -2.65688 1.19987 9.75820 -2.09648 -0.12381 -1.03465 8 0 8 2.00 -1999-Aug-27 09:09:35 4171695.95069 872119.19402 4730015.53952 11.80798 48.17153 534.99125 -1.80269 3.04179 10.40059 -1.24229 1.71810 -0.39227 8 0 8 2.00 -1999-Aug-27 09:09:35 4171693.49292 872119.03925 4730013.07133 11.80799 48.17153 531.52655 -1.45124 3.21198 6.93590 -0.89084 1.88830 -3.85696 8 0 8 2.00 -1999-Aug-27 09:09:35 4171696.83615 872119.88164 4730015.95728 11.80799 48.17152 535.97439 -1.31081 2.56971 11.38374 -0.75041 1.24602 0.59088 8 0 8 2.00 -1999-Aug-27 09:09:35 4171699.58061 872121.46155 4730017.91961 11.80800 48.17151 539.44378 -0.32594 1.63574 14.85313 0.23446 0.31205 4.06027 8 0 8 2.00 -1999-Aug-27 09:09:35 4171699.45612 872122.39307 4730016.47007 11.80801 48.17150 538.40953 0.61135 0.61781 13.81887 1.17174 -0.70588 3.02602 8 0 8 2.00 -1999-Aug-27 09:09:35 4171697.32487 872121.59922 4730015.67403 11.80801 48.17151 536.31677 0.27042 1.76245 11.72611 0.83082 0.43877 0.93326 8 0 8 2.00 -1999-Aug-27 09:09:35 4171697.42957 872121.86201 4730016.07882 11.80801 48.17151 536.72260 0.50622 1.91597 12.13194 1.06662 0.59229 1.33908 8 0 8 2.00 -1999-Aug-27 09:09:35 4171700.22852 872122.23658 4730017.06909 11.80801 48.17150 539.33874 0.30011 0.47778 14.74809 0.86050 -0.84590 3.95523 8 0 8 2.00 -1999-Aug-27 09:09:35 4171696.45064 872119.53000 4730015.17631 11.80798 48.17152 535.09282 -1.57612 2.38368 10.50216 -1.01572 1.06000 -0.29070 8 0 8 2.00 -1999-Aug-27 09:09:35 4171696.00356 872120.28397 4730014.02726 11.80800 48.17151 534.04766 -0.74662 1.82850 9.45700 -0.18622 0.50481 -1.33586 8 0 8 2.00 -1999-Aug-27 09:09:35 4171694.99100 872120.59367 4730012.82991 11.80800 48.17151 532.53673 -0.23626 1.72129 7.94607 0.32413 0.39760 -2.84678 8 0 8 2.00 -1999-Aug-27 09:09:35 4171696.60258 872121.95214 4730014.89366 11.80802 48.17151 535.31193 0.76367 1.71503 10.72128 1.32407 0.39135 -0.07158 8 0 8 2.00 -1999-Aug-27 09:09:35 4171697.87955 872121.40642 4730013.75240 11.80801 48.17150 535.22065 -0.03181 0.10574 10.62999 0.52858 -1.21795 -0.16286 8 0 8 2.00 -1999-Aug-27 09:09:35 4171695.59892 872119.39685 4730013.44616 11.80799 48.17151 533.22944 -1.53216 1.87137 8.63878 -0.97177 0.54768 -2.15408 8 0 8 2.00 -1999-Aug-27 09:09:35 4171695.48999 872118.37937 4730014.52699 11.80797 48.17152 533.82485 -2.50582 2.82677 9.23420 -1.94543 1.50308 -1.55866 8 0 8 2.00 -1999-Aug-27 09:09:35 4171695.51946 872118.63294 4730012.25455 11.80798 48.17151 532.18540 -2.26364 1.25112 7.59474 -1.70325 -0.07257 -3.19811 8 0 8 2.00 -1999-Aug-27 09:09:35 4171692.90271 872117.84713 4730007.24512 11.80797 48.17150 526.63722 -2.49735 -0.06127 2.04657 -1.93696 -1.38496 -8.74629 8 0 8 2.00 -1999-Aug-27 09:09:36 4171691.49051 872117.25739 4730005.97369 11.80797 48.17150 524.68747 -2.78563 0.21076 0.09681 -2.22523 -1.11293 -10.69605 8 0 8 2.00 -1999-Aug-27 09:09:36 4171697.11850 872119.03844 4730011.99926 11.80798 48.17150 533.09434 -2.19394 -0.14727 8.50369 -1.63354 -1.47096 -2.28917 8 0 8 2.00 -1999-Aug-27 09:09:36 4171697.22326 872118.14427 4730016.65148 11.80796 48.17152 536.50728 -3.09063 3.01525 11.91662 -2.53023 1.69156 1.12377 8 0 8 2.00 -1999-Aug-27 09:09:36 4171694.39669 872118.54398 4730013.78273 11.80798 48.17153 532.57904 -2.12097 3.10274 7.98838 -1.56057 1.77906 -2.80447 8 0 8 2.00 -1999-Aug-27 09:09:36 4171695.58184 872119.94928 4730014.06818 11.80799 48.17152 533.75717 -0.98793 2.21442 9.16652 -0.42753 0.89073 -1.62634 8 0 8 2.00 -1999-Aug-27 09:09:36 4171695.00566 872120.37772 4730014.92336 11.80800 48.17153 534.07675 -0.45065 3.13966 9.48609 0.10975 1.81597 -1.30676 8 0 8 2.00 -1999-Aug-27 09:09:36 4171692.81014 872119.18421 4730010.99778 11.80799 48.17152 529.55553 -1.16963 2.30502 4.96488 -0.60923 0.98134 -5.82798 8 0 8 2.00 -1999-Aug-27 09:09:36 4171694.52287 872120.36450 4730010.80079 11.80800 48.17150 530.68787 -0.36479 0.74446 6.09722 0.19560 -0.57922 -4.69564 8 0 8 2.00 -1999-Aug-27 09:09:36 4171700.30752 872122.07606 4730015.60292 11.80801 48.17149 538.27590 0.12682 -0.53315 13.68524 0.68721 -1.85684 2.89238 8 0 8 2.00 -1999-Aug-27 09:09:36 4171695.65064 872121.76281 4730014.43641 11.80802 48.17152 534.32396 0.77315 2.13328 9.73331 1.33355 0.80959 -1.05955 8 0 8 2.00 -1999-Aug-27 09:09:36 4171696.32540 872121.31633 4730014.93405 11.80801 48.17152 535.07432 0.19803 2.04108 10.48367 0.75843 0.71740 -0.30919 8 0 8 2.00 -1999-Aug-27 09:09:36 4171694.08971 872119.52159 4730015.00622 11.80799 48.17153 533.42373 -1.10123 3.99353 8.83307 -0.54083 2.66985 -1.95978 8 0 8 2.00 -1999-Aug-27 09:09:36 4171695.52061 872120.24332 4730013.64967 11.80800 48.17152 533.44548 -0.68758 1.93513 8.85483 -0.12719 0.61144 -1.93803 8 0 8 2.00 -1999-Aug-27 09:09:36 4171696.71569 872121.29610 4730014.41147 11.80801 48.17151 534.93694 0.09837 1.41099 10.34629 0.65876 0.08730 -0.44657 8 0 8 2.00 -1999-Aug-27 09:09:36 4171702.27376 872122.19924 4730017.69220 11.80800 48.17149 541.13307 -0.15496 -0.59272 16.54242 0.40543 -1.91641 5.74956 8 0 8 2.00 -1999-Aug-27 09:09:36 4171698.50649 872119.52753 4730012.80096 11.80798 48.17149 534.66454 -1.99923 -0.69956 10.07388 -1.43884 -2.02324 -0.71898 8 0 8 2.00 -1999-Aug-27 09:09:36 4171699.07462 872121.56962 4730015.98739 11.80800 48.17150 537.68845 -0.11661 0.69972 13.09779 0.44379 -0.62396 2.30494 8 0 8 2.00 -1999-Aug-27 09:09:36 4171696.67511 872122.50627 4730012.84038 11.80802 48.17150 533.90491 1.29123 0.20830 9.31426 1.85163 -1.11539 -1.47860 8 0 8 2.00 -1999-Aug-27 09:09:36 4171695.56946 872120.59019 4730012.13965 11.80800 48.17151 532.39952 -0.35804 0.83957 7.80887 0.20235 -0.48411 -2.98399 8 0 8 2.00 -1999-Aug-27 09:09:36 4171699.98802 872121.31653 4730013.55023 11.80800 48.17148 536.43413 -0.55126 -1.55325 11.84347 0.00914 -2.87693 1.05062 8 0 8 2.00 -1999-Aug-27 09:09:36 4171697.80250 872121.74640 4730013.03644 11.80801 48.17149 534.68325 0.31674 -0.36738 10.09260 0.87714 -1.69106 -0.70026 8 0 8 2.00 -1999-Aug-27 09:09:36 4171695.93696 872121.90295 4730012.09481 11.80802 48.17150 532.78516 0.85173 0.34145 8.19451 1.41212 -0.98223 -2.59835 8 0 8 2.00 -1999-Aug-27 09:09:36 4171695.84480 872121.69328 4730012.81016 11.80801 48.17151 533.22943 0.66536 0.91771 8.63877 1.22576 -0.40597 -2.15408 8 0 8 2.00 -1999-Aug-27 09:09:36 4171695.04357 872120.42302 4730014.05958 11.80800 48.17152 533.46404 -0.41406 2.52904 8.87339 0.14633 1.20536 -1.91947 8 0 8 2.00 -1999-Aug-27 09:09:36 4171696.24344 872121.06228 4730015.90457 11.80801 48.17152 535.70933 -0.03386 2.78685 11.11867 0.52653 1.46316 0.32582 8 0 8 2.00 -1999-Aug-27 09:09:37 4171693.44263 872120.98042 4730016.16529 11.80801 48.17154 534.06409 0.45914 5.01605 9.47344 1.01954 3.69236 -1.31942 8 0 8 2.00 -1999-Aug-27 09:09:37 4171696.02366 872120.58354 4730015.12274 11.80800 48.17152 534.91794 -0.45750 2.49873 10.32729 0.10290 1.17505 -0.46557 8 0 8 2.00 -1999-Aug-27 09:09:37 4171694.70894 872119.55184 4730013.01137 11.80799 48.17152 532.34564 -1.19834 2.20690 7.75499 -0.63794 0.88321 -3.03787 8 0 8 2.00 -1999-Aug-27 09:09:37 4171698.88447 872119.98281 4730014.36359 11.80798 48.17150 536.13780 -1.63093 -0.00255 11.54715 -1.07053 -1.32624 0.75429 8 0 8 2.00 -1999-Aug-27 09:09:37 4171695.60032 872118.64288 4730010.78624 11.80798 48.17150 531.14543 -2.27047 0.21140 6.55478 -1.71007 -1.11228 -4.23808 8 0 8 2.00 -1999-Aug-27 09:09:37 4171694.08106 872121.09215 4730013.98530 11.80801 48.17153 532.87169 0.43786 3.07951 8.28103 0.99826 1.75582 -2.51183 8 0 8 2.00 -1999-Aug-27 09:09:37 4171691.22538 872120.25457 4730011.31036 11.80801 48.17153 528.90000 0.20237 3.50616 4.30935 0.76277 2.18248 -6.48351 8 0 8 2.00 -1999-Aug-27 09:09:37 4171691.54630 872119.61168 4730014.47011 11.80800 48.17155 531.37623 -0.49258 5.47737 6.78558 0.06782 4.15369 -4.00728 8 0 8 2.00 -1999-Aug-27 09:09:37 4171698.60869 872120.75929 4730018.34504 11.80799 48.17152 539.03049 -0.81445 2.73545 14.43984 -0.25405 1.41176 3.64698 8 0 8 2.00 -1999-Aug-27 09:09:37 4171697.69976 872120.98344 4730015.73357 11.80800 48.17151 536.52182 -0.40905 1.62262 11.93117 0.15135 0.29893 1.13831 8 0 8 2.00 -1999-Aug-27 09:09:37 4171698.39017 872122.76095 4730016.81731 11.80802 48.17151 538.02263 1.18957 1.57076 13.43198 1.74997 0.24708 2.63912 8 0 8 2.00 -1999-Aug-27 09:09:37 4171698.57029 872121.02755 4730018.49718 11.80800 48.17152 539.15540 -0.54401 2.82401 14.56475 0.01639 1.50033 3.77189 8 0 8 2.00 -1999-Aug-27 09:09:37 4171701.32647 872121.50722 4730019.29340 11.80800 48.17151 541.61337 -0.63849 1.27158 17.02271 -0.07810 -0.05211 6.22986 8 0 8 2.00 -1999-Aug-27 09:09:37 4171696.84721 872122.07441 4730016.42916 11.80802 48.17152 536.63249 0.83330 2.54198 12.04183 1.39370 1.21830 1.24898 8 0 8 2.00 -1999-Aug-27 09:09:37 4171695.87386 872122.40752 4730013.79443 11.80802 48.17151 534.07930 1.35853 1.44402 9.48864 1.91893 0.12034 -1.30422 8 0 8 2.00 -1999-Aug-27 09:09:37 4171696.67947 872122.63915 4730015.50826 11.80802 48.17152 535.91385 1.42042 1.96407 11.32320 1.98081 0.64039 0.53034 8 0 8 2.00 -1999-Aug-27 09:09:37 4171698.55431 872122.32682 4730014.70746 11.80802 48.17150 536.49839 0.73103 0.11017 11.90774 1.29143 -1.21351 1.11488 8 0 8 2.00 -1999-Aug-27 09:09:37 4171693.80849 872121.01035 4730011.17499 11.80801 48.17151 530.58851 0.41357 1.41658 5.99786 0.97397 0.09290 -4.79500 8 0 8 2.00 -1999-Aug-27 09:09:37 4171698.04244 872122.43226 4730012.95954 11.80802 48.17149 534.87619 0.93899 -0.69825 10.28553 1.49939 -2.02194 -0.50733 8 0 8 2.00 -1999-Aug-27 09:09:37 4171694.64738 872120.26629 4730008.96003 11.80800 48.17149 529.38412 -0.48640 -0.55899 4.79346 0.07399 -1.88268 -5.99940 8 0 8 2.00 -1999-Aug-27 09:09:37 4171697.85162 872123.05508 4730012.88843 11.80803 48.17149 534.78362 1.58768 -0.70146 10.19297 2.14808 -2.02515 -0.59989 8 0 8 2.00 -1999-Aug-27 09:09:37 4171700.61563 872123.27596 4730017.18426 11.80802 48.17150 539.81911 1.23828 0.11376 15.22845 1.79868 -1.20992 4.43559 8 0 8 2.00 -1999-Aug-27 09:09:37 4171698.43581 872121.05763 4730014.89759 11.80800 48.17150 536.38951 -0.48705 0.51693 11.79885 0.07334 -0.80676 1.00599 8 0 8 2.00 -1999-Aug-27 09:09:37 4171694.77402 872119.84318 4730015.80402 11.80799 48.17153 534.50881 -0.92648 3.97744 9.91815 -0.36608 2.65375 -0.87470 8 0 8 2.00 -1999-Aug-27 09:09:37 4171696.48262 872119.07398 4730013.67040 11.80798 48.17151 533.92934 -2.02903 1.42559 9.33869 -1.46864 0.10190 -1.45417 8 0 8 2.00 -1999-Aug-27 09:09:38 4171694.93509 872119.07012 4730015.93280 11.80798 48.17153 534.60441 -1.71614 4.06372 10.01375 -1.15574 2.74003 -0.77910 8 0 8 2.00 -1999-Aug-27 09:09:38 4171693.15885 872118.95806 4730014.34136 11.80799 48.17154 532.24376 -1.46235 4.31501 7.65310 -0.90195 2.99132 -3.13976 8 0 8 2.00 -1999-Aug-27 09:09:38 4171693.98307 872119.36781 4730014.46331 11.80799 48.17153 532.92859 -1.22994 3.73270 8.33794 -0.66954 2.40901 -2.45492 8 0 8 2.00 -1999-Aug-27 09:09:38 4171692.82103 872120.59896 4730015.13101 11.80801 48.17154 532.83557 0.21295 4.83783 8.24492 0.77335 3.51414 -2.54794 8 0 8 2.00 -1999-Aug-27 09:09:38 4171692.07555 872120.59957 4730012.61332 11.80801 48.17153 530.47297 0.36610 3.70241 5.88232 0.92650 2.37873 -4.91054 8 0 8 2.00 -1999-Aug-27 09:09:38 4171697.83623 872120.02916 4730011.72810 11.80799 48.17149 533.49603 -1.37106 -1.00267 8.90537 -0.81067 -2.32636 -1.88748 8 0 8 2.00 -1999-Aug-27 09:09:38 4171698.75223 872119.55535 4730012.51049 11.80798 48.17149 534.61231 -2.02229 -1.07676 10.02165 -1.46189 -2.40044 -0.77120 8 0 8 2.00 -1999-Aug-27 09:09:38 4171697.35350 872119.44372 4730012.59464 11.80798 48.17150 533.74670 -1.84532 0.01658 9.15605 -1.28493 -1.30710 -1.63681 8 0 8 2.00 -1999-Aug-27 09:09:38 4171696.89799 872120.30768 4730013.37937 11.80799 48.17150 534.15199 -0.90644 0.74043 9.56134 -0.34604 -0.58326 -1.23152 8 0 8 2.00 -1999-Aug-27 09:09:38 4171693.99146 872122.16907 4730011.68825 11.80803 48.17151 531.24853 1.51033 1.44874 6.65788 2.07073 0.12506 -4.13498 8 0 8 2.00 -1999-Aug-27 09:09:38 4171699.06929 872120.92377 4730013.77041 11.80800 48.17149 535.94486 -0.74771 -0.67642 11.35421 -0.18731 -2.00011 0.56135 8 0 8 2.00 -1999-Aug-27 09:09:38 4171698.09780 872120.89598 4730012.04552 11.80800 48.17149 534.02159 -0.57611 -1.11394 9.43094 -0.01571 -2.43762 -1.36192 8 0 8 2.00 -1999-Aug-27 09:09:38 4171697.62832 872120.08453 4730014.48188 11.80799 48.17151 535.41982 -1.27432 0.97703 10.82917 -0.71392 -0.34665 0.03631 8 0 8 2.00 -1999-Aug-27 09:09:38 4171698.37965 872120.21252 4730014.80919 11.80799 48.17150 536.17164 -1.30279 0.62780 11.58099 -0.74239 -0.69589 0.78813 8 0 8 2.00 -1999-Aug-27 09:09:38 4171700.21005 872120.77261 4730013.85652 11.80799 48.17148 536.73307 -1.12910 -1.42799 12.14242 -0.56870 -2.75167 1.34956 8 0 8 2.00 -1999-Aug-27 09:09:38 4171696.37267 872120.32939 4730013.50859 11.80800 48.17151 533.90832 -0.77769 1.20646 9.31766 -0.21730 -0.11723 -1.47520 8 0 8 2.00 -1999-Aug-27 09:09:38 4171695.67572 872118.84021 4730010.94539 11.80798 48.17150 531.34018 -2.09273 0.23245 6.74952 -1.53234 -1.09123 -4.04334 8 0 8 2.00 -1999-Aug-27 09:09:38 4171697.02986 872120.00599 4730015.83543 11.80799 48.17152 536.02703 -1.22873 2.32820 11.43637 -0.66833 1.00452 0.64352 8 0 8 2.00 -1999-Aug-27 09:09:38 4171697.45395 872119.42408 4730016.50221 11.80798 48.17152 536.72130 -1.88510 2.55228 12.13064 -1.32471 1.22860 1.33779 8 0 8 2.00 -1999-Aug-27 09:09:38 4171696.55617 872120.85156 4730014.43792 11.80800 48.17151 534.79185 -0.30412 1.61276 10.20120 0.25628 0.28907 -0.59166 8 0 8 2.00 -1999-Aug-27 09:09:38 4171694.89435 872120.71952 4730013.86291 11.80800 48.17152 533.26055 -0.09331 2.46151 8.66989 0.46709 1.13783 -2.12296 8 0 8 2.00 -1999-Aug-27 09:09:38 4171692.49716 872119.92798 4730011.62320 11.80800 48.17152 529.91875 -0.37755 2.83699 5.32810 0.18285 1.51331 -5.46476 8 0 8 2.00 -1999-Aug-27 09:09:38 4171698.75757 872120.40647 4730013.36202 11.80799 48.17149 535.36646 -1.19027 -0.64254 10.77581 -0.62987 -1.96623 -0.01705 8 0 8 2.00 -1999-Aug-27 09:09:38 4171693.40070 872121.00298 4730014.59494 11.80801 48.17153 532.86966 0.48981 3.99592 8.27900 1.05020 2.67223 -2.51386 8 0 8 2.00 -1999-Aug-27 09:09:38 4171698.66517 872121.52431 4730012.70301 11.80800 48.17149 534.96764 -0.07718 -1.18509 10.37698 0.48322 -2.50877 -0.41587 8 0 8 2.00 -1999-Aug-27 09:09:39 4171695.15203 872119.94455 4730011.12579 11.80799 48.17150 531.28345 -0.90461 0.56633 6.69279 -0.34421 -0.75735 -4.10007 8 0 8 2.00 -1999-Aug-27 09:09:39 4171692.91222 872119.42413 4730011.31360 11.80799 48.17152 529.89024 -0.95567 2.40461 5.29959 -0.39527 1.08092 -5.49327 8 0 8 2.00 -1999-Aug-27 09:09:39 4171691.15859 872120.87789 4730012.05457 11.80802 48.17153 529.49601 0.82617 3.95615 4.90536 1.38657 2.63247 -5.88750 8 0 8 2.00 -1999-Aug-27 09:09:39 4171694.41977 872121.57805 4730012.54706 11.80802 48.17151 532.08741 0.84417 1.79920 7.49675 1.40457 0.47552 -3.29610 8 0 8 2.00 -1999-Aug-27 09:09:39 4171695.59139 872120.43760 4730013.39115 11.80800 48.17151 533.32556 -0.51190 1.68148 8.73491 0.04850 0.35779 -2.05795 8 0 8 2.00 -1999-Aug-27 09:09:39 4171698.53769 872120.26984 4730013.58251 11.80799 48.17149 535.36858 -1.27901 -0.31429 10.77792 -0.71862 -1.63797 -0.01493 8 0 8 2.00 -1999-Aug-27 09:09:39 4171697.70969 872120.31103 4730014.25080 11.80799 48.17150 535.33166 -1.06926 0.72904 10.74100 -0.50886 -0.59465 -0.05185 8 0 8 2.00 -1999-Aug-27 09:09:39 4171697.38095 872120.39417 4730013.71053 11.80799 48.17150 534.72583 -0.92061 0.59583 10.13518 -0.36022 -0.72786 -0.65768 8 0 8 2.00 -1999-Aug-27 09:09:39 4171697.79485 872119.28249 4730013.74564 11.80798 48.17150 534.87047 -2.09346 0.48687 10.27982 -1.53307 -0.83682 -0.51304 8 0 8 2.00 -1999-Aug-27 09:09:39 4171698.91720 872120.86233 4730015.57009 11.80800 48.17150 537.17821 -0.77672 0.64409 12.58755 -0.21632 -0.67960 1.79470 8 0 8 2.00 -1999-Aug-27 09:09:39 4171701.18089 872121.54729 4730017.43251 11.80800 48.17150 540.13718 -0.56948 0.13061 15.54652 -0.00909 -1.19307 4.75366 8 0 8 2.00 -1999-Aug-27 09:09:39 4171699.74052 872120.27928 4730018.48044 11.80799 48.17152 539.80473 -1.51591 2.07340 15.21407 -0.95551 0.74972 4.42121 8 0 8 2.00 -1999-Aug-27 09:09:39 4171697.18499 872119.92802 4730015.13635 11.80799 48.17151 535.59673 -1.33680 1.76072 11.00608 -0.77640 0.43703 0.21322 8 0 8 2.00 -1999-Aug-27 09:09:39 4171698.09297 872120.62413 4730017.00237 11.80799 48.17152 537.67491 -0.84121 2.23678 13.08425 -0.28082 0.91309 2.29140 8 0 8 2.00 -1999-Aug-27 09:09:39 4171698.66033 872120.96833 4730017.92186 11.80800 48.17152 538.77741 -0.62041 2.38368 14.18675 -0.06001 1.06000 3.39390 8 0 8 2.00 -1999-Aug-27 09:09:39 4171695.45422 872120.14946 4730014.57213 11.80800 48.17152 534.07669 -0.76587 2.61306 9.48604 -0.20547 1.28938 -1.30682 8 0 8 2.00 -1999-Aug-27 09:09:39 4171693.42354 872120.62029 4730014.16050 11.80801 48.17153 532.50862 0.11054 3.74788 7.91797 0.67094 2.42419 -2.87489 8 0 8 2.00 -1999-Aug-27 09:09:39 4171693.89426 872121.81613 4730014.25517 11.80802 48.17153 533.04964 1.18475 3.28535 8.45898 1.74514 1.96166 -2.33387 8 0 8 2.00 -1999-Aug-27 09:09:39 4171699.41413 872124.10661 4730017.58392 11.80804 48.17151 539.44595 2.29721 1.12998 14.85529 2.85761 -0.19371 4.06243 8 0 8 2.00 -1999-Aug-27 09:09:39 4171700.18274 872122.32864 4730016.98796 11.80801 48.17150 539.26096 0.39959 0.44303 14.67031 0.95998 -0.88066 3.87745 8 0 8 2.00 -1999-Aug-27 09:09:39 4171700.09325 872121.95425 4730015.39756 11.80801 48.17149 537.96638 0.05143 -0.49525 13.37573 0.61182 -1.81894 2.58287 8 0 8 2.00 -1999-Aug-27 09:09:39 4171698.81576 872121.40443 4730015.00241 11.80800 48.17150 536.76297 -0.22534 0.25683 12.17231 0.33506 -1.06686 1.37945 8 0 8 2.00 -1999-Aug-27 09:09:39 4171699.28642 872120.20719 4730013.81204 11.80799 48.17149 536.01982 -1.49355 -0.69776 11.42917 -0.93315 -2.02145 0.63631 8 0 8 2.00 -1999-Aug-27 09:09:39 4171696.96069 872119.79952 4730011.42593 11.80799 48.17149 532.66798 -1.41668 -0.53058 8.07732 -0.85628 -1.85426 -2.71554 8 0 8 2.00 -1999-Aug-27 09:09:39 4171697.55229 872120.85111 4730011.75205 11.80800 48.17149 533.44069 -0.50840 -0.90494 8.85003 0.05200 -2.22862 -1.94283 8 0 8 2.00 -1999-Aug-27 09:09:40 4171695.29267 872118.67825 4730010.71330 11.80798 48.17150 530.89508 -2.17288 0.38176 6.30442 -1.61249 -0.94193 -4.48843 8 0 8 2.00 -1999-Aug-27 09:09:40 4171695.24319 872119.38763 4730012.20358 11.80799 48.17151 532.07006 -1.46839 1.30355 7.47941 -0.90799 -0.02014 -3.31345 8 0 8 2.00 -1999-Aug-27 09:09:40 4171694.72579 872118.38037 4730012.24280 11.80797 48.17151 531.62407 -2.34846 1.86067 7.03341 -1.78806 0.53699 -3.75944 8 0 8 2.00 -1999-Aug-27 09:09:40 4171697.67452 872119.33485 4730013.52711 11.80798 48.17150 534.63623 -2.01759 0.42091 10.04558 -1.45719 -0.90277 -0.74728 8 0 8 2.00 -1999-Aug-27 09:09:40 4171697.82608 872120.05972 4730012.91180 11.80799 48.17150 534.37559 -1.33907 -0.21051 9.78494 -0.77867 -1.53420 -1.00792 8 0 8 2.00 -1999-Aug-27 09:09:40 4171695.80533 872119.69099 4730014.86321 11.80799 48.17152 534.46023 -1.28648 2.62100 9.86957 -0.72609 1.29731 -0.92328 8 0 8 2.00 -1999-Aug-27 09:09:40 4171692.67895 872119.11809 4730011.72434 11.80799 48.17152 530.00226 -1.20750 2.89534 5.41161 -0.64710 1.57165 -5.38125 8 0 8 2.00 -1999-Aug-27 09:09:40 4171691.45664 872121.35897 4730013.68363 11.80802 48.17154 530.97012 1.23609 4.75183 6.37947 1.79648 3.42815 -4.41339 8 0 8 2.00 -1999-Aug-27 09:09:40 4171691.16821 872120.76859 4730011.61072 11.80802 48.17153 529.15664 0.71722 3.66979 4.56599 1.27762 2.34611 -6.22687 8 0 8 2.00 -1999-Aug-27 09:09:40 4171694.84555 872121.34840 4730012.36005 11.80801 48.17151 532.19466 0.53225 1.39895 7.60401 1.09265 0.07527 -3.18885 8 0 8 2.00 -1999-Aug-27 09:09:40 4171695.86518 872122.37059 4730013.40839 11.80802 48.17151 533.78094 1.32417 1.19853 9.19028 1.88456 -0.12515 -1.60257 8 0 8 2.00 -1999-Aug-27 09:09:40 4171697.45617 872121.03581 4730013.19940 11.80800 48.17150 534.48163 -0.30794 0.10226 9.89098 0.25246 -1.22142 -0.90188 8 0 8 2.00 -1999-Aug-27 09:09:40 4171698.48020 872121.60317 4730016.10076 11.80801 48.17151 537.38947 0.03786 1.20377 12.79881 0.59826 -0.11991 2.00595 8 0 8 2.00 -1999-Aug-27 09:09:40 4171700.74658 872122.11860 4730015.66166 11.80801 48.17149 538.61208 0.07861 -0.82071 14.02143 0.63901 -2.14439 3.22857 8 0 8 2.00 -1999-Aug-27 09:09:40 4171700.82095 872121.21961 4730016.15657 11.80799 48.17149 538.90673 -0.81658 -0.40781 14.31608 -0.25618 -1.73150 3.52322 8 0 8 2.00 -1999-Aug-27 09:09:40 4171699.66718 872122.36392 4730014.94434 11.80801 48.17149 537.40644 0.53962 -0.54921 12.81578 1.10002 -1.87289 2.02292 8 0 8 2.00 -1999-Aug-27 09:09:40 4171698.11038 872120.88128 4730012.24206 11.80800 48.17149 534.17425 -0.59307 -0.98979 9.58359 -0.03268 -2.31348 -1.20926 8 0 8 2.00 -1999-Aug-27 09:09:40 4171697.60006 872121.74786 4730012.09196 11.80801 48.17149 533.84753 0.35960 -0.84983 9.25688 0.91999 -2.17351 -1.53598 8 0 8 2.00 -1999-Aug-27 09:09:40 4171697.60014 872121.18845 4730014.26184 11.80800 48.17150 535.38812 -0.18799 0.68251 10.79746 0.37241 -0.64117 0.00460 8 0 8 2.00 -1999-Aug-27 09:09:40 4171697.91842 872121.73975 4730013.75973 11.80801 48.17150 535.29698 0.28651 0.03145 10.70632 0.84691 -1.29223 -0.08653 8 0 8 2.00 -1999-Aug-27 09:09:40 4171695.15522 872122.21755 4730015.22631 11.80802 48.17152 534.65120 1.31964 2.95207 10.06055 1.88004 1.62839 -0.73231 8 0 8 2.00 -1999-Aug-27 09:09:40 4171697.37458 872120.47847 4730014.81229 11.80799 48.17151 535.55415 -0.83679 1.32239 10.96349 -0.27639 -0.00130 0.17064 8 0 8 2.00 -1999-Aug-27 09:09:40 4171699.01698 872122.98577 4730013.90137 11.80802 48.17149 536.28969 1.28136 -0.86535 11.69904 1.84176 -2.18903 0.90618 8 0 8 2.00 -1999-Aug-27 09:09:40 4171698.97986 872121.44571 4730014.16573 11.80800 48.17149 536.25228 -0.21851 -0.42714 11.66162 0.34188 -1.75083 0.86876 8 0 8 2.00 -1999-Aug-27 09:09:40 4171694.18912 872120.61192 4730011.25548 11.80800 48.17151 530.84259 -0.05431 1.25339 6.25193 0.50608 -0.07030 -4.54093 8 0 8 2.00 -1999-Aug-27 09:09:41 4171697.15714 872121.60191 4730014.40438 11.80801 48.17151 535.26157 0.30738 1.03765 10.67091 0.86777 -0.28604 -0.12194 8 0 8 2.00 -1999-Aug-27 09:09:41 4171700.23085 872123.47530 4730018.63114 11.80803 48.17151 540.67326 1.51214 1.32894 16.08261 2.07254 0.00526 5.28975 8 0 8 2.00 -1999-Aug-27 09:09:41 4171699.59723 872122.87076 4730017.97253 11.80802 48.17151 539.68638 1.05005 1.44404 15.09573 1.61044 0.12035 4.30287 8 0 8 2.00 -1999-Aug-27 09:09:41 4171698.65007 872121.55394 4730015.03897 11.80801 48.17150 536.70246 -0.04508 0.37926 12.11181 0.51531 -0.94442 1.31895 8 0 8 2.00 -1999-Aug-27 09:09:41 4171701.61508 872120.26873 4730015.52614 11.80798 48.17149 538.82561 -1.90984 -1.26248 14.23495 -1.34944 -2.58616 3.44209 8 0 8 2.00 -1999-Aug-27 09:09:41 4171697.30997 872120.60706 4730013.70212 11.80800 48.17150 534.70228 -0.69770 0.60953 10.11163 -0.13730 -0.71415 -0.68123 8 0 8 2.00 -1999-Aug-27 09:09:41 4171697.72924 872120.32060 4730014.46824 11.80799 48.17151 535.50775 -1.06390 0.85834 10.91710 -0.50350 -0.46535 0.12424 8 0 8 2.00 -1999-Aug-27 09:09:41 4171696.97215 872118.37119 4730016.35866 11.80797 48.17152 536.15613 -2.81713 2.96852 11.56548 -2.25673 1.64483 0.77262 8 0 8 2.00 -1999-Aug-27 09:09:41 4171697.03364 872119.39636 4730015.43828 11.80798 48.17152 535.65036 -1.82623 2.15354 11.05971 -1.26583 0.82985 0.26685 8 0 8 2.00 -1999-Aug-27 09:09:41 4171695.27896 872120.73886 4730018.24424 11.80800 48.17154 536.77898 -0.15308 5.09995 12.18832 0.40731 3.77627 1.39547 8 0 8 2.00 -1999-Aug-27 09:09:41 4171692.97992 872119.35118 4730014.80335 11.80799 48.17154 532.52485 -1.04093 4.69367 7.93419 -0.48054 3.36999 -2.85866 8 0 8 2.00 -1999-Aug-27 09:09:41 4171692.78364 872120.66451 4730014.54407 11.80801 48.17154 532.38275 0.28477 4.46367 7.79210 0.84517 3.13999 -3.00076 8 0 8 2.00 -1999-Aug-27 09:09:41 4171693.71699 872120.52385 4730014.08167 11.80801 48.17153 532.62828 -0.04391 3.49598 8.03763 0.51649 2.17230 -2.75523 8 0 8 2.00 -1999-Aug-27 09:09:41 4171697.27466 872122.78262 4730014.37126 11.80802 48.17150 535.47473 1.43905 0.74981 10.88408 1.99945 -0.57388 0.09122 8 0 8 2.00 -1999-Aug-27 09:09:41 4171692.98978 872121.83057 4730011.10906 11.80802 48.17151 530.11687 1.38397 1.84469 5.52621 1.94437 0.52100 -5.26664 8 0 8 2.00 -1999-Aug-27 09:09:41 4171694.65876 872120.61319 4730010.27301 11.80800 48.17150 530.41725 -0.14917 0.25544 5.82659 0.41123 -1.06824 -4.96626 8 0 8 2.00 -1999-Aug-27 09:09:41 4171695.18119 872120.98903 4730010.73617 11.80801 48.17150 531.15470 0.11181 0.12597 6.56404 0.67220 -1.19772 -4.22881 8 0 8 2.00 -1999-Aug-27 09:09:41 4171696.43156 872118.89827 4730013.28241 11.80798 48.17151 533.58292 -2.19058 1.23088 8.99226 -1.63018 -0.09281 -1.80060 8 0 8 2.00 -1999-Aug-27 09:09:41 4171698.44302 872120.09438 4730013.71737 11.80799 48.17150 535.38332 -1.43139 -0.12854 10.79267 -0.87099 -1.45223 -0.00019 8 0 8 2.00 -1999-Aug-27 09:09:41 4171697.89623 872120.56540 4730014.62135 11.80799 48.17150 535.76426 -0.85845 0.80132 11.17360 -0.29805 -0.52237 0.38075 8 0 8 2.00 -1999-Aug-27 09:09:41 4171700.53650 872119.58913 4730014.18655 11.80797 48.17149 537.03058 -2.35434 -1.26554 12.43992 -1.79395 -2.58922 1.64707 8 0 8 2.00 -1999-Aug-27 09:09:41 4171697.10785 872120.46373 4730016.27228 11.80799 48.17152 536.46592 -0.79664 2.49286 11.87527 -0.23624 1.16917 1.08241 8 0 8 2.00 -1999-Aug-27 09:09:41 4171696.72246 872121.25712 4730017.58308 11.80801 48.17153 537.29935 0.05883 3.52715 12.70870 0.61923 2.20346 1.91584 8 0 8 2.00 -1999-Aug-27 09:09:41 4171696.54422 872120.37505 4730017.40870 11.80800 48.17153 536.93268 -0.76810 3.67536 12.34203 -0.20771 2.35168 1.54917 8 0 8 2.00 -1999-Aug-27 09:09:41 4171696.85513 872120.19941 4730014.86649 11.80799 48.17151 535.21736 -1.00365 1.77996 10.62671 -0.44325 0.45628 -0.16615 8 0 8 2.00 -1999-Aug-27 09:09:42 4171697.36181 872118.39137 4730014.55079 11.80797 48.17151 535.06613 -2.87711 1.47555 10.47548 -2.31671 0.15187 -0.31738 8 0 8 2.00 -1999-Aug-27 09:09:42 4171700.29486 872119.08585 4730016.15221 11.80797 48.17150 538.26886 -2.79752 0.29835 13.67821 -2.23713 -1.02533 2.88535 8 0 8 2.00 -1999-Aug-27 09:09:42 4171695.78933 872120.46729 4730017.56443 11.80800 48.17154 536.56853 -0.52334 4.31575 11.97787 0.03706 2.99206 1.18501 8 0 8 2.00 -1999-Aug-27 09:09:42 4171696.17197 872120.84306 4730013.57114 11.80800 48.17151 533.89401 -0.23382 1.31623 9.30336 0.32657 -0.00746 -1.48950 8 0 8 2.00 -1999-Aug-27 09:09:42 4171699.61109 872120.96823 4730015.46169 11.80799 48.17150 537.56485 -0.81505 0.04954 12.97420 -0.25465 -1.27414 2.18134 8 0 8 2.00 -1999-Aug-27 09:09:42 4171697.76346 872119.98697 4730014.17450 11.80799 48.17150 535.26569 -1.39747 0.68835 10.67503 -0.83707 -0.63534 -0.11783 8 0 8 2.00 -1999-Aug-27 09:09:42 4171696.89494 872120.19906 4730015.53561 11.80799 48.17152 535.74189 -1.01214 2.19721 11.15123 -0.45174 0.87353 0.35838 8 0 8 2.00 -1999-Aug-27 09:09:42 4171695.81978 872120.13971 4730012.97252 11.80799 48.17151 533.12206 -0.85022 1.28113 8.53141 -0.28982 -0.04255 -2.26145 8 0 8 2.00 -1999-Aug-27 09:09:42 4171695.33620 872120.60644 4730014.72257 11.80800 48.17152 534.17412 -0.29441 2.72979 9.58347 0.26599 1.40611 -1.20939 8 0 8 2.00 -1999-Aug-27 09:09:42 4171697.47775 872120.60978 4730014.41898 11.80800 48.17151 535.34634 -0.72937 0.96482 10.75568 -0.16897 -0.35886 -0.03717 8 0 8 2.00 -1999-Aug-27 09:09:42 4171694.40429 872120.32412 4730012.28650 11.80800 48.17151 531.71203 -0.38005 1.82793 7.12137 0.18034 0.50424 -3.67148 8 0 8 2.00 -1999-Aug-27 09:09:42 4171694.16059 872120.54094 4730013.42581 11.80800 48.17152 532.43148 -0.11795 2.73242 7.84082 0.44244 1.40874 -2.95203 8 0 8 2.00 -1999-Aug-27 09:09:42 4171695.09491 872121.20464 4730014.25094 11.80801 48.17152 533.74681 0.34051 2.50003 9.15616 0.90091 1.17635 -1.63670 8 0 8 2.00 -1999-Aug-27 09:09:42 4171696.53188 872120.87809 4730012.84100 11.80800 48.17150 533.58967 -0.27318 0.56144 8.99902 0.28721 -0.76224 -1.79384 8 0 8 2.00 -1999-Aug-27 09:09:42 4171692.26677 872119.67148 4730009.25792 11.80800 48.17151 527.97088 -0.58148 1.46673 3.38023 -0.02108 0.14304 -7.41263 8 0 8 2.00 -1999-Aug-27 09:09:42 4171694.33169 872121.20333 4730013.59550 11.80801 48.17152 532.76001 0.49541 2.61980 8.16936 1.05581 1.29611 -2.62350 8 0 8 2.00 -1999-Aug-27 09:09:42 4171695.44890 872119.90931 4730011.23702 11.80799 48.17150 531.55531 -0.99985 0.42937 6.96466 -0.43945 -0.89432 -3.82820 8 0 8 2.00 -1999-Aug-27 09:09:42 4171697.73081 872119.89397 4730014.03555 11.80799 48.17150 535.12814 -1.48181 0.63368 10.53748 -0.92142 -0.69001 -0.25537 8 0 8 2.00 -1999-Aug-27 09:09:42 4171696.98295 872118.64507 4730017.03042 11.80797 48.17153 536.70112 -2.55126 3.36688 12.11046 -1.99086 2.04319 1.31760 8 0 8 2.00 -1999-Aug-27 09:09:42 4171699.30286 872117.80808 4730014.86369 11.80795 48.17150 536.48678 -3.84525 0.35741 11.89612 -3.28486 -0.96628 1.10326 8 0 8 2.00 -1999-Aug-27 09:09:42 4171701.19840 872119.03803 4730014.54529 11.80796 48.17148 537.65477 -3.02923 -1.42504 13.06412 -2.46883 -2.74873 2.27126 8 0 8 2.00 -1999-Aug-27 09:09:42 4171696.85464 872118.25789 4730015.04906 11.80797 48.17152 535.08812 -2.90398 2.19812 10.49747 -2.34358 0.87444 -0.29539 8 0 8 2.00 -1999-Aug-27 09:09:42 4171693.75820 872120.79611 4730013.82056 11.80801 48.17153 532.49777 0.21416 3.25027 7.90712 0.77455 1.92659 -2.88574 8 0 8 2.00 -1999-Aug-27 09:09:42 4171698.08504 872120.14797 4730013.75417 11.80799 48.17150 535.18438 -1.30567 0.14893 10.59372 -0.74528 -1.17476 -0.19913 8 0 8 2.00 -1999-Aug-27 09:09:42 4171697.28623 872120.46076 4730015.77416 11.80799 48.17152 536.21079 -0.83605 2.03101 11.62013 -0.27565 0.70732 0.82728 8 0 8 2.00 -1999-Aug-27 09:09:43 4171694.90418 872119.59313 4730016.13852 11.80799 48.17153 534.80891 -1.19787 4.14371 10.21825 -0.63747 2.82002 -0.57461 8 0 8 2.00 -1999-Aug-27 09:09:43 4171695.13206 872119.77124 4730013.35911 11.80799 48.17152 532.91091 -1.07016 2.09674 8.32025 -0.50976 0.77305 -2.47260 8 0 8 2.00 -1999-Aug-27 09:09:43 4171697.16571 872119.67096 4730016.35857 11.80798 48.17152 536.45980 -1.58447 2.62908 11.86915 -1.02408 1.30540 1.07629 8 0 8 2.00 -1999-Aug-27 09:09:43 4171699.18934 872120.57076 4730020.42699 11.80799 48.17153 540.93516 -1.11781 3.72913 16.34450 -0.55742 2.40545 5.55165 8 0 8 2.00 -1999-Aug-27 09:09:43 4171698.40631 872121.04109 4730016.66561 11.80800 48.17151 537.68542 -0.49720 1.72007 13.09477 0.06320 0.39638 2.30191 8 0 8 2.00 -1999-Aug-27 09:09:43 4171697.09965 872121.75081 4730016.22639 11.80801 48.17152 536.60202 0.46489 2.27198 12.01137 1.02529 0.94829 1.21851 8 0 8 2.00 -1999-Aug-27 09:09:43 4171696.06521 872122.54206 4730014.89379 11.80803 48.17152 535.04175 1.45108 2.01711 10.45109 2.01147 0.69343 -0.34176 8 0 8 2.00 -1999-Aug-27 09:09:43 4171691.94580 872120.91463 4730010.15318 11.80802 48.17152 528.59810 0.70105 2.10833 4.00745 1.26144 0.78465 -6.78541 8 0 8 2.00 -1999-Aug-27 09:09:43 4171695.93370 872120.36779 4730011.31158 11.80800 48.17150 531.98991 -0.65028 0.05558 7.39926 -0.08988 -1.26810 -3.39360 8 0 8 2.00 -1999-Aug-27 09:09:43 4171696.30528 872120.33452 4730012.07169 11.80800 48.17150 532.79433 -0.75888 0.29655 8.20368 -0.19848 -1.02714 -2.58918 8 0 8 2.00 -1999-Aug-27 09:09:43 4171693.65256 872119.78578 4730011.38595 11.80800 48.17151 530.47679 -0.75318 1.85773 5.88614 -0.19278 0.53404 -4.90672 8 0 8 2.00 -1999-Aug-27 09:09:43 4171694.42287 872120.92124 4730011.78981 11.80801 48.17151 531.43554 0.20062 1.39208 6.84489 0.76102 0.06840 -3.94797 8 0 8 2.00 -1999-Aug-27 09:09:43 4171696.60174 872121.72687 4730014.02268 11.80801 48.17151 534.63164 0.54334 1.16913 10.04098 1.10374 -0.15455 -0.75187 8 0 8 2.00 -1999-Aug-27 09:09:43 4171693.45936 872121.25458 4730013.20758 11.80802 48.17152 531.90850 0.72408 2.98953 7.31785 1.28447 1.66585 -3.47501 8 0 8 2.00 -1999-Aug-27 09:09:43 4171697.21918 872120.93450 4730015.08153 11.80800 48.17151 535.71556 -0.35861 1.54576 11.12490 0.20179 0.22207 0.33204 8 0 8 2.00 -1999-Aug-27 09:09:43 4171699.70612 872120.97369 4730016.30520 11.80799 48.17150 538.25617 -0.82916 0.54194 13.66551 -0.26877 -0.78175 2.87266 8 0 8 2.00 -1999-Aug-27 09:09:43 4171697.02645 872119.64872 4730014.70587 11.80798 48.17151 535.13435 -1.57775 1.63186 10.54369 -1.01735 0.30817 -0.24916 8 0 8 2.00 -1999-Aug-27 09:09:43 4171697.43101 872120.36149 4730015.65495 11.80799 48.17151 536.20292 -0.96284 1.86105 11.61227 -0.40245 0.53736 0.81941 8 0 8 2.00 -1999-Aug-27 09:09:43 4171697.65205 872120.19559 4730014.62481 11.80799 48.17151 535.55697 -1.17046 1.03812 10.96631 -0.61007 -0.28557 0.17346 8 0 8 2.00 -1999-Aug-27 09:09:43 4171697.43022 872119.32991 4730013.03915 11.80798 48.17150 534.11248 -1.97243 0.27442 9.52182 -1.41204 -1.04926 -1.27103 8 0 8 2.00 -1999-Aug-27 09:09:43 4171699.35400 872122.87431 4730015.32937 11.80802 48.17150 537.55855 1.10330 -0.14183 12.96790 1.66370 -1.46552 2.17504 8 0 8 2.00 -1999-Aug-27 09:09:43 4171699.09081 872121.87906 4730015.75238 11.80801 48.17150 537.56612 0.18297 0.48399 12.97547 0.74336 -0.83969 2.18261 8 0 8 2.00 -1999-Aug-27 09:09:43 4171696.97064 872121.97089 4730013.05812 11.80802 48.17150 534.18702 0.70671 0.21959 9.59637 1.26711 -1.10410 -1.19649 8 0 8 2.00 -1999-Aug-27 09:09:43 4171691.76096 872120.49415 4730010.54077 11.80801 48.17152 528.70887 0.32729 2.56575 4.11822 0.88769 1.24206 -6.67464 8 0 8 2.00 -1999-Aug-27 09:09:43 4171694.40816 872120.57044 4730015.12435 11.80800 48.17153 533.86277 -0.13974 3.68012 9.27212 0.42066 2.35644 -1.52074 8 0 8 2.00 -1999-Aug-27 09:09:44 4171699.06843 872120.29562 4730018.88993 11.80799 48.17152 539.67335 -1.36238 2.83421 15.08269 -0.80199 1.51052 4.28984 8 0 8 2.00 -1999-Aug-27 09:09:44 4171698.37365 872120.56215 4730017.82042 11.80799 48.17152 538.45924 -0.95933 2.58707 13.86858 -0.39893 1.26338 3.07573 8 0 8 2.00 -1999-Aug-27 09:09:44 4171701.47020 872123.13160 4730020.47978 11.80802 48.17151 542.81290 0.92210 1.71026 18.22224 1.48249 0.38657 7.42939 8 0 8 2.00 -1999-Aug-27 09:09:44 4171699.29855 872122.01117 4730017.12211 11.80801 48.17151 538.74041 0.26977 1.22581 14.14976 0.83017 -0.09787 3.35690 8 0 8 2.00 -1999-Aug-27 09:09:44 4171702.56294 872121.88352 4730018.06390 11.80800 48.17149 541.55573 -0.52318 -0.50760 16.96507 0.03721 -1.83129 6.17221 8 0 8 2.00 -1999-Aug-27 09:09:44 4171704.68765 872122.90472 4730017.94736 11.80801 48.17148 542.99524 0.04162 -2.29076 18.40459 0.60202 -3.61445 7.61173 8 0 8 2.00 -1999-Aug-27 09:09:44 4171702.83030 872121.20817 4730017.33164 11.80799 48.17149 541.09245 -1.23895 -1.08798 16.50180 -0.67855 -2.41167 5.70894 8 0 8 2.00 -1999-Aug-27 09:09:44 4171701.68100 872121.80029 4730017.50136 11.80800 48.17150 540.54947 -0.42417 -0.22681 15.95882 0.13623 -1.55050 5.16596 8 0 8 2.00 -1999-Aug-27 09:09:44 4171699.47589 872120.18938 4730018.56309 11.80798 48.17152 539.68129 -1.54976 2.33525 15.09064 -0.98936 1.01156 4.29778 8 0 8 2.00 -1999-Aug-27 09:09:44 4171701.41488 872121.11101 4730017.12194 11.80799 48.17150 539.99896 -1.04441 -0.18065 15.40831 -0.48402 -1.50434 4.61545 8 0 8 2.00 -1999-Aug-27 09:09:44 4171698.91621 872121.45153 4730016.78209 11.80800 48.17151 538.16109 -0.19979 1.36326 13.57043 0.36061 0.03957 2.77758 8 0 8 2.00 -1999-Aug-27 09:09:44 4171696.42893 872122.07185 4730016.33541 11.80802 48.17152 536.28923 0.91639 2.78494 11.69857 1.47679 1.46126 0.90572 8 0 8 2.00 -1999-Aug-27 09:09:44 4171694.12929 872121.94016 4730014.87283 11.80802 48.17153 533.68024 1.25806 3.50692 9.08959 1.81846 2.18323 -1.70327 8 0 8 2.00 -1999-Aug-27 09:09:44 4171694.98531 872121.97854 4730014.82167 11.80802 48.17152 534.20615 1.12046 2.84259 9.61550 1.68086 1.51891 -1.17736 8 0 8 2.00 -1999-Aug-27 09:09:44 4171699.38040 872123.51326 4730018.79199 11.80803 48.17152 540.24313 1.72333 2.05072 15.65248 2.28373 0.72703 4.85962 8 0 8 2.00 -1999-Aug-27 09:09:44 4171701.19544 872122.96775 4730018.29576 11.80802 48.17150 540.98376 0.81794 0.47912 16.39311 1.37834 -0.84457 5.60025 8 0 8 2.00 -1999-Aug-27 09:09:44 4171701.04734 872122.46032 4730017.28098 11.80801 48.17150 540.06168 0.35156 -0.01224 15.47103 0.91196 -1.33593 4.67817 8 0 8 2.00 -1999-Aug-27 09:09:44 4171697.30626 872119.66767 4730015.12546 11.80798 48.17151 535.63225 -1.61646 1.70471 11.04160 -1.05606 0.38102 0.24874 8 0 8 2.00 -1999-Aug-27 09:09:44 4171696.58641 872120.45964 4730015.83831 11.80800 48.17152 535.80160 -0.69393 2.58439 11.21094 -0.13354 1.26070 0.41808 8 0 8 2.00 -1999-Aug-27 09:09:44 4171699.06365 872122.05055 4730013.29856 11.80801 48.17149 535.74335 0.35639 -1.15880 11.15270 0.91678 -2.48249 0.35984 8 0 8 2.00 -1999-Aug-27 09:09:44 4171698.47305 872121.47685 4730012.28886 11.80800 48.17149 534.52715 -0.08432 -1.31392 9.93649 0.47608 -2.63761 -0.85636 8 0 8 2.00 -1999-Aug-27 09:09:44 4171700.71606 872123.14928 4730013.23811 11.80802 48.17147 536.92693 1.09373 -2.57188 12.33627 1.65412 -3.89556 1.54342 8 0 8 2.00 -1999-Aug-27 09:09:44 4171699.04219 872122.27915 4730012.47326 11.80801 48.17148 535.14557 0.58454 -1.72840 10.55491 1.14494 -3.05209 -0.23794 8 0 8 2.00 -1999-Aug-27 09:09:44 4171698.24141 872121.46138 4730015.72522 11.80800 48.17151 536.93440 -0.05206 1.14911 12.34375 0.50834 -0.17458 1.55089 8 0 8 2.00 -1999-Aug-27 09:09:44 4171697.49344 872120.87994 4730016.53134 11.80800 48.17152 536.96747 -0.46814 2.32092 12.37681 0.09226 0.99723 1.58396 8 0 8 2.00 -1999-Aug-27 09:09:45 4171699.18831 872120.17549 4730015.08552 11.80799 48.17150 536.90038 -1.50451 0.22792 12.30972 -0.94411 -1.09577 1.51686 8 0 8 2.00 -1999-Aug-27 09:09:45 4171704.46175 872122.36491 4730019.01793 11.80800 48.17149 543.57184 -0.44054 -1.32971 18.98118 0.11986 -2.65340 8.18833 8 0 8 2.00 -1999-Aug-27 09:09:45 4171701.72981 872120.24864 4730016.43186 11.80798 48.17149 539.57265 -1.95298 -0.73907 14.98200 -1.39258 -2.06276 4.18914 8 0 8 2.00 -1999-Aug-27 09:09:45 4171697.81022 872118.62691 4730012.58844 11.80797 48.17150 533.92875 -2.73831 -0.19612 9.33810 -2.17792 -1.51980 -1.45476 8 0 8 2.00 -1999-Aug-27 09:09:45 4171699.80723 872119.88539 4730015.50479 11.80798 48.17150 537.57723 -1.91511 0.10034 12.98658 -1.35472 -1.22335 2.19372 8 0 8 2.00 -1999-Aug-27 09:09:45 4171696.82076 872119.03727 4730013.47561 11.80798 48.17151 533.99992 -2.13416 1.05465 9.40926 -1.57376 -0.26904 -1.38359 8 0 8 2.00 -1999-Aug-27 09:09:45 4171697.46345 872121.56220 4730015.32490 11.80801 48.17151 536.14203 0.20582 1.43419 11.55137 0.76622 0.11050 0.75852 8 0 8 2.00 -1999-Aug-27 09:09:45 4171694.11260 872120.23086 4730013.93035 11.80800 48.17153 532.73379 -0.41165 3.15119 8.14313 0.14875 1.82750 -2.64972 8 0 8 2.00 -1999-Aug-27 09:09:45 4171696.16397 872121.93282 4730016.21624 11.80802 48.17152 536.00849 0.83451 2.91992 11.41784 1.39491 1.59623 0.62498 8 0 8 2.00 -1999-Aug-27 09:09:45 4171697.53226 872121.09103 4730016.18361 11.80800 48.17152 536.76251 -0.26946 2.02852 12.17186 0.29094 0.70483 1.37900 8 0 8 2.00 -1999-Aug-27 09:09:45 4171697.90088 872119.82757 4730015.35138 11.80798 48.17151 536.21058 -1.58162 1.39729 11.61993 -1.02122 0.07360 0.82707 8 0 8 2.00 -1999-Aug-27 09:09:45 4171693.52498 872120.84335 4730015.38593 11.80801 48.17154 533.51840 0.30813 4.45712 8.92775 0.86852 3.13343 -1.86511 8 0 8 2.00 -1999-Aug-27 09:09:45 4171699.05497 872119.19116 4730014.74349 11.80797 48.17150 536.42414 -2.44072 0.24716 11.83349 -1.88032 -1.07653 1.04063 8 0 8 2.00 -1999-Aug-27 09:09:45 4171696.27166 872120.70632 4730015.52805 11.80800 48.17152 535.39861 -0.38807 2.56943 10.80796 0.17233 1.24575 0.01510 8 0 8 2.00 -1999-Aug-27 09:09:45 4171698.72052 872121.41552 4730015.58134 11.80800 48.17150 537.13369 -0.19499 0.71069 12.54304 0.36540 -0.61299 1.75018 8 0 8 2.00 -1999-Aug-27 09:09:45 4171699.72092 872119.54123 4730017.03135 11.80798 48.17151 538.61143 -2.23433 1.23383 14.02078 -1.67394 -0.08985 3.22792 8 0 8 2.00 -1999-Aug-27 09:09:45 4171698.28179 872118.67400 4730016.30588 11.80797 48.17152 537.01305 -2.78872 1.93192 12.42239 -2.22833 0.60823 1.62953 8 0 8 2.00 -1999-Aug-27 09:09:45 4171696.62529 872120.23990 4730015.59155 11.80799 48.17152 535.61312 -0.91698 2.42497 11.02247 -0.35659 1.10129 0.22961 8 0 8 2.00 -1999-Aug-27 09:09:45 4171695.16861 872119.86765 4730010.69115 11.80799 48.17150 530.95990 -0.98327 0.27611 6.36925 -0.42287 -1.04758 -4.42361 8 0 8 2.00 -1999-Aug-27 09:09:45 4171699.00666 872121.15480 4730014.91196 11.80800 48.17150 536.78612 -0.50875 0.09534 12.19547 0.05165 -1.22835 1.40261 8 0 8 2.00 -1999-Aug-27 09:09:45 4171698.73384 872121.76362 4730016.54584 11.80801 48.17151 537.90859 0.14302 1.29113 13.31793 0.70341 -0.03255 2.52507 8 0 8 2.00 -1999-Aug-27 09:09:45 4171703.25851 872122.89099 4730017.88546 11.80801 48.17149 542.01432 0.32064 -1.28757 17.42366 0.88104 -2.61125 6.63081 8 0 8 2.00 -1999-Aug-27 09:09:45 4171698.81633 872122.43844 4730014.93906 11.80802 48.17150 536.85724 0.78667 0.05649 12.26659 1.34707 -1.26719 1.47373 8 0 8 2.00 -1999-Aug-27 09:09:45 4171698.94009 872119.86354 4730015.85412 11.80798 48.17151 537.26849 -1.75907 0.96910 12.67783 -1.19867 -0.35458 1.88498 8 0 8 2.00 -1999-Aug-27 09:09:45 4171701.15538 872122.56765 4730019.56439 11.80801 48.17151 541.84833 0.43450 1.41540 17.25767 0.99490 0.09171 6.46482 8 0 8 2.00 -1999-Aug-27 09:09:46 4171701.68031 872122.94086 4730021.07828 11.80801 48.17152 543.37000 0.69240 1.98524 18.77934 1.25280 0.66155 7.98648 8 0 8 2.00 -1999-Aug-27 09:09:46 4171701.39892 872124.24117 4730019.56615 11.80803 48.17151 542.23701 2.02278 0.98376 17.64636 2.58317 -0.33993 6.85350 8 0 8 2.00 -1999-Aug-27 09:09:46 4171696.99921 872120.13765 4730013.75659 11.80799 48.17151 534.47595 -1.09358 0.94409 9.88530 -0.53318 -0.37959 -0.90756 8 0 8 2.00 -1999-Aug-27 09:09:46 4171696.75308 872120.21404 4730013.80959 11.80799 48.17151 534.36520 -0.96845 1.14731 9.77454 -0.40805 -0.17637 -1.01831 8 0 8 2.00 -1999-Aug-27 09:09:46 4171695.58049 872120.50575 4730013.18151 11.80800 48.17151 533.17153 -0.44296 1.53923 8.58088 0.11744 0.21554 -2.21198 8 0 8 2.00 -1999-Aug-27 09:09:46 4171697.66598 872120.63455 4730015.09356 11.80800 48.17151 535.97526 -0.74364 1.27363 11.38460 -0.18324 -0.05006 0.59174 8 0 8 2.00 -1999-Aug-27 09:09:46 4171699.37208 872119.76836 4730016.07145 11.80798 48.17150 537.69944 -1.94063 0.81348 13.10879 -1.38023 -0.51021 2.31593 8 0 8 2.00 -1999-Aug-27 09:09:46 4171702.60860 872120.54463 4730017.82704 11.80798 48.17149 541.22632 -1.84309 -0.49472 16.63566 -1.28269 -1.81841 5.84281 8 0 8 2.00 -1999-Aug-27 09:09:46 4171698.15320 872119.74798 4730016.63325 11.80798 48.17152 537.31961 -1.71115 2.08028 12.72896 -1.15075 0.75659 1.93610 8 0 8 2.00 -1999-Aug-27 09:09:46 4171695.80354 872121.03971 4730013.61087 11.80801 48.17151 533.70995 0.03406 1.58146 9.11929 0.59445 0.25778 -1.67356 8 0 8 2.00 -1999-Aug-27 09:09:46 4171697.41529 872120.94586 4730011.73169 11.80800 48.17149 533.34901 -0.38762 -0.83304 8.75836 0.17277 -2.15672 -2.03450 8 0 8 2.00 -1999-Aug-27 09:09:46 4171698.94488 872121.23758 4730014.49183 11.80800 48.17150 536.44403 -0.41508 -0.15241 11.85337 0.14532 -1.47610 1.06052 8 0 8 2.00 -1999-Aug-27 09:09:46 4171697.59621 872121.91489 4730014.12868 11.80801 48.17150 535.38546 0.52389 0.48581 10.79481 1.08428 -0.83787 0.00195 8 0 8 2.00 -1999-Aug-27 09:09:46 4171695.53847 872121.58187 4730014.81530 11.80801 48.17152 534.50837 0.61899 2.49537 9.91772 1.17939 1.17168 -0.87514 8 0 8 2.00 -1999-Aug-27 09:09:46 4171697.46972 872120.87346 4730016.66034 11.80800 48.17152 537.04722 -0.46962 2.42524 12.45657 0.09077 1.10155 1.66371 8 0 8 2.00 -1999-Aug-27 09:09:46 4171693.80967 872120.40914 4730015.51110 11.80800 48.17154 533.73826 -0.17516 4.39917 9.14761 0.38524 3.07548 -1.64525 8 0 8 2.00 -1999-Aug-27 09:09:46 4171692.89894 872120.43015 4730015.04162 11.80801 48.17154 532.79679 0.03177 4.74712 8.20613 0.59217 3.42344 -2.58673 8 0 8 2.00 -1999-Aug-27 09:09:46 4171697.23779 872120.68836 4730015.01526 11.80800 48.17151 535.64473 -0.60335 1.52552 11.05408 -0.04296 0.20183 0.26122 8 0 8 2.00 -1999-Aug-27 09:09:46 4171695.08164 872118.59333 4730009.80918 11.80798 48.17150 530.07203 -2.21283 -0.05434 5.48137 -1.65243 -1.37802 -5.31148 8 0 8 2.00 -1999-Aug-27 09:09:46 4171698.12805 872120.28739 4730012.56566 11.80799 48.17149 534.34586 -1.17801 -0.69632 9.75521 -0.61762 -2.02000 -1.03765 8 0 8 2.00 -1999-Aug-27 09:09:46 4171699.31309 872120.61188 4730016.26125 11.80799 48.17151 537.91748 -1.10288 0.85446 13.32682 -0.54248 -0.46922 2.53396 8 0 8 2.00 -1999-Aug-27 09:09:46 4171700.52951 872122.43808 4730014.90380 11.80801 48.17149 537.94928 0.43575 -1.21652 13.35862 0.99615 -2.54020 2.56576 8 0 8 2.00 -1999-Aug-27 09:09:46 4171702.46530 872121.46955 4730015.96240 11.80799 48.17148 539.86958 -0.90841 -1.77477 15.27892 -0.34801 -3.09845 4.48606 8 0 8 2.00 -1999-Aug-27 09:09:46 4171701.48111 872120.31638 4730015.77507 11.80798 48.17149 538.93014 -1.83578 -1.00601 14.33949 -1.27538 -2.32970 3.54663 8 0 8 2.00 -1999-Aug-27 09:09:46 4171697.04983 872119.32552 4730013.62044 11.80798 48.17151 534.29671 -1.89889 0.94021 9.70606 -1.33849 -0.38348 -1.08680 8 0 8 2.00 -1999-Aug-27 09:09:47 4171693.39212 872118.26803 4730012.21691 11.80798 48.17152 530.71884 -2.18552 2.83329 6.12819 -1.62512 1.50960 -4.66467 8 0 8 2.00 -1999-Aug-27 09:09:47 4171696.50159 872119.96726 4730015.15385 11.80799 48.17152 535.16901 -1.15854 2.26486 10.57835 -0.59815 0.94118 -0.21450 8 0 8 2.00 -1999-Aug-27 09:09:47 4171696.39982 872119.26228 4730016.09353 11.80798 48.17153 535.70657 -1.82778 3.07326 11.11591 -1.26738 1.74958 0.32306 8 0 8 2.00 -1999-Aug-27 09:09:47 4171696.30165 872120.01182 4730015.18970 11.80799 48.17152 535.07129 -1.07400 2.42781 10.48063 -0.51361 1.10412 -0.31223 8 0 8 2.00 -1999-Aug-27 09:09:47 4171697.59902 872120.38681 4730014.63843 11.80799 48.17151 535.55860 -0.97244 1.05672 10.96795 -0.41204 -0.26697 0.17509 8 0 8 2.00 -1999-Aug-27 09:09:47 4171693.88640 872119.29736 4730012.08050 11.80799 48.17152 531.08033 -1.27911 2.22484 6.48967 -0.71871 0.90116 -4.30318 8 0 8 2.00 -1999-Aug-27 09:09:47 4171698.02314 872119.12096 4730013.90452 11.80797 48.17150 535.11584 -2.29829 0.45094 10.52518 -1.73789 -0.87274 -0.26768 8 0 8 2.00 -1999-Aug-27 09:09:47 4171703.09006 872120.32763 4730015.06462 11.80798 48.17147 539.45260 -2.15401 -2.65507 14.86194 -1.59362 -3.97875 4.06908 8 0 8 2.00 -1999-Aug-27 09:09:47 4171699.85682 872120.86545 4730015.72944 11.80799 48.17150 537.91075 -0.96595 0.06454 13.32009 -0.40555 -1.25914 2.52724 8 0 8 2.00 -1999-Aug-27 09:09:47 4171700.59110 872121.95550 4730015.33521 11.80800 48.17149 538.24508 -0.04922 -0.90014 13.65443 0.51118 -2.22383 2.86157 8 0 8 2.00 -1999-Aug-27 09:09:47 4171700.52317 872121.92729 4730016.67951 11.80800 48.17150 539.19858 -0.06293 0.05023 14.60793 0.49746 -1.27346 3.81507 8 0 8 2.00 -1999-Aug-27 09:09:47 4171703.54971 872124.01203 4730019.50536 11.80802 48.17149 543.56446 1.35837 -0.59058 18.97381 1.91876 -1.91427 8.18095 8 0 8 2.00 -1999-Aug-27 09:09:47 4171703.39844 872123.18357 4730016.96111 11.80801 48.17148 541.45681 0.57838 -2.05069 16.86616 1.13878 -3.37438 6.07330 8 0 8 2.00 -1999-Aug-27 09:09:47 4171699.26239 872123.45521 4730015.23582 11.80803 48.17150 537.50832 1.69065 -0.22598 12.91766 2.25105 -1.54966 2.12481 8 0 8 2.00 -1999-Aug-27 09:09:47 4171698.44764 872122.50948 4730014.65877 11.80802 48.17150 536.41741 0.93166 0.12765 11.82676 1.49205 -1.19603 1.03390 8 0 8 2.00 -1999-Aug-27 09:09:47 4171697.00072 872120.81062 4730015.89677 11.80800 48.17152 536.16352 -0.43516 2.26767 11.57286 0.12523 0.94399 0.78001 8 0 8 2.00 -1999-Aug-27 09:09:47 4171695.85051 872120.24647 4730013.65841 11.80800 48.17151 533.66778 -0.75201 1.69986 9.07712 -0.19161 0.37617 -1.71573 8 0 8 2.00 -1999-Aug-27 09:09:47 4171696.10124 872119.92189 4730014.01141 11.80799 48.17151 534.05019 -1.12102 1.80190 9.45954 -0.56063 0.47821 -1.33332 8 0 8 2.00 -1999-Aug-27 09:09:47 4171698.37700 872120.38939 4730016.31107 11.80799 48.17151 537.31317 -1.12911 1.60437 12.72251 -0.56871 0.28069 1.92966 8 0 8 2.00 -1999-Aug-27 09:09:47 4171698.75589 872121.90718 4730016.98626 11.80801 48.17151 538.27075 0.27903 1.54687 13.68010 0.83942 0.22318 2.88724 8 0 8 2.00 -1999-Aug-27 09:09:47 4171700.26448 872122.60285 4730018.15516 11.80801 48.17151 540.22148 0.65127 1.12001 15.63083 1.21167 -0.20368 4.83797 8 0 8 2.00 -1999-Aug-27 09:09:47 4171700.20644 872121.73939 4730017.56083 11.80800 48.17151 539.62290 -0.18205 0.89765 15.03224 0.37835 -0.42604 4.23939 8 0 8 2.00 -1999-Aug-27 09:09:47 4171698.85392 872120.49649 4730016.15512 11.80799 48.17151 537.52291 -1.12187 1.13619 12.93225 -0.56147 -0.18750 2.13939 8 0 8 2.00 -1999-Aug-27 09:09:47 4171692.54528 872120.05363 4730012.07594 11.80800 48.17153 530.30467 -0.26440 3.08467 5.71401 0.29600 1.76098 -5.07884 8 0 8 2.00 -1999-Aug-27 09:09:47 4171692.81701 872120.65564 4730012.03679 11.80801 48.17152 530.53504 0.26927 2.76857 5.94438 0.82966 1.44489 -4.84847 8 0 8 2.00 -1999-Aug-27 09:09:48 4171692.34585 872120.69000 4730013.10348 11.80801 48.17153 531.02700 0.39931 3.81836 6.43634 0.95971 2.49467 -4.35651 8 0 8 2.00 -1999-Aug-27 09:09:48 4171693.17136 872120.08749 4730010.89196 11.80800 48.17151 529.83575 -0.35938 1.83325 5.24510 0.20101 0.50957 -5.54776 8 0 8 2.00 -1999-Aug-27 09:09:48 4171696.89069 872119.83396 4730014.71300 11.80799 48.17151 535.07633 -1.36864 1.70739 10.48567 -0.80824 0.38370 -0.30718 8 0 8 2.00 -1999-Aug-27 09:09:48 4171697.43848 872122.22212 4730018.09870 11.80802 48.17153 538.28267 0.85688 3.20162 13.69201 1.41728 1.87794 2.89916 8 0 8 2.00 -1999-Aug-27 09:09:48 4171695.70438 872120.10322 4730015.44187 11.80799 48.17152 534.88178 -0.86233 3.01768 10.29112 -0.30193 1.69400 -0.50174 8 0 8 2.00 -1999-Aug-27 09:09:48 4171695.07286 872120.78931 4730014.85072 11.80800 48.17152 534.12265 -0.06152 2.97944 9.53200 0.49887 1.65576 -1.26086 8 0 8 2.00 -1999-Aug-27 09:09:48 4171692.24402 872118.97366 4730008.80821 11.80799 48.17151 527.52570 -1.25988 1.28981 2.93505 -0.69948 -0.03387 -7.85781 8 0 8 2.00 -1999-Aug-27 09:09:48 4171692.00807 872119.70585 4730011.48778 11.80800 48.17153 529.46825 -0.49489 3.13728 4.87760 0.06550 1.81359 -5.91526 8 0 8 2.00 -1999-Aug-27 09:09:48 4171694.40315 872120.56424 4730010.76085 11.80800 48.17150 530.60723 -0.14478 0.77468 6.01657 0.41562 -0.54900 -4.77629 8 0 8 2.00 -1999-Aug-27 09:09:48 4171696.64634 872119.57362 4730012.24942 11.80798 48.17150 533.04557 -1.57347 0.28234 8.45492 -1.01307 -1.04135 -2.33794 8 0 8 2.00 -1999-Aug-27 09:09:48 4171699.33930 872121.22358 4730014.54619 11.80800 48.17149 536.74010 -0.50949 -0.40171 12.14944 0.05090 -1.72539 1.35659 8 0 8 2.00 -1999-Aug-27 09:09:48 4171701.05397 872120.99469 4730016.20892 11.80799 48.17149 539.06716 -1.08442 -0.50856 14.47651 -0.52402 -1.83225 3.68365 8 0 8 2.00 -1999-Aug-27 09:09:48 4171700.97163 872121.24429 4730015.32153 11.80799 48.17149 538.38624 -0.82324 -1.07837 13.79558 -0.26285 -2.40205 3.00273 8 0 8 2.00 -1999-Aug-27 09:09:48 4171699.58707 872119.75490 4730017.86644 11.80798 48.17151 539.17548 -1.99780 1.85581 14.58482 -1.43740 0.53212 3.79197 8 0 8 2.00 -1999-Aug-27 09:09:48 4171700.20093 872120.34760 4730017.04549 11.80798 48.17150 539.04535 -1.54326 0.77020 14.45470 -0.98286 -0.55349 3.66184 8 0 8 2.00 -1999-Aug-27 09:09:48 4171698.90964 872119.13461 4730015.19794 11.80797 48.17150 536.66019 -2.46633 0.66485 12.06953 -1.90594 -0.65883 1.27667 8 0 8 2.00 -1999-Aug-27 09:09:48 4171694.76704 872120.30830 4730014.11786 11.80800 48.17152 533.31129 -0.46977 2.78709 8.72064 0.09063 1.46341 -2.07222 8 0 8 2.00 -1999-Aug-27 09:09:48 4171693.94766 872121.02047 4730014.42168 11.80801 48.17153 533.09999 0.39500 3.47876 8.50934 0.95540 2.15508 -2.28352 8 0 8 2.00 -1999-Aug-27 09:09:48 4171695.44767 872123.38205 4730018.21088 11.80804 48.17154 537.22497 2.39966 4.55163 12.63431 2.96006 3.22794 1.84146 8 0 8 2.00 -1999-Aug-27 09:09:48 4171697.14426 872124.28247 4730015.94800 11.80805 48.17151 536.76920 2.93385 1.66775 12.17854 3.49424 0.34406 1.38569 8 0 8 2.00 -1999-Aug-27 09:09:48 4171697.95950 872121.38226 4730014.19699 11.80800 48.17150 535.60083 -0.07182 0.34761 11.01018 0.48858 -0.97608 0.21732 8 0 8 2.00 -1999-Aug-27 09:09:48 4171697.15445 872121.15556 4730013.71186 11.80800 48.17150 534.68287 -0.12898 0.64582 10.09221 0.43142 -0.67786 -0.70064 8 0 8 2.00 -1999-Aug-27 09:09:48 4171696.41619 872119.96715 4730015.21261 11.80799 48.17152 535.15703 -1.14117 2.36636 10.56638 -0.58077 1.04267 -0.22648 8 0 8 2.00 -1999-Aug-27 09:09:48 4171699.98465 872120.25053 4730014.02060 11.80798 48.17149 536.63695 -1.59401 -1.07456 12.04629 -1.03361 -2.39825 1.25343 8 0 8 2.00 -1999-Aug-27 09:09:48 4171696.53809 872119.16140 4730010.95459 11.80798 48.17149 531.95380 -1.95481 -0.43938 7.36315 -1.39441 -1.76306 -3.42971 8 0 8 2.00 -1999-Aug-27 09:09:49 4171698.21589 872120.63006 4730013.44774 11.80799 48.17150 535.10725 -0.86057 -0.22437 10.51659 -0.30017 -1.54806 -0.27626 8 0 8 2.00 -1999-Aug-27 09:09:49 4171700.16306 872120.57705 4730016.04850 11.80799 48.17150 538.30905 -1.31091 0.09794 13.71839 -0.75051 -1.22574 2.92553 8 0 8 2.00 -1999-Aug-27 09:09:49 4171699.25356 872119.72042 4730015.75642 11.80798 48.17150 537.38079 -1.96330 0.69714 12.79014 -1.40290 -0.62654 1.99728 8 0 8 2.00 -1999-Aug-27 09:09:49 4171696.61861 872118.83876 4730015.60215 11.80797 48.17152 535.42544 -2.28710 2.65056 10.83479 -1.72670 1.32688 0.04193 8 0 8 2.00 -1999-Aug-27 09:09:49 4171698.53630 872122.04610 4730016.93435 11.80801 48.17151 538.10768 0.45994 1.65123 13.51703 1.02034 0.32754 2.72417 8 0 8 2.00 -1999-Aug-27 09:09:49 4171697.06156 872121.20830 4730014.54500 11.80800 48.17151 535.25024 -0.05835 1.26116 10.65959 0.50204 -0.06252 -0.13327 8 0 8 2.00 -1999-Aug-27 09:09:49 4171699.05235 872122.14843 4730017.06118 11.80801 48.17151 538.55303 0.45451 1.34382 13.96237 1.01490 0.02013 3.16951 8 0 8 2.00 -1999-Aug-27 09:09:49 4171701.39029 872121.03000 4730015.57490 11.80799 48.17149 538.81908 -1.11868 -1.18209 14.22843 -0.55828 -2.50577 3.43557 8 0 8 2.00 -1999-Aug-27 09:09:49 4171703.40345 872122.75532 4730018.38870 11.80801 48.17149 542.46540 0.15818 -1.03698 17.87475 0.71858 -2.36066 7.08189 8 0 8 2.00 -1999-Aug-27 09:09:49 4171701.87405 872122.03830 4730015.66548 11.80800 48.17148 539.33998 -0.23071 -1.62827 14.74932 0.32969 -2.95195 3.95647 8 0 8 2.00 -1999-Aug-27 09:09:49 4171698.74167 872120.58419 4730016.71836 11.80799 48.17151 537.88129 -1.01306 1.58031 13.29064 -0.45266 0.25663 2.49778 8 0 8 2.00 -1999-Aug-27 09:09:49 4171697.85404 872118.80103 4730014.58622 11.80797 48.17151 535.46976 -2.57685 1.07769 10.87911 -2.01645 -0.24599 0.08625 8 0 8 2.00 -1999-Aug-27 09:09:49 4171693.88898 872121.47559 4730012.31102 11.80802 48.17152 531.55105 0.85249 2.04456 6.96039 1.41289 0.72087 -3.83247 8 0 8 2.00 -1999-Aug-27 09:09:49 4171692.73549 872122.13360 4730013.69224 11.80803 48.17153 531.91707 1.73262 3.70669 7.32641 2.29302 2.38300 -3.46645 8 0 8 2.00 -1999-Aug-27 09:09:49 4171694.74505 872121.15787 4730014.22837 11.80801 48.17152 533.49523 0.36633 2.74730 8.90457 0.92672 1.42361 -1.88828 8 0 8 2.00 -1999-Aug-27 09:09:49 4171694.12421 872121.61855 4730013.26923 11.80802 48.17152 532.43812 0.94429 2.49023 7.84746 1.50469 1.16654 -2.94539 8 0 8 2.00 -1999-Aug-27 09:09:49 4171691.91409 872118.56063 4730010.82041 11.80798 48.17152 528.75333 -1.59665 2.93538 4.16268 -1.03625 1.61170 -6.63018 8 0 8 2.00 -1999-Aug-27 09:09:49 4171692.34124 872119.63168 4730012.07041 11.80800 48.17153 530.10977 -0.63567 3.29414 5.51911 -0.07527 1.97045 -5.27375 8 0 8 2.00 -1999-Aug-27 09:09:49 4171693.95044 872118.92806 4730011.36352 11.80798 48.17151 530.53748 -1.65370 1.75629 5.94683 -1.09331 0.43261 -4.84603 8 0 8 2.00 -1999-Aug-27 09:09:49 4171698.77478 872123.61826 4730017.23896 11.80803 48.17151 538.70489 1.95004 1.44072 14.11424 2.51043 0.11703 3.32138 8 0 8 2.00 -1999-Aug-27 09:09:49 4171696.31690 872121.93855 4730014.79278 11.80802 48.17151 535.04842 0.80883 1.85819 10.45776 1.36923 0.53451 -0.33509 8 0 8 2.00 -1999-Aug-27 09:09:49 4171699.93122 872122.13353 4730014.69305 11.80801 48.17149 537.36011 0.26008 -0.87425 12.76946 0.82048 -2.19794 1.97660 8 0 8 2.00 -1999-Aug-27 09:09:49 4171692.71934 872119.44921 4730010.43797 11.80799 48.17152 529.11529 -0.89166 1.95751 4.52463 -0.33126 0.63382 -6.26822 8 0 8 2.00 -1999-Aug-27 09:09:49 4171694.34623 872120.27288 4730012.52534 11.80800 48.17152 531.84511 -0.41833 2.03737 7.25445 0.14207 0.71369 -3.53841 8 0 8 2.00 -1999-Aug-27 09:09:49 4171698.31933 872121.58324 4730015.96913 11.80801 48.17151 537.18365 0.05127 1.23636 12.59299 0.61167 -0.08733 1.80014 8 0 8 2.00 -1999-Aug-27 09:09:50 4171702.84287 872121.41183 4730016.87196 11.80799 48.17148 540.78592 -1.04217 -1.43477 16.19527 -0.48177 -2.75846 5.40241 8 0 8 2.00 -1999-Aug-27 09:09:50 4171702.01651 872120.77607 4730015.78666 11.80799 48.17148 539.35102 -1.49537 -1.45889 14.76036 -0.93498 -2.78258 3.96750 8 0 8 2.00 -1999-Aug-27 09:09:50 4171697.96665 872121.42282 4730014.00941 11.80801 48.17150 535.47126 -0.03358 0.21111 10.88061 0.52682 -1.11258 0.08775 8 0 8 2.00 -1999-Aug-27 09:09:50 4171698.06741 872123.27025 4730014.87056 11.80803 48.17150 536.43084 1.75413 0.43023 11.84018 2.31453 -0.89346 1.04732 8 0 8 2.00 -1999-Aug-27 09:09:50 4171697.47715 872122.11285 4730014.55863 11.80802 48.17151 535.65513 0.74202 0.82920 11.06447 1.30241 -0.49449 0.27162 8 0 8 2.00 -1999-Aug-27 09:09:50 4171695.93099 872121.53096 4730013.84107 11.80801 48.17151 534.03172 0.48884 1.56712 9.44106 1.04923 0.24343 -1.35179 8 0 8 2.00 -1999-Aug-27 09:09:50 4171698.33345 872121.06300 4730016.19552 11.80800 48.17151 537.29057 -0.46085 1.45637 12.69991 0.09955 0.13268 1.90706 8 0 8 2.00 -1999-Aug-27 09:09:50 4171698.99778 872119.04693 4730014.73850 11.80797 48.17150 536.36341 -2.57019 0.30753 11.77275 -2.00980 -1.01615 0.97990 8 0 8 2.00 -1999-Aug-27 09:09:50 4171700.49335 872120.52372 4730016.15343 11.80799 48.17150 538.59557 -1.43070 -0.06486 14.00492 -0.87031 -1.38854 3.21206 8 0 8 2.00 -1999-Aug-27 09:09:50 4171698.95491 872119.42953 4730014.64769 11.80798 48.17150 536.31997 -2.18692 0.21990 11.72931 -1.62652 -1.10378 0.93646 8 0 8 2.00 -1999-Aug-27 09:09:50 4171694.91363 872119.32794 4730011.01302 11.80799 48.17150 530.95964 -1.45938 0.75904 6.36899 -0.89899 -0.56465 -4.42387 8 0 8 2.00 -1999-Aug-27 09:09:50 4171697.82660 872120.73732 4730015.03615 11.80800 48.17151 536.05135 -0.67591 1.10252 11.46070 -0.11552 -0.22117 0.66784 8 0 8 2.00 -1999-Aug-27 09:09:50 4171694.91545 872119.66285 4730015.21448 11.80799 48.17153 534.13723 -1.13193 3.50861 9.54657 -0.57153 2.18492 -1.24628 8 0 8 2.00 -1999-Aug-27 09:09:50 4171696.86850 872120.26149 4730015.84651 11.80799 48.17152 535.96481 -0.94562 2.41432 11.37416 -0.38522 1.09064 0.58130 8 0 8 2.00 -1999-Aug-27 09:09:50 4171696.36160 872121.23412 4730014.59953 11.80801 48.17151 534.83747 0.11016 1.80412 10.24682 0.67055 0.48044 -0.54604 8 0 8 2.00 -1999-Aug-27 09:09:50 4171701.56924 872120.98524 4730016.67753 11.80799 48.17149 539.75141 -1.19911 -0.57044 15.16076 -0.63871 -1.89412 4.36790 8 0 8 2.00 -1999-Aug-27 09:09:50 4171697.96372 872120.36959 4730014.86898 11.80799 48.17151 535.96612 -1.06392 0.94709 11.37546 -0.50353 -0.37659 0.58261 8 0 8 2.00 -1999-Aug-27 09:09:50 4171695.67864 872120.24905 4730015.51454 11.80800 48.17153 534.93902 -0.71431 3.06268 10.34836 -0.15392 1.73900 -0.44449 8 0 8 2.00 -1999-Aug-27 09:09:50 4171695.61797 872119.66446 4730012.14034 11.80799 48.17151 532.30537 -1.27411 0.94581 7.71471 -0.71372 -0.37788 -3.07814 8 0 8 2.00 -1999-Aug-27 09:09:50 4171694.70504 872120.00385 4730015.66271 11.80800 48.17153 534.38041 -0.75509 3.90900 9.78976 -0.19469 2.58532 -1.00310 8 0 8 2.00 -1999-Aug-27 09:09:50 4171697.96362 872117.63495 4730013.26957 11.80796 48.17150 534.40106 -3.74068 0.29750 9.81040 -3.18028 -1.02619 -0.98246 8 0 8 2.00 -1999-Aug-27 09:09:50 4171695.31041 872119.53022 4730015.41819 11.80799 48.17153 534.52875 -1.34258 3.37662 9.93810 -0.78218 2.05293 -0.85476 8 0 8 2.00 -1999-Aug-27 09:09:50 4171697.58165 872120.93185 4730014.07771 11.80800 48.17150 535.20383 -0.43538 0.61233 10.61317 0.12502 -0.71135 -0.17969 8 0 8 2.00 -1999-Aug-27 09:09:50 4171696.51831 872120.99038 4730016.69091 11.80800 48.17153 536.46489 -0.16049 3.12174 11.87423 0.39990 1.79805 1.08138 8 0 8 2.00 -1999-Aug-27 09:09:50 4171693.97586 872119.92486 4730014.49029 11.80800 48.17153 533.02001 -0.68320 3.67101 8.42935 -0.12280 2.34732 -2.36350 8 0 8 2.00 -1999-Aug-27 09:09:51 4171698.83160 872120.75418 4730016.64600 11.80799 48.17151 537.90928 -0.86506 1.44054 13.31863 -0.30467 0.11686 2.52577 8 0 8 2.00 -1999-Aug-27 09:09:51 4171696.18843 872119.27186 4730016.09547 11.80798 48.17153 535.57133 -1.77514 3.22728 10.98067 -1.21475 1.90360 0.18781 8 0 8 2.00 -1999-Aug-27 09:09:51 4171697.89322 872120.01620 4730016.28941 11.80799 48.17152 536.93029 -1.39541 1.99969 12.33964 -0.83501 0.67600 1.54678 8 0 8 2.00 -1999-Aug-27 09:09:51 4171696.38829 872121.01874 4730015.74659 11.80800 48.17152 535.68023 -0.10612 2.58247 11.08957 0.45427 1.25879 0.29672 8 0 8 2.00 -1999-Aug-27 09:09:51 4171700.25159 872121.10186 4730018.51246 11.80799 48.17151 540.27446 -0.81532 1.59657 15.68381 -0.25493 0.27288 4.89095 8 0 8 2.00 -1999-Aug-27 09:09:51 4171696.90037 872120.36655 4730016.36339 11.80799 48.17152 536.38510 -0.84930 2.71977 11.79445 -0.28890 1.39608 1.00159 8 0 8 2.00 -1999-Aug-27 09:09:51 4171701.64901 872119.70392 4730014.45594 11.80797 48.17148 537.97323 -2.46964 -1.91482 13.38257 -1.90924 -3.23851 2.58971 8 0 8 2.00 -1999-Aug-27 09:09:51 4171700.20246 872120.82816 4730016.33308 11.80799 48.17150 538.58109 -1.07318 0.22070 13.99043 -0.51278 -1.10299 3.19758 8 0 8 2.00 -1999-Aug-27 09:09:51 4171702.14608 872122.16969 4730017.91153 11.80800 48.17149 541.20912 -0.15776 -0.34881 16.61847 0.40263 -1.67250 5.82561 8 0 8 2.00 -1999-Aug-27 09:09:51 4171702.41600 872123.04642 4730018.46547 11.80801 48.17149 541.91773 0.64518 -0.30995 17.32708 1.20558 -1.63364 6.53422 8 0 8 2.00 -1999-Aug-27 09:09:51 4171701.52501 872121.15522 4730017.63574 11.80799 48.17150 540.45975 -1.02367 0.07494 15.86909 -0.46328 -1.24875 5.07623 8 0 8 2.00 -1999-Aug-27 09:09:51 4171702.39338 872121.07577 4730015.33413 11.80799 48.17148 539.30073 -1.27914 -2.08126 14.71008 -0.71874 -3.40495 3.91722 8 0 8 2.00 -1999-Aug-27 09:09:51 4171696.73145 872121.04089 4730012.73463 11.80800 48.17150 533.66292 -0.15467 0.32012 9.07226 0.40573 -1.00357 -1.72059 8 0 8 2.00 -1999-Aug-27 09:09:51 4171697.67677 872122.41218 4730013.72534 11.80802 48.17150 535.20537 0.99416 0.08223 10.61471 1.55456 -1.24145 -0.17814 8 0 8 2.00 -1999-Aug-27 09:09:51 4171695.86896 872121.72592 4730014.85420 11.80801 48.17152 534.77276 0.69237 2.25829 10.18210 1.25276 0.93461 -0.61075 8 0 8 2.00 -1999-Aug-27 09:09:51 4171696.10789 872122.22229 4730013.55864 11.80802 48.17151 534.03109 1.12933 1.14432 9.44044 1.68973 -0.17937 -1.35242 8 0 8 2.00 -1999-Aug-27 09:09:51 4171695.48384 872121.78626 4730016.30946 11.80802 48.17153 535.61398 0.83023 3.50051 11.02332 1.39063 2.17682 0.23046 8 0 8 2.00 -1999-Aug-27 09:09:51 4171691.53135 872119.74984 4730009.87138 11.80800 48.17152 527.95861 -0.35429 2.40029 3.36795 0.20611 1.07661 -7.42490 8 0 8 2.00 -1999-Aug-27 09:09:51 4171696.37945 872122.22381 4730014.64761 11.80802 48.17151 535.02001 1.07525 1.67226 10.42935 1.63565 0.34857 -0.36350 8 0 8 2.00 -1999-Aug-27 09:09:51 4171695.04039 872121.88908 4730015.95157 11.80802 48.17153 535.07184 1.02162 3.56959 10.48119 1.58201 2.24590 -0.31167 8 0 8 2.00 -1999-Aug-27 09:09:51 4171696.23661 872119.92847 4730013.67553 11.80799 48.17151 533.88918 -1.14229 1.47815 9.29853 -0.58189 0.15447 -1.49433 8 0 8 2.00 -1999-Aug-27 09:09:51 4171692.28530 872118.72674 4730012.67859 11.80799 48.17153 530.40294 -1.51002 3.87852 5.81228 -0.94962 2.55484 -4.98057 8 0 8 2.00 -1999-Aug-27 09:09:51 4171693.05010 872119.25337 4730012.77064 11.80799 48.17153 531.04265 -1.15103 3.30178 6.45200 -0.59064 1.97810 -4.34086 8 0 8 2.00 -1999-Aug-27 09:09:51 4171691.22178 872118.53771 4730012.43732 11.80799 48.17154 529.50310 -1.47742 4.52215 4.91244 -0.91702 3.19847 -5.88041 8 0 8 2.00 -1999-Aug-27 09:09:51 4171692.09931 872120.21916 4730013.08458 11.80801 48.17153 530.78771 -0.01112 4.05737 6.19706 0.54928 2.73369 -4.59580 8 0 8 2.00 -1999-Aug-27 09:09:52 4171695.04379 872119.92570 4730015.55920 11.80799 48.17153 534.51374 -0.90091 3.60481 9.92309 -0.34051 2.28113 -0.86977 8 0 8 2.00 -1999-Aug-27 09:09:52 4171693.23156 872118.99750 4730013.93497 11.80799 48.17153 531.99378 -1.43862 3.98494 7.40313 -0.87822 2.66126 -3.38973 8 0 8 2.00 -1999-Aug-27 09:09:52 4171695.03156 872120.49094 4730012.72603 11.80800 48.17151 532.47177 -0.34513 1.63810 7.88112 0.21527 0.31441 -2.91174 8 0 8 2.00 -1999-Aug-27 09:09:52 4171692.44555 872120.19115 4730011.21601 11.80800 48.17152 529.61756 -0.10939 2.56295 5.02691 0.45101 1.23926 -5.76595 8 0 8 2.00 -1999-Aug-27 09:09:52 4171694.96610 872122.50465 4730013.16719 11.80803 48.17151 533.03259 1.63937 1.67300 8.44193 2.19976 0.34932 -2.35093 8 0 8 2.00 -1999-Aug-27 09:09:52 4171699.52572 872122.18187 4730015.95146 11.80801 48.17150 538.03970 0.39037 0.25338 13.44904 0.95077 -1.07030 2.65619 8 0 8 2.00 -1999-Aug-27 09:09:52 4171699.39159 872123.42002 4730017.00027 11.80803 48.17151 538.90262 1.62977 0.86188 14.31197 2.19016 -0.46181 3.51911 8 0 8 2.00 -1999-Aug-27 09:09:52 4171700.85857 872121.23598 4730014.03652 11.80799 48.17148 537.35377 -0.80825 -1.85162 12.76312 -0.24785 -3.17530 1.97026 8 0 8 2.00 -1999-Aug-27 09:09:52 4171695.99802 872121.62962 4730015.63340 11.80801 48.17152 535.42448 0.57169 2.69849 10.83383 1.13209 1.37480 0.04097 8 0 8 2.00 -1999-Aug-27 09:09:52 4171696.81760 872122.02495 4730014.47354 11.80802 48.17151 535.14919 0.79094 1.26692 10.55853 1.35134 -0.05677 -0.23432 8 0 8 2.00 -1999-Aug-27 09:09:52 4171696.77624 872121.03798 4730015.86061 11.80800 48.17152 536.02106 -0.16667 2.37262 11.43041 0.39372 1.04893 0.63755 8 0 8 2.00 -1999-Aug-27 09:09:52 4171697.54798 872121.26017 4730014.07443 11.80800 48.17150 535.22421 -0.10711 0.58464 10.63355 0.45329 -0.73904 -0.15931 8 0 8 2.00 -1999-Aug-27 09:09:52 4171693.40606 872120.75431 4730012.00122 11.80801 48.17152 530.90653 0.24531 2.30017 6.31587 0.80570 0.97648 -4.47699 8 0 8 2.00 -1999-Aug-27 09:09:52 4171698.56341 872122.08972 4730014.39904 11.80801 48.17150 536.24216 0.49709 -0.06599 11.65150 1.05749 -1.38968 0.85864 8 0 8 2.00 -1999-Aug-27 09:09:52 4171693.73627 872121.18501 4730013.50677 11.80801 48.17152 532.30271 0.59932 2.99770 7.71205 1.15972 1.67401 -3.08080 8 0 8 2.00 -1999-Aug-27 09:09:52 4171696.12716 872120.24567 4730014.87457 11.80799 48.17152 534.75448 -0.80940 2.30926 10.16382 -0.24900 0.98558 -0.62904 8 0 8 2.00 -1999-Aug-27 09:09:52 4171693.65943 872120.62653 4730013.27054 11.80801 48.17152 532.00031 0.06838 2.98136 7.40966 0.62877 1.65767 -3.38320 8 0 8 2.00 -1999-Aug-27 09:09:52 4171695.65975 872119.17529 4730010.79326 11.80798 48.17150 531.26212 -1.76148 0.09155 6.67146 -1.20109 -1.23213 -4.12139 8 0 8 2.00 -1999-Aug-27 09:09:52 4171697.36064 872119.74163 4730016.60157 11.80798 48.17152 536.77776 -1.55518 2.63819 12.18711 -0.99478 1.31451 1.39425 8 0 8 2.00 -1999-Aug-27 09:09:52 4171698.10737 872120.08051 4730014.83040 11.80799 48.17151 535.99169 -1.37628 0.86067 11.40103 -0.81589 -0.46302 0.60817 8 0 8 2.00 -1999-Aug-27 09:09:52 4171699.43396 872119.52246 4730015.30587 11.80798 48.17150 537.13581 -2.19398 0.29527 12.54516 -1.63359 -1.02841 1.75230 8 0 8 2.00 -1999-Aug-27 09:09:52 4171698.65651 872119.95153 4730014.43009 11.80798 48.17150 536.03427 -1.61490 0.21284 11.44361 -1.05451 -1.11085 0.65075 8 0 8 2.00 -1999-Aug-27 09:09:52 4171698.85831 872120.69157 4730013.06029 11.80799 48.17149 535.24630 -0.93181 -0.96071 10.65564 -0.37142 -2.28440 -0.13722 8 0 8 2.00 -1999-Aug-27 09:09:52 4171702.09735 872123.13976 4730015.91420 11.80802 48.17148 539.82139 0.80175 -1.79321 15.23074 1.36215 -3.11690 4.43788 8 0 8 2.00 -1999-Aug-27 09:09:52 4171702.62734 872123.95096 4730018.75188 11.80803 48.17149 542.39255 1.48733 -0.41100 17.80190 2.04773 -1.73469 7.00904 8 0 8 2.00 -1999-Aug-27 09:09:53 4171699.55810 872122.98705 4730018.84565 11.80802 48.17152 540.32731 1.17189 2.03714 15.73665 1.73229 0.71345 4.94380 8 0 8 2.00 -1999-Aug-27 09:09:53 4171702.58397 872123.63153 4730018.69268 11.80802 48.17149 542.27653 1.18353 -0.37015 17.68588 1.74393 -1.69384 6.89302 8 0 8 2.00 -1999-Aug-27 09:09:53 4171700.84003 872121.91546 4730015.96144 11.80800 48.17149 538.86875 -0.13936 -0.65797 14.27810 0.42104 -1.98165 3.48524 8 0 8 2.00 -1999-Aug-27 09:09:53 4171698.83605 872121.90151 4730015.09620 11.80801 48.17150 536.91394 0.25708 0.22878 12.32328 0.81747 -1.09491 1.53043 8 0 8 2.00 -1999-Aug-27 09:09:53 4171700.53178 872121.94771 4730014.08790 11.80801 48.17148 537.27587 -0.04471 -1.68753 12.68522 0.51569 -3.01121 1.89236 8 0 8 2.00 -1999-Aug-27 09:09:53 4171695.59403 872118.37755 4730013.28540 11.80797 48.17151 532.96736 -2.52889 1.92315 8.37670 -1.96850 0.59946 -2.41616 8 0 8 2.00 -1999-Aug-27 09:09:53 4171695.48056 872119.79763 4730013.15611 11.80799 48.17151 532.99074 -1.11564 1.70314 8.40008 -0.55524 0.37946 -2.39278 8 0 8 2.00 -1999-Aug-27 09:09:53 4171692.67114 872119.28211 4730009.45309 11.80799 48.17151 528.32714 -1.04535 1.36132 3.73649 -0.48496 0.03764 -7.05637 8 0 8 2.00 -1999-Aug-27 09:09:53 4171694.87757 872120.03120 4730011.45064 11.80800 48.17151 531.35817 -0.76362 0.96996 6.76751 -0.20323 -0.35373 -4.02534 8 0 8 2.00 -1999-Aug-27 09:09:53 4171696.40916 872121.56224 4730012.62425 11.80801 48.17150 533.44143 0.42160 0.40208 8.85078 0.98200 -0.92160 -1.94208 8 0 8 2.00 -1999-Aug-27 09:09:53 4171697.17786 872121.32476 4730013.35249 11.80801 48.17150 534.45346 0.03185 0.36328 9.86281 0.59224 -0.96040 -0.93005 8 0 8 2.00 -1999-Aug-27 09:09:53 4171699.43371 872120.90242 4730012.49127 11.80799 48.17148 535.22669 -0.84317 -1.79203 10.63603 -0.28278 -3.11572 -0.15683 8 0 8 2.00 -1999-Aug-27 09:09:53 4171703.10351 872120.89149 4730014.17359 11.80798 48.17147 538.87438 -1.60484 -3.34508 14.28373 -1.04444 -4.66876 3.49087 8 0 8 2.00 -1999-Aug-27 09:09:53 4171701.43138 872120.85068 4730013.92046 11.80799 48.17148 537.58864 -1.30260 -2.28806 12.99798 -0.74221 -3.61175 2.20513 8 0 8 2.00 -1999-Aug-27 09:09:53 4171699.00645 872119.88430 4730014.06178 11.80798 48.17150 535.97909 -1.75232 -0.27777 11.38844 -1.19192 -1.60145 0.59558 8 0 8 2.00 -1999-Aug-27 09:09:53 4171698.56922 872120.59969 4730016.07177 11.80799 48.17151 537.28904 -0.96259 1.27252 12.69838 -0.40220 -0.05117 1.90553 8 0 8 2.00 -1999-Aug-27 09:09:53 4171702.77367 872122.96953 4730017.52657 11.80801 48.17149 541.44111 0.49672 -1.18525 16.85045 1.05712 -2.50894 6.05760 8 0 8 2.00 -1999-Aug-27 09:09:53 4171699.57639 872121.08073 4730013.42677 11.80800 48.17149 536.04124 -0.69784 -1.29940 11.45059 -0.13744 -2.62309 0.65773 8 0 8 2.00 -1999-Aug-27 09:09:53 4171699.06515 872120.17241 4730014.85069 11.80799 48.17150 536.64458 -1.48231 0.16160 12.05393 -0.92192 -1.16208 1.26107 8 0 8 2.00 -1999-Aug-27 09:09:53 4171699.00560 872118.70622 4730015.36338 11.80797 48.17150 536.78764 -2.90530 0.77052 12.19699 -2.34490 -0.55317 1.40413 8 0 8 2.00 -1999-Aug-27 09:09:53 4171697.49105 872120.49015 4730015.94210 11.80799 48.17152 536.47364 -0.84919 1.98914 11.88299 -0.28880 0.66545 1.09013 8 0 8 2.00 -1999-Aug-27 09:09:53 4171696.04833 872120.90365 4730013.70680 11.80800 48.17151 533.92266 -0.14921 1.48764 9.33200 0.41119 0.16396 -1.46086 8 0 8 2.00 -1999-Aug-27 09:09:53 4171697.41805 872121.32736 4730014.77169 11.80801 48.17151 535.66812 -0.01476 1.13417 11.07747 0.54564 -0.18952 0.28461 8 0 8 2.00 -1999-Aug-27 09:09:53 4171699.20192 872120.79325 4730013.27143 11.80799 48.17149 535.64181 -0.90260 -1.08603 11.05116 -0.34221 -2.40972 0.25830 8 0 8 2.00 -1999-Aug-27 09:09:53 4171699.87114 872118.81715 4730014.46100 11.80797 48.17149 536.69540 -2.97383 -0.47950 12.10474 -2.41344 -1.80319 1.31188 8 0 8 2.00 -1999-Aug-27 09:09:54 4171699.56085 872118.02418 4730015.71985 11.80796 48.17150 537.32264 -3.68653 0.70727 12.73199 -3.12613 -0.61642 1.93913 8 0 8 2.00 -1999-Aug-27 09:09:54 4171701.47217 872120.01082 4730017.82587 11.80798 48.17150 540.41074 -2.13305 0.41478 15.82009 -1.57265 -0.90891 5.02723 8 0 8 2.00 -1999-Aug-27 09:09:54 4171697.52389 872118.48211 4730015.10330 11.80797 48.17151 535.59601 -2.82146 1.71197 11.00536 -2.26106 0.38829 0.21250 8 0 8 2.00 -1999-Aug-27 09:09:54 4171695.57627 872118.56208 4730016.61309 11.80797 48.17153 535.46055 -2.34463 4.12721 10.86989 -1.78423 2.80352 0.07703 8 0 8 2.00 -1999-Aug-27 09:09:54 4171695.92575 872119.17136 4730017.70129 11.80798 48.17154 536.58271 -1.81976 4.50513 11.99205 -1.25936 3.18144 1.19919 8 0 8 2.00 -1999-Aug-27 09:09:54 4171700.06956 872119.83335 4730014.76660 11.80798 48.17149 537.19132 -2.01974 -0.57537 12.60066 -1.45934 -1.89906 1.80780 8 0 8 2.00 -1999-Aug-27 09:09:54 4171700.15925 872120.16104 4730016.04578 11.80798 48.17150 538.24776 -1.71733 0.16234 13.65710 -1.15694 -1.16135 2.86425 8 0 8 2.00 -1999-Aug-27 09:09:54 4171698.98515 872121.26475 4730016.88240 11.80800 48.17151 538.25534 -0.39673 1.40834 13.66469 0.16367 0.08466 2.87183 8 0 8 2.00 -1999-Aug-27 09:09:54 4171700.97122 872119.93400 4730018.34293 11.80798 48.17151 540.45853 -2.10573 1.13671 15.86788 -1.54533 -0.18698 5.07502 8 0 8 2.00 -1999-Aug-27 09:09:54 4171701.80741 872121.47275 4730019.56718 11.80800 48.17151 542.12663 -0.77065 1.10864 17.53597 -0.21025 -0.21505 6.74311 8 0 8 2.00 -1999-Aug-27 09:09:54 4171699.27688 872120.96832 4730016.71036 11.80800 48.17151 538.27714 -0.74658 1.12603 13.68648 -0.18618 -0.19766 2.89363 8 0 8 2.00 -1999-Aug-27 09:09:54 4171699.35165 872119.53223 4730013.59905 11.80798 48.17149 535.81159 -2.16758 -0.78447 11.22093 -1.60718 -2.10816 0.42808 8 0 8 2.00 -1999-Aug-27 09:09:54 4171696.04914 872118.70755 4730012.16756 11.80797 48.17150 532.47653 -2.29901 0.79538 7.88587 -1.73861 -0.52830 -2.90699 8 0 8 2.00 -1999-Aug-27 09:09:54 4171697.64791 872120.01524 4730013.29576 11.80799 48.17150 534.53933 -1.34615 0.18228 9.94867 -0.78576 -1.14140 -0.84419 8 0 8 2.00 -1999-Aug-27 09:09:54 4171698.50860 872121.40987 4730013.76595 11.80800 48.17149 535.64185 -0.15716 -0.34456 11.05120 0.40324 -1.66825 0.25834 8 0 8 2.00 -1999-Aug-27 09:09:54 4171697.76601 872122.01250 4730018.21739 11.80801 48.17153 538.55630 0.58468 3.07385 13.96565 1.14508 1.75017 3.17279 8 0 8 2.00 -1999-Aug-27 09:09:54 4171697.87418 872121.62715 4730016.09601 11.80801 48.17151 536.99360 0.18535 1.63896 12.40295 0.74575 0.31528 1.61009 8 0 8 2.00 -1999-Aug-27 09:09:54 4171695.00694 872119.78269 4730014.73859 11.80799 48.17153 533.85871 -1.03335 3.10623 9.26805 -0.47295 1.78255 -1.52480 8 0 8 2.00 -1999-Aug-27 09:09:54 4171692.98447 872119.03661 4730010.52806 11.80799 48.17151 529.29918 -1.34977 1.88712 4.70852 -0.78938 0.56343 -6.08433 8 0 8 2.00 -1999-Aug-27 09:09:54 4171696.08776 872119.17869 4730010.66490 11.80798 48.17149 531.44633 -1.84574 -0.30675 6.85568 -1.28535 -1.63044 -3.93718 8 0 8 2.00 -1999-Aug-27 09:09:54 4171696.88518 872119.27883 4730013.87921 11.80798 48.17151 534.37567 -1.91090 1.24000 9.78502 -1.35050 -0.08369 -1.00784 8 0 8 2.00 -1999-Aug-27 09:09:54 4171700.50795 872120.62964 4730015.40532 11.80799 48.17149 538.06210 -1.33001 -0.59057 13.47145 -0.76961 -1.91426 2.67859 8 0 8 2.00 -1999-Aug-27 09:09:54 4171696.69454 872120.26372 4730015.92500 11.80799 48.17152 535.91004 -0.90784 2.59321 11.31939 -0.34744 1.26953 0.52653 8 0 8 2.00 -1999-Aug-27 09:09:54 4171699.74691 872119.07327 4730013.60269 11.80797 48.17149 536.00969 -2.69771 -1.00035 11.41903 -2.13732 -2.32404 0.62617 8 0 8 2.00 -1999-Aug-27 09:09:54 4171698.25774 872120.25479 4730015.86336 11.80799 48.17151 536.88334 -1.23646 1.41330 12.29269 -0.67607 0.08962 1.49983 8 0 8 2.00 -1999-Aug-27 09:09:55 4171694.66342 872121.26232 4730013.93001 11.80801 48.17152 533.23387 0.48527 2.59193 8.64322 1.04566 1.26825 -2.14964 8 0 8 2.00 -1999-Aug-27 09:09:55 4171691.13996 872117.89442 4730013.14412 11.80798 48.17154 529.88857 -2.09035 5.15129 5.29791 -1.52996 3.82760 -5.49494 8 0 8 2.00 -1999-Aug-27 09:09:55 4171691.61574 872117.93210 4730010.55596 11.80798 48.17153 528.27575 -2.15082 3.07246 3.68509 -1.59043 1.74878 -7.10777 8 0 8 2.00 -1999-Aug-27 09:09:55 4171692.44866 872119.74001 4730011.37280 11.80800 48.17152 529.67486 -0.55162 2.73404 5.08420 0.00878 1.41035 -5.70865 8 0 8 2.00 -1999-Aug-27 09:09:55 4171695.43700 872120.46172 4730011.32902 11.80800 48.17150 531.69148 -0.45669 0.41516 7.10083 0.10370 -0.90852 -3.69203 8 0 8 2.00 -1999-Aug-27 09:09:55 4171698.73703 872120.82502 4730015.16480 11.80800 48.17150 536.75351 -0.77637 0.51090 12.16285 -0.21598 -0.81279 1.36999 8 0 8 2.00 -1999-Aug-27 09:09:55 4171698.44296 872121.33724 4730014.26434 11.80800 48.17150 535.96047 -0.21481 0.04677 11.36981 0.34558 -1.27692 0.57696 8 0 8 2.00 -1999-Aug-27 09:09:55 4171700.47405 872120.81030 4730014.41915 11.80799 48.17149 537.32979 -1.14623 -1.25108 12.73913 -0.58584 -2.57476 1.94628 8 0 8 2.00 -1999-Aug-27 09:09:55 4171700.63064 872120.06416 4730016.11262 11.80798 48.17150 538.59206 -1.90863 -0.12214 14.00141 -1.34823 -1.44582 3.20855 8 0 8 2.00 -1999-Aug-27 09:09:55 4171698.84239 872120.93929 4730016.47208 11.80800 48.17151 537.81200 -0.68609 1.28846 13.22134 -0.12569 -0.03523 2.42848 8 0 8 2.00 -1999-Aug-27 09:09:55 4171695.09195 872118.84721 4730014.58941 11.80798 48.17153 533.67537 -1.96643 3.08738 9.08472 -1.40603 1.76369 -1.70814 8 0 8 2.00 -1999-Aug-27 09:09:55 4171697.29848 872120.51168 4730012.46125 11.80800 48.17150 533.75714 -0.78871 -0.19508 9.16648 -0.22831 -1.51876 -1.62637 8 0 8 2.00 -1999-Aug-27 09:09:55 4171695.89876 872121.66594 4730013.12868 11.80801 48.17151 533.49827 0.62755 1.09495 8.90761 1.18795 -0.22873 -1.88524 8 0 8 2.00 -1999-Aug-27 09:09:55 4171694.73702 872121.00956 4730012.93178 11.80801 48.17151 532.50360 0.22280 1.91106 7.91294 0.78319 0.58737 -2.87992 8 0 8 2.00 -1999-Aug-27 09:09:55 4171697.63379 872120.12947 4730017.11196 11.80799 48.17152 537.38932 -1.23145 2.72020 12.79866 -0.67105 1.39652 2.00581 8 0 8 2.00 -1999-Aug-27 09:09:55 4171697.68904 872120.92572 4730014.98815 11.80800 48.17151 535.95150 -0.46335 1.14212 11.36084 0.09704 -0.18157 0.56799 8 0 8 2.00 -1999-Aug-27 09:09:55 4171696.62000 872121.40895 4730015.03597 11.80801 48.17151 535.35521 0.22841 1.88006 10.76456 0.78881 0.55637 -0.02830 8 0 8 2.00 -1999-Aug-27 09:09:55 4171696.80247 872122.90648 4730015.18747 11.80803 48.17151 535.79159 1.65692 1.61966 11.20094 2.21731 0.29597 0.40808 8 0 8 2.00 -1999-Aug-27 09:09:55 4171696.34658 872121.43321 4730014.71267 11.80801 48.17151 534.93914 0.30811 1.86018 10.34848 0.86850 0.53649 -0.44437 8 0 8 2.00 -1999-Aug-27 09:09:55 4171694.29667 872122.67858 4730015.04264 11.80803 48.17153 534.01681 1.94661 3.38549 9.42615 2.50700 2.06180 -1.36670 8 0 8 2.00 -1999-Aug-27 09:09:55 4171692.13831 872120.65659 4730012.69678 11.80801 48.17153 530.58391 0.40908 3.70360 5.99326 0.96947 2.37992 -4.79960 8 0 8 2.00 -1999-Aug-27 09:09:55 4171694.23194 872120.44410 4730014.42863 11.80800 48.17153 533.21209 -0.22734 3.36393 8.62143 0.33305 2.04025 -2.17142 8 0 8 2.00 -1999-Aug-27 09:09:55 4171698.32126 872121.37567 4730014.16697 11.80800 48.17150 535.81371 -0.15230 0.06473 11.22306 0.40810 -1.25895 0.43020 8 0 8 2.00 -1999-Aug-27 09:09:55 4171700.76351 872121.36473 4730014.66514 11.80800 48.17149 537.77771 -0.66277 -1.38269 13.18705 -0.10237 -2.70638 2.39420 8 0 8 2.00 -1999-Aug-27 09:09:55 4171698.49522 872121.81732 4730017.24078 11.80801 48.17151 538.27798 0.24441 1.92044 13.68732 0.80481 0.59675 2.89446 8 0 8 2.00 -1999-Aug-27 09:09:56 4171702.81391 872120.88969 4730019.62976 11.80798 48.17150 542.75072 -1.54733 0.50516 18.16006 -0.98694 -0.81853 7.36721 8 0 8 2.00 -1999-Aug-27 09:09:56 4171701.38777 872121.82179 4730016.31742 11.80800 48.17149 539.47878 -0.34312 -0.80579 14.88813 0.21728 -2.12947 4.09527 8 0 8 2.00 -1999-Aug-27 09:09:56 4171698.54403 872121.95492 4730016.61772 11.80801 48.17151 537.86435 0.36911 1.44834 13.27369 0.92950 0.12465 2.48084 8 0 8 2.00 -1999-Aug-27 09:09:56 4171697.17901 872121.11271 4730014.63374 11.80800 48.17151 535.37999 -0.17595 1.24925 10.78934 0.38444 -0.07443 -0.00352 8 0 8 2.00 -1999-Aug-27 09:09:56 4171697.09264 872121.25042 4730015.91479 11.80801 48.17152 536.29696 -0.02348 2.14559 11.70631 0.53691 0.82190 0.91345 8 0 8 2.00 -1999-Aug-27 09:09:56 4171699.59055 872121.84221 4730017.91063 11.80801 48.17151 539.49553 0.04463 1.56446 14.90488 0.60503 0.24077 4.11202 8 0 8 2.00 -1999-Aug-27 09:09:56 4171698.84582 872123.26530 4730017.29305 11.80803 48.17151 538.74340 1.59001 1.47880 14.15275 2.15040 0.15511 3.35989 8 0 8 2.00 -1999-Aug-27 09:09:56 4171699.81090 872122.81339 4730017.99797 11.80802 48.17151 539.83699 0.95017 1.31390 15.24634 1.51057 -0.00979 4.45348 8 0 8 2.00 -1999-Aug-27 09:09:56 4171695.03670 872121.57796 4730013.48874 11.80802 48.17152 533.19182 0.71784 1.97725 8.60116 1.27823 0.65357 -2.19169 8 0 8 2.00 -1999-Aug-27 09:09:56 4171695.04848 872121.21140 4730012.33657 11.80801 48.17151 532.29094 0.35663 1.25617 7.70029 0.91702 -0.06751 -3.09257 8 0 8 2.00 -1999-Aug-27 09:09:56 4171696.40730 872120.50518 4730012.20451 11.80800 48.17150 532.98318 -0.61271 0.28470 8.39253 -0.05231 -1.03899 -2.40033 8 0 8 2.00 -1999-Aug-27 09:09:56 4171698.72748 872122.45637 4730013.79140 11.80802 48.17149 535.94652 0.82241 -0.64680 11.35587 1.38280 -1.97049 0.56301 8 0 8 2.00 -1999-Aug-27 09:09:56 4171703.96739 872123.84066 4730015.02347 11.80802 48.17146 540.47407 1.10515 -3.85808 15.88342 1.66555 -5.18176 5.09056 8 0 8 2.00 -1999-Aug-27 09:09:56 4171703.16871 872124.16891 4730018.17486 11.80803 48.17149 542.34574 1.58989 -1.22392 17.75508 2.15029 -2.54761 6.96222 8 0 8 2.00 -1999-Aug-27 09:09:56 4171703.21681 872124.67995 4730017.42717 11.80803 48.17148 541.88974 2.08027 -1.83557 17.29909 2.64067 -3.15925 6.50623 8 0 8 2.01 -1999-Aug-27 09:09:56 4171698.14915 872123.13212 4730014.62054 11.80803 48.17150 536.27904 1.60220 0.22493 11.68838 2.16260 -1.09876 0.89552 8 0 8 2.01 -1999-Aug-27 09:09:56 4171695.66717 872121.19840 4730014.80982 11.80801 48.17152 534.53597 0.21730 2.45632 9.94532 0.77769 1.13263 -0.84754 8 0 8 2.01 -1999-Aug-27 09:09:56 4171692.34626 872121.02784 4730013.88176 11.80802 48.17154 531.65330 0.72991 4.28558 7.06264 1.29031 2.96190 -3.73022 8 0 8 2.01 -1999-Aug-27 09:09:56 4171692.34564 872120.26465 4730012.93450 11.80801 48.17153 530.84290 -0.01700 3.77068 6.25224 0.54340 2.44699 -4.54062 8 0 8 2.01 -1999-Aug-27 09:09:56 4171693.95977 872120.82300 4730013.50194 11.80801 48.17152 532.39561 0.19923 2.88666 7.80495 0.75963 1.56298 -2.98790 8 0 8 2.01 -1999-Aug-27 09:09:56 4171695.05282 872119.83008 4730012.62738 11.80799 48.17151 532.32197 -0.99635 1.65757 7.73131 -0.43595 0.33388 -3.06154 8 0 8 2.01 -1999-Aug-27 09:09:56 4171696.47160 872120.57611 4730013.39240 11.80800 48.17151 533.91999 -0.55644 1.01918 9.32934 0.00396 -0.30451 -1.46352 8 0 8 2.01 -1999-Aug-27 09:09:56 4171697.75946 872119.66939 4730013.00066 11.80798 48.17150 534.34505 -1.70751 -0.04315 9.75440 -1.14711 -1.36683 -1.03846 8 0 8 2.01 -1999-Aug-27 09:09:56 4171703.14076 872121.84367 4730015.53427 11.80800 48.17147 540.04255 -0.68043 -2.61000 15.45189 -0.12003 -3.93369 4.65903 8 0 8 2.01 -1999-Aug-27 09:09:56 4171698.28961 872119.68208 4730016.38749 11.80798 48.17151 537.21654 -1.80357 1.82693 12.62588 -1.24318 0.50325 1.83302 8 0 8 2.01 -1999-Aug-27 09:09:57 4171696.78284 872120.08408 4730018.16576 11.80799 48.17153 537.61286 -1.10174 4.05057 13.02221 -0.54134 2.72689 2.22935 8 0 8 2.01 -1999-Aug-27 09:09:57 4171698.09506 872121.58882 4730017.83281 11.80801 48.17152 538.42673 0.10263 2.64198 13.83607 0.66303 1.31829 3.04322 8 0 8 2.01 -1999-Aug-27 09:09:57 4171694.53161 872120.85652 4730014.14116 11.80801 48.17152 533.24979 0.11503 2.89076 8.65913 0.67542 1.56707 -2.13372 8 0 8 2.01 -1999-Aug-27 09:09:57 4171696.70845 872120.53157 4730012.67682 11.80800 48.17150 533.53531 -0.64849 0.37600 8.94466 -0.08810 -0.94768 -1.84820 8 0 8 2.01 -1999-Aug-27 09:09:57 4171694.17822 872118.68139 4730010.44278 11.80798 48.17151 529.96643 -1.94176 1.01372 5.37577 -1.38136 -0.30997 -5.41709 8 0 8 2.01 -1999-Aug-27 09:09:57 4171691.32413 872117.63219 4730011.88793 11.80797 48.17154 529.03697 -2.38472 4.21918 4.44632 -1.82432 2.89550 -6.34654 8 0 8 2.01 -1999-Aug-27 09:09:57 4171692.97155 872119.33808 4730014.66730 11.80799 48.17154 532.41622 -1.05204 4.61105 7.82556 -0.49165 3.28736 -2.96729 8 0 8 2.01 -1999-Aug-27 09:09:57 4171694.68080 872119.33214 4730014.88370 11.80799 48.17153 533.69244 -1.40763 3.50959 9.10178 -0.84723 2.18590 -1.69108 8 0 8 2.01 -1999-Aug-27 09:09:57 4171696.92551 872119.56632 4730015.31227 11.80798 48.17152 535.50907 -1.63774 2.12246 10.91842 -1.07735 0.79877 0.12556 8 0 8 2.01 -1999-Aug-27 09:09:57 4171697.91641 872121.05163 4730017.21901 11.80800 48.17152 537.77942 -0.38664 2.44485 13.18876 0.17376 1.12116 2.39591 8 0 8 2.01 -1999-Aug-27 09:09:57 4171695.03465 872121.57041 4730012.91418 11.80802 48.17151 532.76131 0.71088 1.59672 8.17066 1.27127 0.27304 -2.62220 8 0 8 2.01 -1999-Aug-27 09:09:57 4171693.25986 872122.16093 4730011.39838 11.80803 48.17151 530.55385 1.65207 1.79028 5.96319 2.21247 0.46659 -4.82967 8 0 8 2.01 -1999-Aug-27 09:09:57 4171695.93617 872120.53982 4730011.61027 11.80800 48.17150 532.23757 -0.48239 0.22674 7.64692 0.07801 -1.09694 -3.14594 8 0 8 2.01 -1999-Aug-27 09:09:57 4171696.66712 872121.13081 4730013.71981 11.80800 48.17151 534.36729 -0.05348 1.01035 9.77663 0.50692 -0.31334 -1.01622 8 0 8 2.01 -1999-Aug-27 09:09:57 4171698.03720 872121.75260 4730015.20393 11.80801 48.17151 536.45241 0.27478 0.90600 11.86175 0.83518 -0.41769 1.06890 8 0 8 2.01 -1999-Aug-27 09:09:57 4171695.58963 872119.54168 4730014.20065 11.80799 48.17152 533.80534 -1.38850 2.35923 9.21469 -0.82810 1.03554 -1.57817 8 0 8 2.01 -1999-Aug-27 09:09:57 4171693.26667 872117.91775 4730013.36182 11.80797 48.17153 531.44227 -2.50270 3.74174 6.85161 -1.94231 2.41805 -3.94124 8 0 8 2.01 -1999-Aug-27 09:09:57 4171693.04107 872118.77160 4730011.54268 11.80798 48.17152 530.05600 -1.62076 2.56290 5.46535 -1.06036 1.23921 -5.32751 8 0 8 2.01 -1999-Aug-27 09:09:57 4171691.37081 872118.97351 4730014.02342 11.80799 48.17155 530.84173 -1.08133 5.40477 6.25108 -0.52094 4.08109 -4.54178 8 0 8 2.01 -1999-Aug-27 09:09:57 4171695.89944 872120.24748 4730017.98876 11.80800 48.17154 536.92660 -0.76103 4.55194 12.33594 -0.20063 3.22825 1.54309 8 0 8 2.01 -1999-Aug-27 09:09:57 4171693.60319 872120.27540 4730015.12961 11.80800 48.17154 533.30095 -0.26381 4.31574 8.71030 0.29658 2.99206 -2.08256 8 0 8 2.01 -1999-Aug-27 09:09:57 4171694.51508 872119.88648 4730013.55454 11.80799 48.17152 532.66950 -0.83110 2.65951 8.07884 -0.27070 1.33583 -2.71401 8 0 8 2.01 -1999-Aug-27 09:09:57 4171696.62682 872119.69056 4730014.88941 11.80799 48.17152 535.01596 -1.45501 2.03936 10.42530 -0.89461 0.71568 -0.36755 8 0 8 2.01 diff --git a/src/utils/gnuplot/8_GPS_accuracy_precision.jpeg b/src/utils/gnuplot/8_GPS_accuracy_precision.jpeg deleted file mode 100644 index 46e80635bfeecbc03eda5b12feb1aa18f303a78c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 55402 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
mOB+$eVxyngzzlL8g6c^Xc$lPTV> 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 diff --git a/src/utils/gnuplot/8_Galileo.plt b/src/utils/gnuplot/8_Galileo.plt deleted file mode 100644 index 7cf992c5b..000000000 --- a/src/utils/gnuplot/8_Galileo.plt +++ /dev/null @@ -1,40 +0,0 @@ -#set terminal pdf color font "Bold,14" -#set output "IFEN_accuracy.pdf" - -set terminal jpeg font "Helvetica, 14" -set output "8_GALILEO_accuracy_precision.jpeg" - -set grid -set xrange [-8:8] -set yrange [-8:8] -set ylabel "North [m]" -set xlabel "East [m]" - -set key Left left -set title "IFEN simulated data, 8 Galileo - Accuracy and Precision" -#file1="8_GPS_GNSS_SDR_solutions.txt" -file2="8_GAL_GNSS_SDR_solutions.txt" -#file3="8_GPS_GNSS_SDR_solutions.txt" - -#values to copy from statistic file -DRMS= 1.870121081 -DUE_DRMS= 3.740242162 -CEP= 1.556390643 - -#difference with respect to the reference position -#values to copy from statistic file -delta_E=1.191 #galileo -delta_N=1.923 #galileo - -set parametric -#dummy variable is t for curves, u/v for surfaces -set size square -set angle degree -set trange [0:360] -#radius_6_GPS=6 - -plot file2 u 9:10 with points pointsize 0.3 lc rgb "blue" notitle,\ -DRMS*sin(t)+delta_E,DRMS*cos(t)+delta_N lw 3 lc rgb "black" title "DRMS",\ -DUE_DRMS*sin(t)+delta_E,DUE_DRMS*cos(t)+delta_N lw 2 lc rgb "gray" title "2DRMS",\ -CEP*sin(t)+delta_E,CEP*cos(t)+delta_N lw 1 lc rgb "black" title "CEP" - diff --git a/src/utils/gnuplot/8_sat_accuracy_precision.jpeg b/src/utils/gnuplot/8_sat_accuracy_precision.jpeg deleted file mode 100644 index 840e2bac7e61d879bf204397aa2ae3cca1c33a06..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50195 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 gnuplot 8_sat_IFEN_accuracy_precision.plt - -#set terminal pdf color font "Bold,14" -#set output "IFEN_solutions_pdf" -set terminal jpeg font "Helvetica, 14" -set output "8_sat_accuracy_precision.jpeg" - -set grid -set xrange [-15:15] -set yrange [-10:20] -set ylabel "North [m]" -set xlabel "East [m]" - -set key Left left -set title "Accuracy-Precision (with respect to CORRECT coordinates)- 2DRMS" -file1="4_GPS_3_GAL_GNSS_SDR_solutions.txt" -file2="8_GAL_GNSS_SDR_solutions.txt" -file3="8_GPS_GNSS_SDR_solutions.txt" - -#values to copy from statistic file -DRMS_1=2*3.077 #it is 2*DRMS combined -DRMS_2=2*1.87 # gal -DRMS_3=2*2.034 # gps - -#difference with respect to the reference position - -#values to copy from statistic file -delta_E_1=-1.812 #combined -delta_N_1= 3.596 #combined - -delta_E_2= 1.191 #gal -delta_N_2= 1.923 #gal - -delta_E_3= -0.560 #gps -delta_N_3= 1.323 #gps - -set parametric -#dummy variable is t for curves, u/v for surfaces -set size square -set angle degree -set trange [0:360] - -plot file1 u 9:10 with points pointsize 0.3 lc rgb "green" title "4 GPS-3 GAL",\ -file3 u 9:10 with points pointsize 0.3 lc rgb "red" title "8 GPS",\ -file2 u 9:10 with points pointsize 0.3 lc rgb "blue" title "8 GAL",\ -DRMS_1*sin(t)+delta_E_1,DRMS_1*cos(t)+delta_N_1 lw 2 lc rgb "green" notitle,\ -DRMS_3*sin(t)+delta_E_3,DRMS_3*cos(t)+delta_N_3 lw 2 lc rgb "red" notitle,\ -DRMS_2*sin(t)+delta_E_2,DRMS_2*cos(t)+delta_N_2 lw 2 lc rgb "blue" notitle - diff --git a/src/utils/gnuplot/statistics/4_GPS_3_GAL_GNSS_SDR_statitics.txt b/src/utils/gnuplot/statistics/4_GPS_3_GAL_GNSS_SDR_statitics.txt deleted file mode 100644 index 158166f50..000000000 --- a/src/utils/gnuplot/statistics/4_GPS_3_GAL_GNSS_SDR_statitics.txt +++ /dev/null @@ -1,23 +0,0 @@ -Num of GPS observation 4 -Num of GALILEO observation 3 -GDOP mean= 2.380532594 - -ENU computed at (IFEN true coordinates): ref Longitude = 11.808005630, Ref Latitude = 48.171497670 for Accuracy -ENU computed at (average coordinates) mean Longitude = 11.807981252, mean Latitude = 48.171530020 for Precision - -ACCURACY (respect true position) -East offset [m] = -1.812959237, East st. dev = 1.899085141 -Nord offset [m] = 3.596061973,Noth st. dev = 2.422058671 -Up offset [m] = 8.995532878, Up st. dev = 3.881428324 - -DRMS= 3.077806456 -DUE_DRMS= 6.155612912 -CEP= 2.565164055 -MRSE= 4.953622757 -SEP= 12.514572993 - -PRECISION (respect average solution) -East offset [m] = 0.000000000, East st. dev = 1.899086239 -Nord offset [m] = -0.000000001, ,Noth st. dev = 2.422059160 -Up offset [m]= -0.000000003, Up st. dev = 3.881427482 ----------------------------------------------------------------------------------------------- diff --git a/src/utils/gnuplot/statistics/8_GAL_GNSS_SDR_statitics.txt b/src/utils/gnuplot/statistics/8_GAL_GNSS_SDR_statitics.txt deleted file mode 100644 index 88c48dde2..000000000 --- a/src/utils/gnuplot/statistics/8_GAL_GNSS_SDR_statitics.txt +++ /dev/null @@ -1,23 +0,0 @@ -Num of GPS observation 0 -Num of GALILEO observation 8 -GDOP mean= 1.769225604 - -ENU computed at (IFEN true coordinates): ref Longitude = 11.808005630, Ref Latitude = 48.171497670 for Accuracy -ENU computed at (average coordinates) mean Longitude = 11.808021645, mean Latitude = 48.171514975 for Precision - -ACCURACY (respect true position) -East offset [m] = 1.191616778, East st. dev = 1.370472661 -Nord offset [m] = 1.923075914,Noth st. dev = 1.272461214 -Up offset [m] = 13.774563698, Up st. dev = 3.492269580 - -DRMS= 1.870121081 -DUE_DRMS= 3.740242162 -CEP= 1.556390643 -MRSE= 3.961476957 -SEP= 8.003582836 - -PRECISION (respect average solution) -East offset [m] = -0.000000002, East st. dev = 1.370472897 -Nord offset [m] = -0.000000001, ,Noth st. dev = 1.272461012 -Up offset [m]= 0.000000002, Up st. dev = 3.492269562 ----------------------------------------------------------------------------------------------- diff --git a/src/utils/gnuplot/statistics/8_GPS_GNSS_SDR_statitics.txt b/src/utils/gnuplot/statistics/8_GPS_GNSS_SDR_statitics.txt deleted file mode 100644 index a0ce5df5f..000000000 --- a/src/utils/gnuplot/statistics/8_GPS_GNSS_SDR_statitics.txt +++ /dev/null @@ -1,23 +0,0 @@ -Num of GPS observation 8 -Num of GALILEO observation 0 -GDOP mean= 2.002216944 - -ENU computed at (IFEN true coordinates): ref Longitude = 11.808005630, Ref Latitude = 48.171497670 for Accuracy -ENU computed at (average coordinates) mean Longitude = 11.807998091, mean Latitude = 48.171509585 for Precision - -ACCURACY (respect true position) -East offset [m] = -0.560396234, East st. dev = 1.105718017 -Nord offset [m] = 1.323685667,Noth st. dev = 1.707810937 -Up offset [m] = 10.792857384, Up st. dev = 3.121160956 - -DRMS= 2.034509899 -DUE_DRMS= 4.069019799 -CEP= 1.678044871 -MRSE= 3.725704798 -SEP= 7.079246885 - -PRECISION (respect average solution) -East offset [m] = 0.000000000, East st. dev = 1.105718027 -Nord offset [m] = -0.000000005, ,Noth st. dev = 1.707811217 -Up offset [m]= -0.000000005, Up st. dev = 3.121160800 ----------------------------------------------------------------------------------------------- From 5dea6da9e03a888a5e02273f466d2ce127a34597 Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Fri, 30 Mar 2018 10:46:04 +0200 Subject: [PATCH 53/61] Cleanup of Matlab/Octave code --- src/utils/matlab/dll_pll_veml_plot_sample.m | 4 ++-- src/utils/matlab/glonass_ca_dll_pll_plot_sample.m | 2 +- src/utils/matlab/gps_l1_ca_dll_pll_plot_sample.m | 2 +- src/utils/matlab/gps_l1_ca_pvt_plot_sample_agilent_cap2.m | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/utils/matlab/dll_pll_veml_plot_sample.m b/src/utils/matlab/dll_pll_veml_plot_sample.m index 247d9e6df..273de3861 100644 --- a/src/utils/matlab/dll_pll_veml_plot_sample.m +++ b/src/utils/matlab/dll_pll_veml_plot_sample.m @@ -42,8 +42,8 @@ first_channel = 0; % Number of the first channel path = '/dump_dir/'; %% CHANGE THIS PATH for N=1:1:channels - tracking_log_path = [path 'track_ch_' num2str(N+first_channel-1) '.dat']; %% CHANGE track_ch BY YOUR dump_filename - GNSS_tracking(N)= dll_pll_veml_read_tracking_dump(tracking_log_path); + tracking_log_path = [path 'track_ch_' num2str(N+first_channel-1) '.dat']; %% CHANGE track_ch_ BY YOUR dump_filename + GNSS_tracking(N) = dll_pll_veml_read_tracking_dump(tracking_log_path); end % GNSS-SDR format conversion to MATLAB GPS receiver diff --git a/src/utils/matlab/glonass_ca_dll_pll_plot_sample.m b/src/utils/matlab/glonass_ca_dll_pll_plot_sample.m index 304429641..d44799f6f 100644 --- a/src/utils/matlab/glonass_ca_dll_pll_plot_sample.m +++ b/src/utils/matlab/glonass_ca_dll_pll_plot_sample.m @@ -41,7 +41,7 @@ first_channel = 0; path = '/archive/'; %% CHANGE THIS PATH for N=1:1:channels - tracking_log_path = [path 'glo_tracking_ch_' num2str(N+first_channel-1) '.dat']; %% CHANGE epl_tracking_ch_ BY YOUR dump_filename + tracking_log_path = [path 'glo_tracking_ch_' num2str(N+first_channel-1) '.dat']; %% CHANGE glo_tracking_ch_ BY YOUR dump_filename GNSS_tracking(N) = dll_pll_veml_read_tracking_dump(tracking_log_path); end diff --git a/src/utils/matlab/gps_l1_ca_dll_pll_plot_sample.m b/src/utils/matlab/gps_l1_ca_dll_pll_plot_sample.m index c86b9a2f3..7dd7aa3d6 100644 --- a/src/utils/matlab/gps_l1_ca_dll_pll_plot_sample.m +++ b/src/utils/matlab/gps_l1_ca_dll_pll_plot_sample.m @@ -41,7 +41,7 @@ first_channel = 0; path = '/archive/'; %% CHANGE THIS PATH for N=1:1:channels - tracking_log_path = [path 'glo_tracking_ch_' num2str(N+first_channel-1) '.dat']; %% CHANGE epl_tracking_ch_ BY YOUR dump_filename + tracking_log_path = [path 'epl_tracking_ch_' num2str(N+first_channel-1) '.dat']; %% CHANGE epl_tracking_ch_ BY YOUR dump_filename GNSS_tracking(N) = dll_pll_veml_read_tracking_dump(tracking_log_path); end diff --git a/src/utils/matlab/gps_l1_ca_pvt_plot_sample_agilent_cap2.m b/src/utils/matlab/gps_l1_ca_pvt_plot_sample_agilent_cap2.m index b30b46a2b..694a3d615 100644 --- a/src/utils/matlab/gps_l1_ca_pvt_plot_sample_agilent_cap2.m +++ b/src/utils/matlab/gps_l1_ca_pvt_plot_sample_agilent_cap2.m @@ -1,5 +1,5 @@ -% Readx GNSS-SDR PVT dump binary file using the provided -% function and plotx some internal variables +% Reads GNSS-SDR PVT dump binary file using the provided +% function and plots some internal variables % Javier Arribas, 2011. jarribas(at)cttc.es % ------------------------------------------------------------------------- % From c58107d56c4668f7ac59992e5ae3b43a2a3be288 Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Fri, 30 Mar 2018 11:34:31 +0200 Subject: [PATCH 54/61] Clean up Matlab/Octave code --- .../reproducibility/ieee-access18/plot_dump.m | 214 ++++++++---------- 1 file changed, 94 insertions(+), 120 deletions(-) diff --git a/src/utils/reproducibility/ieee-access18/plot_dump.m b/src/utils/reproducibility/ieee-access18/plot_dump.m index 09941acf9..202c14355 100644 --- a/src/utils/reproducibility/ieee-access18/plot_dump.m +++ b/src/utils/reproducibility/ieee-access18/plot_dump.m @@ -1,32 +1,28 @@ -% /*! -% * \file plot_dump.m -% * \brief Read GNSS-SDR Tracking dump binary file and plot some internal -% variables -% * \author Antonio Ramos, 2018. antonio.ramos(at)cttc.es -% * ------------------------------------------------------------------------- -% * -% * Copyright (C) 2010-2018 (see AUTHORS file for a list of contributors) -% * -% * GNSS-SDR is a software defined Global Navigation -% * Satellite Systems receiver -% * -% * This file is part of GNSS-SDR. -% * -% * GNSS-SDR is free software: you can redistribute it and/or modify -% * it under the terms of the GNU General Public License as published by -% * the Free Software Foundation, either version 3 of the License, or -% * at your option) any later version. -% * -% * GNSS-SDR is distributed in the hope that it will be useful, -% * but WITHOUT ANY WARRANTY; without even the implied warranty of -% * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% * GNU General Public License for more details. -% * -% * You should have received a copy of the GNU General Public License -% * along with GNSS-SDR. If not, see . -% * -% * ------------------------------------------------------------------------- -% */ +% ------------------------------------------------------------------------- +% +% Copyright (C) 2010-2018 (see AUTHORS file for a list of contributors) +% +% GNSS-SDR is a software defined Global Navigation +% Satellite Systems receiver +% +% This file is part of GNSS-SDR. +% +% GNSS-SDR is free software: you can redistribute it and/or modify +% it under the terms of the GNU General Public License as published by +% the Free Software Foundation, either version 3 of the License, or +% at your option) any later version. +% +% GNSS-SDR is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with GNSS-SDR. If not, see . +% +% ------------------------------------------------------------------------- +% +% Antonio Ramos, 2018. antonio.ramos(at)cttc.es clear all; clc; @@ -84,158 +80,136 @@ end fclose(fileID); -mean_Latitude=mean(navsol.lat); -mean_Longitude=mean(navsol.long); -mean_h=mean(navsol.height); -utmZone = findUtmZone(mean_Latitude,mean_Longitude); -[ref_X_cart,ref_Y_cart,ref_Z_cart]=geo2cart(dms2mat(deg2dms(mean_Latitude)), dms2mat(deg2dms(mean_Longitude)), mean_h, 5); -[mean_utm_X,mean_utm_Y,mean_utm_Z]=cart2utm(ref_X_cart,ref_Y_cart,ref_Z_cart,utmZone); +mean_Latitude = mean(navsol.lat); +mean_Longitude = mean(navsol.long); +mean_h = mean(navsol.height); +utmZone = findUtmZone(mean_Latitude, mean_Longitude); +[ref_X_cart, ref_Y_cart, ref_Z_cart] = geo2cart(dms2mat(deg2dms(mean_Latitude)), dms2mat(deg2dms(mean_Longitude)), mean_h, 5); +[mean_utm_X, mean_utm_Y, mean_utm_Z] = cart2utm(ref_X_cart, ref_Y_cart, ref_Z_cart, utmZone); -numPoints=length(navsol.X); -aux=0; -for n=1:numPoints - aux=aux+1; - [E(aux),N(aux),U(aux)]=cart2utm(navsol.X(n), navsol.Y(n), navsol.Z(n), utmZone); +numPoints = length(navsol.X); +aux = 0; +for n = 1:numPoints + aux = aux+1; + [E(aux), N(aux), U(aux)] = cart2utm(navsol.X(n), navsol.Y(n), navsol.Z(n), utmZone); end -v_2d=[E;N].'; %2D East Nort position vectors -v_3d=[E;N;U].'; %2D East Nort position vectors +v_2d = [E;N].'; % 2D East Nort position vectors +v_3d = [E;N;U].'; % 2D East Nort position vectors %% ACCURACY % 2D ------------------- -sigma_E_accuracy=sqrt((1/(numPoints-1))*sum((v_2d(:,1)-mean_utm_X).^2)); -sigma_N_accuracy=sqrt((1/(numPoints-1))*sum((v_2d(:,2)-mean_utm_Y).^2)); - -sigma_ratio_2d_accuracy=sigma_N_accuracy/sigma_E_accuracy +sigma_E_accuracy = sqrt((1/(numPoints-1)) * sum((v_2d(:,1) - mean_utm_X).^2)); +sigma_N_accuracy = sqrt((1/(numPoints-1)) * sum((v_2d(:,2) - mean_utm_Y).^2)); +sigma_ratio_2d_accuracy = sigma_N_accuracy / sigma_E_accuracy % if sigma_ratio=1 -> Prob in circle with r=DRMS -> 65% -DRMS_accuracy=sqrt(sigma_E_accuracy^2+sigma_N_accuracy^2) +DRMS_accuracy = sqrt(sigma_E_accuracy^2 + sigma_N_accuracy^2) % if sigma_ratio=1 -> Prob in circle with r=2DRMS -> 95% -TWO_DRMS_accuracy=2*DRMS_accuracy +TWO_DRMS_accuracy = 2 * DRMS_accuracy % if sigma_ratio>0.3 -> Prob in circle with r=CEP -> 50% -CEP_accuracy=0.62*sigma_E_accuracy+0.56*sigma_N_accuracy +CEP_accuracy = 0.62 * sigma_E_accuracy + 0.56 * sigma_N_accuracy % 3D ------------------- -sigma_U_accuracy=sqrt((1/(numPoints-1))*sum((v_3d(:,3)-mean_utm_Z).^2)); +sigma_U_accuracy = sqrt((1/(numPoints-1)) * sum((v_3d(:,3) - mean_utm_Z).^2)); % if sigma_ratio=1 -> Prob in circle with r=DRMS -> 50% -SEP_accuracy=0.51*sqrt(sigma_E_accuracy^2+sigma_N_accuracy^2+sigma_U_accuracy^2) - +SEP_accuracy = 0.51 * sqrt(sigma_E_accuracy^2 + sigma_N_accuracy^2 + sigma_U_accuracy^2) % if sigma_ratio=1 -> Prob in circle with r=DRMS -> 61% -MRSE_accuracy=sqrt(sigma_E_accuracy^2+sigma_N_accuracy^2+sigma_U_accuracy^2) +MRSE_accuracy = sqrt(sigma_E_accuracy^2 + sigma_N_accuracy^2 + sigma_U_accuracy^2) % if sigma_ratio=1 -> Prob in circle with r=2DRMS -> 95% -TWO_MRSE_accuracy=2*MRSE_accuracy +TWO_MRSE_accuracy=2 * MRSE_accuracy %% PRECISION -% 2D analysis -% Simulated X,Y measurements -%v1=randn(1000,2); - % 2D Mean and Variance mean_2d = [mean(v_2d(:,1)) ; mean(v_2d(:,2))]; sigma_2d = [sqrt(var(v_2d(:,1))) ; sqrt(var(v_2d(:,2)))]; - -sigma_ratio_2d=sigma_2d(2)/sigma_2d(1) +sigma_ratio_2d = sigma_2d(2) / sigma_2d(1) % if sigma_ratio=1 -> Prob in circle with r=DRMS -> 65% -DRMS=sqrt(sigma_2d(1)^2+sigma_2d(2)^2) +DRMS = sqrt(sigma_2d(1)^2 + sigma_2d(2)^2) % if sigma_ratio=1 -> Prob in circle with r=2DRMS -> 95% -TWO_DRMS=2*DRMS +TWO_DRMS = 2 * DRMS % if sigma_ratio>0.3 -> Prob in circle with r=CEP -> 50% -CEP=0.62*sigma_2d(1)+0.56*sigma_2d(2) +CEP = 0.62 * sigma_2d(1) + 0.56 * sigma_2d(2) - -% Mean and Variance -mean_3d=[mean(v_3d(:,1)) ; mean(v_3d(:,2)) ; mean(v_3d(:,3))]; -sigma_3d=[sqrt(var(v_3d(:,1))) ; sqrt(var(v_3d(:,2))) ; sqrt(var(v_3d(:,3)))]; +% 3D Mean and Variance +mean_3d = [mean(v_3d(:,1)) ; mean(v_3d(:,2)) ; mean(v_3d(:,3))]; +sigma_3d = [sqrt(var(v_3d(:,1))) ; sqrt(var(v_3d(:,2))) ; sqrt(var(v_3d(:,3)))]; % absolute mean error -% 2D +error_2D_vec = [mean_utm_X-mean_2d(1) mean_utm_Y-mean_2d(2)]; +error_2D_m = norm(error_2D_vec) -error_2D_vec=[mean_utm_X-mean_2d(1) mean_utm_Y-mean_2d(2)]; -error_2D_m=norm(error_2D_vec) +error_3D_vec = [mean_utm_X-mean_3d(1) mean_utm_Y-mean_3d(2) mean_utm_Z-mean_3d(3)]; +error_3D_m = norm(error_3D_vec) -error_3D_vec=[mean_utm_X-mean_3d(1) mean_utm_Y-mean_3d(2) mean_utm_Z-mean_3d(3)]; -error_3D_m=norm(error_3D_vec) +RMSE_X = sqrt(mean((v_3d(:,1)-mean_utm_X).^2)) +RMSE_Y = sqrt(mean((v_3d(:,2)-mean_utm_Y).^2)) +RMSE_Z = sqrt(mean((v_3d(:,3)-mean_utm_Z).^2)) -% RMSE 2D +RMSE_2D = sqrt(mean((v_2d(:,1)-mean_utm_X).^2 + (v_2d(:,2)-mean_utm_Y).^2)) +RMSE_3D = sqrt(mean((v_3d(:,1)-mean_utm_X).^2 + (v_3d(:,2)-mean_utm_Y).^2 + (v_3d(:,3)-mean_utm_Z).^2)) -RMSE_X=sqrt(mean((v_3d(:,1)-mean_utm_X).^2)) -RMSE_Y=sqrt(mean((v_3d(:,2)-mean_utm_Y).^2)) -RMSE_Z=sqrt(mean((v_3d(:,3)-mean_utm_Z).^2)) +% if sigma_ratio=1 -> Prob in circle with r=DRMS -> 50% +SEP = 0.51 * sqrt(sigma_3d(1)^2 + sigma_3d(2)^2 + sigma_3d(3)^2) +% if sigma_ratio=1 -> Prob in circle with r=DRMS -> 61% +MRSE = sqrt(sigma_3d(1)^2 + sigma_3d(2)^2 + sigma_3d(3)^2) +% if sigma_ratio=1 -> Prob in circle with r=2DRMS -> 95% +TWO_MRSE = 2 * MRSE -RMSE_2D=sqrt(mean((v_2d(:,1)-mean_utm_X).^2+(v_2d(:,2)-mean_utm_Y).^2)) - -RMSE_3D=sqrt(mean((v_3d(:,1)-mean_utm_X).^2+(v_3d(:,2)-mean_utm_Y).^2+(v_3d(:,3)-mean_utm_Z).^2)) - -% SCATTER PLOT +%% SCATTER PLOT 2D subplot(3,3,8) -scatter(v_2d(:,1)-mean_2d(1),v_2d(:,2)-mean_2d(2)); +scatter(v_2d(:,1)-mean_2d(1), v_2d(:,2)-mean_2d(2)); hold on; -plot(0,0,'k*'); +plot(0, 0, 'k*'); +[x,y,z] = cylinder([TWO_DRMS TWO_DRMS], 200); +plot(x(1,:), y(1,:), 'Color', [0 0.6 0]); +str = strcat('2DRMS=', num2str(TWO_DRMS), ' m'); +text(cosd(65)*TWO_DRMS, sind(65)*TWO_DRMS, str, 'Color', [0 0.6 0]); -[x,y,z] = cylinder([TWO_DRMS TWO_DRMS],200); -plot(x(1,:),y(1,:),'Color',[0 0.6 0]); -str = strcat('2DRMS=',num2str(TWO_DRMS), ' m'); -text(cosd(65)*TWO_DRMS,sind(65)*TWO_DRMS,str,'Color',[0 0.6 0]); - - -[x,y,z] = cylinder([CEP CEP],200); - -plot(x(1,:),y(1,:),'r--'); -str = strcat('CEP=',num2str(CEP), ' m'); -text(cosd(80)*CEP,sind(80)*CEP,str,'Color','r'); +[x,y,z] = cylinder([CEP CEP], 200); +plot(x(1,:), y(1,:), 'r--'); +str = strcat('CEP=', num2str(CEP), ' m'); +text(cosd(80)*CEP, sind(80)*CEP, str, 'Color','r'); grid on axis equal; xlabel('North [m]','fontname','Times','fontsize', fontsize) ylabel('East [m]','fontname','Times','fontsize', fontsize) -% 3D analysis -% Simulated X,Y,Z measurements - -% if sigma_ratio=1 -> Prob in circle with r=DRMS -> 50% -SEP=0.51*sqrt(sigma_3d(1)^2+sigma_3d(2)^2+sigma_3d(3)^2) - -% if sigma_ratio=1 -> Prob in circle with r=DRMS -> 61% -MRSE=sqrt(sigma_3d(1)^2+sigma_3d(2)^2+sigma_3d(3)^2) -% if sigma_ratio=1 -> Prob in circle with r=2DRMS -> 95% -TWO_MRSE=2*MRSE - -% SCATTER PLOT +%% SCATTER PLOT 3D subplot(3,3,9) -scatter3(v_3d(:,1)-mean_3d(1),v_3d(:,2)-mean_3d(2), v_3d(:,3)-mean_3d(3)); +scatter3(v_3d(:,1)-mean_3d(1), v_3d(:,2)-mean_3d(2), v_3d(:,3)-mean_3d(3)); hold on; [x,y,z] = sphere(); -hSurface=surf(MRSE*x,MRSE*y,MRSE*z); % sphere centered at origin +hSurface = surf(MRSE*x, MRSE*y, MRSE*z); % sphere centered at origin +set(hSurface, 'facecolor', 'none', 'edgecolor', [0 0.6 0], 'edgealpha', 1, 'facealpha', 1); -set(hSurface,'facecolor','none','edgecolor',[0 0.6 0],'edgealpha',1,'facealpha',1); +xlabel('North [m]', 'fontname', 'Times', 'fontsize', fontsize-2) +ylabel('East [m]', 'fontname', 'Times', 'fontsize', fontsize-2) +zlabel('Up [m]', 'fontname', 'Times', 'fontsize', fontsize-2) +str = strcat('MRSE=', num2str(MRSE), ' m') +text(cosd(45)*MRSE, sind(45)*MRSE, 20, str, 'Color', [0 0.6 0]); +a = gca; +set(a, 'fontsize', fontsize-6) -%axis equal; -xlabel('North [m]','fontname','Times','fontsize', fontsize-2) -ylabel('East [m]','fontname','Times','fontsize', fontsize-2) -zlabel('Up [m]','fontname','Times','fontsize', fontsize-2) -str = strcat('MRSE=',num2str(MRSE), ' m') -text(cosd(45)*MRSE,sind(45)*MRSE,20,str,'Color',[0 0.6 0]); -a=gca; -set(a,'fontsize',fontsize-6) - -hh=findall(hf,'-property','FontName'); -set(hh,'FontName','Times'); +hh = findall(hf, '-property', 'FontName'); +set(hh, 'FontName', 'Times'); print(hf, 'Figure2.eps', '-depsc') close(hf); From c9b2f06d410dbce3215d295ceeaa05abfd49cae6 Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Fri, 30 Mar 2018 11:36:50 +0200 Subject: [PATCH 55/61] Clean up Matlab/Octave code --- src/utils/matlab/libs/geoFunctions/cart2geo.m | 36 ++++--- src/utils/matlab/libs/geoFunctions/cart2utm.m | 97 +++++++++---------- src/utils/matlab/libs/geoFunctions/check_t.m | 16 ++- src/utils/matlab/libs/geoFunctions/clksin.m | 6 +- src/utils/matlab/libs/geoFunctions/clsin.m | 18 ++-- src/utils/matlab/libs/geoFunctions/deg2dms.m | 8 +- src/utils/matlab/libs/geoFunctions/dms2deg.m | 6 +- src/utils/matlab/libs/geoFunctions/dms2mat.m | 6 +- src/utils/matlab/libs/geoFunctions/e_r_corr.m | 19 ++-- .../matlab/libs/geoFunctions/findUtmZone.m | 23 ++--- src/utils/matlab/libs/geoFunctions/geo2cart.m | 24 +++-- .../matlab/libs/geoFunctions/leastSquarePos.m | 41 ++++---- src/utils/matlab/libs/geoFunctions/mat2dms.m | 11 +-- src/utils/matlab/libs/geoFunctions/roundn.m | 6 +- src/utils/matlab/libs/geoFunctions/satpos.m | 87 ++++++++--------- src/utils/matlab/libs/geoFunctions/togeod.m | 9 +- src/utils/matlab/libs/geoFunctions/topocent.m | 23 ++--- src/utils/matlab/libs/geoFunctions/tropo.m | 23 ++--- 18 files changed, 212 insertions(+), 247 deletions(-) diff --git a/src/utils/matlab/libs/geoFunctions/cart2geo.m b/src/utils/matlab/libs/geoFunctions/cart2geo.m index 99888b12e..45947151f 100644 --- a/src/utils/matlab/libs/geoFunctions/cart2geo.m +++ b/src/utils/matlab/libs/geoFunctions/cart2geo.m @@ -1,8 +1,8 @@ function [phi, lambda, h] = cart2geo(X, Y, Z, i) -%CART2GEO Conversion of Cartesian coordinates (X,Y,Z) to geographical -%coordinates (phi, lambda, h) on a selected reference ellipsoid. +% CART2GEO Conversion of Cartesian coordinates (X,Y,Z) to geographical +% coordinates (phi, lambda, h) on a selected reference ellipsoid. % -%[phi, lambda, h] = cart2geo(X, Y, Z, i); +% [phi, lambda, h] = cart2geo(X, Y, Z, i); % % Choices i of Reference Ellipsoid for Geographical Coordinates % 1. International Ellipsoid 1924 @@ -11,12 +11,9 @@ function [phi, lambda, h] = cart2geo(X, Y, Z, i) % 4. Geodetic Reference System 1980 % 5. World Geodetic System 1984 -%Kai Borre 10-13-98 -%Copyright (c) by Kai Borre -%Revision: 1.0 Date: 1998/10/23 -% -% CVS record: -% $Id: cart2geo.m,v 1.1.2.3 2007/01/29 15:22:49 dpl Exp $ +% Kai Borre 10-13-98 +% Copyright (c) by Kai Borre +% Revision: 1.0 Date: 1998/10/23 %========================================================================== a = [6378388 6378160 6378135 6378137 6378137]; @@ -30,16 +27,16 @@ phi = atan(Z/((sqrt(X^2+Y^2)*(1-(2-f(i)))*f(i)))); h = 0.1; oldh = 0; iterations = 0; while abs(h-oldh) > 1.e-12 - oldh = h; - N = c/sqrt(1+ex2*cos(phi)^2); - phi = atan(Z/((sqrt(X^2+Y^2)*(1-(2-f(i))*f(i)*N/(N+h))))); - h = sqrt(X^2+Y^2)/cos(phi)-N; - - iterations = iterations + 1; - if iterations > 100 - fprintf('Failed to approximate h with desired precision. h-oldh: %e.\n', h-oldh); - break; - end + oldh = h; + N = c/sqrt(1+ex2*cos(phi)^2); + phi = atan(Z/((sqrt(X^2+Y^2)*(1-(2-f(i))*f(i)*N/(N+h))))); + h = sqrt(X^2+Y^2)/cos(phi)-N; + + iterations = iterations + 1; + if iterations > 100 + fprintf('Failed to approximate h with desired precision. h-oldh: %e.\n', h-oldh); + break; + end end phi = phi*180/pi; @@ -57,4 +54,5 @@ lambda = lambda*180/pi; %fprintf('\n phi =%3.0f %3.0f %8.5f',b(1),b(2),b(3)) %fprintf('\n lambda =%3.0f %3.0f %8.5f',l(1),l(2),l(3)) %fprintf('\n h =%14.3f\n',h) + %%%%%%%%%%%%%% end cart2geo.m %%%%%%%%%%%%%%%%%%% diff --git a/src/utils/matlab/libs/geoFunctions/cart2utm.m b/src/utils/matlab/libs/geoFunctions/cart2utm.m index b3bec8969..8617bf541 100644 --- a/src/utils/matlab/libs/geoFunctions/cart2utm.m +++ b/src/utils/matlab/libs/geoFunctions/cart2utm.m @@ -1,7 +1,7 @@ function [E, N, U] = cart2utm(X, Y, Z, zone) -%CART2UTM Transformation of (X,Y,Z) to (N,E,U) in UTM, zone 'zone'. +% CART2UTM Transformation of (X,Y,Z) to (N,E,U) in UTM, zone 'zone'. % -%[E, N, U] = cart2utm(X, Y, Z, zone); +% [E, N, U] = cart2utm(X, Y, Z, zone); % % Inputs: % X,Y,Z - Cartesian coordinates. Coordinates are referenced @@ -12,19 +12,16 @@ function [E, N, U] = cart2utm(X, Y, Z, zone) % Outputs: % E, N, U - UTM coordinates (Easting, Northing, Uping) -%Kai Borre -11-1994 -%Copyright (c) by Kai Borre -% -% CVS record: -% $Id: cart2utm.m,v 1.1.1.1.2.6 2007/01/30 09:45:12 dpl Exp $ +% Kai Borre -11-1994 +% Copyright (c) by Kai Borre -%This implementation is based upon -%O. Andersson & K. Poder (1981) Koordinattransformationer +% This implementation is based upon +% O. Andersson & K. Poder (1981) Koordinattransformationer % ved Geod\ae{}tisk Institut. Landinspekt\oe{}ren % Vol. 30: 552--571 and Vol. 31: 76 % -%An excellent, general reference (KW) is -%R. Koenig & K.H. Weise (1951) Mathematische Grundlagen der +% An excellent, general reference (KW) is +% R. Koenig & K.H. Weise (1951) Mathematische Grundlagen der % h\"oheren Geod\"asie und Kartographie. % Erster Band, Springer Verlag @@ -52,8 +49,8 @@ c = a * sqrt(1+ex2); vec = [X; Y; Z-4.5]; alpha = .756e-6; R = [ 1 -alpha 0; - alpha 1 0; - 0 0 1]; + alpha 1 0; + 0 0 1]; trans = [89.5; 93.8; 127.6]; scale = 0.9999988; v = scale*R*vec + trans; % coordinate vector in ED50 @@ -68,78 +65,78 @@ while abs(U-oldU) > 1.e-4 N1 = c/sqrt(1+ex2*(cos(B))^2); B = atan2(v(3)/((1-f)^2*N1+U), norm(v(1:2))/(N1+U) ); U = norm(v(1:2))/cos(B)-N1; - - iterations = iterations + 1; - if iterations > 100 - fprintf('Failed to approximate U with desired precision. U-oldU: %e.\n', U-oldU); - break; - end + + iterations = iterations + 1; + if iterations > 100 + fprintf('Failed to approximate U with desired precision. U-oldU: %e.\n', U-oldU); + break; + end end -%Normalized meridian quadrant, KW p. 50 (96), p. 19 (38b), p. 5 (21) +% Normalized meridian quadrant, KW p. 50 (96), p. 19 (38b), p. 5 (21) m0 = 0.0004; n = f / (2-f); m = n^2 * (1/4 + n*n/64); w = (a*(-n-m0+m*(1-m0))) / (1+n); Q_n = a + w; -%Easting and longitude of central meridian +% Easting and longitude of central meridian E0 = 500000; L0 = (zone-30)*6 - 3; -%Check tolerance for reverse transformation +% Check tolerance for reverse transformation tolutm = pi/2 * 1.2e-10 * Q_n; tolgeo = 0.000040; -%Coefficients of trigonometric series +% Coefficients of trigonometric series -%ellipsoidal to spherical geographical, KW p. 186--187, (51)-(52) +% ellipsoidal to spherical geographical, KW p. 186--187, (51)-(52) % bg[1] = n*(-2 + n*(2/3 + n*(4/3 + n*(-82/45)))); % bg[2] = n^2*(5/3 + n*(-16/15 + n*(-13/9))); % bg[3] = n^3*(-26/15 + n*34/21); % bg[4] = n^4*1237/630; -%spherical to ellipsoidal geographical, KW p. 190--191, (61)-(62) +% spherical to ellipsoidal geographical, KW p. 190--191, (61)-(62) % gb[1] = n*(2 + n*(-2/3 + n*(-2 + n*116/45))); % gb[2] = n^2*(7/3 + n*(-8/5 + n*(-227/45))); % gb[3] = n^3*(56/15 + n*(-136/35)); % gb[4] = n^4*4279/630; -%spherical to ellipsoidal N, E, KW p. 196, (69) -% gtu[1] = n*(1/2 + n*(-2/3 + n*(5/16 + n*41/180))); -% gtu[2] = n^2*(13/48 + n*(-3/5 + n*557/1440)); -% gtu[3] = n^3*(61/240 + n*(-103/140)); -% gtu[4] = n^4*49561/161280; +% spherical to ellipsoidal N, E, KW p. 196, (69) +% gtu[1] = n*(1/2 + n*(-2/3 + n*(5/16 + n*41/180))); +% gtu[2] = n^2*(13/48 + n*(-3/5 + n*557/1440)); +% gtu[3] = n^3*(61/240 + n*(-103/140)); +% gtu[4] = n^4*49561/161280; -%ellipsoidal to spherical N, E, KW p. 194, (65) -% utg[1] = n*(-1/2 + n*(2/3 + n*(-37/96 + n*1/360))); -% utg[2] = n^2*(-1/48 + n*(-1/15 + n*437/1440)); -% utg[3] = n^3*(-17/480 + n*37/840); -% utg[4] = n^4*(-4397/161280); +% ellipsoidal to spherical N, E, KW p. 194, (65) +% utg[1] = n*(-1/2 + n*(2/3 + n*(-37/96 + n*1/360))); +% utg[2] = n^2*(-1/48 + n*(-1/15 + n*437/1440)); +% utg[3] = n^3*(-17/480 + n*37/840); +% utg[4] = n^4*(-4397/161280); -%With f = 1/297 we get +% With f = 1/297 we get bg = [-3.37077907e-3; - 4.73444769e-6; - -8.29914570e-9; - 1.58785330e-11]; + 4.73444769e-6; + -8.29914570e-9; + 1.58785330e-11]; gb = [ 3.37077588e-3; - 6.62769080e-6; - 1.78718601e-8; - 5.49266312e-11]; + 6.62769080e-6; + 1.78718601e-8; + 5.49266312e-11]; gtu = [ 8.41275991e-4; - 7.67306686e-7; - 1.21291230e-9; - 2.48508228e-12]; + 7.67306686e-7; + 1.21291230e-9; + 2.48508228e-12]; utg = [-8.41276339e-4; - -5.95619298e-8; - -1.69485209e-10; - -2.20473896e-13]; + -5.95619298e-8; + -1.69485209e-10; + -2.20473896e-13]; -%Ellipsoidal latitude, longitude to spherical latitude, longitude +% Ellipsoidal latitude, longitude to spherical latitude, longitude neg_geo = 'FALSE'; if B < 0 @@ -152,7 +149,7 @@ Bg_r = Bg_r + res_clensin; L0 = L0*pi / 180; Lg_r = L - L0; -%Spherical latitude, longitude to complementary spherical latitude +% Spherical latitude, longitude to complementary spherical latitude % i.e. spherical N, E cos_BN = cos(Bg_r); Np = atan2(sin(Bg_r), cos(Lg_r)*cos_BN); diff --git a/src/utils/matlab/libs/geoFunctions/check_t.m b/src/utils/matlab/libs/geoFunctions/check_t.m index 9d503c3e9..5c3cb6148 100644 --- a/src/utils/matlab/libs/geoFunctions/check_t.m +++ b/src/utils/matlab/libs/geoFunctions/check_t.m @@ -1,7 +1,7 @@ function corrTime = check_t(time) -%CHECK_T accounting for beginning or end of week crossover. +% CHECK_T accounting for beginning or end of week crossover. % -%corrTime = check_t(time); +% corrTime = check_t(time); % % Inputs: % time - time in seconds @@ -9,11 +9,8 @@ function corrTime = check_t(time) % Outputs: % corrTime - corrected time (seconds) -%Kai Borre 04-01-96 -%Copyright (c) by Kai Borre -% -% CVS record: -% $Id: check_t.m,v 1.1.1.1.2.4 2006/08/22 13:45:59 dpl Exp $ +% Kai Borre 04-01-96 +% Copyright (c) by Kai Borre %========================================================================== half_week = 302400; % seconds @@ -24,5 +21,6 @@ if time > half_week corrTime = time - 2*half_week; elseif time < -half_week corrTime = time + 2*half_week; -end -%%%%%%% end check_t.m %%%%%%%%%%%%%%%%% \ No newline at end of file +end + +%%%%%%% end check_t.m %%%%%%%%%%%%%%%%% diff --git a/src/utils/matlab/libs/geoFunctions/clksin.m b/src/utils/matlab/libs/geoFunctions/clksin.m index 7ccd4726f..99a16331e 100644 --- a/src/utils/matlab/libs/geoFunctions/clksin.m +++ b/src/utils/matlab/libs/geoFunctions/clksin.m @@ -1,14 +1,12 @@ function [re, im] = clksin(ar, degree, arg_real, arg_imag) -%Clenshaw summation of sinus with complex argument -%[re, im] = clksin(ar, degree, arg_real, arg_imag); +% Clenshaw summation of sinus with complex argument +% [re, im] = clksin(ar, degree, arg_real, arg_imag); % Written by Kai Borre % December 20, 1995 % % See also WGS2UTM or CART2UTM % -% CVS record: -% $Id: clksin.m,v 1.1.1.1.2.4 2006/08/22 13:45:59 dpl Exp $ %========================================================================== sin_arg_r = sin(arg_real); diff --git a/src/utils/matlab/libs/geoFunctions/clsin.m b/src/utils/matlab/libs/geoFunctions/clsin.m index d499e8598..15b6d5b7b 100644 --- a/src/utils/matlab/libs/geoFunctions/clsin.m +++ b/src/utils/matlab/libs/geoFunctions/clsin.m @@ -1,15 +1,12 @@ function result = clsin(ar, degree, argument) -%Clenshaw summation of sinus of argument. +% Clenshaw summation of sinus of argument. % -%result = clsin(ar, degree, argument); +% result = clsin(ar, degree, argument); % Written by Kai Borre % December 20, 1995 % % See also WGS2UTM or CART2UTM -% -% CVS record: -% $Id: clsin.m,v 1.1.1.1.2.4 2006/08/22 13:45:59 dpl Exp $ %========================================================================== cos_arg = 2 * cos(argument); @@ -17,10 +14,11 @@ hr1 = 0; hr = 0; for t = degree : -1 : 1 - hr2 = hr1; - hr1 = hr; - hr = ar(t) + cos_arg*hr1 - hr2; + hr2 = hr1; + hr1 = hr; + hr = ar(t) + cos_arg*hr1 - hr2; end -result = hr * sin(argument); -%%%%%%%%%%%%%%%%%%%%%%% end clsin.m %%%%%%%%%%%%%%%%%%%%% \ No newline at end of file +result = hr * sin(argument); + +%%%%%%%%%%%%%%%%%%%%%%% end clsin.m %%%%%%%%%%%%%%%%%%%%% diff --git a/src/utils/matlab/libs/geoFunctions/deg2dms.m b/src/utils/matlab/libs/geoFunctions/deg2dms.m index 56ce6ae90..c7fc195df 100644 --- a/src/utils/matlab/libs/geoFunctions/deg2dms.m +++ b/src/utils/matlab/libs/geoFunctions/deg2dms.m @@ -1,6 +1,6 @@ function dmsOutput = deg2dms(deg) -%DEG2DMS Conversion of degrees to degrees, minutes, and seconds. -%The output format (dms format) is: (degrees*100 + minutes + seconds/100) +% DEG2DMS Conversion of degrees to degrees, minutes, and seconds. +% The output format (dms format) is: (degrees*100 + minutes + seconds/100) % Written by Kai Borre % February 7, 2001 @@ -11,7 +11,7 @@ neg_arg = false; if deg < 0 % Only positive numbers should be used while spliting into deg/min/sec deg = -deg; - neg_arg = true; + neg_arg = true; end %%% Split degrees minutes and seconds @@ -40,4 +40,4 @@ if neg_arg == true dmsOutput = -dmsOutput; end -%%%%%%%%%%%%%%%%%%% end deg2dms.m %%%%%%%%%%%%%%%% \ No newline at end of file +%%%%%%%%%%%%%%%%%%% end deg2dms.m %%%%%%%%%%%%%%%% diff --git a/src/utils/matlab/libs/geoFunctions/dms2deg.m b/src/utils/matlab/libs/geoFunctions/dms2deg.m index 077fc8639..1b4420dd0 100644 --- a/src/utils/matlab/libs/geoFunctions/dms2deg.m +++ b/src/utils/matlab/libs/geoFunctions/dms2deg.m @@ -1,12 +1,12 @@ function deg = dms2deg(dms) -%DMS2DEG Conversion of degrees, minutes, and seconds to degrees. +% DMS2DEG Conversion of degrees, minutes, and seconds to degrees. % Written by Javier Arribas 2011 % December 7, 2011 %if (dms(1)>=0) - deg=dms(1)+dms(2)/60+dms(3)/3600; +deg=dms(1)+dms(2)/60+dms(3)/3600; %else - %deg=dms(1)-dms(2)/60-dms(3)/3600; +%deg=dms(1)-dms(2)/60-dms(3)/3600; %end diff --git a/src/utils/matlab/libs/geoFunctions/dms2mat.m b/src/utils/matlab/libs/geoFunctions/dms2mat.m index da17b590b..a7d5b7023 100644 --- a/src/utils/matlab/libs/geoFunctions/dms2mat.m +++ b/src/utils/matlab/libs/geoFunctions/dms2mat.m @@ -1,6 +1,6 @@ function [dout,mout,sout] = dms2mat(dms,n) -%DMS2MAT Converts a dms vector format to a [deg min sec] matrix +% DMS2MAT Converts a dms vector format to a [deg min sec] matrix % % [d,m,s] = DMS2MAT(dms) converts a dms vector format to a % deg:min:sec matrix. The vector format is dms = 100*deg + min + sec/100. @@ -19,7 +19,7 @@ function [dout,mout,sout] = dms2mat(dms,n) % Copyright 1996-2002 Systems Planning and Analysis, Inc. and The MathWorks, Inc. % Written by: E. Byrns, E. Brown -% $Revision: 1.10 $ $Date: 2002/03/20 21:25:06 $ +% Revision: 1.10 $Date: 2002/03/20 21:25:06 if nargin == 0 @@ -71,7 +71,7 @@ if ~isempty(indx); d(indx) = d(indx) + 1; m(indx) = m(indx) - 60; end if any(m > 59) | any (m < 0) error('Minutes must be >= 0 and <= 59') - + elseif any(s >= 60) | any( s < 0) error('Seconds must be >= 0 and < 60') end diff --git a/src/utils/matlab/libs/geoFunctions/e_r_corr.m b/src/utils/matlab/libs/geoFunctions/e_r_corr.m index 974b233ba..4d93d9f2f 100644 --- a/src/utils/matlab/libs/geoFunctions/e_r_corr.m +++ b/src/utils/matlab/libs/geoFunctions/e_r_corr.m @@ -1,8 +1,8 @@ function X_sat_rot = e_r_corr(traveltime, X_sat) -%E_R_CORR Returns rotated satellite ECEF coordinates due to Earth -%rotation during signal travel time +% E_R_CORR Returns rotated satellite ECEF coordinates due to Earth +% rotation during signal travel time % -%X_sat_rot = e_r_corr(traveltime, X_sat); +% X_sat_rot = e_r_corr(traveltime, X_sat); % % Inputs: % travelTime - signal travel time @@ -11,11 +11,8 @@ function X_sat_rot = e_r_corr(traveltime, X_sat) % Outputs: % X_sat_rot - rotated satellite's coordinates (ECEF) -%Written by Kai Borre -%Copyright (c) by Kai Borre -% -% CVS record: -% $Id: e_r_corr.m,v 1.1.1.1.2.6 2006/08/22 13:45:59 dpl Exp $ +% Written by Kai Borre +% Copyright (c) by Kai Borre %========================================================================== Omegae_dot = 7.292115147e-5; % rad/sec @@ -25,10 +22,10 @@ omegatau = Omegae_dot * traveltime; %--- Make a rotation matrix ----------------------------------------------- R3 = [ cos(omegatau) sin(omegatau) 0; - -sin(omegatau) cos(omegatau) 0; - 0 0 1]; + -sin(omegatau) cos(omegatau) 0; + 0 0 1]; %--- Do the rotation ------------------------------------------------------ X_sat_rot = R3 * X_sat; -%%%%%%%% end e_r_corr.m %%%%%%%%%%%%%%%%%%%% \ No newline at end of file +%%%%%%%% end e_r_corr.m %%%%%%%%%%%%%%%%%%%% diff --git a/src/utils/matlab/libs/geoFunctions/findUtmZone.m b/src/utils/matlab/libs/geoFunctions/findUtmZone.m index 7630bf8e1..1294c7837 100644 --- a/src/utils/matlab/libs/geoFunctions/findUtmZone.m +++ b/src/utils/matlab/libs/geoFunctions/findUtmZone.m @@ -1,17 +1,17 @@ function utmZone = findUtmZone(latitude, longitude) -%Function finds the UTM zone number for given longitude and latitude. -%The longitude value must be between -180 (180 degree West) and 180 (180 -%degree East) degree. The latitude must be within -80 (80 degree South) and -%84 (84 degree North). +% Function finds the UTM zone number for given longitude and latitude. +% The longitude value must be between -180 (180 degree West) and 180 (180 +% degree East) degree. The latitude must be within -80 (80 degree South) and +% 84 (84 degree North). % -%utmZone = findUtmZone(latitude, longitude); +% utmZone = findUtmZone(latitude, longitude); % -%Latitude and longitude must be in decimal degrees (e.g. 15.5 degrees not -%15 deg 30 min). +% Latitude and longitude must be in decimal degrees (e.g. 15.5 degrees not +% 15 deg 30 min). %-------------------------------------------------------------------------- % SoftGNSS v3.0 -% +% % Copyright (C) Darius Plausinaitis % Written by Darius Plausinaitis %-------------------------------------------------------------------------- @@ -31,9 +31,6 @@ function utmZone = findUtmZone(latitude, longitude) %USA. %========================================================================== -%CVS record: -%$Id: findUtmZone.m,v 1.1.2.2 2006/08/22 13:45:59 dpl Exp $ - %% Check value bounds ===================================================== if ((longitude > 180) || (longitude < -180)) @@ -62,11 +59,11 @@ if (latitude > 72) utmZone = 35; elseif ((longitude >= 33) && (longitude < 42)) utmZone = 37; - end + end elseif ((latitude >= 56) && (latitude < 64)) % Correction for zone 32 if ((longitude >= 3) && (longitude < 12)) utmZone = 32; end -end \ No newline at end of file +end diff --git a/src/utils/matlab/libs/geoFunctions/geo2cart.m b/src/utils/matlab/libs/geoFunctions/geo2cart.m index 02f0d5768..3297e966a 100644 --- a/src/utils/matlab/libs/geoFunctions/geo2cart.m +++ b/src/utils/matlab/libs/geoFunctions/geo2cart.m @@ -1,13 +1,13 @@ function [X, Y, Z] = geo2cart(phi, lambda, h, i) -%GEO2CART Conversion of geographical coordinates (phi, lambda, h) to -%Cartesian coordinates (X, Y, Z). +% GEO2CART Conversion of geographical coordinates (phi, lambda, h) to +% Cartesian coordinates (X, Y, Z). % -%[X, Y, Z] = geo2cart(phi, lambda, h, i); +% [X, Y, Z] = geo2cart(phi, lambda, h, i); % -%Format for phi and lambda: [degrees minutes seconds]. -%h, X, Y, and Z are in meters. +% Format for phi and lambda: [degrees minutes seconds]. +% h, X, Y, and Z are in meters. % -%Choices i of Reference Ellipsoid +% Choices i of Reference Ellipsoid % 1. International Ellipsoid 1924 % 2. International Ellipsoid 1967 % 3. World Geodetic System 1972 @@ -16,18 +16,15 @@ function [X, Y, Z] = geo2cart(phi, lambda, h, i) % % Inputs: % phi - geocentric latitude (format [degrees minutes seconds]) -% lambda - geocentric longitude (format [degrees minutes seconds]) +% lambda - geocentric longitude (format [degrees minutes seconds]) % h - height % i - reference ellipsoid type % % Outputs: % X, Y, Z - Cartesian coordinates (meters) -%Kai Borre 10-13-98 -%Copyright (c) by Kai Borre -% -% CVS record: -% $Id: geo2cart.m,v 1.1.2.7 2006/08/22 13:45:59 dpl Exp $ +% Kai Borre 10-13-98 +% Copyright (c) by Kai Borre %========================================================================== b = phi(1) + phi(2)/60 + phi(3)/3600; @@ -44,5 +41,6 @@ N = c / sqrt(1 + ex2*cos(b)^2); X = (N+h) * cos(b) * cos(l); Y = (N+h) * cos(b) * sin(l); -Z = ((1-f(i))^2*N + h) * sin(b); +Z = ((1-f(i))^2*N + h) * sin(b); + %%%%%%%%%%%%%% end geo2cart.m %%%%%%%%%%%%%%%%%%%%%%%% diff --git a/src/utils/matlab/libs/geoFunctions/leastSquarePos.m b/src/utils/matlab/libs/geoFunctions/leastSquarePos.m index 07d04f080..6f5c46f4f 100644 --- a/src/utils/matlab/libs/geoFunctions/leastSquarePos.m +++ b/src/utils/matlab/libs/geoFunctions/leastSquarePos.m @@ -1,7 +1,7 @@ function [pos, el, az, dop] = leastSquarePos(satpos, obs, settings) -%Function calculates the Least Square Solution. +% Function calculates the Least Square Solution. % -%[pos, el, az, dop] = leastSquarePos(satpos, obs, settings); +% [pos, el, az, dop] = leastSquarePos(satpos, obs, settings); % % Inputs: % satpos - Satellites positions (in ECEF system: [X; Y; Z;] - @@ -12,8 +12,8 @@ function [pos, el, az, dop] = leastSquarePos(satpos, obs, settings) % settings - receiver settings % % Outputs: -% pos - receiver position and receiver clock error -% (in ECEF system: [X, Y, Z, dt]) +% pos - receiver position and receiver clock error +% (in ECEF system: [X, Y, Z, dt]) % el - Satellites elevation angles (degrees) % az - Satellites azimuth angles (degrees) % dop - Dilutions Of Precision ([GDOP PDOP HDOP VDOP TDOP]) @@ -24,9 +24,6 @@ function [pos, el, az, dop] = leastSquarePos(satpos, obs, settings) %Based on Kai Borre %Copyright (c) by Kai Borre %Updated by Darius Plausinaitis, Peter Rinder and Nicolaj Bertelsen -% -% CVS record: -% $Id: leastSquarePos.m,v 1.1.2.12 2006/08/22 13:45:59 dpl Exp $ %========================================================================== %=== Initialization ======================================================= @@ -44,7 +41,7 @@ el = az; %=== Iteratively find receiver position =================================== for iter = 1:nmbOfIterations - + for i = 1:nmbOfSatellites if iter == 1 %--- Initialize variables at the first iteration -------------- @@ -53,41 +50,41 @@ for iter = 1:nmbOfIterations else %--- Update equations ----------------------------------------- rho2 = (X(1, i) - pos(1))^2 + (X(2, i) - pos(2))^2 + ... - (X(3, i) - pos(3))^2; + (X(3, i) - pos(3))^2; traveltime = sqrt(rho2) / settings.c ; - + %--- Correct satellite position (do to earth rotation) -------- Rot_X = e_r_corr(traveltime, X(:, i)); - + %--- Find the elevation angel of the satellite ---------------- [az(i), el(i), dist] = topocent(pos(1:3, :), Rot_X - pos(1:3, :)); - + if (settings.useTropCorr == 1) %--- Calculate tropospheric correction -------------------- trop = tropo(sin(el(i) * dtr), ... - 0.0, 1013.0, 293.0, 50.0, 0.0, 0.0, 0.0); + 0.0, 1013.0, 293.0, 50.0, 0.0, 0.0, 0.0); else % Do not calculate or apply the tropospheric corrections trop = 0; end - end % if iter == 1 ... ... else - + end % if iter == 1 ... ... else + %--- Apply the corrections ---------------------------------------- omc(i) = (obs(i) - norm(Rot_X - pos(1:3), 'fro') - pos(4) - trop); - + %--- Construct the A matrix --------------------------------------- A(i, :) = [ (-(Rot_X(1) - pos(1))) / obs(i) ... - (-(Rot_X(2) - pos(2))) / obs(i) ... - (-(Rot_X(3) - pos(3))) / obs(i) ... - 1 ]; + (-(Rot_X(2) - pos(2))) / obs(i) ... + (-(Rot_X(3) - pos(3))) / obs(i) ... + 1 ]; end % for i = 1:nmbOfSatellites - + % These lines allow the code to exit gracefully in case of any errors if rank(A) ~= 4 pos = zeros(1, 4); return end - + %--- Find position update --------------------------------------------- x = A \ omc; @@ -106,7 +103,7 @@ if nargout == 4 %--- Calculate DOP ---------------------------------------------------- Q = inv(A'*A); - dop(1) = sqrt(trace(Q)); % GDOP + dop(1) = sqrt(trace(Q)); % GDOP dop(2) = sqrt(Q(1,1) + Q(2,2) + Q(3,3)); % PDOP dop(3) = sqrt(Q(1,1) + Q(2,2)); % HDOP dop(4) = sqrt(Q(3,3)); % VDOP diff --git a/src/utils/matlab/libs/geoFunctions/mat2dms.m b/src/utils/matlab/libs/geoFunctions/mat2dms.m index 839a0a62a..1c3787ab6 100644 --- a/src/utils/matlab/libs/geoFunctions/mat2dms.m +++ b/src/utils/matlab/libs/geoFunctions/mat2dms.m @@ -1,6 +1,5 @@ function dmsvec = mat2dms(d,m,s,n) - -%MAT2DMS Converts a [deg min sec] matrix to vector format +% MAT2DMS Converts a [deg min sec] matrix to vector format % % dms = MAT2DMS(d,m,s) converts a deg:min:sec matrix into a vector % format. The vector format is dms = 100*deg + min + sec/100. @@ -24,12 +23,12 @@ function dmsvec = mat2dms(d,m,s,n) % Copyright 1996-2002 Systems Planning and Analysis, Inc. and The MathWorks, Inc. % Written by: E. Byrns, E. Brown -% $Revision: 1.10 $ $Date: 2002/03/20 21:25:51 $ +% Revision: 1.10 Date: 2002/03/20 21:25:51 if nargin == 0 error('Incorrect number of arguments') - + elseif nargin==1 if size(d,2)== 3 s = d(:,3); m = d(:,2); d = d(:,1); @@ -41,11 +40,11 @@ elseif nargin==1 error('Single input matrices must be n-by-2 or n-by-3.'); end n = -5; - + elseif nargin == 2 s = zeros(size(d)); n = -5; - + elseif nargin == 3 n = -5; end diff --git a/src/utils/matlab/libs/geoFunctions/roundn.m b/src/utils/matlab/libs/geoFunctions/roundn.m index 936e114a5..ef9c53f4c 100644 --- a/src/utils/matlab/libs/geoFunctions/roundn.m +++ b/src/utils/matlab/libs/geoFunctions/roundn.m @@ -1,6 +1,6 @@ function [x,msg] = roundn(x,n) -%ROUNDN Rounds input data at specified power of 10 +% ROUNDN Rounds input data at specified power of 10 % % y = ROUNDN(x) rounds the input data x to the nearest hundredth. % @@ -15,7 +15,7 @@ function [x,msg] = roundn(x,n) % Copyright 1996-2002 Systems Planning and Analysis, Inc. and The MathWorks, Inc. % Written by: E. Byrns, E. Brown -% $Revision: 1.9 $ $Date: 2002/03/20 21:26:19 $ +% Revision: 1.9 Date: 2002/03/20 21:26:19 msg = []; % Initialize output @@ -43,4 +43,4 @@ factors = 10 ^ (fix(-n)); % Set the significant digits for the input data -x = round(x * factors) / factors; \ No newline at end of file +x = round(x * factors) / factors; diff --git a/src/utils/matlab/libs/geoFunctions/satpos.m b/src/utils/matlab/libs/geoFunctions/satpos.m index 14adf6570..11f4f101e 100644 --- a/src/utils/matlab/libs/geoFunctions/satpos.m +++ b/src/utils/matlab/libs/geoFunctions/satpos.m @@ -1,9 +1,9 @@ function [satPositions, satClkCorr] = satpos(transmitTime, prnList, ... - eph, settings) -%SATPOS Computation of satellite coordinates X,Y,Z at TRANSMITTIME for -%given ephemeris EPH. Coordinates are computed for each satellite in the -%list PRNLIST. -%[satPositions, satClkCorr] = satpos(transmitTime, prnList, eph, settings); + eph, settings) +% SATPOS Computation of satellite coordinates X,Y,Z at TRANSMITTIME for +% given ephemeris EPH. Coordinates are computed for each satellite in the +% list PRNLIST. +%[ satPositions, satClkCorr] = satpos(transmitTime, prnList, eph, settings); % % Inputs: % transmitTime - transmission time @@ -18,25 +18,22 @@ function [satPositions, satClkCorr] = satpos(transmitTime, prnList, ... %-------------------------------------------------------------------------- % SoftGNSS v3.0 %-------------------------------------------------------------------------- -%Based on Kai Borre 04-09-96 -%Copyright (c) by Kai Borre -%Updated by Darius Plausinaitis, Peter Rinder and Nicolaj Bertelsen -% -% CVS record: -% $Id: satpos.m,v 1.1.2.17 2007/01/30 09:45:12 dpl Exp $ +% Based on Kai Borre 04-09-96 +% Copyright (c) by Kai Borre +% Updated by Darius Plausinaitis, Peter Rinder and Nicolaj Bertelsen %% Initialize constants =================================================== numOfSatellites = size(prnList, 2); % GPS constatns -gpsPi = 3.1415926535898; % Pi used in the GPS coordinate - % system +gpsPi = 3.1415926535898; % Pi used in the GPS coordinate +% system %--- Constants for satellite position calculation ------------------------- Omegae_dot = 7.2921151467e-5; % Earth rotation rate, [rad/s] GM = 3.986005e14; % Universal gravitational constant times - % the mass of the Earth, [m^3/s^2] +% the mass of the Earth, [m^3/s^2] F = -4.442807633e-10; % Constant, [sec/(meter)^(1/2)] %% Initialize results ===================================================== @@ -49,65 +46,65 @@ for satNr = 1 : numOfSatellites prn = prnList(satNr); -%% Find initial satellite clock correction -------------------------------- - + %% Find initial satellite clock correction -------------------------------- + %--- Find time difference --------------------------------------------- dt = check_t(transmitTime - eph(prn).t_oc); - + %--- Calculate clock correction --------------------------------------- satClkCorr(satNr) = (eph(prn).a_f2 * dt + eph(prn).a_f1) * dt + ... - eph(prn).a_f0 - ... - eph(prn).T_GD; - + eph(prn).a_f0 - ... + eph(prn).T_GD; + time = transmitTime - satClkCorr(satNr); - -%% Find satellite's position ---------------------------------------------- - + + %% Find satellite's position ---------------------------------------------- + %Restore semi-major axis a = eph(prn).sqrtA * eph(prn).sqrtA; - + %Time correction tk = check_t(time - eph(prn).t_oe); - + %Initial mean motion n0 = sqrt(GM / a^3); %Mean motion n = n0 + eph(prn).deltan; - + %Mean anomaly M = eph(prn).M_0 + n * tk; %Reduce mean anomaly to between 0 and 360 deg M = rem(M + 2*gpsPi, 2*gpsPi); - + %Initial guess of eccentric anomaly E = M; - + %--- Iteratively compute eccentric anomaly ---------------------------- for ii = 1:10 E_old = E; E = M + eph(prn).e * sin(E); dE = rem(E - E_old, 2*gpsPi); - + if abs(dE) < 1.e-12 - % Necessary precision is reached, exit from the loop + % Necessary precision is reached, exit from the loop break; end - end - + end + %Reduce eccentric anomaly to between 0 and 360 deg E = rem(E + 2*gpsPi, 2*gpsPi); - + %Compute relativistic correction term dtr = F * eph(prn).e * eph(prn).sqrtA * sin(E); - + %Calculate the true anomaly nu = atan2(sqrt(1 - eph(prn).e^2) * sin(E), cos(E)-eph(prn).e); - + %Compute angle phi phi = nu + eph(prn).omega; %Reduce phi to between 0 and 360 deg phi = rem(phi, 2*gpsPi); - + %Correct argument of latitude u = phi + ... eph(prn).C_uc * cos(2*phi) + ... @@ -120,22 +117,22 @@ for satNr = 1 : numOfSatellites i = eph(prn).i_0 + eph(prn).iDot * tk + ... eph(prn).C_ic * cos(2*phi) + ... eph(prn).C_is * sin(2*phi); - + %Compute the angle between the ascending node and the Greenwich meridian Omega = eph(prn).omega_0 + (eph(prn).omegaDot - Omegae_dot)*tk - ... - Omegae_dot * eph(prn).t_oe; + Omegae_dot * eph(prn).t_oe; %Reduce to between 0 and 360 deg Omega = rem(Omega + 2*gpsPi, 2*gpsPi); - + %--- Compute satellite coordinates ------------------------------------ satPositions(1, satNr) = cos(u)*r * cos(Omega) - sin(u)*r * cos(i)*sin(Omega); satPositions(2, satNr) = cos(u)*r * sin(Omega) + sin(u)*r * cos(i)*cos(Omega); satPositions(3, satNr) = sin(u)*r * sin(i); - - -%% Include relativistic correction in clock correction -------------------- + + + %% Include relativistic correction in clock correction -------------------- satClkCorr(satNr) = (eph(prn).a_f2 * dt + eph(prn).a_f1) * dt + ... - eph(prn).a_f0 - ... - eph(prn).T_GD + dtr; - + eph(prn).a_f0 - ... + eph(prn).T_GD + dtr; + end % for satNr = 1 : numOfSatellites diff --git a/src/utils/matlab/libs/geoFunctions/togeod.m b/src/utils/matlab/libs/geoFunctions/togeod.m index 99a43cc2c..9f7812d41 100644 --- a/src/utils/matlab/libs/geoFunctions/togeod.m +++ b/src/utils/matlab/libs/geoFunctions/togeod.m @@ -1,9 +1,9 @@ function [dphi, dlambda, h] = togeod(a, finv, X, Y, Z) -%TOGEOD Subroutine to calculate geodetic coordinates latitude, longitude, +% TOGEOD Subroutine to calculate geodetic coordinates latitude, longitude, % height given Cartesian coordinates X,Y,Z, and reference ellipsoid % values semi-major axis (a) and the inverse of flattening (finv). % -%[dphi, dlambda, h] = togeod(a, finv, X, Y, Z); +% [dphi, dlambda, h] = togeod(a, finv, X, Y, Z); % % The units of linear parameters X,Y,Z,a must all agree (m,km,mi,ft,..etc) % The output units of angular quantities will be in decimal degrees @@ -24,9 +24,6 @@ function [dphi, dlambda, h] = togeod(a, finv, X, Y, Z) % Reprinted with permission of author, 1996 % Fortran code translated into MATLAB % Kai Borre 03-30-96 -% -% CVS record: -% $Id: togeod.m,v 1.1.1.1.2.4 2006/08/22 13:45:59 dpl Exp $ %========================================================================== h = 0; @@ -100,7 +97,7 @@ for i = 1:maxit if (dP*dP + dZ*dZ < tolsq) break; end - + % Not Converged--Warn user if i == maxit fprintf([' Problem in TOGEOD, did not converge in %2.0f',... diff --git a/src/utils/matlab/libs/geoFunctions/topocent.m b/src/utils/matlab/libs/geoFunctions/topocent.m index a6f680bd1..7ec0aaede 100644 --- a/src/utils/matlab/libs/geoFunctions/topocent.m +++ b/src/utils/matlab/libs/geoFunctions/topocent.m @@ -1,24 +1,21 @@ function [Az, El, D] = topocent(X, dx) -%TOPOCENT Transformation of vector dx into topocentric coordinate +% TOPOCENT Transformation of vector dx into topocentric coordinate % system with origin at X. % Both parameters are 3 by 1 vectors. % -%[Az, El, D] = topocent(X, dx); +% [Az, El, D] = topocent(X, dx); % % Inputs: -% X - vector origin corrdinates (in ECEF system [X; Y; Z;]) -% dx - vector ([dX; dY; dZ;]). +% X - vector origin corrdinates (in ECEF system [X; Y; Z;]) +% dx - vector ([dX; dY; dZ;]). % % Outputs: % D - vector length. Units like units of the input % Az - azimuth from north positive clockwise, degrees % El - elevation angle, degrees -%Kai Borre 11-24-96 -%Copyright (c) by Kai Borre -% -% CVS record: -% $Id: topocent.m,v 1.1.1.1.2.4 2006/08/22 13:45:59 dpl Exp $ +% Kai Borre 11-24-96 +% Copyright (c) by Kai Borre %========================================================================== dtr = pi/180; @@ -27,12 +24,12 @@ dtr = pi/180; cl = cos(lambda * dtr); sl = sin(lambda * dtr); -cb = cos(phi * dtr); +cb = cos(phi * dtr); sb = sin(phi * dtr); F = [-sl -sb*cl cb*cl; - cl -sb*sl cb*sl; - 0 cb sb]; + cl -sb*sl cb*sl; + 0 cb sb]; local_vector = F' * dx; E = local_vector(1); @@ -54,4 +51,4 @@ if Az < 0 end D = sqrt(dx(1)^2 + dx(2)^2 + dx(3)^2); -%%%%%%%%% end topocent.m %%%%%%%%% \ No newline at end of file +%%%%%%%%% end topocent.m %%%%%%%%% diff --git a/src/utils/matlab/libs/geoFunctions/tropo.m b/src/utils/matlab/libs/geoFunctions/tropo.m index bd14b8c52..f0f08d218 100644 --- a/src/utils/matlab/libs/geoFunctions/tropo.m +++ b/src/utils/matlab/libs/geoFunctions/tropo.m @@ -1,9 +1,9 @@ function ddr = tropo(sinel, hsta, p, tkel, hum, hp, htkel, hhum) -%TROPO Calculation of tropospheric correction. +% TROPO Calculation of tropospheric correction. % The range correction ddr in m is to be subtracted from % pseudo-ranges and carrier phases % -%ddr = tropo(sinel, hsta, p, tkel, hum, hp, htkel, hhum); +% ddr = tropo(sinel, hsta, p, tkel, hum, hp, htkel, hhum); % % Inputs: % sinel - sin of elevation angle of satellite @@ -26,9 +26,6 @@ function ddr = tropo(sinel, hsta, p, tkel, hum, hp, htkel, hhum) % A Matlab reimplementation of a C code from driver. % Kai Borre 06-28-95 -% -% CVS record: -% $Id: tropo.m,v 1.1.1.1.2.4 2006/08/22 13:46:00 dpl Exp $ %========================================================================== a_e = 6378.137; % semi-major axis of earth ellipsoid @@ -60,14 +57,14 @@ while 1 % check to see if geometry is crazy if rtop < 0 - rtop = 0; - end + rtop = 0; + end rtop = sqrt(rtop) - (a_e+hsta)*sinel; a = -sinel/(htop-hsta); b = -b0*(1-sinel^2) / (htop-hsta); rn = zeros(8,1); - + for i = 1:8 rn(i) = rtop^(i+1); end @@ -77,17 +74,17 @@ while 1 b^2*(6*a^2+4*b)*1.428571e-1, 0, 0]; if b^2 > 1.0e-35 - alpha(7) = a*b^3/2; - alpha(8) = b^4/9; + alpha(7) = a*b^3/2; + alpha(8) = b^4/9; end - + dr = rtop; dr = dr + alpha*rn; tropo = tropo + dr*ref*1000; if done == 'TRUE ' - ddr = tropo; - break; + ddr = tropo; + break; end done = 'TRUE '; From aa1e98f943d52cd66bad123b94ead00c2f59a15b Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Fri, 30 Mar 2018 12:04:14 +0200 Subject: [PATCH 56/61] Get rid of ^M character --- src/utils/matlab/dll_pll_veml_plot_sample.m | 166 ++++---- .../galileo_e1_dll_pll_veml_plot_sample.m | 158 ++++---- .../matlab/glonass_ca_dll_pll_plot_sample.m | 146 +++---- .../matlab/gps_l1_ca_dll_pll_plot_sample.m | 150 +++---- .../matlab/gps_l1_ca_telemetry_plot_sample.m | 78 ++-- src/utils/matlab/libs/geoFunctions/cart2geo.m | 116 +++--- src/utils/matlab/libs/geoFunctions/cart2utm.m | 344 ++++++++-------- src/utils/matlab/libs/geoFunctions/check_t.m | 50 +-- src/utils/matlab/libs/geoFunctions/clksin.m | 72 ++-- src/utils/matlab/libs/geoFunctions/clsin.m | 46 +-- src/utils/matlab/libs/geoFunctions/deg2dms.m | 86 ++-- src/utils/matlab/libs/geoFunctions/dms2deg.m | 24 +- src/utils/matlab/libs/geoFunctions/dms2mat.m | 208 +++++----- src/utils/matlab/libs/geoFunctions/e_r_corr.m | 62 +-- .../matlab/libs/geoFunctions/findUtmZone.m | 138 +++---- src/utils/matlab/libs/geoFunctions/geo2cart.m | 90 ++--- .../matlab/libs/geoFunctions/leastSquarePos.m | 222 +++++------ src/utils/matlab/libs/geoFunctions/mat2dms.m | 248 ++++++------ src/utils/matlab/libs/geoFunctions/roundn.m | 92 ++--- src/utils/matlab/libs/geoFunctions/satpos.m | 276 ++++++------- src/utils/matlab/libs/geoFunctions/togeod.m | 218 +++++----- src/utils/matlab/libs/geoFunctions/topocent.m | 108 ++--- src/utils/matlab/libs/geoFunctions/tropo.m | 190 ++++----- src/utils/matlab/libs/plotNavigation.m | 332 ++++++++-------- src/utils/matlab/libs/plotTracking.m | 374 +++++++++--------- src/utils/matlab/libs/plotVEMLTracking.m | 324 +++++++-------- src/utils/matlab/plotTrackingE5a.m | 300 +++++++------- 27 files changed, 2309 insertions(+), 2309 deletions(-) diff --git a/src/utils/matlab/dll_pll_veml_plot_sample.m b/src/utils/matlab/dll_pll_veml_plot_sample.m index 273de3861..cd79955e3 100644 --- a/src/utils/matlab/dll_pll_veml_plot_sample.m +++ b/src/utils/matlab/dll_pll_veml_plot_sample.m @@ -1,83 +1,83 @@ -% Reads GNSS-SDR Tracking dump binary file using the provided -% function and plots some internal variables -% Javier Arribas, 2011. jarribas(at)cttc.es -% Antonio Ramos, 2018. antonio.ramos(at)cttc.es -% ------------------------------------------------------------------------- -% -% Copyright (C) 2010-2018 (see AUTHORS file for a list of contributors) -% -% GNSS-SDR is a software defined Global Navigation -% Satellite Systems receiver -% -% This file is part of GNSS-SDR. -% -% GNSS-SDR is free software: you can redistribute it and/or modify -% it under the terms of the GNU General Public License as published by -% the Free Software Foundation, either version 3 of the License, or -% at your option) any later version. -% -% GNSS-SDR is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with GNSS-SDR. If not, see . -% -% ------------------------------------------------------------------------- -% - -close all; -clear all; - -if ~exist('dll_pll_veml_read_tracking_dump.m', 'file') - addpath('./libs') -end - -samplingFreq = 5000000; %[Hz] -coherent_integration_time_ms = 20; %[ms] -channels = 5; % Number of channels -first_channel = 0; % Number of the first channel - -path = '/dump_dir/'; %% CHANGE THIS PATH - -for N=1:1:channels - tracking_log_path = [path 'track_ch_' num2str(N+first_channel-1) '.dat']; %% CHANGE track_ch_ BY YOUR dump_filename - GNSS_tracking(N) = dll_pll_veml_read_tracking_dump(tracking_log_path); -end - -% GNSS-SDR format conversion to MATLAB GPS receiver - -for N=1:1:channels - trackResults(N).status = 'T'; %fake track - trackResults(N).codeFreq = GNSS_tracking(N).code_freq_hz.'; - trackResults(N).carrFreq = GNSS_tracking(N).carrier_doppler_hz.'; - trackResults(N).dllDiscr = GNSS_tracking(N).code_error.'; - trackResults(N).dllDiscrFilt = GNSS_tracking(N).code_nco.'; - trackResults(N).pllDiscr = GNSS_tracking(N).carr_error.'; - trackResults(N).pllDiscrFilt = GNSS_tracking(N).carr_nco.'; - - trackResults(N).I_P = GNSS_tracking(N).P.'; - trackResults(N).Q_P = zeros(1,length(GNSS_tracking(N).P)); - - trackResults(N).I_VE = GNSS_tracking(N).VE.'; - trackResults(N).I_E = GNSS_tracking(N).E.'; - trackResults(N).I_L = GNSS_tracking(N).L.'; - trackResults(N).I_VL = GNSS_tracking(N).VL.'; - trackResults(N).Q_VE = zeros(1,length(GNSS_tracking(N).VE)); - trackResults(N).Q_E = zeros(1,length(GNSS_tracking(N).E)); - trackResults(N).Q_L = zeros(1,length(GNSS_tracking(N).L)); - trackResults(N).Q_VL = zeros(1,length(GNSS_tracking(N).VL)); - trackResults(N).data_I = GNSS_tracking(N).prompt_I.'; - trackResults(N).data_Q = GNSS_tracking(N).prompt_Q.'; - trackResults(N).PRN = GNSS_tracking(N).PRN.'; - trackResults(N).CNo = GNSS_tracking(N).CN0_SNV_dB_Hz.'; - - % Use original MATLAB tracking plot function - settings.numberOfChannels = channels; - settings.msToProcess = length(GNSS_tracking(N).E) * coherent_integration_time_ms; - plotVEMLTracking(N, trackResults, settings) -end - - - +% Reads GNSS-SDR Tracking dump binary file using the provided +% function and plots some internal variables +% Javier Arribas, 2011. jarribas(at)cttc.es +% Antonio Ramos, 2018. antonio.ramos(at)cttc.es +% ------------------------------------------------------------------------- +% +% Copyright (C) 2010-2018 (see AUTHORS file for a list of contributors) +% +% GNSS-SDR is a software defined Global Navigation +% Satellite Systems receiver +% +% This file is part of GNSS-SDR. +% +% GNSS-SDR is free software: you can redistribute it and/or modify +% it under the terms of the GNU General Public License as published by +% the Free Software Foundation, either version 3 of the License, or +% at your option) any later version. +% +% GNSS-SDR is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with GNSS-SDR. If not, see . +% +% ------------------------------------------------------------------------- +% + +close all; +clear all; + +if ~exist('dll_pll_veml_read_tracking_dump.m', 'file') + addpath('./libs') +end + +samplingFreq = 5000000; %[Hz] +coherent_integration_time_ms = 20; %[ms] +channels = 5; % Number of channels +first_channel = 0; % Number of the first channel + +path = '/dump_dir/'; %% CHANGE THIS PATH + +for N=1:1:channels + tracking_log_path = [path 'track_ch_' num2str(N+first_channel-1) '.dat']; %% CHANGE track_ch_ BY YOUR dump_filename + GNSS_tracking(N) = dll_pll_veml_read_tracking_dump(tracking_log_path); +end + +% GNSS-SDR format conversion to MATLAB GPS receiver + +for N=1:1:channels + trackResults(N).status = 'T'; %fake track + trackResults(N).codeFreq = GNSS_tracking(N).code_freq_hz.'; + trackResults(N).carrFreq = GNSS_tracking(N).carrier_doppler_hz.'; + trackResults(N).dllDiscr = GNSS_tracking(N).code_error.'; + trackResults(N).dllDiscrFilt = GNSS_tracking(N).code_nco.'; + trackResults(N).pllDiscr = GNSS_tracking(N).carr_error.'; + trackResults(N).pllDiscrFilt = GNSS_tracking(N).carr_nco.'; + + trackResults(N).I_P = GNSS_tracking(N).P.'; + trackResults(N).Q_P = zeros(1,length(GNSS_tracking(N).P)); + + trackResults(N).I_VE = GNSS_tracking(N).VE.'; + trackResults(N).I_E = GNSS_tracking(N).E.'; + trackResults(N).I_L = GNSS_tracking(N).L.'; + trackResults(N).I_VL = GNSS_tracking(N).VL.'; + trackResults(N).Q_VE = zeros(1,length(GNSS_tracking(N).VE)); + trackResults(N).Q_E = zeros(1,length(GNSS_tracking(N).E)); + trackResults(N).Q_L = zeros(1,length(GNSS_tracking(N).L)); + trackResults(N).Q_VL = zeros(1,length(GNSS_tracking(N).VL)); + trackResults(N).data_I = GNSS_tracking(N).prompt_I.'; + trackResults(N).data_Q = GNSS_tracking(N).prompt_Q.'; + trackResults(N).PRN = GNSS_tracking(N).PRN.'; + trackResults(N).CNo = GNSS_tracking(N).CN0_SNV_dB_Hz.'; + + % Use original MATLAB tracking plot function + settings.numberOfChannels = channels; + settings.msToProcess = length(GNSS_tracking(N).E) * coherent_integration_time_ms; + plotVEMLTracking(N, trackResults, settings) +end + + + diff --git a/src/utils/matlab/galileo_e1_dll_pll_veml_plot_sample.m b/src/utils/matlab/galileo_e1_dll_pll_veml_plot_sample.m index fb04ccd71..240c279f7 100644 --- a/src/utils/matlab/galileo_e1_dll_pll_veml_plot_sample.m +++ b/src/utils/matlab/galileo_e1_dll_pll_veml_plot_sample.m @@ -1,79 +1,79 @@ -% Reads GNSS-SDR Tracking dump binary file using the provided -% function and plots some internal variables -% Javier Arribas, 2011. jarribas(at)cttc.es -% ------------------------------------------------------------------------- -% -% Copyright (C) 2010-2018 (see AUTHORS file for a list of contributors) -% -% GNSS-SDR is a software defined Global Navigation -% Satellite Systems receiver -% -% This file is part of GNSS-SDR. -% -% GNSS-SDR is free software: you can redistribute it and/or modify -% it under the terms of the GNU General Public License as published by -% the Free Software Foundation, either version 3 of the License, or -% at your option) any later version. -% -% GNSS-SDR is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with GNSS-SDR. If not, see . -% -% ------------------------------------------------------------------------- -% - -close all; -clear all; - -if ~exist('dll_pll_veml_read_tracking_dump.m', 'file') - addpath('./libs') -end - -samplingFreq = 5000000; %[Hz] -channels = 7; % Number of channels -first_channel = 0; % Number of the first channel - -path = '/Users/carlesfernandez/git/cttc/build/'; %% CHANGE THIS PATH - -for N=1:1:channels - tracking_log_path = [path 'track_ch' num2str(N+first_channel-1) '.dat']; %% CHANGE track_ch BY YOUR dump_filename - GNSS_tracking(N) = dll_pll_veml_read_tracking_dump(tracking_log_path); -end - -% GNSS-SDR format conversion to MATLAB GPS receiver - -for N=1:1:channels - trackResults(N).status = 'T'; %fake track - trackResults(N).codeFreq = GNSS_tracking(N).code_freq_hz.'; - trackResults(N).carrFreq = GNSS_tracking(N).carrier_doppler_hz.'; - trackResults(N).dllDiscr = GNSS_tracking(N).code_error.'; - trackResults(N).dllDiscrFilt = GNSS_tracking(N).code_nco.'; - trackResults(N).pllDiscr = GNSS_tracking(N).carr_error.'; - trackResults(N).pllDiscrFilt = GNSS_tracking(N).carr_nco.'; - - trackResults(N).I_P = GNSS_tracking(N).prompt_I.'; - trackResults(N).Q_P = GNSS_tracking(N).prompt_Q.'; - - trackResults(N).I_VE = GNSS_tracking(N).VE.'; - trackResults(N).I_E = GNSS_tracking(N).E.'; - trackResults(N).I_L = GNSS_tracking(N).L.'; - trackResults(N).I_VL = GNSS_tracking(N).VL.'; - trackResults(N).Q_VE = zeros(1,length(GNSS_tracking(N).VE)); - trackResults(N).Q_E = zeros(1,length(GNSS_tracking(N).E)); - trackResults(N).Q_L = zeros(1,length(GNSS_tracking(N).L)); - trackResults(N).Q_VL = zeros(1,length(GNSS_tracking(N).VL)); - trackResults(N).PRN = GNSS_tracking(N).PRN.'; - trackResults(N).CNo = GNSS_tracking(N).CN0_SNV_dB_Hz.'; - - % Use original MATLAB tracking plot function - settings.numberOfChannels = channels; - settings.msToProcess = length(GNSS_tracking(N).E)*4; - plotVEMLTracking(N, trackResults, settings) -end - - - +% Reads GNSS-SDR Tracking dump binary file using the provided +% function and plots some internal variables +% Javier Arribas, 2011. jarribas(at)cttc.es +% ------------------------------------------------------------------------- +% +% Copyright (C) 2010-2018 (see AUTHORS file for a list of contributors) +% +% GNSS-SDR is a software defined Global Navigation +% Satellite Systems receiver +% +% This file is part of GNSS-SDR. +% +% GNSS-SDR is free software: you can redistribute it and/or modify +% it under the terms of the GNU General Public License as published by +% the Free Software Foundation, either version 3 of the License, or +% at your option) any later version. +% +% GNSS-SDR is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with GNSS-SDR. If not, see . +% +% ------------------------------------------------------------------------- +% + +close all; +clear all; + +if ~exist('dll_pll_veml_read_tracking_dump.m', 'file') + addpath('./libs') +end + +samplingFreq = 5000000; %[Hz] +channels = 7; % Number of channels +first_channel = 0; % Number of the first channel + +path = '/Users/carlesfernandez/git/cttc/build/'; %% CHANGE THIS PATH + +for N=1:1:channels + tracking_log_path = [path 'track_ch' num2str(N+first_channel-1) '.dat']; %% CHANGE track_ch BY YOUR dump_filename + GNSS_tracking(N) = dll_pll_veml_read_tracking_dump(tracking_log_path); +end + +% GNSS-SDR format conversion to MATLAB GPS receiver + +for N=1:1:channels + trackResults(N).status = 'T'; %fake track + trackResults(N).codeFreq = GNSS_tracking(N).code_freq_hz.'; + trackResults(N).carrFreq = GNSS_tracking(N).carrier_doppler_hz.'; + trackResults(N).dllDiscr = GNSS_tracking(N).code_error.'; + trackResults(N).dllDiscrFilt = GNSS_tracking(N).code_nco.'; + trackResults(N).pllDiscr = GNSS_tracking(N).carr_error.'; + trackResults(N).pllDiscrFilt = GNSS_tracking(N).carr_nco.'; + + trackResults(N).I_P = GNSS_tracking(N).prompt_I.'; + trackResults(N).Q_P = GNSS_tracking(N).prompt_Q.'; + + trackResults(N).I_VE = GNSS_tracking(N).VE.'; + trackResults(N).I_E = GNSS_tracking(N).E.'; + trackResults(N).I_L = GNSS_tracking(N).L.'; + trackResults(N).I_VL = GNSS_tracking(N).VL.'; + trackResults(N).Q_VE = zeros(1,length(GNSS_tracking(N).VE)); + trackResults(N).Q_E = zeros(1,length(GNSS_tracking(N).E)); + trackResults(N).Q_L = zeros(1,length(GNSS_tracking(N).L)); + trackResults(N).Q_VL = zeros(1,length(GNSS_tracking(N).VL)); + trackResults(N).PRN = GNSS_tracking(N).PRN.'; + trackResults(N).CNo = GNSS_tracking(N).CN0_SNV_dB_Hz.'; + + % Use original MATLAB tracking plot function + settings.numberOfChannels = channels; + settings.msToProcess = length(GNSS_tracking(N).E)*4; + plotVEMLTracking(N, trackResults, settings) +end + + + diff --git a/src/utils/matlab/glonass_ca_dll_pll_plot_sample.m b/src/utils/matlab/glonass_ca_dll_pll_plot_sample.m index d44799f6f..fc342eb26 100644 --- a/src/utils/matlab/glonass_ca_dll_pll_plot_sample.m +++ b/src/utils/matlab/glonass_ca_dll_pll_plot_sample.m @@ -1,73 +1,73 @@ -% Reads GNSS-SDR Tracking dump binary file using the provided -% function and plots some internal variables -% Damian Miralles, 2017. dmiralles2009(at)gmail.com -% ------------------------------------------------------------------------- -% -% Copyright (C) 2010-2018 (see AUTHORS file for a list of contributors) -% -% GNSS-SDR is a software defined Global Navigation -% Satellite Systems receiver -% -% This file is part of GNSS-SDR. -% -% GNSS-SDR is free software: you can redistribute it and/or modify -% it under the terms of the GNU General Public License as published by -% the Free Software Foundation, either version 3 of the License, or -% at your option) any later version. -% -% GNSS-SDR is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with GNSS-SDR. If not, see . -% -% ------------------------------------------------------------------------- -% - -close all; -clear all; - -if ~exist('dll_pll_veml_read_tracking_dump.m', 'file') - addpath('./libs') -end - - -samplingFreq = 6625000; %[Hz] -channels = 5; -first_channel = 0; - -path = '/archive/'; %% CHANGE THIS PATH - -for N=1:1:channels - tracking_log_path = [path 'glo_tracking_ch_' num2str(N+first_channel-1) '.dat']; %% CHANGE glo_tracking_ch_ BY YOUR dump_filename - GNSS_tracking(N) = dll_pll_veml_read_tracking_dump(tracking_log_path); -end - -% GNSS-SDR format conversion to MATLAB GPS receiver - -for N=1:1:channels - trackResults(N).status = 'T'; %fake track - trackResults(N).codeFreq = GNSS_tracking(N).code_freq_hz.'; - trackResults(N).carrFreq = GNSS_tracking(N).carrier_freq_hz.'; - trackResults(N).dllDiscr = GNSS_tracking(N).code_error.'; - trackResults(N).dllDiscrFilt = GNSS_tracking(N).code_nco.'; - trackResults(N).pllDiscr = GNSS_tracking(N).carr_error.'; - trackResults(N).pllDiscrFilt = GNSS_tracking(N).carr_nco.'; - - trackResults(N).I_P = GNSS_tracking(N).prompt_I.'; - trackResults(N).Q_P = GNSS_tracking(N).prompt_Q.'; - - trackResults(N).I_E = GNSS_tracking(N).E.'; - trackResults(N).I_L = GNSS_tracking(N).L.'; - trackResults(N).Q_E = zeros(1,length(GNSS_tracking(N).E)); - trackResults(N).Q_L = zeros(1,length(GNSS_tracking(N).E)); - trackResults(N).CNo = GNSS_tracking(N).CN0_SNV_dB_Hz.'; - trackResults(N).PRN = ones(1,length(GNSS_tracking(N).E)); - - % Use original MATLAB tracking plot function - settings.numberOfChannels = channels; - settings.msToProcess = length(GNSS_tracking(N).E); - plotTracking(N, trackResults, settings) -end +% Reads GNSS-SDR Tracking dump binary file using the provided +% function and plots some internal variables +% Damian Miralles, 2017. dmiralles2009(at)gmail.com +% ------------------------------------------------------------------------- +% +% Copyright (C) 2010-2018 (see AUTHORS file for a list of contributors) +% +% GNSS-SDR is a software defined Global Navigation +% Satellite Systems receiver +% +% This file is part of GNSS-SDR. +% +% GNSS-SDR is free software: you can redistribute it and/or modify +% it under the terms of the GNU General Public License as published by +% the Free Software Foundation, either version 3 of the License, or +% at your option) any later version. +% +% GNSS-SDR is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with GNSS-SDR. If not, see . +% +% ------------------------------------------------------------------------- +% + +close all; +clear all; + +if ~exist('dll_pll_veml_read_tracking_dump.m', 'file') + addpath('./libs') +end + + +samplingFreq = 6625000; %[Hz] +channels = 5; +first_channel = 0; + +path = '/archive/'; %% CHANGE THIS PATH + +for N=1:1:channels + tracking_log_path = [path 'glo_tracking_ch_' num2str(N+first_channel-1) '.dat']; %% CHANGE glo_tracking_ch_ BY YOUR dump_filename + GNSS_tracking(N) = dll_pll_veml_read_tracking_dump(tracking_log_path); +end + +% GNSS-SDR format conversion to MATLAB GPS receiver + +for N=1:1:channels + trackResults(N).status = 'T'; %fake track + trackResults(N).codeFreq = GNSS_tracking(N).code_freq_hz.'; + trackResults(N).carrFreq = GNSS_tracking(N).carrier_freq_hz.'; + trackResults(N).dllDiscr = GNSS_tracking(N).code_error.'; + trackResults(N).dllDiscrFilt = GNSS_tracking(N).code_nco.'; + trackResults(N).pllDiscr = GNSS_tracking(N).carr_error.'; + trackResults(N).pllDiscrFilt = GNSS_tracking(N).carr_nco.'; + + trackResults(N).I_P = GNSS_tracking(N).prompt_I.'; + trackResults(N).Q_P = GNSS_tracking(N).prompt_Q.'; + + trackResults(N).I_E = GNSS_tracking(N).E.'; + trackResults(N).I_L = GNSS_tracking(N).L.'; + trackResults(N).Q_E = zeros(1,length(GNSS_tracking(N).E)); + trackResults(N).Q_L = zeros(1,length(GNSS_tracking(N).E)); + trackResults(N).CNo = GNSS_tracking(N).CN0_SNV_dB_Hz.'; + trackResults(N).PRN = ones(1,length(GNSS_tracking(N).E)); + + % Use original MATLAB tracking plot function + settings.numberOfChannels = channels; + settings.msToProcess = length(GNSS_tracking(N).E); + plotTracking(N, trackResults, settings) +end diff --git a/src/utils/matlab/gps_l1_ca_dll_pll_plot_sample.m b/src/utils/matlab/gps_l1_ca_dll_pll_plot_sample.m index 7dd7aa3d6..093799f7d 100644 --- a/src/utils/matlab/gps_l1_ca_dll_pll_plot_sample.m +++ b/src/utils/matlab/gps_l1_ca_dll_pll_plot_sample.m @@ -1,75 +1,75 @@ -% Reads GNSS-SDR Tracking dump binary file using the provided -% function and plots some internal variables -% Javier Arribas, 2011. jarribas(at)cttc.es -% ------------------------------------------------------------------------- -% -% Copyright (C) 2010-2018 (see AUTHORS file for a list of contributors) -% -% GNSS-SDR is a software defined Global Navigation -% Satellite Systems receiver -% -% This file is part of GNSS-SDR. -% -% GNSS-SDR is free software: you can redistribute it and/or modify -% it under the terms of the GNU General Public License as published by -% the Free Software Foundation, either version 3 of the License, or -% at your option) any later version. -% -% GNSS-SDR is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with GNSS-SDR. If not, see . -% -% ------------------------------------------------------------------------- -% - -close all; -clear all; - -if ~exist('dll_pll_veml_read_tracking_dump.m', 'file') - addpath('./libs') -end - - -samplingFreq = 6625000; %[Hz] -channels = 5; -first_channel = 0; - -path = '/archive/'; %% CHANGE THIS PATH - -for N=1:1:channels - tracking_log_path = [path 'epl_tracking_ch_' num2str(N+first_channel-1) '.dat']; %% CHANGE epl_tracking_ch_ BY YOUR dump_filename - GNSS_tracking(N) = dll_pll_veml_read_tracking_dump(tracking_log_path); -end - -% GNSS-SDR format conversion to MATLAB GPS receiver - -for N=1:1:channels - trackResults(N).status = 'T'; %fake track - trackResults(N).codeFreq = GNSS_tracking(N).code_freq_hz.'; - trackResults(N).carrFreq = GNSS_tracking(N).carrier_doppler_hz.'; - trackResults(N).dllDiscr = GNSS_tracking(N).code_error.'; - trackResults(N).dllDiscrFilt = GNSS_tracking(N).code_nco.'; - trackResults(N).pllDiscr = GNSS_tracking(N).carr_error.'; - trackResults(N).pllDiscrFilt = GNSS_tracking(N).carr_nco.'; - - trackResults(N).I_P = GNSS_tracking(N).prompt_I.'; - trackResults(N).Q_P = GNSS_tracking(N).prompt_Q.'; - - trackResults(N).I_E = GNSS_tracking(N).E.'; - trackResults(N).I_L = GNSS_tracking(N).L.'; - trackResults(N).Q_E = zeros(1,length(GNSS_tracking(N).E)); - trackResults(N).Q_L = zeros(1,length(GNSS_tracking(N).E)); - trackResults(N).PRN = ones(1,length(GNSS_tracking(N).E)); - trackResults(N).CNo = GNSS_tracking(N).CN0_SNV_dB_Hz.'; - - % Use original MATLAB tracking plot function - settings.numberOfChannels = channels; - settings.msToProcess = length(GNSS_tracking(N).E); - plotTracking(N, trackResults, settings) -end - - +% Reads GNSS-SDR Tracking dump binary file using the provided +% function and plots some internal variables +% Javier Arribas, 2011. jarribas(at)cttc.es +% ------------------------------------------------------------------------- +% +% Copyright (C) 2010-2018 (see AUTHORS file for a list of contributors) +% +% GNSS-SDR is a software defined Global Navigation +% Satellite Systems receiver +% +% This file is part of GNSS-SDR. +% +% GNSS-SDR is free software: you can redistribute it and/or modify +% it under the terms of the GNU General Public License as published by +% the Free Software Foundation, either version 3 of the License, or +% at your option) any later version. +% +% GNSS-SDR is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with GNSS-SDR. If not, see . +% +% ------------------------------------------------------------------------- +% + +close all; +clear all; + +if ~exist('dll_pll_veml_read_tracking_dump.m', 'file') + addpath('./libs') +end + + +samplingFreq = 6625000; %[Hz] +channels = 5; +first_channel = 0; + +path = '/archive/'; %% CHANGE THIS PATH + +for N=1:1:channels + tracking_log_path = [path 'epl_tracking_ch_' num2str(N+first_channel-1) '.dat']; %% CHANGE epl_tracking_ch_ BY YOUR dump_filename + GNSS_tracking(N) = dll_pll_veml_read_tracking_dump(tracking_log_path); +end + +% GNSS-SDR format conversion to MATLAB GPS receiver + +for N=1:1:channels + trackResults(N).status = 'T'; %fake track + trackResults(N).codeFreq = GNSS_tracking(N).code_freq_hz.'; + trackResults(N).carrFreq = GNSS_tracking(N).carrier_doppler_hz.'; + trackResults(N).dllDiscr = GNSS_tracking(N).code_error.'; + trackResults(N).dllDiscrFilt = GNSS_tracking(N).code_nco.'; + trackResults(N).pllDiscr = GNSS_tracking(N).carr_error.'; + trackResults(N).pllDiscrFilt = GNSS_tracking(N).carr_nco.'; + + trackResults(N).I_P = GNSS_tracking(N).prompt_I.'; + trackResults(N).Q_P = GNSS_tracking(N).prompt_Q.'; + + trackResults(N).I_E = GNSS_tracking(N).E.'; + trackResults(N).I_L = GNSS_tracking(N).L.'; + trackResults(N).Q_E = zeros(1,length(GNSS_tracking(N).E)); + trackResults(N).Q_L = zeros(1,length(GNSS_tracking(N).E)); + trackResults(N).PRN = ones(1,length(GNSS_tracking(N).E)); + trackResults(N).CNo = GNSS_tracking(N).CN0_SNV_dB_Hz.'; + + % Use original MATLAB tracking plot function + settings.numberOfChannels = channels; + settings.msToProcess = length(GNSS_tracking(N).E); + plotTracking(N, trackResults, settings) +end + + diff --git a/src/utils/matlab/gps_l1_ca_telemetry_plot_sample.m b/src/utils/matlab/gps_l1_ca_telemetry_plot_sample.m index f1b839419..9e0e27125 100644 --- a/src/utils/matlab/gps_l1_ca_telemetry_plot_sample.m +++ b/src/utils/matlab/gps_l1_ca_telemetry_plot_sample.m @@ -1,39 +1,39 @@ -% Reads GNSS-SDR Tracking dump binary file using the provided -% function and plots some internal variables -% Javier Arribas, 2011. jarribas(at)cttc.es -% ------------------------------------------------------------------------- -% -% Copyright (C) 2010-2018 (see AUTHORS file for a list of contributors) -% -% GNSS-SDR is a software defined Global Navigation -% Satellite Systems receiver -% -% This file is part of GNSS-SDR. -% -% GNSS-SDR is free software: you can redistribute it and/or modify -% it under the terms of the GNU General Public License as published by -% the Free Software Foundation, either version 3 of the License, or -% at your option) any later version. -% -% GNSS-SDR is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with GNSS-SDR. If not, see . -% -% ------------------------------------------------------------------------- -% - -%close all; -%clear all; -samplingFreq = 64e6/16; %[Hz] -channels=4; -path='/home/javier/workspace/gnss-sdr-ref/trunk/install/'; -clear PRN_absolute_sample_start; -for N=1:1:channels - telemetry_log_path=[path 'telemetry' num2str(N-1) '.dat']; - GNSS_telemetry(N)= gps_l1_ca_read_telemetry_dump(telemetry_log_path); -end - +% Reads GNSS-SDR Tracking dump binary file using the provided +% function and plots some internal variables +% Javier Arribas, 2011. jarribas(at)cttc.es +% ------------------------------------------------------------------------- +% +% Copyright (C) 2010-2018 (see AUTHORS file for a list of contributors) +% +% GNSS-SDR is a software defined Global Navigation +% Satellite Systems receiver +% +% This file is part of GNSS-SDR. +% +% GNSS-SDR is free software: you can redistribute it and/or modify +% it under the terms of the GNU General Public License as published by +% the Free Software Foundation, either version 3 of the License, or +% at your option) any later version. +% +% GNSS-SDR is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with GNSS-SDR. If not, see . +% +% ------------------------------------------------------------------------- +% + +%close all; +%clear all; +samplingFreq = 64e6/16; %[Hz] +channels=4; +path='/home/javier/workspace/gnss-sdr-ref/trunk/install/'; +clear PRN_absolute_sample_start; +for N=1:1:channels + telemetry_log_path=[path 'telemetry' num2str(N-1) '.dat']; + GNSS_telemetry(N)= gps_l1_ca_read_telemetry_dump(telemetry_log_path); +end + diff --git a/src/utils/matlab/libs/geoFunctions/cart2geo.m b/src/utils/matlab/libs/geoFunctions/cart2geo.m index 45947151f..324a226c1 100644 --- a/src/utils/matlab/libs/geoFunctions/cart2geo.m +++ b/src/utils/matlab/libs/geoFunctions/cart2geo.m @@ -1,58 +1,58 @@ -function [phi, lambda, h] = cart2geo(X, Y, Z, i) -% CART2GEO Conversion of Cartesian coordinates (X,Y,Z) to geographical -% coordinates (phi, lambda, h) on a selected reference ellipsoid. -% -% [phi, lambda, h] = cart2geo(X, Y, Z, i); -% -% Choices i of Reference Ellipsoid for Geographical Coordinates -% 1. International Ellipsoid 1924 -% 2. International Ellipsoid 1967 -% 3. World Geodetic System 1972 -% 4. Geodetic Reference System 1980 -% 5. World Geodetic System 1984 - -% Kai Borre 10-13-98 -% Copyright (c) by Kai Borre -% Revision: 1.0 Date: 1998/10/23 -%========================================================================== - -a = [6378388 6378160 6378135 6378137 6378137]; -f = [1/297 1/298.247 1/298.26 1/298.257222101 1/298.257223563]; - -lambda = atan2(Y,X); -ex2 = (2-f(i))*f(i)/((1-f(i))^2); -c = a(i)*sqrt(1+ex2); -phi = atan(Z/((sqrt(X^2+Y^2)*(1-(2-f(i)))*f(i)))); - -h = 0.1; oldh = 0; -iterations = 0; -while abs(h-oldh) > 1.e-12 - oldh = h; - N = c/sqrt(1+ex2*cos(phi)^2); - phi = atan(Z/((sqrt(X^2+Y^2)*(1-(2-f(i))*f(i)*N/(N+h))))); - h = sqrt(X^2+Y^2)/cos(phi)-N; - - iterations = iterations + 1; - if iterations > 100 - fprintf('Failed to approximate h with desired precision. h-oldh: %e.\n', h-oldh); - break; - end -end - -phi = phi*180/pi; -% b = zeros(1,3); -% b(1,1) = fix(phi); -% b(2,1) = fix(rem(phi,b(1,1))*60); -% b(3,1) = (phi-b(1,1)-b(1,2)/60)*3600; - -lambda = lambda*180/pi; -% l = zeros(1,3); -% l(1,1) = fix(lambda); -% l(2,1) = fix(rem(lambda,l(1,1))*60); -% l(3,1) = (lambda-l(1,1)-l(1,2)/60)*3600; - -%fprintf('\n phi =%3.0f %3.0f %8.5f',b(1),b(2),b(3)) -%fprintf('\n lambda =%3.0f %3.0f %8.5f',l(1),l(2),l(3)) -%fprintf('\n h =%14.3f\n',h) - -%%%%%%%%%%%%%% end cart2geo.m %%%%%%%%%%%%%%%%%%% +function [phi, lambda, h] = cart2geo(X, Y, Z, i) +% CART2GEO Conversion of Cartesian coordinates (X,Y,Z) to geographical +% coordinates (phi, lambda, h) on a selected reference ellipsoid. +% +% [phi, lambda, h] = cart2geo(X, Y, Z, i); +% +% Choices i of Reference Ellipsoid for Geographical Coordinates +% 1. International Ellipsoid 1924 +% 2. International Ellipsoid 1967 +% 3. World Geodetic System 1972 +% 4. Geodetic Reference System 1980 +% 5. World Geodetic System 1984 + +% Kai Borre 10-13-98 +% Copyright (c) by Kai Borre +% Revision: 1.0 Date: 1998/10/23 +%========================================================================== + +a = [6378388 6378160 6378135 6378137 6378137]; +f = [1/297 1/298.247 1/298.26 1/298.257222101 1/298.257223563]; + +lambda = atan2(Y,X); +ex2 = (2-f(i))*f(i)/((1-f(i))^2); +c = a(i)*sqrt(1+ex2); +phi = atan(Z/((sqrt(X^2+Y^2)*(1-(2-f(i)))*f(i)))); + +h = 0.1; oldh = 0; +iterations = 0; +while abs(h-oldh) > 1.e-12 + oldh = h; + N = c/sqrt(1+ex2*cos(phi)^2); + phi = atan(Z/((sqrt(X^2+Y^2)*(1-(2-f(i))*f(i)*N/(N+h))))); + h = sqrt(X^2+Y^2)/cos(phi)-N; + + iterations = iterations + 1; + if iterations > 100 + fprintf('Failed to approximate h with desired precision. h-oldh: %e.\n', h-oldh); + break; + end +end + +phi = phi*180/pi; +% b = zeros(1,3); +% b(1,1) = fix(phi); +% b(2,1) = fix(rem(phi,b(1,1))*60); +% b(3,1) = (phi-b(1,1)-b(1,2)/60)*3600; + +lambda = lambda*180/pi; +% l = zeros(1,3); +% l(1,1) = fix(lambda); +% l(2,1) = fix(rem(lambda,l(1,1))*60); +% l(3,1) = (lambda-l(1,1)-l(1,2)/60)*3600; + +%fprintf('\n phi =%3.0f %3.0f %8.5f',b(1),b(2),b(3)) +%fprintf('\n lambda =%3.0f %3.0f %8.5f',l(1),l(2),l(3)) +%fprintf('\n h =%14.3f\n',h) + +%%%%%%%%%%%%%% end cart2geo.m %%%%%%%%%%%%%%%%%%% diff --git a/src/utils/matlab/libs/geoFunctions/cart2utm.m b/src/utils/matlab/libs/geoFunctions/cart2utm.m index 8617bf541..48da278ea 100644 --- a/src/utils/matlab/libs/geoFunctions/cart2utm.m +++ b/src/utils/matlab/libs/geoFunctions/cart2utm.m @@ -1,173 +1,173 @@ -function [E, N, U] = cart2utm(X, Y, Z, zone) -% CART2UTM Transformation of (X,Y,Z) to (N,E,U) in UTM, zone 'zone'. -% -% [E, N, U] = cart2utm(X, Y, Z, zone); -% -% Inputs: -% X,Y,Z - Cartesian coordinates. Coordinates are referenced -% with respect to the International Terrestrial Reference -% Frame 1996 (ITRF96) -% zone - UTM zone of the given position -% -% Outputs: -% E, N, U - UTM coordinates (Easting, Northing, Uping) - -% Kai Borre -11-1994 -% Copyright (c) by Kai Borre - -% This implementation is based upon -% O. Andersson & K. Poder (1981) Koordinattransformationer -% ved Geod\ae{}tisk Institut. Landinspekt\oe{}ren -% Vol. 30: 552--571 and Vol. 31: 76 -% -% An excellent, general reference (KW) is -% R. Koenig & K.H. Weise (1951) Mathematische Grundlagen der -% h\"oheren Geod\"asie und Kartographie. -% Erster Band, Springer Verlag - -% Explanation of variables used: -% f flattening of ellipsoid -% a semi major axis in m -% m0 1 - scale at central meridian; for UTM 0.0004 -% Q_n normalized meridian quadrant -% E0 Easting of central meridian -% L0 Longitude of central meridian -% bg constants for ellipsoidal geogr. to spherical geogr. -% gb constants for spherical geogr. to ellipsoidal geogr. -% gtu constants for ellipsoidal N, E to spherical N, E -% utg constants for spherical N, E to ellipoidal N, E -% tolutm tolerance for utm, 1.2E-10*meridian quadrant -% tolgeo tolerance for geographical, 0.00040 second of arc - -% B, L refer to latitude and longitude. Southern latitude is negative -% International ellipsoid of 1924, valid for ED50 - -a = 6378388; -f = 1/297; -ex2 = (2-f)*f / ((1-f)^2); -c = a * sqrt(1+ex2); -vec = [X; Y; Z-4.5]; -alpha = .756e-6; -R = [ 1 -alpha 0; - alpha 1 0; - 0 0 1]; -trans = [89.5; 93.8; 127.6]; -scale = 0.9999988; -v = scale*R*vec + trans; % coordinate vector in ED50 -L = atan2(v(2), v(1)); -N1 = 6395000; % preliminary value -B = atan2(v(3)/((1-f)^2*N1), norm(v(1:2))/N1); % preliminary value -U = 0.1; oldU = 0; - -iterations = 0; -while abs(U-oldU) > 1.e-4 - oldU = U; - N1 = c/sqrt(1+ex2*(cos(B))^2); - B = atan2(v(3)/((1-f)^2*N1+U), norm(v(1:2))/(N1+U) ); - U = norm(v(1:2))/cos(B)-N1; - - iterations = iterations + 1; - if iterations > 100 - fprintf('Failed to approximate U with desired precision. U-oldU: %e.\n', U-oldU); - break; - end -end - -% Normalized meridian quadrant, KW p. 50 (96), p. 19 (38b), p. 5 (21) -m0 = 0.0004; -n = f / (2-f); -m = n^2 * (1/4 + n*n/64); -w = (a*(-n-m0+m*(1-m0))) / (1+n); -Q_n = a + w; - -% Easting and longitude of central meridian -E0 = 500000; -L0 = (zone-30)*6 - 3; - -% Check tolerance for reverse transformation -tolutm = pi/2 * 1.2e-10 * Q_n; -tolgeo = 0.000040; - -% Coefficients of trigonometric series - -% ellipsoidal to spherical geographical, KW p. 186--187, (51)-(52) -% bg[1] = n*(-2 + n*(2/3 + n*(4/3 + n*(-82/45)))); -% bg[2] = n^2*(5/3 + n*(-16/15 + n*(-13/9))); -% bg[3] = n^3*(-26/15 + n*34/21); -% bg[4] = n^4*1237/630; - -% spherical to ellipsoidal geographical, KW p. 190--191, (61)-(62) -% gb[1] = n*(2 + n*(-2/3 + n*(-2 + n*116/45))); -% gb[2] = n^2*(7/3 + n*(-8/5 + n*(-227/45))); -% gb[3] = n^3*(56/15 + n*(-136/35)); -% gb[4] = n^4*4279/630; - -% spherical to ellipsoidal N, E, KW p. 196, (69) -% gtu[1] = n*(1/2 + n*(-2/3 + n*(5/16 + n*41/180))); -% gtu[2] = n^2*(13/48 + n*(-3/5 + n*557/1440)); -% gtu[3] = n^3*(61/240 + n*(-103/140)); -% gtu[4] = n^4*49561/161280; - -% ellipsoidal to spherical N, E, KW p. 194, (65) -% utg[1] = n*(-1/2 + n*(2/3 + n*(-37/96 + n*1/360))); -% utg[2] = n^2*(-1/48 + n*(-1/15 + n*437/1440)); -% utg[3] = n^3*(-17/480 + n*37/840); -% utg[4] = n^4*(-4397/161280); - -% With f = 1/297 we get - -bg = [-3.37077907e-3; - 4.73444769e-6; - -8.29914570e-9; - 1.58785330e-11]; - -gb = [ 3.37077588e-3; - 6.62769080e-6; - 1.78718601e-8; - 5.49266312e-11]; - -gtu = [ 8.41275991e-4; - 7.67306686e-7; - 1.21291230e-9; - 2.48508228e-12]; - -utg = [-8.41276339e-4; - -5.95619298e-8; - -1.69485209e-10; - -2.20473896e-13]; - -% Ellipsoidal latitude, longitude to spherical latitude, longitude -neg_geo = 'FALSE'; - -if B < 0 - neg_geo = 'TRUE '; -end - -Bg_r = abs(B); -[res_clensin] = clsin(bg, 4, 2*Bg_r); -Bg_r = Bg_r + res_clensin; -L0 = L0*pi / 180; -Lg_r = L - L0; - -% Spherical latitude, longitude to complementary spherical latitude -% i.e. spherical N, E -cos_BN = cos(Bg_r); -Np = atan2(sin(Bg_r), cos(Lg_r)*cos_BN); -Ep = atanh(sin(Lg_r) * cos_BN); - -%Spherical normalized N, E to ellipsoidal N, E -Np = 2 * Np; -Ep = 2 * Ep; -[dN, dE] = clksin(gtu, 4, Np, Ep); -Np = Np/2; -Ep = Ep/2; -Np = Np + dN; -Ep = Ep + dE; -N = Q_n * Np; -E = Q_n*Ep + E0; - -if neg_geo == 'TRUE ' - N = -N + 20000000; -end; - +function [E, N, U] = cart2utm(X, Y, Z, zone) +% CART2UTM Transformation of (X,Y,Z) to (N,E,U) in UTM, zone 'zone'. +% +% [E, N, U] = cart2utm(X, Y, Z, zone); +% +% Inputs: +% X,Y,Z - Cartesian coordinates. Coordinates are referenced +% with respect to the International Terrestrial Reference +% Frame 1996 (ITRF96) +% zone - UTM zone of the given position +% +% Outputs: +% E, N, U - UTM coordinates (Easting, Northing, Uping) + +% Kai Borre -11-1994 +% Copyright (c) by Kai Borre + +% This implementation is based upon +% O. Andersson & K. Poder (1981) Koordinattransformationer +% ved Geod\ae{}tisk Institut. Landinspekt\oe{}ren +% Vol. 30: 552--571 and Vol. 31: 76 +% +% An excellent, general reference (KW) is +% R. Koenig & K.H. Weise (1951) Mathematische Grundlagen der +% h\"oheren Geod\"asie und Kartographie. +% Erster Band, Springer Verlag + +% Explanation of variables used: +% f flattening of ellipsoid +% a semi major axis in m +% m0 1 - scale at central meridian; for UTM 0.0004 +% Q_n normalized meridian quadrant +% E0 Easting of central meridian +% L0 Longitude of central meridian +% bg constants for ellipsoidal geogr. to spherical geogr. +% gb constants for spherical geogr. to ellipsoidal geogr. +% gtu constants for ellipsoidal N, E to spherical N, E +% utg constants for spherical N, E to ellipoidal N, E +% tolutm tolerance for utm, 1.2E-10*meridian quadrant +% tolgeo tolerance for geographical, 0.00040 second of arc + +% B, L refer to latitude and longitude. Southern latitude is negative +% International ellipsoid of 1924, valid for ED50 + +a = 6378388; +f = 1/297; +ex2 = (2-f)*f / ((1-f)^2); +c = a * sqrt(1+ex2); +vec = [X; Y; Z-4.5]; +alpha = .756e-6; +R = [ 1 -alpha 0; + alpha 1 0; + 0 0 1]; +trans = [89.5; 93.8; 127.6]; +scale = 0.9999988; +v = scale*R*vec + trans; % coordinate vector in ED50 +L = atan2(v(2), v(1)); +N1 = 6395000; % preliminary value +B = atan2(v(3)/((1-f)^2*N1), norm(v(1:2))/N1); % preliminary value +U = 0.1; oldU = 0; + +iterations = 0; +while abs(U-oldU) > 1.e-4 + oldU = U; + N1 = c/sqrt(1+ex2*(cos(B))^2); + B = atan2(v(3)/((1-f)^2*N1+U), norm(v(1:2))/(N1+U) ); + U = norm(v(1:2))/cos(B)-N1; + + iterations = iterations + 1; + if iterations > 100 + fprintf('Failed to approximate U with desired precision. U-oldU: %e.\n', U-oldU); + break; + end +end + +% Normalized meridian quadrant, KW p. 50 (96), p. 19 (38b), p. 5 (21) +m0 = 0.0004; +n = f / (2-f); +m = n^2 * (1/4 + n*n/64); +w = (a*(-n-m0+m*(1-m0))) / (1+n); +Q_n = a + w; + +% Easting and longitude of central meridian +E0 = 500000; +L0 = (zone-30)*6 - 3; + +% Check tolerance for reverse transformation +tolutm = pi/2 * 1.2e-10 * Q_n; +tolgeo = 0.000040; + +% Coefficients of trigonometric series + +% ellipsoidal to spherical geographical, KW p. 186--187, (51)-(52) +% bg[1] = n*(-2 + n*(2/3 + n*(4/3 + n*(-82/45)))); +% bg[2] = n^2*(5/3 + n*(-16/15 + n*(-13/9))); +% bg[3] = n^3*(-26/15 + n*34/21); +% bg[4] = n^4*1237/630; + +% spherical to ellipsoidal geographical, KW p. 190--191, (61)-(62) +% gb[1] = n*(2 + n*(-2/3 + n*(-2 + n*116/45))); +% gb[2] = n^2*(7/3 + n*(-8/5 + n*(-227/45))); +% gb[3] = n^3*(56/15 + n*(-136/35)); +% gb[4] = n^4*4279/630; + +% spherical to ellipsoidal N, E, KW p. 196, (69) +% gtu[1] = n*(1/2 + n*(-2/3 + n*(5/16 + n*41/180))); +% gtu[2] = n^2*(13/48 + n*(-3/5 + n*557/1440)); +% gtu[3] = n^3*(61/240 + n*(-103/140)); +% gtu[4] = n^4*49561/161280; + +% ellipsoidal to spherical N, E, KW p. 194, (65) +% utg[1] = n*(-1/2 + n*(2/3 + n*(-37/96 + n*1/360))); +% utg[2] = n^2*(-1/48 + n*(-1/15 + n*437/1440)); +% utg[3] = n^3*(-17/480 + n*37/840); +% utg[4] = n^4*(-4397/161280); + +% With f = 1/297 we get + +bg = [-3.37077907e-3; + 4.73444769e-6; + -8.29914570e-9; + 1.58785330e-11]; + +gb = [ 3.37077588e-3; + 6.62769080e-6; + 1.78718601e-8; + 5.49266312e-11]; + +gtu = [ 8.41275991e-4; + 7.67306686e-7; + 1.21291230e-9; + 2.48508228e-12]; + +utg = [-8.41276339e-4; + -5.95619298e-8; + -1.69485209e-10; + -2.20473896e-13]; + +% Ellipsoidal latitude, longitude to spherical latitude, longitude +neg_geo = 'FALSE'; + +if B < 0 + neg_geo = 'TRUE '; +end + +Bg_r = abs(B); +[res_clensin] = clsin(bg, 4, 2*Bg_r); +Bg_r = Bg_r + res_clensin; +L0 = L0*pi / 180; +Lg_r = L - L0; + +% Spherical latitude, longitude to complementary spherical latitude +% i.e. spherical N, E +cos_BN = cos(Bg_r); +Np = atan2(sin(Bg_r), cos(Lg_r)*cos_BN); +Ep = atanh(sin(Lg_r) * cos_BN); + +%Spherical normalized N, E to ellipsoidal N, E +Np = 2 * Np; +Ep = 2 * Ep; +[dN, dE] = clksin(gtu, 4, Np, Ep); +Np = Np/2; +Ep = Ep/2; +Np = Np + dN; +Ep = Ep + dE; +N = Q_n * Np; +E = Q_n*Ep + E0; + +if neg_geo == 'TRUE ' + N = -N + 20000000; +end; + %%%%%%%%%%%%%%%%%%%% end cart2utm.m %%%%%%%%%%%%%%%%%%%% \ No newline at end of file diff --git a/src/utils/matlab/libs/geoFunctions/check_t.m b/src/utils/matlab/libs/geoFunctions/check_t.m index 5c3cb6148..1b3ed323c 100644 --- a/src/utils/matlab/libs/geoFunctions/check_t.m +++ b/src/utils/matlab/libs/geoFunctions/check_t.m @@ -1,26 +1,26 @@ -function corrTime = check_t(time) -% CHECK_T accounting for beginning or end of week crossover. -% -% corrTime = check_t(time); -% -% Inputs: -% time - time in seconds -% -% Outputs: -% corrTime - corrected time (seconds) - -% Kai Borre 04-01-96 -% Copyright (c) by Kai Borre -%========================================================================== - -half_week = 302400; % seconds - -corrTime = time; - -if time > half_week - corrTime = time - 2*half_week; -elseif time < -half_week - corrTime = time + 2*half_week; +function corrTime = check_t(time) +% CHECK_T accounting for beginning or end of week crossover. +% +% corrTime = check_t(time); +% +% Inputs: +% time - time in seconds +% +% Outputs: +% corrTime - corrected time (seconds) + +% Kai Borre 04-01-96 +% Copyright (c) by Kai Borre +%========================================================================== + +half_week = 302400; % seconds + +corrTime = time; + +if time > half_week + corrTime = time - 2*half_week; +elseif time < -half_week + corrTime = time + 2*half_week; end - -%%%%%%% end check_t.m %%%%%%%%%%%%%%%%% + +%%%%%%% end check_t.m %%%%%%%%%%%%%%%%% diff --git a/src/utils/matlab/libs/geoFunctions/clksin.m b/src/utils/matlab/libs/geoFunctions/clksin.m index 99a16331e..f6f600c19 100644 --- a/src/utils/matlab/libs/geoFunctions/clksin.m +++ b/src/utils/matlab/libs/geoFunctions/clksin.m @@ -1,36 +1,36 @@ -function [re, im] = clksin(ar, degree, arg_real, arg_imag) -% Clenshaw summation of sinus with complex argument -% [re, im] = clksin(ar, degree, arg_real, arg_imag); - -% Written by Kai Borre -% December 20, 1995 -% -% See also WGS2UTM or CART2UTM -% -%========================================================================== - -sin_arg_r = sin(arg_real); -cos_arg_r = cos(arg_real); -sinh_arg_i = sinh(arg_imag); -cosh_arg_i = cosh(arg_imag); - -r = 2 * cos_arg_r * cosh_arg_i; -i =-2 * sin_arg_r * sinh_arg_i; - -hr1 = 0; hr = 0; hi1 = 0; hi = 0; - -for t = degree : -1 : 1 - hr2 = hr1; - hr1 = hr; - hi2 = hi1; - hi1 = hi; - z = ar(t) + r*hr1 - i*hi - hr2; - hi = i*hr1 + r*hi1 - hi2; - hr = z; -end - -r = sin_arg_r * cosh_arg_i; -i = cos_arg_r * sinh_arg_i; - -re = r*hr - i*hi; -im = r*hi + i*hr; +function [re, im] = clksin(ar, degree, arg_real, arg_imag) +% Clenshaw summation of sinus with complex argument +% [re, im] = clksin(ar, degree, arg_real, arg_imag); + +% Written by Kai Borre +% December 20, 1995 +% +% See also WGS2UTM or CART2UTM +% +%========================================================================== + +sin_arg_r = sin(arg_real); +cos_arg_r = cos(arg_real); +sinh_arg_i = sinh(arg_imag); +cosh_arg_i = cosh(arg_imag); + +r = 2 * cos_arg_r * cosh_arg_i; +i =-2 * sin_arg_r * sinh_arg_i; + +hr1 = 0; hr = 0; hi1 = 0; hi = 0; + +for t = degree : -1 : 1 + hr2 = hr1; + hr1 = hr; + hi2 = hi1; + hi1 = hi; + z = ar(t) + r*hr1 - i*hi - hr2; + hi = i*hr1 + r*hi1 - hi2; + hr = z; +end + +r = sin_arg_r * cosh_arg_i; +i = cos_arg_r * sinh_arg_i; + +re = r*hr - i*hi; +im = r*hi + i*hr; diff --git a/src/utils/matlab/libs/geoFunctions/clsin.m b/src/utils/matlab/libs/geoFunctions/clsin.m index 15b6d5b7b..46cf32524 100644 --- a/src/utils/matlab/libs/geoFunctions/clsin.m +++ b/src/utils/matlab/libs/geoFunctions/clsin.m @@ -1,24 +1,24 @@ -function result = clsin(ar, degree, argument) -% Clenshaw summation of sinus of argument. -% -% result = clsin(ar, degree, argument); - -% Written by Kai Borre -% December 20, 1995 -% -% See also WGS2UTM or CART2UTM -%========================================================================== - -cos_arg = 2 * cos(argument); -hr1 = 0; -hr = 0; - -for t = degree : -1 : 1 - hr2 = hr1; - hr1 = hr; - hr = ar(t) + cos_arg*hr1 - hr2; -end - +function result = clsin(ar, degree, argument) +% Clenshaw summation of sinus of argument. +% +% result = clsin(ar, degree, argument); + +% Written by Kai Borre +% December 20, 1995 +% +% See also WGS2UTM or CART2UTM +%========================================================================== + +cos_arg = 2 * cos(argument); +hr1 = 0; +hr = 0; + +for t = degree : -1 : 1 + hr2 = hr1; + hr1 = hr; + hr = ar(t) + cos_arg*hr1 - hr2; +end + result = hr * sin(argument); - -%%%%%%%%%%%%%%%%%%%%%%% end clsin.m %%%%%%%%%%%%%%%%%%%%% + +%%%%%%%%%%%%%%%%%%%%%%% end clsin.m %%%%%%%%%%%%%%%%%%%%% diff --git a/src/utils/matlab/libs/geoFunctions/deg2dms.m b/src/utils/matlab/libs/geoFunctions/deg2dms.m index c7fc195df..1f925894d 100644 --- a/src/utils/matlab/libs/geoFunctions/deg2dms.m +++ b/src/utils/matlab/libs/geoFunctions/deg2dms.m @@ -1,43 +1,43 @@ -function dmsOutput = deg2dms(deg) -% DEG2DMS Conversion of degrees to degrees, minutes, and seconds. -% The output format (dms format) is: (degrees*100 + minutes + seconds/100) - -% Written by Kai Borre -% February 7, 2001 -% Updated by Darius Plausinaitis - -%%% Save the sign for later processing -neg_arg = false; -if deg < 0 - % Only positive numbers should be used while spliting into deg/min/sec - deg = -deg; - neg_arg = true; -end - -%%% Split degrees minutes and seconds -int_deg = floor(deg); -decimal = deg - int_deg; -min_part = decimal*60; -min = floor(min_part); -sec_part = min_part - floor(min_part); -sec = sec_part*60; - -%%% Check for overflow -if sec == 60 - min = min + 1; - sec = 0; -end -if min == 60 - int_deg = int_deg + 1; - min = 0; -end - -%%% Construct the output -dmsOutput = int_deg * 100 + min + sec/100; - -%%% Correct the sign -if neg_arg == true - dmsOutput = -dmsOutput; -end - -%%%%%%%%%%%%%%%%%%% end deg2dms.m %%%%%%%%%%%%%%%% +function dmsOutput = deg2dms(deg) +% DEG2DMS Conversion of degrees to degrees, minutes, and seconds. +% The output format (dms format) is: (degrees*100 + minutes + seconds/100) + +% Written by Kai Borre +% February 7, 2001 +% Updated by Darius Plausinaitis + +%%% Save the sign for later processing +neg_arg = false; +if deg < 0 + % Only positive numbers should be used while spliting into deg/min/sec + deg = -deg; + neg_arg = true; +end + +%%% Split degrees minutes and seconds +int_deg = floor(deg); +decimal = deg - int_deg; +min_part = decimal*60; +min = floor(min_part); +sec_part = min_part - floor(min_part); +sec = sec_part*60; + +%%% Check for overflow +if sec == 60 + min = min + 1; + sec = 0; +end +if min == 60 + int_deg = int_deg + 1; + min = 0; +end + +%%% Construct the output +dmsOutput = int_deg * 100 + min + sec/100; + +%%% Correct the sign +if neg_arg == true + dmsOutput = -dmsOutput; +end + +%%%%%%%%%%%%%%%%%%% end deg2dms.m %%%%%%%%%%%%%%%% diff --git a/src/utils/matlab/libs/geoFunctions/dms2deg.m b/src/utils/matlab/libs/geoFunctions/dms2deg.m index 1b4420dd0..a8e99f9a6 100644 --- a/src/utils/matlab/libs/geoFunctions/dms2deg.m +++ b/src/utils/matlab/libs/geoFunctions/dms2deg.m @@ -1,12 +1,12 @@ - -function deg = dms2deg(dms) -% DMS2DEG Conversion of degrees, minutes, and seconds to degrees. - -% Written by Javier Arribas 2011 -% December 7, 2011 - -%if (dms(1)>=0) -deg=dms(1)+dms(2)/60+dms(3)/3600; -%else -%deg=dms(1)-dms(2)/60-dms(3)/3600; -%end + +function deg = dms2deg(dms) +% DMS2DEG Conversion of degrees, minutes, and seconds to degrees. + +% Written by Javier Arribas 2011 +% December 7, 2011 + +%if (dms(1)>=0) +deg=dms(1)+dms(2)/60+dms(3)/3600; +%else +%deg=dms(1)-dms(2)/60-dms(3)/3600; +%end diff --git a/src/utils/matlab/libs/geoFunctions/dms2mat.m b/src/utils/matlab/libs/geoFunctions/dms2mat.m index a7d5b7023..a82b60ccc 100644 --- a/src/utils/matlab/libs/geoFunctions/dms2mat.m +++ b/src/utils/matlab/libs/geoFunctions/dms2mat.m @@ -1,104 +1,104 @@ -function [dout,mout,sout] = dms2mat(dms,n) - -% DMS2MAT Converts a dms vector format to a [deg min sec] matrix -% -% [d,m,s] = DMS2MAT(dms) converts a dms vector format to a -% deg:min:sec matrix. The vector format is dms = 100*deg + min + sec/100. -% This allows compressed dms data to be expanded to a d,m,s triple, -% for easier reporting and viewing of the data. -% -% [d,m,s] = DMS2MAT(dms,n) uses n digits in the accuracy of the -% seconds calculation. n = -2 uses accuracy in the hundredths position, -% n = 0 uses accuracy in the units position. Default is n = -5. -% For further discussion of the input n, see ROUNDN. -% -% mat = DMS2MAT(...) returns a single output argument of mat = [d m s]. -% This is useful only if the input dms is a single column vector. -% -% See also MAT2DMS - -% Copyright 1996-2002 Systems Planning and Analysis, Inc. and The MathWorks, Inc. -% Written by: E. Byrns, E. Brown -% Revision: 1.10 $Date: 2002/03/20 21:25:06 - - -if nargin == 0 - error('Incorrect number of arguments') -elseif nargin == 1 - n = -5; -end - -% Test for empty arguments - -if isempty(dms); dout = []; mout = []; sout = []; return; end - -% Test for complex arguments - -if ~isreal(dms) - warning('Imaginary parts of complex ANGLE argument ignored') - dms = real(dms); -end - -% Don't let seconds be rounded beyond the tens place. -% If you did, then 55 seconds rounds to 100, which is not good. - -if n == 2; n = 1; end - -% Construct a sign vector which has +1 when dms >= 0 and -1 when dms < 0. - -signvec = sign(dms); -signvec = signvec + (signvec == 0); % Ensure +1 when dms = 0 - -% Decompress the dms data vector - -dms = abs(dms); -d = fix(dms/100); % Degrees -m = fix(dms) - abs(100*d); % Minutes -[s,msg] = roundn(100*rem(dms,1),n); % Seconds: Truncate to roundoff error -if ~isempty(msg); error(msg); end - -% Adjust for 60 seconds or 60 minutes. -% Test for seconds > 60 to allow for round-off from roundn, -% Test for minutes > 60 as a ripple effect from seconds > 60 - - -indx = find(s >= 60); -if ~isempty(indx); m(indx) = m(indx) + 1; s(indx) = s(indx) - 60; end -indx = find(m >= 60); -if ~isempty(indx); d(indx) = d(indx) + 1; m(indx) = m(indx) - 60; end - -% Data consistency checks - -if any(m > 59) | any (m < 0) - error('Minutes must be >= 0 and <= 59') - -elseif any(s >= 60) | any( s < 0) - error('Seconds must be >= 0 and < 60') -end - -% Determine where to store the sign of the angle. It should be -% associated with the largest nonzero component of d:m:s. - -dsign = signvec .* (d~=0); -msign = signvec .* (d==0 & m~=0); -ssign = signvec .* (d==0 & m==0 & s~=0); - -% In the application of signs below, the comparison with 0 is used so that -% the sign vector contains only +1 and -1. Any zero occurances causes -% data to be lost when the sign has been applied to a higher component -% of d:m:s. Use fix function to eliminate potential round-off errors. - -d = ((dsign==0) + dsign).*fix(d); % Apply signs to the degrees -m = ((msign==0) + msign).*fix(m); % Apply signs to minutes -s = ((ssign==0) + ssign).*s; % Apply signs to seconds - -% Set the output arguments - -if nargout <= 1 - dout = [d m s]; -elseif nargout == 3 - dout = d; mout = m; sout = s; -else - error('Invalid number of output arguments') -end - +function [dout,mout,sout] = dms2mat(dms,n) + +% DMS2MAT Converts a dms vector format to a [deg min sec] matrix +% +% [d,m,s] = DMS2MAT(dms) converts a dms vector format to a +% deg:min:sec matrix. The vector format is dms = 100*deg + min + sec/100. +% This allows compressed dms data to be expanded to a d,m,s triple, +% for easier reporting and viewing of the data. +% +% [d,m,s] = DMS2MAT(dms,n) uses n digits in the accuracy of the +% seconds calculation. n = -2 uses accuracy in the hundredths position, +% n = 0 uses accuracy in the units position. Default is n = -5. +% For further discussion of the input n, see ROUNDN. +% +% mat = DMS2MAT(...) returns a single output argument of mat = [d m s]. +% This is useful only if the input dms is a single column vector. +% +% See also MAT2DMS + +% Copyright 1996-2002 Systems Planning and Analysis, Inc. and The MathWorks, Inc. +% Written by: E. Byrns, E. Brown +% Revision: 1.10 $Date: 2002/03/20 21:25:06 + + +if nargin == 0 + error('Incorrect number of arguments') +elseif nargin == 1 + n = -5; +end + +% Test for empty arguments + +if isempty(dms); dout = []; mout = []; sout = []; return; end + +% Test for complex arguments + +if ~isreal(dms) + warning('Imaginary parts of complex ANGLE argument ignored') + dms = real(dms); +end + +% Don't let seconds be rounded beyond the tens place. +% If you did, then 55 seconds rounds to 100, which is not good. + +if n == 2; n = 1; end + +% Construct a sign vector which has +1 when dms >= 0 and -1 when dms < 0. + +signvec = sign(dms); +signvec = signvec + (signvec == 0); % Ensure +1 when dms = 0 + +% Decompress the dms data vector + +dms = abs(dms); +d = fix(dms/100); % Degrees +m = fix(dms) - abs(100*d); % Minutes +[s,msg] = roundn(100*rem(dms,1),n); % Seconds: Truncate to roundoff error +if ~isempty(msg); error(msg); end + +% Adjust for 60 seconds or 60 minutes. +% Test for seconds > 60 to allow for round-off from roundn, +% Test for minutes > 60 as a ripple effect from seconds > 60 + + +indx = find(s >= 60); +if ~isempty(indx); m(indx) = m(indx) + 1; s(indx) = s(indx) - 60; end +indx = find(m >= 60); +if ~isempty(indx); d(indx) = d(indx) + 1; m(indx) = m(indx) - 60; end + +% Data consistency checks + +if any(m > 59) | any (m < 0) + error('Minutes must be >= 0 and <= 59') + +elseif any(s >= 60) | any( s < 0) + error('Seconds must be >= 0 and < 60') +end + +% Determine where to store the sign of the angle. It should be +% associated with the largest nonzero component of d:m:s. + +dsign = signvec .* (d~=0); +msign = signvec .* (d==0 & m~=0); +ssign = signvec .* (d==0 & m==0 & s~=0); + +% In the application of signs below, the comparison with 0 is used so that +% the sign vector contains only +1 and -1. Any zero occurances causes +% data to be lost when the sign has been applied to a higher component +% of d:m:s. Use fix function to eliminate potential round-off errors. + +d = ((dsign==0) + dsign).*fix(d); % Apply signs to the degrees +m = ((msign==0) + msign).*fix(m); % Apply signs to minutes +s = ((ssign==0) + ssign).*s; % Apply signs to seconds + +% Set the output arguments + +if nargout <= 1 + dout = [d m s]; +elseif nargout == 3 + dout = d; mout = m; sout = s; +else + error('Invalid number of output arguments') +end + diff --git a/src/utils/matlab/libs/geoFunctions/e_r_corr.m b/src/utils/matlab/libs/geoFunctions/e_r_corr.m index 4d93d9f2f..b668a714a 100644 --- a/src/utils/matlab/libs/geoFunctions/e_r_corr.m +++ b/src/utils/matlab/libs/geoFunctions/e_r_corr.m @@ -1,31 +1,31 @@ -function X_sat_rot = e_r_corr(traveltime, X_sat) -% E_R_CORR Returns rotated satellite ECEF coordinates due to Earth -% rotation during signal travel time -% -% X_sat_rot = e_r_corr(traveltime, X_sat); -% -% Inputs: -% travelTime - signal travel time -% X_sat - satellite's ECEF coordinates -% -% Outputs: -% X_sat_rot - rotated satellite's coordinates (ECEF) - -% Written by Kai Borre -% Copyright (c) by Kai Borre -%========================================================================== - -Omegae_dot = 7.292115147e-5; % rad/sec - -%--- Find rotation angle -------------------------------------------------- -omegatau = Omegae_dot * traveltime; - -%--- Make a rotation matrix ----------------------------------------------- -R3 = [ cos(omegatau) sin(omegatau) 0; - -sin(omegatau) cos(omegatau) 0; - 0 0 1]; - -%--- Do the rotation ------------------------------------------------------ -X_sat_rot = R3 * X_sat; - -%%%%%%%% end e_r_corr.m %%%%%%%%%%%%%%%%%%%% +function X_sat_rot = e_r_corr(traveltime, X_sat) +% E_R_CORR Returns rotated satellite ECEF coordinates due to Earth +% rotation during signal travel time +% +% X_sat_rot = e_r_corr(traveltime, X_sat); +% +% Inputs: +% travelTime - signal travel time +% X_sat - satellite's ECEF coordinates +% +% Outputs: +% X_sat_rot - rotated satellite's coordinates (ECEF) + +% Written by Kai Borre +% Copyright (c) by Kai Borre +%========================================================================== + +Omegae_dot = 7.292115147e-5; % rad/sec + +%--- Find rotation angle -------------------------------------------------- +omegatau = Omegae_dot * traveltime; + +%--- Make a rotation matrix ----------------------------------------------- +R3 = [ cos(omegatau) sin(omegatau) 0; + -sin(omegatau) cos(omegatau) 0; + 0 0 1]; + +%--- Do the rotation ------------------------------------------------------ +X_sat_rot = R3 * X_sat; + +%%%%%%%% end e_r_corr.m %%%%%%%%%%%%%%%%%%%% diff --git a/src/utils/matlab/libs/geoFunctions/findUtmZone.m b/src/utils/matlab/libs/geoFunctions/findUtmZone.m index 1294c7837..e5717d635 100644 --- a/src/utils/matlab/libs/geoFunctions/findUtmZone.m +++ b/src/utils/matlab/libs/geoFunctions/findUtmZone.m @@ -1,69 +1,69 @@ -function utmZone = findUtmZone(latitude, longitude) -% Function finds the UTM zone number for given longitude and latitude. -% The longitude value must be between -180 (180 degree West) and 180 (180 -% degree East) degree. The latitude must be within -80 (80 degree South) and -% 84 (84 degree North). -% -% utmZone = findUtmZone(latitude, longitude); -% -% Latitude and longitude must be in decimal degrees (e.g. 15.5 degrees not -% 15 deg 30 min). - -%-------------------------------------------------------------------------- -% SoftGNSS v3.0 -% -% Copyright (C) Darius Plausinaitis -% Written by Darius Plausinaitis -%-------------------------------------------------------------------------- -%This program is free software; you can redistribute it and/or -%modify it under the terms of the GNU General Public License -%as published by the Free Software Foundation; either version 2 -%of the License, or (at your option) any later version. -% -%This program is distributed in the hope that it will be useful, -%but WITHOUT ANY WARRANTY; without even the implied warranty of -%MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -%GNU General Public License for more details. -% -%You should have received a copy of the GNU General Public License -%along with this program; if not, write to the Free Software -%Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, -%USA. -%========================================================================== - -%% Check value bounds ===================================================== - -if ((longitude > 180) || (longitude < -180)) - error('Longitude value exceeds limits (-180:180).'); -end - -if ((latitude > 84) || (latitude < -80)) - error('Latitude value exceeds limits (-80:84).'); -end - -%% Find zone ============================================================== - -% Start at 180 deg west = -180 deg - -utmZone = fix((180 + longitude)/ 6) + 1; - -%% Correct zone numbers for particular areas ============================== - -if (latitude > 72) - % Corrections for zones 31 33 35 37 - if ((longitude >= 0) && (longitude < 9)) - utmZone = 31; - elseif ((longitude >= 9) && (longitude < 21)) - utmZone = 33; - elseif ((longitude >= 21) && (longitude < 33)) - utmZone = 35; - elseif ((longitude >= 33) && (longitude < 42)) - utmZone = 37; - end - -elseif ((latitude >= 56) && (latitude < 64)) - % Correction for zone 32 - if ((longitude >= 3) && (longitude < 12)) - utmZone = 32; - end -end +function utmZone = findUtmZone(latitude, longitude) +% Function finds the UTM zone number for given longitude and latitude. +% The longitude value must be between -180 (180 degree West) and 180 (180 +% degree East) degree. The latitude must be within -80 (80 degree South) and +% 84 (84 degree North). +% +% utmZone = findUtmZone(latitude, longitude); +% +% Latitude and longitude must be in decimal degrees (e.g. 15.5 degrees not +% 15 deg 30 min). + +%-------------------------------------------------------------------------- +% SoftGNSS v3.0 +% +% Copyright (C) Darius Plausinaitis +% Written by Darius Plausinaitis +%-------------------------------------------------------------------------- +%This program is free software; you can redistribute it and/or +%modify it under the terms of the GNU General Public License +%as published by the Free Software Foundation; either version 2 +%of the License, or (at your option) any later version. +% +%This program is distributed in the hope that it will be useful, +%but WITHOUT ANY WARRANTY; without even the implied warranty of +%MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +%GNU General Public License for more details. +% +%You should have received a copy of the GNU General Public License +%along with this program; if not, write to the Free Software +%Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, +%USA. +%========================================================================== + +%% Check value bounds ===================================================== + +if ((longitude > 180) || (longitude < -180)) + error('Longitude value exceeds limits (-180:180).'); +end + +if ((latitude > 84) || (latitude < -80)) + error('Latitude value exceeds limits (-80:84).'); +end + +%% Find zone ============================================================== + +% Start at 180 deg west = -180 deg + +utmZone = fix((180 + longitude)/ 6) + 1; + +%% Correct zone numbers for particular areas ============================== + +if (latitude > 72) + % Corrections for zones 31 33 35 37 + if ((longitude >= 0) && (longitude < 9)) + utmZone = 31; + elseif ((longitude >= 9) && (longitude < 21)) + utmZone = 33; + elseif ((longitude >= 21) && (longitude < 33)) + utmZone = 35; + elseif ((longitude >= 33) && (longitude < 42)) + utmZone = 37; + end + +elseif ((latitude >= 56) && (latitude < 64)) + % Correction for zone 32 + if ((longitude >= 3) && (longitude < 12)) + utmZone = 32; + end +end diff --git a/src/utils/matlab/libs/geoFunctions/geo2cart.m b/src/utils/matlab/libs/geoFunctions/geo2cart.m index 3297e966a..90cd6a10f 100644 --- a/src/utils/matlab/libs/geoFunctions/geo2cart.m +++ b/src/utils/matlab/libs/geoFunctions/geo2cart.m @@ -1,46 +1,46 @@ -function [X, Y, Z] = geo2cart(phi, lambda, h, i) -% GEO2CART Conversion of geographical coordinates (phi, lambda, h) to -% Cartesian coordinates (X, Y, Z). -% -% [X, Y, Z] = geo2cart(phi, lambda, h, i); -% -% Format for phi and lambda: [degrees minutes seconds]. -% h, X, Y, and Z are in meters. -% -% Choices i of Reference Ellipsoid -% 1. International Ellipsoid 1924 -% 2. International Ellipsoid 1967 -% 3. World Geodetic System 1972 -% 4. Geodetic Reference System 1980 -% 5. World Geodetic System 1984 -% -% Inputs: -% phi - geocentric latitude (format [degrees minutes seconds]) -% lambda - geocentric longitude (format [degrees minutes seconds]) -% h - height -% i - reference ellipsoid type -% -% Outputs: -% X, Y, Z - Cartesian coordinates (meters) - -% Kai Borre 10-13-98 -% Copyright (c) by Kai Borre -%========================================================================== - -b = phi(1) + phi(2)/60 + phi(3)/3600; -b = b*pi / 180; -l = lambda(1) + lambda(2)/60 + lambda(3)/3600; -l = l*pi / 180; - -a = [6378388 6378160 6378135 6378137 6378137]; -f = [1/297 1/298.247 1/298.26 1/298.257222101 1/298.257223563]; - -ex2 = (2-f(i))*f(i) / ((1-f(i))^2); -c = a(i) * sqrt(1+ex2); -N = c / sqrt(1 + ex2*cos(b)^2); - -X = (N+h) * cos(b) * cos(l); -Y = (N+h) * cos(b) * sin(l); +function [X, Y, Z] = geo2cart(phi, lambda, h, i) +% GEO2CART Conversion of geographical coordinates (phi, lambda, h) to +% Cartesian coordinates (X, Y, Z). +% +% [X, Y, Z] = geo2cart(phi, lambda, h, i); +% +% Format for phi and lambda: [degrees minutes seconds]. +% h, X, Y, and Z are in meters. +% +% Choices i of Reference Ellipsoid +% 1. International Ellipsoid 1924 +% 2. International Ellipsoid 1967 +% 3. World Geodetic System 1972 +% 4. Geodetic Reference System 1980 +% 5. World Geodetic System 1984 +% +% Inputs: +% phi - geocentric latitude (format [degrees minutes seconds]) +% lambda - geocentric longitude (format [degrees minutes seconds]) +% h - height +% i - reference ellipsoid type +% +% Outputs: +% X, Y, Z - Cartesian coordinates (meters) + +% Kai Borre 10-13-98 +% Copyright (c) by Kai Borre +%========================================================================== + +b = phi(1) + phi(2)/60 + phi(3)/3600; +b = b*pi / 180; +l = lambda(1) + lambda(2)/60 + lambda(3)/3600; +l = l*pi / 180; + +a = [6378388 6378160 6378135 6378137 6378137]; +f = [1/297 1/298.247 1/298.26 1/298.257222101 1/298.257223563]; + +ex2 = (2-f(i))*f(i) / ((1-f(i))^2); +c = a(i) * sqrt(1+ex2); +N = c / sqrt(1 + ex2*cos(b)^2); + +X = (N+h) * cos(b) * cos(l); +Y = (N+h) * cos(b) * sin(l); Z = ((1-f(i))^2*N + h) * sin(b); - -%%%%%%%%%%%%%% end geo2cart.m %%%%%%%%%%%%%%%%%%%%%%%% + +%%%%%%%%%%%%%% end geo2cart.m %%%%%%%%%%%%%%%%%%%%%%%% diff --git a/src/utils/matlab/libs/geoFunctions/leastSquarePos.m b/src/utils/matlab/libs/geoFunctions/leastSquarePos.m index 6f5c46f4f..dee7e2180 100644 --- a/src/utils/matlab/libs/geoFunctions/leastSquarePos.m +++ b/src/utils/matlab/libs/geoFunctions/leastSquarePos.m @@ -1,111 +1,111 @@ -function [pos, el, az, dop] = leastSquarePos(satpos, obs, settings) -% Function calculates the Least Square Solution. -% -% [pos, el, az, dop] = leastSquarePos(satpos, obs, settings); -% -% Inputs: -% satpos - Satellites positions (in ECEF system: [X; Y; Z;] - -% one column per satellite) -% obs - Observations - the pseudorange measurements to each -% satellite: -% (e.g. [20000000 21000000 .... .... .... .... ....]) -% settings - receiver settings -% -% Outputs: -% pos - receiver position and receiver clock error -% (in ECEF system: [X, Y, Z, dt]) -% el - Satellites elevation angles (degrees) -% az - Satellites azimuth angles (degrees) -% dop - Dilutions Of Precision ([GDOP PDOP HDOP VDOP TDOP]) - -%-------------------------------------------------------------------------- -% SoftGNSS v3.0 -%-------------------------------------------------------------------------- -%Based on Kai Borre -%Copyright (c) by Kai Borre -%Updated by Darius Plausinaitis, Peter Rinder and Nicolaj Bertelsen -%========================================================================== - -%=== Initialization ======================================================= -nmbOfIterations = 7; - -dtr = pi/180; -pos = zeros(4, 1); -X = satpos; -nmbOfSatellites = size(satpos, 2); - -A = zeros(nmbOfSatellites, 4); -omc = zeros(nmbOfSatellites, 1); -az = zeros(1, nmbOfSatellites); -el = az; - -%=== Iteratively find receiver position =================================== -for iter = 1:nmbOfIterations - - for i = 1:nmbOfSatellites - if iter == 1 - %--- Initialize variables at the first iteration -------------- - Rot_X = X(:, i); - trop = 2; - else - %--- Update equations ----------------------------------------- - rho2 = (X(1, i) - pos(1))^2 + (X(2, i) - pos(2))^2 + ... - (X(3, i) - pos(3))^2; - traveltime = sqrt(rho2) / settings.c ; - - %--- Correct satellite position (do to earth rotation) -------- - Rot_X = e_r_corr(traveltime, X(:, i)); - - %--- Find the elevation angel of the satellite ---------------- - [az(i), el(i), dist] = topocent(pos(1:3, :), Rot_X - pos(1:3, :)); - - if (settings.useTropCorr == 1) - %--- Calculate tropospheric correction -------------------- - trop = tropo(sin(el(i) * dtr), ... - 0.0, 1013.0, 293.0, 50.0, 0.0, 0.0, 0.0); - else - % Do not calculate or apply the tropospheric corrections - trop = 0; - end - end % if iter == 1 ... ... else - - %--- Apply the corrections ---------------------------------------- - omc(i) = (obs(i) - norm(Rot_X - pos(1:3), 'fro') - pos(4) - trop); - - %--- Construct the A matrix --------------------------------------- - A(i, :) = [ (-(Rot_X(1) - pos(1))) / obs(i) ... - (-(Rot_X(2) - pos(2))) / obs(i) ... - (-(Rot_X(3) - pos(3))) / obs(i) ... - 1 ]; - end % for i = 1:nmbOfSatellites - - % These lines allow the code to exit gracefully in case of any errors - if rank(A) ~= 4 - pos = zeros(1, 4); - return - end - - %--- Find position update --------------------------------------------- - x = A \ omc; - - %--- Apply position update -------------------------------------------- - pos = pos + x; - -end % for iter = 1:nmbOfIterations - -pos = pos'; - -%=== Calculate Dilution Of Precision ====================================== -if nargout == 4 - %--- Initialize output ------------------------------------------------ - dop = zeros(1, 5); - - %--- Calculate DOP ---------------------------------------------------- - Q = inv(A'*A); - - dop(1) = sqrt(trace(Q)); % GDOP - dop(2) = sqrt(Q(1,1) + Q(2,2) + Q(3,3)); % PDOP - dop(3) = sqrt(Q(1,1) + Q(2,2)); % HDOP - dop(4) = sqrt(Q(3,3)); % VDOP - dop(5) = sqrt(Q(4,4)); % TDOP -end +function [pos, el, az, dop] = leastSquarePos(satpos, obs, settings) +% Function calculates the Least Square Solution. +% +% [pos, el, az, dop] = leastSquarePos(satpos, obs, settings); +% +% Inputs: +% satpos - Satellites positions (in ECEF system: [X; Y; Z;] - +% one column per satellite) +% obs - Observations - the pseudorange measurements to each +% satellite: +% (e.g. [20000000 21000000 .... .... .... .... ....]) +% settings - receiver settings +% +% Outputs: +% pos - receiver position and receiver clock error +% (in ECEF system: [X, Y, Z, dt]) +% el - Satellites elevation angles (degrees) +% az - Satellites azimuth angles (degrees) +% dop - Dilutions Of Precision ([GDOP PDOP HDOP VDOP TDOP]) + +%-------------------------------------------------------------------------- +% SoftGNSS v3.0 +%-------------------------------------------------------------------------- +%Based on Kai Borre +%Copyright (c) by Kai Borre +%Updated by Darius Plausinaitis, Peter Rinder and Nicolaj Bertelsen +%========================================================================== + +%=== Initialization ======================================================= +nmbOfIterations = 7; + +dtr = pi/180; +pos = zeros(4, 1); +X = satpos; +nmbOfSatellites = size(satpos, 2); + +A = zeros(nmbOfSatellites, 4); +omc = zeros(nmbOfSatellites, 1); +az = zeros(1, nmbOfSatellites); +el = az; + +%=== Iteratively find receiver position =================================== +for iter = 1:nmbOfIterations + + for i = 1:nmbOfSatellites + if iter == 1 + %--- Initialize variables at the first iteration -------------- + Rot_X = X(:, i); + trop = 2; + else + %--- Update equations ----------------------------------------- + rho2 = (X(1, i) - pos(1))^2 + (X(2, i) - pos(2))^2 + ... + (X(3, i) - pos(3))^2; + traveltime = sqrt(rho2) / settings.c ; + + %--- Correct satellite position (do to earth rotation) -------- + Rot_X = e_r_corr(traveltime, X(:, i)); + + %--- Find the elevation angel of the satellite ---------------- + [az(i), el(i), dist] = topocent(pos(1:3, :), Rot_X - pos(1:3, :)); + + if (settings.useTropCorr == 1) + %--- Calculate tropospheric correction -------------------- + trop = tropo(sin(el(i) * dtr), ... + 0.0, 1013.0, 293.0, 50.0, 0.0, 0.0, 0.0); + else + % Do not calculate or apply the tropospheric corrections + trop = 0; + end + end % if iter == 1 ... ... else + + %--- Apply the corrections ---------------------------------------- + omc(i) = (obs(i) - norm(Rot_X - pos(1:3), 'fro') - pos(4) - trop); + + %--- Construct the A matrix --------------------------------------- + A(i, :) = [ (-(Rot_X(1) - pos(1))) / obs(i) ... + (-(Rot_X(2) - pos(2))) / obs(i) ... + (-(Rot_X(3) - pos(3))) / obs(i) ... + 1 ]; + end % for i = 1:nmbOfSatellites + + % These lines allow the code to exit gracefully in case of any errors + if rank(A) ~= 4 + pos = zeros(1, 4); + return + end + + %--- Find position update --------------------------------------------- + x = A \ omc; + + %--- Apply position update -------------------------------------------- + pos = pos + x; + +end % for iter = 1:nmbOfIterations + +pos = pos'; + +%=== Calculate Dilution Of Precision ====================================== +if nargout == 4 + %--- Initialize output ------------------------------------------------ + dop = zeros(1, 5); + + %--- Calculate DOP ---------------------------------------------------- + Q = inv(A'*A); + + dop(1) = sqrt(trace(Q)); % GDOP + dop(2) = sqrt(Q(1,1) + Q(2,2) + Q(3,3)); % PDOP + dop(3) = sqrt(Q(1,1) + Q(2,2)); % HDOP + dop(4) = sqrt(Q(3,3)); % VDOP + dop(5) = sqrt(Q(4,4)); % TDOP +end diff --git a/src/utils/matlab/libs/geoFunctions/mat2dms.m b/src/utils/matlab/libs/geoFunctions/mat2dms.m index 1c3787ab6..fad0eca81 100644 --- a/src/utils/matlab/libs/geoFunctions/mat2dms.m +++ b/src/utils/matlab/libs/geoFunctions/mat2dms.m @@ -1,124 +1,124 @@ -function dmsvec = mat2dms(d,m,s,n) -% MAT2DMS Converts a [deg min sec] matrix to vector format -% -% dms = MAT2DMS(d,m,s) converts a deg:min:sec matrix into a vector -% format. The vector format is dms = 100*deg + min + sec/100. -% This allows d,m,s triple to be compressed into a single value, -% which can then be employed similar to a degree or radian vector. -% The inputs d, m and s must be of equal size. Minutes and -% second must be between 0 and 60. -% -% dms = MAT2DMS(mat) assumes and input matrix of [d m s]. This is -% useful only for single column vectors for d, m and s. -% -% dms = MAT2DMS(d,m) and dms = MAT2DMS([d m]) assume that seconds -% are zero, s = 0. -% -% dms = MAT2DMS(d,m,s,n) uses n as the accuracy of the seconds -% calculation. n = -2 uses accuracy in the hundredths position, -% n = 0 uses accuracy in the units position. Default is n = -5. -% For further discussion of the input n, see ROUNDN. -% -% See also DMS2MAT - -% Copyright 1996-2002 Systems Planning and Analysis, Inc. and The MathWorks, Inc. -% Written by: E. Byrns, E. Brown -% Revision: 1.10 Date: 2002/03/20 21:25:51 - - -if nargin == 0 - error('Incorrect number of arguments') - -elseif nargin==1 - if size(d,2)== 3 - s = d(:,3); m = d(:,2); d = d(:,1); - elseif size(d,2)== 2 - m = d(:,2); d = d(:,1); s = zeros(size(d)); - elseif size(d,2) == 0 - d = []; m = []; s = []; - else - error('Single input matrices must be n-by-2 or n-by-3.'); - end - n = -5; - -elseif nargin == 2 - s = zeros(size(d)); - n = -5; - -elseif nargin == 3 - n = -5; -end - -% Test for empty arguments - -if isempty(d) & isempty(m) & isempty(s); dmsvec = []; return; end - -% Don't let seconds be rounded beyond the tens place. -% If you did, then 55 seconds rounds to 100, which is not good. - -if n == 2; n = 1; end - -% Complex argument tests - -if any([~isreal(d) ~isreal(m) ~isreal(s)]) - warning('Imaginary parts of complex ANGLE argument ignored') - d = real(d); m = real(m); s = real(s); -end - -% Dimension and value tests - -if ~isequal(size(d),size(m),size(s)) - error('Inconsistent dimensions for input arguments') -elseif any(rem(d(~isnan(d)),1) ~= 0 | rem(m(~isnan(m)),1) ~= 0) - error('Degrees and minutes must be integers') -end - -if any(abs(m) > 60) | any (abs(m) < 0) % Actually algorithm allows for - error('Minutes must be >= 0 and < 60') % up to exactly 60 seconds or - % 60 minutes, but the error message -elseif any(abs(s) > 60) | any(abs(s) < 0) % doesn't reflect this so that angst - error('Seconds must be >= 0 and < 60') % is minimized in the user docs -end - -% Ensure that only one negative sign is present and at the correct location - -if any((s<0 & m<0) | (s<0 & d<0) | (m<0 & d<0) ) - error('Multiple negative entries in a DMS specification') -elseif any((s<0 & (m~=0 | d~= 0)) | (m<0 & d~=0)) - error('Incorrect negative DMS specification') -end - -% Construct a sign vector which has +1 when -% angle >= 0 and -1 when angle < 0. Note that the sign of the -% angle is associated with the largest nonzero component of d:m:s - -negvec = (d<0) | (m<0) | (s<0); -signvec = ~negvec - negvec; - -% Convert to all positive numbers. Allows for easier -% adjusting at 60 seconds and 60 minutes - -d = abs(d); m = abs(m); s = abs(s); - -% Truncate seconds to a specified accuracy to eliminate round-off errors - -[s,msg] = roundn(s,n); -if ~isempty(msg); error(msg); end - -% Adjust for 60 seconds or 60 minutes. If s > 60, this can only be -% from round-off during roundn since s > 60 is already tested above. -% This round-off effect has happened though. - -indx = find(s >= 60); -if ~isempty(indx); m(indx) = m(indx) + 1; s(indx) = 0; end - -% The user can not put minutes > 60 as input. However, the line -% above may create minutes > 60 (since the user can put in m == 60), -% thus, the test below includes the greater than condition. - -indx = find(m >= 60); -if ~isempty(indx); d(indx) = d(indx) + 1; m(indx) = m(indx)-60; end - -% Construct the dms vector format - -dmsvec = signvec .* (100*d + m + s/100); +function dmsvec = mat2dms(d,m,s,n) +% MAT2DMS Converts a [deg min sec] matrix to vector format +% +% dms = MAT2DMS(d,m,s) converts a deg:min:sec matrix into a vector +% format. The vector format is dms = 100*deg + min + sec/100. +% This allows d,m,s triple to be compressed into a single value, +% which can then be employed similar to a degree or radian vector. +% The inputs d, m and s must be of equal size. Minutes and +% second must be between 0 and 60. +% +% dms = MAT2DMS(mat) assumes and input matrix of [d m s]. This is +% useful only for single column vectors for d, m and s. +% +% dms = MAT2DMS(d,m) and dms = MAT2DMS([d m]) assume that seconds +% are zero, s = 0. +% +% dms = MAT2DMS(d,m,s,n) uses n as the accuracy of the seconds +% calculation. n = -2 uses accuracy in the hundredths position, +% n = 0 uses accuracy in the units position. Default is n = -5. +% For further discussion of the input n, see ROUNDN. +% +% See also DMS2MAT + +% Copyright 1996-2002 Systems Planning and Analysis, Inc. and The MathWorks, Inc. +% Written by: E. Byrns, E. Brown +% Revision: 1.10 Date: 2002/03/20 21:25:51 + + +if nargin == 0 + error('Incorrect number of arguments') + +elseif nargin==1 + if size(d,2)== 3 + s = d(:,3); m = d(:,2); d = d(:,1); + elseif size(d,2)== 2 + m = d(:,2); d = d(:,1); s = zeros(size(d)); + elseif size(d,2) == 0 + d = []; m = []; s = []; + else + error('Single input matrices must be n-by-2 or n-by-3.'); + end + n = -5; + +elseif nargin == 2 + s = zeros(size(d)); + n = -5; + +elseif nargin == 3 + n = -5; +end + +% Test for empty arguments + +if isempty(d) & isempty(m) & isempty(s); dmsvec = []; return; end + +% Don't let seconds be rounded beyond the tens place. +% If you did, then 55 seconds rounds to 100, which is not good. + +if n == 2; n = 1; end + +% Complex argument tests + +if any([~isreal(d) ~isreal(m) ~isreal(s)]) + warning('Imaginary parts of complex ANGLE argument ignored') + d = real(d); m = real(m); s = real(s); +end + +% Dimension and value tests + +if ~isequal(size(d),size(m),size(s)) + error('Inconsistent dimensions for input arguments') +elseif any(rem(d(~isnan(d)),1) ~= 0 | rem(m(~isnan(m)),1) ~= 0) + error('Degrees and minutes must be integers') +end + +if any(abs(m) > 60) | any (abs(m) < 0) % Actually algorithm allows for + error('Minutes must be >= 0 and < 60') % up to exactly 60 seconds or + % 60 minutes, but the error message +elseif any(abs(s) > 60) | any(abs(s) < 0) % doesn't reflect this so that angst + error('Seconds must be >= 0 and < 60') % is minimized in the user docs +end + +% Ensure that only one negative sign is present and at the correct location + +if any((s<0 & m<0) | (s<0 & d<0) | (m<0 & d<0) ) + error('Multiple negative entries in a DMS specification') +elseif any((s<0 & (m~=0 | d~= 0)) | (m<0 & d~=0)) + error('Incorrect negative DMS specification') +end + +% Construct a sign vector which has +1 when +% angle >= 0 and -1 when angle < 0. Note that the sign of the +% angle is associated with the largest nonzero component of d:m:s + +negvec = (d<0) | (m<0) | (s<0); +signvec = ~negvec - negvec; + +% Convert to all positive numbers. Allows for easier +% adjusting at 60 seconds and 60 minutes + +d = abs(d); m = abs(m); s = abs(s); + +% Truncate seconds to a specified accuracy to eliminate round-off errors + +[s,msg] = roundn(s,n); +if ~isempty(msg); error(msg); end + +% Adjust for 60 seconds or 60 minutes. If s > 60, this can only be +% from round-off during roundn since s > 60 is already tested above. +% This round-off effect has happened though. + +indx = find(s >= 60); +if ~isempty(indx); m(indx) = m(indx) + 1; s(indx) = 0; end + +% The user can not put minutes > 60 as input. However, the line +% above may create minutes > 60 (since the user can put in m == 60), +% thus, the test below includes the greater than condition. + +indx = find(m >= 60); +if ~isempty(indx); d(indx) = d(indx) + 1; m(indx) = m(indx)-60; end + +% Construct the dms vector format + +dmsvec = signvec .* (100*d + m + s/100); diff --git a/src/utils/matlab/libs/geoFunctions/roundn.m b/src/utils/matlab/libs/geoFunctions/roundn.m index ef9c53f4c..ca2eb8998 100644 --- a/src/utils/matlab/libs/geoFunctions/roundn.m +++ b/src/utils/matlab/libs/geoFunctions/roundn.m @@ -1,46 +1,46 @@ -function [x,msg] = roundn(x,n) - -% ROUNDN Rounds input data at specified power of 10 -% -% y = ROUNDN(x) rounds the input data x to the nearest hundredth. -% -% y = ROUNDN(x,n) rounds the input data x at the specified power -% of tens position. For example, n = -2 rounds the input data to -% the 10E-2 (hundredths) position. -% -% [y,msg] = ROUNDN(...) returns the text of any error condition -% encountered in the output variable msg. -% -% See also ROUND - -% Copyright 1996-2002 Systems Planning and Analysis, Inc. and The MathWorks, Inc. -% Written by: E. Byrns, E. Brown -% Revision: 1.9 Date: 2002/03/20 21:26:19 - -msg = []; % Initialize output - -if nargin == 0 - error('Incorrect number of arguments') -elseif nargin == 1 - n = -2; -end - -% Test for scalar n - -if max(size(n)) ~= 1 - msg = 'Scalar accuracy required'; - if nargout < 2; error(msg); end - return -elseif ~isreal(n) - warning('Imaginary part of complex N argument ignored') - n = real(n); -end - -% Compute the exponential factors for rounding at specified -% power of 10. Ensure that n is an integer. - -factors = 10 ^ (fix(-n)); - -% Set the significant digits for the input data - -x = round(x * factors) / factors; +function [x,msg] = roundn(x,n) + +% ROUNDN Rounds input data at specified power of 10 +% +% y = ROUNDN(x) rounds the input data x to the nearest hundredth. +% +% y = ROUNDN(x,n) rounds the input data x at the specified power +% of tens position. For example, n = -2 rounds the input data to +% the 10E-2 (hundredths) position. +% +% [y,msg] = ROUNDN(...) returns the text of any error condition +% encountered in the output variable msg. +% +% See also ROUND + +% Copyright 1996-2002 Systems Planning and Analysis, Inc. and The MathWorks, Inc. +% Written by: E. Byrns, E. Brown +% Revision: 1.9 Date: 2002/03/20 21:26:19 + +msg = []; % Initialize output + +if nargin == 0 + error('Incorrect number of arguments') +elseif nargin == 1 + n = -2; +end + +% Test for scalar n + +if max(size(n)) ~= 1 + msg = 'Scalar accuracy required'; + if nargout < 2; error(msg); end + return +elseif ~isreal(n) + warning('Imaginary part of complex N argument ignored') + n = real(n); +end + +% Compute the exponential factors for rounding at specified +% power of 10. Ensure that n is an integer. + +factors = 10 ^ (fix(-n)); + +% Set the significant digits for the input data + +x = round(x * factors) / factors; diff --git a/src/utils/matlab/libs/geoFunctions/satpos.m b/src/utils/matlab/libs/geoFunctions/satpos.m index 11f4f101e..e359a5df1 100644 --- a/src/utils/matlab/libs/geoFunctions/satpos.m +++ b/src/utils/matlab/libs/geoFunctions/satpos.m @@ -1,138 +1,138 @@ -function [satPositions, satClkCorr] = satpos(transmitTime, prnList, ... - eph, settings) -% SATPOS Computation of satellite coordinates X,Y,Z at TRANSMITTIME for -% given ephemeris EPH. Coordinates are computed for each satellite in the -% list PRNLIST. -%[ satPositions, satClkCorr] = satpos(transmitTime, prnList, eph, settings); -% -% Inputs: -% transmitTime - transmission time -% prnList - list of PRN-s to be processed -% eph - ephemerides of satellites -% settings - receiver settings -% -% Outputs: -% satPositions - position of satellites (in ECEF system [X; Y; Z;]) -% satClkCorr - correction of satellite clocks - -%-------------------------------------------------------------------------- -% SoftGNSS v3.0 -%-------------------------------------------------------------------------- -% Based on Kai Borre 04-09-96 -% Copyright (c) by Kai Borre -% Updated by Darius Plausinaitis, Peter Rinder and Nicolaj Bertelsen - -%% Initialize constants =================================================== -numOfSatellites = size(prnList, 2); - -% GPS constatns - -gpsPi = 3.1415926535898; % Pi used in the GPS coordinate -% system - -%--- Constants for satellite position calculation ------------------------- -Omegae_dot = 7.2921151467e-5; % Earth rotation rate, [rad/s] -GM = 3.986005e14; % Universal gravitational constant times -% the mass of the Earth, [m^3/s^2] -F = -4.442807633e-10; % Constant, [sec/(meter)^(1/2)] - -%% Initialize results ===================================================== -satClkCorr = zeros(1, numOfSatellites); -satPositions = zeros(3, numOfSatellites); - -%% Process each satellite ================================================= - -for satNr = 1 : numOfSatellites - - prn = prnList(satNr); - - %% Find initial satellite clock correction -------------------------------- - - %--- Find time difference --------------------------------------------- - dt = check_t(transmitTime - eph(prn).t_oc); - - %--- Calculate clock correction --------------------------------------- - satClkCorr(satNr) = (eph(prn).a_f2 * dt + eph(prn).a_f1) * dt + ... - eph(prn).a_f0 - ... - eph(prn).T_GD; - - time = transmitTime - satClkCorr(satNr); - - %% Find satellite's position ---------------------------------------------- - - %Restore semi-major axis - a = eph(prn).sqrtA * eph(prn).sqrtA; - - %Time correction - tk = check_t(time - eph(prn).t_oe); - - %Initial mean motion - n0 = sqrt(GM / a^3); - %Mean motion - n = n0 + eph(prn).deltan; - - %Mean anomaly - M = eph(prn).M_0 + n * tk; - %Reduce mean anomaly to between 0 and 360 deg - M = rem(M + 2*gpsPi, 2*gpsPi); - - %Initial guess of eccentric anomaly - E = M; - - %--- Iteratively compute eccentric anomaly ---------------------------- - for ii = 1:10 - E_old = E; - E = M + eph(prn).e * sin(E); - dE = rem(E - E_old, 2*gpsPi); - - if abs(dE) < 1.e-12 - % Necessary precision is reached, exit from the loop - break; - end - end - - %Reduce eccentric anomaly to between 0 and 360 deg - E = rem(E + 2*gpsPi, 2*gpsPi); - - %Compute relativistic correction term - dtr = F * eph(prn).e * eph(prn).sqrtA * sin(E); - - %Calculate the true anomaly - nu = atan2(sqrt(1 - eph(prn).e^2) * sin(E), cos(E)-eph(prn).e); - - %Compute angle phi - phi = nu + eph(prn).omega; - %Reduce phi to between 0 and 360 deg - phi = rem(phi, 2*gpsPi); - - %Correct argument of latitude - u = phi + ... - eph(prn).C_uc * cos(2*phi) + ... - eph(prn).C_us * sin(2*phi); - %Correct radius - r = a * (1 - eph(prn).e*cos(E)) + ... - eph(prn).C_rc * cos(2*phi) + ... - eph(prn).C_rs * sin(2*phi); - %Correct inclination - i = eph(prn).i_0 + eph(prn).iDot * tk + ... - eph(prn).C_ic * cos(2*phi) + ... - eph(prn).C_is * sin(2*phi); - - %Compute the angle between the ascending node and the Greenwich meridian - Omega = eph(prn).omega_0 + (eph(prn).omegaDot - Omegae_dot)*tk - ... - Omegae_dot * eph(prn).t_oe; - %Reduce to between 0 and 360 deg - Omega = rem(Omega + 2*gpsPi, 2*gpsPi); - - %--- Compute satellite coordinates ------------------------------------ - satPositions(1, satNr) = cos(u)*r * cos(Omega) - sin(u)*r * cos(i)*sin(Omega); - satPositions(2, satNr) = cos(u)*r * sin(Omega) + sin(u)*r * cos(i)*cos(Omega); - satPositions(3, satNr) = sin(u)*r * sin(i); - - - %% Include relativistic correction in clock correction -------------------- - satClkCorr(satNr) = (eph(prn).a_f2 * dt + eph(prn).a_f1) * dt + ... - eph(prn).a_f0 - ... - eph(prn).T_GD + dtr; - -end % for satNr = 1 : numOfSatellites +function [satPositions, satClkCorr] = satpos(transmitTime, prnList, ... + eph, settings) +% SATPOS Computation of satellite coordinates X,Y,Z at TRANSMITTIME for +% given ephemeris EPH. Coordinates are computed for each satellite in the +% list PRNLIST. +%[ satPositions, satClkCorr] = satpos(transmitTime, prnList, eph, settings); +% +% Inputs: +% transmitTime - transmission time +% prnList - list of PRN-s to be processed +% eph - ephemerides of satellites +% settings - receiver settings +% +% Outputs: +% satPositions - position of satellites (in ECEF system [X; Y; Z;]) +% satClkCorr - correction of satellite clocks + +%-------------------------------------------------------------------------- +% SoftGNSS v3.0 +%-------------------------------------------------------------------------- +% Based on Kai Borre 04-09-96 +% Copyright (c) by Kai Borre +% Updated by Darius Plausinaitis, Peter Rinder and Nicolaj Bertelsen + +%% Initialize constants =================================================== +numOfSatellites = size(prnList, 2); + +% GPS constatns + +gpsPi = 3.1415926535898; % Pi used in the GPS coordinate +% system + +%--- Constants for satellite position calculation ------------------------- +Omegae_dot = 7.2921151467e-5; % Earth rotation rate, [rad/s] +GM = 3.986005e14; % Universal gravitational constant times +% the mass of the Earth, [m^3/s^2] +F = -4.442807633e-10; % Constant, [sec/(meter)^(1/2)] + +%% Initialize results ===================================================== +satClkCorr = zeros(1, numOfSatellites); +satPositions = zeros(3, numOfSatellites); + +%% Process each satellite ================================================= + +for satNr = 1 : numOfSatellites + + prn = prnList(satNr); + + %% Find initial satellite clock correction -------------------------------- + + %--- Find time difference --------------------------------------------- + dt = check_t(transmitTime - eph(prn).t_oc); + + %--- Calculate clock correction --------------------------------------- + satClkCorr(satNr) = (eph(prn).a_f2 * dt + eph(prn).a_f1) * dt + ... + eph(prn).a_f0 - ... + eph(prn).T_GD; + + time = transmitTime - satClkCorr(satNr); + + %% Find satellite's position ---------------------------------------------- + + %Restore semi-major axis + a = eph(prn).sqrtA * eph(prn).sqrtA; + + %Time correction + tk = check_t(time - eph(prn).t_oe); + + %Initial mean motion + n0 = sqrt(GM / a^3); + %Mean motion + n = n0 + eph(prn).deltan; + + %Mean anomaly + M = eph(prn).M_0 + n * tk; + %Reduce mean anomaly to between 0 and 360 deg + M = rem(M + 2*gpsPi, 2*gpsPi); + + %Initial guess of eccentric anomaly + E = M; + + %--- Iteratively compute eccentric anomaly ---------------------------- + for ii = 1:10 + E_old = E; + E = M + eph(prn).e * sin(E); + dE = rem(E - E_old, 2*gpsPi); + + if abs(dE) < 1.e-12 + % Necessary precision is reached, exit from the loop + break; + end + end + + %Reduce eccentric anomaly to between 0 and 360 deg + E = rem(E + 2*gpsPi, 2*gpsPi); + + %Compute relativistic correction term + dtr = F * eph(prn).e * eph(prn).sqrtA * sin(E); + + %Calculate the true anomaly + nu = atan2(sqrt(1 - eph(prn).e^2) * sin(E), cos(E)-eph(prn).e); + + %Compute angle phi + phi = nu + eph(prn).omega; + %Reduce phi to between 0 and 360 deg + phi = rem(phi, 2*gpsPi); + + %Correct argument of latitude + u = phi + ... + eph(prn).C_uc * cos(2*phi) + ... + eph(prn).C_us * sin(2*phi); + %Correct radius + r = a * (1 - eph(prn).e*cos(E)) + ... + eph(prn).C_rc * cos(2*phi) + ... + eph(prn).C_rs * sin(2*phi); + %Correct inclination + i = eph(prn).i_0 + eph(prn).iDot * tk + ... + eph(prn).C_ic * cos(2*phi) + ... + eph(prn).C_is * sin(2*phi); + + %Compute the angle between the ascending node and the Greenwich meridian + Omega = eph(prn).omega_0 + (eph(prn).omegaDot - Omegae_dot)*tk - ... + Omegae_dot * eph(prn).t_oe; + %Reduce to between 0 and 360 deg + Omega = rem(Omega + 2*gpsPi, 2*gpsPi); + + %--- Compute satellite coordinates ------------------------------------ + satPositions(1, satNr) = cos(u)*r * cos(Omega) - sin(u)*r * cos(i)*sin(Omega); + satPositions(2, satNr) = cos(u)*r * sin(Omega) + sin(u)*r * cos(i)*cos(Omega); + satPositions(3, satNr) = sin(u)*r * sin(i); + + + %% Include relativistic correction in clock correction -------------------- + satClkCorr(satNr) = (eph(prn).a_f2 * dt + eph(prn).a_f1) * dt + ... + eph(prn).a_f0 - ... + eph(prn).T_GD + dtr; + +end % for satNr = 1 : numOfSatellites diff --git a/src/utils/matlab/libs/geoFunctions/togeod.m b/src/utils/matlab/libs/geoFunctions/togeod.m index 9f7812d41..b9d7bbb28 100644 --- a/src/utils/matlab/libs/geoFunctions/togeod.m +++ b/src/utils/matlab/libs/geoFunctions/togeod.m @@ -1,109 +1,109 @@ -function [dphi, dlambda, h] = togeod(a, finv, X, Y, Z) -% TOGEOD Subroutine to calculate geodetic coordinates latitude, longitude, -% height given Cartesian coordinates X,Y,Z, and reference ellipsoid -% values semi-major axis (a) and the inverse of flattening (finv). -% -% [dphi, dlambda, h] = togeod(a, finv, X, Y, Z); -% -% The units of linear parameters X,Y,Z,a must all agree (m,km,mi,ft,..etc) -% The output units of angular quantities will be in decimal degrees -% (15.5 degrees not 15 deg 30 min). The output units of h will be the -% same as the units of X,Y,Z,a. -% -% Inputs: -% a - semi-major axis of the reference ellipsoid -% finv - inverse of flattening of the reference ellipsoid -% X,Y,Z - Cartesian coordinates -% -% Outputs: -% dphi - latitude -% dlambda - longitude -% h - height above reference ellipsoid - -% Copyright (C) 1987 C. Goad, Columbus, Ohio -% Reprinted with permission of author, 1996 -% Fortran code translated into MATLAB -% Kai Borre 03-30-96 -%========================================================================== - -h = 0; -tolsq = 1.e-10; -maxit = 10; - -% compute radians-to-degree factor -rtd = 180/pi; - -% compute square of eccentricity -if finv < 1.e-20 - esq = 0; -else - esq = (2 - 1/finv) / finv; -end - -oneesq = 1 - esq; - -% first guess -% P is distance from spin axis -P = sqrt(X^2+Y^2); -% direct calculation of longitude - -if P > 1.e-20 - dlambda = atan2(Y,X) * rtd; -else - dlambda = 0; -end - -if (dlambda < 0) - dlambda = dlambda + 360; -end - -% r is distance from origin (0,0,0) -r = sqrt(P^2 + Z^2); - -if r > 1.e-20 - sinphi = Z/r; -else - sinphi = 0; -end - -dphi = asin(sinphi); - -% initial value of height = distance from origin minus -% approximate distance from origin to surface of ellipsoid -if r < 1.e-20 - h = 0; - return -end - -h = r - a*(1-sinphi*sinphi/finv); - -% iterate -for i = 1:maxit - sinphi = sin(dphi); - cosphi = cos(dphi); - - % compute radius of curvature in prime vertical direction - N_phi = a/sqrt(1-esq*sinphi*sinphi); - - % compute residuals in P and Z - dP = P - (N_phi + h) * cosphi; - dZ = Z - (N_phi*oneesq + h) * sinphi; - - % update height and latitude - h = h + (sinphi*dZ + cosphi*dP); - dphi = dphi + (cosphi*dZ - sinphi*dP)/(N_phi + h); - - % test for convergence - if (dP*dP + dZ*dZ < tolsq) - break; - end - - % Not Converged--Warn user - if i == maxit - fprintf([' Problem in TOGEOD, did not converge in %2.0f',... - ' iterations\n'], i); - end -end % for i = 1:maxit - -dphi = dphi * rtd; -%%%%%%%% end togeod.m %%%%%%%%%%%%%%%%%%%%%% +function [dphi, dlambda, h] = togeod(a, finv, X, Y, Z) +% TOGEOD Subroutine to calculate geodetic coordinates latitude, longitude, +% height given Cartesian coordinates X,Y,Z, and reference ellipsoid +% values semi-major axis (a) and the inverse of flattening (finv). +% +% [dphi, dlambda, h] = togeod(a, finv, X, Y, Z); +% +% The units of linear parameters X,Y,Z,a must all agree (m,km,mi,ft,..etc) +% The output units of angular quantities will be in decimal degrees +% (15.5 degrees not 15 deg 30 min). The output units of h will be the +% same as the units of X,Y,Z,a. +% +% Inputs: +% a - semi-major axis of the reference ellipsoid +% finv - inverse of flattening of the reference ellipsoid +% X,Y,Z - Cartesian coordinates +% +% Outputs: +% dphi - latitude +% dlambda - longitude +% h - height above reference ellipsoid + +% Copyright (C) 1987 C. Goad, Columbus, Ohio +% Reprinted with permission of author, 1996 +% Fortran code translated into MATLAB +% Kai Borre 03-30-96 +%========================================================================== + +h = 0; +tolsq = 1.e-10; +maxit = 10; + +% compute radians-to-degree factor +rtd = 180/pi; + +% compute square of eccentricity +if finv < 1.e-20 + esq = 0; +else + esq = (2 - 1/finv) / finv; +end + +oneesq = 1 - esq; + +% first guess +% P is distance from spin axis +P = sqrt(X^2+Y^2); +% direct calculation of longitude + +if P > 1.e-20 + dlambda = atan2(Y,X) * rtd; +else + dlambda = 0; +end + +if (dlambda < 0) + dlambda = dlambda + 360; +end + +% r is distance from origin (0,0,0) +r = sqrt(P^2 + Z^2); + +if r > 1.e-20 + sinphi = Z/r; +else + sinphi = 0; +end + +dphi = asin(sinphi); + +% initial value of height = distance from origin minus +% approximate distance from origin to surface of ellipsoid +if r < 1.e-20 + h = 0; + return +end + +h = r - a*(1-sinphi*sinphi/finv); + +% iterate +for i = 1:maxit + sinphi = sin(dphi); + cosphi = cos(dphi); + + % compute radius of curvature in prime vertical direction + N_phi = a/sqrt(1-esq*sinphi*sinphi); + + % compute residuals in P and Z + dP = P - (N_phi + h) * cosphi; + dZ = Z - (N_phi*oneesq + h) * sinphi; + + % update height and latitude + h = h + (sinphi*dZ + cosphi*dP); + dphi = dphi + (cosphi*dZ - sinphi*dP)/(N_phi + h); + + % test for convergence + if (dP*dP + dZ*dZ < tolsq) + break; + end + + % Not Converged--Warn user + if i == maxit + fprintf([' Problem in TOGEOD, did not converge in %2.0f',... + ' iterations\n'], i); + end +end % for i = 1:maxit + +dphi = dphi * rtd; +%%%%%%%% end togeod.m %%%%%%%%%%%%%%%%%%%%%% diff --git a/src/utils/matlab/libs/geoFunctions/topocent.m b/src/utils/matlab/libs/geoFunctions/topocent.m index 7ec0aaede..723cb3dfb 100644 --- a/src/utils/matlab/libs/geoFunctions/topocent.m +++ b/src/utils/matlab/libs/geoFunctions/topocent.m @@ -1,54 +1,54 @@ -function [Az, El, D] = topocent(X, dx) -% TOPOCENT Transformation of vector dx into topocentric coordinate -% system with origin at X. -% Both parameters are 3 by 1 vectors. -% -% [Az, El, D] = topocent(X, dx); -% -% Inputs: -% X - vector origin corrdinates (in ECEF system [X; Y; Z;]) -% dx - vector ([dX; dY; dZ;]). -% -% Outputs: -% D - vector length. Units like units of the input -% Az - azimuth from north positive clockwise, degrees -% El - elevation angle, degrees - -% Kai Borre 11-24-96 -% Copyright (c) by Kai Borre -%========================================================================== - -dtr = pi/180; - -[phi, lambda, h] = togeod(6378137, 298.257223563, X(1), X(2), X(3)); - -cl = cos(lambda * dtr); -sl = sin(lambda * dtr); -cb = cos(phi * dtr); -sb = sin(phi * dtr); - -F = [-sl -sb*cl cb*cl; - cl -sb*sl cb*sl; - 0 cb sb]; - -local_vector = F' * dx; -E = local_vector(1); -N = local_vector(2); -U = local_vector(3); - -hor_dis = sqrt(E^2 + N^2); - -if hor_dis < 1.e-20 - Az = 0; - El = 90; -else - Az = atan2(E, N)/dtr; - El = atan2(U, hor_dis)/dtr; -end - -if Az < 0 - Az = Az + 360; -end - -D = sqrt(dx(1)^2 + dx(2)^2 + dx(3)^2); -%%%%%%%%% end topocent.m %%%%%%%%% +function [Az, El, D] = topocent(X, dx) +% TOPOCENT Transformation of vector dx into topocentric coordinate +% system with origin at X. +% Both parameters are 3 by 1 vectors. +% +% [Az, El, D] = topocent(X, dx); +% +% Inputs: +% X - vector origin corrdinates (in ECEF system [X; Y; Z;]) +% dx - vector ([dX; dY; dZ;]). +% +% Outputs: +% D - vector length. Units like units of the input +% Az - azimuth from north positive clockwise, degrees +% El - elevation angle, degrees + +% Kai Borre 11-24-96 +% Copyright (c) by Kai Borre +%========================================================================== + +dtr = pi/180; + +[phi, lambda, h] = togeod(6378137, 298.257223563, X(1), X(2), X(3)); + +cl = cos(lambda * dtr); +sl = sin(lambda * dtr); +cb = cos(phi * dtr); +sb = sin(phi * dtr); + +F = [-sl -sb*cl cb*cl; + cl -sb*sl cb*sl; + 0 cb sb]; + +local_vector = F' * dx; +E = local_vector(1); +N = local_vector(2); +U = local_vector(3); + +hor_dis = sqrt(E^2 + N^2); + +if hor_dis < 1.e-20 + Az = 0; + El = 90; +else + Az = atan2(E, N)/dtr; + El = atan2(U, hor_dis)/dtr; +end + +if Az < 0 + Az = Az + 360; +end + +D = sqrt(dx(1)^2 + dx(2)^2 + dx(3)^2); +%%%%%%%%% end topocent.m %%%%%%%%% diff --git a/src/utils/matlab/libs/geoFunctions/tropo.m b/src/utils/matlab/libs/geoFunctions/tropo.m index f0f08d218..4e1801aac 100644 --- a/src/utils/matlab/libs/geoFunctions/tropo.m +++ b/src/utils/matlab/libs/geoFunctions/tropo.m @@ -1,95 +1,95 @@ -function ddr = tropo(sinel, hsta, p, tkel, hum, hp, htkel, hhum) -% TROPO Calculation of tropospheric correction. -% The range correction ddr in m is to be subtracted from -% pseudo-ranges and carrier phases -% -% ddr = tropo(sinel, hsta, p, tkel, hum, hp, htkel, hhum); -% -% Inputs: -% sinel - sin of elevation angle of satellite -% hsta - height of station in km -% p - atmospheric pressure in mb at height hp -% tkel - surface temperature in degrees Kelvin at height htkel -% hum - humidity in % at height hhum -% hp - height of pressure measurement in km -% htkel - height of temperature measurement in km -% hhum - height of humidity measurement in km -% -% Outputs: -% ddr - range correction (meters) -% -% Reference -% Goad, C.C. & Goodman, L. (1974) A Modified Tropospheric -% Refraction Correction Model. Paper presented at the -% American Geophysical Union Annual Fall Meeting, San -% Francisco, December 12-17 - -% A Matlab reimplementation of a C code from driver. -% Kai Borre 06-28-95 -%========================================================================== - -a_e = 6378.137; % semi-major axis of earth ellipsoid -b0 = 7.839257e-5; -tlapse = -6.5; -tkhum = tkel + tlapse*(hhum-htkel); -atkel = 7.5*(tkhum-273.15) / (237.3+tkhum-273.15); -e0 = 0.0611 * hum * 10^atkel; -tksea = tkel - tlapse*htkel; -em = -978.77 / (2.8704e6*tlapse*1.0e-5); -tkelh = tksea + tlapse*hhum; -e0sea = e0 * (tksea/tkelh)^(4*em); -tkelp = tksea + tlapse*hp; -psea = p * (tksea/tkelp)^em; - -if sinel < 0 - sinel = 0; -end - -tropo = 0; -done = 'FALSE'; -refsea = 77.624e-6 / tksea; -htop = 1.1385e-5 / refsea; -refsea = refsea * psea; -ref = refsea * ((htop-hsta)/htop)^4; - -while 1 - rtop = (a_e+htop)^2 - (a_e+hsta)^2*(1-sinel^2); - - % check to see if geometry is crazy - if rtop < 0 - rtop = 0; - end - - rtop = sqrt(rtop) - (a_e+hsta)*sinel; - a = -sinel/(htop-hsta); - b = -b0*(1-sinel^2) / (htop-hsta); - rn = zeros(8,1); - - for i = 1:8 - rn(i) = rtop^(i+1); - end - - alpha = [2*a, 2*a^2+4*b/3, a*(a^2+3*b),... - a^4/5+2.4*a^2*b+1.2*b^2, 2*a*b*(a^2+3*b)/3,... - b^2*(6*a^2+4*b)*1.428571e-1, 0, 0]; - - if b^2 > 1.0e-35 - alpha(7) = a*b^3/2; - alpha(8) = b^4/9; - end - - dr = rtop; - dr = dr + alpha*rn; - tropo = tropo + dr*ref*1000; - - if done == 'TRUE ' - ddr = tropo; - break; - end - - done = 'TRUE '; - refsea = (371900.0e-6/tksea-12.92e-6)/tksea; - htop = 1.1385e-5 * (1255/tksea+0.05)/refsea; - ref = refsea * e0sea * ((htop-hsta)/htop)^4; -end; -%%%%%%%%% end tropo.m %%%%%%%%%%%%%%%%%%% +function ddr = tropo(sinel, hsta, p, tkel, hum, hp, htkel, hhum) +% TROPO Calculation of tropospheric correction. +% The range correction ddr in m is to be subtracted from +% pseudo-ranges and carrier phases +% +% ddr = tropo(sinel, hsta, p, tkel, hum, hp, htkel, hhum); +% +% Inputs: +% sinel - sin of elevation angle of satellite +% hsta - height of station in km +% p - atmospheric pressure in mb at height hp +% tkel - surface temperature in degrees Kelvin at height htkel +% hum - humidity in % at height hhum +% hp - height of pressure measurement in km +% htkel - height of temperature measurement in km +% hhum - height of humidity measurement in km +% +% Outputs: +% ddr - range correction (meters) +% +% Reference +% Goad, C.C. & Goodman, L. (1974) A Modified Tropospheric +% Refraction Correction Model. Paper presented at the +% American Geophysical Union Annual Fall Meeting, San +% Francisco, December 12-17 + +% A Matlab reimplementation of a C code from driver. +% Kai Borre 06-28-95 +%========================================================================== + +a_e = 6378.137; % semi-major axis of earth ellipsoid +b0 = 7.839257e-5; +tlapse = -6.5; +tkhum = tkel + tlapse*(hhum-htkel); +atkel = 7.5*(tkhum-273.15) / (237.3+tkhum-273.15); +e0 = 0.0611 * hum * 10^atkel; +tksea = tkel - tlapse*htkel; +em = -978.77 / (2.8704e6*tlapse*1.0e-5); +tkelh = tksea + tlapse*hhum; +e0sea = e0 * (tksea/tkelh)^(4*em); +tkelp = tksea + tlapse*hp; +psea = p * (tksea/tkelp)^em; + +if sinel < 0 + sinel = 0; +end + +tropo = 0; +done = 'FALSE'; +refsea = 77.624e-6 / tksea; +htop = 1.1385e-5 / refsea; +refsea = refsea * psea; +ref = refsea * ((htop-hsta)/htop)^4; + +while 1 + rtop = (a_e+htop)^2 - (a_e+hsta)^2*(1-sinel^2); + + % check to see if geometry is crazy + if rtop < 0 + rtop = 0; + end + + rtop = sqrt(rtop) - (a_e+hsta)*sinel; + a = -sinel/(htop-hsta); + b = -b0*(1-sinel^2) / (htop-hsta); + rn = zeros(8,1); + + for i = 1:8 + rn(i) = rtop^(i+1); + end + + alpha = [2*a, 2*a^2+4*b/3, a*(a^2+3*b),... + a^4/5+2.4*a^2*b+1.2*b^2, 2*a*b*(a^2+3*b)/3,... + b^2*(6*a^2+4*b)*1.428571e-1, 0, 0]; + + if b^2 > 1.0e-35 + alpha(7) = a*b^3/2; + alpha(8) = b^4/9; + end + + dr = rtop; + dr = dr + alpha*rn; + tropo = tropo + dr*ref*1000; + + if done == 'TRUE ' + ddr = tropo; + break; + end + + done = 'TRUE '; + refsea = (371900.0e-6/tksea-12.92e-6)/tksea; + htop = 1.1385e-5 * (1255/tksea+0.05)/refsea; + ref = refsea * e0sea * ((htop-hsta)/htop)^4; +end; +%%%%%%%%% end tropo.m %%%%%%%%%%%%%%%%%%% diff --git a/src/utils/matlab/libs/plotNavigation.m b/src/utils/matlab/libs/plotNavigation.m index fd6af14d8..9e27fc4d2 100644 --- a/src/utils/matlab/libs/plotNavigation.m +++ b/src/utils/matlab/libs/plotNavigation.m @@ -1,166 +1,166 @@ -% Function plots variations of coordinates over time and a 3D position -% plot. It plots receiver coordinates in UTM system or coordinate offsets if -% the true UTM receiver coordinates are provided. -% -% plotNavigation(navSolutions, settings) -% -% Inputs: -% navSolutions - Results from navigation solution function. It -% contains measured pseudoranges and receiver -% coordinates. -% settings - Receiver settings. The true receiver coordinates -% are contained in this structure. -% plot_skyplot - If ==1 then use satellite coordinates to plot the -% the satellite positions - -% Darius Plausinaitis -% Modified by Javier Arribas, 2011. jarribas(at)cttc.es -% ------------------------------------------------------------------------- -% -% Copyright (C) 2010-2018 (see AUTHORS file for a list of contributors) -% -% GNSS-SDR is a software defined Global Navigation -% Satellite Systems receiver -% -% This file is part of GNSS-SDR. -% -% GNSS-SDR is free software: you can redistribute it and/or modify -% it under the terms of the GNU General Public License as published by -% the Free Software Foundation, either version 3 of the License, or -% at your option) any later version. -% -% GNSS-SDR is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with GNSS-SDR. If not, see . -% -% ------------------------------------------------------------------------- -% - -function plotNavigation(navSolutions, settings,plot_skyplot) - - -%% Plot results in the necessary data exists ============================== -if (~isempty(navSolutions)) - - %% If reference position is not provided, then set reference position - %% to the average postion - if isnan(settings.truePosition.E) || isnan(settings.truePosition.N) ... - || isnan(settings.truePosition.U) - - %=== Compute mean values ========================================== - % Remove NaN-s or the output of the function MEAN will be NaN. - refCoord.E = mean(navSolutions.E(~isnan(navSolutions.E))); - refCoord.N = mean(navSolutions.N(~isnan(navSolutions.N))); - refCoord.U = mean(navSolutions.U(~isnan(navSolutions.U))); - - %Also convert geodetic coordinates to deg:min:sec vector format - meanLongitude = dms2mat(deg2dms(... - mean(navSolutions.longitude(~isnan(navSolutions.longitude)))), -5); - meanLatitude = dms2mat(deg2dms(... - mean(navSolutions.latitude(~isnan(navSolutions.latitude)))), -5); - - LatLong_str=[num2str(meanLatitude(1)), '??', ... - num2str(meanLatitude(2)), '''', ... - num2str(meanLatitude(3)), '''''', ... - ',', ... - num2str(meanLongitude(1)), '??', ... - num2str(meanLongitude(2)), '''', ... - num2str(meanLongitude(3)), ''''''] - - - - refPointLgText = ['Mean Position\newline Lat: ', ... - num2str(meanLatitude(1)), '{\circ}', ... - num2str(meanLatitude(2)), '{\prime}', ... - num2str(meanLatitude(3)), '{\prime}{\prime}', ... - '\newline Lng: ', ... - num2str(meanLongitude(1)), '{\circ}', ... - num2str(meanLongitude(2)), '{\prime}', ... - num2str(meanLongitude(3)), '{\prime}{\prime}', ... - '\newline Hgt: ', ... - num2str(mean(navSolutions.height(~isnan(navSolutions.height))), '%+6.1f')]; - - else - % compute the mean error for static receiver - mean_position.E = mean(navSolutions.E(~isnan(navSolutions.E))); - mean_position.N = mean(navSolutions.N(~isnan(navSolutions.N))); - mean_position.U = mean(navSolutions.U(~isnan(navSolutions.U))); - refCoord.E = settings.truePosition.E; - refCoord.N = settings.truePosition.N; - refCoord.U = settings.truePosition.U; - - error_meters=sqrt((mean_position.E-refCoord.E)^2+(mean_position.N-refCoord.N)^2+(mean_position.U-refCoord.U)^2); - - refPointLgText = ['Reference Position, Mean 3D error = ' num2str(error_meters) ' [m]']; - end - - figureNumber = 300; - % The 300 is chosen for more convenient handling of the open - % figure windows, when many figures are closed and reopened. Figures - % drawn or opened by the user, will not be "overwritten" by this - % function if the auto numbering is not used. - - %=== Select (or create) and clear the figure ========================== - figure(figureNumber); - clf (figureNumber); - set (figureNumber, 'Name', 'Navigation solutions'); - - %--- Draw axes -------------------------------------------------------- - handles(1, 1) = subplot(4, 2, 1 : 4); - handles(3, 1) = subplot(4, 2, [5, 7]); - handles(3, 2) = subplot(4, 2, [6, 8]); - - %% Plot all figures ======================================================= - - %--- Coordinate differences in UTM system ----------------------------- - plot(handles(1, 1), [(navSolutions.E - refCoord.E)', ... - (navSolutions.N - refCoord.N)',... - (navSolutions.U - refCoord.U)']); - - title (handles(1, 1), 'Coordinates variations in UTM system'); - legend(handles(1, 1), 'E', 'N', 'U'); - xlabel(handles(1, 1), ['Measurement period: ', ... - num2str(settings.navSolPeriod), 'ms']); - ylabel(handles(1, 1), 'Variations (m)'); - grid (handles(1, 1)); - axis (handles(1, 1), 'tight'); - - %--- Position plot in UTM system -------------------------------------- - plot3 (handles(3, 1), navSolutions.E - refCoord.E, ... - navSolutions.N - refCoord.N, ... - navSolutions.U - refCoord.U, '+'); - hold (handles(3, 1), 'on'); - - %Plot the reference point - plot3 (handles(3, 1), 0, 0, 0, 'r+', 'LineWidth', 1.5, 'MarkerSize', 10); - hold (handles(3, 1), 'off'); - - view (handles(3, 1), 0, 90); - axis (handles(3, 1), 'equal'); - grid (handles(3, 1), 'minor'); - - legend(handles(3, 1), 'Measurements', refPointLgText); - - title (handles(3, 1), 'Positions in UTM system (3D plot)'); - xlabel(handles(3, 1), 'East (m)'); - ylabel(handles(3, 1), 'North (m)'); - zlabel(handles(3, 1), 'Upping (m)'); - - if (plot_skyplot==1) - %--- Satellite sky plot ----------------------------------------------- - skyPlot(handles(3, 2), ... - navSolutions.channel.az, ... - navSolutions.channel.el, ... - navSolutions.channel.PRN(:, 1)); - - title (handles(3, 2), ['Sky plot (mean PDOP: ', ... - num2str(mean(navSolutions.DOP(2,:))), ')']); - end - -else - disp('plotNavigation: No navigation data to plot.'); -end % if (~isempty(navSolutions)) +% Function plots variations of coordinates over time and a 3D position +% plot. It plots receiver coordinates in UTM system or coordinate offsets if +% the true UTM receiver coordinates are provided. +% +% plotNavigation(navSolutions, settings) +% +% Inputs: +% navSolutions - Results from navigation solution function. It +% contains measured pseudoranges and receiver +% coordinates. +% settings - Receiver settings. The true receiver coordinates +% are contained in this structure. +% plot_skyplot - If ==1 then use satellite coordinates to plot the +% the satellite positions + +% Darius Plausinaitis +% Modified by Javier Arribas, 2011. jarribas(at)cttc.es +% ------------------------------------------------------------------------- +% +% Copyright (C) 2010-2018 (see AUTHORS file for a list of contributors) +% +% GNSS-SDR is a software defined Global Navigation +% Satellite Systems receiver +% +% This file is part of GNSS-SDR. +% +% GNSS-SDR is free software: you can redistribute it and/or modify +% it under the terms of the GNU General Public License as published by +% the Free Software Foundation, either version 3 of the License, or +% at your option) any later version. +% +% GNSS-SDR is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with GNSS-SDR. If not, see . +% +% ------------------------------------------------------------------------- +% + +function plotNavigation(navSolutions, settings,plot_skyplot) + + +%% Plot results in the necessary data exists ============================== +if (~isempty(navSolutions)) + + %% If reference position is not provided, then set reference position + %% to the average postion + if isnan(settings.truePosition.E) || isnan(settings.truePosition.N) ... + || isnan(settings.truePosition.U) + + %=== Compute mean values ========================================== + % Remove NaN-s or the output of the function MEAN will be NaN. + refCoord.E = mean(navSolutions.E(~isnan(navSolutions.E))); + refCoord.N = mean(navSolutions.N(~isnan(navSolutions.N))); + refCoord.U = mean(navSolutions.U(~isnan(navSolutions.U))); + + %Also convert geodetic coordinates to deg:min:sec vector format + meanLongitude = dms2mat(deg2dms(... + mean(navSolutions.longitude(~isnan(navSolutions.longitude)))), -5); + meanLatitude = dms2mat(deg2dms(... + mean(navSolutions.latitude(~isnan(navSolutions.latitude)))), -5); + + LatLong_str=[num2str(meanLatitude(1)), '??', ... + num2str(meanLatitude(2)), '''', ... + num2str(meanLatitude(3)), '''''', ... + ',', ... + num2str(meanLongitude(1)), '??', ... + num2str(meanLongitude(2)), '''', ... + num2str(meanLongitude(3)), ''''''] + + + + refPointLgText = ['Mean Position\newline Lat: ', ... + num2str(meanLatitude(1)), '{\circ}', ... + num2str(meanLatitude(2)), '{\prime}', ... + num2str(meanLatitude(3)), '{\prime}{\prime}', ... + '\newline Lng: ', ... + num2str(meanLongitude(1)), '{\circ}', ... + num2str(meanLongitude(2)), '{\prime}', ... + num2str(meanLongitude(3)), '{\prime}{\prime}', ... + '\newline Hgt: ', ... + num2str(mean(navSolutions.height(~isnan(navSolutions.height))), '%+6.1f')]; + + else + % compute the mean error for static receiver + mean_position.E = mean(navSolutions.E(~isnan(navSolutions.E))); + mean_position.N = mean(navSolutions.N(~isnan(navSolutions.N))); + mean_position.U = mean(navSolutions.U(~isnan(navSolutions.U))); + refCoord.E = settings.truePosition.E; + refCoord.N = settings.truePosition.N; + refCoord.U = settings.truePosition.U; + + error_meters=sqrt((mean_position.E-refCoord.E)^2+(mean_position.N-refCoord.N)^2+(mean_position.U-refCoord.U)^2); + + refPointLgText = ['Reference Position, Mean 3D error = ' num2str(error_meters) ' [m]']; + end + + figureNumber = 300; + % The 300 is chosen for more convenient handling of the open + % figure windows, when many figures are closed and reopened. Figures + % drawn or opened by the user, will not be "overwritten" by this + % function if the auto numbering is not used. + + %=== Select (or create) and clear the figure ========================== + figure(figureNumber); + clf (figureNumber); + set (figureNumber, 'Name', 'Navigation solutions'); + + %--- Draw axes -------------------------------------------------------- + handles(1, 1) = subplot(4, 2, 1 : 4); + handles(3, 1) = subplot(4, 2, [5, 7]); + handles(3, 2) = subplot(4, 2, [6, 8]); + + %% Plot all figures ======================================================= + + %--- Coordinate differences in UTM system ----------------------------- + plot(handles(1, 1), [(navSolutions.E - refCoord.E)', ... + (navSolutions.N - refCoord.N)',... + (navSolutions.U - refCoord.U)']); + + title (handles(1, 1), 'Coordinates variations in UTM system'); + legend(handles(1, 1), 'E', 'N', 'U'); + xlabel(handles(1, 1), ['Measurement period: ', ... + num2str(settings.navSolPeriod), 'ms']); + ylabel(handles(1, 1), 'Variations (m)'); + grid (handles(1, 1)); + axis (handles(1, 1), 'tight'); + + %--- Position plot in UTM system -------------------------------------- + plot3 (handles(3, 1), navSolutions.E - refCoord.E, ... + navSolutions.N - refCoord.N, ... + navSolutions.U - refCoord.U, '+'); + hold (handles(3, 1), 'on'); + + %Plot the reference point + plot3 (handles(3, 1), 0, 0, 0, 'r+', 'LineWidth', 1.5, 'MarkerSize', 10); + hold (handles(3, 1), 'off'); + + view (handles(3, 1), 0, 90); + axis (handles(3, 1), 'equal'); + grid (handles(3, 1), 'minor'); + + legend(handles(3, 1), 'Measurements', refPointLgText); + + title (handles(3, 1), 'Positions in UTM system (3D plot)'); + xlabel(handles(3, 1), 'East (m)'); + ylabel(handles(3, 1), 'North (m)'); + zlabel(handles(3, 1), 'Upping (m)'); + + if (plot_skyplot==1) + %--- Satellite sky plot ----------------------------------------------- + skyPlot(handles(3, 2), ... + navSolutions.channel.az, ... + navSolutions.channel.el, ... + navSolutions.channel.PRN(:, 1)); + + title (handles(3, 2), ['Sky plot (mean PDOP: ', ... + num2str(mean(navSolutions.DOP(2,:))), ')']); + end + +else + disp('plotNavigation: No navigation data to plot.'); +end % if (~isempty(navSolutions)) diff --git a/src/utils/matlab/libs/plotTracking.m b/src/utils/matlab/libs/plotTracking.m index e8d6ede85..b280d82aa 100644 --- a/src/utils/matlab/libs/plotTracking.m +++ b/src/utils/matlab/libs/plotTracking.m @@ -1,187 +1,187 @@ -function plotTracking(channelList, trackResults, settings) -% This function plots the tracking results for the given channel list. -% -% plotTracking(channelList, trackResults, settings) -% -% Inputs: -% channelList - list of channels to be plotted. -% trackResults - tracking results from the tracking function. -% settings - receiver settings. - -%-------------------------------------------------------------------------- -% SoftGNSS v3.0 -% -% Copyright (C) Darius Plausinaitis -% Written by Darius Plausinaitis -%-------------------------------------------------------------------------- -%This program is free software; you can redistribute it and/or -%modify it under the terms of the GNU General Public License -%as published by the Free Software Foundation; either version 2 -%of the License, or (at your option) any later version. -% -%This program is distributed in the hope that it will be useful, -%but WITHOUT ANY WARRANTY; without even the implied warranty of -%MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -%GNU General Public License for more details. -% -%You should have received a copy of the GNU General Public License -%along with this program; if not, write to the Free Software -%Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, -%USA. -%-------------------------------------------------------------------------- - - -% Protection - if the list contains incorrect channel numbers -channelList = intersect(channelList, 1:settings.numberOfChannels); - -%=== For all listed channels ============================================== -for channelNr = channelList - - %% Select (or create) and clear the figure ================================ - % The number 200 is added just for more convenient handling of the open - % figure windows, when many figures are closed and reopened. - % Figures drawn or opened by the user, will not be "overwritten" by - % this function. - - figure(channelNr +200); - clf(channelNr +200); - set(channelNr +200, 'Name', ['Channel ', num2str(channelNr), ... - ' (PRN ', ... - num2str(trackResults(channelNr).PRN(end-1)), ... - ') results']); - - %% Draw axes ============================================================== - % Row 1 - handles(1, 1) = subplot(4, 3, 1); - handles(1, 2) = subplot(4, 3, [2 3]); - % Row 2 - handles(2, 1) = subplot(4, 3, 4); - handles(2, 2) = subplot(4, 3, [5 6]); - % Row 3 - handles(3, 1) = subplot(4, 3, 7); - handles(3, 2) = subplot(4, 3, 8); - handles(3, 3) = subplot(4, 3, 9); - % Row 4 - handles(4, 1) = subplot(4, 3, 10); - handles(4, 2) = subplot(4, 3, 11); - handles(4, 3) = subplot(4, 3, 12); - - - %% Plot all figures ======================================================= - - timeAxisInSeconds = (1:settings.msToProcess)/1000; - - %----- Discrete-Time Scatter Plot --------------------------------- - plot(handles(1, 1), trackResults(channelNr).I_P,... - trackResults(channelNr).Q_P, ... - '.'); - - grid (handles(1, 1)); - axis (handles(1, 1), 'equal'); - title (handles(1, 1), 'Discrete-Time Scatter Plot'); - xlabel(handles(1, 1), 'I prompt'); - ylabel(handles(1, 1), 'Q prompt'); - - %----- Nav bits --------------------------------------------------- - plot (handles(1, 2), timeAxisInSeconds, ... - trackResults(channelNr).I_P); - - grid (handles(1, 2)); - title (handles(1, 2), 'Bits of the navigation message'); - xlabel(handles(1, 2), 'Time (s)'); - axis (handles(1, 2), 'tight'); - - %----- PLL discriminator unfiltered-------------------------------- - plot (handles(2, 1), timeAxisInSeconds, ... - trackResults(channelNr).pllDiscr, 'r'); - - grid (handles(2, 1)); - axis (handles(2, 1), 'tight'); - xlabel(handles(2, 1), 'Time (s)'); - ylabel(handles(2, 1), 'Amplitude'); - title (handles(2, 1), 'Raw PLL discriminator'); - - %----- Correlation ------------------------------------------------ - plot(handles(2, 2), timeAxisInSeconds, ... - [sqrt(trackResults(channelNr).I_E.^2 + ... - trackResults(channelNr).Q_E.^2)', ... - sqrt(trackResults(channelNr).I_P.^2 + ... - trackResults(channelNr).Q_P.^2)', ... - sqrt(trackResults(channelNr).I_L.^2 + ... - trackResults(channelNr).Q_L.^2)'], ... - '-*'); - - grid (handles(2, 2)); - title (handles(2, 2), 'Correlation results'); - xlabel(handles(2, 2), 'Time (s)'); - axis (handles(2, 2), 'tight'); - - hLegend = legend(handles(2, 2), '$\sqrt{I_{E}^2 + Q_{E}^2}$', ... - '$\sqrt{I_{P}^2 + Q_{P}^2}$', ... - '$\sqrt{I_{L}^2 + Q_{L}^2}$'); - - %set interpreter from tex to latex. This will draw \sqrt correctly - set(hLegend, 'Interpreter', 'Latex'); - - %----- PLL discriminator filtered---------------------------------- - plot (handles(3, 1), timeAxisInSeconds, ... - trackResults(channelNr).pllDiscrFilt(1:settings.msToProcess), 'b'); - - grid (handles(3, 1)); - axis (handles(3, 1), 'tight'); - xlabel(handles(3, 1), 'Time (s)'); - ylabel(handles(3, 1), 'Amplitude'); - title (handles(3, 1), 'Filtered PLL discriminator'); - - %----- DLL discriminator unfiltered-------------------------------- - plot (handles(3, 2), timeAxisInSeconds, ... - trackResults(channelNr).dllDiscr, 'r'); - - grid (handles(3, 2)); - axis (handles(3, 2), 'tight'); - xlabel(handles(3, 2), 'Time (s)'); - ylabel(handles(3, 2), 'Amplitude'); - title (handles(3, 2), 'Raw DLL discriminator'); - - %----- DLL discriminator filtered---------------------------------- - plot (handles(3, 3), timeAxisInSeconds, ... - trackResults(channelNr).dllDiscrFilt, 'b'); - - grid (handles(3, 3)); - axis (handles(3, 3), 'tight'); - xlabel(handles(3, 3), 'Time (s)'); - ylabel(handles(3, 3), 'Amplitude'); - title (handles(3, 3), 'Filtered DLL discriminator'); - - %----- CNo for signal---------------------------------- - plot (handles(4, 1), timeAxisInSeconds, ... - trackResults(channelNr).CNo(1:settings.msToProcess), 'b'); - - grid (handles(4, 1)); - axis (handles(4, 1), 'tight'); - xlabel(handles(4, 1), 'Time (s)'); - ylabel(handles(4, 1), 'CNo (dB-Hz)'); - title (handles(4, 1), 'Carrier to Noise Ratio'); - - %----- Carrier Frequency -------------------------------- - plot (handles(4, 2), timeAxisInSeconds(2:end), ... - trackResults(channelNr).carrFreq(2:settings.msToProcess), 'Color',[0.42 0.25 0.39]); - - grid (handles(4, 2)); - axis (handles(4, 2)); - xlabel(handles(4, 2), 'Time (s)'); - ylabel(handles(4, 2), 'Freq (hz)'); - title (handles(4, 2), 'Carrier Freq'); - - %----- Code Frequency---------------------------------- - %--- Skip sample 0 to help with results display - plot (handles(4, 3), timeAxisInSeconds(2:end), ... - trackResults(channelNr).codeFreq(2:settings.msToProcess), 'Color',[0.2 0.3 0.49]); - - grid (handles(4, 3)); - axis (handles(4, 3), 'tight'); - xlabel(handles(4, 3), 'Time (s)'); - ylabel(handles(4, 3), 'Freq (Hz)'); - title (handles(4, 3), 'Code Freq'); - -end % for channelNr = channelList +function plotTracking(channelList, trackResults, settings) +% This function plots the tracking results for the given channel list. +% +% plotTracking(channelList, trackResults, settings) +% +% Inputs: +% channelList - list of channels to be plotted. +% trackResults - tracking results from the tracking function. +% settings - receiver settings. + +%-------------------------------------------------------------------------- +% SoftGNSS v3.0 +% +% Copyright (C) Darius Plausinaitis +% Written by Darius Plausinaitis +%-------------------------------------------------------------------------- +%This program is free software; you can redistribute it and/or +%modify it under the terms of the GNU General Public License +%as published by the Free Software Foundation; either version 2 +%of the License, or (at your option) any later version. +% +%This program is distributed in the hope that it will be useful, +%but WITHOUT ANY WARRANTY; without even the implied warranty of +%MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +%GNU General Public License for more details. +% +%You should have received a copy of the GNU General Public License +%along with this program; if not, write to the Free Software +%Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, +%USA. +%-------------------------------------------------------------------------- + + +% Protection - if the list contains incorrect channel numbers +channelList = intersect(channelList, 1:settings.numberOfChannels); + +%=== For all listed channels ============================================== +for channelNr = channelList + + %% Select (or create) and clear the figure ================================ + % The number 200 is added just for more convenient handling of the open + % figure windows, when many figures are closed and reopened. + % Figures drawn or opened by the user, will not be "overwritten" by + % this function. + + figure(channelNr +200); + clf(channelNr +200); + set(channelNr +200, 'Name', ['Channel ', num2str(channelNr), ... + ' (PRN ', ... + num2str(trackResults(channelNr).PRN(end-1)), ... + ') results']); + + %% Draw axes ============================================================== + % Row 1 + handles(1, 1) = subplot(4, 3, 1); + handles(1, 2) = subplot(4, 3, [2 3]); + % Row 2 + handles(2, 1) = subplot(4, 3, 4); + handles(2, 2) = subplot(4, 3, [5 6]); + % Row 3 + handles(3, 1) = subplot(4, 3, 7); + handles(3, 2) = subplot(4, 3, 8); + handles(3, 3) = subplot(4, 3, 9); + % Row 4 + handles(4, 1) = subplot(4, 3, 10); + handles(4, 2) = subplot(4, 3, 11); + handles(4, 3) = subplot(4, 3, 12); + + + %% Plot all figures ======================================================= + + timeAxisInSeconds = (1:settings.msToProcess)/1000; + + %----- Discrete-Time Scatter Plot --------------------------------- + plot(handles(1, 1), trackResults(channelNr).I_P,... + trackResults(channelNr).Q_P, ... + '.'); + + grid (handles(1, 1)); + axis (handles(1, 1), 'equal'); + title (handles(1, 1), 'Discrete-Time Scatter Plot'); + xlabel(handles(1, 1), 'I prompt'); + ylabel(handles(1, 1), 'Q prompt'); + + %----- Nav bits --------------------------------------------------- + plot (handles(1, 2), timeAxisInSeconds, ... + trackResults(channelNr).I_P); + + grid (handles(1, 2)); + title (handles(1, 2), 'Bits of the navigation message'); + xlabel(handles(1, 2), 'Time (s)'); + axis (handles(1, 2), 'tight'); + + %----- PLL discriminator unfiltered-------------------------------- + plot (handles(2, 1), timeAxisInSeconds, ... + trackResults(channelNr).pllDiscr, 'r'); + + grid (handles(2, 1)); + axis (handles(2, 1), 'tight'); + xlabel(handles(2, 1), 'Time (s)'); + ylabel(handles(2, 1), 'Amplitude'); + title (handles(2, 1), 'Raw PLL discriminator'); + + %----- Correlation ------------------------------------------------ + plot(handles(2, 2), timeAxisInSeconds, ... + [sqrt(trackResults(channelNr).I_E.^2 + ... + trackResults(channelNr).Q_E.^2)', ... + sqrt(trackResults(channelNr).I_P.^2 + ... + trackResults(channelNr).Q_P.^2)', ... + sqrt(trackResults(channelNr).I_L.^2 + ... + trackResults(channelNr).Q_L.^2)'], ... + '-*'); + + grid (handles(2, 2)); + title (handles(2, 2), 'Correlation results'); + xlabel(handles(2, 2), 'Time (s)'); + axis (handles(2, 2), 'tight'); + + hLegend = legend(handles(2, 2), '$\sqrt{I_{E}^2 + Q_{E}^2}$', ... + '$\sqrt{I_{P}^2 + Q_{P}^2}$', ... + '$\sqrt{I_{L}^2 + Q_{L}^2}$'); + + %set interpreter from tex to latex. This will draw \sqrt correctly + set(hLegend, 'Interpreter', 'Latex'); + + %----- PLL discriminator filtered---------------------------------- + plot (handles(3, 1), timeAxisInSeconds, ... + trackResults(channelNr).pllDiscrFilt(1:settings.msToProcess), 'b'); + + grid (handles(3, 1)); + axis (handles(3, 1), 'tight'); + xlabel(handles(3, 1), 'Time (s)'); + ylabel(handles(3, 1), 'Amplitude'); + title (handles(3, 1), 'Filtered PLL discriminator'); + + %----- DLL discriminator unfiltered-------------------------------- + plot (handles(3, 2), timeAxisInSeconds, ... + trackResults(channelNr).dllDiscr, 'r'); + + grid (handles(3, 2)); + axis (handles(3, 2), 'tight'); + xlabel(handles(3, 2), 'Time (s)'); + ylabel(handles(3, 2), 'Amplitude'); + title (handles(3, 2), 'Raw DLL discriminator'); + + %----- DLL discriminator filtered---------------------------------- + plot (handles(3, 3), timeAxisInSeconds, ... + trackResults(channelNr).dllDiscrFilt, 'b'); + + grid (handles(3, 3)); + axis (handles(3, 3), 'tight'); + xlabel(handles(3, 3), 'Time (s)'); + ylabel(handles(3, 3), 'Amplitude'); + title (handles(3, 3), 'Filtered DLL discriminator'); + + %----- CNo for signal---------------------------------- + plot (handles(4, 1), timeAxisInSeconds, ... + trackResults(channelNr).CNo(1:settings.msToProcess), 'b'); + + grid (handles(4, 1)); + axis (handles(4, 1), 'tight'); + xlabel(handles(4, 1), 'Time (s)'); + ylabel(handles(4, 1), 'CNo (dB-Hz)'); + title (handles(4, 1), 'Carrier to Noise Ratio'); + + %----- Carrier Frequency -------------------------------- + plot (handles(4, 2), timeAxisInSeconds(2:end), ... + trackResults(channelNr).carrFreq(2:settings.msToProcess), 'Color',[0.42 0.25 0.39]); + + grid (handles(4, 2)); + axis (handles(4, 2)); + xlabel(handles(4, 2), 'Time (s)'); + ylabel(handles(4, 2), 'Freq (hz)'); + title (handles(4, 2), 'Carrier Freq'); + + %----- Code Frequency---------------------------------- + %--- Skip sample 0 to help with results display + plot (handles(4, 3), timeAxisInSeconds(2:end), ... + trackResults(channelNr).codeFreq(2:settings.msToProcess), 'Color',[0.2 0.3 0.49]); + + grid (handles(4, 3)); + axis (handles(4, 3), 'tight'); + xlabel(handles(4, 3), 'Time (s)'); + ylabel(handles(4, 3), 'Freq (Hz)'); + title (handles(4, 3), 'Code Freq'); + +end % for channelNr = channelList diff --git a/src/utils/matlab/libs/plotVEMLTracking.m b/src/utils/matlab/libs/plotVEMLTracking.m index 40cab0bb6..bc4e4e806 100644 --- a/src/utils/matlab/libs/plotVEMLTracking.m +++ b/src/utils/matlab/libs/plotVEMLTracking.m @@ -1,162 +1,162 @@ -function plotVEMLTracking(channelList, trackResults, settings) -% This function plots the tracking results for the given channel list. -% -% plotTracking(channelList, trackResults, settings) -% -% Inputs: -% channelList - list of channels to be plotted. -% trackResults - tracking results from the tracking function. -% settings - receiver settings. - -%-------------------------------------------------------------------------- -% SoftGNSS v3.0 -% -% Copyright (C) Darius Plausinaitis -% Written by Darius Plausinaitis -%-------------------------------------------------------------------------- -%This program is free software; you can redistribute it and/or -%modify it under the terms of the GNU General Public License -%as published by the Free Software Foundation; either version 2 -%of the License, or (at your option) any later version. -% -%This program is distributed in the hope that it will be useful, -%but WITHOUT ANY WARRANTY; without even the implied warranty of -%MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -%GNU General Public License for more details. -% -%You should have received a copy of the GNU General Public License -%along with this program; if not, write to the Free Software -%Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, -%USA. -%-------------------------------------------------------------------------- - -% Protection - if the list contains incorrect channel numbers -channelList = intersect(channelList, 1:settings.numberOfChannels); - -%=== For all listed channels ============================================== -for channelNr = channelList - - %% Select (or create) and clear the figure ================================ - % The number 200 is added just for more convenient handling of the open - % figure windows, when many figures are closed and reopened. - % Figures drawn or opened by the user, will not be "overwritten" by - % this function. - - figure(channelNr +200); - clf(channelNr +200); - set(channelNr +200, 'Name', ['Channel ', num2str(channelNr), ... - ' (PRN ', ... - num2str(trackResults(channelNr).PRN(end-1)), ... - ') results']); - - %% Draw axes ============================================================== - % Row 1 - handles(1, 1) = subplot(3, 3, 1); - handles(1, 2) = subplot(3, 3, [2 3]); - % Row 2 - handles(2, 1) = subplot(3, 3, 4); - handles(2, 2) = subplot(3, 3, [5 6]); - % Row 3 - handles(3, 1) = subplot(3, 3, 7); - handles(3, 2) = subplot(3, 3, 8); - handles(3, 3) = subplot(3, 3, 9); - - %% Plot all figures ======================================================= - - timeAxisInSeconds = (1:4:settings.msToProcess)/1000; - - %----- Discrete-Time Scatter Plot --------------------------------- - plot(handles(1, 1), trackResults(channelNr).data_I,... - trackResults(channelNr).data_Q, ... - '.'); - - grid (handles(1, 1)); - axis (handles(1, 1), 'equal'); - title (handles(1, 1), 'Discrete-Time Scatter Plot'); - xlabel(handles(1, 1), 'I prompt'); - ylabel(handles(1, 1), 'Q prompt'); - - %----- Nav bits --------------------------------------------------- - t = (1:length(trackResults(channelNr).data_I)); - plot (handles(1, 2), t, ... - trackResults(channelNr).data_I); - - grid (handles(1, 2)); - title (handles(1, 2), 'Bits of the navigation message'); - xlabel(handles(1, 2), 'Time (s)'); - axis (handles(1, 2), 'tight'); - - %----- PLL discriminator unfiltered-------------------------------- - t = (1:length(trackResults(channelNr).pllDiscr)); - plot (handles(2, 1), t, ... - trackResults(channelNr).pllDiscr, 'r'); - - grid (handles(2, 1)); - axis (handles(2, 1), 'tight'); - xlabel(handles(2, 1), 'Time (s)'); - ylabel(handles(2, 1), 'Amplitude'); - title (handles(2, 1), 'Raw PLL discriminator'); - - %----- Correlation ------------------------------------------------ - t = (1:length(trackResults(channelNr).I_VE)); - plot(handles(2, 2), t, ... - [sqrt(trackResults(channelNr).I_VE.^2 + ... - trackResults(channelNr).Q_VE.^2)', ... - sqrt(trackResults(channelNr).I_E.^2 + ... - trackResults(channelNr).Q_E.^2)', ... - sqrt(trackResults(channelNr).I_P.^2 + ... - trackResults(channelNr).Q_P.^2)', ... - sqrt(trackResults(channelNr).I_L.^2 + ... - trackResults(channelNr).Q_L.^2)', ... - sqrt(trackResults(channelNr).I_VL.^2 + ... - trackResults(channelNr).Q_VL.^2)'], ... - '-*'); - - grid (handles(2, 2)); - title (handles(2, 2), 'Correlation results'); - xlabel(handles(2, 2), 'Time (s)'); - axis (handles(2, 2), 'tight'); - - hLegend = legend(handles(2, 2), '$\sqrt{I_{VE}^2 + Q_{VE}^2}$', ... - '$\sqrt{I_{E}^2 + Q_{E}^2}$', ... - '$\sqrt{I_{P}^2 + Q_{P}^2}$', ... - '$\sqrt{I_{L}^2 + Q_{L}^2}$', ... - '$\sqrt{I_{VL}^2 + Q_{VL}^2}$'); - - %set interpreter from tex to latex. This will draw \sqrt correctly - set(hLegend, 'Interpreter', 'Latex'); - - %----- PLL discriminator filtered---------------------------------- - t = (1:length(trackResults(channelNr).pllDiscrFilt)); - plot (handles(3, 1), t, ... - trackResults(channelNr).pllDiscrFilt, 'b'); - - grid (handles(3, 1)); - axis (handles(3, 1), 'tight'); - xlabel(handles(3, 1), 'Time (s)'); - ylabel(handles(3, 1), 'Amplitude'); - title (handles(3, 1), 'Filtered PLL discriminator'); - - %----- DLL discriminator unfiltered-------------------------------- - t = (1:length(trackResults(channelNr).dllDiscr)); - plot (handles(3, 2), t, ... - trackResults(channelNr).dllDiscr, 'r'); - - grid (handles(3, 2)); - axis (handles(3, 2), 'tight'); - xlabel(handles(3, 2), 'Time (s)'); - ylabel(handles(3, 2), 'Amplitude'); - title (handles(3, 2), 'Raw DLL discriminator'); - - %----- DLL discriminator filtered---------------------------------- - t = (1:length(trackResults(channelNr).dllDiscrFilt)); - plot (handles(3, 3), t, ... - trackResults(channelNr).dllDiscrFilt, 'b'); - - grid (handles(3, 3)); - axis (handles(3, 3), 'tight'); - xlabel(handles(3, 3), 'Time (s)'); - ylabel(handles(3, 3), 'Amplitude'); - title (handles(3, 3), 'Filtered DLL discriminator'); - -end % for channelNr = channelList +function plotVEMLTracking(channelList, trackResults, settings) +% This function plots the tracking results for the given channel list. +% +% plotTracking(channelList, trackResults, settings) +% +% Inputs: +% channelList - list of channels to be plotted. +% trackResults - tracking results from the tracking function. +% settings - receiver settings. + +%-------------------------------------------------------------------------- +% SoftGNSS v3.0 +% +% Copyright (C) Darius Plausinaitis +% Written by Darius Plausinaitis +%-------------------------------------------------------------------------- +%This program is free software; you can redistribute it and/or +%modify it under the terms of the GNU General Public License +%as published by the Free Software Foundation; either version 2 +%of the License, or (at your option) any later version. +% +%This program is distributed in the hope that it will be useful, +%but WITHOUT ANY WARRANTY; without even the implied warranty of +%MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +%GNU General Public License for more details. +% +%You should have received a copy of the GNU General Public License +%along with this program; if not, write to the Free Software +%Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, +%USA. +%-------------------------------------------------------------------------- + +% Protection - if the list contains incorrect channel numbers +channelList = intersect(channelList, 1:settings.numberOfChannels); + +%=== For all listed channels ============================================== +for channelNr = channelList + + %% Select (or create) and clear the figure ================================ + % The number 200 is added just for more convenient handling of the open + % figure windows, when many figures are closed and reopened. + % Figures drawn or opened by the user, will not be "overwritten" by + % this function. + + figure(channelNr +200); + clf(channelNr +200); + set(channelNr +200, 'Name', ['Channel ', num2str(channelNr), ... + ' (PRN ', ... + num2str(trackResults(channelNr).PRN(end-1)), ... + ') results']); + + %% Draw axes ============================================================== + % Row 1 + handles(1, 1) = subplot(3, 3, 1); + handles(1, 2) = subplot(3, 3, [2 3]); + % Row 2 + handles(2, 1) = subplot(3, 3, 4); + handles(2, 2) = subplot(3, 3, [5 6]); + % Row 3 + handles(3, 1) = subplot(3, 3, 7); + handles(3, 2) = subplot(3, 3, 8); + handles(3, 3) = subplot(3, 3, 9); + + %% Plot all figures ======================================================= + + timeAxisInSeconds = (1:4:settings.msToProcess)/1000; + + %----- Discrete-Time Scatter Plot --------------------------------- + plot(handles(1, 1), trackResults(channelNr).data_I,... + trackResults(channelNr).data_Q, ... + '.'); + + grid (handles(1, 1)); + axis (handles(1, 1), 'equal'); + title (handles(1, 1), 'Discrete-Time Scatter Plot'); + xlabel(handles(1, 1), 'I prompt'); + ylabel(handles(1, 1), 'Q prompt'); + + %----- Nav bits --------------------------------------------------- + t = (1:length(trackResults(channelNr).data_I)); + plot (handles(1, 2), t, ... + trackResults(channelNr).data_I); + + grid (handles(1, 2)); + title (handles(1, 2), 'Bits of the navigation message'); + xlabel(handles(1, 2), 'Time (s)'); + axis (handles(1, 2), 'tight'); + + %----- PLL discriminator unfiltered-------------------------------- + t = (1:length(trackResults(channelNr).pllDiscr)); + plot (handles(2, 1), t, ... + trackResults(channelNr).pllDiscr, 'r'); + + grid (handles(2, 1)); + axis (handles(2, 1), 'tight'); + xlabel(handles(2, 1), 'Time (s)'); + ylabel(handles(2, 1), 'Amplitude'); + title (handles(2, 1), 'Raw PLL discriminator'); + + %----- Correlation ------------------------------------------------ + t = (1:length(trackResults(channelNr).I_VE)); + plot(handles(2, 2), t, ... + [sqrt(trackResults(channelNr).I_VE.^2 + ... + trackResults(channelNr).Q_VE.^2)', ... + sqrt(trackResults(channelNr).I_E.^2 + ... + trackResults(channelNr).Q_E.^2)', ... + sqrt(trackResults(channelNr).I_P.^2 + ... + trackResults(channelNr).Q_P.^2)', ... + sqrt(trackResults(channelNr).I_L.^2 + ... + trackResults(channelNr).Q_L.^2)', ... + sqrt(trackResults(channelNr).I_VL.^2 + ... + trackResults(channelNr).Q_VL.^2)'], ... + '-*'); + + grid (handles(2, 2)); + title (handles(2, 2), 'Correlation results'); + xlabel(handles(2, 2), 'Time (s)'); + axis (handles(2, 2), 'tight'); + + hLegend = legend(handles(2, 2), '$\sqrt{I_{VE}^2 + Q_{VE}^2}$', ... + '$\sqrt{I_{E}^2 + Q_{E}^2}$', ... + '$\sqrt{I_{P}^2 + Q_{P}^2}$', ... + '$\sqrt{I_{L}^2 + Q_{L}^2}$', ... + '$\sqrt{I_{VL}^2 + Q_{VL}^2}$'); + + %set interpreter from tex to latex. This will draw \sqrt correctly + set(hLegend, 'Interpreter', 'Latex'); + + %----- PLL discriminator filtered---------------------------------- + t = (1:length(trackResults(channelNr).pllDiscrFilt)); + plot (handles(3, 1), t, ... + trackResults(channelNr).pllDiscrFilt, 'b'); + + grid (handles(3, 1)); + axis (handles(3, 1), 'tight'); + xlabel(handles(3, 1), 'Time (s)'); + ylabel(handles(3, 1), 'Amplitude'); + title (handles(3, 1), 'Filtered PLL discriminator'); + + %----- DLL discriminator unfiltered-------------------------------- + t = (1:length(trackResults(channelNr).dllDiscr)); + plot (handles(3, 2), t, ... + trackResults(channelNr).dllDiscr, 'r'); + + grid (handles(3, 2)); + axis (handles(3, 2), 'tight'); + xlabel(handles(3, 2), 'Time (s)'); + ylabel(handles(3, 2), 'Amplitude'); + title (handles(3, 2), 'Raw DLL discriminator'); + + %----- DLL discriminator filtered---------------------------------- + t = (1:length(trackResults(channelNr).dllDiscrFilt)); + plot (handles(3, 3), t, ... + trackResults(channelNr).dllDiscrFilt, 'b'); + + grid (handles(3, 3)); + axis (handles(3, 3), 'tight'); + xlabel(handles(3, 3), 'Time (s)'); + ylabel(handles(3, 3), 'Amplitude'); + title (handles(3, 3), 'Filtered DLL discriminator'); + +end % for channelNr = channelList diff --git a/src/utils/matlab/plotTrackingE5a.m b/src/utils/matlab/plotTrackingE5a.m index d8966caaf..e63d23162 100644 --- a/src/utils/matlab/plotTrackingE5a.m +++ b/src/utils/matlab/plotTrackingE5a.m @@ -1,150 +1,150 @@ -function plotTracking(channelList, trackResults, settings) -% This function plots the tracking results for the given channel list. -% -% plotTracking(channelList, trackResults, settings) -% -% Inputs: -% channelList - list of channels to be plotted. -% trackResults - tracking results from the tracking function. -% settings - receiver settings. - -%-------------------------------------------------------------------------- -% SoftGNSS v3.0 -% -% Copyright (C) Darius Plausinaitis -% Written by Darius Plausinaitis -%-------------------------------------------------------------------------- -% This program is free software; you can redistribute it and/or -% modify it under the terms of the GNU General Public License -% as published by the Free Software Foundation; either version 2 -% of the License, or (at your option) any later version. -% -% This program is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with this program; if not, write to the Free Software -% Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, -% USA. -%-------------------------------------------------------------------------- - -% Protection - if the list contains incorrect channel numbers -channelList = intersect(channelList, 1:settings.numberOfChannels); - -%=== For all listed channels ============================================== -for channelNr = channelList - - %% Select (or create) and clear the figure ================================ - % The number 200 is added just for more convenient handling of the open - % figure windows, when many figures are closed and reopened. - % Figures drawn or opened by the user, will not be "overwritten" by - % this function. - - figure(channelNr +200); - clf(channelNr +200); - set(channelNr +200, 'Name', ['Channel ', num2str(channelNr), ... - ' (PRN ', ... - num2str(trackResults(channelNr).PRN), ... - ') results']); - - %% Draw axes ============================================================== - % Row 1 - handles(1, 1) = subplot(3, 3, 1); - handles(1, 2) = subplot(3, 3, [2 3]); - % Row 2 - handles(2, 1) = subplot(3, 3, 4); - handles(2, 2) = subplot(3, 3, [5 6]); - % Row 3 - handles(3, 1) = subplot(3, 3, 7); - handles(3, 2) = subplot(3, 3, 8); - handles(3, 3) = subplot(3, 3, 9); - - %% Plot all figures ======================================================= - - timeAxisInSeconds = (1:settings.msToProcess-1)/1000; - - %----- Discrete-Time Scatter Plot --------------------------------- - plot(handles(1, 1), trackResults(channelNr).I_PN,... - trackResults(channelNr).Q_PN, ... - '.'); - - grid (handles(1, 1)); - axis (handles(1, 1), 'equal'); - title (handles(1, 1), 'Discrete-Time Scatter Plot'); - xlabel(handles(1, 1), 'I prompt'); - ylabel(handles(1, 1), 'Q prompt'); - - %----- Nav bits --------------------------------------------------- - plot (handles(1, 2), timeAxisInSeconds, ... - trackResults(channelNr).I_PN(1:settings.msToProcess-1)); - - grid (handles(1, 2)); - title (handles(1, 2), 'Bits of the navigation message'); - xlabel(handles(1, 2), 'Time (s)'); - axis (handles(1, 2), 'tight'); - - %----- PLL discriminator unfiltered-------------------------------- - plot (handles(2, 1), timeAxisInSeconds, ... - trackResults(channelNr).pllDiscr(1:settings.msToProcess-1), 'r'); - - grid (handles(2, 1)); - axis (handles(2, 1), 'tight'); - xlabel(handles(2, 1), 'Time (s)'); - ylabel(handles(2, 1), 'Amplitude'); - title (handles(2, 1), 'Raw PLL discriminator'); - - %----- Correlation ------------------------------------------------ - plot(handles(2, 2), timeAxisInSeconds, ... - [sqrt(trackResults(channelNr).I_E(1:settings.msToProcess-1).^2 + ... - trackResults(channelNr).Q_E(1:settings.msToProcess-1).^2)', ... - sqrt(trackResults(channelNr).I_P(1:settings.msToProcess-1).^2 + ... - trackResults(channelNr).Q_P(1:settings.msToProcess-1).^2)', ... - sqrt(trackResults(channelNr).I_L(1:settings.msToProcess-1).^2 + ... - trackResults(channelNr).Q_L(1:settings.msToProcess-1).^2)'], ... - '-*'); - - grid (handles(2, 2)); - title (handles(2, 2), 'Correlation results'); - xlabel(handles(2, 2), 'Time (s)'); - axis (handles(2, 2), 'tight'); - - hLegend = legend(handles(2, 2), '$\sqrt{I_{E}^2 + Q_{E}^2}$', ... - '$\sqrt{I_{P}^2 + Q_{P}^2}$', ... - '$\sqrt{I_{L}^2 + Q_{L}^2}$'); - - %set interpreter from tex to latex. This will draw \sqrt correctly - set(hLegend, 'Interpreter', 'Latex'); - - %----- PLL discriminator filtered---------------------------------- - plot (handles(3, 1), timeAxisInSeconds, ... - trackResults(channelNr).pllDiscrFilt(1:settings.msToProcess-1), 'b'); - - grid (handles(3, 1)); - axis (handles(3, 1), 'tight'); - xlabel(handles(3, 1), 'Time (s)'); - ylabel(handles(3, 1), 'Amplitude'); - title (handles(3, 1), 'Filtered PLL discriminator'); - - %----- DLL discriminator unfiltered-------------------------------- - plot (handles(3, 2), timeAxisInSeconds, ... - trackResults(channelNr).dllDiscr(1:settings.msToProcess-1), 'r'); - - grid (handles(3, 2)); - axis (handles(3, 2), 'tight'); - xlabel(handles(3, 2), 'Time (s)'); - ylabel(handles(3, 2), 'Amplitude'); - title (handles(3, 2), 'Raw DLL discriminator'); - - %----- DLL discriminator filtered---------------------------------- - plot (handles(3, 3), timeAxisInSeconds, ... - trackResults(channelNr).dllDiscrFilt(1:settings.msToProcess-1), 'b'); - - grid (handles(3, 3)); - axis (handles(3, 3), 'tight'); - xlabel(handles(3, 3), 'Time (s)'); - ylabel(handles(3, 3), 'Amplitude'); - title (handles(3, 3), 'Filtered DLL discriminator'); - -end % for channelNr = channelList +function plotTracking(channelList, trackResults, settings) +% This function plots the tracking results for the given channel list. +% +% plotTracking(channelList, trackResults, settings) +% +% Inputs: +% channelList - list of channels to be plotted. +% trackResults - tracking results from the tracking function. +% settings - receiver settings. + +%-------------------------------------------------------------------------- +% SoftGNSS v3.0 +% +% Copyright (C) Darius Plausinaitis +% Written by Darius Plausinaitis +%-------------------------------------------------------------------------- +% This program is free software; you can redistribute it and/or +% modify it under the terms of the GNU General Public License +% as published by the Free Software Foundation; either version 2 +% of the License, or (at your option) any later version. +% +% This program is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with this program; if not, write to the Free Software +% Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, +% USA. +%-------------------------------------------------------------------------- + +% Protection - if the list contains incorrect channel numbers +channelList = intersect(channelList, 1:settings.numberOfChannels); + +%=== For all listed channels ============================================== +for channelNr = channelList + + %% Select (or create) and clear the figure ================================ + % The number 200 is added just for more convenient handling of the open + % figure windows, when many figures are closed and reopened. + % Figures drawn or opened by the user, will not be "overwritten" by + % this function. + + figure(channelNr +200); + clf(channelNr +200); + set(channelNr +200, 'Name', ['Channel ', num2str(channelNr), ... + ' (PRN ', ... + num2str(trackResults(channelNr).PRN), ... + ') results']); + + %% Draw axes ============================================================== + % Row 1 + handles(1, 1) = subplot(3, 3, 1); + handles(1, 2) = subplot(3, 3, [2 3]); + % Row 2 + handles(2, 1) = subplot(3, 3, 4); + handles(2, 2) = subplot(3, 3, [5 6]); + % Row 3 + handles(3, 1) = subplot(3, 3, 7); + handles(3, 2) = subplot(3, 3, 8); + handles(3, 3) = subplot(3, 3, 9); + + %% Plot all figures ======================================================= + + timeAxisInSeconds = (1:settings.msToProcess-1)/1000; + + %----- Discrete-Time Scatter Plot --------------------------------- + plot(handles(1, 1), trackResults(channelNr).I_PN,... + trackResults(channelNr).Q_PN, ... + '.'); + + grid (handles(1, 1)); + axis (handles(1, 1), 'equal'); + title (handles(1, 1), 'Discrete-Time Scatter Plot'); + xlabel(handles(1, 1), 'I prompt'); + ylabel(handles(1, 1), 'Q prompt'); + + %----- Nav bits --------------------------------------------------- + plot (handles(1, 2), timeAxisInSeconds, ... + trackResults(channelNr).I_PN(1:settings.msToProcess-1)); + + grid (handles(1, 2)); + title (handles(1, 2), 'Bits of the navigation message'); + xlabel(handles(1, 2), 'Time (s)'); + axis (handles(1, 2), 'tight'); + + %----- PLL discriminator unfiltered-------------------------------- + plot (handles(2, 1), timeAxisInSeconds, ... + trackResults(channelNr).pllDiscr(1:settings.msToProcess-1), 'r'); + + grid (handles(2, 1)); + axis (handles(2, 1), 'tight'); + xlabel(handles(2, 1), 'Time (s)'); + ylabel(handles(2, 1), 'Amplitude'); + title (handles(2, 1), 'Raw PLL discriminator'); + + %----- Correlation ------------------------------------------------ + plot(handles(2, 2), timeAxisInSeconds, ... + [sqrt(trackResults(channelNr).I_E(1:settings.msToProcess-1).^2 + ... + trackResults(channelNr).Q_E(1:settings.msToProcess-1).^2)', ... + sqrt(trackResults(channelNr).I_P(1:settings.msToProcess-1).^2 + ... + trackResults(channelNr).Q_P(1:settings.msToProcess-1).^2)', ... + sqrt(trackResults(channelNr).I_L(1:settings.msToProcess-1).^2 + ... + trackResults(channelNr).Q_L(1:settings.msToProcess-1).^2)'], ... + '-*'); + + grid (handles(2, 2)); + title (handles(2, 2), 'Correlation results'); + xlabel(handles(2, 2), 'Time (s)'); + axis (handles(2, 2), 'tight'); + + hLegend = legend(handles(2, 2), '$\sqrt{I_{E}^2 + Q_{E}^2}$', ... + '$\sqrt{I_{P}^2 + Q_{P}^2}$', ... + '$\sqrt{I_{L}^2 + Q_{L}^2}$'); + + %set interpreter from tex to latex. This will draw \sqrt correctly + set(hLegend, 'Interpreter', 'Latex'); + + %----- PLL discriminator filtered---------------------------------- + plot (handles(3, 1), timeAxisInSeconds, ... + trackResults(channelNr).pllDiscrFilt(1:settings.msToProcess-1), 'b'); + + grid (handles(3, 1)); + axis (handles(3, 1), 'tight'); + xlabel(handles(3, 1), 'Time (s)'); + ylabel(handles(3, 1), 'Amplitude'); + title (handles(3, 1), 'Filtered PLL discriminator'); + + %----- DLL discriminator unfiltered-------------------------------- + plot (handles(3, 2), timeAxisInSeconds, ... + trackResults(channelNr).dllDiscr(1:settings.msToProcess-1), 'r'); + + grid (handles(3, 2)); + axis (handles(3, 2), 'tight'); + xlabel(handles(3, 2), 'Time (s)'); + ylabel(handles(3, 2), 'Amplitude'); + title (handles(3, 2), 'Raw DLL discriminator'); + + %----- DLL discriminator filtered---------------------------------- + plot (handles(3, 3), timeAxisInSeconds, ... + trackResults(channelNr).dllDiscrFilt(1:settings.msToProcess-1), 'b'); + + grid (handles(3, 3)); + axis (handles(3, 3), 'tight'); + xlabel(handles(3, 3), 'Time (s)'); + ylabel(handles(3, 3), 'Amplitude'); + title (handles(3, 3), 'Filtered DLL discriminator'); + +end % for channelNr = channelList From 4a52e74b3157391e88c188b4a8c848cf96ff0ef1 Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Fri, 30 Mar 2018 12:13:48 +0200 Subject: [PATCH 57/61] End all files with a new line --- src/utils/matlab/galileo_e5a_dll_pll_plot_sample.m | 2 +- src/utils/matlab/help_script1.m | 2 +- src/utils/matlab/libs/geoFunctions/cart2utm.m | 2 +- src/utils/matlab/libs/geoFunctions/dms2mat.m | 1 - 4 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/utils/matlab/galileo_e5a_dll_pll_plot_sample.m b/src/utils/matlab/galileo_e5a_dll_pll_plot_sample.m index 40660f06a..ad80b985c 100644 --- a/src/utils/matlab/galileo_e5a_dll_pll_plot_sample.m +++ b/src/utils/matlab/galileo_e5a_dll_pll_plot_sample.m @@ -92,4 +92,4 @@ for N=1:1:channels t = t/1000; plot(t, GNSS_tracking(N).carrier_doppler_hz / 1000); xlabel('Time(s)'); ylabel('Doppler(KHz)'); title(['Doppler frequency channel ' num2str(N)]); -end \ No newline at end of file +end diff --git a/src/utils/matlab/help_script1.m b/src/utils/matlab/help_script1.m index 865d43b83..0716950e8 100644 --- a/src/utils/matlab/help_script1.m +++ b/src/utils/matlab/help_script1.m @@ -55,4 +55,4 @@ error_ms=preambles_timestamp_sdr_ms(common_start_index:(common_start_index+lengt % % plot(GNSS_observables.preamble_delay_ms(channel,:)); % -% plot(GNSS_observables.prn_delay_ms(channel,:),'r') \ No newline at end of file +% plot(GNSS_observables.prn_delay_ms(channel,:),'r') diff --git a/src/utils/matlab/libs/geoFunctions/cart2utm.m b/src/utils/matlab/libs/geoFunctions/cart2utm.m index 48da278ea..3a6034230 100644 --- a/src/utils/matlab/libs/geoFunctions/cart2utm.m +++ b/src/utils/matlab/libs/geoFunctions/cart2utm.m @@ -170,4 +170,4 @@ if neg_geo == 'TRUE ' N = -N + 20000000; end; -%%%%%%%%%%%%%%%%%%%% end cart2utm.m %%%%%%%%%%%%%%%%%%%% \ No newline at end of file +%%%%%%%%%%%%%%%%%%%% end cart2utm.m %%%%%%%%%%%%%%%%%%%% diff --git a/src/utils/matlab/libs/geoFunctions/dms2mat.m b/src/utils/matlab/libs/geoFunctions/dms2mat.m index a82b60ccc..a5c449673 100644 --- a/src/utils/matlab/libs/geoFunctions/dms2mat.m +++ b/src/utils/matlab/libs/geoFunctions/dms2mat.m @@ -101,4 +101,3 @@ elseif nargout == 3 else error('Invalid number of output arguments') end - From cbf26e7dd592ff7215546a8246bd39f488ce883b Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Fri, 30 Mar 2018 12:46:21 +0200 Subject: [PATCH 58/61] Make documentation reproducible --- .../libs/volk_gnsssdr_module/volk_gnsssdr/Doxyfile.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/Doxyfile.in b/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/Doxyfile.in index 2c0a87a3c..8fa50f08d 100644 --- a/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/Doxyfile.in +++ b/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/Doxyfile.in @@ -145,7 +145,7 @@ INLINE_INHERITED_MEMB = NO # shortest path that makes the file name unique will be used # The default value is: YES. -FULL_PATH_NAMES = YES +FULL_PATH_NAMES = NO # The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path. # Stripping is only done if one of the specified strings matches the left-hand From 2785a751c1239e07b142599b4df5f10bc7c52b76 Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Mon, 2 Apr 2018 01:36:21 +0200 Subject: [PATCH 59/61] Fix typos) --- CONTRIBUTING.md | 4 +-- README.md | 32 +++++++++---------- ...gnss-sdr_GPS_L1_2ch_fmcomms2_realtime.conf | 2 -- .../volk_gnsssdr/README.md | 4 +-- 4 files changed, 20 insertions(+), 22 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 8af901f52..7a87240cb 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -67,7 +67,7 @@ GitHub](https://github.com/join). GitHub](https://github.com/gnss-sdr/gnss-sdr/fork). This will copy the whole gnss-sdr repository to your personal account. - 3. Then, go to your favourite working folder in your computer and + 3. Then, go to your favorite working folder in your computer and clone your forked repository by typing (replacing ```YOUR_USERNAME``` by the actual username of your GitHub account): @@ -128,7 +128,7 @@ $ git pull --rebase upstream next ### How to submit a pull request -Before submitting you code, please be sure to [apply clang-format](http://gnss-sdr.org/coding-style/#use-tools-for-automated-code-formatting). +Before submitting your code, please be sure to [apply clang-format](http://gnss-sdr.org/coding-style/#use-tools-for-automated-code-formatting). When the contribution is ready, you can [submit a pull request](https://github.com/gnss-sdr/gnss-sdr/compare/). Head to your diff --git a/README.md b/README.md index 3ebdf9c22..270eaf8d5 100644 --- a/README.md +++ b/README.md @@ -304,7 +304,7 @@ $ cmake ../ $ make ~~~~~~ -By default, CMake will build the Release version, meaning that the compiler will generate a fast, optimized executable. This is the recommended build type when using a RF front-end and you need to attain real time. If working with a file (and thus without real-time constraints), you may want to obtain more information about the internals of the receiver, as well as more fine-grained logging. This can be done by building the Debug version, by doing: +By default, CMake will build the Release version, meaning that the compiler will generate a fast, optimized executable. This is the recommended build type when using an RF front-end and you need to attain real time. If working with a file (and thus without real-time constraints), you may want to obtain more information about the internals of the receiver, as well as more fine-grained logging. This can be done by building the Debug version, by doing: ~~~~~~ $ cmake -DCMAKE_BUILD_TYPE=Debug ../ @@ -698,7 +698,7 @@ Getting started We use a [DBSRX2](https://www.ettus.com/product/details/DBSRX2) to do the task, but you can try the newer Ettus' daughter boards as well. 3. The easiest way to capture a signal file is to use the GNU Radio Companion GUI. Only two blocks are needed: a USRP signal source connected to complex float file sink. You need to tune the USRP central frequency and decimation factor using USRP signal source properties box. We suggest using a decimation factor of 20 if you use the USRP2. This will give you 100/20 = 5 MSPS which will be enough to receive GPS L1 C/A signals. The front-end gain should also be configured. In our test with the DBSRX2 we obtained good results with ```G=50```. 4. Capture at least 80 seconds of signal in open sky conditions. During the process, be aware of USRP driver buffer underruns messages. If your hard disk is not fast enough to write data at this speed you can capture to a virtual RAM drive. 80 seconds of signal at 5 MSPS occupies less than 3 Gbytes using ```gr_complex```. - 5. If you have no access to a RF front-end, you can download a sample raw data file (that contains GPS and Galileo signals) from [here](http://sourceforge.net/projects/gnss-sdr/files/data/). + 5. If you have no access to an RF front-end, you can download a sample raw data file (that contains GPS and Galileo signals) from [here](http://sourceforge.net/projects/gnss-sdr/files/data/). 3. You are ready to configure the receiver to use your captured file among other parameters: 1. The default configuration file resides at [/usr/local/share/gnss-sdr/conf/default.conf](./conf/gnss-sdr.conf). 2. You need to review/modify at least the following settings: @@ -718,7 +718,7 @@ For more information, check out our [quick start guide](http://gnss-sdr.org/quic Using GNSS-SDR ============== -With GNSS-SDR, you can define you own receiver, work with captured raw data or from a RF front-end, dump into files intermediate signals, or tune every single algorithm used in the signal processing. All the configuration is done in a single file. Those configuration files reside at the [gnss-sdr/conf/](./conf/) folder (or at /usr/local/share/gnss-sdr/conf if you installed the program). By default, the executable ```gnss-sdr``` will read the configuration available at ```gnss-sdr/conf/gnss-sdr.conf``` (or at (usr/local/share/gnss-sdr/conf/default.conf if you installed the program). You can edit that file to fit your needs, or even better, define a new ```my_receiver.conf``` file with your own configuration. This new receiver can be generated by invoking gnss-sdr with the ```--config_file``` flag pointing to your configuration file: +With GNSS-SDR, you can define your own receiver, work with captured raw data or from an RF front-end, dump into files intermediate signals, or tune every single algorithm used in the signal processing. All the configuration is done in a single file. Those configuration files reside at the [gnss-sdr/conf/](./conf/) folder (or at /usr/local/share/gnss-sdr/conf if you installed the program). By default, the executable ```gnss-sdr``` will read the configuration available at ```gnss-sdr/conf/gnss-sdr.conf``` (or at (usr/local/share/gnss-sdr/conf/default.conf if you installed the program). You can edit that file to fit your needs, or even better, define a new ```my_receiver.conf``` file with your own configuration. This new receiver can be generated by invoking gnss-sdr with the ```--config_file``` flag pointing to your configuration file: ~~~~~~ $ gnss-sdr --config_file=/path/to/my_receiver.conf @@ -770,7 +770,7 @@ Since the configuration is just a set of property names and values without any m ### GNSS block factory -Hence, the application defines a simple accessor class to fetch the configuration pairs of values and passes them to a factory class called [GNSSBlockFactory](./src/core/receiver/gnss_block_factory.h). This factory decides, according to the configuration, which class needs to be instantiated and which parameters should be passed to the constructor. Hence, the factory encapsulates the complexity of blocks' instantiation. With that approach, adding a new block that requires new parameters will be as simple as adding the block class and modifying the factory to be able to instantiate it. This loose coupling between the blocks' implementations and the syntax of the configuration enables extending the application capacities in a high degree. It also allows to produce fully customized receivers, for instance a testbed for acquisition algorithms, and to place observers at any point of the receiver chain. +Hence, the application defines a simple accessor class to fetch the configuration pairs of values and passes them to a factory class called [GNSSBlockFactory](./src/core/receiver/gnss_block_factory.h). This factory decides, according to the configuration, which class needs to be instantiated and which parameters should be passed to the constructor. Hence, the factory encapsulates the complexity of blocks' instantiation. With that approach, adding a new block that requires new parameters will be as simple as adding the block class and modifying the factory to be able to instantiate it. This loose coupling between the blocks' implementations and the syntax of the configuration enables extending the application capacities in a high degree. It also allows producing fully customized receivers, for instance a testbed for acquisition algorithms, and to place observers at any point of the receiver chain. More information can be found at the [Control Plane page](http://gnss-sdr.org/docs/control-plane/). @@ -784,9 +784,9 @@ GNU Radio's class ```gr::basic_block``` is the abstract base class for all signa A signal processing flow is constructed by creating a tree of hierarchical blocks, which at any level may also contain terminal nodes that actually implement signal processing functions. -Class ```gr::top_block``` is the top-level hierarchical block representing a flowgraph. It defines GNU Radio runtime functions used during the execution of the program: run(), start(), stop(), wait(), etc. A a subclass called [GNSSBlockInterface](./src/core/interfaces/gnss_block_interface.h) is the common interface for all the GNSS-SDR modules. It defines pure virtual methods, that are required to be implemented by a derived class. +Class ```gr::top_block``` is the top-level hierarchical block representing a flowgraph. It defines GNU Radio runtime functions used during the execution of the program: run(), start(), stop(), wait(), etc. A subclass called [GNSSBlockInterface](./src/core/interfaces/gnss_block_interface.h) is the common interface for all the GNSS-SDR modules. It defines pure virtual methods, that are required to be implemented by a derived class. -Subclassing GNSSBlockInterface, we defined interfaces for the GNSS receiver blocks depicted in the figure above. This hierarchy provides the definition of different algorithms and different implementations, which will be instantiated according to the configuration. This strategy allows multiple implementations sharing a common interface, achieving the objective of decoupling interfaces from implementations: it defines a family of algorithms, encapsulates each one, and makes them interchangeable. Hence, we let the algorithm vary independently from the program that uses it. +Subclassing GNSSBlockInterface, we defined interfaces for the GNSS receiver blocks depicted in the figure above. This hierarchy provides the definition of different algorithms and different implementations, which will be instantiated according to the configuration. This strategy allows multiple implementations sharing a common interface, achieving the objective of decoupling interfaces from implementations: it defines a family of algorithms, encapsulates each one, and makes them interchangeable. Hence, we let the algorithm vary independently of the program that uses it. Internally, GNSS-SDR makes use of the complex data types defined by [VOLK](http://libvolk.org/ "Vector-Optimized Library of Kernels home"). They are fundamental for handling sample streams in which samples are complex numbers with real and imaginary components of 8, 16 or 32 bits, common formats delivered by GNSS (and generic SDR) radio frequency front-ends. The following list shows the data type names that GNSS-SDR exposes through the configuration file: @@ -806,7 +806,7 @@ More information about the available processing blocks and their configuration p The input of a software receiver are the raw bits that come out from the front-end's analog-to-digital converter (ADC). Those bits can be read from a file stored in the hard disk or directly in real-time from a hardware device through USB or Ethernet buses. -The Signal Source module is in charge of implementing the hardware driver, that is, the portion of the code that communicates with the RF front-end and receives the samples coming from the ADC. This communication is usually performed through USB or Ethernet buses. Since real-time processing requires a highly optimized implementation of the whole receiver, this module also allows to read samples from a file stored in a hard disk, and thus processing without time constraints. Relevant parameters of those samples are the intermediate frequency (or baseband I&Q components), the sampling rate and number of bits per sample, that must be specified by the user in the configuration file. +The Signal Source module is in charge of implementing the hardware driver, that is, the portion of the code that communicates with the RF front-end and receives the samples coming from the ADC. This communication is usually performed through USB or Ethernet buses. Since real-time processing requires a highly optimized implementation of the whole receiver, this module also allows reading samples from a file stored in a hard disk, and thus processing without time constraints. Relevant parameters of those samples are the intermediate frequency (or baseband I&Q components), the sampling rate and number of bits per sample, that must be specified by the user in the configuration file. This module also performs bit-depth adaptation, since most of the existing RF front-ends provide samples quantized with 2 or 3 bits, while operations inside the processor are performed on 32- or 64-bit words, depending on its architecture. Although there are implementations of the most intensive computational processes (mainly correlation) that take advantage of specific data types and architectures for the sake of efficiency, the approach is processor-specific and hardly portable. We suggest to keep signal samples in standard data types and letting the compiler select the best library version (implemented using SIMD or any other processor-specific technology) of the required routines for a given processor. @@ -822,7 +822,7 @@ SignalSource.item_type=gr_complex SignalSource.sampling_frequency=4000000 ; Sampling frequency in samples per second (Sps) ~~~~~~ -Type ```gr_complex``` refers to a GNU Radio typedef equivalent to ```std::complex```. In order to save some storage space, you might wanted to store your signal in a more efficient format such as an I/Q interleaved ```short`` integer sample stream. In that case, change the corresponding line to: +Type ```gr_complex``` refers to a GNU Radio typedef equivalent to ```std::complex```. In order to save some storage space, you might want to store your signal in a more efficient format such as an I/Q interleaved ```short`` integer sample stream. In that case, change the corresponding line to: ~~~~~~ SignalSource.item_type=ishort @@ -846,7 +846,7 @@ Sometimes, samples are stored in files with a format which is not in the list of Within a byte the samples may be packed in big endian ```big_endian_bytes=true``` (if the most significant byte value is stored at the memory location with the lowest address, the next byte value in significance is stored at the following memory location, and so on) or little endian ```big_endian_bytes=false``` (if the least significant byte value is at the lowest address, and the other bytes follow in increasing order of significance). If the order is big endian then the most significant two bits will form the first sample output, otherwise the least significant two bits will be used. -Additionally the samples may be either real ```sample_type=real```, or complex. If the sample type is complex, then the samples are either stored in the order: real, imag, real, imag, ... ```sample_type=iq``` or in the order: imag, real, imag, real, ... ```sample_type=qi```. +Additionally, the samples may be either real ```sample_type=real```, or complex. If the sample type is complex, then the samples are either stored in the order: real, imag, real, imag, ... ```sample_type=iq``` or in the order: imag, real, imag, real, ... ```sample_type=qi```. Finally, if the data is stored as shorts ```item_type=short```, then it may be stored in either big endian ```big_endian_items=true``` or little endian ```big_endian_items=false```. If the shorts are big endian then the 2nd byte in each short is output first. @@ -1008,7 +1008,7 @@ If your signal source is providing baseband signal samples of type ```gr_complex SignalConditioner.implementation=Pass_Through ~~~~~~ -If you need to adapt some aspect of you signal, you can enable the Signal Conditioner and configure three internal blocks: a data type adpater, an input signal and a resampler. +If you need to adapt some aspect of your signal, you can enable the Signal Conditioner and configure three internal blocks: a data type adapter, an input signal and a resampler. ~~~~~~ ;#[Signal_Conditioner] enables this block. Then you have to configure [DataTypeAdapter], [InputFilter] and [Resampler] blocks @@ -1104,7 +1104,7 @@ More documentation at the [Resampler Blocks page](http://gnss-sdr.org/docs/sp-bl ### Channel -A channel encapsulates all signal processing devoted to a single satellite. Thus, it is a large composite object which encapsulates the acquisition, tracking and navigation data decoding modules. As a composite object, it can be treated as a single entity, meaning that it can be easily replicated. Since the number of channels is selectable by the user in the configuration file, this approach helps improving the scalability and maintainability of the receiver. +A channel encapsulates all signal processing devoted to a single satellite. Thus, it is a large composite object which encapsulates the acquisition, tracking and navigation data decoding modules. As a composite object, it can be treated as a single entity, meaning that it can be easily replicated. Since the number of channels is selectable by the user in the configuration file, this approach helps to improve the scalability and maintainability of the receiver. Each channel must be assigned to a GNSS signal, according to the following identifiers: @@ -1146,7 +1146,7 @@ Channel6.signal=1B ; Channel7.signal=1B ; ~~~~~~ -This module is also in charge of managing the interplay between acquisition and tracking. Acquisition can be initialized in several ways, depending on the prior information available (called cold start when the receiver has no information about its position nor the satellites almanac; warm start when a rough location and the approximate time of day are available, and the receiver has a recently recorded almanac broadcast; or hot start when the receiver was tracking a satellite and the signal line of sight broke for a short period of time, but the ephemeris and almanac data is still valid, or this information is provided by other means), and an acquisition process can finish deciding that the satellite is not present, that longer integration is needed in order to confirm the presence of the satellite, or declaring the satellite present. In the latter case, acquisition process should stop and trigger the tracking module with coarse estimations of the synchronization parameters. The mathematical abstraction used to design this logic is known as finite state machine (FSM), that is a behavior model composed of a finite number of states, transitions between those states, and actions. For the implementation, we use the [Boost.Statechart library](http://www.boost.org/libs/statechart/doc/tutorial.html), which provides desirable features such as support for asynchronous state machines, multi-threading, type-safety, error handling and compile-time validation. +This module is also in charge of managing the interplay between acquisition and tracking. Acquisition can be initialized in several ways, depending on the prior information available (called cold start when the receiver has no information about its position nor the satellites' almanac; warm start when a rough location and the approximate time of day are available, and the receiver has a recently recorded almanac broadcast; or hot start when the receiver was tracking a satellite and the signal line of sight broke for a short period of time, but the ephemeris and almanac data is still valid, or this information is provided by other means), and an acquisition process can finish deciding that the satellite is not present, that longer integration is needed in order to confirm the presence of the satellite, or declaring the satellite present. In the latter case, acquisition process should stop and trigger the tracking module with coarse estimations of the synchronization parameters. The mathematical abstraction used to design this logic is known as finite state machine (FSM), that is a behavior model composed of a finite number of states, transitions between those states, and actions. The abstract class [ChannelInterface](./src/core/interfaces/channel_interface.h) represents an interface to a channel GNSS block. Check [Channel](./src/algorithms/channel/adapters/channel.h) for an actual implementation. @@ -1256,7 +1256,7 @@ More documentation at the [Tracking Blocks page](http://gnss-sdr.org/docs/sp-blo #### Decoding of the navigation message -Most of GNSS signal links are modulated by a navigation message containing the time the message was transmitted, orbital parameters of satellites (also known as ephemeris) and an almanac (information about the general system health, rough orbits of all satellites in the network as well as data related to error correction). Navigation data bits are structured in words, pages, subframes, frames and superframes. Sometimes, bits corresponding to a single parameter are spread over different words, and values extracted from different frames are required for proper decoding. Some words are for synchronization purposes, others for error control an others contain actual information. There are also error control mechanisms, from parity checks to forward error correction (FEC) encoding and interleaving, depending on the system. All this decoding complexity is managed by a finite state machine implemented with the [Boost.Statechart library](http://www.boost.org/libs/statechart/doc/tutorial.html). +Most of GNSS signal links are modulated by a navigation message containing the time the message was transmitted, orbital parameters of satellites (also known as ephemeris) and an almanac (information about the general system health, rough orbits of all satellites in the network as well as data related to error correction). Navigation data bits are structured in words, pages, subframes, frames and superframes. Sometimes, bits corresponding to a single parameter are spread over different words, and values extracted from different frames are required for proper decoding. Some words are for synchronization purposes, others for error control and others contain actual information. There are also error control mechanisms, from parity checks to forward error correction (FEC) encoding and interleaving, depending on the system. All this decoding complexity is managed by a finite state machine. The common interface is [TelemetryDecoderInterface](./src/core/interfaces/telemetry_decoder_interface.h). Check [GpsL1CaTelemetryDecoder](./src/algorithms/telemetry_decoder/adapters/gps_l1_ca_telemetry_decoder.h) for an example of the GPS L1 NAV message decoding adapter, and [gps_l1_ca_telemetry_decoder_cc](./src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_cc.h) for an actual implementation of a signal processing block. Configuration example: @@ -1343,7 +1343,7 @@ PVT.rtcm_MT1077_rate_ms=1000 PVT.rinex_version=2 ~~~~~~ -* **RTCM SC-104** provides standards that define the data structure for differential GNSS correction information for a variety of differential correction applications. Developed by the Radio Technical Commission for Maritime Services ([RTCM](http://www.rtcm.org/overview.php#Standards "Radio Technical Commission for Maritime Services")), they have become an industry standard for communication of correction information. GNSS-SDR implements RTCM version 3.2, defined in the document *RTCM 10403.2, Differential GNSS (Global Navigation Satellite Systems) Services - Version 3* (February 1, 2013), which can be [purchased online](https://ssl29.pair.com/dmarkle/puborder.php?show=3 "RTCM Online Publication Order Form"). By default, the generated RTCM binary messages are dumped into a text file in hexadecimal format. However, GNSS-SDR is equipped with a TCP/IP server, acting as an NTRIP source that can feed an NTRIP server. NTRIP (Networked Transport of RTCM via Internet Protocol) is an open standard protocol that can be freely download from [BKG](http://igs.bkg.bund.de/root_ftp/NTRIP/documentation/NtripDocumentation.pdf "Networked Transport of RTCM via Internet Protocol (Ntrip) Version 1.0"), and it is designed for disseminating differential correction data (*e.g.* in the RTCM-104 format) or other kinds of GNSS streaming data to stationary or mobile users over the Internet. The TCP/IP server can be enabled by setting ```PVT.flag_rtcm_server=true``` in the configuration file, and will be active during the execution of the software receiver. By default, the server will operate on port 2101 (which is the recommended port for RTCM services according to the Internet Assigned Numbers Authority, [IANA](http://www.iana.org/assignments/service-names-port-numbers "Service Name and Transport Protocol Port Number Registry")), and will identify the Reference Station with ID=1234. This behaviour can be changed in the configuration file: +* **RTCM SC-104** provides standards that define the data structure for differential GNSS correction information for a variety of differential correction applications. Developed by the Radio Technical Commission for Maritime Services ([RTCM](http://www.rtcm.org/overview.php#Standards "Radio Technical Commission for Maritime Services")), they have become an industry standard for communication of correction information. GNSS-SDR implements RTCM version 3.2, defined in the document *RTCM 10403.2, Differential GNSS (Global Navigation Satellite Systems) Services - Version 3* (February 1, 2013), which can be [purchased online](https://ssl29.pair.com/dmarkle/puborder.php?show=3 "RTCM Online Publication Order Form"). By default, the generated RTCM binary messages are dumped into a text file in hexadecimal format. However, GNSS-SDR is equipped with a TCP/IP server, acting as an NTRIP source that can feed an NTRIP server. NTRIP (Networked Transport of RTCM via Internet Protocol) is an open standard protocol that can be freely downloaded from [BKG](http://igs.bkg.bund.de/root_ftp/NTRIP/documentation/NtripDocumentation.pdf "Networked Transport of RTCM via Internet Protocol (Ntrip) Version 1.0"), and it is designed for disseminating differential correction data (*e.g.* in the RTCM-104 format) or other kinds of GNSS streaming data to stationary or mobile users over the Internet. The TCP/IP server can be enabled by setting ```PVT.flag_rtcm_server=true``` in the configuration file, and will be active during the execution of the software receiver. By default, the server will operate on port 2101 (which is the recommended port for RTCM services according to the Internet Assigned Numbers Authority, [IANA](http://www.iana.org/assignments/service-names-port-numbers "Service Name and Transport Protocol Port Number Registry")), and will identify the Reference Station with ID=1234. This behaviour can be changed in the configuration file: ~~~~~~ PVT.flag_rtcm_server=true PVT.rtcm_tcp_port=2102 @@ -1400,9 +1400,9 @@ There is a list of papers related to GNSS-SDR in our [publications page](http:// Ok, now what? ============= -In order to start using GNSS-SDR, you may want to populate ```gnss-sdr/data``` folder (or anywhere else on your system) with raw data files. By "raw data" we mean the output of a Radio Frequency front-end's Analog-to-Digital converter. GNSS-SDR needs signal samples already in baseband or in passband, at a suitable intemediate frequency (on the order of MHz). Prepare your configuration file, and then you are ready for running ```gnss-sdr --config_file=your_configuration.conf```, and seeing how the file is processed. +In order to start using GNSS-SDR, you may want to populate ```gnss-sdr/data``` folder (or anywhere else on your system) with raw data files. By "raw data" we mean the output of a Radio Frequency front-end's Analog-to-Digital converter. GNSS-SDR needs signal samples already in baseband or in passband, at a suitable intermediate frequency (on the order of MHz). Prepare your configuration file, and then you are ready for running ```gnss-sdr --config_file=your_configuration.conf```, and seeing how the file is processed. -Another interesting option is working in real-time with a RF front-end. We provide drivers for UHD-compatible hardware such as the [USRP family](http://www.ettus.com/product), for OsmoSDR and other front-ends (HackRF, bladeRF, LimeSDR), for the GN3S v2 USB dongle and for some DVB-T USB dongles. Start with a low number of channels and then increase it in order to test how many channels your processor can handle in real-time. +Another interesting option is working in real-time with an RF front-end. We provide drivers for UHD-compatible hardware such as the [USRP family](http://www.ettus.com/product), for OsmoSDR and other front-ends (HackRF, bladeRF, LimeSDR), for the GN3S v2 USB dongle and for some DVB-T USB dongles. Start with a low number of channels and then increase it in order to test how many channels your processor can handle in real-time. You can find more information at the [GNSS-SDR Documentation page](http://gnss-sdr.org/docs/) or directly asking to the [GNSS-SDR Developers mailing list](http://lists.sourceforge.net/lists/listinfo/gnss-sdr-developers). diff --git a/conf/gnss-sdr_GPS_L1_2ch_fmcomms2_realtime.conf b/conf/gnss-sdr_GPS_L1_2ch_fmcomms2_realtime.conf index 80814ad1d..79a57f712 100644 --- a/conf/gnss-sdr_GPS_L1_2ch_fmcomms2_realtime.conf +++ b/conf/gnss-sdr_GPS_L1_2ch_fmcomms2_realtime.conf @@ -6,8 +6,6 @@ ;######### GLOBAL OPTIONS ################## ;internal_fs_sps: Internal signal sampling frequency after the signal conditioning stage [Sps]. -;FOR USE GNSS-SDR WITH RTLSDR DONGLES USER MUST SET THE CALIBRATED SAMPLE RATE HERE -; i.e. using front-end-cal as reported here:http://www.cttc.es/publication/turning-a-television-into-a-gnss-receiver/ GNSS-SDR.internal_fs_sps=7000000 ;######### SIGNAL_SOURCE CONFIG ############ diff --git a/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/README.md b/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/README.md index ac23478a0..3b5e14513 100644 --- a/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/README.md +++ b/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/README.md @@ -7,7 +7,7 @@ and contact information about the original VOLK library. The boilerplate of this code was initially generated with ```volk_modtool```, an application provided by VOLK that creates the -skeleton than can then be filled with custom kernels. Some modifications +skeleton that can then be filled with custom kernels. Some modifications were added to accommodate the specificities of Global Navigation Satellite Systems (GNSS) signal processing. Those changes are clearly indicated in the source code, and do not break compatibility. @@ -39,7 +39,7 @@ This library is automatically built and installed along with GNSS-SDR if it is not found by CMake on your system at configure time. However, you can install and use VOLK_GNSSSDR kernels as you use VOLK's, -independently from GNSS-SDR. +independently of GNSS-SDR. First, make sure that the required dependencies are installed in your machine: From 843679f0eddaf88ab5cb29cc96f60254a83452f6 Mon Sep 17 00:00:00 2001 From: Antonio Ramos Date: Tue, 3 Apr 2018 11:42:11 +0200 Subject: [PATCH 60/61] Report days, hours, mins and secs instead of secs --- .../libs/gnss_sdr_sample_counter.cc | 69 +++++++++++++++---- src/algorithms/libs/gnss_sdr_sample_counter.h | 11 ++- .../adapters/gps_l1_ca_dll_pll_tracking.cc | 36 ++++------ 3 files changed, 77 insertions(+), 39 deletions(-) diff --git a/src/algorithms/libs/gnss_sdr_sample_counter.cc b/src/algorithms/libs/gnss_sdr_sample_counter.cc index 9db529625..197e5725a 100644 --- a/src/algorithms/libs/gnss_sdr_sample_counter.cc +++ b/src/algorithms/libs/gnss_sdr_sample_counter.cc @@ -34,15 +34,22 @@ #include gnss_sdr_sample_counter::gnss_sdr_sample_counter(double _fs) : gr::sync_decimator("sample_counter", - gr::io_signature::make(1, 1, sizeof(gr_complex)), - gr::io_signature::make(1, 1, sizeof(Gnss_Synchro)), - static_cast(floor(_fs * 0.001))) + gr::io_signature::make(1, 1, sizeof(gr_complex)), + gr::io_signature::make(1, 1, sizeof(Gnss_Synchro)), + static_cast(floor(_fs * 0.001))) { message_port_register_out(pmt::mp("sample_counter")); set_max_noutput_items(1); current_T_rx_ms = 0; - report_interval_ms = 1000;//default reporting 1 second - flag_enable_send_msg = false; //enable it for reporting time with asynchronous message + current_s = 0; + current_m = 0; + current_h = 0; + current_days = 0; + report_interval_ms = 1000; //default reporting 1 second + flag_enable_send_msg = false; //enable it for reporting time with asynchronous message + flag_m = false; + flag_h = false; + flag_days = false; } @@ -54,19 +61,55 @@ gnss_sdr_sample_counter_sptr gnss_sdr_make_sample_counter(double _fs) int gnss_sdr_sample_counter::work(int noutput_items __attribute__((unused)), - gr_vector_const_void_star &input_items __attribute__((unused)), - gr_vector_void_star &output_items) + gr_vector_const_void_star &input_items __attribute__((unused)), + gr_vector_void_star &output_items) { - Gnss_Synchro* out = reinterpret_cast(output_items[0]); + Gnss_Synchro *out = reinterpret_cast(output_items[0]); out[0] = Gnss_Synchro(); if ((current_T_rx_ms % report_interval_ms) == 0) - { - std::cout << "Current receiver time: " << static_cast(current_T_rx_ms) / 1000.0 << " [s]" << std::endl; - if(flag_enable_send_msg) { - message_port_pub(pmt::mp("receiver_time"), pmt::from_double(static_cast(current_T_rx_ms) / 1000.0)); + current_s++; + if ((current_s % 60) == 0) + { + current_s = 0; + current_m++; + flag_m = true; + if ((current_m % 60) == 0) + { + current_m = 0; + current_h++; + flag_h = true; + if ((current_h % 24) == 0) + { + current_h = 0; + current_days++; + flag_days = true; + } + } + } + + if (flag_days) + { + std::cout << "Current receiver time: " << current_days << " [days] " << current_h << " [h] " << current_m << " [min] " << current_s << " [s]" << std::endl; + } + else if (flag_h) + { + std::cout << "Current receiver time: " << current_h << " [h] " << current_m << " [min] " << current_s << " [s]" << std::endl; + } + else if (flag_m) + { + std::cout << "Current receiver time: " << current_m << " [min] " << current_s << " [s]" << std::endl; + } + else + { + std::cout << "Current receiver time: " << current_s << " [s]" << std::endl; + } + + if (flag_enable_send_msg) + { + message_port_pub(pmt::mp("receiver_time"), pmt::from_double(static_cast(current_T_rx_ms) / 1000.0)); + } } - } current_T_rx_ms++; return 1; } diff --git a/src/algorithms/libs/gnss_sdr_sample_counter.h b/src/algorithms/libs/gnss_sdr_sample_counter.h index 501b57057..74a525eb4 100644 --- a/src/algorithms/libs/gnss_sdr_sample_counter.h +++ b/src/algorithms/libs/gnss_sdr_sample_counter.h @@ -44,14 +44,19 @@ gnss_sdr_sample_counter_sptr gnss_sdr_make_sample_counter(double _fs); class gnss_sdr_sample_counter : public gr::sync_decimator { private: - gnss_sdr_sample_counter(double _fs); - long long int current_T_rx_ms; + long long int current_T_rx_ms; // Receiver time in ms since the beggining of the run + unsigned int current_s; // Receiver time in seconds, modulo 60 + bool flag_m; // True if the receiver has been running for at least 1 minute + unsigned int current_m; // Receiver time in minutes, modulo 60 + bool flag_h; // True if the receiver has been running for at least 1 hour + unsigned int current_h; // Receiver time in hours, modulo 24 + bool flag_days; // True if the receiver has been running for at least 1 day + unsigned int current_days; // Receiver time in days since the beggining of the run int report_interval_ms; bool flag_enable_send_msg; public: - friend gnss_sdr_sample_counter_sptr gnss_sdr_make_sample_counter(double _fs); int work(int noutput_items, gr_vector_const_void_star &input_items, diff --git a/src/algorithms/tracking/adapters/gps_l1_ca_dll_pll_tracking.cc b/src/algorithms/tracking/adapters/gps_l1_ca_dll_pll_tracking.cc index f7dc4cdb2..6674422c6 100644 --- a/src/algorithms/tracking/adapters/gps_l1_ca_dll_pll_tracking.cc +++ b/src/algorithms/tracking/adapters/gps_l1_ca_dll_pll_tracking.cc @@ -90,29 +90,19 @@ GpsL1CaDllPllTracking::GpsL1CaDllPllTracking( //################# MAKE TRACKING GNURadio object ################### if (item_type.compare("gr_complex") == 0) { - if (unified_) - { - char sig_[3] = "1C"; - item_size_ = sizeof(gr_complex); - tracking_unified_ = dll_pll_veml_make_tracking( - fs_in, vector_length, dump, - dump_filename, pll_bw_hz, dll_bw_hz, - pll_bw_narrow_hz, dll_bw_narrow_hz, - early_late_space_chips, - early_late_space_chips, - early_late_space_narrow_chips, - early_late_space_narrow_chips, - symbols_extended_correlator, - false, - 'G', sig_); - } - else - { - tracking_ = gps_l1_ca_dll_pll_make_tracking_cc( - 0, fs_in, vector_length, dump, - dump_filename, pll_bw_hz, dll_bw_hz, - early_late_space_chips); - } + char sig_[3] = "1C"; + item_size_ = sizeof(gr_complex); + tracking_ = dll_pll_veml_make_tracking( + fs_in, vector_length, dump, + dump_filename, pll_bw_hz, dll_bw_hz, + pll_bw_narrow_hz, dll_bw_narrow_hz, + early_late_space_chips, + early_late_space_chips, + early_late_space_narrow_chips, + early_late_space_narrow_chips, + symbols_extended_correlator, + false, + 'G', sig_); } else { From a421d2fc5adb4de1fa28ac1155f9a443f6c3f361 Mon Sep 17 00:00:00 2001 From: Antonio Ramos Date: Tue, 3 Apr 2018 12:45:03 +0200 Subject: [PATCH 61/61] Minor change --- src/algorithms/PVT/libs/rtklib_solver.cc | 7 +++---- src/algorithms/libs/rtklib/rtklib_pntpos.cc | 18 ++++++++++++------ src/core/system_parameters/rtcm.h | 2 -- 3 files changed, 15 insertions(+), 12 deletions(-) diff --git a/src/algorithms/PVT/libs/rtklib_solver.cc b/src/algorithms/PVT/libs/rtklib_solver.cc index c76ed3260..4dcee81a0 100644 --- a/src/algorithms/PVT/libs/rtklib_solver.cc +++ b/src/algorithms/PVT/libs/rtklib_solver.cc @@ -241,6 +241,7 @@ bool rtklib_solver::get_PVT(const std::map& gnss_observables_ gps_ephemeris_iter = gps_ephemeris_map.find(gnss_observables_iter->second.PRN); if (gps_ephemeris_iter != gps_ephemeris_map.cend()) { + /* By the moment, GPS L2 observables are not used in pseudorange computations if GPS L1 is available // 2. If found, replace the existing GPS L1 ephemeris with the GPS L2 ephemeris // (more precise!), and attach the L2 observation to the L1 observation in RTKLIB structure for (int i = 0; i < valid_obs; i++) @@ -248,18 +249,17 @@ bool rtklib_solver::get_PVT(const std::map& gnss_observables_ if (eph_data[i].sat == static_cast(gnss_observables_iter->second.PRN)) { eph_data[i] = eph_to_rtklib(gps_cnav_ephemeris_iter->second); - /* By the moment, GPS L2 observables are not used in pseudorange computations obs_data[i + glo_valid_obs] = insert_obs_to_rtklib(obs_data[i + glo_valid_obs], gnss_observables_iter->second, eph_data[i].week, - 1); //Band 2 (L2) */ + 1); //Band 2 (L2) break; } } + */ } else { - /* By the moment, GPS L2 observables are not used in pseudorange computations // 3. If not found, insert the GPS L2 ephemeris and the observation //convert ephemeris from GNSS-SDR class to RTKLIB structure eph_data[valid_obs] = eph_to_rtklib(gps_cnav_ephemeris_iter->second); @@ -273,7 +273,6 @@ bool rtklib_solver::get_PVT(const std::map& gnss_observables_ gps_cnav_ephemeris_iter->second.i_GPS_week, 1); //Band 2 (L2) valid_obs++; - */ } } else // the ephemeris are not available for this SV diff --git a/src/algorithms/libs/rtklib/rtklib_pntpos.cc b/src/algorithms/libs/rtklib/rtklib_pntpos.cc index 07e7a5c73..31b60c8e6 100644 --- a/src/algorithms/libs/rtklib/rtklib_pntpos.cc +++ b/src/algorithms/libs/rtklib/rtklib_pntpos.cc @@ -191,7 +191,7 @@ double prange(const obsd_t *obs, const nav_t *nav, const double *azel, } } /* fL1^2 / fL2(orL5)^2 . See IS-GPS-200, p. 103 and Galileo ICD p. 48 */ - if (sys == SYS_GPS or sys == SYS_GAL) + if (sys == SYS_GPS or sys == SYS_GAL or sys == SYS_GLO) { gamma_ = std::pow(lam[j], 2.0) / std::pow(lam[i], 2.0); } @@ -263,9 +263,10 @@ double prange(const obsd_t *obs, const nav_t *nav, const double *azel, PC = P2 + P1_P2 - ISCl5i; } } - else if (sys == SYS_GAL) // Gal. E5a single freq. + else if (sys == SYS_GAL or sys == SYS_GLO) // Gal. E5a single freq. { - //TODO + P2 += P2_C2; /* C2->P2 */ + PC = P2 - gamma_ * P1_P2 / (1.0 - gamma_); } } /* dual-frequency */ @@ -280,12 +281,17 @@ double prange(const obsd_t *obs, const nav_t *nav, const double *azel, } else if (obs->code[j] == CODE_L5X) /* L1 + L5 */ { - //TODO + //By the moment, GPS L5 pseudoranges are not used + //PC = (P2 + ISCl5i - gamma_ * (P1 + ISCl5i)) / (1.0 - gamma_) - P1_P2; + P1 += P1_C1; /* C1->P1 */ + PC = P1 + P1_P2; } } - else if (sys == SYS_GAL) /* E1 + E5a */ + else if (sys == SYS_GAL or sys == SYS_GLO) /* E1 + E5a */ { - //TODO + P1 += P1_C1; + P2 += P2_C2; + PC = (gamma_ * P1 - P2) / (gamma_ - 1.0); } } if (opt->sateph == EPHOPT_SBAS) diff --git a/src/core/system_parameters/rtcm.h b/src/core/system_parameters/rtcm.h index 591659c6f..1a14cc988 100644 --- a/src/core/system_parameters/rtcm.h +++ b/src/core/system_parameters/rtcm.h @@ -671,7 +671,6 @@ private: } else if (!ec and !read_msg_.decode_header()) { - /* TODO: The commented code throws an exception. Solve it! client_says += read_msg_.data(); bool first = true; while (client_says.length() >= 80) @@ -684,7 +683,6 @@ private: std::cout << client_says.substr(0, 80) << std::endl; client_says = client_says.substr(80, client_says.length() - 80); } - */ do_read_message_header(); } else