diff --git a/CMakeLists.txt b/CMakeLists.txt index c405d0c58..66ae4894a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -752,18 +752,34 @@ endif() +################################################################################ +# Log4cpp - http://log4cpp.sourceforge.net/ +################################################################################ +find_package(LOG4CPP) +set_package_properties(LOG4CPP PROPERTIES + URL "http://log4cpp.sourceforge.net/" + DESCRIPTION "Library of C++ classes for flexible logging to files" + PURPOSE "Required by GNU Radio." + TYPE REQUIRED +) +if(NOT LOG4CPP_FOUND) + message(FATAL_ERROR "*** Log4cpp is required to build gnss-sdr") +endif() + + + ################################################################################ # Dectect availability of std::filesystem ################################################################################ set(FILESYSTEM_FOUND FALSE) -if(NOT (GNURADIO_VERSION VERSION_LESS 3.8)) +if(NOT (GNURADIO_VERSION VERSION_LESS 3.8) AND LOG4CPP_READY_FOR_CXX17) # Check if we have std::filesystem if(NOT (CMAKE_VERSION VERSION_LESS 3.8)) if(POLICY CMP0057) cmake_policy(SET CMP0057 NEW) endif() if(NOT ENABLE_UNIT_TESTING_EXTRA) # Workaround for GPSTk - find_package(FILESYSTEM) + find_package(FILESYSTEM COMPONENTS Final Experimental) set_package_properties(FILESYSTEM PROPERTIES URL "https://en.cppreference.com/w/cpp/filesystem" DESCRIPTION "Provides facilities for performing operations on file systems and their components" @@ -894,8 +910,6 @@ endif() - - ################################################################################ # VOLK - Vector-Optimized Library of Kernels ################################################################################ @@ -912,22 +926,6 @@ endif() -################################################################################ -# Log4cpp - http://log4cpp.sourceforge.net/ -################################################################################ -find_package(LOG4CPP) -set_package_properties(LOG4CPP PROPERTIES - URL "http://log4cpp.sourceforge.net/" - DESCRIPTION "Library of C++ classes for flexible logging to files" - PURPOSE "Required by GNU Radio." - TYPE REQUIRED -) -if(NOT LOG4CPP_FOUND) - message(FATAL_ERROR "*** Log4cpp is required to build gnss-sdr") -endif() - - - ################################################################################ # volk_gnsssdr module - GNSS-SDR's own VOLK library ################################################################################ diff --git a/cmake/Modules/FindLOG4CPP.cmake b/cmake/Modules/FindLOG4CPP.cmake index 29c7308fa..784d1f2d0 100644 --- a/cmake/Modules/FindLOG4CPP.cmake +++ b/cmake/Modules/FindLOG4CPP.cmake @@ -39,6 +39,20 @@ find_path(LOG4CPP_INCLUDE_DIR log4cpp/Category.hh $ENV{LOG4CPP_ROOT}/include ) +if(LOG4CPP_INCLUDE_DIR) + file(STRINGS ${LOG4CPP_INCLUDE_DIR}/log4cpp/Priority.hh _log4cpp_Priority) + set(_log4cpp_cxx17 TRUE) + foreach(_loop_var IN LISTS _log4cpp_Priority) + string(STRIP "${_loop_var}" _file_line) + if("throw(std::invalid_argument);" STREQUAL "${_file_line}") + set(_log4cpp_cxx17 FALSE) + endif() + endforeach() + if(${_log4cpp_cxx17}) + set(LOG4CPP_READY_FOR_CXX17 TRUE) + endif() +endif() + set(LOG4CPP_NAMES log4cpp) find_library(LOG4CPP_LIBRARY NAMES ${LOG4CPP_NAMES} diff --git a/src/algorithms/PVT/gnuradio_blocks/CMakeLists.txt b/src/algorithms/PVT/gnuradio_blocks/CMakeLists.txt index 060318af0..081a1ab49 100644 --- a/src/algorithms/PVT/gnuradio_blocks/CMakeLists.txt +++ b/src/algorithms/PVT/gnuradio_blocks/CMakeLists.txt @@ -30,6 +30,9 @@ add_library(pvt_gr_blocks ${PVT_GR_BLOCKS_SOURCES} ${PVT_GR_BLOCKS_HEADERS}) if(${FILESYSTEM_FOUND}) target_compile_definitions(pvt_gr_blocks PRIVATE -DHAS_STD_FILESYSTEM=1) + if(${find_experimental}) + target_compile_definitions(pvt_gr_blocks PRIVATE -DHAS_STD_FILESYSTEM_EXPERIMENTAL=1) + endif() target_link_libraries(pvt_gr_blocks PRIVATE std::filesystem) else() target_link_libraries(pvt_gr_blocks PRIVATE Boost::filesystem Boost::system) diff --git a/src/algorithms/PVT/gnuradio_blocks/rtklib_pvt_gs.cc b/src/algorithms/PVT/gnuradio_blocks/rtklib_pvt_gs.cc index 3a8bfc697..2af4082b6 100644 --- a/src/algorithms/PVT/gnuradio_blocks/rtklib_pvt_gs.cc +++ b/src/algorithms/PVT/gnuradio_blocks/rtklib_pvt_gs.cc @@ -83,10 +83,15 @@ #include // for msgctl #if HAS_STD_FILESYSTEM -#include #include -namespace fs = std::filesystem; namespace errorlib = std; +#if HAS_STD_FILESYSTEM_EXPERIMENTAL +#include +namespace fs = std::experimental::filesystem; +#else +#include +namespace fs = std::filesystem; +#endif #else #include #include // for error_code diff --git a/src/algorithms/PVT/libs/CMakeLists.txt b/src/algorithms/PVT/libs/CMakeLists.txt index 92e1aec04..6850f3515 100644 --- a/src/algorithms/PVT/libs/CMakeLists.txt +++ b/src/algorithms/PVT/libs/CMakeLists.txt @@ -63,6 +63,9 @@ add_library(pvt_libs ${PVT_LIB_SOURCES} ${PVT_LIB_HEADERS}) if(${FILESYSTEM_FOUND}) target_compile_definitions(pvt_libs PRIVATE -DHAS_STD_FILESYSTEM=1) + if(${find_experimental}) + target_compile_definitions(pvt_libs PRIVATE -DHAS_STD_FILESYSTEM_EXPERIMENTAL=1) + endif() target_link_libraries(pvt_libs PRIVATE std::filesystem) else() target_link_libraries(pvt_libs PRIVATE Boost::filesystem Boost::system) diff --git a/src/algorithms/PVT/libs/geojson_printer.cc b/src/algorithms/PVT/libs/geojson_printer.cc index 6f9dcffe4..f15d9efef 100644 --- a/src/algorithms/PVT/libs/geojson_printer.cc +++ b/src/algorithms/PVT/libs/geojson_printer.cc @@ -33,15 +33,6 @@ #include "geojson_printer.h" #include "pvt_solution.h" #include -#if HAS_STD_FILESYSTEM -#include -#include -#else -#include // for create_directories, exists -#include // for path, operator<< -#include // for filesystem -#include // for error_code -#endif #include #include // for remove #include // for tm @@ -51,9 +42,20 @@ #include // for stringstream #if HAS_STD_FILESYSTEM -namespace fs = std::filesystem; +#include namespace errorlib = std; +#if HAS_STD_FILESYSTEM_EXPERIMENTAL +#include +namespace fs = std::experimental::filesystem; #else +#include +namespace fs = std::filesystem; +#endif +#else +#include // for create_directories, exists +#include // for path, operator<< +#include // for filesystem +#include // for error_code namespace fs = boost::filesystem; namespace errorlib = boost::system; #endif diff --git a/src/algorithms/PVT/libs/gpx_printer.cc b/src/algorithms/PVT/libs/gpx_printer.cc index 8925f281a..0cc7ded4b 100644 --- a/src/algorithms/PVT/libs/gpx_printer.cc +++ b/src/algorithms/PVT/libs/gpx_printer.cc @@ -33,15 +33,6 @@ #include "gpx_printer.h" #include "rtklib_solver.h" #include -#if HAS_STD_FILESYSTEM -#include -#include -#else -#include // for create_directories, exists -#include // for path, operator<< -#include // for filesystem -#include // for error_code -#endif #include #include // for remove #include // for tm @@ -51,9 +42,20 @@ #include // for stringstream #if HAS_STD_FILESYSTEM -namespace fs = std::filesystem; +#include namespace errorlib = std; +#if HAS_STD_FILESYSTEM_EXPERIMENTAL +#include +namespace fs = std::experimental::filesystem; #else +#include +namespace fs = std::filesystem; +#endif +#else +#include // for create_directories, exists +#include // for path, operator<< +#include // for filesystem +#include // for error_code namespace fs = boost::filesystem; namespace errorlib = boost::system; #endif diff --git a/src/algorithms/PVT/libs/kml_printer.cc b/src/algorithms/PVT/libs/kml_printer.cc index 335fc0fee..f726531e0 100644 --- a/src/algorithms/PVT/libs/kml_printer.cc +++ b/src/algorithms/PVT/libs/kml_printer.cc @@ -33,15 +33,6 @@ #include "kml_printer.h" #include "rtklib_solver.h" #include -#if HAS_STD_FILESYSTEM -#include -#include -#else -#include // for create_directories, exists -#include // for path, operator<< -#include // for filesystem -#include // for error_code -#endif #include #include // for remove #include // for mkstemp @@ -55,9 +46,20 @@ #include //for mode_t #if HAS_STD_FILESYSTEM -namespace fs = std::filesystem; +#include namespace errorlib = std; +#if HAS_STD_FILESYSTEM_EXPERIMENTAL +#include +namespace fs = std::experimental::filesystem; #else +#include +namespace fs = std::filesystem; +#endif +#else +#include // for create_directories, exists +#include // for path, operator<< +#include // for filesystem +#include // for error_code namespace fs = boost::filesystem; namespace errorlib = boost::system; #endif diff --git a/src/algorithms/PVT/libs/nmea_printer.cc b/src/algorithms/PVT/libs/nmea_printer.cc index 0e7127003..c70deb403 100644 --- a/src/algorithms/PVT/libs/nmea_printer.cc +++ b/src/algorithms/PVT/libs/nmea_printer.cc @@ -36,15 +36,6 @@ #include "nmea_printer.h" #include "rtklib_solution.h" #include "rtklib_solver.h" -#if HAS_STD_FILESYSTEM -#include -#include -#else -#include // for create_directories, exists -#include // for path, operator<< -#include // for filesystem -#include // for error_code -#endif #include #include #include @@ -53,9 +44,20 @@ #include #if HAS_STD_FILESYSTEM -namespace fs = std::filesystem; +#include namespace errorlib = std; +#if HAS_STD_FILESYSTEM_EXPERIMENTAL +#include +namespace fs = std::experimental::filesystem; #else +#include +namespace fs = std::filesystem; +#endif +#else +#include // for create_directories, exists +#include // for path, operator<< +#include // for filesystem +#include // for error_code namespace fs = boost::filesystem; namespace errorlib = boost::system; #endif diff --git a/src/algorithms/PVT/libs/rinex_printer.cc b/src/algorithms/PVT/libs/rinex_printer.cc index 7da65c565..e8a5e2e9c 100644 --- a/src/algorithms/PVT/libs/rinex_printer.cc +++ b/src/algorithms/PVT/libs/rinex_printer.cc @@ -53,15 +53,6 @@ #include #include #include -#if HAS_STD_FILESYSTEM -#include -#include -#else -#include // for create_directories, exists -#include // for path, operator<< -#include // for filesystem -#include // for error_code -#endif #include #include // for min and max #include // for floor @@ -76,9 +67,20 @@ #include #if HAS_STD_FILESYSTEM -namespace fs = std::filesystem; +#include namespace errorlib = std; +#if HAS_STD_FILESYSTEM_EXPERIMENTAL +#include +namespace fs = std::experimental::filesystem; #else +#include +namespace fs = std::filesystem; +#endif +#else +#include // for create_directories, exists +#include // for path, operator<< +#include // for filesystem +#include // for error_code namespace fs = boost::filesystem; namespace errorlib = boost::system; #endif diff --git a/src/algorithms/PVT/libs/rtcm_printer.cc b/src/algorithms/PVT/libs/rtcm_printer.cc index bccec8dce..1ced95bfc 100644 --- a/src/algorithms/PVT/libs/rtcm_printer.cc +++ b/src/algorithms/PVT/libs/rtcm_printer.cc @@ -39,16 +39,6 @@ #include "gps_cnav_ephemeris.h" #include "gps_ephemeris.h" #include "rtcm.h" -#if HAS_STD_FILESYSTEM -#include -#include -#else -#include -#include // for create_directories, exists -#include // for path, operator<< -#include // for filesystem -#include // for error_codes -#endif #include #include // for remove #include // for tm @@ -59,9 +49,20 @@ #include // for close, write #if HAS_STD_FILESYSTEM -namespace fs = std::filesystem; +#include namespace errorlib = std; +#if HAS_STD_FILESYSTEM_EXPERIMENTAL +#include +namespace fs = std::experimental::filesystem; #else +#include +namespace fs = std::filesystem; +#endif +#else +#include // for create_directories, exists +#include // for path, operator<< +#include // for filesystem +#include // for error_code namespace fs = boost::filesystem; namespace errorlib = boost::system; #endif diff --git a/src/algorithms/acquisition/gnuradio_blocks/CMakeLists.txt b/src/algorithms/acquisition/gnuradio_blocks/CMakeLists.txt index dfec5b089..79d6eeb64 100644 --- a/src/algorithms/acquisition/gnuradio_blocks/CMakeLists.txt +++ b/src/algorithms/acquisition/gnuradio_blocks/CMakeLists.txt @@ -68,6 +68,9 @@ add_library(acquisition_gr_blocks ${ACQ_GR_BLOCKS_SOURCES} ${ACQ_GR_BLOCKS_HEADE if(${FILESYSTEM_FOUND}) target_compile_definitions(acquisition_gr_blocks PRIVATE -DHAS_STD_FILESYSTEM=1) + if(${find_experimental}) + target_compile_definitions(acquisition_gr_blocks PRIVATE -DHAS_STD_FILESYSTEM_EXPERIMENTAL=1) + endif() target_link_libraries(acquisition_gr_blocks PRIVATE std::filesystem) else() target_link_libraries(acquisition_gr_blocks PRIVATE Boost::filesystem) diff --git a/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition.cc b/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition.cc index abb00ea79..3cf3564d5 100644 --- a/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition.cc +++ b/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition.cc @@ -40,7 +40,11 @@ #include "gnss_sdr_create_directory.h" #include "gnss_synchro.h" #if HAS_STD_FILESYSTEM +#if HAS_STD_FILESYSTEM_EXPERIMENTAL +#include +#else #include +#endif #else #include #endif @@ -58,7 +62,11 @@ #include #if HAS_STD_FILESYSTEM +#if HAS_STD_FILESYSTEM_EXPERIMENTAL +namespace fs = std::experimental::filesystem; +#else namespace fs = std::filesystem; +#endif #else namespace fs = boost::filesystem; #endif diff --git a/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition_fine_doppler_cc.cc b/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition_fine_doppler_cc.cc index 051c81130..aa5af66c9 100644 --- a/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition_fine_doppler_cc.cc +++ b/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition_fine_doppler_cc.cc @@ -35,7 +35,11 @@ #include "gnss_sdr_create_directory.h" #include "gps_sdr_signal_processing.h" #if HAS_STD_FILESYSTEM +#if HAS_STD_FILESYSTEM_EXPERIMENTAL +#include +#else #include +#endif #else #include #endif @@ -48,7 +52,11 @@ #include #if HAS_STD_FILESYSTEM +#if HAS_STD_FILESYSTEM_EXPERIMENTAL +namespace fs = std::experimental::filesystem; +#else namespace fs = std::filesystem; +#endif #else namespace fs = boost::filesystem; #endif diff --git a/src/algorithms/libs/CMakeLists.txt b/src/algorithms/libs/CMakeLists.txt index 4dc71a6bb..c00cb1081 100644 --- a/src/algorithms/libs/CMakeLists.txt +++ b/src/algorithms/libs/CMakeLists.txt @@ -90,6 +90,9 @@ add_library(algorithms_libs ${GNSS_SPLIBS_SOURCES} ${GNSS_SPLIBS_HEADERS}) if(${FILESYSTEM_FOUND}) target_compile_definitions(algorithms_libs PRIVATE -DHAS_STD_FILESYSTEM=1) + if(${find_experimental}) + target_compile_definitions(algorithms_libs PRIVATE -DHAS_STD_FILESYSTEM_EXPERIMENTAL=1) + endif() target_link_libraries(algorithms_libs PRIVATE std::filesystem) else() target_link_libraries(algorithms_libs PRIVATE Boost::filesystem Boost::system) @@ -141,6 +144,9 @@ add_library(gnss_sdr_flags gnss_sdr_flags.cc gnss_sdr_flags.h) if(${FILESYSTEM_FOUND}) target_compile_definitions(gnss_sdr_flags PRIVATE -DHAS_STD_FILESYSTEM=1) + if(${find_experimental}) + add_definitions(-DHAS_STD_FILESYSTEM_EXPERIMENTAL=1) + endif() target_link_libraries(gnss_sdr_flags PRIVATE std::filesystem) else() target_link_libraries(gnss_sdr_flags PRIVATE Boost::filesystem) diff --git a/src/algorithms/libs/gnss_sdr_create_directory.cc b/src/algorithms/libs/gnss_sdr_create_directory.cc index 325f5ebac..e147d3a39 100644 --- a/src/algorithms/libs/gnss_sdr_create_directory.cc +++ b/src/algorithms/libs/gnss_sdr_create_directory.cc @@ -29,22 +29,24 @@ */ #include "gnss_sdr_create_directory.h" +#include // for exception +#include // for ofstream + #if HAS_STD_FILESYSTEM -#include #include +namespace errorlib = std; +#if HAS_STD_FILESYSTEM_EXPERIMENTAL +#include +namespace fs = std::experimental::filesystem; +#else +#include +namespace fs = std::filesystem; +#endif #else #include // for create_directories, exists #include // for path, operator<< #include // for filesystem #include // for error_code -#endif -#include // for exception -#include // for ofstream - -#if HAS_STD_FILESYSTEM -namespace fs = std::filesystem; -namespace errorlib = std; -#else namespace fs = boost::filesystem; namespace errorlib = boost::system; #endif diff --git a/src/algorithms/libs/gnss_sdr_flags.cc b/src/algorithms/libs/gnss_sdr_flags.cc index ccf30fc55..6e021b73c 100644 --- a/src/algorithms/libs/gnss_sdr_flags.cc +++ b/src/algorithms/libs/gnss_sdr_flags.cc @@ -30,18 +30,20 @@ #include "gnss_sdr_flags.h" -#if HAS_STD_FILESYSTEM -#include -#else -#include // for exists -#endif #include #include #include #if HAS_STD_FILESYSTEM -namespace fs = std::filesystem; +#if HAS_STD_FILESYSTEM_EXPERIMENTAL +#include +namespace fs = std::experimental::filesystem; #else +#include +namespace fs = std::filesystem; +#endif +#else +#include // for exists namespace fs = boost::filesystem; #endif diff --git a/src/algorithms/observables/gnuradio_blocks/CMakeLists.txt b/src/algorithms/observables/gnuradio_blocks/CMakeLists.txt index c1d7bd7dc..85edd75a9 100644 --- a/src/algorithms/observables/gnuradio_blocks/CMakeLists.txt +++ b/src/algorithms/observables/gnuradio_blocks/CMakeLists.txt @@ -30,6 +30,9 @@ add_library(obs_gr_blocks ${OBS_GR_BLOCKS_SOURCES} ${OBS_GR_BLOCKS_HEADERS}) if(${FILESYSTEM_FOUND}) target_compile_definitions(obs_gr_blocks PRIVATE -DHAS_STD_FILESYSTEM=1) + if(${find_experimental}) + target_compile_definitions(obs_gr_blocks PRIVATE -DHAS_STD_FILESYSTEM_EXPERIMENTAL=1) + endif() target_link_libraries(obs_gr_blocks PRIVATE std::filesystem) else() target_link_libraries(obs_gr_blocks PRIVATE Boost::filesystem) diff --git a/src/algorithms/observables/gnuradio_blocks/hybrid_observables_gs.cc b/src/algorithms/observables/gnuradio_blocks/hybrid_observables_gs.cc index 36d977fdd..935f01f5c 100644 --- a/src/algorithms/observables/gnuradio_blocks/hybrid_observables_gs.cc +++ b/src/algorithms/observables/gnuradio_blocks/hybrid_observables_gs.cc @@ -46,13 +46,19 @@ #include // for move #if HAS_STD_FILESYSTEM +#if HAS_STD_FILESYSTEM_EXPERIMENTAL +#include +namespace fs = std::experimental::filesystem; +#else #include namespace fs = std::filesystem; +#endif #else #include namespace fs = boost::filesystem; #endif + hybrid_observables_gs_sptr hybrid_observables_gs_make(unsigned int nchannels_in, unsigned int nchannels_out, bool dump, bool dump_mat, std::string dump_filename) { return hybrid_observables_gs_sptr(new hybrid_observables_gs(nchannels_in, nchannels_out, dump, dump_mat, std::move(dump_filename))); diff --git a/src/algorithms/tracking/gnuradio_blocks/CMakeLists.txt b/src/algorithms/tracking/gnuradio_blocks/CMakeLists.txt index 7544c2f4a..7f5c63bf6 100644 --- a/src/algorithms/tracking/gnuradio_blocks/CMakeLists.txt +++ b/src/algorithms/tracking/gnuradio_blocks/CMakeLists.txt @@ -78,6 +78,9 @@ add_library(tracking_gr_blocks if(${FILESYSTEM_FOUND}) target_compile_definitions(tracking_gr_blocks PRIVATE -DHAS_STD_FILESYSTEM=1) + if(${find_experimental}) + target_compile_definitions(tracking_gr_blocks PRIVATE -DHAS_STD_FILESYSTEM_EXPERIMENTAL=1) + endif() target_link_libraries(tracking_gr_blocks PRIVATE std::filesystem) else() target_link_libraries(tracking_gr_blocks PRIVATE Boost::filesystem) diff --git a/src/algorithms/tracking/gnuradio_blocks/dll_pll_veml_tracking.cc b/src/algorithms/tracking/gnuradio_blocks/dll_pll_veml_tracking.cc index d411f2e45..f279825aa 100644 --- a/src/algorithms/tracking/gnuradio_blocks/dll_pll_veml_tracking.cc +++ b/src/algorithms/tracking/gnuradio_blocks/dll_pll_veml_tracking.cc @@ -67,8 +67,13 @@ #include #if HAS_STD_FILESYSTEM +#if HAS_STD_FILESYSTEM_EXPERIMENTAL +#include +namespace fs = std::experimental::filesystem; +#else #include namespace fs = std::filesystem; +#endif #else #include namespace fs = boost::filesystem; diff --git a/src/algorithms/tracking/gnuradio_blocks/dll_pll_veml_tracking_fpga.cc b/src/algorithms/tracking/gnuradio_blocks/dll_pll_veml_tracking_fpga.cc index 5ee4bee2a..d555aecb8 100644 --- a/src/algorithms/tracking/gnuradio_blocks/dll_pll_veml_tracking_fpga.cc +++ b/src/algorithms/tracking/gnuradio_blocks/dll_pll_veml_tracking_fpga.cc @@ -60,8 +60,13 @@ #include #if HAS_STD_FILESYSTEM +#if HAS_STD_FILESYSTEM_EXPERIMENTAL +#include +namespace fs = std::experimental::filesystem; +#else #include namespace fs = std::filesystem; +#endif #else #include namespace fs = boost::filesystem; diff --git a/src/algorithms/tracking/libs/CMakeLists.txt b/src/algorithms/tracking/libs/CMakeLists.txt index 111c590ec..d847b6f11 100644 --- a/src/algorithms/tracking/libs/CMakeLists.txt +++ b/src/algorithms/tracking/libs/CMakeLists.txt @@ -33,6 +33,7 @@ set(TRACKING_LIB_SOURCES cpu_multicorrelator.cc cpu_multicorrelator_real_codes.cc cpu_multicorrelator_16sc.cc + cubature_filter.cc lock_detectors.cc tcp_communication.cc tcp_packet_data.cc @@ -50,6 +51,7 @@ set(TRACKING_LIB_HEADERS cpu_multicorrelator.h cpu_multicorrelator_real_codes.h cpu_multicorrelator_16sc.h + cubature_filter.h lock_detectors.h tcp_communication.h tcp_packet_data.h diff --git a/src/algorithms/tracking/libs/cubature_filter.cc b/src/algorithms/tracking/libs/cubature_filter.cc new file mode 100644 index 000000000..cd7e3bb83 --- /dev/null +++ b/src/algorithms/tracking/libs/cubature_filter.cc @@ -0,0 +1,199 @@ +/*! + * \file cubature_filter.cc + * \brief Interface of a library with Bayesian noise statistic estimation + * + * Cubature_Filter implements the functionality of the Cubature Kalman + * Filter, which uses multidimensional cubature rules to estimate the + * time evolution of a nonlinear system. + * + * [1] I Arasaratnam and S Haykin. Cubature kalman filters. IEEE + * Transactions on Automatic Control, 54(6):1254–1269,2009. + * + * \authors
    + *
  • Gerald LaMountain, 2019. gerald(at)ece.neu.edu + *
  • Jordi Vila-Valls 2019. jvila(at)cttc.es + *
+ * ------------------------------------------------------------------------- + * + * Copyright (C) 2010-2019 (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 . + * + * ------------------------------------------------------------------------- + */ + +#include "cubature_filter.h" + + +Cubature_filter::Cubature_filter() +{ + int nx = 1; + x_pred_out = arma::zeros(nx, 1); + P_x_pred_out = arma::eye(nx, nx) * (nx + 1); + + x_est = x_pred_out; + P_x_est = P_x_pred_out; +} + + +Cubature_filter::Cubature_filter(int nx) +{ + x_pred_out = arma::zeros(nx, 1); + P_x_pred_out = arma::eye(nx, nx) * (nx + 1); + + x_est = x_pred_out; + P_x_est = P_x_pred_out; +} + + +Cubature_filter::Cubature_filter(const arma::vec& x_pred_0, const arma::mat& P_x_pred_0) +{ + x_pred_out = x_pred_0; + P_x_pred_out = P_x_pred_0; + + x_est = x_pred_out; + P_x_est = P_x_pred_out; +} + + +Cubature_filter::~Cubature_filter() = default; + + +void Cubature_filter::initialize(const arma::mat& x_pred_0, const arma::mat& P_x_pred_0) +{ + x_pred_out = x_pred_0; + P_x_pred_out = P_x_pred_0; + + x_est = x_pred_out; + P_x_est = P_x_pred_out; +} + + +/* + * Perform the prediction step of the cubature Kalman filter + */ +void Cubature_filter::predict_sequential(const arma::vec& x_post, const arma::mat& P_x_post, Model_Function* transition_fcn, const arma::mat& noise_covariance) +{ + // Compute number of cubature points + int nx = x_post.n_elem; + int np = 2 * nx; + + // Generator Matrix + arma::mat gen_one = arma::join_horiz(arma::eye(nx, nx), -1.0 * arma::eye(nx, nx)); + + // Initialize predicted mean and covariance + arma::vec x_pred = arma::zeros(nx, 1); + arma::mat P_x_pred = arma::zeros(nx, nx); + + // Factorize posterior covariance + arma::mat Sm_post = arma::chol(P_x_post, "lower"); + + // Propagate and evaluate cubature points + arma::vec Xi_post; + arma::vec Xi_pred; + + for (uint8_t i = 0; i < np; i++) + { + Xi_post = Sm_post * (std::sqrt(static_cast(np) / 2.0) * gen_one.col(i)) + x_post; + Xi_pred = (*transition_fcn)(Xi_post); + + x_pred = x_pred + Xi_pred; + P_x_pred = P_x_pred + Xi_pred * Xi_pred.t(); + } + + // Estimate predicted state and error covariance + x_pred = x_pred / static_cast(np); + P_x_pred = P_x_pred / static_cast(np) - x_pred * x_pred.t() + noise_covariance; + + // Store predicted state and error covariance + x_pred_out = x_pred; + P_x_pred_out = P_x_pred; +} + + +/* + * Perform the update step of the cubature Kalman filter + */ +void Cubature_filter::update_sequential(const arma::vec& z_upd, const arma::vec& x_pred, const arma::mat& P_x_pred, Model_Function* measurement_fcn, const arma::mat& noise_covariance) +{ + // Compute number of cubature points + int nx = x_pred.n_elem; + int nz = z_upd.n_elem; + int np = 2 * nx; + + // Generator Matrix + arma::mat gen_one = arma::join_horiz(arma::eye(nx, nx), -1.0 * arma::eye(nx, nx)); + + // Evaluate predicted measurement and covariances + arma::mat z_pred = arma::zeros(nz, 1); + arma::mat P_zz_pred = arma::zeros(nz, nz); + arma::mat P_xz_pred = arma::zeros(nx, nz); + + // Factorize predicted covariance + arma::mat Sm_pred = arma::chol(P_x_pred, "lower"); + + // Propagate and evaluate cubature points + arma::vec Xi_pred; + arma::vec Zi_pred; + for (uint8_t i = 0; i < np; i++) + { + Xi_pred = Sm_pred * (std::sqrt(static_cast(np) / 2.0) * gen_one.col(i)) + x_pred; + Zi_pred = (*measurement_fcn)(Xi_pred); + + z_pred = z_pred + Zi_pred; + P_zz_pred = P_zz_pred + Zi_pred * Zi_pred.t(); + P_xz_pred = P_xz_pred + Xi_pred * Zi_pred.t(); + } + + // Estimate measurement covariance and cross covariances + z_pred = z_pred / static_cast(np); + P_zz_pred = P_zz_pred / static_cast(np) - z_pred * z_pred.t() + noise_covariance; + P_xz_pred = P_xz_pred / static_cast(np) - x_pred * z_pred.t(); + + // Estimate cubature Kalman gain + arma::mat W_k = P_xz_pred * arma::inv(P_zz_pred); + + // Estimate and store the updated state and error covariance + x_est = x_pred + W_k * (z_upd - z_pred); + P_x_est = P_x_pred - W_k * P_zz_pred * W_k.t(); +} + + +arma::mat Cubature_filter::get_x_pred() const +{ + return x_pred_out; +} + + +arma::mat Cubature_filter::get_P_x_pred() const +{ + return P_x_pred_out; +} + + +arma::mat Cubature_filter::get_x_est() const +{ + return x_est; +} + + +arma::mat Cubature_filter::get_P_x_est() const +{ + return P_x_est; +} diff --git a/src/algorithms/tracking/libs/cubature_filter.h b/src/algorithms/tracking/libs/cubature_filter.h new file mode 100644 index 000000000..87f45bcdd --- /dev/null +++ b/src/algorithms/tracking/libs/cubature_filter.h @@ -0,0 +1,84 @@ +/*! + * \file cubature_filter.h + * \brief Interface of a library with Bayesian noise statistic estimation + * + * Cubature_Filter implements the functionality of the Cubature Kalman + * Filter, which uses multidimensional cubature rules to estimate the + * time evolution of a nonlinear system. + * + * [1] I Arasaratnam and S Haykin. Cubature kalman filters. IEEE + * Transactions on Automatic Control, 54(6):1254–1269,2009. + * + * \authors
    + *
  • Gerald LaMountain, 2019. gerald(at)ece.neu.edu + *
  • Jordi Vila-Valls 2019. jvila(at)cttc.es + *
+ * ------------------------------------------------------------------------- + * + * Copyright (C) 2010-2019 (see AUTHORS file for a list of contributors) + * + * GNSS-SDR is a software defined Global Navigation + * Satellite Systems receiver + * + * This file is part of GNSS-SDR. + * + * GNSS-SDR is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * GNSS-SDR is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNSS-SDR. If not, see . + * + * ------------------------------------------------------------------------- + */ + +#ifndef GNSS_SDR_CUBATURE_FILTER_H_ +#define GNSS_SDR_CUBATURE_FILTER_H_ + +#include +#include + +// Abstract model function +class Model_Function{ + public: + Model_Function() {}; + virtual arma::vec operator() (arma::vec input) = 0; + virtual ~Model_Function() = default; +}; + +class Cubature_filter +{ +public: + // Constructors and destructors + Cubature_filter(); + Cubature_filter(int nx); + Cubature_filter(const arma::vec& x_pred_0, const arma::mat& P_x_pred_0); + ~Cubature_filter(); + + // Reinitialization function + void initialize(const arma::mat& x_pred_0, const arma::mat& P_x_pred_0); + + // Prediction and estimation + void predict_sequential(const arma::vec& x_post, const arma::mat& P_x_post, Model_Function* transition_fcn, const arma::mat& noise_covariance); + void update_sequential(const arma::vec& z_upd, const arma::vec& x_pred, const arma::mat& P_x_pred, Model_Function* measurement_fcn, const arma::mat& noise_covariance); + + // Getters + arma::mat get_x_pred() const; + arma::mat get_P_x_pred() const; + arma::mat get_x_est() const; + arma::mat get_P_x_est() const; + +private: + arma::vec x_pred_out; + arma::mat P_x_pred_out; + arma::vec x_est; + arma::mat P_x_est; +}; + +#endif diff --git a/src/main/CMakeLists.txt b/src/main/CMakeLists.txt index 96e1d3c97..dac5a6eed 100644 --- a/src/main/CMakeLists.txt +++ b/src/main/CMakeLists.txt @@ -21,6 +21,9 @@ add_executable(gnss-sdr ${CMAKE_CURRENT_SOURCE_DIR}/main.cc) if(${FILESYSTEM_FOUND}) target_compile_definitions(gnss-sdr PRIVATE -DHAS_STD_FILESYSTEM=1) + if(${find_experimental}) + target_compile_definitions(gnss-sdr PRIVATE -DHAS_STD_FILESYSTEM_EXPERIMENTAL=1) + endif() target_link_libraries(gnss-sdr PRIVATE std::filesystem) else() target_link_libraries(gnss-sdr PRIVATE Boost::filesystem Boost::system) diff --git a/src/main/main.cc b/src/main/main.cc index cf01b30b5..7aba038c4 100644 --- a/src/main/main.cc +++ b/src/main/main.cc @@ -46,21 +46,13 @@ #include // for diagnostic_informatio #include // for exception #include // for thread_resource_error -#if HAS_STD_FILESYSTEM -#include -#include -#else -#include // for create_directories, exists -#include // for path, operator<< -#include // for error_code -#endif -#include // for ShutDownCommandLineFlags -#include // for FLAGS_log_dir -#include // for time_point -#include // for exception -#include // for operator<<, endl -#include // for unique_ptr -#include // for string +#include // for ShutDownCommandLineFlags +#include // for FLAGS_log_dir +#include // for time_point +#include // for exception +#include // for operator<<, endl +#include // for unique_ptr +#include // for string #if CUDA_GPU_ACCEL // For the CUDA runtime routines (prefixed with "cuda_") @@ -68,9 +60,20 @@ #endif #if HAS_STD_FILESYSTEM -namespace fs = std::filesystem; +#include namespace errorlib = std; +#if HAS_STD_FILESYSTEM_EXPERIMENTAL +#include +namespace fs = std::experimental::filesystem; #else +#include +namespace fs = std::filesystem; +#endif +#else +#include // for create_directories, exists +#include // for path, operator<< +#include // for filesystem +#include // for error_code namespace fs = boost::filesystem; namespace errorlib = boost::system; #endif diff --git a/src/tests/CMakeLists.txt b/src/tests/CMakeLists.txt index 4bb206ad0..8eb57397e 100644 --- a/src/tests/CMakeLists.txt +++ b/src/tests/CMakeLists.txt @@ -356,6 +356,9 @@ if(ENABLE_UNIT_TESTING) add_executable(run_tests ${CMAKE_CURRENT_SOURCE_DIR}/test_main.cc) if(${FILESYSTEM_FOUND}) target_compile_definitions(run_tests PRIVATE -DHAS_STD_FILESYSTEM=1) + if(${find_experimental}) + target_compile_definitions(run_tests PRIVATE -DHAS_STD_FILESYSTEM_EXPERIMENTAL=1) + endif() target_link_libraries(run_tests PRIVATE std::filesystem) else() target_link_libraries(run_tests PRIVATE Boost::filesystem Boost::system) @@ -447,6 +450,9 @@ if(ENABLE_FPGA) ) if(${FILESYSTEM_FOUND}) target_compile_definitions(gps_l1_ca_dll_pll_tracking_test_fpga PRIVATE -DHAS_STD_FILESYSTEM=1) + if(${find_experimental}) + target_compile_definitions(gps_l1_ca_dll_pll_tracking_test_fpga PRIVATE -DHAS_STD_FILESYSTEM_EXPERIMENTAL=1) + endif() target_link_libraries(gps_l1_ca_dll_pll_tracking_test_fpga PRIVATE std::filesystem) else() target_link_libraries(gps_l1_ca_dll_pll_tracking_test_fpga PRIVATE Boost::filesystem Boost::system) @@ -492,6 +498,9 @@ function(add_system_test executable) add_executable(${executable} ${SYSTEM_TEST_SOURCES}) if(${FILESYSTEM_FOUND}) target_compile_definitions(${executable} PRIVATE -DHAS_STD_FILESYSTEM=1) + if(${find_experimental}) + target_compile_definitions(${executable} PRIVATE -DHAS_STD_FILESYSTEM_EXPERIMENTAL=1) + endif() target_link_libraries(${executable} PRIVATE std::filesystem) else() target_link_libraries(${executable} PRIVATE Boost::filesystem Boost::system) @@ -585,6 +594,9 @@ if(NOT ENABLE_PACKAGING AND NOT ENABLE_FPGA) ) if(${FILESYSTEM_FOUND}) target_compile_definitions(flowgraph_test PRIVATE -DHAS_STD_FILESYSTEM=1) + if(${find_experimental}) + target_compile_definitions(flowgraph_test PRIVATE -DHAS_STD_FILESYSTEM_EXPERIMENTAL=1) + endif() target_link_libraries(flowgraph_test PRIVATE std::filesystem) else() target_link_libraries(flowgraph_test PRIVATE Boost::filesystem Boost::system) @@ -634,6 +646,9 @@ if(NOT ENABLE_PACKAGING AND NOT ENABLE_FPGA) ) if(${FILESYSTEM_FOUND}) target_compile_definitions(gnss_block_test PRIVATE -DHAS_STD_FILESYSTEM=1) + if(${find_experimental}) + target_compile_definitions(gnss_block_test PRIVATE -DHAS_STD_FILESYSTEM_EXPERIMENTAL=1) + endif() target_link_libraries(gnss_block_test PRIVATE std::filesystem) else() target_link_libraries(gnss_block_test PRIVATE Boost::filesystem Boost::system) @@ -681,6 +696,9 @@ if(NOT ENABLE_PACKAGING AND NOT ENABLE_FPGA) ) if(${FILESYSTEM_FOUND}) target_compile_definitions(gnuradio_block_test PRIVATE -DHAS_STD_FILESYSTEM=1) + if(${find_experimental}) + target_compile_definitions(gnuradio_block_test PRIVATE -DHAS_STD_FILESYSTEM_EXPERIMENTAL=1) + endif() target_link_libraries(gnuradio_block_test PRIVATE std::filesystem) else() target_link_libraries(gnuradio_block_test PRIVATE Boost::filesystem Boost::system) @@ -781,9 +799,13 @@ if(NOT ENABLE_PACKAGING AND NOT ENABLE_FPGA) ${CMAKE_CURRENT_SOURCE_DIR}/unit-tests/signal-processing-blocks/tracking/tracking_loop_filter_test.cc ${CMAKE_CURRENT_SOURCE_DIR}/unit-tests/signal-processing-blocks/tracking/cpu_multicorrelator_real_codes_test.cc ${CMAKE_CURRENT_SOURCE_DIR}/unit-tests/signal-processing-blocks/tracking/bayesian_estimation_test.cc + ${CMAKE_CURRENT_SOURCE_DIR}/unit-tests/signal-processing-blocks/tracking/cubature_filter_test.cc ) if(${FILESYSTEM_FOUND}) target_compile_definitions(trk_test PRIVATE -DHAS_STD_FILESYSTEM=1) + if(${find_experimental}) + target_compile_definitions(trk_test PRIVATE -DHAS_STD_FILESYSTEM_EXPERIMENTAL=1) + endif() target_link_libraries(trk_test PRIVATE std::filesystem) else() target_link_libraries(trk_test PRIVATE Boost::filesystem Boost::system) @@ -825,6 +847,9 @@ if(NOT ENABLE_PACKAGING AND NOT ENABLE_FPGA) ) if(${FILESYSTEM_FOUND}) target_compile_definitions(control_thread_test PRIVATE -DHAS_STD_FILESYSTEM=1) + if(${find_experimental}) + target_compile_definitions(control_thread_test PRIVATE -DHAS_STD_FILESYSTEM_EXPERIMENTAL=1) + endif() target_link_libraries(control_thread_test PRIVATE std::filesystem) else() target_link_libraries(control_thread_test PRIVATE Boost::filesystem Boost::system) diff --git a/src/tests/test_main.cc b/src/tests/test_main.cc index 05df98d35..d22149fee 100644 --- a/src/tests/test_main.cc +++ b/src/tests/test_main.cc @@ -99,6 +99,7 @@ DECLARE_string(log_dir); #endif #include "unit-tests/signal-processing-blocks/tracking/bayesian_estimation_test.cc" +#include "unit-tests/signal-processing-blocks/tracking/cubature_filter_test.cc" #include "unit-tests/signal-processing-blocks/tracking/cpu_multicorrelator_real_codes_test.cc" #include "unit-tests/signal-processing-blocks/tracking/cpu_multicorrelator_test.cc" #include "unit-tests/signal-processing-blocks/tracking/galileo_e1_dll_pll_veml_tracking_test.cc" diff --git a/src/tests/unit-tests/arithmetic/fft_length_test.cc b/src/tests/unit-tests/arithmetic/fft_length_test.cc index 5b2583758..ed4aff8b7 100644 --- a/src/tests/unit-tests/arithmetic/fft_length_test.cc +++ b/src/tests/unit-tests/arithmetic/fft_length_test.cc @@ -38,8 +38,13 @@ #include #if HAS_STD_FILESYSTEM +#if HAS_STD_FILESYSTEM_EXPERIMENTAL +#include +namespace fs = std::experimental::filesystem; +#else #include namespace fs = std::filesystem; +#endif #else #include namespace fs = boost::filesystem; diff --git a/src/tests/unit-tests/signal-processing-blocks/acquisition/acq_performance_test.cc b/src/tests/unit-tests/signal-processing-blocks/acquisition/acq_performance_test.cc index 82b0fdcfd..73e09e9ec 100644 --- a/src/tests/unit-tests/signal-processing-blocks/acquisition/acq_performance_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/acquisition/acq_performance_test.cc @@ -55,17 +55,23 @@ #include #if HAS_STD_FILESYSTEM -#include #include -namespace fs = std::filesystem; namespace errorlib = std; +#if HAS_STD_FILESYSTEM_EXPERIMENTAL +#include +namespace fs = std::experimental::filesystem; +#else +#include +namespace fs = std::filesystem; +#endif #else #include -#include +#include // for error_code namespace fs = boost::filesystem; namespace errorlib = boost::system; #endif + DEFINE_string(config_file_ptest, std::string(""), "File containing alternative configuration parameters for the acquisition performance test."); DEFINE_string(acq_test_input_file, std::string(""), "File containing raw signal data, must be in int8_t format. The signal generator will not be used."); DEFINE_string(acq_test_implementation, std::string("GPS_L1_CA_PCPS_Acquisition"), "Acquisition block implementation under test. Alternatives: GPS_L1_CA_PCPS_Acquisition, GPS_L1_CA_PCPS_Acquisition_Fine_Doppler, Galileo_E1_PCPS_Ambiguous_Acquisition, GLONASS_L1_CA_PCPS_Acquisition, GLONASS_L2_CA_PCPS_Acquisition, GPS_L2_M_PCPS_Acquisition, Galileo_E5a_Pcps_Acquisition, GPS_L5i_PCPS_Acquisition"); diff --git a/src/tests/unit-tests/signal-processing-blocks/acquisition/beidou_b1i_pcps_acquisition_test.cc b/src/tests/unit-tests/signal-processing-blocks/acquisition/beidou_b1i_pcps_acquisition_test.cc index efb923137..c2658889a 100644 --- a/src/tests/unit-tests/signal-processing-blocks/acquisition/beidou_b1i_pcps_acquisition_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/acquisition/beidou_b1i_pcps_acquisition_test.cc @@ -59,8 +59,13 @@ #endif #if HAS_STD_FILESYSTEM +#if HAS_STD_FILESYSTEM_EXPERIMENTAL +#include +namespace fs = std::experimental::filesystem; +#else #include namespace fs = std::filesystem; +#endif #else #include namespace fs = boost::filesystem; diff --git a/src/tests/unit-tests/signal-processing-blocks/acquisition/beidou_b3i_pcps_acquisition_test.cc b/src/tests/unit-tests/signal-processing-blocks/acquisition/beidou_b3i_pcps_acquisition_test.cc index 8d39ac2ff..725135d5b 100644 --- a/src/tests/unit-tests/signal-processing-blocks/acquisition/beidou_b3i_pcps_acquisition_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/acquisition/beidou_b3i_pcps_acquisition_test.cc @@ -59,8 +59,13 @@ #endif #if HAS_STD_FILESYSTEM +#if HAS_STD_FILESYSTEM_EXPERIMENTAL +#include +namespace fs = std::experimental::filesystem; +#else #include namespace fs = std::filesystem; +#endif #else #include namespace fs = boost::filesystem; diff --git a/src/tests/unit-tests/signal-processing-blocks/acquisition/galileo_e1_pcps_ambiguous_acquisition_test.cc b/src/tests/unit-tests/signal-processing-blocks/acquisition/galileo_e1_pcps_ambiguous_acquisition_test.cc index 204acbb14..58fa9b8e6 100644 --- a/src/tests/unit-tests/signal-processing-blocks/acquisition/galileo_e1_pcps_ambiguous_acquisition_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/acquisition/galileo_e1_pcps_ambiguous_acquisition_test.cc @@ -60,13 +60,19 @@ #endif #if HAS_STD_FILESYSTEM +#if HAS_STD_FILESYSTEM_EXPERIMENTAL +#include +namespace fs = std::experimental::filesystem; +#else #include namespace fs = std::filesystem; +#endif #else #include namespace fs = boost::filesystem; #endif + // ######## GNURADIO BLOCK MESSAGE RECEVER ######### class GalileoE1PcpsAmbiguousAcquisitionTest_msg_rx; diff --git a/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_acquisition_test.cc b/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_acquisition_test.cc index 42fe90a6b..01f424eb8 100644 --- a/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_acquisition_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_acquisition_test.cc @@ -59,8 +59,13 @@ #endif #if HAS_STD_FILESYSTEM +#if HAS_STD_FILESYSTEM_EXPERIMENTAL +#include +namespace fs = std::experimental::filesystem; +#else #include namespace fs = std::filesystem; +#endif #else #include namespace fs = boost::filesystem; diff --git a/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l2_m_pcps_acquisition_test.cc b/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l2_m_pcps_acquisition_test.cc index ae50d3bb0..de7bc4e27 100644 --- a/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l2_m_pcps_acquisition_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l2_m_pcps_acquisition_test.cc @@ -60,8 +60,13 @@ #endif #if HAS_STD_FILESYSTEM +#if HAS_STD_FILESYSTEM_EXPERIMENTAL +#include +namespace fs = std::experimental::filesystem; +#else #include namespace fs = std::filesystem; +#endif #else #include namespace fs = boost::filesystem; diff --git a/src/tests/unit-tests/signal-processing-blocks/tracking/bayesian_estimation_test.cc b/src/tests/unit-tests/signal-processing-blocks/tracking/bayesian_estimation_test.cc index dd7d0398b..6fa5f1da0 100644 --- a/src/tests/unit-tests/signal-processing-blocks/tracking/bayesian_estimation_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/tracking/bayesian_estimation_test.cc @@ -1,7 +1,7 @@ /*! - * \file bayesian_estimation_positivity_test.cc - * \brief This file implements timing tests for the Bayesian covariance estimator - * \author Gerald LaMountain, 20168. gerald(at)ece.neu.edu + * \file bayesian_estimation_test.cc + * \brief This file implements feasability test for the BCE library. + * \author Gerald LaMountain, 2018. gerald(at)ece.neu.edu * * * ------------------------------------------------------------------------- diff --git a/src/tests/unit-tests/signal-processing-blocks/tracking/cubature_filter_test.cc b/src/tests/unit-tests/signal-processing-blocks/tracking/cubature_filter_test.cc new file mode 100644 index 000000000..948e5cc69 --- /dev/null +++ b/src/tests/unit-tests/signal-processing-blocks/tracking/cubature_filter_test.cc @@ -0,0 +1,160 @@ +/*! + * \file cubature_filter_test.cc + * \brief This file implements numerical accuracy test for the CKF library. + * \author Gerald LaMountain, 2019. gerald(at)ece.neu.edu + * + * ------------------------------------------------------------------------- + * + * Copyright (C) 2010-2019 (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 . + * + * ------------------------------------------------------------------------- + */ + +#include "cubature_filter.h" +#include +#include +#include + +#define CUBATURE_TEST_N_TRIALS 1000 + +class Transition_Model : public Model_Function +{ +public: + Transition_Model(arma::mat kf_F) { coeff_mat = kf_F; }; + virtual arma::vec operator()(arma::vec input) { return coeff_mat * input; }; + +private: + arma::mat coeff_mat; +}; + +class Measurement_Model : public Model_Function +{ +public: + Measurement_Model(arma::mat kf_H) { coeff_mat = kf_H; }; + virtual arma::vec operator()(arma::vec input) { return coeff_mat * input; }; + +private: + arma::mat coeff_mat; +}; + +TEST(CubatureFilterComputationTest, CubatureFilterTest) +{ + Cubature_filter kf_cubature; + + arma::vec kf_x; + arma::mat kf_P_x; + + arma::vec kf_x_pre; + arma::mat kf_P_x_pre; + + arma::vec ckf_x_pre; + arma::mat ckf_P_x_pre; + + arma::vec kf_x_post; + arma::mat kf_P_x_post; + + arma::vec ckf_x_post; + arma::mat ckf_P_x_post; + + arma::mat kf_F; + arma::mat kf_H; + + arma::mat kf_Q; + arma::mat kf_R; + + arma::vec eta; + arma::vec nu; + + arma::vec kf_y; + arma::mat kf_P_y; + arma::mat kf_K; + + Model_Function* transition_function; + Model_Function* measurement_function; + + //--- Perform initializations ------------------------------ + + std::random_device r; + std::default_random_engine e1(r()); + std::normal_distribution normal_dist(0, 5); + std::uniform_real_distribution uniform_dist(0.1, 5.0); + + uint8_t nx = 0; + uint8_t ny = 0; + + for (uint16_t k = 0; k < CUBATURE_TEST_N_TRIALS; k++) + { + nx = std::rand() % 5 + 1; + ny = std::rand() % 5 + 1; + + kf_x = arma::randn(nx, 1); + + kf_P_x_post = 5.0 * arma::diagmat(arma::randu(nx, 1)); + kf_x_post = arma::mvnrnd(kf_x, kf_P_x_post); + + kf_cubature.initialize(kf_x_post, kf_P_x_post); + + // Prediction Step + kf_F = arma::randu(nx, nx); + kf_Q = arma::diagmat(arma::randu(nx, 1)); + + transition_function = new Transition_Model(kf_F); + arma::mat ttx = (*transition_function)(kf_x_post); + + kf_cubature.predict_sequential(kf_x_post, kf_P_x_post, transition_function, kf_Q); + + ckf_x_pre = kf_cubature.get_x_pred(); + ckf_P_x_pre = kf_cubature.get_P_x_pred(); + + kf_x_pre = kf_F * kf_x_post; + kf_P_x_pre = kf_F * kf_P_x_post * kf_F.t() + kf_Q; + + EXPECT_TRUE(arma::approx_equal(ckf_x_pre, kf_x_pre, "absdiff", 0.01)); + EXPECT_TRUE(arma::approx_equal(ckf_P_x_pre, kf_P_x_pre, "absdiff", 0.01)); + + // Update Step + kf_H = arma::randu(ny, nx); + kf_R = arma::diagmat(arma::randu(ny, 1)); + + eta = arma::mvnrnd(arma::zeros(nx, 1), kf_Q); + nu = arma::mvnrnd(arma::zeros(ny, 1), kf_R); + + kf_y = kf_H * (kf_F * kf_x + eta) + nu; + + measurement_function = new Measurement_Model(kf_H); + kf_cubature.update_sequential(kf_y, kf_x_pre, kf_P_x_pre, measurement_function, kf_R); + + ckf_x_post = kf_cubature.get_x_est(); + ckf_P_x_post = kf_cubature.get_P_x_est(); + + kf_P_y = kf_H * kf_P_x_pre * kf_H.t() + kf_R; + kf_K = (kf_P_x_pre * kf_H.t()) * arma::inv(kf_P_y); + + kf_x_post = kf_x_pre + kf_K * (kf_y - kf_H * kf_x_pre); + kf_P_x_post = (arma::eye(nx, nx) - kf_K * kf_H) * kf_P_x_pre; + + EXPECT_TRUE(arma::approx_equal(ckf_x_post, kf_x_post, "absdiff", 0.01)); + EXPECT_TRUE(arma::approx_equal(ckf_P_x_post, kf_P_x_post, "absdiff", 0.01)); + + delete transition_function; + delete measurement_function; + } +} diff --git a/src/tests/unit-tests/signal-processing-blocks/tracking/gps_l1_ca_dll_pll_tracking_test.cc b/src/tests/unit-tests/signal-processing-blocks/tracking/gps_l1_ca_dll_pll_tracking_test.cc index 3e33bc3bf..411221e1e 100644 --- a/src/tests/unit-tests/signal-processing-blocks/tracking/gps_l1_ca_dll_pll_tracking_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/tracking/gps_l1_ca_dll_pll_tracking_test.cc @@ -61,8 +61,13 @@ #endif #if HAS_STD_FILESYSTEM +#if HAS_STD_FILESYSTEM_EXPERIMENTAL +#include +namespace fs = std::experimental::filesystem; +#else #include namespace fs = std::filesystem; +#endif #else #include namespace fs = boost::filesystem; diff --git a/src/tests/unit-tests/signal-processing-blocks/tracking/gps_l1_ca_kf_tracking_test.cc b/src/tests/unit-tests/signal-processing-blocks/tracking/gps_l1_ca_kf_tracking_test.cc index 0b16279f7..89c1cb591 100644 --- a/src/tests/unit-tests/signal-processing-blocks/tracking/gps_l1_ca_kf_tracking_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/tracking/gps_l1_ca_kf_tracking_test.cc @@ -60,8 +60,13 @@ #endif #if HAS_STD_FILESYSTEM +#if HAS_STD_FILESYSTEM_EXPERIMENTAL +#include +namespace fs = std::experimental::filesystem; +#else #include namespace fs = std::filesystem; +#endif #else #include namespace fs = boost::filesystem; diff --git a/src/tests/unit-tests/signal-processing-blocks/tracking/tracking_pull-in_test.cc b/src/tests/unit-tests/signal-processing-blocks/tracking/tracking_pull-in_test.cc index 21567e373..e7aa0676f 100644 --- a/src/tests/unit-tests/signal-processing-blocks/tracking/tracking_pull-in_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/tracking/tracking_pull-in_test.cc @@ -76,8 +76,13 @@ #endif #if HAS_STD_FILESYSTEM +#if HAS_STD_FILESYSTEM_EXPERIMENTAL +#include +namespace fs = std::experimental::filesystem; +#else #include namespace fs = std::filesystem; +#endif #else #include namespace fs = boost::filesystem; diff --git a/src/tests/unit-tests/signal-processing-blocks/tracking/tracking_pull-in_test_fpga.cc b/src/tests/unit-tests/signal-processing-blocks/tracking/tracking_pull-in_test_fpga.cc index aee343587..bf997d7b4 100644 --- a/src/tests/unit-tests/signal-processing-blocks/tracking/tracking_pull-in_test_fpga.cc +++ b/src/tests/unit-tests/signal-processing-blocks/tracking/tracking_pull-in_test_fpga.cc @@ -60,8 +60,13 @@ #include #if HAS_STD_FILESYSTEM +#if HAS_STD_FILESYSTEM_EXPERIMENTAL +#include +namespace fs = std::experimental::filesystem; +#else #include namespace fs = std::filesystem; +#endif #else #include namespace fs = boost::filesystem; diff --git a/src/utils/front-end-cal/CMakeLists.txt b/src/utils/front-end-cal/CMakeLists.txt index 80f05cc2b..303b4640d 100644 --- a/src/utils/front-end-cal/CMakeLists.txt +++ b/src/utils/front-end-cal/CMakeLists.txt @@ -58,6 +58,9 @@ add_executable(front-end-cal ${CMAKE_CURRENT_SOURCE_DIR}/main.cc) if(${FILESYSTEM_FOUND}) target_compile_definitions(front-end-cal PRIVATE -DHAS_STD_FILESYSTEM=1) + if(${find_experimental}) + target_compile_definitions(front-end-cal PRIVATE -DHAS_STD_FILESYSTEM_EXPERIMENTAL=1) + endif() target_link_libraries(front-end-cal PRIVATE std::filesystem) else() target_link_libraries(front-end-cal PRIVATE Boost::filesystem Boost::system)