1
0
mirror of https://github.com/gnss-sdr/gnss-sdr synced 2024-06-25 22:43:14 +00:00

Merge branch 'next' of https://github.com/gnss-sdr/gnss-sdr into fpga

This commit is contained in:
Marc Majoral 2018-10-08 19:47:39 +02:00
commit 8710ba1cf7
57 changed files with 2282 additions and 567 deletions

View File

@ -45,7 +45,7 @@ endif(NOT CMAKE_PREFIX_PATH)
########################################################################
# Support of optional RF front-ends
option(ENABLE_UHD "Enable the use of UHD (driver for all USRP devices)" ON)
option(ENABLE_OSMOSDR "Enable the use of OsmoSDR and other front-ends (RTL-based dongles, HackRF, bladeRF, etc.) as signal source (experimental)" OFF)
option(ENABLE_OSMOSDR "Enable the use of OsmoSDR and other front-ends (RTL-based dongles, HackRF, bladeRF, etc.) as signal source" OFF)
option(ENABLE_FLEXIBAND "Enable the use of the signal source adater for the Teleorbit Flexiband GNURadio driver" OFF)
option(ENABLE_ARRAY "Enable the use of CTTC's antenna array front-end as signal source (experimental)" OFF)
option(ENABLE_GN3S "Enable the use of the GN3S dongle as signal source (experimental)" OFF)
@ -341,10 +341,10 @@ set(GNSSSDR_MATIO_MIN_VERSION "1.5.3")
################################################################################
set(GNSSSDR_GFLAGS_LOCAL_VERSION "2.2.1")
set(GNSSSDR_GLOG_LOCAL_VERSION "0.3.5")
set(GNSSSDR_ARMADILLO_LOCAL_VERSION "unstable")
set(GNSSSDR_ARMADILLO_LOCAL_VERSION "9.200.x")
set(GNSSSDR_GTEST_LOCAL_VERSION "1.8.1")
set(GNSSSDR_GNSS_SIM_LOCAL_VERSION "master")
set(GNSSSDR_GPSTK_LOCAL_VERSION "2.10")
set(GNSSSDR_GPSTK_LOCAL_VERSION "2.10.6")
set(GNSSSDR_MATIO_LOCAL_VERSION "1.5.12")
@ -622,7 +622,9 @@ if(NOT VOLK_GNSSSDR_FOUND)
if(CMAKE_COMPILER_IS_GNUCXX AND NOT WIN32)
set(STRIP_VOLK_GNSSSDR_PROFILE "-DENABLE_STRIP=ON -DCMAKE_VERBOSE_MAKEFILE=ON")
endif(CMAKE_COMPILER_IS_GNUCXX AND NOT WIN32)
set(READ_ENVIRO ${CMAKE_COMMAND} -E environment)
if(NOT DEFINED ENV{PROTECT_PASSWORDS})
set(READ_ENVIRO ${CMAKE_COMMAND} -E environment)
endif(NOT DEFINED ENV{PROTECT_PASSWORDS})
endif(ENABLE_PACKAGING)
set(VOLK_GNSSSDR_BUILD_COMMAND "${CMAKE_MAKE_PROGRAM}")

View File

@ -186,9 +186,9 @@ $ sudo apt-get install libblas-dev liblapack-dev # For Debian/Ubuntu/Linux
$ sudo yum install lapack-devel blas-devel # For Fedora/CentOS/RHEL
$ sudo zypper install lapack-devel blas-devel # For OpenSUSE
$ sudo pacman -S blas lapack # For Arch Linux
$ wget https://sourceforge.net/projects/arma/files/armadillo-8.500.1.tar.xz
$ tar xvfz armadillo-8.500.1.tar.xz
$ cd armadillo-8.500.1
$ wget https://sourceforge.net/projects/arma/files/armadillo-9.100.5.tar.xz
$ tar xvfz armadillo-9.100.5.tar.xz
$ cd armadillo-9.100.5
$ cmake .
$ make
$ sudo make install

View File

@ -25,6 +25,10 @@ set(PVT_ADAPTER_SOURCES
rtklib_pvt.cc
)
set(PVT_ADAPTER_HEADERS
rtklib_pvt.h
)
include_directories(
${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_SOURCE_DIR}/src/core/system_parameters
@ -41,8 +45,6 @@ include_directories(
${GNURADIO_RUNTIME_INCLUDE_DIRS}
)
file(GLOB PVT_ADAPTER_HEADERS "*.h")
list(SORT PVT_ADAPTER_HEADERS)
add_library(pvt_adapters ${PVT_ADAPTER_SOURCES} ${PVT_ADAPTER_HEADERS})
source_group(Headers FILES ${PVT_ADAPTER_HEADERS})
target_link_libraries(pvt_adapters pvt_gr_blocks ${ARMADILLO_LIBRARIES} ${GNURADIO_RUNTIME_LIBRARIES})

View File

@ -506,12 +506,12 @@ bool RtklibPvt::save_assistance_to_XML()
if (eph_map.empty() == false)
{
std::ofstream ofs;
try
{
std::ofstream ofs(eph_xml_filename_.c_str(), std::ofstream::trunc | std::ofstream::out);
ofs.open(eph_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);
ofs.close();
LOG(INFO) << "Saved GPS L1 Ephemeris map data";
}
catch (const std::exception& e)
@ -519,13 +519,13 @@ bool RtklibPvt::save_assistance_to_XML()
LOG(WARNING) << e.what();
return false;
}
return true; // return variable (true == succeeded)
}
else
{
LOG(WARNING) << "Failed to save Ephemeris, map is empty";
return false;
}
return true; // return variable (true == succeeded)
}

View File

@ -25,6 +25,10 @@ set(PVT_GR_BLOCKS_SOURCES
rtklib_pvt_cc.cc
)
set(PVT_GR_BLOCKS_HEADERS
rtklib_pvt_cc.h
)
include_directories(
${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_SOURCE_DIR}/src/core/system_parameters
@ -39,8 +43,6 @@ include_directories(
${GNURADIO_RUNTIME_INCLUDE_DIRS}
)
file(GLOB PVT_GR_BLOCKS_HEADERS "*.h")
list(SORT PVT_GR_BLOCKS_HEADERS)
add_library(pvt_gr_blocks ${PVT_GR_BLOCKS_SOURCES} ${PVT_GR_BLOCKS_HEADERS})
source_group(Headers FILES ${PVT_GR_BLOCKS_HEADERS})
target_link_libraries(pvt_gr_blocks pvt_lib ${ARMADILLO_LIBRARIES})

View File

@ -50,6 +50,10 @@ namespace bc = boost::math;
namespace bc = boost::integer;
#endif
//includes used by the observables serializarion (export observables for rtklib unit test)
#include <boost/archive/xml_oarchive.hpp>
#include <boost/archive/xml_iarchive.hpp>
#include <boost/serialization/map.hpp>
using google::LogMessage;
@ -396,12 +400,12 @@ rtklib_pvt_cc::~rtklib_pvt_cc()
if (d_ls_pvt->gps_cnav_ephemeris_map.empty() == false)
{
std::ofstream ofs;
try
{
std::ofstream ofs(file_name.c_str(), std::ofstream::trunc | std::ofstream::out);
ofs.open(file_name.c_str(), std::ofstream::trunc | std::ofstream::out);
boost::archive::xml_oarchive xml(ofs);
xml << boost::serialization::make_nvp("GNSS-SDR_ephemeris_map", d_ls_pvt->gps_cnav_ephemeris_map);
ofs.close();
LOG(INFO) << "Saved GPS L2CM or L5 Ephemeris map data";
}
catch (std::exception& e)
@ -419,12 +423,12 @@ rtklib_pvt_cc::~rtklib_pvt_cc()
if (d_ls_pvt->gps_ephemeris_map.empty() == false)
{
std::ofstream ofs;
try
{
std::ofstream ofs(file_name.c_str(), std::ofstream::trunc | std::ofstream::out);
ofs.open(file_name.c_str(), std::ofstream::trunc | std::ofstream::out);
boost::archive::xml_oarchive xml(ofs);
xml << boost::serialization::make_nvp("GNSS-SDR_ephemeris_map", d_ls_pvt->gps_ephemeris_map);
ofs.close();
LOG(INFO) << "Saved GPS L1 CA Ephemeris map data";
}
catch (const std::exception& e)
@ -442,12 +446,12 @@ rtklib_pvt_cc::~rtklib_pvt_cc()
if (d_ls_pvt->galileo_ephemeris_map.empty() == false)
{
std::ofstream ofs;
try
{
std::ofstream ofs(file_name.c_str(), std::ofstream::trunc | std::ofstream::out);
ofs.open(file_name.c_str(), std::ofstream::trunc | std::ofstream::out);
boost::archive::xml_oarchive xml(ofs);
xml << boost::serialization::make_nvp("GNSS-SDR_ephemeris_map", d_ls_pvt->galileo_ephemeris_map);
ofs.close();
LOG(INFO) << "Saved Galileo E1 Ephemeris map data";
}
catch (const std::exception& e)
@ -465,12 +469,12 @@ rtklib_pvt_cc::~rtklib_pvt_cc()
if (d_ls_pvt->glonass_gnav_ephemeris_map.empty() == false)
{
std::ofstream ofs;
try
{
std::ofstream ofs(file_name.c_str(), std::ofstream::trunc | std::ofstream::out);
ofs.open(file_name.c_str(), std::ofstream::trunc | std::ofstream::out);
boost::archive::xml_oarchive xml(ofs);
xml << boost::serialization::make_nvp("GNSS-SDR_ephemeris_map", d_ls_pvt->glonass_gnav_ephemeris_map);
ofs.close();
LOG(INFO) << "Saved GLONASS GNAV Ephemeris map data";
}
catch (std::exception& e)
@ -507,6 +511,54 @@ bool rtklib_pvt_cc::send_sys_v_ttff_msg(ttff_msgbuf ttff)
}
bool rtklib_pvt_cc::save_gnss_synchro_map_xml(const std::string file_name)
{
if (gnss_observables_map.empty() == false)
{
std::ofstream ofs;
try
{
ofs.open(file_name.c_str(), std::ofstream::trunc | std::ofstream::out);
boost::archive::xml_oarchive xml(ofs);
xml << boost::serialization::make_nvp("GNSS-SDR_gnss_synchro_map", gnss_observables_map);
LOG(INFO) << "Saved gnss_sychro map data";
}
catch (std::exception& e)
{
LOG(WARNING) << e.what();
return false;
}
return true;
}
else
{
LOG(WARNING) << "Failed to save gnss_synchro, map is empty";
return false;
}
}
bool rtklib_pvt_cc::load_gnss_synchro_map_xml(const std::string file_name)
{
// load from xml (boost serialize)
std::ifstream ifs;
try
{
ifs.open(file_name.c_str(), std::ifstream::binary | std::ifstream::in);
boost::archive::xml_iarchive xml(ifs);
gnss_observables_map.clear();
xml >> boost::serialization::make_nvp("GNSS-SDR_gnss_synchro_map", gnss_observables_map);
//std::cout << "Loaded gnss_synchro map data with " << gnss_synchro_map.size() << " pseudoranges" << std::endl;
}
catch (std::exception& e)
{
std::cout << e.what() << "File: " << file_name;
return false;
}
return true;
}
int rtklib_pvt_cc::work(int noutput_items, gr_vector_const_void_star& input_items,
gr_vector_void_star& output_items __attribute__((unused)))
{
@ -526,7 +578,6 @@ int rtklib_pvt_cc::work(int noutput_items, gr_vector_const_void_star& input_item
gnss_observables_map.clear();
const Gnss_Synchro** in = reinterpret_cast<const Gnss_Synchro**>(&input_items[0]); // Get the input buffer pointer
// ############ 1. READ PSEUDORANGES ####
for (uint32_t i = 0; i < d_nchannels; i++)
{
@ -610,8 +661,15 @@ int rtklib_pvt_cc::work(int noutput_items, gr_vector_const_void_star& input_item
// it->second.Pseudorange_m = it->second.Pseudorange_m - d_ls_pvt->get_time_offset_s() * GPS_C_m_s;
// }
if (d_ls_pvt->get_PVT(gnss_observables_map, false))
{
//Optional debug code: export observables snapshot for rtklib unit testing
//std::cout << "step 1: save gnss_synchro map" << std::endl;
//save_gnss_synchro_map_xml("./gnss_synchro_map.xml");
//getchar(); //stop the execution
//end debug
if (current_RX_time_ms % d_display_rate_ms == 0)
{
flag_display_pvt = true;
@ -2060,7 +2118,6 @@ int rtklib_pvt_cc::work(int noutput_items, gr_vector_const_void_star& input_item
{
std::streamsize ss = std::cout.precision(); // save current precision
std::cout.setf(std::ios::fixed, std::ios::floatfield);
auto facet = new boost::posix_time::time_facet("%Y-%b-%d %H:%M:%S.%f %z");
std::cout.imbue(std::locale(std::cout.getloc(), facet));

View File

@ -152,6 +152,10 @@ private:
bool send_sys_v_ttff_msg(ttff_msgbuf ttff);
std::chrono::time_point<std::chrono::system_clock> start, end;
bool save_gnss_synchro_map_xml(const std::string file_name); //debug helper function
bool load_gnss_synchro_map_xml(const std::string file_name); //debug helper function
public:
rtklib_pvt_cc(uint32_t nchannels,
bool dump, std::string dump_filename,

View File

@ -31,6 +31,20 @@ set(PVT_LIB_SOURCES
rtklib_solver.cc
)
set(PVT_LIB_HEADERS
pvt_solution.h
ls_pvt.h
hybrid_ls_pvt.h
kml_printer.h
gpx_printer.h
rinex_printer.h
nmea_printer.h
rtcm_printer.h
geojson_printer.h
rtklib_solver.h
)
include_directories(
${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_SOURCE_DIR}/src/core/system_parameters
@ -45,8 +59,9 @@ include_directories(
${GLOG_INCLUDE_DIRS}
)
file(GLOB PVT_LIB_HEADERS "*.h")
list(SORT PVT_LIB_HEADERS)
list(SORT PVT_LIB_SOURCES)
add_library(pvt_lib ${PVT_LIB_SOURCES} ${PVT_LIB_HEADERS})
source_group(Headers FILES ${PVT_LIB_HEADERS})
add_dependencies(pvt_lib rtklib_lib armadillo-${armadillo_RELEASE} glog-${glog_RELEASE})
@ -60,5 +75,4 @@ target_link_libraries(
${ARMADILLO_LIBRARIES}
${BLAS}
${LAPACK}
)
)

View File

@ -76,12 +76,13 @@ private:
rtk_t rtk_;
std::string d_dump_filename;
std::ofstream d_dump_file;
sol_t pvt_sol;
bool d_flag_dump_enabled;
int d_nchannels; // Number of available channels for positioning
double dop_[4];
public:
sol_t pvt_sol;
rtklib_solver(int nchannels, std::string dump_filename, bool flag_dump_to_file, rtk_t& rtk);
~rtklib_solver();

View File

@ -36,12 +36,43 @@ set(ACQ_ADAPTER_SOURCES
glonass_l2_ca_pcps_acquisition.cc
)
set(ACQ_ADAPTER_HEADERS
gps_l1_ca_pcps_acquisition.h
gps_l1_ca_pcps_assisted_acquisition.h
gps_l1_ca_pcps_acquisition_fine_doppler.h
gps_l1_ca_pcps_tong_acquisition.h
gps_l1_ca_pcps_quicksync_acquisition.h
gps_l2_m_pcps_acquisition.h
gps_l5i_pcps_acquisition.h
galileo_e1_pcps_ambiguous_acquisition.h
galileo_e1_pcps_cccwsr_ambiguous_acquisition.h
galileo_e1_pcps_quicksync_ambiguous_acquisition.h
galileo_e1_pcps_tong_ambiguous_acquisition.h
galileo_e1_pcps_8ms_ambiguous_acquisition.h
galileo_e5a_noncoherent_iq_acquisition_caf.h
galileo_e5a_pcps_acquisition.h
glonass_l1_ca_pcps_acquisition.h
glonass_l2_ca_pcps_acquisition.h
)
if(ENABLE_FPGA)
set(ACQ_ADAPTER_SOURCES ${ACQ_ADAPTER_SOURCES} gps_l1_ca_pcps_acquisition_fpga.cc gps_l2_m_pcps_acquisition_fpga.cc galileo_e1_pcps_ambiguous_acquisition_fpga.cc galileo_e5a_pcps_acquisition_fpga.cc gps_l5i_pcps_acquisition_fpga.cc)
set(ACQ_ADAPTER_SOURCES ${ACQ_ADAPTER_SOURCES} gps_l1_ca_pcps_acquisition_fpga.cc
gps_l2_m_pcps_acquisition_fpga.cc
galileo_e1_pcps_ambiguous_acquisition_fpga.cc
galileo_e5a_pcps_acquisition_fpga.cc
gps_l5i_pcps_acquisition_fpga.cc)
set(ACQ_ADAPTER_HEADERS ${ACQ_ADAPTER_HEADERS} gps_l1_ca_pcps_acquisition_fpga.h
gps_l2_m_pcps_acquisition_fpga.h
galileo_e1_pcps_ambiguous_acquisition_fpga.h
galileo_e5a_pcps_acquisition_fpga.h
gps_l5i_pcps_acquisition_fpga.h)
endif(ENABLE_FPGA)
if(OPENCL_FOUND)
set(ACQ_ADAPTER_SOURCES ${ACQ_ADAPTER_SOURCES} gps_l1_ca_pcps_opencl_acquisition.cc)
set(ACQ_ADAPTER_HEADERS ${ACQ_ADAPTER_HEADERS} gps_l1_ca_pcps_opencl_acquisition.h)
endif(OPENCL_FOUND)
include_directories(
@ -61,8 +92,8 @@ include_directories(
${VOLK_GNSSSDR_INCLUDE_DIRS}
)
file(GLOB ACQ_ADAPTER_HEADERS "*.h")
list(SORT ACQ_ADAPTER_HEADERS)
list(SORT ACQ_ADAPTER_SOURCES)
add_library(acq_adapters ${ACQ_ADAPTER_SOURCES} ${ACQ_ADAPTER_HEADERS})
source_group(Headers FILES ${ACQ_ADAPTER_HEADERS})
target_link_libraries(acq_adapters acquisition_lib gnss_sp_libs gnss_sdr_flags acq_gr_blocks ${Boost_LIBRARIES} ${GNURADIO_RUNTIME_LIBRARIES} ${GNURADIO_BLOCKS_LIBRARIES})

View File

@ -26,14 +26,27 @@ set(ACQ_GR_BLOCKS_SOURCES
pcps_quicksync_acquisition_cc.cc
galileo_pcps_8ms_acquisition_cc.cc
galileo_e5a_noncoherent_iq_acquisition_caf_cc.cc
)
set(ACQ_GR_BLOCKS_HEADERS
pcps_acquisition.h
pcps_assisted_acquisition_cc.h
pcps_acquisition_fine_doppler_cc.h
pcps_tong_acquisition_cc.h
pcps_cccwsr_acquisition_cc.h
pcps_quicksync_acquisition_cc.h
galileo_pcps_8ms_acquisition_cc.h
galileo_e5a_noncoherent_iq_acquisition_caf_cc.h
)
if(ENABLE_FPGA)
set(ACQ_GR_BLOCKS_SOURCES ${ACQ_GR_BLOCKS_SOURCES} pcps_acquisition_fpga.cc)
set(ACQ_GR_BLOCKS_HEADERS ${ACQ_GR_BLOCKS_HEADERS} pcps_acquisition_fpga.h)
endif(ENABLE_FPGA)
if(OPENCL_FOUND)
set(ACQ_GR_BLOCKS_SOURCES ${ACQ_GR_BLOCKS_SOURCES} pcps_opencl_acquisition_cc.cc)
set(ACQ_GR_BLOCKS_HEADERS ${ACQ_GR_BLOCKS_HEADERS} pcps_opencl_acquisition_cc.h)
endif(OPENCL_FOUND)
include_directories(
@ -61,8 +74,8 @@ if(OPENCL_FOUND)
endif(OS_IS_MACOSX)
endif(OPENCL_FOUND)
file(GLOB ACQ_GR_BLOCKS_HEADERS "*.h")
list(SORT ACQ_GR_BLOCKS_HEADERS)
list(SORT ACQ_GR_BLOCKS_SOURCES)
add_library(acq_gr_blocks ${ACQ_GR_BLOCKS_SOURCES} ${ACQ_GR_BLOCKS_HEADERS})
source_group(Headers FILES ${ACQ_GR_BLOCKS_HEADERS})

View File

@ -78,7 +78,7 @@ pcps_acquisition_fpga::pcps_acquisition_fpga(pcpsconf_fpga_t conf_) : gr::block(
d_single_doppler_flag = false;
d_downsampling_factor = acq_parameters.downsampling_factor;
//printf("downsampling_factor = %f\n", d_downsampling_factor);
//printf("AAAAAAAAAA downsampling_factor = %f\n", d_downsampling_factor);
d_select_queue_Fpga = acq_parameters.select_queue_Fpga;
//printf("zzzz acq_parameters.code_length = %d\n", acq_parameters.code_length);
//printf("zzzz acq_parameters.samples_per_ms = %d\n", acq_parameters.samples_per_ms);

View File

@ -18,6 +18,7 @@
if(ENABLE_FPGA)
set(ACQUISITION_LIB_SOURCES fpga_acquisition.cc )
set(ACQUISITION_LIB_HEADERS fpga_acquisition.h )
include_directories(
${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_SOURCE_DIR}/src/core/system_parameters
@ -29,15 +30,14 @@ if(ENABLE_FPGA)
${GFlags_INCLUDE_DIRS}
${VOLK_GNSSSDR_INCLUDE_DIRS}
)
file(GLOB ACQUISITION_LIB_HEADERS "*.h")
endif(ENABLE_FPGA)
set(ACQUISITION_LIB_HEADERS ${ACQUISITION_LIB_HEADERS} acq_conf.h)
list(SORT ACQUISITION_LIB_HEADERS)
set(ACQUISITION_LIB_SOURCES ${ACQUISITION_LIB_SOURCES} acq_conf.cc)
list(SORT ACQUISITION_LIB_HEADERS)
list(SORT ACQUISITION_LIB_SOURCES)
add_library(acquisition_lib ${ACQUISITION_LIB_SOURCES} ${ACQUISITION_LIB_HEADERS})
source_group(Headers FILES ${ACQUISITION_LIB_HEADERS})
target_link_libraries(acquisition_lib ${VOLK_LIBRARIES} ${VOLK_GNSSSDR_LIBRARIES} ${GNURADIO_RUNTIME_LIBRARIES})

View File

@ -17,6 +17,7 @@
#
set(CHANNEL_ADAPTER_SOURCES channel.cc)
set(CHANNEL_ADAPTER_HEADERS channel.h)
include_directories(
${CMAKE_CURRENT_SOURCE_DIR}
@ -31,8 +32,6 @@ include_directories(
${GNURADIO_RUNTIME_INCLUDE_DIRS}
)
file(GLOB CHANNEL_ADAPTER_HEADERS "*.h")
list(SORT CHANNEL_ADAPTER_HEADERS)
add_library(channel_adapters ${CHANNEL_ADAPTER_SOURCES} ${CHANNEL_ADAPTER_HEADERS})
source_group(Headers FILES ${CHANNEL_ADAPTER_HEADERS})
target_link_libraries(channel_adapters channel_fsm ${GNURADIO_RUNTIME_LIBRARIES} ${Boost_LIBRARIES} gnss_sdr_flags)

View File

@ -20,6 +20,11 @@ set(CHANNEL_FSM_SOURCES
channel_fsm.cc
channel_msg_receiver_cc.cc
)
set(CHANNEL_FSM_HEADERS
channel_fsm.h
channel_msg_receiver_cc.h
)
include_directories(
${CMAKE_CURRENT_SOURCE_DIR}
@ -33,8 +38,9 @@ include_directories(
${GNURADIO_RUNTIME_INCLUDE_DIRS}
)
file(GLOB CHANNEL_FSM_HEADERS "*.h")
list(SORT CHANNEL_FSM_HEADERS)
list(SORT CHANNEL_FSM_SOURCES)
add_library(channel_fsm ${CHANNEL_FSM_SOURCES} ${CHANNEL_FSM_HEADERS})
source_group(Headers FILES ${CHANNEL_FSM_HEADERS})
add_dependencies(channel_fsm glog-${glog_RELEASE})

View File

@ -22,6 +22,11 @@ set(COND_ADAPTER_SOURCES
array_signal_conditioner.cc
)
set(COND_ADAPTER_HEADERS
signal_conditioner.h
array_signal_conditioner.h
)
include_directories(
${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_SOURCE_DIR}/src/core/system_parameters
@ -34,8 +39,9 @@ include_directories(
${GNURADIO_RUNTIME_INCLUDE_DIRS}
)
file(GLOB COND_ADAPTER_HEADERS "*.h")
list(SORT COND_ADAPTER_HEADERS)
list(SORT COND_ADAPTER_SOURCES)
add_library(conditioner_adapters ${COND_ADAPTER_SOURCES} ${COND_ADAPTER_HEADERS})
source_group(Headers FILES ${COND_ADAPTER_HEADERS})
add_dependencies(conditioner_adapters glog-${glog_RELEASE})

View File

@ -24,7 +24,16 @@ set(DATATYPE_ADAPTER_SOURCES
ibyte_to_cshort.cc
ishort_to_cshort.cc
ishort_to_complex.cc
)
)
set(DATATYPE_ADAPTER_HEADERS
byte_to_short.h
ibyte_to_cbyte.h
ibyte_to_complex.h
ibyte_to_cshort.h
ishort_to_cshort.h
ishort_to_complex.h
)
include_directories(
${CMAKE_CURRENT_SOURCE_DIR}
@ -38,10 +47,10 @@ include_directories(
${VOLK_INCLUDE_DIRS}
)
file(GLOB DATATYPE_ADAPTER_HEADERS "*.h")
list(SORT DATATYPE_ADAPTER_HEADERS)
list(SORT DATATYPE_ADAPTER_SOURCES)
add_library(datatype_adapters ${DATATYPE_ADAPTER_SOURCES} ${DATATYPE_ADAPTER_HEADERS})
source_group(Headers FILES ${DATATYPE_ADAPTER_HEADERS})
add_dependencies(datatype_adapters glog-${glog_RELEASE})
target_link_libraries(datatype_adapters data_type_gr_blocks ${GNURADIO_RUNTIME_LIBRARIES} ${GNURADIO_BLOCKS_LIBRARIES})

View File

@ -23,14 +23,21 @@ set(DATA_TYPE_GR_BLOCKS_SOURCES
interleaved_byte_to_complex_short.cc
)
set(DATA_TYPE_GR_BLOCKS_HEADERS
interleaved_byte_to_complex_byte.h
interleaved_short_to_complex_short.h
interleaved_byte_to_complex_short.h
)
include_directories(
${CMAKE_CURRENT_SOURCE_DIR}
${GNURADIO_RUNTIME_INCLUDE_DIRS}
${VOLK_INCLUDE_DIRS}
)
file(GLOB DATA_TYPE_GR_BLOCKS_HEADERS "*.h")
list(SORT DATA_TYPE_GR_BLOCKS_HEADERS)
list(SORT DATA_TYPE_GR_BLOCKS_SOURCES)
add_library(data_type_gr_blocks ${DATA_TYPE_GR_BLOCKS_SOURCES} ${DATA_TYPE_GR_BLOCKS_HEADERS})
source_group(Headers FILES ${DATA_TYPE_GR_BLOCKS_HEADERS})
target_link_libraries(data_type_gr_blocks ${GNURADIO_RUNTIME_LIBRARIES} ${VOLK_LIBRARIES})
target_link_libraries(data_type_gr_blocks ${GNURADIO_RUNTIME_LIBRARIES} ${VOLK_LIBRARIES})

View File

@ -17,7 +17,7 @@
#
set(INPUT_FILTER_ADAPTER_SOURCES
fir_filter.cc
fir_filter.cc
freq_xlating_fir_filter.cc
beamformer_filter.cc
pulse_blanking_filter.cc
@ -25,6 +25,15 @@ set(INPUT_FILTER_ADAPTER_SOURCES
notch_filter_lite.cc
)
set(INPUT_FILTER_ADAPTER_HEADERS
fir_filter.h
freq_xlating_fir_filter.h
beamformer_filter.h
pulse_blanking_filter.h
notch_filter.h
notch_filter_lite.h
)
include_directories(
${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_SOURCE_DIR}/src/core/system_parameters
@ -41,8 +50,9 @@ if(${PC_GNURADIO_RUNTIME_VERSION} VERSION_GREATER "3.7.13.4" )
add_definitions( -DGR_GREATER_38=1 )
endif(${PC_GNURADIO_RUNTIME_VERSION} VERSION_GREATER "3.7.13.4" )
file(GLOB INPUT_FILTER_ADAPTER_HEADERS "*.h")
list(SORT INPUT_FILTER_ADAPTER_HEADERS)
list(SORT INPUT_FILTER_ADAPTER_SOURCES)
add_library(input_filter_adapters ${INPUT_FILTER_ADAPTER_SOURCES} ${INPUT_FILTER_ADAPTER_HEADERS})
source_group(Headers FILES ${INPUT_FILTER_ADAPTER_HEADERS})
add_dependencies(input_filter_adapters glog-${glog_RELEASE} gnss_sp_libs)

View File

@ -24,6 +24,13 @@ set(INPUT_FILTER_GR_BLOCKS_SOURCES
notch_lite_cc.cc
)
set(INPUT_FILTER_GR_BLOCKS_HEADERS
beamformer.h
pulse_blanking_cc.h
notch_cc.h
notch_lite_cc.h
)
include_directories(
${CMAKE_CURRENT_SOURCE_DIR}
${GNURADIO_RUNTIME_INCLUDE_DIRS}
@ -33,8 +40,9 @@ include_directories(
${GFlags_INCLUDE_DIRS}
)
file(GLOB INPUT_FILTER_GR_BLOCKS_HEADERS "*.h")
list(SORT INPUT_FILTER_GR_BLOCKS_HEADERS)
list(SORT INPUT_FILTER_GR_BLOCKS_SOURCES)
add_library(input_filter_gr_blocks ${INPUT_FILTER_GR_BLOCKS_SOURCES} ${INPUT_FILTER_GR_BLOCKS_HEADERS})
source_group(Headers FILES ${INPUT_FILTER_GR_BLOCKS_HEADERS})

View File

@ -18,14 +18,12 @@
add_subdirectory(rtklib)
if(ENABLE_FPGA)
set(GNSS_SPLIBS_SOURCES
set(GNSS_SPLIBS_SOURCES
gps_l2c_signal.cc
gps_l5_signal.cc
galileo_e1_signal_processing.cc
gnss_sdr_valve.cc
gnss_sdr_sample_counter.cc
gnss_sdr_time_counter.cc
gnss_signal_processing.cc
gps_sdr_signal_processing.cc
glonass_l1_signal_processing.cc
@ -40,30 +38,43 @@ if(ENABLE_FPGA)
conjugate_cc.cc
conjugate_sc.cc
conjugate_ic.cc
)
set(GNSS_SPLIBS_HEADERS
gps_l2c_signal.h
gps_l5_signal.h
galileo_e1_signal_processing.h
gnss_sdr_valve.h
gnss_sdr_sample_counter.h
gnss_signal_processing.h
gps_sdr_signal_processing.h
glonass_l1_signal_processing.h
glonass_l2_signal_processing.h
pass_through.h
galileo_e5_signal_processing.h
complex_byte_to_float_x2.h
byte_x2_to_complex_byte.h
cshort_to_float_x2.h
short_x2_to_cshort.h
complex_float_to_complex_byte.h
conjugate_cc.h
conjugate_sc.h
conjugate_ic.h
gnss_circular_deque.h
)
if(ENABLE_FPGA)
set(GNSS_SPLIBS_SOURCES ${GNSS_SPLIBS_SOURCES}
gnss_sdr_time_counter.cc
gnss_sdr_fpga_sample_counter.cc
)
else(ENABLE_FPGA)
set(GNSS_SPLIBS_SOURCES
gps_l2c_signal.cc
gps_l5_signal.cc
galileo_e1_signal_processing.cc
gnss_sdr_valve.cc
gnss_sdr_sample_counter.cc
gnss_signal_processing.cc
gps_sdr_signal_processing.cc
glonass_l1_signal_processing.cc
glonass_l2_signal_processing.cc
pass_through.cc
galileo_e5_signal_processing.cc
complex_byte_to_float_x2.cc
byte_x2_to_complex_byte.cc
cshort_to_float_x2.cc
short_x2_to_cshort.cc
complex_float_to_complex_byte.cc
conjugate_cc.cc
conjugate_sc.cc
conjugate_ic.cc
)
set(GNSS_SPLIBS_HEADERS ${GNSS_SPLIBS_HEADERS}
gnss_sdr_time_counter.h
gnss_sdr_fpga_sample_counter.h
)
endif(ENABLE_FPGA)
if(OPENCL_FOUND)
@ -71,7 +82,13 @@ if(OPENCL_FOUND)
opencl/fft_execute.cc # Needs OpenCL
opencl/fft_setup.cc # Needs OpenCL
opencl/fft_kernelstring.cc # Needs OpenCL
)
)
set(GNSS_SPLIBS_HEADERS ${GNSS_SPLIBS_HEADERS}
opencl/fft_execute.h # Needs OpenCL
opencl/fft_setup.h # Needs OpenCL
opencl/fft_kernelstring.h # Needs OpenCL
)
endif(OPENCL_FOUND)
include_directories(
@ -99,9 +116,9 @@ endif(OPENCL_FOUND)
add_definitions(-DGNSSSDR_INSTALL_DIR="${CMAKE_INSTALL_PREFIX}")
file(GLOB GNSS_SPLIBS_HEADERS "*.h")
list(REMOVE_ITEM GNSS_SPLIBS_HEADERS gnss_sdr_flags.h)
list(SORT GNSS_SPLIBS_HEADERS)
list(SORT GNSS_SPLIBS_SOURCES)
add_library(gnss_sp_libs ${GNSS_SPLIBS_SOURCES} ${GNSS_SPLIBS_HEADERS})
source_group(Headers FILES ${GNSS_SPLIBS_HEADERS})

View File

@ -38,6 +38,27 @@ set(RTKLIB_LIB_SOURCES
rtklib_rtcm3.cc
)
set(RTKLIB_LIB_HEADERS
rtklib_rtkcmn.h
rtklib_ephemeris.h
rtklib_preceph.h
rtklib_sbas.h
rtklib_ionex.h
rtklib_pntpos.h
rtklib_ppp.h
rtklib_tides.h
rtklib_lambda.h
rtklib_rtkpos.h
rtklib_conversions.h
rtklib_stream.h
rtklib_rtksvr.h
rtklib_solution.h
rtklib_rtcm.h
rtklib_rtcm2.h
rtklib_rtcm3.h
rtklib.h
)
include_directories(
${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_SOURCE_DIR}/src/core/system_parameters
@ -48,8 +69,10 @@ include_directories(
${GLOG_INCLUDE_DIRS}
)
file(GLOB RTKLIB_LIB_HEADERS "*.h")
list(SORT RTKLIB_LIB_HEADERS)
list(SORT RTKLIB_LIB_SOURCES)
add_library(rtklib_lib ${RTKLIB_LIB_SOURCES} ${RTKLIB_LIB_HEADERS})
source_group(Headers FILES ${RTKLIB_LIB_HEADERS})
add_dependencies(rtklib_lib glog-${glog_RELEASE})

View File

@ -673,277 +673,6 @@ void pppoutsolstat(rtk_t *rtk, int level, FILE *fp)
}
/* solar/lunar tides (ref [2] 7) ---------------------------------------------*/
void tide_pl(const double *eu, const double *rp, double GMp,
const double *pos, double *dr)
{
const double H3 = 0.292, L3 = 0.015;
double r, ep[3], latp, lonp, p, K2, K3, a, H2, L2, dp, du, cosp, sinl, cosl;
int i;
trace(4, "tide_pl : pos=%.3f %.3f\n", pos[0] * R2D, pos[1] * R2D);
if ((r = norm_rtk(rp, 3)) <= 0.0) return;
for (i = 0; i < 3; i++) ep[i] = rp[i] / r;
K2 = GMp / GME * std::pow(RE_WGS84, 2.0) * std::pow(RE_WGS84, 2.0) / (r * r * r);
K3 = K2 * RE_WGS84 / r;
latp = asin(ep[2]);
lonp = atan2(ep[1], ep[0]);
cosp = cos(latp);
sinl = sin(pos[0]);
cosl = cos(pos[0]);
/* step1 in phase (degree 2) */
p = (3.0 * sinl * sinl - 1.0) / 2.0;
H2 = 0.6078 - 0.0006 * p;
L2 = 0.0847 + 0.0002 * p;
a = dot(ep, eu, 3);
dp = K2 * 3.0 * L2 * a;
du = K2 * (H2 * (1.5 * a * a - 0.5) - 3.0 * L2 * a * a);
/* step1 in phase (degree 3) */
dp += K3 * L3 * (7.5 * a * a - 1.5);
du += K3 * (H3 * (2.5 * a * a * a - 1.5 * a) - L3 * (7.5 * a * a - 1.5) * a);
/* step1 out-of-phase (only radial) */
du += 3.0 / 4.0 * 0.0025 * K2 * sin(2.0 * latp) * sin(2.0 * pos[0]) * sin(pos[1] - lonp);
du += 3.0 / 4.0 * 0.0022 * K2 * cosp * cosp * cosl * cosl * sin(2.0 * (pos[1] - lonp));
dr[0] = dp * ep[0] + du * eu[0];
dr[1] = dp * ep[1] + du * eu[1];
dr[2] = dp * ep[2] + du * eu[2];
trace(5, "tide_pl : dr=%.3f %.3f %.3f\n", dr[0], dr[1], dr[2]);
}
/* displacement by solid earth tide (ref [2] 7) ------------------------------*/
void tide_solid(const double *rsun, const double *rmoon,
const double *pos, const double *E, double gmst, int opt,
double *dr)
{
double dr1[3], dr2[3], eu[3], du, dn, sinl, sin2l;
trace(3, "tide_solid: pos=%.3f %.3f opt=%d\n", pos[0] * R2D, pos[1] * R2D, opt);
/* step1: time domain */
eu[0] = E[2];
eu[1] = E[5];
eu[2] = E[8];
tide_pl(eu, rsun, GMS, pos, dr1);
tide_pl(eu, rmoon, GMM, pos, dr2);
/* step2: frequency domain, only K1 radial */
sin2l = sin(2.0 * pos[0]);
du = -0.012 * sin2l * sin(gmst + pos[1]);
dr[0] = dr1[0] + dr2[0] + du * E[2];
dr[1] = dr1[1] + dr2[1] + du * E[5];
dr[2] = dr1[2] + dr2[2] + du * E[8];
/* eliminate permanent deformation */
if (opt & 8)
{
sinl = sin(pos[0]);
du = 0.1196 * (1.5 * sinl * sinl - 0.5);
dn = 0.0247 * sin2l;
dr[0] += du * E[2] + dn * E[1];
dr[1] += du * E[5] + dn * E[4];
dr[2] += du * E[8] + dn * E[7];
}
trace(5, "tide_solid: dr=%.3f %.3f %.3f\n", dr[0], dr[1], dr[2]);
}
/* displacement by ocean tide loading (ref [2] 7) ----------------------------*/
void tide_oload(gtime_t tut, const double *odisp, double *denu)
{
const double args[][5] = {
{1.40519E-4, 2.0, -2.0, 0.0, 0.00}, /* M2 */
{1.45444E-4, 0.0, 0.0, 0.0, 0.00}, /* S2 */
{1.37880E-4, 2.0, -3.0, 1.0, 0.00}, /* N2 */
{1.45842E-4, 2.0, 0.0, 0.0, 0.00}, /* K2 */
{0.72921E-4, 1.0, 0.0, 0.0, 0.25}, /* K1 */
{0.67598E-4, 1.0, -2.0, 0.0, -0.25}, /* O1 */
{0.72523E-4, -1.0, 0.0, 0.0, -0.25}, /* P1 */
{0.64959E-4, 1.0, -3.0, 1.0, -0.25}, /* Q1 */
{0.53234E-5, 0.0, 2.0, 0.0, 0.00}, /* Mf */
{0.26392E-5, 0.0, 1.0, -1.0, 0.00}, /* Mm */
{0.03982E-5, 2.0, 0.0, 0.0, 0.00} /* Ssa */
};
const double ep1975[] = {1975, 1, 1, 0, 0, 0};
double ep[6], fday, days, t, t2, t3, a[5], ang, dp[3] = {0};
int i, j;
trace(3, "tide_oload:\n");
/* angular argument: see subroutine arg.f for reference [1] */
time2epoch(tut, ep);
fday = ep[3] * 3600.0 + ep[4] * 60.0 + ep[5];
ep[3] = ep[4] = ep[5] = 0.0;
days = timediff(epoch2time(ep), epoch2time(ep1975)) / 86400.0;
t = (27392.500528 + 1.000000035 * days) / 36525.0;
t2 = t * t;
t3 = t2 * t;
a[0] = fday;
a[1] = (279.69668 + 36000.768930485 * t + 3.03E-4 * t2) * D2R; /* H0 */
a[2] = (270.434358 + 481267.88314137 * t - 0.001133 * t2 + 1.9E-6 * t3) * D2R; /* S0 */
a[3] = (334.329653 + 4069.0340329577 * t - 0.010325 * t2 - 1.2E-5 * t3) * D2R; /* P0 */
a[4] = 2.0 * PI;
/* displacements by 11 constituents */
for (i = 0; i < 11; i++)
{
ang = 0.0;
for (j = 0; j < 5; j++) ang += a[j] * args[i][j];
for (j = 0; j < 3; j++) dp[j] += odisp[j + i * 6] * cos(ang - odisp[j + 3 + i * 6] * D2R);
}
denu[0] = -dp[1];
denu[1] = -dp[2];
denu[2] = dp[0];
trace(5, "tide_oload: denu=%.3f %.3f %.3f\n", denu[0], denu[1], denu[2]);
}
/* iers mean pole (ref [7] eq.7.25) ------------------------------------------*/
void iers_mean_pole(gtime_t tut, double *xp_bar, double *yp_bar)
{
const double ep2000[] = {2000, 1, 1, 0, 0, 0};
double y, y2, y3;
y = timediff(tut, epoch2time(ep2000)) / 86400.0 / 365.25;
if (y < 3653.0 / 365.25)
{ /* until 2010.0 */
y2 = y * y;
y3 = y2 * y;
*xp_bar = 55.974 + 1.8243 * y + 0.18413 * y2 + 0.007024 * y3; /* (mas) */
*yp_bar = 346.346 + 1.7896 * y - 0.10729 * y2 - 0.000908 * y3;
}
else
{ /* after 2010.0 */
*xp_bar = 23.513 + 7.6141 * y; /* (mas) */
*yp_bar = 358.891 - 0.6287 * y;
}
}
/* displacement by pole tide (ref [7] eq.7.26) --------------------------------*/
void tide_pole(gtime_t tut, const double *pos, const double *erpv,
double *denu)
{
double xp_bar, yp_bar, m1, m2, cosl, sinl;
trace(3, "tide_pole: pos=%.3f %.3f\n", pos[0] * R2D, pos[1] * R2D);
/* iers mean pole (mas) */
iers_mean_pole(tut, &xp_bar, &yp_bar);
/* ref [7] eq.7.24 */
m1 = erpv[0] / AS2R - xp_bar * 1E-3; /* (as) */
m2 = -erpv[1] / AS2R + yp_bar * 1E-3;
/* sin(2*theta) = sin(2*phi), cos(2*theta)=-cos(2*phi) */
cosl = cos(pos[1]);
sinl = sin(pos[1]);
denu[0] = 9E-3 * sin(pos[0]) * (m1 * sinl - m2 * cosl); /* de= Slambda (m) */
denu[1] = -9E-3 * cos(2.0 * pos[0]) * (m1 * cosl + m2 * sinl); /* dn=-Stheta (m) */
denu[2] = -33E-3 * sin(2.0 * pos[0]) * (m1 * cosl + m2 * sinl); /* du= Sr (m) */
trace(5, "tide_pole : denu=%.3f %.3f %.3f\n", denu[0], denu[1], denu[2]);
}
/* tidal displacement ----------------------------------------------------------
* displacements by earth tides
* args : gtime_t tutc I time in utc
* double *rr I site position (ecef) (m)
* int opt I options (or of the followings)
* 1: solid earth tide
* 2: ocean tide loading
* 4: pole tide
* 8: elimate permanent deformation
* double *erp I earth rotation parameters (NULL: not used)
* double *odisp I ocean loading parameters (NULL: not used)
* odisp[0+i*6]: consituent i amplitude radial(m)
* odisp[1+i*6]: consituent i amplitude west (m)
* odisp[2+i*6]: consituent i amplitude south (m)
* odisp[3+i*6]: consituent i phase radial (deg)
* odisp[4+i*6]: consituent i phase west (deg)
* odisp[5+i*6]: consituent i phase south (deg)
* (i=0:M2,1:S2,2:N2,3:K2,4:K1,5:O1,6:P1,7:Q1,
* 8:Mf,9:Mm,10:Ssa)
* double *dr O displacement by earth tides (ecef) (m)
* return : none
* notes : see ref [1], [2] chap 7
* see ref [4] 5.2.1, 5.2.2, 5.2.3
* ver.2.4.0 does not use ocean loading and pole tide corrections
*-----------------------------------------------------------------------------*/
void tidedisp(gtime_t tutc, const double *rr, int opt, const erp_t *erp,
const double *odisp, double *dr)
{
gtime_t tut;
double pos[2], E[9], drt[3], denu[3], rs[3], rm[3], gmst, erpv[5] = {0};
int i;
#ifdef IERS_MODEL
double ep[6], fhr;
int year, mon, day;
#endif
trace(3, "tidedisp: tutc=%s\n", time_str(tutc, 0));
if (erp) geterp(erp, tutc, erpv);
tut = timeadd(tutc, erpv[2]);
dr[0] = dr[1] = dr[2] = 0.0;
if (norm_rtk(rr, 3) <= 0.0) return;
pos[0] = asin(rr[2] / norm_rtk(rr, 3));
pos[1] = atan2(rr[1], rr[0]);
xyz2enu(pos, E);
if (opt & 1)
{ /* solid earth tides */
/* sun and moon position in ecef */
sunmoonpos(tutc, erpv, rs, rm, &gmst);
#ifdef IERS_MODEL
time2epoch(tutc, ep);
year = (int)ep[0];
mon = (int)ep[1];
day = (int)ep[2];
fhr = ep[3] + ep[4] / 60.0 + ep[5] / 3600.0;
/* call DEHANTTIDEINEL */
dehanttideinel_((double *)rr, &year, &mon, &day, &fhr, rs, rm, drt);
#else
tide_solid(rs, rm, pos, E, gmst, opt, drt);
#endif
for (i = 0; i < 3; i++) dr[i] += drt[i];
}
if ((opt & 2) && odisp)
{ /* ocean tide loading */
tide_oload(tut, odisp, denu);
matmul("TN", 3, 1, 3, 1.0, E, denu, 0.0, drt);
for (i = 0; i < 3; i++) dr[i] += drt[i];
}
if ((opt & 4) && erp)
{ /* pole tide */
tide_pole(tut, pos, erpv, denu);
matmul("TN", 3, 1, 3, 1.0, E, denu, 0.0, drt);
for (i = 0; i < 3; i++) dr[i] += drt[i];
}
trace(5, "tidedisp: dr=%.3f %.3f %.3f\n", dr[0], dr[1], dr[2]);
}
/* exclude meas of eclipsing satellite (block IIA) ---------------------------*/
void testeclipse(const obsd_t *obs, int n, const nav_t *nav, double *rs)
{

View File

@ -129,21 +129,6 @@ int pppamb(rtk_t *rtk, const obsd_t *obs, int n, const nav_t *nav, const double
/* functions originally included in RTKLIB/src/ppp.c v2.4.2 */
void pppoutsolstat(rtk_t *rtk, int level, FILE *fp);
void tide_pl(const double *eu, const double *rp, double GMp, const double *pos, double *dr);
void tide_solid(const double *rsun, const double *rmoon,
const double *pos, const double *E, double gmst, int opt,
double *dr);
void tide_oload(gtime_t tut, const double *odisp, double *denu);
void iers_mean_pole(gtime_t tut, double *xp_bar, double *yp_bar);
void tide_pole(gtime_t tut, const double *pos, const double *erpv, double *denu);
void tidedisp(gtime_t tutc, const double *rr, int opt, const erp_t *erp,
const double *odisp, double *dr);
void testeclipse(const obsd_t *obs, int n, const nav_t *nav, double *rs);
double varerr(int sat, int sys, double el, int type, const prcopt_t *opt);

View File

@ -20,6 +20,10 @@ set(OBS_ADAPTER_SOURCES
hybrid_observables.cc
)
set(OBS_ADAPTER_HEADERS
hybrid_observables.h
)
include_directories(
${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_SOURCE_DIR}/src/core/system_parameters
@ -33,8 +37,6 @@ include_directories(
${GNURADIO_RUNTIME_INCLUDE_DIRS}
)
file(GLOB OBS_ADAPTER_HEADERS "*.h")
list(SORT OBS_ADAPTER_HEADERS)
add_library(obs_adapters ${OBS_ADAPTER_SOURCES} ${OBS_ADAPTER_HEADERS})
source_group(Headers FILES ${OBS_ADAPTER_HEADERS})
target_link_libraries(obs_adapters obs_gr_blocks ${GNURADIO_RUNTIME_LIBRARIES})

View File

@ -20,6 +20,10 @@ set(OBS_GR_BLOCKS_SOURCES
hybrid_observables_cc.cc
)
set(OBS_GR_BLOCKS_HEADERS
hybrid_observables_cc.h
)
include_directories(
${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_SOURCE_DIR}/src/core/system_parameters
@ -34,8 +38,6 @@ include_directories(
${MATIO_INCLUDE_DIRS}
)
file(GLOB OBS_GR_BLOCKS_HEADERS "*.h")
list(SORT OBS_GR_BLOCKS_HEADERS)
add_library(obs_gr_blocks ${OBS_GR_BLOCKS_SOURCES} ${OBS_GR_BLOCKS_HEADERS})
source_group(Headers FILES ${OBS_GR_BLOCKS_HEADERS})
if(MATIO_FOUND)

View File

@ -21,6 +21,12 @@ set(RESAMPLER_ADAPTER_SOURCES
mmse_resampler_conditioner.cc
)
set(RESAMPLER_ADAPTER_HEADERS
direct_resampler_conditioner.h
mmse_resampler_conditioner.h
)
include_directories(
${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_SOURCE_DIR}/src/core/interfaces
@ -36,9 +42,9 @@ if(${PC_GNURADIO_RUNTIME_VERSION} VERSION_GREATER "3.7.13.4" )
add_definitions( -DGR_GREATER_38=1 )
endif(${PC_GNURADIO_RUNTIME_VERSION} VERSION_GREATER "3.7.13.4" )
file(GLOB RESAMPLER_ADAPTER_HEADERS "*.h")
list(SORT RESAMPLER_ADAPTER_HEADERS)
list(SORT RESAMPLER_ADAPTER_SOURCES)
add_library(resampler_adapters ${RESAMPLER_ADAPTER_SOURCES} ${RESAMPLER_ADAPTER_HEADERS})
source_group(Headers FILES ${RESAMPLER_ADAPTER_HEADERS})
target_link_libraries(resampler_adapters resampler_gr_blocks)

View File

@ -23,6 +23,12 @@ set(RESAMPLER_GR_BLOCKS_SOURCES
direct_resampler_conditioner_cb.cc
)
set(RESAMPLER_GR_BLOCKS_HEADERS
direct_resampler_conditioner_cc.h
direct_resampler_conditioner_cs.h
direct_resampler_conditioner_cb.h
)
include_directories(
${CMAKE_CURRENT_SOURCE_DIR}
${GLOG_INCLUDE_DIRS}
@ -31,8 +37,9 @@ include_directories(
${VOLK_INCLUDE_DIRS}
)
file(GLOB RESAMPLER_GR_BLOCKS_HEADERS "*.h")
list(SORT RESAMPLER_GR_BLOCKS_HEADERS)
list(SORT RESAMPLER_GR_BLOCKS_SOURCES)
add_library(resampler_gr_blocks ${RESAMPLER_GR_BLOCKS_SOURCES} ${RESAMPLER_GR_BLOCKS_HEADERS})
source_group(Headers FILES ${RESAMPLER_GR_BLOCKS_HEADERS})
add_dependencies(resampler_gr_blocks glog-${glog_RELEASE})

View File

@ -17,6 +17,7 @@
#
set(SIGNAL_GENERATOR_ADAPTER_SOURCES signal_generator.cc)
set(SIGNAL_GENERATOR_ADAPTER_HEADERS signal_generator.h)
include_directories(
${CMAKE_CURRENT_SOURCE_DIR}
@ -30,8 +31,6 @@ include_directories(
${GNURADIO_RUNTIME_INCLUDE_DIRS}
)
file(GLOB SIGNAL_GENERATOR_ADAPTER_HEADERS "*.h")
list(SORT SIGNAL_GENERATOR_ADAPTER_HEADERS)
add_library(signal_generator_adapters ${SIGNAL_GENERATOR_ADAPTER_SOURCES} ${SIGNAL_GENERATOR_ADAPTER_HEADERS})
source_group(Headers FILES ${SIGNAL_GENERATOR_ADAPTER_HEADERS})
target_link_libraries(signal_generator_adapters gnss_sp_libs

View File

@ -17,6 +17,7 @@
#
set(SIGNAL_GENERATOR_BLOCK_SOURCES signal_generator_c.cc)
set(SIGNAL_GENERATOR_BLOCK_HEADERS signal_generator_c.h)
include_directories(
${CMAKE_CURRENT_SOURCE_DIR}
@ -30,8 +31,6 @@ include_directories(
${VOLK_GNSSSDR_INCLUDE_DIRS}
)
file(GLOB SIGNAL_GENERATOR_BLOCK_HEADERS "*.h")
list(SORT SIGNAL_GENERATOR_BLOCK_HEADERS)
add_library(signal_generator_blocks ${SIGNAL_GENERATOR_BLOCK_SOURCES} ${SIGNAL_GENERATOR_BLOCK_HEADERS})
source_group(Headers FILES ${SIGNAL_GENERATOR_BLOCK_HEADERS})
target_link_libraries(signal_generator_blocks gnss_system_parameters gnss_sp_libs
@ -44,4 +43,4 @@ if(VOLK_GNSSSDR_FOUND)
# add_dependencies(signal_generator_blocks glog-${glog_RELEASE})
else(VOLK_GNSSSDR_FOUND)
add_dependencies(signal_generator_blocks volk_gnsssdr_module)
endif()
endif(VOLK_GNSSSDR_FOUND)

View File

@ -16,8 +16,6 @@
# along with GNSS-SDR. If not, see <https://www.gnu.org/licenses/>.
#
file(GLOB SIGNAL_SOURCE_ADAPTER_HEADERS "*.h")
list(SORT SIGNAL_SOURCE_ADAPTER_HEADERS)
# Optional drivers
@ -30,6 +28,7 @@ if(ENABLE_RAW_UDP)
set(OPT_LIBRARIES ${OPT_LIBRARIES} ${PCAP_LIBRARIES})
set(OPT_DRIVER_INCLUDE_DIRS ${OPT_DRIVER_INCLUDE_DIRS} ${PCAP_INCLUDE_DIRS})
set(OPT_DRIVER_SOURCES ${OPT_DRIVER_SOURCES} custom_udp_signal_source.cc)
set(OPT_DRIVER_HEADERS ${OPT_DRIVER_HEADERS} custom_udp_signal_source.h)
endif(ENABLE_RAW_UDP)
if(ENABLE_PLUTOSDR OR ENABLE_FMCOMMS2)
@ -67,6 +66,7 @@ if(ENABLE_PLUTOSDR)
##############################################
if(IIO_FOUND)
set(OPT_DRIVER_SOURCES ${OPT_DRIVER_SOURCES} plutosdr_signal_source.cc)
set(OPT_DRIVER_HEADERS ${OPT_DRIVER_HEADERS} plutosdr_signal_source.h)
endif(IIO_FOUND)
endif(ENABLE_PLUTOSDR)
@ -77,6 +77,7 @@ if(ENABLE_FMCOMMS2)
###############################################
if(IIO_FOUND)
set(OPT_DRIVER_SOURCES ${OPT_DRIVER_SOURCES} fmcomms2_signal_source.cc)
set(OPT_DRIVER_HEADERS ${OPT_DRIVER_HEADERS} fmcomms2_signal_source.h)
endif(IIO_FOUND)
endif(ENABLE_FMCOMMS2)
@ -86,6 +87,7 @@ if(ENABLE_AD9361)
###############################################
if(LIBIIO_FOUND)
set(OPT_DRIVER_SOURCES ${OPT_DRIVER_SOURCES} ad9361_fpga_signal_source.cc)
set(OPT_DRIVER_HEADERS ${OPT_DRIVER_HEADERS} ad9361_fpga_signal_source.h)
endif(LIBIIO_FOUND)
endif(ENABLE_AD9361)
@ -103,6 +105,7 @@ if(ENABLE_GN3S)
set(OPT_LIBRARIES ${OPT_LIBRARIES} ${GR_GN3S_LIBRARIES})
set(OPT_DRIVER_INCLUDE_DIRS ${OPT_DRIVER_INCLUDE_DIRS} ${GR_GN3S_INCLUDE_DIRS})
set(OPT_DRIVER_SOURCES ${OPT_DRIVER_SOURCES} gn3s_signal_source.cc)
set(OPT_DRIVER_HEADERS ${OPT_DRIVER_HEADERS} gn3s_signal_source.h)
endif(ENABLE_GN3S)
@ -123,6 +126,7 @@ if(ENABLE_FLEXIBAND)
set(OPT_LIBRARIES ${OPT_LIBRARIES} ${TELEORBIT_LIBRARIES})
set(OPT_DRIVER_INCLUDE_DIRS ${OPT_DRIVER_INCLUDE_DIRS} ${FLEXIBAND_DRIVER_INCLUDE_DIRS})
set(OPT_DRIVER_SOURCES ${OPT_DRIVER_SOURCES} flexiband_signal_source.cc)
set(OPT_DRIVER_HEADERS ${OPT_DRIVER_HEADERS} flexiband_signal_source.h)
endif(ENABLE_FLEXIBAND)
@ -138,6 +142,7 @@ if(ENABLE_ARRAY)
set(OPT_LIBRARIES ${OPT_LIBRARIES} ${GR_DBFCTTC_LIBRARIES})
set(OPT_DRIVER_INCLUDE_DIRS ${OPT_DRIVER_INCLUDE_DIRS} ${GR_DBFCTTC_INCLUDE_DIRS})
set(OPT_DRIVER_SOURCES ${OPT_DRIVER_SOURCES} raw_array_signal_source.cc)
set(OPT_DRIVER_HEADERS ${OPT_DRIVER_HEADERS} raw_array_signal_source.h)
endif(ENABLE_ARRAY)
@ -154,8 +159,9 @@ if(ENABLE_OSMOSDR)
set(OSMO_DRIVER_INCLUDE_DIRS
${OPT_DRIVER_INCLUDE_DIRS}
${GROSMOSDR_INCLUDE_DIR}/osmosdr
)
)
set(OPT_DRIVER_SOURCES ${OPT_DRIVER_SOURCES} osmosdr_signal_source.cc)
set(OPT_DRIVER_HEADERS ${OPT_DRIVER_HEADERS} osmosdr_signal_source.h)
set(OPT_LIBRARIES ${OPT_LIBRARIES} ${GROSMOSDR_LIBRARIES})
set(OPT_DRIVER_INCLUDE_DIRS ${OPT_DRIVER_INCLUDE_DIRS} ${OSMO_DRIVER_INCLUDE_DIRS})
endif(NOT GROSMOSDR_FOUND)
@ -163,10 +169,9 @@ endif(ENABLE_OSMOSDR)
if(ENABLE_UHD AND GNURADIO_UHD_LIBRARIES_gnuradio-uhd)
set(OPT_DRIVER_SOURCES ${OPT_DRIVER_SOURCES} uhd_signal_source.cc)
set(OPT_DRIVER_HEADERS ${OPT_DRIVER_HEADERS} uhd_signal_source.h)
set(OPT_LIBRARIES ${OPT_LIBRARIES} ${UHD_LIBRARIES} ${GNURADIO_UHD_LIBRARIES})
set(OPT_DRIVER_INCLUDE_DIRS ${OPT_DRIVER_INCLUDE_DIRS} ${UHD_INCLUDE_DIRS})
else(ENABLE_UHD AND GNURADIO_UHD_LIBRARIES_gnuradio-uhd)
list(REMOVE_ITEM SIGNAL_SOURCE_ADAPTER_HEADERS ${CMAKE_SOURCE_DIR}/src/algorithms/signal_source/adapters/uhd_signal_source.h)
endif(ENABLE_UHD AND GNURADIO_UHD_LIBRARIES_gnuradio-uhd)
@ -180,10 +185,24 @@ set(SIGNAL_SOURCE_ADAPTER_SOURCES file_signal_source.cc
${OPT_DRIVER_SOURCES}
)
set(SIGNAL_SOURCE_ADAPTER_HEADERS file_signal_source.h
gen_signal_source.h
nsr_file_signal_source.h
spir_file_signal_source.h
spir_gss6450_file_signal_source.h
rtl_tcp_signal_source.h
labsat_signal_source.h
${OPT_DRIVER_HEADERS}
)
if(PC_GNURADIO_RUNTIME_VERSION VERSION_GREATER 3.7.3)
set(SIGNAL_SOURCE_ADAPTER_SOURCES ${SIGNAL_SOURCE_ADAPTER_SOURCES}
two_bit_cpx_file_signal_source.cc
two_bit_packed_file_signal_source.cc )
set(SIGNAL_SOURCE_ADAPTER_HEADERS ${SIGNAL_SOURCE_ADAPTER_HEADERS}
two_bit_cpx_file_signal_source.h
two_bit_packed_file_signal_source.h )
endif(PC_GNURADIO_RUNTIME_VERSION VERSION_GREATER 3.7.3)
include_directories(
@ -207,6 +226,9 @@ endif(ARCH_64BITS)
add_definitions(-DGNSSSDR_INSTALL_DIR="${CMAKE_INSTALL_PREFIX}")
list(SORT SIGNAL_SOURCE_ADAPTER_HEADERS)
list(SORT SIGNAL_SOURCE_ADAPTER_SOURCES)
add_library(signal_source_adapters ${SIGNAL_SOURCE_ADAPTER_SOURCES} ${SIGNAL_SOURCE_ADAPTER_HEADERS})
source_group(Headers FILES ${SIGNAL_SOURCE_ADAPTER_HEADERS})
target_link_libraries(signal_source_adapters signal_source_gr_blocks

View File

@ -26,8 +26,10 @@ if(ENABLE_RAW_UDP)
set(OPT_LIBRARIES ${OPT_LIBRARIES} ${PCAP_LIBRARIES})
set(OPT_DRIVER_INCLUDE_DIRS ${OPT_DRIVER_INCLUDE_DIRS} ${PCAP_INCLUDE_DIRS})
set(OPT_DRIVER_SOURCES ${OPT_DRIVER_SOURCES} gr_complex_ip_packet_source.cc)
set(OPT_DRIVER_HEADERS ${OPT_DRIVER_HEADERS} gr_complex_ip_packet_source.h)
endif(ENABLE_RAW_UDP)
set(SIGNAL_SOURCE_GR_BLOCKS_SOURCES
unpack_byte_2bit_samples.cc
unpack_byte_2bit_cpx_samples.cc
@ -40,6 +42,19 @@ set(SIGNAL_SOURCE_GR_BLOCKS_SOURCES
${OPT_DRIVER_SOURCES}
)
set(SIGNAL_SOURCE_GR_BLOCKS_HEADERS
unpack_byte_2bit_samples.h
unpack_byte_2bit_cpx_samples.h
unpack_byte_4bit_samples.h
unpack_intspir_1bit_samples.h
rtl_tcp_signal_source_c.h
unpack_2bit_samples.h
unpack_spir_gss6450_samples.h
labsat23_source.h
${OPT_DRIVER_HEADERS}
)
include_directories(
${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_SOURCE_DIR}/src/algorithms/signal_source/libs
@ -50,8 +65,9 @@ include_directories(
${OPT_DRIVER_INCLUDE_DIRS}
)
file(GLOB SIGNAL_SOURCE_GR_BLOCKS_HEADERS "*.h")
list(SORT SIGNAL_SOURCE_GR_BLOCKS_HEADERS)
list(SORT SIGNAL_SOURCE_GR_BLOCKS_SOURCES)
add_library(signal_source_gr_blocks ${SIGNAL_SOURCE_GR_BLOCKS_SOURCES} ${SIGNAL_SOURCE_GR_BLOCKS_HEADERS})
source_group(Headers FILES ${SIGNAL_SOURCE_GR_BLOCKS_HEADERS})
target_link_libraries(signal_source_gr_blocks

View File

@ -63,21 +63,23 @@ include_directories(
${GLOG_INCLUDE_DIRS}
${GFlags_INCLUDE_DIRS}
${OPT_DRIVER_INCLUDE_DIRS}
)
)
set(SIGNAL_SOURCE_LIB_SOURCES
rtl_tcp_commands.cc
rtl_tcp_dongle_info.cc
${OPT_SIGNAL_SOURCE_LIB_SOURCES}
)
)
set(SIGNAL_SOURCE_LIB_HEADERS
rtl_tcp_commands.h
rtl_tcp_dongle_info.h
${OPT_SIGNAL_SOURCE_LIB_HEADERS}
)
)
list(SORT SIGNAL_SOURCE_LIB_HEADERS)
list(SORT SIGNAL_SOURCE_LIB_SOURCES)
add_library(signal_source_lib ${SIGNAL_SOURCE_LIB_SOURCES} ${SIGNAL_SOURCE_LIB_HEADERS})
source_group(Headers FILES ${SIGNAL_SOURCE_LIB_HEADERS})
target_link_libraries(signal_source_lib ${OPT_LIBRARIES})

View File

@ -28,6 +28,17 @@ set(TELEMETRY_DECODER_ADAPTER_SOURCES
glonass_l2_ca_telemetry_decoder.cc
)
set(TELEMETRY_DECODER_ADAPTER_HEADERS
gps_l1_ca_telemetry_decoder.h
gps_l2c_telemetry_decoder.h
gps_l5_telemetry_decoder.h
galileo_e1b_telemetry_decoder.h
sbas_l1_telemetry_decoder.h
galileo_e5a_telemetry_decoder.h
glonass_l1_ca_telemetry_decoder.h
glonass_l2_ca_telemetry_decoder.h
)
include_directories(
${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_SOURCE_DIR}/src/core/system_parameters
@ -42,8 +53,9 @@ include_directories(
${GNURADIO_RUNTIME_INCLUDE_DIRS}
)
file(GLOB TELEMETRY_DECODER_ADAPTER_HEADERS "*.h")
list(SORT TELEMETRY_DECODER_ADAPTER_HEADERS)
list(SORT TELEMETRY_DECODER_ADAPTER_SOURCES)
add_library(telemetry_decoder_adapters ${TELEMETRY_DECODER_ADAPTER_SOURCES} ${TELEMETRY_DECODER_ADAPTER_HEADERS})
source_group(Headers FILES ${TELEMETRY_DECODER_ADAPTER_HEADERS})
target_link_libraries(telemetry_decoder_adapters telemetry_decoder_gr_blocks gnss_system_parameters ${GNURADIO_RUNTIME_LIBRARIES})

View File

@ -26,6 +26,16 @@ set(TELEMETRY_DECODER_GR_BLOCKS_SOURCES
galileo_telemetry_decoder_cc.cc
)
set(TELEMETRY_DECODER_GR_BLOCKS_HEADERS
gps_l1_ca_telemetry_decoder_cc.h
gps_l2c_telemetry_decoder_cc.h
gps_l5_telemetry_decoder_cc.h
sbas_l1_telemetry_decoder_cc.h
glonass_l1_ca_telemetry_decoder_cc.h
glonass_l2_ca_telemetry_decoder_cc.h
galileo_telemetry_decoder_cc.h
)
include_directories(
${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_SOURCE_DIR}/src/core/system_parameters
@ -39,8 +49,9 @@ include_directories(
${VOLK_GNSSSDR_INCLUDE_DIRS}
)
file(GLOB TELEMETRY_DECODER_GR_BLOCKS_HEADERS "*.h")
list(SORT TELEMETRY_DECODER_GR_BLOCKS_HEADERS)
list(SORT TELEMETRY_DECODER_GR_BLOCKS_SOURCES)
add_library(telemetry_decoder_gr_blocks ${TELEMETRY_DECODER_GR_BLOCKS_SOURCES} ${TELEMETRY_DECODER_GR_BLOCKS_HEADERS})
source_group(Headers FILES ${TELEMETRY_DECODER_GR_BLOCKS_HEADERS})
target_link_libraries(telemetry_decoder_gr_blocks telemetry_decoder_libswiftcnav telemetry_decoder_lib gnss_system_parameters ${GNURADIO_RUNTIME_LIBRARIES} ${VOLK_GNSSSDR_LIBRARIES})

View File

@ -22,6 +22,11 @@ set(TELEMETRY_DECODER_LIB_SOURCES
viterbi_decoder.cc
)
set(TELEMETRY_DECODER_LIB_HEADERS
viterbi_decoder.h
convolutional.h
)
include_directories(
${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_SOURCE_DIR}/src/core/system_parameters
@ -33,9 +38,9 @@ include_directories(
${GFlags_INCLUDE_DIRS}
)
file(GLOB TELEMETRY_DECODER_LIB_HEADERS "*.h")
list(SORT TELEMETRY_DECODER_LIB_HEADERS)
list(SORT TELEMETRY_DECODER_LIB_SOURCES)
add_library(telemetry_decoder_lib ${TELEMETRY_DECODER_LIB_SOURCES} ${TELEMETRY_DECODER_LIB_HEADERS})
source_group(Headers FILES ${TELEMETRY_DECODER_LIB_HEADERS})
target_link_libraries(telemetry_decoder_lib gnss_system_parameters)

View File

@ -23,13 +23,21 @@ set(TELEMETRY_DECODER_LIBSWIFTCNAV_SOURCES
viterbi27.c
)
set(TELEMETRY_DECODER_LIBSWIFTCNAV_HEADERS
cnav_msg.h
bits.h
edc.h
swift_common.h
fec.h
)
include_directories(
${CMAKE_CURRENT_SOURCE_DIR}
)
file(GLOB TELEMETRY_DECODER_LIBSWIFTCNAV_HEADERS "*.h")
list(SORT TELEMETRY_DECODER_LIBSWIFTCNAV_HEADERS)
list(SORT TELEMETRY_DECODER_LIBSWIFTCNAV_SOURCES)
add_library(telemetry_decoder_libswiftcnav STATIC ${TELEMETRY_DECODER_LIBSWIFTCNAV_SOURCES} ${TELEMETRY_DECODER_LIBSWIFTCNAV_HEADERS})
source_group(Headers FILES ${TELEMETRY_DECODER_LIBSWIFTCNAV_HEADERS})
set_target_properties(telemetry_decoder_libswiftcnav PROPERTIES LINKER_LANGUAGE C)
set_target_properties(telemetry_decoder_libswiftcnav PROPERTIES LINKER_LANGUAGE C)

View File

@ -17,12 +17,25 @@
#
if(ENABLE_CUDA)
set(OPT_TRACKING_ADAPTERS ${OPT_TRACKING_ADAPTERS} gps_l1_ca_dll_pll_tracking_gpu.cc)
set(OPT_TRACKING_ADAPTERS_SOURCES ${OPT_TRACKING_ADAPTERS_SOURCES} gps_l1_ca_dll_pll_tracking_gpu.cc)
set(OPT_TRACKING_ADAPTERS_HEADERS ${OPT_TRACKING_ADAPTERS_HEADERS} gps_l1_ca_dll_pll_tracking_gpu.h)
set(OPT_TRACKING_INCLUDE_DIRS ${OPT_TRACKING_INCLUDE_DIRS} ${CUDA_INCLUDE_DIRS})
endif(ENABLE_CUDA)
if(ENABLE_FPGA)
SET(OPT_TRACKING_ADAPTERS ${OPT_TRACKING_ADAPTERS} gps_l1_ca_dll_pll_tracking_fpga.cc gps_l2_m_dll_pll_tracking_fpga.cc galileo_e1_dll_pll_veml_tracking_fpga.cc galileo_e5a_dll_pll_tracking_fpga.cc gps_l5_dll_pll_tracking_fpga.cc)
set(OPT_TRACKING_ADAPTERS_SOURCES ${OPT_TRACKING_ADAPTERS_SOURCES}
gps_l1_ca_dll_pll_tracking_fpga.cc
gps_l2_m_dll_pll_tracking_fpga.cc
galileo_e1_dll_pll_veml_tracking_fpga.cc
galileo_e5a_dll_pll_tracking_fpga.cc
gps_l5_dll_pll_tracking_fpga.cc)
set(OPT_TRACKING_ADAPTERS_HEADERS ${OPT_TRACKING_ADAPTERS_HEADERS}
gps_l1_ca_dll_pll_tracking_fpga.h
gps_l2_m_dll_pll_tracking_fpga.h
galileo_e1_dll_pll_veml_tracking_fpga.h
galileo_e5a_dll_pll_tracking_fpga.h
gps_l5_dll_pll_tracking_fpga.h)
endif(ENABLE_FPGA)
set(TRACKING_ADAPTER_SOURCES
@ -39,7 +52,24 @@ set(TRACKING_ADAPTER_SOURCES
gps_l5_dll_pll_tracking.cc
glonass_l2_ca_dll_pll_tracking.cc
glonass_l2_ca_dll_pll_c_aid_tracking.cc
${OPT_TRACKING_ADAPTERS}
${OPT_TRACKING_ADAPTERS_SOURCES}
)
set(TRACKING_ADAPTER_HEADERS
galileo_e1_dll_pll_veml_tracking.h
galileo_e1_tcp_connector_tracking.h
gps_l1_ca_dll_pll_tracking.h
gps_l1_ca_dll_pll_c_aid_tracking.h
gps_l1_ca_tcp_connector_tracking.h
galileo_e5a_dll_pll_tracking.h
gps_l2_m_dll_pll_tracking.h
glonass_l1_ca_dll_pll_tracking.h
glonass_l1_ca_dll_pll_c_aid_tracking.h
gps_l1_ca_kf_tracking.h
gps_l5_dll_pll_tracking.h
glonass_l2_ca_dll_pll_tracking.h
glonass_l2_ca_dll_pll_c_aid_tracking.h
${OPT_TRACKING_ADAPTERS_HEADERS}
)
include_directories(
@ -58,8 +88,9 @@ include_directories(
${OPT_TRACKING_INCLUDE_DIRS}
)
file(GLOB TRACKING_ADAPTER_HEADERS "*.h")
list(SORT TRACKING_ADAPTER_HEADERS)
list(SORT TRACKING_ADAPTER_SOURCES)
add_library(tracking_adapters ${TRACKING_ADAPTER_SOURCES} ${TRACKING_ADAPTER_HEADERS})
source_group(Headers FILES ${TRACKING_ADAPTER_HEADERS})
target_link_libraries(tracking_adapters tracking_gr_blocks gnss_sp_libs gnss_sdr_flags)

View File

@ -17,13 +17,15 @@
#
if(ENABLE_CUDA)
set(OPT_TRACKING_BLOCKS ${OPT_TRACKING_BLOCKS} gps_l1_ca_dll_pll_tracking_gpu_cc.cc)
set(OPT_TRACKING_BLOCKS_SOURCES ${OPT_TRACKING_BLOCKS_SOURCES} gps_l1_ca_dll_pll_tracking_gpu_cc.cc)
set(OPT_TRACKING_BLOCKS_HEADERS ${OPT_TRACKING_BLOCKS_HEADERS} gps_l1_ca_dll_pll_tracking_gpu_cc.h)
set(OPT_TRACKING_INCLUDES ${OPT_TRACKING_INCLUDES} ${CUDA_INCLUDE_DIRS})
set(OPT_TRACKING_LIBRARIES ${OPT_TRACKING_LIBRARIES} ${CUDA_LIBRARIES})
endif(ENABLE_CUDA)
if(ENABLE_FPGA)
set(OPT_TRACKING_BLOCKS ${OPT_TRACKING_BLOCKS} dll_pll_veml_tracking_fpga.cc)
set(OPT_TRACKING_BLOCKS_SOURCES ${OPT_TRACKING_BLOCKS_SOURCES} dll_pll_veml_tracking_fpga.cc)
set(OPT_TRACKING_BLOCKS_HEADERS ${OPT_TRACKING_BLOCKS_HEADERS} dll_pll_veml_tracking_fpga.h)
endif(ENABLE_FPGA)
set(TRACKING_GR_BLOCKS_SOURCES
@ -39,7 +41,23 @@ set(TRACKING_GR_BLOCKS_SOURCES
glonass_l2_ca_dll_pll_c_aid_tracking_cc.cc
glonass_l2_ca_dll_pll_c_aid_tracking_sc.cc
dll_pll_veml_tracking.cc
${OPT_TRACKING_BLOCKS}
${OPT_TRACKING_BLOCKS_SOURCES}
)
set(TRACKING_GR_BLOCKS_HEADERS
galileo_e1_tcp_connector_tracking_cc.h
gps_l1_ca_tcp_connector_tracking_cc.h
gps_l1_ca_dll_pll_c_aid_tracking_cc.h
gps_l1_ca_dll_pll_c_aid_tracking_sc.h
glonass_l1_ca_dll_pll_tracking_cc.h
glonass_l1_ca_dll_pll_c_aid_tracking_cc.h
glonass_l1_ca_dll_pll_c_aid_tracking_sc.h
gps_l1_ca_kf_tracking_cc.h
glonass_l2_ca_dll_pll_tracking_cc.h
glonass_l2_ca_dll_pll_c_aid_tracking_cc.h
glonass_l2_ca_dll_pll_c_aid_tracking_sc.h
dll_pll_veml_tracking.h
${OPT_TRACKING_BLOCKS_HEADERS}
)
include_directories(
@ -63,8 +81,9 @@ if(ENABLE_GENERIC_ARCH)
add_definitions( -DGENERIC_ARCH=1 )
endif(ENABLE_GENERIC_ARCH)
file(GLOB TRACKING_GR_BLOCKS_HEADERS "*.h")
list(SORT TRACKING_GR_BLOCKS_HEADERS)
list(SORT TRACKING_GR_BLOCKS_SOURCES)
add_library(tracking_gr_blocks ${TRACKING_GR_BLOCKS_SOURCES} ${TRACKING_GR_BLOCKS_HEADERS})
source_group(Headers FILES ${TRACKING_GR_BLOCKS_HEADERS})

View File

@ -30,7 +30,6 @@ if(ENABLE_CUDA)
endif(ENABLE_CUDA)
set(TRACKING_LIB_SOURCES
cpu_multicorrelator.cc
cpu_multicorrelator_real_codes.cc
@ -47,8 +46,25 @@ set(TRACKING_LIB_SOURCES
bayesian_estimation.cc
)
set(TRACKING_LIB_HEADERS
cpu_multicorrelator.h
cpu_multicorrelator_real_codes.h
cpu_multicorrelator_16sc.h
lock_detectors.h
tcp_communication.h
tcp_packet_data.h
tracking_2nd_DLL_filter.h
tracking_2nd_PLL_filter.h
tracking_discriminators.h
tracking_FLL_PLL_filter.h
tracking_loop_filter.h
dll_pll_conf.h
bayesian_estimation.h
)
if(ENABLE_FPGA)
SET(TRACKING_LIB_SOURCES ${TRACKING_LIB_SOURCES} fpga_multicorrelator.cc dll_pll_conf_fpga.cc)
set(TRACKING_LIB_SOURCES ${TRACKING_LIB_SOURCES} fpga_multicorrelator.cc dll_pll_conf_fpga.cc)
set(TRACKING_LIB_HEADERS ${TRACKING_LIB_HEADERS} fpga_multicorrelator.h dll_pll_conf_fpga.h)
endif(ENABLE_FPGA)
include_directories(
@ -74,8 +90,9 @@ if (SSE3_AVAILABLE)
endif(SSE3_AVAILABLE)
file(GLOB TRACKING_LIB_HEADERS "*.h")
list(SORT TRACKING_LIB_HEADERS)
list(SORT TRACKING_LIB_SOURCES)
add_library(tracking_lib ${TRACKING_LIB_SOURCES} ${TRACKING_LIB_HEADERS})
source_group(Headers FILES ${TRACKING_LIB_HEADERS})
target_link_libraries(tracking_lib ${OPT_TRACKING_LIBRARIES} ${VOLK_LIBRARIES} ${VOLK_GNSSSDR_LIBRARIES} ${Boost_LIBRARIES} ${GNURADIO_RUNTIME_LIBRARIES})

View File

@ -23,11 +23,18 @@ if(OPENSSL_FOUND)
endif(OPENSSL_FOUND)
set(CORE_LIBS_SOURCES
ini.cc
INIReader.cc
ini.cc
INIReader.cc
string_converter.cc
gnss_sdr_supl_client.cc
)
set(CORE_LIBS_HEADERS
ini.h
INIReader.h
string_converter.h
gnss_sdr_supl_client.h
)
include_directories(
${CMAKE_CURRENT_SOURCE_DIR}
@ -40,8 +47,9 @@ include_directories(
${Boost_INCLUDE_DIRS}
)
file(GLOB CORE_LIBS_HEADERS "*.h")
list(SORT CORE_LIBS_HEADERS)
list(SORT CORE_LIBS_SOURCES)
add_library(rx_core_lib ${CORE_LIBS_SOURCES} ${CORE_LIBS_HEADERS})
source_group(Headers FILES ${CORE_LIBS_HEADERS})
target_link_libraries(rx_core_lib supl_library)

View File

@ -370,13 +370,13 @@ void gnss_sdr_supl_client::read_supl_data()
bool gnss_sdr_supl_client::load_ephemeris_xml(const std::string file_name)
{
std::ifstream ifs;
try
{
std::ifstream ifs(file_name.c_str(), std::ifstream::binary | std::ifstream::in);
ifs.open(file_name.c_str(), std::ifstream::binary | std::ifstream::in);
boost::archive::xml_iarchive xml(ifs);
gps_ephemeris_map.clear();
xml >> boost::serialization::make_nvp("GNSS-SDR_ephemeris_map", this->gps_ephemeris_map);
ifs.close();
LOG(INFO) << "Loaded Ephemeris map data with " << this->gps_ephemeris_map.size() << " satellites";
}
catch (std::exception& e)
@ -392,12 +392,12 @@ bool gnss_sdr_supl_client::save_ephemeris_map_xml(const std::string file_name, s
{
if (eph_map.empty() == false)
{
std::ofstream ofs;
try
{
std::ofstream ofs(file_name.c_str(), std::ofstream::trunc | std::ofstream::out);
ofs.open(file_name.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);
ofs.close();
LOG(INFO) << "Saved Ephemeris map data";
}
catch (std::exception& e)
@ -405,24 +405,24 @@ bool gnss_sdr_supl_client::save_ephemeris_map_xml(const std::string file_name, s
LOG(WARNING) << e.what();
return false;
}
return true;
}
else
{
LOG(WARNING) << "Failed to save Ephemeris, map is empty";
return false;
}
return true;
}
bool gnss_sdr_supl_client::load_utc_xml(const std::string file_name)
{
std::ifstream ifs;
try
{
std::ifstream ifs(file_name.c_str(), std::ifstream::binary | std::ifstream::in);
ifs.open(file_name.c_str(), std::ifstream::binary | std::ifstream::in);
boost::archive::xml_iarchive xml(ifs);
xml >> boost::serialization::make_nvp("GNSS-SDR_utc_map", this->gps_utc);
ifs.close();
LOG(INFO) << "Loaded UTC model data";
}
catch (std::exception& e)
@ -438,12 +438,12 @@ bool gnss_sdr_supl_client::save_utc_map_xml(const std::string file_name, std::ma
{
if (utc_map.empty() == false)
{
std::ofstream ofs;
try
{
std::ofstream ofs(file_name.c_str(), std::ofstream::trunc | std::ofstream::out);
ofs.open(file_name.c_str(), std::ofstream::trunc | std::ofstream::out);
boost::archive::xml_oarchive xml(ofs);
xml << boost::serialization::make_nvp("GNSS-SDR_utc_map", utc_map);
ofs.close();
LOG(INFO) << "Saved UTC Model data";
}
catch (std::exception& e)
@ -451,24 +451,24 @@ bool gnss_sdr_supl_client::save_utc_map_xml(const std::string file_name, std::ma
LOG(WARNING) << e.what();
return false;
}
return true;
}
else
{
LOG(WARNING) << "Failed to save UTC model, map is empty";
return false;
}
return true;
}
bool gnss_sdr_supl_client::load_iono_xml(const std::string file_name)
{
std::ifstream ifs;
try
{
std::ifstream ifs(file_name.c_str(), std::ifstream::binary | std::ifstream::in);
ifs.open(file_name.c_str(), std::ifstream::binary | std::ifstream::in);
boost::archive::xml_iarchive xml(ifs);
xml >> boost::serialization::make_nvp("GNSS-SDR_iono_map", this->gps_iono);
ifs.close();
LOG(INFO) << "Loaded IONO model data";
}
catch (std::exception& e)
@ -484,12 +484,12 @@ bool gnss_sdr_supl_client::save_iono_map_xml(const std::string file_name, std::m
{
if (iono_map.empty() == false)
{
std::ofstream ofs;
try
{
std::ofstream ofs(file_name.c_str(), std::ofstream::trunc | std::ofstream::out);
ofs.open(file_name.c_str(), std::ofstream::trunc | std::ofstream::out);
boost::archive::xml_oarchive xml(ofs);
xml << boost::serialization::make_nvp("GNSS-SDR_iono_map", iono_map);
ofs.close();
LOG(INFO) << "Saved IONO Model data";
}
catch (std::exception& e)
@ -497,24 +497,24 @@ bool gnss_sdr_supl_client::save_iono_map_xml(const std::string file_name, std::m
LOG(WARNING) << e.what();
return false;
}
return true;
}
else
{
LOG(WARNING) << "Failed to save IONO model, map is empty";
return false;
}
return true;
}
bool gnss_sdr_supl_client::load_ref_time_xml(const std::string file_name)
{
std::ifstream ifs;
try
{
std::ifstream ifs(file_name.c_str(), std::ifstream::binary | std::ifstream::in);
ifs.open(file_name.c_str(), std::ifstream::binary | std::ifstream::in);
boost::archive::xml_iarchive xml(ifs);
xml >> boost::serialization::make_nvp("GNSS-SDR_ref_time_map", this->gps_time);
ifs.close();
LOG(INFO) << "Loaded Ref Time data";
}
catch (std::exception& e)
@ -530,12 +530,13 @@ bool gnss_sdr_supl_client::save_ref_time_map_xml(const std::string file_name, st
{
if (ref_time_map.empty() == false)
{
std::ofstream ofs;
try
{
std::ofstream ofs(file_name.c_str(), std::ofstream::trunc | std::ofstream::out);
ofs.open(file_name.c_str(), std::ofstream::trunc | std::ofstream::out);
boost::archive::xml_oarchive xml(ofs);
xml << boost::serialization::make_nvp("GNSS-SDR_ref_time_map", ref_time_map);
ofs.close();
LOG(INFO) << "Saved Ref Time data";
}
catch (std::exception& e)
@ -543,24 +544,24 @@ bool gnss_sdr_supl_client::save_ref_time_map_xml(const std::string file_name, st
LOG(WARNING) << e.what();
return false;
}
return true;
}
else
{
LOG(WARNING) << "Failed to save Ref Time, map is empty";
return false;
}
return true;
}
bool gnss_sdr_supl_client::load_ref_location_xml(const std::string file_name)
{
std::ifstream ifs;
try
{
std::ifstream ifs(file_name.c_str(), std::ifstream::binary | std::ifstream::in);
ifs.open(file_name.c_str(), std::ifstream::binary | std::ifstream::in);
boost::archive::xml_iarchive xml(ifs);
xml >> boost::serialization::make_nvp("GNSS-SDR_ref_location_map", this->gps_ref_loc);
ifs.close();
LOG(INFO) << "Loaded Ref Location data";
}
catch (std::exception& e)
@ -576,12 +577,12 @@ bool gnss_sdr_supl_client::save_ref_location_map_xml(const std::string file_name
{
if (ref_location_map.empty() == false)
{
std::ofstream ofs;
try
{
std::ofstream ofs(file_name.c_str(), std::ofstream::trunc | std::ofstream::out);
ofs.open(file_name.c_str(), std::ofstream::trunc | std::ofstream::out);
boost::archive::xml_oarchive xml(ofs);
xml << boost::serialization::make_nvp("GNSS-SDR_ref_location_map", ref_location_map);
ofs.close();
LOG(INFO) << "Saved Ref Location data";
}
catch (std::exception& e)
@ -589,11 +590,11 @@ bool gnss_sdr_supl_client::save_ref_location_map_xml(const std::string file_name
LOG(WARNING) << e.what();
return false;
}
return true;
}
else
{
LOG(WARNING) << "Failed to save Ref Location, map is empty";
return false;
}
return true;
}

View File

@ -21,7 +21,13 @@ set(CORE_MONITOR_LIBS_SOURCES
gnss_synchro_monitor.cc
gnss_synchro_udp_sink.cc
)
set(CORE_MONITOR_LIBS_HEADERS
gnss_synchro_monitor.h
gnss_synchro_udp_sink.h
)
include_directories(
${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_SOURCE_DIR}/src/core/system_parameters
@ -31,8 +37,9 @@ include_directories(
${Boost_INCLUDE_DIRS}
)
file(GLOB CORE_MONITOR_LIBS_HEADERS "*.h")
list(SORT CORE_MONITOR_LIBS_HEADERS)
list(SORT CORE_MONITOR_LIBS_SOURCES)
add_library(core_monitor_lib ${CORE_MONITOR_LIBS_SOURCES} ${CORE_MONITOR_LIBS_HEADERS})
source_group(Headers FILES ${CORE_MONITOR_LIBS_HEADERS})
target_link_libraries(core_monitor_lib ${Boost_LIBRARIES})

View File

@ -26,6 +26,17 @@ set(GNSS_RECEIVER_SOURCES
in_memory_configuration.cc
)
set(GNSS_RECEIVER_HEADERS
control_thread.h
control_message_factory.h
file_configuration.h
gnss_block_factory.h
gnss_flowgraph.h
in_memory_configuration.h
concurrent_map.h
concurrent_queue.h
control_message.h
)
if(PC_GNURADIO_RUNTIME_VERSION VERSION_GREATER 3.7.3)
add_definitions(-DMODERN_GNURADIO=1)
@ -149,10 +160,21 @@ include_directories(
${VOLK_GNSSSDR_INCLUDE_DIRS}
)
file(GLOB GNSS_RECEIVER_HEADERS "*.h")
list(SORT GNSS_RECEIVER_HEADERS)
file(GLOB GNSS_RECEIVER_INTERFACE_HEADERS "../interfaces/*.h")
list(SORT GNSS_RECEIVER_SOURCES)
set(GNSS_RECEIVER_INTERFACE_HEADERS ../interfaces/acquisition_interface.h
../interfaces/channel_interface.h
../interfaces/configuration_interface.h
../interfaces/gnss_block_interface.h
../interfaces/observables_interface.h
../interfaces/pvt_interface.h
../interfaces/telemetry_decoder_interface.h
../interfaces/tracking_interface.h
)
list(SORT GNSS_RECEIVER_INTERFACE_HEADERS)
add_library(gnss_rx ${GNSS_RECEIVER_SOURCES} ${GNSS_RECEIVER_HEADERS} ${GNSS_RECEIVER_INTERFACE_HEADERS})
source_group(Headers FILES ${GNSS_RECEIVER_HEADERS} ${GNSS_RECEIVER_INTERFACE_HEADERS})

View File

@ -801,8 +801,8 @@ void GNSSFlowgraph::wait()
bool GNSSFlowgraph::send_telemetry_msg(pmt::pmt_t msg)
{
//push ephemeris to PVT telemetry msg in port using a channel out port
// it uses the first channel as a message produces (it is already connected to PVT)
// Push ephemeris to PVT telemetry msg in port using a channel out port
// it uses the first channel as a message producer (it is already connected to PVT)
channels_.at(0)->get_right_block()->message_port_pub(pmt::mp("telemetry"), msg);
return true;
}
@ -816,6 +816,7 @@ bool GNSSFlowgraph::send_telemetry_msg(pmt::pmt_t msg)
*/
void GNSSFlowgraph::apply_action(unsigned int who, unsigned int what)
{
std::lock_guard<std::mutex> lock(signal_list_mutex);
DLOG(INFO) << "Received " << what << " from " << who << ". Number of applied actions = " << applied_actions_;
unsigned int sat = 0;
try
@ -826,7 +827,6 @@ void GNSSFlowgraph::apply_action(unsigned int who, unsigned int what)
{
LOG(WARNING) << e.what();
}
std::lock_guard<std::mutex> lock(signal_list_mutex);
switch (what)
{
case 0:
@ -1336,8 +1336,8 @@ void GNSSFlowgraph::set_signals_list()
if (configuration_->property("Channels_1G.count", 0) > 0)
{
// Loop to create the list of GLONASS L1 C/A signals
for (available_gnss_prn_iter = available_glonass_prn.begin();
available_gnss_prn_iter != available_glonass_prn.end();
for (available_gnss_prn_iter = available_glonass_prn.cbegin();
available_gnss_prn_iter != available_glonass_prn.cend();
available_gnss_prn_iter++)
{
available_GLO_1G_signals_.push_back(Gnss_Signal(
@ -1349,8 +1349,8 @@ void GNSSFlowgraph::set_signals_list()
if (configuration_->property("Channels_2G.count", 0) > 0)
{
// Loop to create the list of GLONASS L2 C/A signals
for (available_gnss_prn_iter = available_glonass_prn.begin();
available_gnss_prn_iter != available_glonass_prn.end();
for (available_gnss_prn_iter = available_glonass_prn.cbegin();
available_gnss_prn_iter != available_glonass_prn.cend();
available_gnss_prn_iter++)
{
available_GLO_2G_signals_.push_back(Gnss_Signal(
@ -1363,6 +1363,7 @@ void GNSSFlowgraph::set_signals_list()
void GNSSFlowgraph::set_channels_state()
{
std::lock_guard<std::mutex> lock(signal_list_mutex);
max_acq_channels_ = configuration_->property("Channels.in_acquisition", channels_count_);
if (max_acq_channels_ > channels_count_)
{
@ -1382,7 +1383,6 @@ void GNSSFlowgraph::set_channels_state()
}
DLOG(INFO) << "Channel " << i << " in state " << channels_state_[i];
}
std::lock_guard<std::mutex> lock(signal_list_mutex);
acq_channels_count_ = max_acq_channels_;
DLOG(INFO) << acq_channels_count_ << " channels in acquisition state";
}
@ -1599,16 +1599,16 @@ Gnss_Signal GNSSFlowgraph::search_next_signal(std::string searched_signal, bool
return result;
}
std::vector<std::string> GNSSFlowgraph::split_string(const std::string &s, char delim)
std::vector<std::string> GNSSFlowgraph::split_string(const std::string& s, char delim)
{
std::vector<std::string> v;
std::stringstream ss(s);
std::string item;
while (std::getline(ss, item, delim))
{
*(std::back_inserter(v)++) = item;
}
{
*(std::back_inserter(v)++) = item;
}
return v;
}

View File

@ -45,6 +45,47 @@ set(SYSTEM_PARAMETERS_SOURCES
glonass_gnav_navigation_message.cc
)
set(SYSTEM_PARAMETERS_HEADERS
gnss_satellite.h
gnss_signal.h
gps_navigation_message.h
gps_ephemeris.h
gps_iono.h
gps_almanac.h
gps_utc_model.h
gps_acq_assist.h
gps_ref_time.h
gps_ref_location.h
galileo_utc_model.h
galileo_ephemeris.h
galileo_almanac.h
galileo_iono.h
galileo_navigation_message.h
sbas_ephemeris.h
galileo_fnav_message.h
gps_cnav_ephemeris.h
gps_cnav_navigation_message.h
gps_cnav_iono.h
gps_cnav_utc_model.h
rtcm.h
glonass_gnav_ephemeris.h
glonass_gnav_almanac.h
glonass_gnav_utc_model.h
glonass_gnav_navigation_message.h
display.h
Galileo_E1.h
Galileo_E5a.h
GLONASS_L1_L2_CA.h
gnss_frequencies.h
gnss_obs_codes.h
gnss_synchro.h
GPS_CNAV.h
GPS_L1_CA.h
GPS_L2C.h
GPS_L5.h
MATH_CONSTANTS.h
)
include_directories(
${CMAKE_CURRENT_SOURCE_DIR}
@ -57,8 +98,10 @@ include_directories(
)
link_directories(${Boost_LIBRARY_DIR})
file(GLOB SYSTEM_PARAMETERS_HEADERS "*.h")
list(SORT SYSTEM_PARAMETERS_HEADERS)
list(SORT SYSTEM_PARAMETERS_SOURCES)
add_library(gnss_system_parameters ${SYSTEM_PARAMETERS_SOURCES} ${SYSTEM_PARAMETERS_HEADERS})
source_group(Headers FILES ${SYSTEM_PARAMETERS_HEADERS})
add_dependencies(gnss_system_parameters rtklib_lib glog-${glog_RELEASE})

View File

@ -33,6 +33,7 @@
#ifndef GNSS_SDR_GNSS_SYNCHRO_H_
#define GNSS_SDR_GNSS_SYNCHRO_H_
#include <boost/serialization/nvp.hpp>
#include "gnss_signal.h"
#include <cstdint>
@ -83,41 +84,42 @@ public:
* Gnss_Synchro objects from a byte stream.
*/
template <class Archive>
void serialize(Archive& ar, const unsigned int version)
{
if (version)
{
};
// Satellite and signal info
ar& System;
ar& Signal;
ar& PRN;
ar& Channel_ID;
ar& BOOST_SERIALIZATION_NVP(System);
ar& BOOST_SERIALIZATION_NVP(Signal);
ar& BOOST_SERIALIZATION_NVP(PRN);
ar& BOOST_SERIALIZATION_NVP(Channel_ID);
// Acquisition
ar& Acq_delay_samples;
ar& Acq_doppler_hz;
ar& Acq_samplestamp_samples;
ar& Acq_doppler_step;
ar& Flag_valid_acquisition;
ar& BOOST_SERIALIZATION_NVP(Acq_delay_samples);
ar& BOOST_SERIALIZATION_NVP(Acq_doppler_hz);
ar& BOOST_SERIALIZATION_NVP(Acq_samplestamp_samples);
ar& BOOST_SERIALIZATION_NVP(Acq_doppler_step);
ar& BOOST_SERIALIZATION_NVP(Flag_valid_acquisition);
// Tracking
ar& fs;
ar& Prompt_I;
ar& Prompt_Q;
ar& CN0_dB_hz;
ar& Carrier_Doppler_hz;
ar& Carrier_phase_rads;
ar& Code_phase_samples;
ar& Tracking_sample_counter;
ar& Flag_valid_symbol_output;
ar& correlation_length_ms;
ar& BOOST_SERIALIZATION_NVP(fs);
ar& BOOST_SERIALIZATION_NVP(Prompt_I);
ar& BOOST_SERIALIZATION_NVP(Prompt_Q);
ar& BOOST_SERIALIZATION_NVP(CN0_dB_hz);
ar& BOOST_SERIALIZATION_NVP(Carrier_Doppler_hz);
ar& BOOST_SERIALIZATION_NVP(Carrier_phase_rads);
ar& BOOST_SERIALIZATION_NVP(Code_phase_samples);
ar& BOOST_SERIALIZATION_NVP(Tracking_sample_counter);
ar& BOOST_SERIALIZATION_NVP(Flag_valid_symbol_output);
ar& BOOST_SERIALIZATION_NVP(correlation_length_ms);
// Telemetry Decoder
ar& Flag_valid_word;
ar& TOW_at_current_symbol_ms;
ar& BOOST_SERIALIZATION_NVP(Flag_valid_word);
ar& BOOST_SERIALIZATION_NVP(TOW_at_current_symbol_ms);
// Observables
ar& Pseudorange_m;
ar& RX_time;
ar& Flag_valid_pseudorange;
ar& interp_TOW_ms;
ar& BOOST_SERIALIZATION_NVP(Pseudorange_m);
ar& BOOST_SERIALIZATION_NVP(RX_time);
ar& BOOST_SERIALIZATION_NVP(Flag_valid_pseudorange);
ar& BOOST_SERIALIZATION_NVP(interp_TOW_ms);
}
};

View File

@ -153,7 +153,7 @@ public:
archive& make_nvp("d_Cus", d_Cus); //!< Amplitude of the Sine Harmonic Correction Term to the Argument of Latitude [rad]
archive& make_nvp("d_sqrt_A", d_sqrt_A); //!< Square Root of the Semi-Major Axis [sqrt(m)]
archive& make_nvp("d_Toe", d_Toe); //!< Ephemeris data reference time of week (Ref. 20.3.3.4.3 IS-GPS-200E) [s]
archive& make_nvp("d_Toc", d_Toe); //!< clock data reference time (Ref. 20.3.3.3.3.1 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]

View File

@ -179,6 +179,7 @@ endif(ENABLE_UNIT_TESTING_MINIMAL)
################################################################################
# Optional generator
################################################################################
option(ENABLE_GNSS_SIM_INSTALL "Enable the installation of gnss_sim on the fly" ON)
if(ENABLE_UNIT_TESTING_EXTRA OR ENABLE_SYSTEM_TESTING_EXTRA OR ENABLE_FPGA)
if(ENABLE_FPGA)
set(CROSS_INSTALL_DIR "-DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}")
@ -189,11 +190,11 @@ if(ENABLE_UNIT_TESTING_EXTRA OR ENABLE_SYSTEM_TESTING_EXTRA OR ENABLE_FPGA)
set(CROSS_INSTALL_DIR "")
endif(ENABLE_FPGA)
find_package(GnssSimulator QUIET)
if(GNSS-SIMULATOR_FOUND)
if(GNSS-SIMULATOR_FOUND OR NOT ENABLE_GNSS_SIM_INSTALL)
add_definitions(-DSW_GENERATOR_BIN="${SW_GENERATOR_BIN}")
add_definitions(-DDEFAULT_RINEX_NAV="${CMAKE_INSTALL_PREFIX}/share/gnss-sim/brdc3540.14n")
add_definitions(-DDEFAULT_POSITION_FILE="${CMAKE_INSTALL_PREFIX}/share/gnss-sim/circle.csv")
else(GNSS-SIMULATOR_FOUND)
else(GNSS-SIMULATOR_FOUND OR NOT ENABLE_GNSS_SIM_INSTALL)
ExternalProject_Add(
gnss-sim
GIT_REPOSITORY https://bitbucket.org/jarribas/gnss-simulator
@ -219,7 +220,7 @@ if(ENABLE_UNIT_TESTING_EXTRA OR ENABLE_SYSTEM_TESTING_EXTRA OR ENABLE_FPGA)
add_definitions(-DDEFAULT_RINEX_NAV="${CMAKE_CURRENT_BINARY_DIR}/../../../thirdparty/gnss-sim/brdc3540.14n")
add_definitions(-DDEFAULT_POSITION_FILE="${CMAKE_CURRENT_BINARY_DIR}/../../../thirdparty/gnss-sim/circle.csv")
endif(ENABLE_INSTALL_TESTS)
endif(GNSS-SIMULATOR_FOUND)
endif(GNSS-SIMULATOR_FOUND OR NOT ENABLE_GNSS_SIM_INSTALL)
################################################################################
# Local installation of GPSTk http://www.gpstk.org/
@ -312,12 +313,16 @@ if(ENABLE_INSTALL_TESTS)
install(FILES ${CMAKE_SOURCE_DIR}/src/tests/signal_samples/Galileo_E1_ID_1_Fs_4Msps_8ms.dat DESTINATION share/gnss-sdr/signal_samples)
install(FILES ${CMAKE_SOURCE_DIR}/src/tests/signal_samples/GPS_L1_CA_ID_1_Fs_4Msps_2ms.dat DESTINATION share/gnss-sdr/signal_samples)
install(FILES ${CMAKE_SOURCE_DIR}/src/tests/signal_samples/NT1065_GLONASS_L1_20160831_fs6625e6_if0e3_4ms.bin DESTINATION share/gnss-sdr/signal_samples)
install(FILES ${CMAKE_SOURCE_DIR}/src/tests/data/rtklib_test/obs_test1.xml DESTINATION share/gnss-sdr/data/rtklib_test)
install(FILES ${CMAKE_SOURCE_DIR}/src/tests/data/rtklib_test/eph_GPS_L1CA_test1.xml DESTINATION share/gnss-sdr/data/rtklib_test)
add_definitions(-DTEST_PATH="${CMAKE_INSTALL_PREFIX}/share/gnss-sdr/")
else(ENABLE_INSTALL_TESTS)
file(COPY ${CMAKE_SOURCE_DIR}/src/tests/signal_samples/GSoC_CTTC_capture_2012_07_26_4Msps_4ms.dat DESTINATION ${CMAKE_SOURCE_DIR}/thirdparty/signal_samples)
file(COPY ${CMAKE_SOURCE_DIR}/src/tests/signal_samples/Galileo_E1_ID_1_Fs_4Msps_8ms.dat DESTINATION ${CMAKE_SOURCE_DIR}/thirdparty/signal_samples)
file(COPY ${CMAKE_SOURCE_DIR}/src/tests/signal_samples/GPS_L1_CA_ID_1_Fs_4Msps_2ms.dat DESTINATION ${CMAKE_SOURCE_DIR}/thirdparty/signal_samples)
file(COPY ${CMAKE_SOURCE_DIR}/src/tests/signal_samples/NT1065_GLONASS_L1_20160831_fs6625e6_if0e3_4ms.bin DESTINATION ${CMAKE_SOURCE_DIR}/thirdparty/signal_samples)
file(COPY ${CMAKE_SOURCE_DIR}/src/tests/data/rtklib_test/obs_test1.xml DESTINATION ${CMAKE_SOURCE_DIR}/thirdparty/data/rtklib_test)
file(COPY ${CMAKE_SOURCE_DIR}/src/tests/data/rtklib_test/eph_GPS_L1CA_test1.xml DESTINATION ${CMAKE_SOURCE_DIR}/thirdparty/data/rtklib_test)
add_definitions(-DTEST_PATH="${CMAKE_SOURCE_DIR}/thirdparty/")
endif(ENABLE_INSTALL_TESTS)

View File

@ -37,5 +37,6 @@
DEFINE_double(skip_obs_transitory_s, 30.0, "Skip the initial observable outputs to avoid transitory results [s]");
DEFINE_bool(compute_single_diffs, false, "Compute also the single difference errors for Accumulated Carrier Phase and Carrier Doppler (requires LO synchronization between receivers)");
DEFINE_bool(compare_with_5X, false, "Compare the E5a Doppler and Carrier Phases with the E5 full bw in RINEX (expect discrepancy due to the center frequencies differences");
DEFINE_bool(duplicated_satellites_test, false, "Enable special observable test mode where the scenario contains duplicated satellite orbits");
DEFINE_string(duplicated_satellites_prns, "1,2,3,4", "List of duplicated satellites PRN pairs (i.e. 1,2,3,4 indicates that the PRNs 1,2 share the same orbit. The same applies for PRNs 3,4)");
#endif

View File

@ -0,0 +1,481 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE boost_serialization>
<boost_serialization signature="serialization::archive" version="12">
<GNSS-SDR_ephemeris_map class_id="0" tracking_level="0" version="0">
<count>11</count>
<item_version>0</item_version>
<item class_id="1" tracking_level="0" version="0">
<first>1</first>
<second class_id="2" tracking_level="0" version="0">
<i_satellite_PRN>1</i_satellite_PRN>
<d_TOW>5.18448000000000000e+05</d_TOW>
<d_IODE_SF2>9.20000000000000000e+01</d_IODE_SF2>
<d_IODE_SF3>9.20000000000000000e+01</d_IODE_SF3>
<d_Crs>1.83125000000000000e+01</d_Crs>
<d_Delta_n>4.86413118201646669e-09</d_Delta_n>
<d_M_0>2.06468198930943725e+00</d_M_0>
<d_Cuc>9.42498445510864258e-07</d_Cuc>
<d_e_eccentricity>3.73082922305911736e-03</d_e_eccentricity>
<d_Cus>5.76488673686981201e-06</d_Cus>
<d_sqrt_A>5.15366174697875977e+03</d_sqrt_A>
<d_Toe>5.18400000000000000e+05</d_Toe>
<d_Toc>5.18400000000000000e+05</d_Toc>
<d_Cic>-5.40167093276977539e-08</d_Cic>
<d_OMEGA0>9.52167247599200905e-01</d_OMEGA0>
<d_Cis>1.86264514923095703e-08</d_Cis>
<d_i_0>9.61377026423456127e-01</d_i_0>
<d_Crc>2.66968750000000000e+02</d_Crc>
<d_OMEGA>4.44935333708291858e-01</d_OMEGA>
<d_OMEGA_DOT>-8.14641075927847669e-09</d_OMEGA_DOT>
<d_IDOT>4.15017287135849497e-10</d_IDOT>
<i_code_on_L2>0</i_code_on_L2>
<i_GPS_week>799</i_GPS_week>
<b_L2_P_data_flag>0</b_L2_P_data_flag>
<i_SV_accuracy>2</i_SV_accuracy>
<i_SV_health>0</i_SV_health>
<d_TGD>5.12227416038513184e-09</d_TGD>
<d_IODC>9.20000000000000000e+01</d_IODC>
<i_AODO>27900</i_AODO>
<b_fit_interval_flag>0</b_fit_interval_flag>
<d_spare1>0.00000000000000000e+00</d_spare1>
<d_spare2>0.00000000000000000e+00</d_spare2>
<d_A_f0>-1.09937973320484161e-05</d_A_f0>
<d_A_f1>3.41060513164847988e-13</d_A_f1>
<d_A_f2>0.00000000000000000e+00</d_A_f2>
<b_integrity_status_flag>0</b_integrity_status_flag>
<b_alert_flag>0</b_alert_flag>
<b_antispoofing_flag>0</b_antispoofing_flag>
</second>
</item>
<item>
<first>2</first>
<second>
<i_satellite_PRN>2</i_satellite_PRN>
<d_TOW>5.18448000000000000e+05</d_TOW>
<d_IODE_SF2>5.50000000000000000e+01</d_IODE_SF2>
<d_IODE_SF3>5.50000000000000000e+01</d_IODE_SF3>
<d_Crs>2.22812500000000000e+01</d_Crs>
<d_Delta_n>5.12771358985317661e-09</d_Delta_n>
<d_M_0>2.75926302782053146e+00</d_M_0>
<d_Cuc>1.10082328319549561e-06</d_Cuc>
<d_e_eccentricity>1.40569622162729484e-02</d_e_eccentricity>
<d_Cus>6.26407563686370850e-06</d_Cus>
<d_sqrt_A>5.15372654151916504e+03</d_sqrt_A>
<d_Toe>5.18400000000000000e+05</d_Toe>
<d_Toc>5.18400000000000000e+05</d_Toc>
<d_Cic>-1.86264514923095703e-08</d_Cic>
<d_OMEGA0>9.18037446344556307e-01</d_OMEGA0>
<d_Cis>-2.16066837310791016e-07</d_Cis>
<d_i_0>9.39991586696909520e-01</d_i_0>
<d_Crc>2.45468750000000000e+02</d_Crc>
<d_OMEGA>-2.35598690357981555e+00</d_OMEGA>
<d_OMEGA_DOT>-8.07140763509730069e-09</d_OMEGA_DOT>
<d_IDOT>5.25736184736635464e-10</d_IDOT>
<i_code_on_L2>0</i_code_on_L2>
<i_GPS_week>799</i_GPS_week>
<b_L2_P_data_flag>0</b_L2_P_data_flag>
<i_SV_accuracy>2</i_SV_accuracy>
<i_SV_health>0</i_SV_health>
<d_TGD>-2.00234353542327881e-08</d_TGD>
<d_IODC>5.50000000000000000e+01</d_IODC>
<i_AODO>27900</i_AODO>
<b_fit_interval_flag>0</b_fit_interval_flag>
<d_spare1>0.00000000000000000e+00</d_spare1>
<d_spare2>0.00000000000000000e+00</d_spare2>
<d_A_f0>5.36850653588771820e-04</d_A_f0>
<d_A_f1>2.16004991671070416e-12</d_A_f1>
<d_A_f2>0.00000000000000000e+00</d_A_f2>
<b_integrity_status_flag>0</b_integrity_status_flag>
<b_alert_flag>0</b_alert_flag>
<b_antispoofing_flag>0</b_antispoofing_flag>
</second>
</item>
<item>
<first>3</first>
<second>
<i_satellite_PRN>3</i_satellite_PRN>
<d_TOW>5.18448000000000000e+05</d_TOW>
<d_IODE_SF2>7.00000000000000000e+01</d_IODE_SF2>
<d_IODE_SF3>7.00000000000000000e+01</d_IODE_SF3>
<d_Crs>-2.04375000000000000e+01</d_Crs>
<d_Delta_n>4.75769817722603366e-09</d_Delta_n>
<d_M_0>-1.78871492992227910e+00</d_M_0>
<d_Cuc>-1.30012631416320801e-06</d_Cuc>
<d_e_eccentricity>9.70319728367030512e-04</d_e_eccentricity>
<d_Cus>8.26455652713775635e-06</d_Cus>
<d_sqrt_A>5.15378153991699219e+03</d_sqrt_A>
<d_Toe>5.18400000000000000e+05</d_Toe>
<d_Toc>5.18400000000000000e+05</d_Toc>
<d_Cic>7.82310962677001953e-08</d_Cic>
<d_OMEGA0>1.99297660614955263e+00</d_OMEGA0>
<d_Cis>-1.11758708953857422e-08</d_Cis>
<d_i_0>9.59058451948379909e-01</d_i_0>
<d_Crc>2.19593750000000000e+02</d_Crc>
<d_OMEGA>-3.00536842405812843e+00</d_OMEGA>
<d_OMEGA_DOT>-8.02712007605698577e-09</d_OMEGA_DOT>
<d_IDOT>-5.17164399115929480e-10</d_IDOT>
<i_code_on_L2>0</i_code_on_L2>
<i_GPS_week>799</i_GPS_week>
<b_L2_P_data_flag>0</b_L2_P_data_flag>
<i_SV_accuracy>2</i_SV_accuracy>
<i_SV_health>0</i_SV_health>
<d_TGD>5.12227416038513184e-09</d_TGD>
<d_IODC>7.00000000000000000e+01</d_IODC>
<i_AODO>27900</i_AODO>
<b_fit_interval_flag>0</b_fit_interval_flag>
<d_spare1>0.00000000000000000e+00</d_spare1>
<d_spare2>0.00000000000000000e+00</d_spare2>
<d_A_f0>8.80691222846508026e-05</d_A_f0>
<d_A_f1>2.89901436190120811e-11</d_A_f1>
<d_A_f2>0.00000000000000000e+00</d_A_f2>
<b_integrity_status_flag>0</b_integrity_status_flag>
<b_alert_flag>0</b_alert_flag>
<b_antispoofing_flag>0</b_antispoofing_flag>
</second>
</item>
<item>
<first>6</first>
<second>
<i_satellite_PRN>6</i_satellite_PRN>
<d_TOW>5.18448000000000000e+05</d_TOW>
<d_IODE_SF2>2.30000000000000000e+01</d_IODE_SF2>
<d_IODE_SF3>2.30000000000000000e+01</d_IODE_SF3>
<d_Crs>1.63750000000000000e+01</d_Crs>
<d_Delta_n>4.76305554323897445e-09</d_Delta_n>
<d_M_0>-1.28531071631616522e+00</d_M_0>
<d_Cuc>9.12696123123168945e-07</d_Cuc>
<d_e_eccentricity>5.50022465176880251e-04</d_e_eccentricity>
<d_Cus>6.24358654022216797e-06</d_Cus>
<d_sqrt_A>5.15365166282653809e+03</d_sqrt_A>
<d_Toe>5.18400000000000000e+05</d_Toe>
<d_Toc>5.18400000000000000e+05</d_Toc>
<d_Cic>-1.30385160446166992e-08</d_Cic>
<d_OMEGA0>9.43624288779246867e-01</d_OMEGA0>
<d_Cis>-1.86264514923095703e-09</d_Cis>
<d_i_0>9.61292940818096020e-01</d_i_0>
<d_Crc>2.58406250000000000e+02</d_Crc>
<d_OMEGA>2.29191014519991665e+00</d_OMEGA>
<d_OMEGA_DOT>-8.08069373618639861e-09</d_OMEGA_DOT>
<d_IDOT>4.79305679291144535e-10</d_IDOT>
<i_code_on_L2>0</i_code_on_L2>
<i_GPS_week>799</i_GPS_week>
<b_L2_P_data_flag>0</b_L2_P_data_flag>
<i_SV_accuracy>2</i_SV_accuracy>
<i_SV_health>0</i_SV_health>
<d_TGD>4.65661287307739258e-09</d_TGD>
<d_IODC>2.30000000000000000e+01</d_IODC>
<i_AODO>27900</i_AODO>
<b_fit_interval_flag>0</b_fit_interval_flag>
<d_spare1>0.00000000000000000e+00</d_spare1>
<d_spare2>0.00000000000000000e+00</d_spare2>
<d_A_f0>3.07881273329257965e-05</d_A_f0>
<d_A_f1>8.18545231595635253e-12</d_A_f1>
<d_A_f2>0.00000000000000000e+00</d_A_f2>
<b_integrity_status_flag>0</b_integrity_status_flag>
<b_alert_flag>0</b_alert_flag>
<b_antispoofing_flag>0</b_antispoofing_flag>
</second>
</item>
<item>
<first>9</first>
<second>
<i_satellite_PRN>9</i_satellite_PRN>
<d_TOW>5.18448000000000000e+05</d_TOW>
<d_IODE_SF2>4.70000000000000000e+01</d_IODE_SF2>
<d_IODE_SF3>4.70000000000000000e+01</d_IODE_SF3>
<d_Crs>1.12906250000000000e+02</d_Crs>
<d_Delta_n>4.37911097897818463e-09</d_Delta_n>
<d_M_0>-2.75253879947800195e+00</d_M_0>
<d_Cuc>5.85243105888366699e-06</d_Cuc>
<d_e_eccentricity>2.16206186451017829e-04</d_e_eccentricity>
<d_Cus>1.16303563117980957e-05</d_Cus>
<d_sqrt_A>5.15369471168518066e+03</d_sqrt_A>
<d_Toe>5.18400000000000000e+05</d_Toe>
<d_Toc>5.18400000000000000e+05</d_Toc>
<d_Cic>1.67638063430786133e-08</d_Cic>
<d_OMEGA0>3.03742251571970812e+00</d_OMEGA0>
<d_Cis>-1.11758708953857422e-08</d_Cis>
<d_i_0>9.59160503650671514e-01</d_i_0>
<d_Crc>1.56125000000000000e+02</d_Crc>
<d_OMEGA>2.60662251530764344e+00</d_OMEGA>
<d_OMEGA_DOT>-7.85854162551643464e-09</d_OMEGA_DOT>
<d_IDOT>-3.46443002170201364e-11</d_IDOT>
<i_code_on_L2>0</i_code_on_L2>
<i_GPS_week>799</i_GPS_week>
<b_L2_P_data_flag>0</b_L2_P_data_flag>
<i_SV_accuracy>2</i_SV_accuracy>
<i_SV_health>0</i_SV_health>
<d_TGD>4.65661287307739258e-10</d_TGD>
<d_IODC>4.70000000000000000e+01</d_IODC>
<i_AODO>27900</i_AODO>
<b_fit_interval_flag>0</b_fit_interval_flag>
<d_spare1>0.00000000000000000e+00</d_spare1>
<d_spare2>0.00000000000000000e+00</d_spare2>
<d_A_f0>-3.18535603582859039e-05</d_A_f0>
<d_A_f1>-9.66338120633736091e-12</d_A_f1>
<d_A_f2>0.00000000000000000e+00</d_A_f2>
<b_integrity_status_flag>0</b_integrity_status_flag>
<b_alert_flag>0</b_alert_flag>
<b_antispoofing_flag>0</b_antispoofing_flag>
</second>
</item>
<item>
<first>10</first>
<second>
<i_satellite_PRN>10</i_satellite_PRN>
<d_TOW>5.18448000000000000e+05</d_TOW>
<d_IODE_SF2>5.80000000000000000e+01</d_IODE_SF2>
<d_IODE_SF3>5.80000000000000000e+01</d_IODE_SF3>
<d_Crs>-2.72500000000000000e+01</d_Crs>
<d_Delta_n>5.27093384126580581e-09</d_Delta_n>
<d_M_0>-8.86982818851813737e-01</d_M_0>
<d_Cuc>-1.17719173431396484e-06</d_Cuc>
<d_e_eccentricity>1.44534236751496774e-02</d_e_eccentricity>
<d_Cus>7.90506601333618164e-06</d_Cus>
<d_sqrt_A>5.15363725471496582e+03</d_sqrt_A>
<d_Toe>5.18400000000000000e+05</d_Toe>
<d_Toc>5.18400000000000000e+05</d_Toc>
<d_Cic>1.45286321640014648e-07</d_Cic>
<d_OMEGA0>2.00408517949479270e+00</d_OMEGA0>
<d_Cis>2.40281224250793457e-07</d_Cis>
<d_i_0>9.41160112993577269e-01</d_i_0>
<d_Crc>2.15406250000000000e+02</d_Crc>
<d_OMEGA>9.09732121011562200e-01</d_OMEGA>
<d_OMEGA_DOT>-8.42213653007785350e-09</d_OMEGA_DOT>
<d_IDOT>-5.42879755978047536e-10</d_IDOT>
<i_code_on_L2>0</i_code_on_L2>
<i_GPS_week>799</i_GPS_week>
<b_L2_P_data_flag>0</b_L2_P_data_flag>
<i_SV_accuracy>2</i_SV_accuracy>
<i_SV_health>0</i_SV_health>
<d_TGD>-2.79396772384643555e-09</d_TGD>
<d_IODC>5.80000000000000000e+01</d_IODC>
<i_AODO>27900</i_AODO>
<b_fit_interval_flag>0</b_fit_interval_flag>
<d_spare1>0.00000000000000000e+00</d_spare1>
<d_spare2>0.00000000000000000e+00</d_spare2>
<d_A_f0>-1.54968351125717163e-04</d_A_f0>
<d_A_f1>-1.59161572810262401e-12</d_A_f1>
<d_A_f2>0.00000000000000000e+00</d_A_f2>
<b_integrity_status_flag>0</b_integrity_status_flag>
<b_alert_flag>0</b_alert_flag>
<b_antispoofing_flag>0</b_antispoofing_flag>
</second>
</item>
<item>
<first>12</first>
<second>
<i_satellite_PRN>12</i_satellite_PRN>
<d_TOW>5.18448000000000000e+05</d_TOW>
<d_IODE_SF2>1.06000000000000000e+02</d_IODE_SF2>
<d_IODE_SF3>1.06000000000000000e+02</d_IODE_SF3>
<d_Crs>-1.17468750000000000e+02</d_Crs>
<d_Delta_n>3.94516433192994276e-09</d_Delta_n>
<d_M_0>1.11631735294997192e+00</d_M_0>
<d_Cuc>-6.15417957305908203e-06</d_Cuc>
<d_e_eccentricity>5.05860964767634782e-03</d_e_eccentricity>
<d_Cus>4.52436506748199463e-06</d_Cus>
<d_sqrt_A>5.15376680946350098e+03</d_sqrt_A>
<d_Toe>5.18400000000000000e+05</d_Toe>
<d_Toc>5.18400000000000000e+05</d_Toc>
<d_Cic>-5.40167093276977539e-08</d_Cic>
<d_OMEGA0>-1.10425023618040785e+00</d_OMEGA0>
<d_Cis>4.09781932830810547e-08</d_Cis>
<d_i_0>9.88803748742243305e-01</d_i_0>
<d_Crc>3.07187500000000000e+02</d_Crc>
<d_OMEGA>5.00154452274795935e-01</d_OMEGA>
<d_OMEGA_DOT>-7.97176062725659211e-09</d_OMEGA_DOT>
<d_IDOT>-4.18231706743614228e-10</d_IDOT>
<i_code_on_L2>0</i_code_on_L2>
<i_GPS_week>799</i_GPS_week>
<b_L2_P_data_flag>0</b_L2_P_data_flag>
<i_SV_accuracy>2</i_SV_accuracy>
<i_SV_health>0</i_SV_health>
<d_TGD>-1.16415321826934814e-08</d_TGD>
<d_IODC>1.06000000000000000e+02</d_IODC>
<i_AODO>27900</i_AODO>
<b_fit_interval_flag>0</b_fit_interval_flag>
<d_spare1>0.00000000000000000e+00</d_spare1>
<d_spare2>0.00000000000000000e+00</d_spare2>
<d_A_f0>2.54871323704719543e-04</d_A_f0>
<d_A_f1>2.72848410531878391e-12</d_A_f1>
<d_A_f2>0.00000000000000000e+00</d_A_f2>
<b_integrity_status_flag>0</b_integrity_status_flag>
<b_alert_flag>0</b_alert_flag>
<b_antispoofing_flag>0</b_antispoofing_flag>
</second>
</item>
<item>
<first>17</first>
<second>
<i_satellite_PRN>17</i_satellite_PRN>
<d_TOW>5.18448000000000000e+05</d_TOW>
<d_IODE_SF2>2.60000000000000000e+01</d_IODE_SF2>
<d_IODE_SF3>2.60000000000000000e+01</d_IODE_SF3>
<d_Crs>-5.91250000000000000e+01</d_Crs>
<d_Delta_n>3.88194741297723567e-09</d_Delta_n>
<d_M_0>-1.94252959218893162e+00</d_M_0>
<d_Cuc>-3.04728746414184570e-06</d_Cuc>
<d_e_eccentricity>9.88844956737011498e-03</d_e_eccentricity>
<d_Cus>1.18296593427658081e-05</d_Cus>
<d_sqrt_A>5.15369299888610840e+03</d_sqrt_A>
<d_Toe>5.18400000000000000e+05</d_Toe>
<d_Toc>5.18400000000000000e+05</d_Toc>
<d_Cic>2.03028321266174316e-07</d_Cic>
<d_OMEGA0>-5.68690999805671268e-02</d_OMEGA0>
<d_Cis>-7.63684511184692383e-08</d_Cis>
<d_i_0>9.71201777972365177e-01</d_i_0>
<d_Crc>1.56531250000000000e+02</d_Crc>
<d_OMEGA>-2.06928329237789344e+00</d_OMEGA>
<d_OMEGA_DOT>-7.44602444251995675e-09</d_OMEGA_DOT>
<d_IDOT>4.40375486263771432e-10</d_IDOT>
<i_code_on_L2>0</i_code_on_L2>
<i_GPS_week>799</i_GPS_week>
<b_L2_P_data_flag>0</b_L2_P_data_flag>
<i_SV_accuracy>2</i_SV_accuracy>
<i_SV_health>0</i_SV_health>
<d_TGD>-1.07102096080780029e-08</d_TGD>
<d_IODC>2.60000000000000000e+01</d_IODC>
<i_AODO>27900</i_AODO>
<b_fit_interval_flag>0</b_fit_interval_flag>
<d_spare1>0.00000000000000000e+00</d_spare1>
<d_spare2>0.00000000000000000e+00</d_spare2>
<d_A_f0>-1.44933816045522690e-04</d_A_f0>
<d_A_f1>-2.27373675443232019e-12</d_A_f1>
<d_A_f2>0.00000000000000000e+00</d_A_f2>
<b_integrity_status_flag>0</b_integrity_status_flag>
<b_alert_flag>0</b_alert_flag>
<b_antispoofing_flag>0</b_antispoofing_flag>
</second>
</item>
<item>
<first>20</first>
<second>
<i_satellite_PRN>20</i_satellite_PRN>
<d_TOW>5.18448000000000000e+05</d_TOW>
<d_IODE_SF2>1.17000000000000000e+02</d_IODE_SF2>
<d_IODE_SF3>1.17000000000000000e+02</d_IODE_SF3>
<d_Crs>-2.58437500000000000e+01</d_Crs>
<d_Delta_n>5.60380484953655626e-09</d_Delta_n>
<d_M_0>1.28625710142833249e-01</d_M_0>
<d_Cuc>-1.52923166751861572e-06</d_Cuc>
<d_e_eccentricity>5.80669869668781671e-03</d_e_eccentricity>
<d_Cus>7.51018524169921875e-06</d_Cus>
<d_sqrt_A>5.15578671264648438e+03</d_sqrt_A>
<d_Toe>5.18400000000000000e+05</d_Toe>
<d_Toc>5.18400000000000000e+05</d_Toc>
<d_Cic>-2.23517417907714844e-08</d_Cic>
<d_OMEGA0>1.92543994118208528e+00</d_OMEGA0>
<d_Cis>4.65661287307739258e-08</d_Cis>
<d_i_0>9.26021286652122910e-01</d_i_0>
<d_Crc>2.18031250000000000e+02</d_Crc>
<d_OMEGA>1.23365536128043107e+00</d_OMEGA>
<d_OMEGA_DOT>-8.54892752571746483e-09</d_OMEGA_DOT>
<d_IDOT>-5.16450083647537340e-10</d_IDOT>
<i_code_on_L2>0</i_code_on_L2>
<i_GPS_week>799</i_GPS_week>
<b_L2_P_data_flag>0</b_L2_P_data_flag>
<i_SV_accuracy>2</i_SV_accuracy>
<i_SV_health>0</i_SV_health>
<d_TGD>-8.38190317153930664e-09</d_TGD>
<d_IODC>1.17000000000000000e+02</d_IODC>
<i_AODO>27900</i_AODO>
<b_fit_interval_flag>0</b_fit_interval_flag>
<d_spare1>0.00000000000000000e+00</d_spare1>
<d_spare2>0.00000000000000000e+00</d_spare2>
<d_A_f0>2.69209500402212143e-04</d_A_f0>
<d_A_f1>4.20641299569979229e-12</d_A_f1>
<d_A_f2>0.00000000000000000e+00</d_A_f2>
<b_integrity_status_flag>0</b_integrity_status_flag>
<b_alert_flag>0</b_alert_flag>
<b_antispoofing_flag>0</b_antispoofing_flag>
</second>
</item>
<item>
<first>23</first>
<second>
<i_satellite_PRN>23</i_satellite_PRN>
<d_TOW>5.18448000000000000e+05</d_TOW>
<d_IODE_SF2>4.10000000000000000e+01</d_IODE_SF2>
<d_IODE_SF3>4.10000000000000000e+01</d_IODE_SF3>
<d_Crs>1.20250000000000000e+02</d_Crs>
<d_Delta_n>4.45161399901998963e-09</d_Delta_n>
<d_M_0>3.04794581942897569e+00</d_M_0>
<d_Cuc>6.13741576671600342e-06</d_Cuc>
<d_e_eccentricity>9.67817602213471954e-03</d_e_eccentricity>
<d_Cus>1.14180147647857666e-05</d_Cus>
<d_sqrt_A>5.15370163154602051e+03</d_sqrt_A>
<d_Toe>5.18400000000000000e+05</d_Toe>
<d_Toc>5.18400000000000000e+05</d_Toc>
<d_Cic>-6.14672899246215820e-08</d_Cic>
<d_OMEGA0>3.04748172476042711e+00</d_OMEGA0>
<d_Cis>-1.04308128356933594e-07</d_Cis>
<d_i_0>9.50229191282804808e-01</d_i_0>
<d_Crc>1.56000000000000000e+02</d_Crc>
<d_OMEGA>-2.71676891930177256e+00</d_OMEGA>
<d_OMEGA_DOT>-7.78032408172749087e-09</d_OMEGA_DOT>
<d_IDOT>-2.75011455330984601e-11</d_IDOT>
<i_code_on_L2>0</i_code_on_L2>
<i_GPS_week>799</i_GPS_week>
<b_L2_P_data_flag>0</b_L2_P_data_flag>
<i_SV_accuracy>2</i_SV_accuracy>
<i_SV_health>0</i_SV_health>
<d_TGD>-1.95577740669250488e-08</d_TGD>
<d_IODC>4.10000000000000000e+01</d_IODC>
<i_AODO>27900</i_AODO>
<b_fit_interval_flag>0</b_fit_interval_flag>
<d_spare1>0.00000000000000000e+00</d_spare1>
<d_spare2>0.00000000000000000e+00</d_spare2>
<d_A_f0>-7.56788067519664764e-05</d_A_f0>
<d_A_f1>-2.72848410531878391e-12</d_A_f1>
<d_A_f2>0.00000000000000000e+00</d_A_f2>
<b_integrity_status_flag>0</b_integrity_status_flag>
<b_alert_flag>0</b_alert_flag>
<b_antispoofing_flag>0</b_antispoofing_flag>
</second>
</item>
<item>
<first>28</first>
<second>
<i_satellite_PRN>28</i_satellite_PRN>
<d_TOW>5.18448000000000000e+05</d_TOW>
<d_IODE_SF2>3.30000000000000000e+01</d_IODE_SF2>
<d_IODE_SF3>3.30000000000000000e+01</d_IODE_SF3>
<d_Crs>-1.27750000000000000e+02</d_Crs>
<d_Delta_n>4.04302555109966970e-09</d_Delta_n>
<d_M_0>-1.16607683198628931e+00</d_M_0>
<d_Cuc>-6.37024641036987305e-06</d_Cuc>
<d_e_eccentricity>1.97223023278638686e-02</d_e_eccentricity>
<d_Cus>5.66989183425903320e-06</d_Cus>
<d_sqrt_A>5.15368548965454102e+03</d_sqrt_A>
<d_Toe>5.18400000000000000e+05</d_Toe>
<d_Toc>5.18400000000000000e+05</d_Toc>
<d_Cic>-1.37835741043090820e-07</d_Cic>
<d_OMEGA0>-1.08006546321039543e+00</d_OMEGA0>
<d_Cis>4.35858964920043945e-07</d_Cis>
<d_i_0>9.87961552655681530e-01</d_i_0>
<d_Crc>2.84718750000000000e+02</d_Crc>
<d_OMEGA>-1.69047108635756738e+00</d_OMEGA>
<d_OMEGA_DOT>-8.17855495535612472e-09</d_OMEGA_DOT>
<d_IDOT>-4.44661379074124424e-10</d_IDOT>
<i_code_on_L2>0</i_code_on_L2>
<i_GPS_week>799</i_GPS_week>
<b_L2_P_data_flag>0</b_L2_P_data_flag>
<i_SV_accuracy>2</i_SV_accuracy>
<i_SV_health>0</i_SV_health>
<d_TGD>-1.11758708953857422e-08</d_TGD>
<d_IODC>3.30000000000000000e+01</d_IODC>
<i_AODO>27900</i_AODO>
<b_fit_interval_flag>0</b_fit_interval_flag>
<d_spare1>0.00000000000000000e+00</d_spare1>
<d_spare2>0.00000000000000000e+00</d_spare2>
<d_A_f0>4.06486913561820984e-04</d_A_f0>
<d_A_f1>2.61479726759716828e-12</d_A_f1>
<d_A_f2>0.00000000000000000e+00</d_A_f2>
<b_integrity_status_flag>0</b_integrity_status_flag>
<b_alert_flag>0</b_alert_flag>
<b_antispoofing_flag>0</b_antispoofing_flag>
</second>
</item>
</GNSS-SDR_ephemeris_map>
</boost_serialization>

View File

@ -0,0 +1,358 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE boost_serialization>
<boost_serialization signature="serialization::archive" version="12">
<GNSS-SDR_gnss_synchro_map class_id="0" tracking_level="0" version="0">
<count>10</count>
<item_version>0</item_version>
<item class_id="1" tracking_level="0" version="0">
<first>0</first>
<second class_id="2" tracking_level="0" version="0">
<System>71</System>
<Signal>
<count>3</count>
<item>49</item>
<item>67</item>
<item>0</item>
</Signal>
<PRN>1</PRN>
<Channel_ID>0</Channel_ID>
<Acq_delay_samples>2.28200000000000000e+03</Acq_delay_samples>
<Acq_doppler_hz>-2.50000000000000000e+03</Acq_doppler_hz>
<Acq_samplestamp_samples>10791</Acq_samplestamp_samples>
<Acq_doppler_step>0</Acq_doppler_step>
<Flag_valid_acquisition>0</Flag_valid_acquisition>
<fs>2600000</fs>
<Prompt_I>-3.85959140625000000e+04</Prompt_I>
<Prompt_Q>-9.03592163085937500e+02</Prompt_Q>
<CN0_dB_hz>5.96898384094238281e+01</CN0_dB_hz>
<Carrier_Doppler_hz>-2.57914688873291016e+03</Carrier_Doppler_hz>
<Carrier_phase_rads>8.35350813421410858e+05</Carrier_phase_rads>
<Code_phase_samples>3.31084377635761484e-01</Code_phase_samples>
<Tracking_sample_counter>133923691</Tracking_sample_counter>
<Flag_valid_symbol_output>1</Flag_valid_symbol_output>
<correlation_length_ms>1</correlation_length_ms>
<Flag_valid_word>1</Flag_valid_word>
<TOW_at_current_symbol_ms>518451424</TOW_at_current_symbol_ms>
<Pseudorange_m>2.28178186234515086e+07</Pseudorange_m>
<RX_time>5.18451500000000000e+05</RX_time>
<Flag_valid_pseudorange>1</Flag_valid_pseudorange>
<interp_TOW_ms>5.18451423887949765e+08</interp_TOW_ms>
</second>
</item>
<item>
<first>1</first>
<second>
<System>71</System>
<Signal>
<count>3</count>
<item>49</item>
<item>67</item>
<item>0</item>
</Signal>
<PRN>3</PRN>
<Channel_ID>1</Channel_ID>
<Acq_delay_samples>2.38500000000000000e+03</Acq_delay_samples>
<Acq_doppler_hz>-3.00000000000000000e+03</Acq_doppler_hz>
<Acq_samplestamp_samples>68450858</Acq_samplestamp_samples>
<Acq_doppler_step>0</Acq_doppler_step>
<Flag_valid_acquisition>0</Flag_valid_acquisition>
<fs>2600000</fs>
<Prompt_I>-4.34972734375000000e+04</Prompt_I>
<Prompt_Q>4.21364685058593750e+02</Prompt_Q>
<CN0_dB_hz>5.16798934936523438e+01</CN0_dB_hz>
<Carrier_Doppler_hz>-3.12509065246582031e+03</Carrier_Doppler_hz>
<Carrier_phase_rads>4.93910706686261110e+05</Carrier_phase_rads>
<Code_phase_samples>7.36033200862493686e-01</Code_phase_samples>
<Tracking_sample_counter>133923971</Tracking_sample_counter>
<Flag_valid_symbol_output>1</Flag_valid_symbol_output>
<correlation_length_ms>1</correlation_length_ms>
<Flag_valid_word>1</Flag_valid_word>
<TOW_at_current_symbol_ms>518451431</TOW_at_current_symbol_ms>
<Pseudorange_m>2.07516033774388395e+07</Pseudorange_m>
<RX_time>5.18451500000000000e+05</RX_time>
<Flag_valid_pseudorange>1</Flag_valid_pseudorange>
<interp_TOW_ms>5.18451430780101955e+08</interp_TOW_ms>
</second>
</item>
<item>
<first>2</first>
<second>
<System>71</System>
<Signal>
<count>3</count>
<item>49</item>
<item>67</item>
<item>0</item>
</Signal>
<PRN>28</PRN>
<Channel_ID>2</Channel_ID>
<Acq_delay_samples>1.52700000000000000e+03</Acq_delay_samples>
<Acq_doppler_hz>-3.00000000000000000e+03</Acq_doppler_hz>
<Acq_samplestamp_samples>1350770</Acq_samplestamp_samples>
<Acq_doppler_step>0</Acq_doppler_step>
<Flag_valid_acquisition>0</Flag_valid_acquisition>
<fs>2600000</fs>
<Prompt_I>4.46268046875000000e+04</Prompt_I>
<Prompt_Q>-3.98811938476562500e+03</Prompt_Q>
<CN0_dB_hz>5.25376167297363281e+01</CN0_dB_hz>
<Carrier_Doppler_hz>-2.92984253692626953e+03</Carrier_Doppler_hz>
<Carrier_phase_rads>9.35704822809229488e+05</Carrier_phase_rads>
<Code_phase_samples>9.30327007595224131e-01</Code_phase_samples>
<Tracking_sample_counter>133923941</Tracking_sample_counter>
<Flag_valid_symbol_output>1</Flag_valid_symbol_output>
<correlation_length_ms>1</correlation_length_ms>
<Flag_valid_word>1</Flag_valid_word>
<TOW_at_current_symbol_ms>518451436</TOW_at_current_symbol_ms>
<Pseudorange_m>1.92492043561209217e+07</Pseudorange_m>
<RX_time>5.18451500000000000e+05</RX_time>
<Flag_valid_pseudorange>1</Flag_valid_pseudorange>
<interp_TOW_ms>5.18451435791565657e+08</interp_TOW_ms>
</second>
</item>
<item>
<first>4</first>
<second>
<System>71</System>
<Signal>
<count>3</count>
<item>49</item>
<item>67</item>
<item>0</item>
</Signal>
<PRN>23</PRN>
<Channel_ID>4</Channel_ID>
<Acq_delay_samples>1.13100000000000000e+03</Acq_delay_samples>
<Acq_doppler_hz>1.00000000000000000e+03</Acq_doppler_hz>
<Acq_samplestamp_samples>994247</Acq_samplestamp_samples>
<Acq_doppler_step>0</Acq_doppler_step>
<Flag_valid_acquisition>0</Flag_valid_acquisition>
<fs>2600000</fs>
<Prompt_I>3.98655546875000000e+04</Prompt_I>
<Prompt_Q>-8.63781860351562500e+02</Prompt_Q>
<CN0_dB_hz>5.24684982299804688e+01</CN0_dB_hz>
<Carrier_Doppler_hz>1.09281750951009121e+03</Carrier_Doppler_hz>
<Carrier_phase_rads>-3.54128275530727289e+05</Carrier_phase_rads>
<Code_phase_samples>4.08304036132904002e-01</Code_phase_samples>
<Tracking_sample_counter>133922883</Tracking_sample_counter>
<Flag_valid_symbol_output>1</Flag_valid_symbol_output>
<correlation_length_ms>1</correlation_length_ms>
<Flag_valid_word>1</Flag_valid_word>
<TOW_at_current_symbol_ms>518451429</TOW_at_current_symbol_ms>
<Pseudorange_m>2.12256989876578376e+07</Pseudorange_m>
<RX_time>5.18451500000000000e+05</RX_time>
<Flag_valid_pseudorange>1</Flag_valid_pseudorange>
<interp_TOW_ms>5.18451429198689222e+08</interp_TOW_ms>
</second>
</item>
<item>
<first>5</first>
<second>
<System>71</System>
<Signal>
<count>3</count>
<item>49</item>
<item>67</item>
<item>0</item>
</Signal>
<PRN>2</PRN>
<Channel_ID>5</Channel_ID>
<Acq_delay_samples>5.38000000000000000e+02</Acq_delay_samples>
<Acq_doppler_hz>1.75000000000000000e+03</Acq_doppler_hz>
<Acq_samplestamp_samples>4917751</Acq_samplestamp_samples>
<Acq_doppler_step>0</Acq_doppler_step>
<Flag_valid_acquisition>0</Flag_valid_acquisition>
<fs>2600000</fs>
<Prompt_I>-4.72456406250000000e+04</Prompt_I>
<Prompt_Q>-2.63723022460937500e+02</Prompt_Q>
<CN0_dB_hz>4.89446220397949219e+01</CN0_dB_hz>
<Carrier_Doppler_hz>1.83319645690917969e+03</Carrier_Doppler_hz>
<Carrier_phase_rads>-5.72184006019302527e+05</Carrier_phase_rads>
<Code_phase_samples>5.89544135488722532e-01</Code_phase_samples>
<Tracking_sample_counter>133922337</Tracking_sample_counter>
<Flag_valid_symbol_output>1</Flag_valid_symbol_output>
<correlation_length_ms>1</correlation_length_ms>
<Flag_valid_word>1</Flag_valid_word>
<TOW_at_current_symbol_ms>518451430</TOW_at_current_symbol_ms>
<Pseudorange_m>2.08629709015843943e+07</Pseudorange_m>
<RX_time>5.18451500000000000e+05</RX_time>
<Flag_valid_pseudorange>1</Flag_valid_pseudorange>
<interp_TOW_ms>5.18451430408619881e+08</interp_TOW_ms>
</second>
</item>
<item>
<first>6</first>
<second>
<System>71</System>
<Signal>
<count>3</count>
<item>49</item>
<item>67</item>
<item>0</item>
</Signal>
<PRN>17</PRN>
<Channel_ID>6</Channel_ID>
<Acq_delay_samples>2.21000000000000000e+02</Acq_delay_samples>
<Acq_doppler_hz>2.50000000000000000e+02</Acq_doppler_hz>
<Acq_samplestamp_samples>514377</Acq_samplestamp_samples>
<Acq_doppler_step>0</Acq_doppler_step>
<Flag_valid_acquisition>0</Flag_valid_acquisition>
<fs>2600000</fs>
<Prompt_I>4.27717460937500000e+04</Prompt_I>
<Prompt_Q>-9.45822082519531250e+02</Prompt_Q>
<CN0_dB_hz>5.38986015319824219e+01</CN0_dB_hz>
<Carrier_Doppler_hz>2.73018497467041016e+02</Carrier_Doppler_hz>
<Carrier_phase_rads>-9.09813659855529113e+04</Carrier_phase_rads>
<Code_phase_samples>6.57473345280777721e-01</Code_phase_samples>
<Tracking_sample_counter>133923172</Tracking_sample_counter>
<Flag_valid_symbol_output>1</Flag_valid_symbol_output>
<correlation_length_ms>1</correlation_length_ms>
<Flag_valid_word>1</Flag_valid_word>
<TOW_at_current_symbol_ms>518451440</TOW_at_current_symbol_ms>
<Pseudorange_m>1.79613337841309197e+07</Pseudorange_m>
<RX_time>5.18451500000000000e+05</RX_time>
<Flag_valid_pseudorange>1</Flag_valid_pseudorange>
<interp_TOW_ms>5.18451440087439477e+08</interp_TOW_ms>
</second>
</item>
<item>
<first>7</first>
<second>
<System>71</System>
<Signal>
<count>3</count>
<item>49</item>
<item>67</item>
<item>0</item>
</Signal>
<PRN>9</PRN>
<Channel_ID>7</Channel_ID>
<Acq_delay_samples>1.56900000000000000e+03</Acq_delay_samples>
<Acq_doppler_hz>2.25000000000000000e+03</Acq_doppler_hz>
<Acq_samplestamp_samples>7365787</Acq_samplestamp_samples>
<Acq_doppler_step>0</Acq_doppler_step>
<Flag_valid_acquisition>0</Flag_valid_acquisition>
<fs>2600000</fs>
<Prompt_I>-3.96159960937500000e+04</Prompt_I>
<Prompt_Q>-5.03847460937500000e+03</Prompt_Q>
<CN0_dB_hz>5.33032913208007812e+01</CN0_dB_hz>
<Carrier_Doppler_hz>2.30021731185913086e+03</Carrier_Doppler_hz>
<Carrier_phase_rads>-7.04913853936602012e+05</Carrier_phase_rads>
<Code_phase_samples>3.21518194999043772e-01</Code_phase_samples>
<Tracking_sample_counter>133922169</Tracking_sample_counter>
<Flag_valid_symbol_output>1</Flag_valid_symbol_output>
<correlation_length_ms>1</correlation_length_ms>
<Flag_valid_word>1</Flag_valid_word>
<TOW_at_current_symbol_ms>518451430</TOW_at_current_symbol_ms>
<Pseudorange_m>2.08435687343175523e+07</Pseudorange_m>
<RX_time>5.18451500000000000e+05</RX_time>
<Flag_valid_pseudorange>1</Flag_valid_pseudorange>
<interp_TOW_ms>5.18451430473338544e+08</interp_TOW_ms>
</second>
</item>
<item>
<first>8</first>
<second>
<System>71</System>
<Signal>
<count>3</count>
<item>49</item>
<item>67</item>
<item>0</item>
</Signal>
<PRN>10</PRN>
<Channel_ID>8</Channel_ID>
<Acq_delay_samples>2.12600000000000000e+03</Acq_delay_samples>
<Acq_doppler_hz>2.75000000000000000e+03</Acq_doppler_hz>
<Acq_samplestamp_samples>2173576</Acq_samplestamp_samples>
<Acq_doppler_step>0</Acq_doppler_step>
<Flag_valid_acquisition>0</Flag_valid_acquisition>
<fs>2600000</fs>
<Prompt_I>4.00322539062500000e+04</Prompt_I>
<Prompt_Q>-3.88590087890625000e+02</Prompt_Q>
<CN0_dB_hz>4.85561523437500000e+01</CN0_dB_hz>
<Carrier_Doppler_hz>2.81225794982910156e+03</Carrier_Doppler_hz>
<Carrier_phase_rads>-8.99142229977656389e+05</Carrier_phase_rads>
<Code_phase_samples>1.02370741655249731e-01</Code_phase_samples>
<Tracking_sample_counter>133922664</Tracking_sample_counter>
<Flag_valid_symbol_output>1</Flag_valid_symbol_output>
<correlation_length_ms>1</correlation_length_ms>
<Flag_valid_word>1</Flag_valid_word>
<TOW_at_current_symbol_ms>518451438</TOW_at_current_symbol_ms>
<Pseudorange_m>1.85022797143675610e+07</Pseudorange_m>
<RX_time>5.18451500000000000e+05</RX_time>
<Flag_valid_pseudorange>1</Flag_valid_pseudorange>
<interp_TOW_ms>5.18451438283038080e+08</interp_TOW_ms>
</second>
</item>
<item>
<first>9</first>
<second>
<System>71</System>
<Signal>
<count>3</count>
<item>49</item>
<item>67</item>
<item>0</item>
</Signal>
<PRN>12</PRN>
<Channel_ID>9</Channel_ID>
<Acq_delay_samples>2.13000000000000000e+02</Acq_delay_samples>
<Acq_doppler_hz>3.00000000000000000e+03</Acq_doppler_hz>
<Acq_samplestamp_samples>7464974</Acq_samplestamp_samples>
<Acq_doppler_step>0</Acq_doppler_step>
<Flag_valid_acquisition>0</Flag_valid_acquisition>
<fs>2600000</fs>
<Prompt_I>-4.03654140625000000e+04</Prompt_I>
<Prompt_Q>3.92351245117187500e+03</Prompt_Q>
<CN0_dB_hz>5.17314453125000000e+01</CN0_dB_hz>
<Carrier_Doppler_hz>3.03019989013671875e+03</Carrier_Doppler_hz>
<Carrier_phase_rads>-9.28340507655202877e+05</Carrier_phase_rads>
<Code_phase_samples>5.73995602361264901e-01</Code_phase_samples>
<Tracking_sample_counter>133923741</Tracking_sample_counter>
<Flag_valid_symbol_output>1</Flag_valid_symbol_output>
<correlation_length_ms>1</correlation_length_ms>
<Flag_valid_word>1</Flag_valid_word>
<TOW_at_current_symbol_ms>518451427</TOW_at_current_symbol_ms>
<Pseudorange_m>2.19242346189941987e+07</Pseudorange_m>
<RX_time>5.18451500000000000e+05</RX_time>
<Flag_valid_pseudorange>1</Flag_valid_pseudorange>
<interp_TOW_ms>5.18451426868625164e+08</interp_TOW_ms>
</second>
</item>
<item>
<first>10</first>
<second>
<System>71</System>
<Signal>
<count>3</count>
<item>49</item>
<item>67</item>
<item>0</item>
</Signal>
<PRN>6</PRN>
<Channel_ID>10</Channel_ID>
<Acq_delay_samples>4.70000000000000000e+01</Acq_delay_samples>
<Acq_doppler_hz>5.00000000000000000e+02</Acq_doppler_hz>
<Acq_samplestamp_samples>1859813</Acq_samplestamp_samples>
<Acq_doppler_step>0</Acq_doppler_step>
<Flag_valid_acquisition>0</Flag_valid_acquisition>
<fs>2600000</fs>
<Prompt_I>3.87814335937500000e+04</Prompt_I>
<Prompt_Q>2.13637329101562500e+03</Prompt_Q>
<CN0_dB_hz>6.00463027954101562e+01</CN0_dB_hz>
<Carrier_Doppler_hz>5.54514957427978516e+02</Carrier_Doppler_hz>
<Carrier_phase_rads>-1.78723083774703584e+05</Carrier_phase_rads>
<Code_phase_samples>3.47952294631795667e-01</Code_phase_samples>
<Tracking_sample_counter>133924211</Tracking_sample_counter>
<Flag_valid_symbol_output>1</Flag_valid_symbol_output>
<correlation_length_ms>1</correlation_length_ms>
<Flag_valid_word>1</Flag_valid_word>
<TOW_at_current_symbol_ms>518451439</TOW_at_current_symbol_ms>
<Pseudorange_m>1.83808922785463184e+07</Pseudorange_m>
<RX_time>5.18451500000000000e+05</RX_time>
<Flag_valid_pseudorange>1</Flag_valid_pseudorange>
<interp_TOW_ms>5.18451438687942982e+08</interp_TOW_ms>
</second>
</item>
</GNSS-SDR_gnss_synchro_map>
</boost_serialization>

View File

@ -354,6 +354,7 @@ int PositionSystemTest::configure_receiver()
config->set_property("Acquisition_1C.dump", "false");
config->set_property("Acquisition_1C.dump_filename", "./acquisition");
config->set_property("Acquisition_1C.dump_channel", "1");
config->set_property("Acquisition_1C.blocking", "true");
// Set Tracking
config->set_property("Tracking_1C.implementation", "GPS_L1_CA_DLL_PLL_Tracking");

View File

@ -75,7 +75,7 @@ DECLARE_string(log_dir);
#if EXTRA_TESTS
#include "unit-tests/signal-processing-blocks/acquisition/acq_performance_test.cc"
#include "unit-tests/signal-processing-blocks/tracking/tracking_pull-in_test.cc"
#if ENABLE_FPGA
#if FPGA_BLOCKS_TEST
#include "unit-tests/signal-processing-blocks/tracking/tracking_pull-in_test_fpga.cc"
#endif
#include "unit-tests/signal-processing-blocks/observables/hybrid_observables_test.cc"
@ -171,6 +171,7 @@ DECLARE_string(log_dir);
#include "unit-tests/signal-processing-blocks/tracking/gps_l1_ca_dll_pll_tracking_test.cc"
#include "unit-tests/signal-processing-blocks/tracking/gps_l1_ca_kf_tracking_test.cc"
#include "unit-tests/signal-processing-blocks/tracking/tracking_pull-in_test.cc"
#include "unit-tests/signal-processing-blocks/pvt/rtklib_solver_test.cc"
#if FPGA_BLOCKS_TEST
#include "unit-tests/signal-processing-blocks/tracking/tracking_pull-in_test_fpga.cc"
#endif

View File

@ -236,6 +236,11 @@ public:
arma::mat& measured_ch1,
std::string data_title);
void check_results_duplicated_satellite(
arma::mat& measured_sat1,
arma::mat& measured_sat2,
std::string data_title);
HybridObservablesTest()
{
factory = std::make_shared<GNSSBlockFactory>();
@ -987,6 +992,207 @@ void HybridObservablesTest::check_results_carrier_doppler(
ASSERT_LT(rmse_ch0, 30);
}
void HybridObservablesTest::check_results_duplicated_satellite(
arma::mat& measured_sat1,
arma::mat& measured_sat2,
std::string data_title)
{
//1. True value interpolation to match the measurement times
double t0 = measured_sat1(0, 0);
int size1 = measured_sat1.col(0).n_rows;
double t1 = measured_sat1(size1 - 1, 0);
arma::vec t = arma::linspace<arma::vec>(t0, t1, floor((t1 - t0) * 1e3));
//conversion between arma::vec and std:vector
arma::vec t_from_start = arma::linspace<arma::vec>(0, t1 - t0, floor((t1 - t0) * 1e3));
std::vector<double> time_vector(t_from_start.colptr(0), t_from_start.colptr(0) + t_from_start.n_rows);
//Doppler
arma::vec meas_sat1_doppler_interp;
arma::interp1(measured_sat1.col(0), measured_sat1.col(2), t, meas_sat1_doppler_interp);
arma::vec meas_sat2_doppler_interp;
arma::interp1(measured_sat2.col(0), measured_sat2.col(2), t, meas_sat2_doppler_interp);
//Carrier Phase
arma::vec meas_sat1_carrier_phase_interp;
arma::vec meas_sat2_carrier_phase_interp;
arma::interp1(measured_sat1.col(0), measured_sat1.col(3), t, meas_sat1_carrier_phase_interp);
arma::interp1(measured_sat2.col(0), measured_sat2.col(3), t, meas_sat2_carrier_phase_interp);
// generate double difference accumulated carrier phases
//compute error without the accumulated carrier phase offsets (which depends on the receiver starting time)
arma::vec delta_measured_carrier_phase_cycles = (meas_sat1_carrier_phase_interp - meas_sat1_carrier_phase_interp(0)) - (meas_sat2_carrier_phase_interp - meas_sat2_carrier_phase_interp(0));
//Pseudoranges
arma::vec meas_sat1_dist_interp;
arma::vec meas_sat2_dist_interp;
arma::interp1(measured_sat1.col(0), measured_sat1.col(4), t, meas_sat1_dist_interp);
arma::interp1(measured_sat2.col(0), measured_sat2.col(4), t, meas_sat2_dist_interp);
// generate delta pseudoranges
arma::vec delta_measured_dist_m = meas_sat1_dist_interp - meas_sat2_dist_interp;
//Carrier Doppler error
//2. RMSE
arma::vec err_ch0_hz;
//compute error
err_ch0_hz = meas_sat1_doppler_interp - meas_sat2_doppler_interp;
arma::vec err2_ch0 = arma::square(err_ch0_hz);
double rmse_ch0 = sqrt(arma::mean(err2_ch0));
//3. Mean err and variance
double error_mean_ch0 = arma::mean(err_ch0_hz);
double error_var_ch0 = arma::var(err_ch0_hz);
// 4. Peaks
double max_error_ch0 = arma::max(err_ch0_hz);
double min_error_ch0 = arma::min(err_ch0_hz);
//5. report
std::streamsize ss = std::cout.precision();
std::cout << std::setprecision(10) << data_title << "Carrier Doppler RMSE = "
<< rmse_ch0 << ", mean = " << error_mean_ch0
<< ", stdev = " << sqrt(error_var_ch0)
<< " (max,min) = " << max_error_ch0
<< "," << min_error_ch0
<< " [Hz]" << std::endl;
std::cout.precision(ss);
//plots
if (FLAGS_show_plots)
{
Gnuplot g3("linespoints");
g3.set_title(data_title + "Carrier Doppler error [Hz]");
g3.set_grid();
g3.set_xlabel("Time [s]");
g3.set_ylabel("Carrier Doppler error [Hz]");
//conversion between arma::vec and std:vector
std::vector<double> error_vec(err_ch0_hz.colptr(0), err_ch0_hz.colptr(0) + err_ch0_hz.n_rows);
g3.cmd("set key box opaque");
g3.plot_xy(time_vector, error_vec,
"Carrier Doppler error");
g3.set_legend();
g3.savetops(data_title + "Carrier_doppler_error");
g3.showonscreen(); // window output
}
//check results against the test tolerance
ASSERT_LT(error_mean_ch0, 5);
ASSERT_GT(error_mean_ch0, -5);
//assuming PLL BW=35
ASSERT_LT(error_var_ch0, 250);
ASSERT_LT(max_error_ch0, 100);
ASSERT_GT(min_error_ch0, -100);
ASSERT_LT(rmse_ch0, 30);
//Carrier Phase error
//2. RMSE
arma::vec err_carrier_phase;
err_carrier_phase = delta_measured_carrier_phase_cycles;
arma::vec err2_carrier_phase = arma::square(err_carrier_phase);
double rmse_carrier_phase = sqrt(arma::mean(err2_carrier_phase));
//3. Mean err and variance
double error_mean_carrier_phase = arma::mean(err_carrier_phase);
double error_var_carrier_phase = arma::var(err_carrier_phase);
// 4. Peaks
double max_error_carrier_phase = arma::max(err_carrier_phase);
double min_error_carrier_phase = arma::min(err_carrier_phase);
//5. report
ss = std::cout.precision();
std::cout << std::setprecision(10) << data_title << "Carrier Phase RMSE = "
<< rmse_carrier_phase << ", mean = " << error_mean_carrier_phase
<< ", stdev = " << sqrt(error_var_carrier_phase)
<< " (max,min) = " << max_error_carrier_phase
<< "," << min_error_carrier_phase
<< " [Cycles]" << std::endl;
std::cout.precision(ss);
//plots
if (FLAGS_show_plots)
{
Gnuplot g3("linespoints");
g3.set_title(data_title + "Carrier Phase error [Cycles]");
g3.set_grid();
g3.set_xlabel("Time [s]");
g3.set_ylabel("Carrier Phase error [Cycles]");
//conversion between arma::vec and std:vector
std::vector<double> range_error_m(err_carrier_phase.colptr(0), err_carrier_phase.colptr(0) + err_carrier_phase.n_rows);
g3.cmd("set key box opaque");
g3.plot_xy(time_vector, range_error_m,
"Carrier Phase error");
g3.set_legend();
g3.savetops(data_title + "duplicated_satellite_carrier_phase_error");
g3.showonscreen(); // window output
}
//check results against the test tolerance
ASSERT_LT(rmse_carrier_phase, 0.25);
ASSERT_LT(error_mean_carrier_phase, 0.2);
ASSERT_GT(error_mean_carrier_phase, -0.2);
ASSERT_LT(error_var_carrier_phase, 0.5);
ASSERT_LT(max_error_carrier_phase, 0.5);
ASSERT_GT(min_error_carrier_phase, -0.5);
//Pseudorange error
//2. RMSE
arma::vec err_pseudorange;
err_pseudorange = delta_measured_dist_m;
arma::vec err2_pseudorange = arma::square(err_pseudorange);
double rmse_pseudorange = sqrt(arma::mean(err2_pseudorange));
//3. Mean err and variance
double error_mean_pseudorange = arma::mean(err_pseudorange);
double error_var_pseudorange = arma::var(err_pseudorange);
// 4. Peaks
double max_error_pseudorange = arma::max(err_pseudorange);
double min_error_pseudorange = arma::min(err_pseudorange);
//5. report
ss = std::cout.precision();
std::cout << std::setprecision(10) << data_title << "Pseudorange RMSE = "
<< rmse_pseudorange << ", mean = " << error_mean_pseudorange
<< ", stdev = " << sqrt(error_var_pseudorange)
<< " (max,min) = " << max_error_pseudorange
<< "," << min_error_pseudorange
<< " [meters]" << std::endl;
std::cout.precision(ss);
//plots
if (FLAGS_show_plots)
{
Gnuplot g3("linespoints");
g3.set_title(data_title + "Pseudorange error [m]");
g3.set_grid();
g3.set_xlabel("Time [s]");
g3.set_ylabel("Pseudorange error [m]");
//conversion between arma::vec and std:vector
std::vector<double> range_error_m(err_pseudorange.colptr(0), err_pseudorange.colptr(0) + err_pseudorange.n_rows);
g3.cmd("set key box opaque");
g3.plot_xy(time_vector, range_error_m,
"Pseudorrange error");
g3.set_legend();
g3.savetops(data_title + "duplicated_satellite_pseudorrange_error");
g3.showonscreen(); // window output
}
//check results against the test tolerance
ASSERT_LT(rmse_pseudorange, 3.0);
ASSERT_LT(error_mean_pseudorange, 1.0);
ASSERT_GT(error_mean_pseudorange, -1.0);
ASSERT_LT(error_var_pseudorange, 10.0);
ASSERT_LT(max_error_pseudorange, 10.0);
ASSERT_GT(min_error_pseudorange, -10.0);
}
bool HybridObservablesTest::save_mat_xy(std::vector<double>& x, std::vector<double>& y, std::string filename)
{
try
@ -1535,7 +1741,6 @@ TEST_F(HybridObservablesTest, ValidationOfResults)
}
}
//Cut measurement tail zeros
arma::uvec index;
for (unsigned int n = 0; n < measured_obs_vec.size(); n++)
@ -1548,9 +1753,7 @@ TEST_F(HybridObservablesTest, ValidationOfResults)
}
//Cut measurement initial transitory of the measurements
double initial_transitory_s = FLAGS_skip_obs_transitory_s;
for (unsigned int n = 0; n < measured_obs_vec.size(); n++)
{
index = arma::find(measured_obs_vec.at(n).col(0) >= (measured_obs_vec.at(n)(0, 0) + initial_transitory_s), 1, "first");
@ -1567,83 +1770,128 @@ TEST_F(HybridObservablesTest, ValidationOfResults)
}
//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 (the nearest) and compute the receiver time offset at observable level
double min_pr = std::numeric_limits<double>::max();
unsigned int min_pr_ch_id = 0;
for (unsigned int n = 0; n < measured_obs_vec.size(); n++)
if (FLAGS_duplicated_satellites_test)
{
if (epoch_counters_vec.at(n) > 10) //discard non-valid channels
//special test mode for duplicated satellites
std::vector<int> prn_pairs;
std::stringstream ss(FLAGS_duplicated_satellites_prns);
int i;
while (ss >> i)
{
{
if (measured_obs_vec.at(n)(0, 4) < min_pr)
{
min_pr = measured_obs_vec.at(n)(0, 4);
min_pr_ch_id = n;
}
}
prn_pairs.push_back(i);
if (ss.peek() == ',')
ss.ignore();
}
if (prn_pairs.size() % 2 != 0)
{
std::cout << "Test settings error: duplicated_satellites_prns are even\n";
}
else
{
std::cout << "PRN " << gnss_synchro_vec.at(n).PRN << " has NO observations!\n";
for (unsigned int n = 0; n < prn_pairs.size(); n = n + 2)
{
int sat1_ch_id = -1;
int sat2_ch_id = -1;
for (unsigned int ch = 0; ch < measured_obs_vec.size(); ch++)
{
if (epoch_counters_vec.at(ch) > 10) //discard non-valid channels
{
if (gnss_synchro_vec.at(ch).PRN == prn_pairs.at(n))
{
sat1_ch_id = ch;
}
if (gnss_synchro_vec.at(ch).PRN == prn_pairs.at(n + 1))
{
sat2_ch_id = ch;
}
}
}
if (sat1_ch_id != -1 and sat2_ch_id != -1)
{
//compute single differences for the duplicated satellite
check_results_duplicated_satellite(
measured_obs_vec.at(sat1_ch_id),
measured_obs_vec.at(sat2_ch_id),
"Duplicated sat [CH " + std::to_string(sat1_ch_id) + "," + std::to_string(sat2_ch_id) + "] PRNs " + std::to_string(gnss_synchro_vec.at(sat1_ch_id).PRN) + "," + std::to_string(gnss_synchro_vec.at(sat2_ch_id).PRN) + " ");
}
else
{
std::cout << "Satellites PRNs " << prn_pairs.at(n) << "and " << prn_pairs.at(n) << " not found\n";
}
}
}
}
arma::vec receiver_time_offset_ref_channel_s;
receiver_time_offset_ref_channel_s = (true_obs_vec.at(min_pr_ch_id).col(1)(0) - measured_obs_vec.at(min_pr_ch_id).col(4)(0)) / GPS_C_m_s;
std::cout << "Ref. channel initial Receiver time offset " << receiver_time_offset_ref_channel_s(0) * 1e3 << " [ms]" << std::endl;
for (unsigned int n = 0; n < measured_obs_vec.size(); n++)
else
{
//debug save to .mat
std::vector<double> tmp_vector_x(true_obs_vec.at(n).col(0).colptr(0),
true_obs_vec.at(n).col(0).colptr(0) + true_obs_vec.at(n).col(0).n_rows);
std::vector<double> tmp_vector_y(true_obs_vec.at(n).col(1).colptr(0),
true_obs_vec.at(n).col(1).colptr(0) + true_obs_vec.at(n).col(1).n_rows);
save_mat_xy(tmp_vector_x, tmp_vector_y, std::string("true_pr_ch_" + std::to_string(n)));
//normal mode
std::vector<double> tmp_vector_x2(measured_obs_vec.at(n).col(0).colptr(0),
measured_obs_vec.at(n).col(0).colptr(0) + measured_obs_vec.at(n).col(0).n_rows);
std::vector<double> tmp_vector_y2(measured_obs_vec.at(n).col(4).colptr(0),
measured_obs_vec.at(n).col(4).colptr(0) + measured_obs_vec.at(n).col(4).n_rows);
save_mat_xy(tmp_vector_x2, tmp_vector_y2, std::string("measured_pr_ch_" + std::to_string(n)));
//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)
std::vector<double> tmp_vector_x3(true_obs_vec.at(n).col(0).colptr(0),
true_obs_vec.at(n).col(0).colptr(0) + true_obs_vec.at(n).col(0).n_rows);
std::vector<double> tmp_vector_y3(true_obs_vec.at(n).col(2).colptr(0),
true_obs_vec.at(n).col(2).colptr(0) + true_obs_vec.at(n).col(2).n_rows);
save_mat_xy(tmp_vector_x3, tmp_vector_y3, std::string("true_doppler_ch_" + std::to_string(n)));
std::vector<double> tmp_vector_x4(measured_obs_vec.at(n).col(0).colptr(0),
measured_obs_vec.at(n).col(0).colptr(0) + measured_obs_vec.at(n).col(0).n_rows);
std::vector<double> tmp_vector_y4(measured_obs_vec.at(n).col(2).colptr(0),
measured_obs_vec.at(n).col(2).colptr(0) + measured_obs_vec.at(n).col(2).n_rows);
save_mat_xy(tmp_vector_x4, tmp_vector_y4, std::string("measured_doppler_ch_" + std::to_string(n)));
if (epoch_counters_vec.at(n) > 10) //discard non-valid channels
//Find the reference satellite (the nearest) and compute the receiver time offset at observable level
double min_pr = std::numeric_limits<double>::max();
unsigned int min_pr_ch_id = 0;
for (unsigned int n = 0; n < measured_obs_vec.size(); n++)
{
arma::vec true_TOW_ref_ch_s = true_obs_vec.at(min_pr_ch_id).col(0) - receiver_time_offset_ref_channel_s(0);
arma::vec true_TOW_ch_s = true_obs_vec.at(n).col(0) - receiver_time_offset_ref_channel_s(0);
//Compare measured observables
if (min_pr_ch_id != n)
if (epoch_counters_vec.at(n) > 10) //discard non-valid channels
{
check_results_code_pseudorange(true_obs_vec.at(n),
true_obs_vec.at(min_pr_ch_id),
true_TOW_ch_s,
true_TOW_ref_ch_s,
measured_obs_vec.at(n),
measured_obs_vec.at(min_pr_ch_id),
"[CH " + std::to_string(n) + "] PRN " + std::to_string(gnss_synchro_vec.at(n).PRN) + " ");
{
if (measured_obs_vec.at(n)(0, 4) < min_pr)
{
min_pr = measured_obs_vec.at(n)(0, 4);
min_pr_ch_id = n;
}
}
}
else
{
std::cout << "PRN " << gnss_synchro_vec.at(n).PRN << " has NO observations!\n";
}
}
//Do not compare E5a with E5 RINEX due to the Doppler frequency discrepancy caused by the different center frequencies
//E5a_fc=1176.45e6, E5b_fc=1207.14e6, E5_fc=1191.795e6;
if (strcmp("5X\0", gnss_synchro_vec.at(n).Signal) != 0 or FLAGS_compare_with_5X)
arma::vec receiver_time_offset_ref_channel_s;
receiver_time_offset_ref_channel_s = (true_obs_vec.at(min_pr_ch_id).col(1)(0) - measured_obs_vec.at(min_pr_ch_id).col(4)(0)) / GPS_C_m_s;
std::cout << "Ref. channel initial Receiver time offset " << receiver_time_offset_ref_channel_s(0) * 1e3 << " [ms]" << std::endl;
for (unsigned int n = 0; n < measured_obs_vec.size(); n++)
{
//debug save to .mat
std::vector<double> tmp_vector_x(true_obs_vec.at(n).col(0).colptr(0),
true_obs_vec.at(n).col(0).colptr(0) + true_obs_vec.at(n).col(0).n_rows);
std::vector<double> tmp_vector_y(true_obs_vec.at(n).col(1).colptr(0),
true_obs_vec.at(n).col(1).colptr(0) + true_obs_vec.at(n).col(1).n_rows);
save_mat_xy(tmp_vector_x, tmp_vector_y, std::string("true_pr_ch_" + std::to_string(n)));
std::vector<double> tmp_vector_x2(measured_obs_vec.at(n).col(0).colptr(0),
measured_obs_vec.at(n).col(0).colptr(0) + measured_obs_vec.at(n).col(0).n_rows);
std::vector<double> tmp_vector_y2(measured_obs_vec.at(n).col(4).colptr(0),
measured_obs_vec.at(n).col(4).colptr(0) + measured_obs_vec.at(n).col(4).n_rows);
save_mat_xy(tmp_vector_x2, tmp_vector_y2, std::string("measured_pr_ch_" + std::to_string(n)));
std::vector<double> tmp_vector_x3(true_obs_vec.at(n).col(0).colptr(0),
true_obs_vec.at(n).col(0).colptr(0) + true_obs_vec.at(n).col(0).n_rows);
std::vector<double> tmp_vector_y3(true_obs_vec.at(n).col(2).colptr(0),
true_obs_vec.at(n).col(2).colptr(0) + true_obs_vec.at(n).col(2).n_rows);
save_mat_xy(tmp_vector_x3, tmp_vector_y3, std::string("true_doppler_ch_" + std::to_string(n)));
std::vector<double> tmp_vector_x4(measured_obs_vec.at(n).col(0).colptr(0),
measured_obs_vec.at(n).col(0).colptr(0) + measured_obs_vec.at(n).col(0).n_rows);
std::vector<double> tmp_vector_y4(measured_obs_vec.at(n).col(2).colptr(0),
measured_obs_vec.at(n).col(2).colptr(0) + measured_obs_vec.at(n).col(2).n_rows);
save_mat_xy(tmp_vector_x4, tmp_vector_y4, std::string("measured_doppler_ch_" + std::to_string(n)));
if (epoch_counters_vec.at(n) > 10) //discard non-valid channels
{
arma::vec true_TOW_ref_ch_s = true_obs_vec.at(min_pr_ch_id).col(0) - receiver_time_offset_ref_channel_s(0);
arma::vec true_TOW_ch_s = true_obs_vec.at(n).col(0) - receiver_time_offset_ref_channel_s(0);
//Compare measured observables
if (min_pr_ch_id != n)
{
check_results_carrier_phase_double_diff(true_obs_vec.at(n),
check_results_code_pseudorange(true_obs_vec.at(n),
true_obs_vec.at(min_pr_ch_id),
true_TOW_ch_s,
true_TOW_ref_ch_s,
@ -1651,34 +1899,47 @@ TEST_F(HybridObservablesTest, ValidationOfResults)
measured_obs_vec.at(min_pr_ch_id),
"[CH " + std::to_string(n) + "] PRN " + std::to_string(gnss_synchro_vec.at(n).PRN) + " ");
check_results_carrier_doppler_double_diff(true_obs_vec.at(n),
true_obs_vec.at(min_pr_ch_id),
//Do not compare E5a with E5 RINEX due to the Doppler frequency discrepancy caused by the different center frequencies
//E5a_fc=1176.45e6, E5b_fc=1207.14e6, E5_fc=1191.795e6;
if (strcmp("5X\0", gnss_synchro_vec.at(n).Signal) != 0 or FLAGS_compare_with_5X)
{
check_results_carrier_phase_double_diff(true_obs_vec.at(n),
true_obs_vec.at(min_pr_ch_id),
true_TOW_ch_s,
true_TOW_ref_ch_s,
measured_obs_vec.at(n),
measured_obs_vec.at(min_pr_ch_id),
"[CH " + std::to_string(n) + "] PRN " + std::to_string(gnss_synchro_vec.at(n).PRN) + " ");
check_results_carrier_doppler_double_diff(true_obs_vec.at(n),
true_obs_vec.at(min_pr_ch_id),
true_TOW_ch_s,
true_TOW_ref_ch_s,
measured_obs_vec.at(n),
measured_obs_vec.at(min_pr_ch_id),
"[CH " + std::to_string(n) + "] PRN " + std::to_string(gnss_synchro_vec.at(n).PRN) + " ");
}
}
else
{
std::cout << "[CH " << std::to_string(n) << "] PRN " << std::to_string(gnss_synchro_vec.at(n).PRN) << " is the reference satellite" << std::endl;
}
if (FLAGS_compute_single_diffs)
{
check_results_carrier_phase(true_obs_vec.at(n),
true_TOW_ch_s,
measured_obs_vec.at(n),
"[CH " + std::to_string(n) + "] PRN " + std::to_string(gnss_synchro_vec.at(n).PRN) + " ");
check_results_carrier_doppler(true_obs_vec.at(n),
true_TOW_ch_s,
true_TOW_ref_ch_s,
measured_obs_vec.at(n),
measured_obs_vec.at(min_pr_ch_id),
"[CH " + std::to_string(n) + "] PRN " + std::to_string(gnss_synchro_vec.at(n).PRN) + " ");
}
}
else
{
std::cout << "[CH " << std::to_string(n) << "] PRN " << std::to_string(gnss_synchro_vec.at(n).PRN) << " is the reference satellite" << std::endl;
std::cout << "PRN " << gnss_synchro_vec.at(n).PRN << " has NO observations!\n";
}
if (FLAGS_compute_single_diffs)
{
check_results_carrier_phase(true_obs_vec.at(n),
true_TOW_ch_s,
measured_obs_vec.at(n),
"[CH " + std::to_string(n) + "] PRN " + std::to_string(gnss_synchro_vec.at(n).PRN) + " ");
check_results_carrier_doppler(true_obs_vec.at(n),
true_TOW_ch_s,
measured_obs_vec.at(n),
"[CH " + std::to_string(n) + "] PRN " + std::to_string(gnss_synchro_vec.at(n).PRN) + " ");
}
}
else
{
std::cout << "PRN " << gnss_synchro_vec.at(n).PRN << " has NO observations!\n";
}
}
std::cout << "Test completed in " << elapsed_seconds.count() << " [s]" << std::endl;

View File

@ -0,0 +1,443 @@
/*!
* \file rtklib_solver_test.cc
* \brief Implements Unit Test for the rtklib PVT solver class.
* \author Javier Arribas, 2018. 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 <https://www.gnu.org/licenses/>.
*
* -------------------------------------------------------------------------
*/
#include <gtest/gtest.h>
#include <string>
#include <iomanip>
#include <iostream>
#include <boost/archive/xml_oarchive.hpp>
#include <boost/archive/xml_iarchive.hpp>
#include <boost/serialization/map.hpp>
#include "rtklib_solver.h"
#include "in_memory_configuration.h"
#include "gnss_sdr_supl_client.h"
rtk_t configure_rtklib_options()
{
std::shared_ptr<InMemoryConfiguration> configuration;
configuration = std::make_shared<InMemoryConfiguration>();
std::string role = "rtklib_solver";
// custom options
configuration->set_property("rtklib_solver.positioning_mode", "Single");
configuration->set_property("rtklib_solver.elevation_mask", "0");
configuration->set_property("rtklib_solver.iono_model", "OFF");
configuration->set_property("rtklib_solver.trop_model", "OFF");
//RTKLIB PVT solver options
// Settings 1
int positioning_mode = -1;
std::string default_pos_mode("Single");
std::string positioning_mode_str = configuration->property(role + ".positioning_mode", default_pos_mode); /* (PMODE_XXX) see src/algorithms/libs/rtklib/rtklib.h */
if (positioning_mode_str.compare("Single") == 0) positioning_mode = PMODE_SINGLE;
if (positioning_mode_str.compare("Static") == 0) positioning_mode = PMODE_STATIC;
if (positioning_mode_str.compare("Kinematic") == 0) positioning_mode = PMODE_KINEMA;
if (positioning_mode_str.compare("PPP_Static") == 0) positioning_mode = PMODE_PPP_STATIC;
if (positioning_mode_str.compare("PPP_Kinematic") == 0) positioning_mode = PMODE_PPP_KINEMA;
if (positioning_mode == -1)
{
//warn user and set the default
std::cout << "WARNING: Bad specification of positioning mode." << std::endl;
std::cout << "positioning_mode possible values: Single / Static / Kinematic / PPP_Static / PPP_Kinematic" << std::endl;
std::cout << "positioning_mode specified value: " << positioning_mode_str << std::endl;
std::cout << "Setting positioning_mode to Single" << std::endl;
positioning_mode = PMODE_SINGLE;
}
int num_bands = 1;
// if ((gps_1C_count > 0) || (gal_1B_count > 0) || (glo_1G_count > 0)) num_bands = 1;
// if (((gps_1C_count > 0) || (gal_1B_count > 0) || (glo_1G_count > 0)) && ((gps_2S_count > 0) || (glo_2G_count > 0))) num_bands = 2;
// if (((gps_1C_count > 0) || (gal_1B_count > 0) || (glo_1G_count > 0)) && ((gal_E5a_count > 0) || (gal_E5b_count > 0) || (gps_L5_count > 0))) num_bands = 2;
// if (((gps_1C_count > 0) || (gal_1B_count > 0) || (glo_1G_count > 0)) && ((gps_2S_count > 0) || (glo_2G_count > 0)) && ((gal_E5a_count > 0) || (gal_E5b_count > 0) || (gps_L5_count > 0))) num_bands = 3;
int number_of_frequencies = configuration->property(role + ".num_bands", num_bands); /* (1:L1, 2:L1+L2, 3:L1+L2+L5) */
if ((number_of_frequencies < 1) || (number_of_frequencies > 3))
{
//warn user and set the default
number_of_frequencies = num_bands;
}
double elevation_mask = configuration->property(role + ".elevation_mask", 15.0);
if ((elevation_mask < 0.0) || (elevation_mask > 90.0))
{
//warn user and set the default
LOG(WARNING) << "Erroneous Elevation Mask. Setting to default value of 15.0 degrees";
elevation_mask = 15.0;
}
int dynamics_model = configuration->property(role + ".dynamics_model", 0); /* dynamics model (0:none, 1:velocity, 2:accel) */
if ((dynamics_model < 0) || (dynamics_model > 2))
{
//warn user and set the default
LOG(WARNING) << "Erroneous Dynamics Model configuration. Setting to default value of (0:none)";
dynamics_model = 0;
}
std::string default_iono_model("OFF");
std::string iono_model_str = configuration->property(role + ".iono_model", default_iono_model); /* (IONOOPT_XXX) see src/algorithms/libs/rtklib/rtklib.h */
int iono_model = -1;
if (iono_model_str.compare("OFF") == 0) iono_model = IONOOPT_OFF;
if (iono_model_str.compare("Broadcast") == 0) iono_model = IONOOPT_BRDC;
if (iono_model_str.compare("SBAS") == 0) iono_model = IONOOPT_SBAS;
if (iono_model_str.compare("Iono-Free-LC") == 0) iono_model = IONOOPT_IFLC;
if (iono_model_str.compare("Estimate_STEC") == 0) iono_model = IONOOPT_EST;
if (iono_model_str.compare("IONEX") == 0) iono_model = IONOOPT_TEC;
if (iono_model == -1)
{
//warn user and set the default
std::cout << "WARNING: Bad specification of ionospheric model." << std::endl;
std::cout << "iono_model possible values: OFF / Broadcast / SBAS / Iono-Free-LC / Estimate_STEC / IONEX" << std::endl;
std::cout << "iono_model specified value: " << iono_model_str << std::endl;
std::cout << "Setting iono_model to OFF" << std::endl;
iono_model = IONOOPT_OFF; /* 0: ionosphere option: correction off */
}
std::string default_trop_model("OFF");
int trop_model = -1;
std::string trop_model_str = configuration->property(role + ".trop_model", default_trop_model); /* (TROPOPT_XXX) see src/algorithms/libs/rtklib/rtklib.h */
if (trop_model_str.compare("OFF") == 0) trop_model = TROPOPT_OFF;
if (trop_model_str.compare("Saastamoinen") == 0) trop_model = TROPOPT_SAAS;
if (trop_model_str.compare("SBAS") == 0) trop_model = TROPOPT_SBAS;
if (trop_model_str.compare("Estimate_ZTD") == 0) trop_model = TROPOPT_EST;
if (trop_model_str.compare("Estimate_ZTD_Grad") == 0) trop_model = TROPOPT_ESTG;
if (trop_model == -1)
{
//warn user and set the default
std::cout << "WARNING: Bad specification of tropospheric model." << std::endl;
std::cout << "trop_model possible values: OFF / Saastamoinen / SBAS / Estimate_ZTD / Estimate_ZTD_Grad" << std::endl;
std::cout << "trop_model specified value: " << trop_model_str << std::endl;
std::cout << "Setting trop_model to OFF" << std::endl;
trop_model = TROPOPT_OFF;
}
/* RTKLIB positioning options */
int sat_PCV = 0; /* Set whether the satellite antenna PCV (phase center variation) model is used or not. This feature requires a Satellite Antenna PCV File. */
int rec_PCV = 0; /* Set whether the receiver antenna PCV (phase center variation) model is used or not. This feature requires a Receiver Antenna PCV File. */
/* Set whether the phase windup correction for PPP modes is applied or not. Only applicable to PPP* modes.*/
int phwindup = configuration->property(role + ".phwindup", 0);
/* Set whether the GPS Block IIA satellites in eclipse are excluded or not.
The eclipsing Block IIA satellites often degrade the PPP solutions due to unpredicted behavior of yawattitude. Only applicable to PPP* modes.*/
int reject_GPS_IIA = configuration->property(role + ".reject_GPS_IIA", 0);
/* Set whether RAIM (receiver autonomous integrity monitoring) FDE (fault detection and exclusion) feature is enabled or not.
In case of RAIM FDE enabled, a satellite is excluded if SSE (sum of squared errors) of residuals is over a threshold.
The excluded satellite is selected to indicate the minimum SSE. */
int raim_fde = configuration->property(role + ".raim_fde", 0);
int earth_tide = configuration->property(role + ".earth_tide", 0);
int nsys = SYS_GPS;
// if ((gps_1C_count > 0) || (gps_2S_count > 0) || (gps_L5_count > 0)) nsys += SYS_GPS;
// if ((gal_1B_count > 0) || (gal_E5a_count > 0) || (gal_E5b_count > 0)) nsys += SYS_GAL;
// if ((glo_1G_count > 0) || (glo_2G_count > 0)) nsys += SYS_GLO;
int navigation_system = configuration->property(role + ".navigation_system", nsys); /* (SYS_XXX) see src/algorithms/libs/rtklib/rtklib.h */
if ((navigation_system < 1) || (navigation_system > 255)) /* GPS: 1 SBAS: 2 GPS+SBAS: 3 Galileo: 8 Galileo+GPS: 9 GPS+SBAS+Galileo: 11 All: 255 */
{
//warn user and set the default
LOG(WARNING) << "Erroneous Navigation System. Setting to default value of (0:none)";
navigation_system = nsys;
}
// Settings 2
std::string default_gps_ar("Continuous");
std::string integer_ambiguity_resolution_gps_str = configuration->property(role + ".AR_GPS", default_gps_ar); /* Integer Ambiguity Resolution mode for GPS (0:off,1:continuous,2:instantaneous,3:fix and hold,4:ppp-ar) */
int integer_ambiguity_resolution_gps = -1;
if (integer_ambiguity_resolution_gps_str.compare("OFF") == 0) integer_ambiguity_resolution_gps = ARMODE_OFF;
if (integer_ambiguity_resolution_gps_str.compare("Continuous") == 0) integer_ambiguity_resolution_gps = ARMODE_CONT;
if (integer_ambiguity_resolution_gps_str.compare("Instantaneous") == 0) integer_ambiguity_resolution_gps = ARMODE_INST;
if (integer_ambiguity_resolution_gps_str.compare("Fix-and-Hold") == 0) integer_ambiguity_resolution_gps = ARMODE_FIXHOLD;
if (integer_ambiguity_resolution_gps_str.compare("PPP-AR") == 0) integer_ambiguity_resolution_gps = ARMODE_PPPAR;
if (integer_ambiguity_resolution_gps == -1)
{
//warn user and set the default
std::cout << "WARNING: Bad specification of GPS ambiguity resolution method." << std::endl;
std::cout << "AR_GPS possible values: OFF / Continuous / Instantaneous / Fix-and-Hold / PPP-AR" << std::endl;
std::cout << "AR_GPS specified value: " << integer_ambiguity_resolution_gps_str << std::endl;
std::cout << "Setting AR_GPS to OFF" << std::endl;
integer_ambiguity_resolution_gps = ARMODE_OFF;
}
int integer_ambiguity_resolution_glo = configuration->property(role + ".AR_GLO", 1); /* Integer Ambiguity Resolution mode for GLONASS (0:off,1:on,2:auto cal,3:ext cal) */
if ((integer_ambiguity_resolution_glo < 0) || (integer_ambiguity_resolution_glo > 3))
{
//warn user and set the default
LOG(WARNING) << "Erroneous Integer Ambiguity Resolution for GLONASS . Setting to default value of (1:on)";
integer_ambiguity_resolution_glo = 1;
}
int integer_ambiguity_resolution_bds = configuration->property(role + ".AR_DBS", 1); /* Integer Ambiguity Resolution mode for BEIDOU (0:off,1:on) */
if ((integer_ambiguity_resolution_bds < 0) || (integer_ambiguity_resolution_bds > 1))
{
//warn user and set the default
LOG(WARNING) << "Erroneous Integer Ambiguity Resolution for BEIDOU . Setting to default value of (1:on)";
integer_ambiguity_resolution_bds = 1;
}
double min_ratio_to_fix_ambiguity = configuration->property(role + ".min_ratio_to_fix_ambiguity", 3.0); /* Set the integer ambiguity validation threshold for ratiotest,
which uses the ratio of squared residuals of the best integer vector to the secondbest vector. */
int min_lock_to_fix_ambiguity = configuration->property(role + ".min_lock_to_fix_ambiguity", 0); /* Set the minimum lock count to fix integer ambiguity.
If the lock count is less than the value, the ambiguity is excluded from the fixed integer vector. */
double min_elevation_to_fix_ambiguity = configuration->property(role + ".min_elevation_to_fix_ambiguity", 0.0); /* Set the minimum elevation (deg) to fix integer ambiguity.
If the elevation of the satellite is less than the value, the ambiguity is excluded from the fixed integer vector. */
int outage_reset_ambiguity = configuration->property(role + ".outage_reset_ambiguity", 5); /* Set the outage count to reset ambiguity. If the data outage count is over the value, the estimated ambiguity is reset to the initial value. */
double slip_threshold = configuration->property(role + ".slip_threshold", 0.05); /* set the cycleslip threshold (m) of geometryfree LC carrierphase difference between epochs */
double threshold_reject_gdop = configuration->property(role + ".threshold_reject_gdop", 30.0); /* reject threshold of GDOP. If the GDOP is over the value, the observable is excluded for the estimation process as an outlier. */
double threshold_reject_innovation = configuration->property(role + ".threshold_reject_innovation", 30.0); /* reject threshold of innovation (m). If the innovation is over the value, the observable is excluded for the estimation process as an outlier. */
int number_filter_iter = configuration->property(role + ".number_filter_iter", 1); /* Set the number of iteration in the measurement update of the estimation filter.
If the baseline length is very short like 1 m, the iteration may be effective to handle
the nonlinearity of measurement equation. */
/// Statistics
double bias_0 = configuration->property(role + ".bias_0", 30.0);
double iono_0 = configuration->property(role + ".iono_0", 0.03);
double trop_0 = configuration->property(role + ".trop_0", 0.3);
double sigma_bias = configuration->property(role + ".sigma_bias", 1e-4); /* Set the process noise standard deviation of carrierphase
bias (ambiguity) (cycle/sqrt(s)) */
double sigma_iono = configuration->property(role + ".sigma_iono", 1e-3); /* Set the process noise standard deviation of vertical ionospheric delay per 10 km baseline (m/sqrt(s)). */
double sigma_trop = configuration->property(role + ".sigma_trop", 1e-4); /* Set the process noise standard deviation of zenith tropospheric delay (m/sqrt(s)). */
double sigma_acch = configuration->property(role + ".sigma_acch", 1e-1); /* Set the process noise standard deviation of the receiver acceleration as
the horizontal component. (m/s2/sqrt(s)). If Receiver Dynamics is set to OFF, they are not used. */
double sigma_accv = configuration->property(role + ".sigma_accv", 1e-2); /* Set the process noise standard deviation of the receiver acceleration as
the vertical component. (m/s2/sqrt(s)). If Receiver Dynamics is set to OFF, they are not used. */
double sigma_pos = configuration->property(role + ".sigma_pos", 0.0);
double code_phase_error_ratio_l1 = configuration->property(role + ".code_phase_error_ratio_l1", 100.0);
double code_phase_error_ratio_l2 = configuration->property(role + ".code_phase_error_ratio_l2", 100.0);
double code_phase_error_ratio_l5 = configuration->property(role + ".code_phase_error_ratio_l5", 100.0);
double carrier_phase_error_factor_a = configuration->property(role + ".carrier_phase_error_factor_a", 0.003);
double carrier_phase_error_factor_b = configuration->property(role + ".carrier_phase_error_factor_b", 0.003);
snrmask_t snrmask = {{}, {{}, {}}};
prcopt_t rtklib_configuration_options = {
positioning_mode, /* positioning mode (PMODE_XXX) see src/algorithms/libs/rtklib/rtklib.h */
0, /* solution type (0:forward,1:backward,2:combined) */
number_of_frequencies, /* number of frequencies (1:L1, 2:L1+L2, 3:L1+L2+L5)*/
navigation_system, /* navigation system */
elevation_mask * D2R, /* elevation mask angle (degrees) */
snrmask, /* snrmask_t snrmask SNR mask */
0, /* satellite ephemeris/clock (EPHOPT_XXX) */
integer_ambiguity_resolution_gps, /* AR mode (0:off,1:continuous,2:instantaneous,3:fix and hold,4:ppp-ar) */
integer_ambiguity_resolution_glo, /* GLONASS AR mode (0:off,1:on,2:auto cal,3:ext cal) */
integer_ambiguity_resolution_bds, /* BeiDou AR mode (0:off,1:on) */
outage_reset_ambiguity, /* obs outage count to reset bias */
min_lock_to_fix_ambiguity, /* min lock count to fix ambiguity */
10, /* min fix count to hold ambiguity */
1, /* max iteration to resolve ambiguity */
iono_model, /* ionosphere option (IONOOPT_XXX) */
trop_model, /* troposphere option (TROPOPT_XXX) */
dynamics_model, /* dynamics model (0:none, 1:velocity, 2:accel) */
earth_tide, /* earth tide correction (0:off,1:solid,2:solid+otl+pole) */
number_filter_iter, /* number of filter iteration */
0, /* code smoothing window size (0:none) */
0, /* interpolate reference obs (for post mission) */
0, /* sbssat_t sbssat SBAS correction options */
0, /* sbsion_t sbsion[MAXBAND+1] SBAS satellite selection (0:all) */
0, /* rover position for fixed mode */
0, /* base position for relative mode */
/* 0:pos in prcopt, 1:average of single pos, */
/* 2:read from file, 3:rinex header, 4:rtcm pos */
{code_phase_error_ratio_l1, code_phase_error_ratio_l2, code_phase_error_ratio_l5}, /* eratio[NFREQ] code/phase error ratio */
{100.0, carrier_phase_error_factor_a, carrier_phase_error_factor_b, 0.0, 1.0}, /* err[5]: measurement error factor [0]:reserved, [1-3]:error factor a/b/c of phase (m) , [4]:doppler frequency (hz) */
{bias_0, iono_0, trop_0}, /* std[3]: initial-state std [0]bias,[1]iono [2]trop*/
{sigma_bias, sigma_iono, sigma_trop, sigma_acch, sigma_accv, sigma_pos}, /* prn[6] process-noise std */
5e-12, /* sclkstab: satellite clock stability (sec/sec) */
{min_ratio_to_fix_ambiguity, 0.9999, 0.25, 0.1, 0.05, 0.0, 0.0, 0.0}, /* thresar[8]: AR validation threshold */
min_elevation_to_fix_ambiguity, /* elevation mask of AR for rising satellite (deg) */
0.0, /* elevation mask to hold ambiguity (deg) */
slip_threshold, /* slip threshold of geometry-free phase (m) */
30.0, /* max difference of time (sec) */
threshold_reject_innovation, /* reject threshold of innovation (m) */
threshold_reject_gdop, /* reject threshold of gdop */
{}, /* double baseline[2] baseline length constraint {const,sigma} (m) */
{}, /* double ru[3] rover position for fixed mode {x,y,z} (ecef) (m) */
{}, /* double rb[3] base position for relative mode {x,y,z} (ecef) (m) */
{"", ""}, /* char anttype[2][MAXANT] antenna types {rover,base} */
{{}, {}}, /* double antdel[2][3] antenna delta {{rov_e,rov_n,rov_u},{ref_e,ref_n,ref_u}} */
{}, /* pcv_t pcvr[2] receiver antenna parameters {rov,base} */
{}, /* unsigned char exsats[MAXSAT] excluded satellites (1:excluded, 2:included) */
0, /* max averaging epoches */
0, /* initialize by restart */
1, /* output single by dgps/float/fix/ppp outage */
{"", ""}, /* char rnxopt[2][256] rinex options {rover,base} */
{sat_PCV, rec_PCV, phwindup, reject_GPS_IIA, raim_fde}, /* posopt[6] positioning options [0]: satellite and receiver antenna PCV model; [1]: interpolate antenna parameters; [2]: apply phase wind-up correction for PPP modes; [3]: exclude measurements of GPS Block IIA satellites satellite [4]: RAIM FDE (fault detection and exclusion) [5]: handle day-boundary clock jump */
0, /* solution sync mode (0:off,1:on) */
{{}, {}}, /* odisp[2][6*11] ocean tide loading parameters {rov,base} */
{{}, {{}, {}}, {{}, {}}, {}, {}}, /* exterr_t exterr extended receiver error model */
0, /* disable L2-AR */
{} /* char pppopt[256] ppp option "-GAP_RESION=" default gap to reset iono parameters (ep) */
};
rtk_t rtk;
rtkinit(&rtk, &rtklib_configuration_options);
return rtk;
}
//todo: add test cases for Galileo E1, E5 and GPS L5
TEST(RTKLibSolverTest, test1)
{
//test case #1: GPS L1 CA simulated with gnss-sim
std::string path = std::string(TEST_PATH);
int nchannels = 8;
std::string dump_filename = ".rtklib_solver_dump.dat";
bool flag_dump_to_file = false;
rtk_t rtk = configure_rtklib_options();
std::unique_ptr<rtklib_solver> d_ls_pvt(new rtklib_solver(nchannels, dump_filename, flag_dump_to_file, rtk));
d_ls_pvt->set_averaging_depth(1);
// load ephemeris
std::string eph_xml_filename = path + "data/rtklib_test/eph_GPS_L1CA_test1.xml";
gnss_sdr_supl_client supl_client_ephemeris_;
std::cout << "SUPL: Try read GPS ephemeris from XML file " << eph_xml_filename << std::endl;
if (supl_client_ephemeris_.load_ephemeris_xml(eph_xml_filename) == true)
{
std::map<int, Gps_Ephemeris>::const_iterator gps_eph_iter;
for (gps_eph_iter = supl_client_ephemeris_.gps_ephemeris_map.cbegin();
gps_eph_iter != supl_client_ephemeris_.gps_ephemeris_map.cend();
gps_eph_iter++)
{
std::cout << "SUPL: Read XML Ephemeris for GPS SV " << gps_eph_iter->first << std::endl;
std::shared_ptr<Gps_Ephemeris> tmp_obj = std::make_shared<Gps_Ephemeris>(gps_eph_iter->second);
// update/insert new ephemeris record to the global ephemeris map
d_ls_pvt->gps_ephemeris_map[gps_eph_iter->first] = *tmp_obj;
}
}
else
{
std::cout << "ERROR: SUPL client error reading XML" << std::endl;
}
// insert observables epoch
std::map<int, Gnss_Synchro> gnss_synchro_map;
// Gnss_Synchro tmp_obs;
// tmp_obs.System = 'G';
// std::string signal = "1C";
// const char* str = signal.c_str(); // get a C style null terminated string
// std::memcpy(static_cast<void*>(tmp_obs.Signal), str, 3); // copy string into synchro char array: 2 char + null
//
// gnss_synchro_map[0] = tmp_obs;
// gnss_synchro_map[0].PRN = 1;
// gnss_synchro_map[0].RX_time = 518449.000000;
// gnss_synchro_map[0].Pseudorange_m = 22816591.664859;
// gnss_synchro_map[0].Carrier_Doppler_hz = -2579.334343;
// gnss_synchro_map[0].Carrier_phase_rads = 794858.014183;
//load from xml (boost serialize)
std::string file_name = path + "data/rtklib_test/obs_test1.xml";
std::ifstream ifs;
try
{
ifs.open(file_name.c_str(), std::ifstream::binary | std::ifstream::in);
boost::archive::xml_iarchive xml(ifs);
gnss_synchro_map.clear();
xml >> boost::serialization::make_nvp("GNSS-SDR_gnss_synchro_map", gnss_synchro_map);
std::cout << "Loaded gnss_synchro map data with " << gnss_synchro_map.size() << " pseudoranges" << std::endl;
}
catch (std::exception& e)
{
std::cout << e.what() << "File: " << file_name;
}
ifs.close();
// solve
bool pvt_valid = false;
if (d_ls_pvt->get_PVT(gnss_synchro_map, false))
{
// DEBUG MESSAGE: Display position in console output
if (d_ls_pvt->is_valid_position())
{
std::streamsize ss = std::cout.precision(); // save current precision
std::cout.setf(std::ios::fixed, std::ios::floatfield);
auto facet = new boost::posix_time::time_facet("%Y-%b-%d %H:%M:%S.%f %z");
std::cout.imbue(std::locale(std::cout.getloc(), facet));
std::cout << "Position at " << d_ls_pvt->get_position_UTC_time()
<< " UTC using " << d_ls_pvt->get_num_valid_observations()
<< std::fixed << std::setprecision(9)
<< " observations is Lat = " << d_ls_pvt->get_latitude() << " [deg], Long = " << d_ls_pvt->get_longitude()
<< std::fixed << std::setprecision(3)
<< " [deg], Height = " << d_ls_pvt->get_height() << " [m]" << std::endl;
std::cout << std::setprecision(ss);
std::cout << "RX clock offset: " << d_ls_pvt->get_time_offset_s() << "[s]" << std::endl;
// boost::posix_time::ptime p_time;
// gtime_t rtklib_utc_time = gpst2time(adjgpsweek(d_ls_pvt->gps_ephemeris_map.cbegin()->second.i_GPS_week), d_rx_time);
// p_time = boost::posix_time::from_time_t(rtklib_utc_time.time);
// p_time += boost::posix_time::microseconds(round(rtklib_utc_time.sec * 1e6));
// std::cout << TEXT_MAGENTA << "Observable RX time (GPST) " << boost::posix_time::to_simple_string(p_time) << TEXT_RESET << std::endl;
std::cout << "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;
std::cout << "RTKLIB Position at RX TOW = " << gnss_synchro_map.begin()->second.RX_time
<< " in ECEF (X,Y,Z,t[meters]) = " << std::fixed << std::setprecision(16)
<< d_ls_pvt->pvt_sol.rr[0] << ","
<< d_ls_pvt->pvt_sol.rr[1] << ","
<< d_ls_pvt->pvt_sol.rr[2] << std::endl;
/* std::cout << "Dilution of Precision 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 HDOP = " << d_ls_pvt->get_hdop() << " VDOP = "
<< d_ls_pvt->get_vdop()
<< " GDOP = " << d_ls_pvt->get_gdop() << std::endl; */
//todo: check here the positioning error against the reference position generated with gnss-sim
//reference position on in WGS84: Lat (deg), Long (deg) , H (m): 30.286502,120.032669,100
pvt_valid = true;
}
}
EXPECT_EQ(true, pvt_valid);
}

View File

@ -22,6 +22,8 @@ if(OPENSSL_FOUND)
endif(OPENSSL_FOUND)
set(FRONT_END_CAL_SOURCES front_end_cal.cc)
set(FRONT_END_CAL_HEADERS front_end_cal.h)
include_directories(
${CMAKE_SOURCE_DIR}/src/core/system_parameters
@ -44,8 +46,6 @@ include_directories(
${VOLK_GNSSSDR_INCLUDE_DIRS}
)
file(GLOB FRONT_END_CAL_HEADERS "*.h")
list(SORT FRONT_END_CAL_HEADERS)
add_library(front_end_cal_lib ${FRONT_END_CAL_SOURCES} ${FRONT_END_CAL_HEADERS})
source_group(Headers FILES ${FRONT_END_CAL_HEADERS})
@ -114,5 +114,3 @@ if(NOT GZIP_NOTFOUND)
install(FILES ${CMAKE_BINARY_DIR}/front-end-cal.1.gz DESTINATION share/man/man1)
endif(NOT GZIP_NOTFOUND)