mirror of
				https://github.com/gnss-sdr/gnss-sdr
				synced 2025-10-31 15:23:04 +00:00 
			
		
		
		
	Add utility for assisted GNSS
This commit is contained in:
		| @@ -17,3 +17,7 @@ | ||||
| # | ||||
|  | ||||
| add_subdirectory(front-end-cal) | ||||
|  | ||||
| if(ENABLE_UNIT_TESTING_EXTRA OR ENABLE_SYSTEM_TESTING_EXTRA OR ENABLE_FPGA) | ||||
|     add_subdirectory(assist) | ||||
| endif(ENABLE_UNIT_TESTING_EXTRA OR ENABLE_SYSTEM_TESTING_EXTRA OR ENABLE_FPGA) | ||||
|   | ||||
							
								
								
									
										56
									
								
								src/utils/assist/CMakeLists.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								src/utils/assist/CMakeLists.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,56 @@ | ||||
| # Copyright (C) 2012-2018  (see AUTHORS file for a list of contributors) | ||||
| # | ||||
| # 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 <https://www.gnu.org/licenses/>. | ||||
| # | ||||
|  | ||||
| find_package(GPSTK QUIET) | ||||
| if(NOT GPSTK_FOUND OR ENABLE_OWN_GPSTK) | ||||
|     set(GPSTK_LIBRARY ${CMAKE_CURRENT_SOURCE_DIR}/../../../thirdparty/gpstk-${GNSSSDR_GPSTK_LOCAL_VERSION}/install/lib/${CMAKE_FIND_LIBRARY_PREFIXES}gpstk${CMAKE_SHARED_LIBRARY_SUFFIX} ) | ||||
|     set(GPSTK_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../../thirdparty/gpstk-${GNSSSDR_GPSTK_LOCAL_VERSION}/install/include ) | ||||
| endif(NOT GPSTK_FOUND OR ENABLE_OWN_GPSTK) | ||||
|  | ||||
| set(CMAKE_INCLUDE_PATH ${CMAKE_INCLUDE_PATH} ${GPSTK_INCLUDE_DIR}/gpstk) | ||||
|  | ||||
| include_directories( | ||||
|     ${CMAKE_SOURCE_DIR}/src/core/system_parameters | ||||
|     ${GFlags_INCLUDE_DIRS} | ||||
|     ${Boost_INCLUDE_DIRS} | ||||
|     ${GPSTK_INCLUDE_DIR}/gpstk | ||||
|     ${GPSTK_INCLUDE_DIR} | ||||
| ) | ||||
|  | ||||
| add_executable(rinex2assist ${CMAKE_CURRENT_SOURCE_DIR}/main.cc) | ||||
|  | ||||
| target_link_libraries(rinex2assist | ||||
|     ${Boost_LIBRARIES} | ||||
|     ${GPSTK_LIBRARY} | ||||
|     ${GFlags_LIBS} | ||||
|     gnss_sp_libs | ||||
|     gnss_rx) | ||||
|  | ||||
| if(NOT GPSTK_FOUND OR ENABLE_OWN_GPSTK) | ||||
|     add_dependencies(rinex2assist gpstk-${GNSSSDR_GPSTK_LOCAL_VERSION}) | ||||
| endif(NOT GPSTK_FOUND OR ENABLE_OWN_GPSTK) | ||||
|  | ||||
|  | ||||
| add_custom_command(TARGET rinex2assist POST_BUILD | ||||
|                    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:rinex2assist> | ||||
|                    ${CMAKE_SOURCE_DIR}/install/$<TARGET_FILE_NAME:rinex2assist>) | ||||
|  | ||||
| install(TARGETS rinex2assist | ||||
|                 RUNTIME DESTINATION bin | ||||
|                 COMPONENT "rinex2assist" | ||||
| ) | ||||
							
								
								
									
										226
									
								
								src/utils/assist/main.cc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										226
									
								
								src/utils/assist/main.cc
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,226 @@ | ||||
| /*! | ||||
|  * \file main.cc | ||||
|  * \brief converts navigation RINEX files into XML files for Assisted GNSS. | ||||
|  * \author Carles Fernandez-Prades, 2018. cfernandez(at)cttc.cat | ||||
|  * | ||||
|  * | ||||
|  * ------------------------------------------------------------------------- | ||||
|  * | ||||
|  * 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 <https://www.gnu.org/licenses/>. | ||||
|  * | ||||
|  * ------------------------------------------------------------------------- | ||||
|  */ | ||||
|  | ||||
| //#include "gnss_sdr_flags.h" | ||||
| #include "gps_ephemeris.h" | ||||
| #include "galileo_ephemeris.h" | ||||
| #include <gflags/gflags.h> | ||||
| #include <gpstk/Rinex3NavHeader.hpp> | ||||
| #include <gpstk/Rinex3NavData.hpp> | ||||
| #include <gpstk/Rinex3NavStream.hpp> | ||||
| #include <boost/archive/xml_oarchive.hpp> | ||||
| #include <boost/serialization/map.hpp> | ||||
|  | ||||
| int main(int argc, char** argv) | ||||
| { | ||||
|     const std::string intro_help( | ||||
|         std::string("\n rinex2assist converts navigation RINEX files into XML files for Assisted GNSS\n") + | ||||
|         "Copyright (C) 2018 (see AUTHORS file for a list of contributors)\n" + | ||||
|         "This program comes with ABSOLUTELY NO WARRANTY;\n" + | ||||
|         "See COPYING file to see a copy of the General Public License.\n \n" + | ||||
|         "Usage: \n" + | ||||
|         "   rinex2assist <RINEX Nav file input>  [<XML file output>]"); | ||||
|  | ||||
|     google::SetUsageMessage(intro_help); | ||||
|     google::SetVersionString("1.0"); | ||||
|     google::ParseCommandLineFlags(&argc, &argv, true); | ||||
|  | ||||
|     if ((argc < 2) or (argc > 3)) | ||||
|         { | ||||
|             std::cerr << "Usage:" << std::endl; | ||||
|             std::cerr << "   " << argv[0] | ||||
|                       << " <RINEX Nav file input>  [<XML file output>]" | ||||
|                       << std::endl; | ||||
|             google::ShutDownCommandLineFlags(); | ||||
|             return 1; | ||||
|         } | ||||
|     std::string xml_filename; | ||||
|     if (argc == 3) | ||||
|         { | ||||
|             xml_filename = argv[2]; | ||||
|         } | ||||
|     //std::string filename_rinex_nav = FLAGS_filename_rinex_nav; | ||||
|     std::map<int, Gps_Ephemeris> eph_map; | ||||
|     std::map<int, Galileo_Ephemeris> eph_gal_map; | ||||
|  | ||||
|     int i = 0; | ||||
|     int j = 0; | ||||
|     try | ||||
|         { | ||||
|             // Read nav file | ||||
|             gpstk::Rinex3NavStream rnffs(argv[1]);  // Open navigation data file | ||||
|             gpstk::Rinex3NavData rne; | ||||
|             gpstk::Rinex3NavHeader hdr; | ||||
|  | ||||
|             // read header | ||||
|             rnffs >> hdr; | ||||
|  | ||||
|             // Check that it really is a RINEX navigation file | ||||
|             if (hdr.fileType.substr(0, 1).compare("N") != 0) | ||||
|                 { | ||||
|                     std::cout << "This is not a valid RINEX navigation file" << std::endl; | ||||
|                     return 1; | ||||
|                 } | ||||
|  | ||||
|             while (rnffs >> rne) | ||||
|                 { | ||||
|                     if (rne.satSys.compare("G") == 0 or rne.satSys.empty()) | ||||
|                         { | ||||
|                             // Fill ephemeris object | ||||
|                             Gps_Ephemeris eph; | ||||
|                             eph.i_satellite_PRN = rne.PRNID; | ||||
|                             eph.d_TOW = rne.xmitTime; | ||||
|                             eph.d_IODE_SF2 = rne.IODE; | ||||
|                             eph.d_IODE_SF3 = rne.IODE; | ||||
|                             eph.d_Crs = rne.Crs; | ||||
|                             eph.d_Delta_n = rne.dn; | ||||
|                             eph.d_M_0 = rne.M0; | ||||
|                             eph.d_Cuc = rne.Cuc; | ||||
|                             eph.d_e_eccentricity = rne.ecc; | ||||
|                             eph.d_Cus = rne.Cus; | ||||
|                             eph.d_sqrt_A = rne.Ahalf; | ||||
|                             eph.d_Toe = rne.Toe; | ||||
|                             eph.d_Toc = rne.Toc; | ||||
|                             eph.d_Cic = rne.Cic; | ||||
|                             eph.d_OMEGA0 = rne.OMEGA0; | ||||
|                             eph.d_Cis = rne.Cis; | ||||
|                             eph.d_i_0 = rne.i0; | ||||
|                             eph.d_Crc = rne.Crc; | ||||
|                             eph.d_OMEGA = rne.w; | ||||
|                             eph.d_OMEGA_DOT = rne.OMEGAdot; | ||||
|                             eph.d_IDOT = rne.idot; | ||||
|                             eph.i_code_on_L2 = rne.codeflgs;  //!< If 1, P code ON in L2;  if 2, C/A code ON in L2; | ||||
|                             eph.i_GPS_week = rne.weeknum; | ||||
|                             eph.b_L2_P_data_flag = rne.L2Pdata; | ||||
|                             eph.i_SV_accuracy = rne.accuracy; | ||||
|                             eph.i_SV_health = rne.health; | ||||
|                             eph.d_TGD = rne.Tgd; | ||||
|                             eph.d_IODC = rne.IODC; | ||||
|                             eph.i_AODO = 0;  // | ||||
|                             eph.b_fit_interval_flag = (rne.fitint > 4) ? 1 : 0; | ||||
|                             eph.d_spare1 = 0.0; | ||||
|                             eph.d_spare2 = 0.0; | ||||
|                             eph.d_A_f0 = rne.af0; | ||||
|                             eph.d_A_f1 = rne.af1; | ||||
|                             eph.d_A_f2 = rne.af2; | ||||
|                             eph.b_integrity_status_flag = 0;  // | ||||
|                             eph.b_alert_flag = 0;             // | ||||
|                             eph.b_antispoofing_flag = 0;      // | ||||
|                             eph_map[i] = eph; | ||||
|                             i++; | ||||
|                         } | ||||
|                     if (rne.satSys.compare("E") == 0) | ||||
|                         { | ||||
|                             // Read Galileo ephemeris | ||||
|                             Galileo_Ephemeris eph; | ||||
|                             eph.i_satellite_PRN = rne.PRNID; | ||||
|                             eph.M0_1 = rne.M0; | ||||
|                             eph.e_1 = rne.ecc; | ||||
|                             eph.A_1 = rne.Ahalf; | ||||
|                             eph.OMEGA_0_2 = rne.OMEGA0; | ||||
|                             eph.i_0_2 = rne.i0; | ||||
|                             eph.omega_2 = rne.w; | ||||
|                             eph.OMEGA_dot_3 = rne.OMEGAdot; | ||||
|                             eph.iDot_2 = rne.idot; | ||||
|                             eph.C_uc_3 = rne.Cuc; | ||||
|                             eph.C_us_3 = rne.Cus; | ||||
|                             eph.C_rc_3 = rne.Crc; | ||||
|                             eph.C_rs_3 = rne.Crs; | ||||
|                             eph.C_ic_4 = rne.Cic; | ||||
|                             eph.C_is_4 = rne.Cis; | ||||
|                             eph.t0e_1 = rne.Toe; | ||||
|                             eph.t0c_4 = rne.Toc; | ||||
|                             eph.af0_4 = rne.af0; | ||||
|                             eph.af1_4 = rne.af1; | ||||
|                             eph.af2_4 = rne.af2; | ||||
|                             eph_gal_map[j] = eph; | ||||
|                             j++; | ||||
|                         } | ||||
|                 } | ||||
|         } | ||||
|     catch (std::exception& e) | ||||
|         { | ||||
|             std::cout << "Error reading the RINEX file: " << e.what() << std::endl; | ||||
|             google::ShutDownCommandLineFlags(); | ||||
|             return 1; | ||||
|         } | ||||
|  | ||||
|     if (i == 0 and j == 0) | ||||
|         { | ||||
|             std::cout << "No data found in the RINEX file. No XML file will be created." << std::endl; | ||||
|             google::ShutDownCommandLineFlags(); | ||||
|             return 1; | ||||
|         } | ||||
|  | ||||
|     // Write XML | ||||
|     if (i != 0) | ||||
|         { | ||||
|             std::ofstream ofs; | ||||
|             if (xml_filename.empty()) | ||||
|                 { | ||||
|                     xml_filename = "eph_GPS_L1CA.xml"; | ||||
|                 } | ||||
|             try | ||||
|                 { | ||||
|                     ofs.open(xml_filename.c_str(), std::ofstream::trunc | std::ofstream::out); | ||||
|                     boost::archive::xml_oarchive xml(ofs); | ||||
|                     xml << boost::serialization::make_nvp("GNSS-SDR_ephemeris_map", eph_map); | ||||
|                 } | ||||
|             catch (std::exception& e) | ||||
|                 { | ||||
|                     std::cout << "Problem creating the XML file: " << e.what() << std::endl; | ||||
|                     google::ShutDownCommandLineFlags(); | ||||
|                     return 1; | ||||
|                 } | ||||
|         } | ||||
|     if (j != 0) | ||||
|         { | ||||
|             std::ofstream ofs2; | ||||
|             if (xml_filename.empty()) | ||||
|                 { | ||||
|                     xml_filename = "eph_Galileo_E1.xml"; | ||||
|                 } | ||||
|             try | ||||
|                 { | ||||
|                     ofs2.open(xml_filename.c_str(), std::ofstream::trunc | std::ofstream::out); | ||||
|                     boost::archive::xml_oarchive xml(ofs2); | ||||
|                     xml << boost::serialization::make_nvp("GNSS-SDR_ephemeris_map", eph_gal_map); | ||||
|                 } | ||||
|             catch (std::exception& e) | ||||
|                 { | ||||
|                     std::cout << "Problem creating the XML file: " << e.what() << std::endl; | ||||
|                     google::ShutDownCommandLineFlags(); | ||||
|                     return 1; | ||||
|                 } | ||||
|         } | ||||
|     google::ShutDownCommandLineFlags(); | ||||
|     return 0; | ||||
| } | ||||
		Reference in New Issue
	
	Block a user
	 Carles Fernandez
					Carles Fernandez