From c8c8146a5e49f957ed6ce4e1bed997ad887c269a Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Mon, 26 Nov 2018 11:50:12 +0100 Subject: [PATCH 01/10] Find uncompress program in more environments --- src/utils/rinex2assist/CMakeLists.txt | 12 +++++++++ src/utils/rinex2assist/main.cc | 37 +++++++++++++++++++-------- 2 files changed, 38 insertions(+), 11 deletions(-) diff --git a/src/utils/rinex2assist/CMakeLists.txt b/src/utils/rinex2assist/CMakeLists.txt index 7532e25d6..344c0694b 100644 --- a/src/utils/rinex2assist/CMakeLists.txt +++ b/src/utils/rinex2assist/CMakeLists.txt @@ -28,6 +28,18 @@ set(CMAKE_INCLUDE_PATH ${CMAKE_INCLUDE_PATH} ${GPSTK_INCLUDE_DIR}/gpstk) find_package(Boost COMPONENTS iostreams serialization QUIET) +find_program(UNCOMPRESS_EXECUTABLE uncompress + PATHS /bin + /usr/bin + /usr/sbin +) + +if(NOT UNCOMPRESS_EXECUTABLE-NOTFOUND) + add_definitions(-DUNCOMPRESS_EXECUTABLE="${UNCOMPRESS_EXECUTABLE}") +else() + add_definitions(-DUNCOMPRESS_EXECUTABLE="") +endif() + if(Boost_FOUND) include_directories( ${CMAKE_SOURCE_DIR}/src/core/system_parameters diff --git a/src/utils/rinex2assist/main.cc b/src/utils/rinex2assist/main.cc index ad6dc2eb5..66ccb2e45 100644 --- a/src/utils/rinex2assist/main.cc +++ b/src/utils/rinex2assist/main.cc @@ -76,6 +76,7 @@ int main(int argc, char** argv) // Uncompress if RINEX file is gzipped std::string rinex_filename(argv[1]); + std::string input_filename = rinex_filename; std::size_t found = rinex_filename.find_last_of("."); if (found != std::string::npos) { @@ -99,9 +100,14 @@ int main(int argc, char** argv) } in.push(file); std::string rinex_filename_unzipped = rinex_filename.substr(0, found); - std::ofstream output_file(rinex_filename_unzipped.c_str(), std::ios_base::out | std::ios_base::binary); + std::ofstream output_file(rinex_filename_unzipped.c_str(), std::ios_base::out | std::ios_base::binary | std::ios_base::trunc); + if (file.fail()) + { + std::cerr << "Could not create file " << rinex_filename_unzipped << std::endl; + return 1; + } boost::iostreams::copy(in, output_file); - rinex_filename = rinex_filename_unzipped; + input_filename = rinex_filename_unzipped; } if ((rinex_filename.substr(found + 1, found + 2).compare("Z") == 0)) { @@ -112,14 +118,23 @@ int main(int argc, char** argv) return 1; } file.close(); - // option k is not always available, so we save a copy of the original file - std::string argum = std::string("/bin/cp " + rinex_filename + " " + rinex_filename + ".aux"); - std::system(argum.c_str()); - std::string argum2 = std::string("/usr/bin/uncompress -f " + rinex_filename); - std::system(argum2.c_str()); - std::string argum3 = std::string("/bin/mv " + rinex_filename + +".aux" + " " + rinex_filename); - std::system(argum3.c_str()); - rinex_filename = rinex_filename.substr(0, found); + std::string uncompress_executable(UNCOMPRESS_EXECUTABLE); + if (!uncompress_executable.empty()) + { + // option k is not always available, so we save a copy of the original file + std::string argum = std::string("/bin/cp " + rinex_filename + " " + rinex_filename + ".aux"); + std::system(argum.c_str()); + std::string argum2 = std::string(uncompress_executable + " -f " + rinex_filename); + std::system(argum2.c_str()); + std::string argum3 = std::string("/bin/mv " + rinex_filename + +".aux" + " " + rinex_filename); + std::system(argum3.c_str()); + input_filename = rinex_filename.substr(0, found); + } + else + { + std::cerr << "uncompress program not found." << std::endl; + return 1; + } } } @@ -136,7 +151,7 @@ int main(int argc, char** argv) try { // Read nav file - gpstk::Rinex3NavStream rnffs(rinex_filename.c_str()); // Open navigation data file + gpstk::Rinex3NavStream rnffs(input_filename.c_str()); // Open navigation data file gpstk::Rinex3NavData rne; gpstk::Rinex3NavHeader hdr; From e71cbc9f244b4ef7f52314191235a7788cd53390 Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Mon, 26 Nov 2018 12:04:34 +0100 Subject: [PATCH 02/10] Fix warning --- src/utils/rinex2assist/main.cc | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/utils/rinex2assist/main.cc b/src/utils/rinex2assist/main.cc index 66ccb2e45..2ec31e1dd 100644 --- a/src/utils/rinex2assist/main.cc +++ b/src/utils/rinex2assist/main.cc @@ -123,12 +123,17 @@ int main(int argc, char** argv) { // option k is not always available, so we save a copy of the original file std::string argum = std::string("/bin/cp " + rinex_filename + " " + rinex_filename + ".aux"); - std::system(argum.c_str()); + int s1 = std::system(argum.c_str()); std::string argum2 = std::string(uncompress_executable + " -f " + rinex_filename); - std::system(argum2.c_str()); + int s2 = std::system(argum2.c_str()); std::string argum3 = std::string("/bin/mv " + rinex_filename + +".aux" + " " + rinex_filename); - std::system(argum3.c_str()); + int s3 = std::system(argum3.c_str()); input_filename = rinex_filename.substr(0, found); + if ((s1 != 0) or (s2 != 0) or (s3 != 0)) + { + std::cerr << "Failure uncompressing file." << std::endl; + return 1; + } } else { From 6fc09273859943f82f960e4b9d1d79b66f738924 Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Mon, 26 Nov 2018 15:03:12 +0100 Subject: [PATCH 03/10] Fix reading of Galileo ephemeris --- src/utils/rinex2assist/main.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/src/utils/rinex2assist/main.cc b/src/utils/rinex2assist/main.cc index 2ec31e1dd..31fcd3ebb 100644 --- a/src/utils/rinex2assist/main.cc +++ b/src/utils/rinex2assist/main.cc @@ -291,6 +291,7 @@ int main(int argc, char** argv) eph.af0_4 = rne.af0; eph.af1_4 = rne.af1; eph.af2_4 = rne.af2; + eph.WN_5 = rne.weeknum; eph_gal_map[j] = eph; j++; } From ed3396905fb007d94c38e2256ec7915755e9f6ae Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Mon, 26 Nov 2018 20:01:25 +0100 Subject: [PATCH 04/10] Improve documentation --- src/utils/rinex2assist/README.md | 32 ++++++++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/src/utils/rinex2assist/README.md b/src/utils/rinex2assist/README.md index e3f3594e2..6ed346cdb 100644 --- a/src/utils/rinex2assist/README.md +++ b/src/utils/rinex2assist/README.md @@ -1,7 +1,35 @@ Rinex2assist ------------ -This program reads data from RINEX navigation files and generates XML files that can be read by GNSS-SDR as Assisted GNSS data. The usage is as follows: +This program reads data from RINEX navigation files and generates XML files that can be read by GNSS-SDR as Assisted GNSS data. + +### Building + +This program is built along with GNSS-SDR if the options `ENABLE_UNIT_TESTING_EXTRA` or `ENABLE_SYSTEM_TESTING_EXTRA` are set to `ON` when calling CMake: + +``` +$ cmake -DENABLE_SYSTEM_TESTING_EXTRA=ON .. +$ make +$ sudo make intall +``` + +The last step is optional. Without it, you will get the executable at `../install/rinex2assist`. + +The building requires two extra dependencies: the Boost Iostreams library and the program `uncompress`: + + * The Boost Iostreams library can be installed through a package: + - In Debian / Ubuntu: `sudo apt-get install libboost-iostreams-dev` + - In Fedora / CentOS: `sudo yum install boost-iostreams` + - In OpenSUSE: `sudo zypper install libboost_iostreams-devel` + - In Arch Linux: included in `boost-libs` package. + - In MacOS: included in Macports / Homebrew `boost` package. + * The program `uncompress` is available by default in most UNIX and GNU/Linux systems. + - In Fedora / CentOS: `sudo yum install ncompress` + - In OpenSUSE: `sudo zypper install ncompress` + +### Usage + +The usage is as follows: ``` $ rinex2assist /path/to/RINEX_nav_file @@ -9,7 +37,7 @@ $ rinex2assist /path/to/RINEX_nav_file The argument is mandatory (the name of the RINEX navigation file). The name `gps_ephemeris.xml` is given to the output if GPS NAV data is fould. If the RINEX file contains Galileo data, the corresponding `gal_ephemeris.xml` file will be generated. The program is also able to extract parameters of the UTC and the Ionospheric models from the RINEX header, if available. They will be called `gps_utc_model.xml`, `gps_iono.xml`, `gal_utc_model.xml` and `gal_iono.xml`. -There are some servers available for downloading RINEX navigation files. For instance: +There are some servers available for downloading recent RINEX navigation files. For instance: * NASA: [ftp://cddis.gsfc.nasa.gov/pub/gnss/data/hourly/](ftp://gssc.esa.int/gnss/data/hourly/) * ESA: [ftp://gssc.esa.int/gnss/data/hourly/](ftp://gssc.esa.int/gnss/data/hourly/) From 880c6715c113b3e0c990abb82587de3e6045bc76 Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Mon, 26 Nov 2018 21:00:47 +0100 Subject: [PATCH 05/10] Reorder XML file and remove duplicated parameter --- src/core/system_parameters/galileo_ephemeris.h | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/core/system_parameters/galileo_ephemeris.h b/src/core/system_parameters/galileo_ephemeris.h index d2555790c..fd844adf2 100644 --- a/src/core/system_parameters/galileo_ephemeris.h +++ b/src/core/system_parameters/galileo_ephemeris.h @@ -123,10 +123,7 @@ public: { }; - archive& BOOST_SERIALIZATION_NVP(flag_all_ephemeris); - archive& BOOST_SERIALIZATION_NVP(IOD_ephemeris); - archive& BOOST_SERIALIZATION_NVP(IOD_nav_1); - archive& BOOST_SERIALIZATION_NVP(SV_ID_PRN_4); + archive& BOOST_SERIALIZATION_NVP(i_satellite_PRN); archive& BOOST_SERIALIZATION_NVP(M0_1); archive& BOOST_SERIALIZATION_NVP(delta_n_3); @@ -155,6 +152,10 @@ public: archive& BOOST_SERIALIZATION_NVP(Galileo_satClkDrift); archive& BOOST_SERIALIZATION_NVP(Galileo_dtr); + archive& BOOST_SERIALIZATION_NVP(flag_all_ephemeris); + archive& BOOST_SERIALIZATION_NVP(IOD_ephemeris); + archive& BOOST_SERIALIZATION_NVP(IOD_nav_1); + archive& BOOST_SERIALIZATION_NVP(SISA_3); archive& BOOST_SERIALIZATION_NVP(E5a_HS); archive& BOOST_SERIALIZATION_NVP(E5b_HS_5); @@ -165,8 +166,6 @@ public: archive& BOOST_SERIALIZATION_NVP(BGD_E1E5a_5); archive& BOOST_SERIALIZATION_NVP(BGD_E1E5b_5); - - archive& BOOST_SERIALIZATION_NVP(i_satellite_PRN); } }; From f416a06304452258857fa15a09fed2b8c6397958 Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Mon, 26 Nov 2018 21:18:45 +0100 Subject: [PATCH 06/10] Update Galileo ephemeris schema --- docs/xml-schemas/gal_ephemeris_map.xsd | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/docs/xml-schemas/gal_ephemeris_map.xsd b/docs/xml-schemas/gal_ephemeris_map.xsd index 06c541af5..bf6c5ea20 100644 --- a/docs/xml-schemas/gal_ephemeris_map.xsd +++ b/docs/xml-schemas/gal_ephemeris_map.xsd @@ -1,4 +1,4 @@ - +< @@ -16,6 +16,7 @@ + @@ -34,6 +35,22 @@ + + + + + + + + + + + + + + + + From 2c6e3e621dfc48fb4437c341b4755d261ba6af99 Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Mon, 26 Nov 2018 22:13:33 +0100 Subject: [PATCH 07/10] Update changelog --- docs/changelog | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/docs/changelog b/docs/changelog index dece16401..96dcc4b6a 100644 --- a/docs/changelog +++ b/docs/changelog @@ -16,6 +16,7 @@ Next release will have several improvements in different dimensions, addition of - Redesign of the time counter for enhanced continuity. - Improved flow graph in multisystem configurations: the receiver does not get stalled anymore if no signal is found from the first system. - Improved acquisition and tracking sensitivity. +- Added mechanisms for Assisted GNSS, thus shortening the Time-To-First-Fix. Provision of data via XML files or via SUPL v1.0. Documented at https://gnss-sdr.org/docs/sp-blocks/global-parameters/ - Other minor bug fixes. @@ -27,6 +28,7 @@ Next release will have several improvements in different dimensions, addition of - New volk_gnsssdr kernels: volk_gnsssdr_16i_xn_resampler_16i_xn.h, volk_gnsssdr_16ic_16i_rotator_dot_prod_16ic_xn.h, volk_gnsssdr_32f_xn_resampler_32f_xn.h, volk_gnsssdr_32fc_32f_rotator_dot_prod_32fc_xn.h - Some AVX2 implementations added to the volk_gnsssdr library. - Improvement in C++ usage: Use of const container calls when result is immediately converted to a const iterator. Using these members removes an implicit conversion from iterator to const_iterator. +- Output printers can be shut down, with some savings in memory and storage requirements. - A number of code optimizations here and there. @@ -34,7 +36,8 @@ Next release will have several improvements in different dimensions, addition of - A number of new parameters have been exposed to the configuration system. - Possibility to choose Pilot or Data component for tracking of GPS L5 and Galileo E5a signals. -- Enabled extended coherent integration times. +- Enabled extended coherent integration times for signal tracking. +- Configurable coherent and/or non-coherent signal acquisition. - Some configuration parameters can now be overridden by commandline flags for easier use in scripts. @@ -48,11 +51,14 @@ Next release will have several improvements in different dimensions, addition of - Added five more signal sources: "Fmcomms2_Signal_Source" (requires gr-iio), "Plutosdr_Signal Source" (requires gr-iio), "Spir_GSS6450_File_Signal_Source", "Labsat_Signal_Source" and "Custom_UDP_Signal_Source" (requires libpcap). Documented in https://gnss-sdr.org/docs/sp-blocks/signal-source/ - Improved support for BladeRF, HackRF and RTL-SDR front-ends. - Added tools for the interaction with front-ends based on the AD9361 chipset. -- Intermediate results are now saved in .mat binary format, readable from Matlab/Octave and from Python via h5py. +- Intermediate results are now saved in MAT-file format (.mat), readable from Matlab/Octave and from Python via h5py. - Added the GPX output format. -- Fixed a bug in the format of NMEA sentences when latitude or longitude minutes were >10. +- Improvements in the generation of KML files. +- Improvements in the NMEA output. The receiver can produce GPGGA, GPRMC, GPGSA, GPGSV, GAGSA and GAGSV sentences. - Improvements in the RTCM server stability. - Improvements in the correctness of generated RINEX files. +- The receiver can read and make use of Galileo almanac XML files published by the European GNSS Service Centre at https://www.gsc-europa.eu/system-status/almanac-data +- Added program rinex2assist to convert RINEX navigation files into XML files usable for AGNSS. Only available building from source. See https://github.com/gnss-sdr/gnss-sdr/tree/next/src/utils/rinex2assist ### Improvements in Maintainability: @@ -64,6 +70,8 @@ Next release will have several improvements in different dimensions, addition of - Improvement in C++ usage: The override special identifier is now used when overriding a virtual function. This helps the compiler to check for type changes in the base class, making the detection of errors easier. - Improvement in C++ usage: A number of unused includes have been removed. Order of includes set to: local (in-source) headers, then library headers, then system headers. This helps to detect missing includes. - Improvement in C++ usage: Enhanced const correctness. Misuses of those variables are detected by the compiler. +- Applied some style rules to CMake scripts. +- Minimal versions of dependencies identified and detected. ### Improvements in Portability: @@ -76,15 +84,16 @@ Next release will have several improvements in different dimensions, addition of - The Ninja build system can be used in replacement of make. - The volk_gnsssdr library can be built using Python 2.7 or Python 3.6. - The volk_gnsssdr library is now ready for AArch64 NEON instructions. -- Ready for GNU Radio 3.8 C++ API (as per current next branch of GNU Radio upstream repository). +- Ready for GNU Radio 3.8 C++ API (as per current master branch of GNU Radio upstream repository). - Improved detection of required and optional dependencies in many GNU/Linux distributions and processor architectures. -- Improvement in C++ usage: The library has been replaced by the more modern and portable . +- Improvement in C++ usage: The library has been replaced by the more modern and portable (except for the interaction with RTKLIB). - Improvement in C++ usage: The library has been replaced by the more modern and portable for file handling. - Improvement in C++ usage: C++ libraries preferred over C libraries (e.g., instead of , instead of ). - Fixes required by Debian packaging. - Fixes required by Macports packaging. - A downside in portability: BLAS and LAPACK libraries are now required even in ARM devices. - A downside in portability: the matio library >= 1.5.3 is a new required dependency. If not found, it is downloaded and built automatically at building time, but this requires libtool, automake and hdf5 already installed in the system. +- A downside in portability: the PugiXML library is a new required dependency. If not found, it is downloaded and built automatically at building time. ### Improvements in Reliability: @@ -93,6 +102,7 @@ Next release will have several improvements in different dimensions, addition of - Improved flow graph stabiliy. - Introduction of high-integrity C++ practices into the source code and included in the coding style guide. See https://gnss-sdr.org/coding-style/ - Fixed a number of defects detected by Coverity Scan. +- Improvement of QA code and addition of a number of new tests. Documented at https://gnss-sdr.org/docs/tutorials/testing-software-receiver-2/ - Improvement in C++ usage: rand() function replaced by library. - Improvement in C++ usage: strlen and strncpy have been replaced by safer C++ counterparts. - Improvement in C++ usage: Some destructors have been fixed, avoiding segmentation faults when exiting the program. @@ -122,9 +132,10 @@ Next release will have several improvements in different dimensions, addition of - All Observables block implementations have been merged into a single implementation for all kinds of GNSS signals, making it easier to configure. - All PVT block implementations have been merged into a single implementation for all kinds of GNSS signals, making it easier to configure. -- Misleading parameter name GNSS-SDR.internal_fs_hz has been replaced by GNSS-SDR.internal_fs_sps. The old parameter name is still read. If found, a warning is provided to the user. -- Updated and improved documentation of processing blocks at https://gnss-sdr.org/docs/sp-blocks/ +- Misleading parameter name GNSS-SDR.internal_fs_hz has been replaced by GNSS-SDR.internal_fs_sps. The old parameter name is still read. If found, a warning is provided to the user. The old name will be removed in future releases. +- Updated and improved online documentation of processing blocks at https://gnss-sdr.org/docs/sp-blocks/ - Improved documentation of required dependency packages in several GNU/Linux distributions. +- Dump and output files can now be stored anywhere. - Parameter names with the same role have been harmonized within different block implementations. - Added a changelog, a code of conduct, a contributing guide and a pull-request template in the source tree. - Added colors to the commandline user interface. From d518b19ef10c1588d06560f830a9b5511357d92e Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Mon, 26 Nov 2018 22:18:27 +0100 Subject: [PATCH 08/10] Update changelog --- docs/changelog | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/changelog b/docs/changelog index 96dcc4b6a..2382a4779 100644 --- a/docs/changelog +++ b/docs/changelog @@ -58,7 +58,8 @@ Next release will have several improvements in different dimensions, addition of - Improvements in the RTCM server stability. - Improvements in the correctness of generated RINEX files. - The receiver can read and make use of Galileo almanac XML files published by the European GNSS Service Centre at https://www.gsc-europa.eu/system-status/almanac-data -- Added program rinex2assist to convert RINEX navigation files into XML files usable for AGNSS. Only available building from source. See https://github.com/gnss-sdr/gnss-sdr/tree/next/src/utils/rinex2assist +- Own-defined XML schemas for navigation data published at https://github.com/gnss-sdr/gnss-sdr/tree/next/docs/xml-schemas +- Added program rinex2assist to convert RINEX navigation files into XML files usable for Assisted GNSS. Only available building from source. See https://github.com/gnss-sdr/gnss-sdr/tree/next/src/utils/rinex2assist ### Improvements in Maintainability: From 6c4de4b14419dc9c62d73d019c93ea0078195e0b Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Mon, 26 Nov 2018 22:39:27 +0100 Subject: [PATCH 09/10] Add link to rinex2assist --- docs/xml-schemas/README.md | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/docs/xml-schemas/README.md b/docs/xml-schemas/README.md index e85c643fe..007d520c0 100644 --- a/docs/xml-schemas/README.md +++ b/docs/xml-schemas/README.md @@ -12,14 +12,14 @@ GPS L1 C/A - [iono_model.xsd](./iono_model.xsd) - GPS NAV message ionospheric model parameters. - [utc_model.xsd](./utc_model.xsd) - GPS NAV message UTC model parameters. - [gps_almanac_map.xsd](./gps_almanac_map.xsd) - GPS NAV message almanac. - - + + GPS L2C and L5 -------------- - + - [cnav_ephemeris_map.xsd](./cnav_ephemeris_map.xsd) - GPS CNAV message ephemeris parameters. - - + + Galileo ------- @@ -31,4 +31,5 @@ Galileo ------- Please check https://gnss-sdr.org/docs/sp-blocks/global-parameters/ for more information about the usage of XML files in GNSS-SDR. - + +You could find useful the utility program [rinex2assist](https://github.com/gnss-sdr/gnss-sdr/tree/next/src/utils/rinex2assist) for the generation of compatible XML files from recent, publicly available RINEX navigation data files. From c74b9527cd67ee217cb7ccc73832776fa4ed261c Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Mon, 26 Nov 2018 23:08:05 +0100 Subject: [PATCH 10/10] Add UNAVCO FTP link for RINEX navigation data files --- src/utils/rinex2assist/README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/utils/rinex2assist/README.md b/src/utils/rinex2assist/README.md index 6ed346cdb..9d378d797 100644 --- a/src/utils/rinex2assist/README.md +++ b/src/utils/rinex2assist/README.md @@ -32,7 +32,7 @@ The building requires two extra dependencies: the Boost Iostreams library and th The usage is as follows: ``` -$ rinex2assist /path/to/RINEX_nav_file +$ rinex2assist /path/to/RINEX_nav_file ``` The argument is mandatory (the name of the RINEX navigation file). The name `gps_ephemeris.xml` is given to the output if GPS NAV data is fould. If the RINEX file contains Galileo data, the corresponding `gal_ephemeris.xml` file will be generated. The program is also able to extract parameters of the UTC and the Ionospheric models from the RINEX header, if available. They will be called `gps_utc_model.xml`, `gps_iono.xml`, `gal_utc_model.xml` and `gal_iono.xml`. @@ -40,8 +40,9 @@ The argument is mandatory (the name of the RINEX navigation file). The name `gps There are some servers available for downloading recent RINEX navigation files. For instance: * NASA: [ftp://cddis.gsfc.nasa.gov/pub/gnss/data/hourly/](ftp://gssc.esa.int/gnss/data/hourly/) * ESA: [ftp://gssc.esa.int/gnss/data/hourly/](ftp://gssc.esa.int/gnss/data/hourly/) + * UNAVCO: [ftp://data-out.unavco.org/pub/hourly/rinex/](ftp://data-out.unavco.org/pub/hourly/rinex/) -Just make sure to pick up a [station near you](http://www.igs.org/network). +Just make sure to pick up a recent file from a [station near you](http://www.igs.org/network). The program accepts either versions 2.xx or 3.xx for the RINEX navigation data file, as well as compressed files (ending in `.gz` or `.Z`).