1
0
mirror of https://github.com/gnss-sdr/gnss-sdr synced 2024-09-28 23:10:51 +00:00

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

This commit is contained in:
Javier Arribas 2019-06-17 09:53:14 +02:00
commit 47e6e173cb
20 changed files with 310 additions and 247 deletions

View File

@ -32,7 +32,6 @@ Checks: '-*,
performance-inefficient-algorithm, performance-inefficient-algorithm,
performance-move-const-arg, performance-move-const-arg,
performance-type-promotion-in-math-fn, performance-type-promotion-in-math-fn,
performance-unnecessary-copy-initialization,
performance-unnecessary-value-param, performance-unnecessary-value-param,
readability-container-size-empty, readability-container-size-empty,
readability-identifier-naming, readability-identifier-naming,

View File

@ -295,6 +295,12 @@ if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
set(OS_IS_MACOSX TRUE) set(OS_IS_MACOSX TRUE)
execute_process(COMMAND uname -v OUTPUT_VARIABLE DARWIN_VERSION) execute_process(COMMAND uname -v OUTPUT_VARIABLE DARWIN_VERSION)
string(REGEX MATCH "[0-9]+" DARWIN_VERSION ${DARWIN_VERSION}) string(REGEX MATCH "[0-9]+" DARWIN_VERSION ${DARWIN_VERSION})
if(${DARWIN_VERSION} MATCHES "19")
set(MACOS_CATALINA TRUE)
set(CMAKE_XCODE_ATTRIBUTE_CLANG_CXX_LANGUAGE_STANDARD "c++14")
set(CMAKE_XCODE_ATTRIBUTE_CLANG_CXX_LIBRARY "libc++")
message(STATUS "Configuring GNSS-SDR v${VERSION} to be built on macOS Catalina 10.15")
endif()
if(${DARWIN_VERSION} MATCHES "18") if(${DARWIN_VERSION} MATCHES "18")
set(MACOS_MOJAVE TRUE) set(MACOS_MOJAVE TRUE)
set(CMAKE_XCODE_ATTRIBUTE_CLANG_CXX_LANGUAGE_STANDARD "c++14") set(CMAKE_XCODE_ATTRIBUTE_CLANG_CXX_LANGUAGE_STANDARD "c++14")
@ -468,7 +474,7 @@ endif()
################################################################################ ################################################################################
# Set C and C++ standard # Set minimal C and C++ standards
################################################################################ ################################################################################
if(NOT (CMAKE_VERSION VERSION_LESS "3.1")) if(NOT (CMAKE_VERSION VERSION_LESS "3.1"))
set(CMAKE_C_STANDARD 11) set(CMAKE_C_STANDARD 11)
@ -484,7 +490,7 @@ else()
endif() endif()
endif() endif()
if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") if(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
if(OS_IS_MACOSX) if(CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang")
if(CLANG_VERSION VERSION_LESS "600") if(CLANG_VERSION VERSION_LESS "600")
add_compile_options("$<$<STREQUAL:$<TARGET_PROPERTY:LINKER_LANGUAGE>,CXX>:-std=c++11>") add_compile_options("$<$<STREQUAL:$<TARGET_PROPERTY:LINKER_LANGUAGE>,CXX>:-std=c++11>")
else() else()
@ -623,132 +629,6 @@ set_package_properties(GNURADIO PROPERTIES
PURPOSE "Implements flowgraph scheduler, provides some processing blocks and classes to create new ones." PURPOSE "Implements flowgraph scheduler, provides some processing blocks and classes to create new ones."
TYPE REQUIRED TYPE REQUIRED
) )
if(GNURADIO_VERSION)
if(GNURADIO_VERSION VERSION_LESS ${GNSSSDR_GNURADIO_MIN_VERSION})
unset(GNURADIO_RUNTIME_FOUND)
message(STATUS "The GNU Radio version installed in your system (v${GNURADIO_VERSION}) is too old.")
endif()
endif()
if(NOT GNURADIO_RUNTIME_FOUND)
message(STATUS "CMake cannot find GNU Radio >= ${GNSSSDR_GNURADIO_MIN_VERSION}")
if(OS_IS_LINUX)
message("Go to https://github.com/gnuradio/pybombs")
message("and follow the instructions to install GNU Radio in your system.")
endif()
if(OS_IS_MACOSX)
message("You can install it easily via Macports:")
message(" sudo port install gnuradio ")
message("Alternatively, you can use homebrew:")
message(" brew install gnuradio")
endif()
message(FATAL_ERROR "GNU Radio v${GNSSSDR_GNURADIO_MIN_VERSION} or later is required to build gnss-sdr.")
else()
if(NOT TARGET Gnuradio::runtime)
add_library(Gnuradio::runtime SHARED IMPORTED)
list(GET GNURADIO_RUNTIME_LIBRARIES 0 FIRST_DIR)
get_filename_component(GNURADIO_RUNTIME_DIR ${FIRST_DIR} ABSOLUTE)
set_target_properties(Gnuradio::runtime PROPERTIES
IMPORTED_LINK_INTERFACE_LANGUAGES "CXX"
IMPORTED_LOCATION "${GNURADIO_RUNTIME_DIR}"
INTERFACE_INCLUDE_DIRECTORIES "${GNURADIO_RUNTIME_INCLUDE_DIRS}"
INTERFACE_LINK_LIBRARIES "${GNURADIO_RUNTIME_LIBRARIES}"
)
endif()
endif()
if(NOT GNURADIO_ANALOG_FOUND)
message(FATAL_ERROR "*** The gnuradio-analog library v${GNSSSDR_GNURADIO_MIN_VERSION} or later is required to build gnss-sdr")
else()
if(NOT TARGET Gnuradio::analog)
add_library(Gnuradio::analog SHARED IMPORTED)
list(GET GNURADIO_ANALOG_LIBRARIES 0 FIRST_DIR)
get_filename_component(GNURADIO_ANALOG_DIR ${FIRST_DIR} ABSOLUTE)
set_target_properties(Gnuradio::analog PROPERTIES
IMPORTED_LINK_INTERFACE_LANGUAGES "CXX"
IMPORTED_LOCATION "${GNURADIO_ANALOG_DIR}"
INTERFACE_INCLUDE_DIRECTORIES "${GNURADIO_ANALOG_INCLUDE_DIRS}"
INTERFACE_LINK_LIBRARIES "${GNURADIO_ANALOG_LIBRARIES}"
)
endif()
endif()
if(NOT GNURADIO_BLOCKS_FOUND)
message(FATAL_ERROR "*** The gnuradio-blocks library v${GNSSSDR_GNURADIO_MIN_VERSION} or later is required to build gnss-sdr")
else()
if(NOT TARGET Gnuradio::blocks)
add_library(Gnuradio::blocks SHARED IMPORTED)
list(GET GNURADIO_BLOCKS_LIBRARIES 0 FIRST_DIR)
get_filename_component(GNURADIO_BLOCKS_DIR ${FIRST_DIR} ABSOLUTE)
set_target_properties(Gnuradio::blocks PROPERTIES
IMPORTED_LINK_INTERFACE_LANGUAGES "CXX"
IMPORTED_LOCATION "${GNURADIO_BLOCKS_DIR}"
INTERFACE_INCLUDE_DIRECTORIES "${GNURADIO_BLOCKS_INCLUDE_DIRS}"
INTERFACE_LINK_LIBRARIES "${GNURADIO_BLOCKS_LIBRARIES}"
)
endif()
endif()
if(NOT GNURADIO_FILTER_FOUND)
message(FATAL_ERROR "*** The gnuradio-filter library v${GNSSSDR_GNURADIO_MIN_VERSION} or later is required to build gnss-sdr")
else()
if(NOT TARGET Gnuradio::filter)
add_library(Gnuradio::filter SHARED IMPORTED)
list(GET GNURADIO_FILTER_LIBRARIES 0 FIRST_DIR)
get_filename_component(GNURADIO_FILTER_DIR ${FIRST_DIR} ABSOLUTE)
set_target_properties(Gnuradio::filter PROPERTIES
IMPORTED_LINK_INTERFACE_LANGUAGES "CXX"
IMPORTED_LOCATION "${GNURADIO_FILTER_DIR}"
INTERFACE_INCLUDE_DIRECTORIES "${GNURADIO_FILTER_INCLUDE_DIRS}"
INTERFACE_LINK_LIBRARIES "${GNURADIO_FILTER_LIBRARIES}"
)
endif()
endif()
if(NOT GNURADIO_FFT_FOUND)
message(FATAL_ERROR "*** The gnuradio-fft library v${GNSSSDR_GNURADIO_MIN_VERSION} or later is required to build gnss-sdr")
else()
if(NOT TARGET Gnuradio::fft)
add_library(Gnuradio::fft SHARED IMPORTED)
list(GET GNURADIO_FFT_LIBRARIES 0 FIRST_DIR)
get_filename_component(GNURADIO_FFT_DIR ${FIRST_DIR} ABSOLUTE)
set_target_properties(Gnuradio::fft PROPERTIES
IMPORTED_LINK_INTERFACE_LANGUAGES "CXX"
IMPORTED_LOCATION "${GNURADIO_FFT_DIR}"
INTERFACE_INCLUDE_DIRECTORIES "${GNURADIO_FFT_INCLUDE_DIRS}"
INTERFACE_LINK_LIBRARIES "${GNURADIO_FFT_LIBRARIES}"
)
endif()
endif()
if(NOT GNURADIO_PMT_FOUND)
message(FATAL_ERROR "*** The gnuradio-pmt library v${GNSSSDR_GNURADIO_MIN_VERSION} or later is required to build gnss-sdr")
else()
if(NOT TARGET Gnuradio::pmt)
add_library(Gnuradio::pmt SHARED IMPORTED)
list(GET GNURADIO_PMT_LIBRARIES 0 FIRST_DIR)
get_filename_component(GNURADIO_PMT_DIR ${FIRST_DIR} ABSOLUTE)
set_target_properties(Gnuradio::pmt PROPERTIES
IMPORTED_LINK_INTERFACE_LANGUAGES "CXX"
IMPORTED_LOCATION "${GNURADIO_PMT_DIR}"
INTERFACE_INCLUDE_DIRECTORIES "${GNURADIO_PMT_INCLUDE_DIRS}"
INTERFACE_LINK_LIBRARIES "${GNURADIO_PMT_LIBRARIES}"
)
endif()
endif()
if(ENABLE_UHD AND UHD_FOUND AND GNURADIO_UHD_FOUND)
if(NOT TARGET Gnuradio::uhd)
add_library(Gnuradio::uhd SHARED IMPORTED)
list(GET GNURADIO_UHD_LIBRARIES 0 FIRST_DIR)
get_filename_component(GNURADIO_UHD_DIR ${FIRST_DIR} ABSOLUTE)
set_target_properties(Gnuradio::uhd PROPERTIES
IMPORTED_LINK_INTERFACE_LANGUAGES "CXX"
IMPORTED_LOCATION "${GNURADIO_UHD_DIR}"
INTERFACE_INCLUDE_DIRECTORIES "${GNURADIO_UHD_INCLUDE_DIRS}"
INTERFACE_LINK_LIBRARIES "${GNURADIO_UHD_LIBRARIES}"
)
endif()
endif()
@ -769,7 +649,7 @@ endif()
################################################################################ ################################################################################
# Dectect availability of std::filesystem # Detect availability of std::filesystem and set C++ standard accordingly
################################################################################ ################################################################################
set(FILESYSTEM_FOUND FALSE) set(FILESYSTEM_FOUND FALSE)
if(NOT (GNURADIO_VERSION VERSION_LESS 3.8) AND LOG4CPP_READY_FOR_CXX17) if(NOT (GNURADIO_VERSION VERSION_LESS 3.8) AND LOG4CPP_READY_FOR_CXX17)
@ -787,7 +667,11 @@ if(NOT (GNURADIO_VERSION VERSION_LESS 3.8) AND LOG4CPP_READY_FOR_CXX17)
TYPE OPTIONAL TYPE OPTIONAL
) )
if(${FILESYSTEM_FOUND}) if(${FILESYSTEM_FOUND})
set(CMAKE_CXX_STANDARD 17) if(CMAKE_VERSION VERSION_LESS 3.12)
set(CMAKE_CXX_STANDARD 17)
else()
set(CMAKE_CXX_STANDARD 20)
endif()
set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_STANDARD_REQUIRED ON)
endif() endif()
endif() endif()
@ -818,14 +702,25 @@ if(NOT ${FILESYSTEM_FOUND})
set(BOOST_COMPONENTS ${BOOST_COMPONENTS} filesystem) set(BOOST_COMPONENTS ${BOOST_COMPONENTS} filesystem)
endif() endif()
find_package(Boost ${GNSSSDR_BOOST_MIN_VERSION} COMPONENTS ${BOOST_COMPONENTS} REQUIRED) find_package(Boost ${GNSSSDR_BOOST_MIN_VERSION} COMPONENTS ${BOOST_COMPONENTS} REQUIRED)
if(NOT Boost_FOUND)
message(FATAL_ERROR "Fatal error: Boost (version >=${GNSSSDR_BOOST_MIN_VERSION}) required.")
endif()
set_package_properties(Boost PROPERTIES set_package_properties(Boost PROPERTIES
URL "https://www.boost.org" URL "https://www.boost.org"
DESCRIPTION "Portable C++ source libraries"
PURPOSE "Used widely across the source code." PURPOSE "Used widely across the source code."
TYPE REQUIRED TYPE REQUIRED
) )
if(NOT Boost_FOUND)
message(FATAL_ERROR "Fatal error: Boost (version >=${GNSSSDR_BOOST_MIN_VERSION}) required.") if(CMAKE_VERSION VERSION_GREATER 3.14)
set_package_properties(Boost PROPERTIES
DESCRIPTION "Portable C++ source libraries (found: ${Boost_VERSION_STRING})"
)
else()
set_package_properties(Boost PROPERTIES
DESCRIPTION "Portable C++ source libraries (found: ${Boost_MAJOR_VERSION}.${Boost_MINOR_VERSION}.${Boost_SUBMINOR_VERSION})"
)
endif() endif()
if(CMAKE_VERSION VERSION_LESS 3.5) if(CMAKE_VERSION VERSION_LESS 3.5)
@ -1231,37 +1126,30 @@ if(NOT GLOG_FOUND OR ${LOCAL_GFLAGS})
set(GFLAGS_LIBRARIES_TO_LINK ${GFlags_LIBS}) set(GFLAGS_LIBRARIES_TO_LINK ${GFlags_LIBS})
set(GFLAGS_LIBRARY_DIR_TO_LINK ${GFlags_LIBRARY_DIRS}) set(GFLAGS_LIBRARY_DIR_TO_LINK ${GFlags_LIBRARY_DIRS})
endif() endif()
if(OS_IS_MACOSX)
if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") set(GFLAGS_LIBRARIES_TO_LINK "${GFLAGS_LIBRARIES_TO_LINK} -lc++")
file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/glog-${GNSSSDR_GLOG_LOCAL_VERSION}/tmp/configure_with_gflags set(GLOG_EXPORT_CXX_LIBRARIES "export CXXFLAGS=\"-stdlib=libc++\"")
"#!/bin/sh
export CPPFLAGS=-I${GFlags_INCLUDE_DIRS}
export LDFLAGS=-L${GFLAGS_LIBRARY_DIR_TO_LINK}
export LIBS=\"${GFLAGS_LIBRARIES_TO_LINK} -lc++\"
export CXXFLAGS=\"-stdlib=libc++\"
export CC=clang
export CXX=clang++
cd ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/glog/glog-${GNSSSDR_GLOG_LOCAL_VERSION}/
aclocal
automake --add-missing
autoreconf -vfi
cd ${CMAKE_CURRENT_BINARY_DIR}/glog-${GNSSSDR_GLOG_LOCAL_VERSION}
${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/glog/glog-${GNSSSDR_GLOG_LOCAL_VERSION}/configure"
)
else()
file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/glog-${GNSSSDR_GLOG_LOCAL_VERSION}/tmp/configure_with_gflags
"#!/bin/sh
export CPPFLAGS=-I${GFlags_INCLUDE_DIRS}
export LDFLAGS=-L${GFLAGS_LIBRARY_DIR_TO_LINK}
export LIBS=${GFLAGS_LIBRARIES_TO_LINK}
cd ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/glog/glog-${GNSSSDR_GLOG_LOCAL_VERSION}/
aclocal
automake --add-missing
autoreconf -vfi
cd ${CMAKE_CURRENT_BINARY_DIR}/glog-${GNSSSDR_GLOG_LOCAL_VERSION}
${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/glog/glog-${GNSSSDR_GLOG_LOCAL_VERSION}/configure"
)
endif() endif()
if(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
set(GLOG_EXPORT_C_COMPILER "export CC=clang")
set(GLOG_EXPORT_CXX_COMPILER "export CXX=clang++")
endif()
file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/glog-${GNSSSDR_GLOG_LOCAL_VERSION}/tmp/configure_with_gflags
"#!/bin/sh
export CPPFLAGS=-I${GFlags_INCLUDE_DIRS}
export LDFLAGS=-L${GFLAGS_LIBRARY_DIR_TO_LINK}
export LIBS=\"${GFLAGS_LIBRARIES_TO_LINK}\"
${GLOG_EXPORT_CXX_LIBRARIES}
${GLOG_EXPORT_C_COMPILER}
${GLOG_EXPORT_CXX_COMPILER}
cd ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/glog/glog-${GNSSSDR_GLOG_LOCAL_VERSION}/
aclocal
automake --add-missing
autoreconf -vfi
cd ${CMAKE_CURRENT_BINARY_DIR}/glog-${GNSSSDR_GLOG_LOCAL_VERSION}
${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/glog/glog-${GNSSSDR_GLOG_LOCAL_VERSION}/configure"
)
file(COPY ${CMAKE_CURRENT_BINARY_DIR}/glog-${GNSSSDR_GLOG_LOCAL_VERSION}/tmp/configure_with_gflags file(COPY ${CMAKE_CURRENT_BINARY_DIR}/glog-${GNSSSDR_GLOG_LOCAL_VERSION}/tmp/configure_with_gflags
DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/glog-${GNSSSDR_GLOG_LOCAL_VERSION} DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/glog-${GNSSSDR_GLOG_LOCAL_VERSION}
@ -1460,6 +1348,9 @@ set_package_properties(Armadillo PROPERTIES
TYPE REQUIRED TYPE REQUIRED
) )
if(ARMADILLO_FOUND) if(ARMADILLO_FOUND)
set_package_properties(Armadillo PROPERTIES
DESCRIPTION "C++ library for linear algebra and scientific computing (found: v${ARMADILLO_VERSION_STRING})"
)
if(${ARMADILLO_VERSION_STRING} VERSION_LESS ${GNSSSDR_ARMADILLO_MIN_VERSION}) if(${ARMADILLO_VERSION_STRING} VERSION_LESS ${GNSSSDR_ARMADILLO_MIN_VERSION})
set(ARMADILLO_FOUND false) set(ARMADILLO_FOUND false)
set(ENABLE_OWN_ARMADILLO true) set(ENABLE_OWN_ARMADILLO true)
@ -1789,6 +1680,10 @@ if(NOT MATIO_FOUND OR MATIO_VERSION_STRING VERSION_LESS ${GNSSSDR_MATIO_MIN_VERS
set_package_properties(MATIO PROPERTIES set_package_properties(MATIO PROPERTIES
PURPOSE "Matio v${GNSSSDR_MATIO_LOCAL_VERSION} will be downloaded and built when doing '${CMAKE_MAKE_PROGRAM_PRETTY_NAME}'." PURPOSE "Matio v${GNSSSDR_MATIO_LOCAL_VERSION} will be downloaded and built when doing '${CMAKE_MAKE_PROGRAM_PRETTY_NAME}'."
) )
else()
set_package_properties(MATIO PROPERTIES
DESCRIPTION "MATLAB MAT File I/O Library (found: v.${MATIO_VERSION_STRING})"
)
endif() endif()
@ -1916,6 +1811,13 @@ if(Protobuf_FOUND AND CMAKE_VERSION VERSION_LESS 3.9)
set(Protobuf_VERSION "${_PROTOBUF_MAJOR_VERSION}.${_PROTOBUF_MINOR_VERSION}.${_PROTOBUF_SUBMINOR_VERSION}") set(Protobuf_VERSION "${_PROTOBUF_MAJOR_VERSION}.${_PROTOBUF_MINOR_VERSION}.${_PROTOBUF_SUBMINOR_VERSION}")
endif() endif()
endif() endif()
if(Protobuf_FOUND)
set_package_properties(Protobuf PROPERTIES
DESCRIPTION "Structured data serialization mechanism (found: v${Protobuf_VERSION})"
)
endif()
if(Protobuf_FOUND AND CMAKE_CROSSCOMPILING) if(Protobuf_FOUND AND CMAKE_CROSSCOMPILING)
find_program(PROTOC_EXECUTABLE protoc) find_program(PROTOC_EXECUTABLE protoc)
if(NOT PROTOC_EXECUTABLE) if(NOT PROTOC_EXECUTABLE)
@ -1935,6 +1837,7 @@ if(Protobuf_FOUND AND CMAKE_CROSSCOMPILING)
message(FATAL_ERROR "Please install the Protocol Buffers compiler v${Protobuf_VERSION} in the host machine") message(FATAL_ERROR "Please install the Protocol Buffers compiler v${Protobuf_VERSION} in the host machine")
endif() endif()
endif() endif()
if((NOT Protobuf_FOUND) OR (NOT Protobuf_PROTOC_EXECUTABLE) OR (${Protobuf_VERSION} VERSION_LESS ${GNSSSDR_PROTOBUF_MIN_VERSION})) if((NOT Protobuf_FOUND) OR (NOT Protobuf_PROTOC_EXECUTABLE) OR (${Protobuf_VERSION} VERSION_LESS ${GNSSSDR_PROTOBUF_MIN_VERSION}))
unset(Protobuf_PROTOC_EXECUTABLE) unset(Protobuf_PROTOC_EXECUTABLE)
if(CMAKE_CROSSCOMPILING) if(CMAKE_CROSSCOMPILING)

View File

@ -45,12 +45,37 @@ find_library(GFORTRAN NAMES gfortran
/usr/lib/gcc/i686-redhat-linux/4.8.2 /usr/lib/gcc/i686-redhat-linux/4.8.2
/usr/lib/gcc/x86_64-redhat-linux/7 /usr/lib/gcc/x86_64-redhat-linux/7
/usr/lib/gcc/i686-redhat-linux/7 /usr/lib/gcc/i686-redhat-linux/7
/usr/lib/gcc/x86_64-redhat-linux/8
/usr/lib/gcc/i686-redhat-linux/8
/usr/lib/gcc/x86_64-redhat-linux/9
/usr/lib/gcc/i686-redhat-linux/9
/usr/lib64/gcc/x86_64-redhat-linux/7
/usr/lib64/gcc/x86_64-redhat-linux/8
/usr/lib64/gcc/x86_64-redhat-linux/9
/usr/lib/gcc/armv7hl-redhat-linux-gnueabi/7 /usr/lib/gcc/armv7hl-redhat-linux-gnueabi/7
/usr/lib/gcc/aarch64-redhat-linux/7 /usr/lib/gcc/aarch64-redhat-linux/7
/usr/lib/gcc/i586-suse-linux/4.8 # OpenSUSE 13.1 /usr/lib/gcc/i586-suse-linux/4.8 # OpenSUSE 13.1
/usr/lib/gcc/i586-suse-linux/4.9 /usr/lib/gcc/i586-suse-linux/4.9
/usr/lib/gcc/i586-suse-linux/7
/usr/lib/gcc/i586-suse-linux/8
/usr/lib/gcc/i586-suse-linux/9
/usr/lib/gcc/x86_64-suse-linux/4.8 /usr/lib/gcc/x86_64-suse-linux/4.8
/usr/lib/gcc/x86_64-suse-linux/4.9 /usr/lib/gcc/x86_64-suse-linux/4.9
/usr/lib64/gcc/x86_64-suse-linux/7
/usr/lib64/gcc/x86_64-suse-linux/8
/usr/lib64/gcc/x86_64-suse-linux/9
/usr/lib/gcc/armv7hl-suse-linux-gnueabi/7
/usr/lib/gcc/armv7hl-suse-linux-gnueabi/8
/usr/lib/gcc/armv7hl-suse-linux-gnueabi/9
/usr/lib64/gcc/aarch64-suse-linux/7
/usr/lib64/gcc/aarch64-suse-linux/8
/usr/lib64/gcc/aarch64-suse-linux/9
/usr/lib64/gcc/powerpc64-suse-linux/7
/usr/lib64/gcc/powerpc64-suse-linux/8
/usr/lib64/gcc/powerpc64-suse-linux/9
/usr/lib64/gcc/powerpc64le-suse-linux/7
/usr/lib64/gcc/powerpc64le-suse-linux/8
/usr/lib64/gcc/powerpc64le-suse-linux/9
/usr/lib/gcc/i486-linux-gnu # Debian 7 /usr/lib/gcc/i486-linux-gnu # Debian 7
/usr/lib/gcc/i486-linux-gnu/4.4 /usr/lib/gcc/i486-linux-gnu/4.4
/usr/lib/gcc/i486-linux-gnu/4.6 /usr/lib/gcc/i486-linux-gnu/4.6
@ -142,6 +167,24 @@ find_library(GFORTRAN NAMES gfortran
/usr/lib/gcc/powerpc64le-linux-gnu/8 /usr/lib/gcc/powerpc64le-linux-gnu/8
/usr/lib/gcc/s390x-linux-gnu/8 /usr/lib/gcc/s390x-linux-gnu/8
/usr/lib/gcc/alpha-linux-gnu/8 /usr/lib/gcc/alpha-linux-gnu/8
/usr/lib/gcc/x86_64-linux-gnu/9
/usr/lib/gcc/aarch64-linux-gnu/9
/usr/lib/gcc/arm-linux-gnueabi/9
/usr/lib/gcc/arm-linux-gnueabihf/9
/usr/lib/gcc/i686-linux-gnu/9
/usr/lib/gcc/powerpc64le-linux-gnu/9
/usr/lib/gcc/powerpc64-linux-gnu/9/
/usr/lib/gcc/s390x-linux-gnu/9
/usr/lib/gcc/alpha-linux-gnu/9
/usr/lib/gcc/hppa-linux-gnu/9
/usr/lib/gcc/m68k-linux-gnu/9
/usr/lib/gcc/mips-linux-gnu/9
/usr/lib/gcc/mips64el-linux-gnuabi64/9
/usr/lib/gcc/mipsel-linux-gnu/9
/usr/lib/gcc/riscv64-linux-gnu/9
/usr/lib/gcc/sh4-linux-gnu/9
/usr/lib/gcc/sparc64-linux-gnu/9
/usr/lib/gcc/x86_64-linux-gnux32/9
${GFORTRAN_ROOT}/lib ${GFORTRAN_ROOT}/lib
$ENV{GFORTRAN_ROOT}/lib $ENV{GFORTRAN_ROOT}/lib
) )

View File

@ -143,6 +143,21 @@ function(GR_MODULE EXTVAR PCNAME INCFILE LIBFILE)
set(GNURADIO_FOUND FALSE) # Trick for feature_summary set(GNURADIO_FOUND FALSE) # Trick for feature_summary
endif() endif()
# Create imported target
string(TOLOWER ${EXTVAR} gnuradio_component)
if(NOT TARGET Gnuradio::${gnuradio_component})
add_library(Gnuradio::${gnuradio_component} SHARED IMPORTED)
set(GNURADIO_LIBRARY ${GNURADIO_${EXTVAR}_LIBRARIES})
list(GET GNURADIO_LIBRARY 0 FIRST_DIR)
get_filename_component(GNURADIO_DIR ${FIRST_DIR} ABSOLUTE)
set_target_properties(Gnuradio::${gnuradio_component} PROPERTIES
IMPORTED_LINK_INTERFACE_LANGUAGES "CXX"
IMPORTED_LOCATION "${GNURADIO_DIR}"
INTERFACE_INCLUDE_DIRECTORIES "${GNURADIO_${EXTVAR}_INCLUDE_DIRS}"
INTERFACE_LINK_LIBRARIES "${GNURADIO_LIBRARY}"
)
endif()
mark_as_advanced(GNURADIO_${EXTVAR}_LIBRARIES GNURADIO_${EXTVAR}_INCLUDE_DIRS) mark_as_advanced(GNURADIO_${EXTVAR}_LIBRARIES GNURADIO_${EXTVAR}_INCLUDE_DIRS)
endfunction() endfunction()
@ -218,3 +233,25 @@ if(NOT DEFINED GNURADIO_FOUND)
set(GNURADIO_FOUND TRUE) set(GNURADIO_FOUND TRUE)
endif() endif()
set(GNURADIO_VERSION ${PC_GNURADIO_RUNTIME_VERSION}) set(GNURADIO_VERSION ${PC_GNURADIO_RUNTIME_VERSION})
if(NOT GNSSSDR_GNURADIO_MIN_VERSION)
set(GNSSSDR_GNURADIO_MIN_VERSION "3.7.3")
endif()
if(GNURADIO_VERSION)
if(GNURADIO_VERSION VERSION_LESS ${GNSSSDR_GNURADIO_MIN_VERSION})
unset(GNURADIO_RUNTIME_FOUND)
message(STATUS "The GNU Radio version installed in your system (v${GNURADIO_VERSION}) is too old.")
if(OS_IS_LINUX)
message("Go to https://github.com/gnuradio/pybombs")
message("and follow the instructions to install GNU Radio in your system.")
endif()
if(OS_IS_MACOSX)
message("You can install it easily via Macports:")
message(" sudo port install gnuradio ")
message("Alternatively, you can use homebrew:")
message(" brew install gnuradio")
endif()
message(FATAL_ERROR "GNU Radio v${GNSSSDR_GNURADIO_MIN_VERSION} or later is required to build gnss-sdr.")
endif()
endif()

View File

@ -85,7 +85,6 @@ find_library(LOG4CPP_LIBRARY
/usr/lib/alpha-linux-gnu /usr/lib/alpha-linux-gnu
/usr/lib64 /usr/lib64
/usr/lib /usr/lib
/usr/local/lib
/opt/local/lib /opt/local/lib
${LOG4CPP_ROOT}/lib ${LOG4CPP_ROOT}/lib
$ENV{LOG4CPP_ROOT}/lib $ENV{LOG4CPP_ROOT}/lib

View File

@ -16,7 +16,7 @@
- Improved preamble detection implementation in the decoding of navigation messages (acceleration by x1.6 on average per channel). - Improved preamble detection implementation in the decoding of navigation messages (acceleration by x1.6 on average per channel).
- Shortened Acquisition to Tracking transition time. - Shortened Acquisition to Tracking transition time.
- Applied clang-tidy checks and fixes related to performance: performance-faster-string-find, performance-inefficient-algorithm, performance-move-const-arg, performance-type-promotion-in-math-fn, performance-unnecessary-copy-initialization, performance-unnecessary-value-param, readability-string-compare. - Applied clang-tidy checks and fixes related to performance: performance-faster-string-find, performance-inefficient-algorithm, performance-move-const-arg, performance-type-promotion-in-math-fn, performance-unnecessary-value-param, readability-string-compare.
### Improvements in Flexibility: ### Improvements in Flexibility:
@ -50,7 +50,8 @@
- Added interfaces for FPGA off-loading. - Added interfaces for FPGA off-loading.
- CMake scripts now follow a modern approach (targets and properties) but still work with 2.8.12. - CMake scripts now follow a modern approach (targets and properties) but still work with 2.8.12.
- Improvements for macOS users using Homebrew. - Improvements for macOS users using Homebrew.
- The volk_gnsssdr library can now be built without requiring Boost if the compiler supports C++17. - The volk_gnsssdr library can now be built without requiring Boost if the compiler supports C++17 or higher.
- CMake scripts automatically select among C++11, C++14, C++17 or C++20 standards, the most recent as possible, depending on compiler and dependencies versions.
### Improvements in Reliability ### Improvements in Reliability
@ -63,8 +64,9 @@
- The receiver now admits FPGA off-loading, allowing for real time operation at high sampling rates and higher number of signals and channels. - The receiver now admits FPGA off-loading, allowing for real time operation at high sampling rates and higher number of signals and channels.
- Fixed program termination (avoiding hangs and segfaults in some platforms/configurations). - Fixed program termination (avoiding hangs and segfaults in some platforms/configurations).
- The Labsat_Signal_Source now terminates the receiver's execution when the end of file(s) is reached. It now accepts LabSat 2 filenames and series of LabSat 3 files. - The Labsat_Signal_Source now terminates the receiver's execution when the end of file(s) is reached. It now accepts LabSat 2 filenames and series of LabSat 3 files.
- CMake now generates a summary of enabled/disabled features. This info is also stored in a file called features.log in the building directory. - Added configuration parameters to set the annotation rate in KML, GPX, GeoJSON and NMEA outputs, set by default to 1 s.
- New parameter PVT.show_local_time_zone displays time in the local time zone. Subject to the proper system configuration of the machine running the software receiver. - New parameter PVT.show_local_time_zone displays time in the local time zone. Subject to the proper system configuration of the machine running the software receiver.
- CMake now generates a summary of enabled/disabled features. This info is also stored in a file called features.log in the building directory.
- Improved information provided to the user in case of failure. - Improved information provided to the user in case of failure.

View File

@ -138,6 +138,11 @@ Rtklib_Pvt::Rtklib_Pvt(ConfigurationInterface* configuration,
pvt_output_parameters.rtcm_msg_rate_ms[k] = rtcm_MT1097_rate_ms; pvt_output_parameters.rtcm_msg_rate_ms[k] = rtcm_MT1097_rate_ms;
} }
pvt_output_parameters.kml_rate_ms = bc::lcm(configuration->property(role + ".kml_rate_ms", pvt_output_parameters.kml_rate_ms), pvt_output_parameters.output_rate_ms);
pvt_output_parameters.gpx_rate_ms = bc::lcm(configuration->property(role + ".gpx_rate_ms", pvt_output_parameters.gpx_rate_ms), pvt_output_parameters.output_rate_ms);
pvt_output_parameters.geojson_rate_ms = bc::lcm(configuration->property(role + ".geojson_rate_ms", pvt_output_parameters.geojson_rate_ms), pvt_output_parameters.output_rate_ms);
pvt_output_parameters.nmea_rate_ms = bc::lcm(configuration->property(role + ".nmea_rate_ms", pvt_output_parameters.nmea_rate_ms), pvt_output_parameters.output_rate_ms);
// Infer the type of receiver // Infer the type of receiver
/* /*
* TYPE | RECEIVER * TYPE | RECEIVER

View File

@ -178,6 +178,11 @@ rtklib_pvt_gs::rtklib_pvt_gs(uint32_t nchannels,
std::string kml_dump_filename; std::string kml_dump_filename;
kml_dump_filename = d_dump_filename; kml_dump_filename = d_dump_filename;
d_kml_output_enabled = conf_.kml_output_enabled; d_kml_output_enabled = conf_.kml_output_enabled;
d_kml_rate_ms = conf_.kml_rate_ms;
if (d_kml_rate_ms == 0)
{
d_kml_output_enabled = false;
}
if (d_kml_output_enabled) if (d_kml_output_enabled)
{ {
d_kml_dump = std::make_shared<Kml_Printer>(conf_.kml_output_path); d_kml_dump = std::make_shared<Kml_Printer>(conf_.kml_output_path);
@ -192,6 +197,11 @@ rtklib_pvt_gs::rtklib_pvt_gs(uint32_t nchannels,
std::string gpx_dump_filename; std::string gpx_dump_filename;
gpx_dump_filename = d_dump_filename; gpx_dump_filename = d_dump_filename;
d_gpx_output_enabled = conf_.gpx_output_enabled; d_gpx_output_enabled = conf_.gpx_output_enabled;
d_gpx_rate_ms = conf_.gpx_rate_ms;
if (d_gpx_rate_ms == 0)
{
d_gpx_output_enabled = false;
}
if (d_gpx_output_enabled) if (d_gpx_output_enabled)
{ {
d_gpx_dump = std::make_shared<Gpx_Printer>(conf_.gpx_output_path); d_gpx_dump = std::make_shared<Gpx_Printer>(conf_.gpx_output_path);
@ -206,6 +216,11 @@ rtklib_pvt_gs::rtklib_pvt_gs(uint32_t nchannels,
std::string geojson_dump_filename; std::string geojson_dump_filename;
geojson_dump_filename = d_dump_filename; geojson_dump_filename = d_dump_filename;
d_geojson_output_enabled = conf_.geojson_output_enabled; d_geojson_output_enabled = conf_.geojson_output_enabled;
d_geojson_rate_ms = conf_.geojson_rate_ms;
if (d_geojson_rate_ms == 0)
{
d_geojson_output_enabled = false;
}
if (d_geojson_output_enabled) if (d_geojson_output_enabled)
{ {
d_geojson_printer = std::make_shared<GeoJSON_Printer>(conf_.geojson_output_path); d_geojson_printer = std::make_shared<GeoJSON_Printer>(conf_.geojson_output_path);
@ -218,6 +233,12 @@ rtklib_pvt_gs::rtklib_pvt_gs(uint32_t nchannels,
// initialize nmea_printer // initialize nmea_printer
d_nmea_output_file_enabled = (conf_.nmea_output_file_enabled or conf_.flag_nmea_tty_port); d_nmea_output_file_enabled = (conf_.nmea_output_file_enabled or conf_.flag_nmea_tty_port);
d_nmea_rate_ms = conf_.nmea_rate_ms;
if (d_nmea_rate_ms == 0)
{
d_nmea_output_file_enabled = false;
}
if (d_nmea_output_file_enabled) if (d_nmea_output_file_enabled)
{ {
d_nmea_printer = std::make_shared<Nmea_Printer>(conf_.nmea_dump_filename, conf_.nmea_output_file_enabled, conf_.flag_nmea_tty_port, conf_.nmea_dump_devname, conf_.nmea_output_file_path); d_nmea_printer = std::make_shared<Nmea_Printer>(conf_.nmea_dump_filename, conf_.nmea_output_file_enabled, conf_.flag_nmea_tty_port, conf_.nmea_dump_devname, conf_.nmea_output_file_path);
@ -1799,19 +1820,31 @@ int rtklib_pvt_gs::work(int noutput_items, gr_vector_const_void_star& input_item
} }
if (d_kml_output_enabled) if (d_kml_output_enabled)
{ {
d_kml_dump->print_position(d_pvt_solver, false); if (current_RX_time_ms % d_kml_rate_ms == 0)
{
d_kml_dump->print_position(d_pvt_solver, false);
}
} }
if (d_gpx_output_enabled) if (d_gpx_output_enabled)
{ {
d_gpx_dump->print_position(d_pvt_solver, false); if (current_RX_time_ms % d_gpx_rate_ms == 0)
{
d_gpx_dump->print_position(d_pvt_solver, false);
}
} }
if (d_geojson_output_enabled) if (d_geojson_output_enabled)
{ {
d_geojson_printer->print_position(d_pvt_solver, false); if (current_RX_time_ms % d_geojson_rate_ms == 0)
{
d_geojson_printer->print_position(d_pvt_solver, false);
}
} }
if (d_nmea_output_file_enabled) if (d_nmea_output_file_enabled)
{ {
d_nmea_printer->Print_Nmea_Line(d_pvt_solver, false); if (current_RX_time_ms % d_nmea_rate_ms == 0)
{
d_nmea_printer->Print_Nmea_Line(d_pvt_solver, false);
}
} }
/* /*

View File

@ -106,6 +106,11 @@ private:
int32_t d_rtcm_MT1097_rate_ms; // Galileo MSM7. The type 7 Multiple Signal Message format for Europes Galileo system int32_t d_rtcm_MT1097_rate_ms; // Galileo MSM7. The type 7 Multiple Signal Message format for Europes Galileo system
int32_t d_rtcm_MSM_rate_ms; int32_t d_rtcm_MSM_rate_ms;
int32_t d_kml_rate_ms;
int32_t d_gpx_rate_ms;
int32_t d_geojson_rate_ms;
int32_t d_nmea_rate_ms;
int32_t d_last_status_print_seg; // for status printer int32_t d_last_status_print_seg; // for status printer
uint32_t d_nchannels; uint32_t d_nchannels;

View File

@ -35,6 +35,10 @@ Pvt_Conf::Pvt_Conf()
type_of_receiver = 0U; type_of_receiver = 0U;
output_rate_ms = 0; output_rate_ms = 0;
display_rate_ms = 0; display_rate_ms = 0;
kml_rate_ms = 1000;
gpx_rate_ms = 1000;
geojson_rate_ms = 1000;
nmea_rate_ms = 1000;
rinex_version = 0; rinex_version = 0;
rinexobs_rate_ms = 0; rinexobs_rate_ms = 0;

View File

@ -41,6 +41,10 @@ public:
uint32_t type_of_receiver; uint32_t type_of_receiver;
int32_t output_rate_ms; int32_t output_rate_ms;
int32_t display_rate_ms; int32_t display_rate_ms;
int32_t kml_rate_ms;
int32_t gpx_rate_ms;
int32_t geojson_rate_ms;
int32_t nmea_rate_ms;
int32_t rinex_version; int32_t rinex_version;
int32_t rinexobs_rate_ms; int32_t rinexobs_rate_ms;

View File

@ -95,7 +95,11 @@ if((CMAKE_CXX_COMPILER_ID STREQUAL "GNU") AND NOT WIN32)
set(CMAKE_CXX_STANDARD 14) set(CMAKE_CXX_STANDARD 14)
else() else()
if(${FILESYSTEM_FOUND}) if(${FILESYSTEM_FOUND})
set(CMAKE_CXX_STANDARD 17) if(CMAKE_VERSION VERSION_LESS 3.12)
set(CMAKE_CXX_STANDARD 17)
else()
set(CMAKE_CXX_STANDARD 20)
endif()
set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_STANDARD_REQUIRED ON)
else() else()
set(CMAKE_CXX_STANDARD 14) set(CMAKE_CXX_STANDARD 14)
@ -134,7 +138,11 @@ if(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
set(CMAKE_CXX_STANDARD 14) set(CMAKE_CXX_STANDARD 14)
else() else()
if(${FILESYSTEM_FOUND}) if(${FILESYSTEM_FOUND})
set(CMAKE_CXX_STANDARD 17) if(CMAKE_VERSION VERSION_LESS 3.12)
set(CMAKE_CXX_STANDARD 17)
else()
set(CMAKE_CXX_STANDARD 20)
endif()
set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_STANDARD_REQUIRED ON)
else() else()
set(CMAKE_CXX_STANDARD 14) set(CMAKE_CXX_STANDARD 14)

View File

@ -33,7 +33,6 @@ set(TRACKING_LIB_SOURCES
cpu_multicorrelator.cc cpu_multicorrelator.cc
cpu_multicorrelator_real_codes.cc cpu_multicorrelator_real_codes.cc
cpu_multicorrelator_16sc.cc cpu_multicorrelator_16sc.cc
nonlinear_tracking.cc
lock_detectors.cc lock_detectors.cc
tcp_communication.cc tcp_communication.cc
tcp_packet_data.cc tcp_packet_data.cc
@ -51,7 +50,6 @@ set(TRACKING_LIB_HEADERS
cpu_multicorrelator.h cpu_multicorrelator.h
cpu_multicorrelator_real_codes.h cpu_multicorrelator_real_codes.h
cpu_multicorrelator_16sc.h cpu_multicorrelator_16sc.h
nonlinear_tracking.h
lock_detectors.h lock_detectors.h
tcp_communication.h tcp_communication.h
tcp_packet_data.h tcp_packet_data.h
@ -65,6 +63,12 @@ set(TRACKING_LIB_HEADERS
exponential_smoother.h exponential_smoother.h
) )
if(ARMADILLO_VERSION_STRING VERSION_GREATER 7.400)
# sqrtmat_sympd() requires 7.400
set(TRACKING_LIB_SOURCES ${TRACKING_LIB_SOURCES} nonlinear_tracking.cc)
set(TRACKING_LIB_HEADERS ${TRACKING_LIB_HEADERS} nonlinear_tracking.h)
endif()
if(ENABLE_FPGA) 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) set(TRACKING_LIB_HEADERS ${TRACKING_LIB_HEADERS} fpga_multicorrelator.h dll_pll_conf_fpga.h)

View File

@ -4,7 +4,7 @@
* *
* Cubature_Filter implements the functionality of the Cubature Kalman * Cubature_Filter implements the functionality of the Cubature Kalman
* Filter, which uses multidimensional cubature rules to estimate the * Filter, which uses multidimensional cubature rules to estimate the
* time evolution of a nonlinear system. Unscented_filter implements * time evolution of a nonlinear system. UnscentedFilter implements
* an Unscented Kalman Filter which uses Unscented Transform rules to * an Unscented Kalman Filter which uses Unscented Transform rules to
* perform a similar estimation. * perform a similar estimation.
* *
@ -44,7 +44,7 @@
/***************** CUBATURE KALMAN FILTER *****************/ /***************** CUBATURE KALMAN FILTER *****************/
Cubature_filter::Cubature_filter() CubatureFilter::CubatureFilter()
{ {
int nx = 1; int nx = 1;
x_pred_out = arma::zeros(nx, 1); x_pred_out = arma::zeros(nx, 1);
@ -55,7 +55,7 @@ Cubature_filter::Cubature_filter()
} }
Cubature_filter::Cubature_filter(int nx) CubatureFilter::CubatureFilter(int nx)
{ {
x_pred_out = arma::zeros(nx, 1); x_pred_out = arma::zeros(nx, 1);
P_x_pred_out = arma::eye(nx, nx) * (nx + 1); P_x_pred_out = arma::eye(nx, nx) * (nx + 1);
@ -65,7 +65,7 @@ Cubature_filter::Cubature_filter(int nx)
} }
Cubature_filter::Cubature_filter(const arma::vec& x_pred_0, const arma::mat& P_x_pred_0) CubatureFilter::CubatureFilter(const arma::vec& x_pred_0, const arma::mat& P_x_pred_0)
{ {
x_pred_out = x_pred_0; x_pred_out = x_pred_0;
P_x_pred_out = P_x_pred_0; P_x_pred_out = P_x_pred_0;
@ -75,10 +75,10 @@ Cubature_filter::Cubature_filter(const arma::vec& x_pred_0, const arma::mat& P_x
} }
Cubature_filter::~Cubature_filter() = default; CubatureFilter::~CubatureFilter() = default;
void Cubature_filter::initialize(const arma::mat& x_pred_0, const arma::mat& P_x_pred_0) void CubatureFilter::initialize(const arma::mat& x_pred_0, const arma::mat& P_x_pred_0)
{ {
x_pred_out = x_pred_0; x_pred_out = x_pred_0;
P_x_pred_out = P_x_pred_0; P_x_pred_out = P_x_pred_0;
@ -91,7 +91,7 @@ void Cubature_filter::initialize(const arma::mat& x_pred_0, const arma::mat& P_x
/* /*
* Perform the prediction step of the cubature Kalman filter * 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) void CubatureFilter::predict_sequential(const arma::vec& x_post, const arma::mat& P_x_post, ModelFunction* transition_fcn, const arma::mat& noise_covariance)
{ {
// Compute number of cubature points // Compute number of cubature points
int nx = x_post.n_elem; int nx = x_post.n_elem;
@ -133,7 +133,7 @@ void Cubature_filter::predict_sequential(const arma::vec& x_post, const arma::ma
/* /*
* Perform the update step of the cubature Kalman filter * 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) void CubatureFilter::update_sequential(const arma::vec& z_upd, const arma::vec& x_pred, const arma::mat& P_x_pred, ModelFunction* measurement_fcn, const arma::mat& noise_covariance)
{ {
// Compute number of cubature points // Compute number of cubature points
int nx = x_pred.n_elem; int nx = x_pred.n_elem;
@ -178,25 +178,25 @@ void Cubature_filter::update_sequential(const arma::vec& z_upd, const arma::vec&
} }
arma::mat Cubature_filter::get_x_pred() const arma::mat CubatureFilter::get_x_pred() const
{ {
return x_pred_out; return x_pred_out;
} }
arma::mat Cubature_filter::get_P_x_pred() const arma::mat CubatureFilter::get_P_x_pred() const
{ {
return P_x_pred_out; return P_x_pred_out;
} }
arma::mat Cubature_filter::get_x_est() const arma::mat CubatureFilter::get_x_est() const
{ {
return x_est; return x_est;
} }
arma::mat Cubature_filter::get_P_x_est() const arma::mat CubatureFilter::get_P_x_est() const
{ {
return P_x_est; return P_x_est;
} }
@ -205,7 +205,7 @@ arma::mat Cubature_filter::get_P_x_est() const
/***************** UNSCENTED KALMAN FILTER *****************/ /***************** UNSCENTED KALMAN FILTER *****************/
Unscented_filter::Unscented_filter() UnscentedFilter::UnscentedFilter()
{ {
int nx = 1; int nx = 1;
x_pred_out = arma::zeros(nx, 1); x_pred_out = arma::zeros(nx, 1);
@ -216,7 +216,7 @@ Unscented_filter::Unscented_filter()
} }
Unscented_filter::Unscented_filter(int nx) UnscentedFilter::UnscentedFilter(int nx)
{ {
x_pred_out = arma::zeros(nx, 1); x_pred_out = arma::zeros(nx, 1);
P_x_pred_out = arma::eye(nx, nx) * (nx + 1); P_x_pred_out = arma::eye(nx, nx) * (nx + 1);
@ -226,7 +226,7 @@ Unscented_filter::Unscented_filter(int nx)
} }
Unscented_filter::Unscented_filter(const arma::vec& x_pred_0, const arma::mat& P_x_pred_0) UnscentedFilter::UnscentedFilter(const arma::vec& x_pred_0, const arma::mat& P_x_pred_0)
{ {
x_pred_out = x_pred_0; x_pred_out = x_pred_0;
P_x_pred_out = P_x_pred_0; P_x_pred_out = P_x_pred_0;
@ -236,10 +236,10 @@ Unscented_filter::Unscented_filter(const arma::vec& x_pred_0, const arma::mat& P
} }
Unscented_filter::~Unscented_filter() = default; UnscentedFilter::~UnscentedFilter() = default;
void Unscented_filter::initialize(const arma::mat& x_pred_0, const arma::mat& P_x_pred_0) void UnscentedFilter::initialize(const arma::mat& x_pred_0, const arma::mat& P_x_pred_0)
{ {
x_pred_out = x_pred_0; x_pred_out = x_pred_0;
P_x_pred_out = P_x_pred_0; P_x_pred_out = P_x_pred_0;
@ -252,7 +252,7 @@ void Unscented_filter::initialize(const arma::mat& x_pred_0, const arma::mat& P_
/* /*
* Perform the prediction step of the Unscented Kalman filter * Perform the prediction step of the Unscented Kalman filter
*/ */
void Unscented_filter::predict_sequential(const arma::vec& x_post, const arma::mat& P_x_post, Model_Function* transition_fcn, const arma::mat& noise_covariance) void UnscentedFilter::predict_sequential(const arma::vec& x_post, const arma::mat& P_x_post, ModelFunction* transition_fcn, const arma::mat& noise_covariance)
{ {
// Compute number of sigma points // Compute number of sigma points
int nx = x_post.n_elem; int nx = x_post.n_elem;
@ -307,7 +307,7 @@ void Unscented_filter::predict_sequential(const arma::vec& x_post, const arma::m
/* /*
* Perform the update step of the Unscented Kalman filter * Perform the update step of the Unscented Kalman filter
*/ */
void Unscented_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) void UnscentedFilter::update_sequential(const arma::vec& z_upd, const arma::vec& x_pred, const arma::mat& P_x_pred, ModelFunction* measurement_fcn, const arma::mat& noise_covariance)
{ {
// Compute number of sigma points // Compute number of sigma points
int nx = x_pred.n_elem; int nx = x_pred.n_elem;
@ -364,25 +364,25 @@ void Unscented_filter::update_sequential(const arma::vec& z_upd, const arma::vec
} }
arma::mat Unscented_filter::get_x_pred() const arma::mat UnscentedFilter::get_x_pred() const
{ {
return x_pred_out; return x_pred_out;
} }
arma::mat Unscented_filter::get_P_x_pred() const arma::mat UnscentedFilter::get_P_x_pred() const
{ {
return P_x_pred_out; return P_x_pred_out;
} }
arma::mat Unscented_filter::get_x_est() const arma::mat UnscentedFilter::get_x_est() const
{ {
return x_est; return x_est;
} }
arma::mat Unscented_filter::get_P_x_est() const arma::mat UnscentedFilter::get_P_x_est() const
{ {
return P_x_est; return P_x_est;
} }

View File

@ -2,9 +2,9 @@
* \file nonlinear_tracking.h * \file nonlinear_tracking.h
* \brief Interface of a library for nonlinear tracking algorithms * \brief Interface of a library for nonlinear tracking algorithms
* *
* Cubature_Filter implements the functionality of the Cubature Kalman * CubatureFilter implements the functionality of the Cubature Kalman
* Filter, which uses multidimensional cubature rules to estimate the * Filter, which uses multidimensional cubature rules to estimate the
* time evolution of a nonlinear system. Unscented_filter implements * time evolution of a nonlinear system. UnscentedFilter implements
* an Unscented Kalman Filter which uses Unscented Transform rules to * an Unscented Kalman Filter which uses Unscented Transform rules to
* perform a similar estimation. * perform a similar estimation.
* *
@ -47,29 +47,29 @@
#include <gnuradio/gr_complex.h> #include <gnuradio/gr_complex.h>
// Abstract model function // Abstract model function
class Model_Function class ModelFunction
{ {
public: public:
Model_Function(){}; ModelFunction(){};
virtual arma::vec operator()(arma::vec input) = 0; virtual arma::vec operator()(const arma::vec& input) = 0;
virtual ~Model_Function() = default; virtual ~ModelFunction() = default;
}; };
class Cubature_filter class CubatureFilter
{ {
public: public:
// Constructors and destructors // Constructors and destructors
Cubature_filter(); CubatureFilter();
Cubature_filter(int nx); CubatureFilter(int nx);
Cubature_filter(const arma::vec& x_pred_0, const arma::mat& P_x_pred_0); CubatureFilter(const arma::vec& x_pred_0, const arma::mat& P_x_pred_0);
~Cubature_filter(); ~CubatureFilter();
// Reinitialization function // Reinitialization function
void initialize(const arma::mat& x_pred_0, const arma::mat& P_x_pred_0); void initialize(const arma::mat& x_pred_0, const arma::mat& P_x_pred_0);
// Prediction and estimation // 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 predict_sequential(const arma::vec& x_post, const arma::mat& P_x_post, ModelFunction* 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); void update_sequential(const arma::vec& z_upd, const arma::vec& x_pred, const arma::mat& P_x_pred, ModelFunction* measurement_fcn, const arma::mat& noise_covariance);
// Getters // Getters
arma::mat get_x_pred() const; arma::mat get_x_pred() const;
@ -84,21 +84,21 @@ private:
arma::mat P_x_est; arma::mat P_x_est;
}; };
class Unscented_filter class UnscentedFilter
{ {
public: public:
// Constructors and destructors // Constructors and destructors
Unscented_filter(); UnscentedFilter();
Unscented_filter(int nx); UnscentedFilter(int nx);
Unscented_filter(const arma::vec& x_pred_0, const arma::mat& P_x_pred_0); UnscentedFilter(const arma::vec& x_pred_0, const arma::mat& P_x_pred_0);
~Unscented_filter(); ~UnscentedFilter();
// Reinitialization function // Reinitialization function
void initialize(const arma::mat& x_pred_0, const arma::mat& P_x_pred_0); void initialize(const arma::mat& x_pred_0, const arma::mat& P_x_pred_0);
// Prediction and estimation // 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 predict_sequential(const arma::vec& x_post, const arma::mat& P_x_post, ModelFunction* 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); void update_sequential(const arma::vec& z_upd, const arma::vec& x_pred, const arma::mat& P_x_pred, ModelFunction* measurement_fcn, const arma::mat& noise_covariance);
// Getters // Getters
arma::mat get_x_pred() const; arma::mat get_x_pred() const;

View File

@ -161,6 +161,11 @@ if(ENABLE_FPGA)
add_definitions(-DFPGA_BLOCKS_TEST=1) add_definitions(-DFPGA_BLOCKS_TEST=1)
endif() endif()
if(ARMADILLO_VERSION_STRING VERSION_GREATER 8.400)
# mvnrnd() requires 8.400
add_definitions(-DARMADILLO_HAVE_MVNRND=1)
endif()
find_package(Gnuplot) find_package(Gnuplot)
if(GNUPLOT_FOUND) if(GNUPLOT_FOUND)
add_definitions(-DGNUPLOT_EXECUTABLE="${GNUPLOT_EXECUTABLE}") add_definitions(-DGNUPLOT_EXECUTABLE="${GNUPLOT_EXECUTABLE}")
@ -793,14 +798,20 @@ endif()
######################################################### #########################################################
if(NOT ENABLE_PACKAGING AND NOT ENABLE_FPGA) if(NOT ENABLE_PACKAGING AND NOT ENABLE_FPGA)
set(NONLINEAR_SOURCES "")
if(ARMADILLO_VERSION_STRING VERSION_GREATER 8.400)
set(NONLINEAR_SOURCES
${CMAKE_CURRENT_SOURCE_DIR}/unit-tests/signal-processing-blocks/tracking/cubature_filter_test.cc
${CMAKE_CURRENT_SOURCE_DIR}/unit-tests/signal-processing-blocks/tracking/unscented_filter_test.cc
)
endif()
add_executable(trk_test add_executable(trk_test
${CMAKE_CURRENT_SOURCE_DIR}/single_test_main.cc ${CMAKE_CURRENT_SOURCE_DIR}/single_test_main.cc
${CMAKE_CURRENT_SOURCE_DIR}/unit-tests/signal-processing-blocks/tracking/galileo_e1_dll_pll_veml_tracking_test.cc ${CMAKE_CURRENT_SOURCE_DIR}/unit-tests/signal-processing-blocks/tracking/galileo_e1_dll_pll_veml_tracking_test.cc
${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/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/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/bayesian_estimation_test.cc
${CMAKE_CURRENT_SOURCE_DIR}/unit-tests/signal-processing-blocks/tracking/cubature_filter_test.cc ${NONLINEAR_SOURCES}
${CMAKE_CURRENT_SOURCE_DIR}/unit-tests/signal-processing-blocks/tracking/unscented_filter_test.cc
) )
if(${FILESYSTEM_FOUND}) if(${FILESYSTEM_FOUND})
target_compile_definitions(trk_test PRIVATE -DHAS_STD_FILESYSTEM=1) target_compile_definitions(trk_test PRIVATE -DHAS_STD_FILESYSTEM=1)

View File

@ -99,8 +99,10 @@ DECLARE_string(log_dir);
#endif #endif
#include "unit-tests/signal-processing-blocks/tracking/bayesian_estimation_test.cc" #include "unit-tests/signal-processing-blocks/tracking/bayesian_estimation_test.cc"
#if ARMADILLO_HAVE_MVNRND
#include "unit-tests/signal-processing-blocks/tracking/cubature_filter_test.cc" #include "unit-tests/signal-processing-blocks/tracking/cubature_filter_test.cc"
#include "unit-tests/signal-processing-blocks/tracking/unscented_filter_test.cc" #include "unit-tests/signal-processing-blocks/tracking/unscented_filter_test.cc"
#endif
#include "unit-tests/signal-processing-blocks/tracking/cpu_multicorrelator_real_codes_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/cpu_multicorrelator_test.cc"
#include "unit-tests/signal-processing-blocks/tracking/galileo_e1_dll_pll_veml_tracking_test.cc" #include "unit-tests/signal-processing-blocks/tracking/galileo_e1_dll_pll_veml_tracking_test.cc"

View File

@ -36,21 +36,21 @@
#define CUBATURE_TEST_N_TRIALS 1000 #define CUBATURE_TEST_N_TRIALS 1000
#define CUBATURE_TEST_TOLERANCE 0.01 #define CUBATURE_TEST_TOLERANCE 0.01
class Transition_Model : public Model_Function class TransitionModel : public ModelFunction
{ {
public: public:
Transition_Model(arma::mat kf_F) { coeff_mat = kf_F; }; TransitionModel(const arma::mat& kf_F) { coeff_mat = kf_F; };
virtual arma::vec operator()(arma::vec input) { return coeff_mat * input; }; virtual arma::vec operator()(const arma::vec& input) { return coeff_mat * input; };
private: private:
arma::mat coeff_mat; arma::mat coeff_mat;
}; };
class Measurement_Model : public Model_Function class MeasurementModel : public ModelFunction
{ {
public: public:
Measurement_Model(arma::mat kf_H) { coeff_mat = kf_H; }; MeasurementModel(const arma::mat& kf_H) { coeff_mat = kf_H; };
virtual arma::vec operator()(arma::vec input) { return coeff_mat * input; }; virtual arma::vec operator()(const arma::vec& input) { return coeff_mat * input; };
private: private:
arma::mat coeff_mat; arma::mat coeff_mat;
@ -58,7 +58,7 @@ private:
TEST(CubatureFilterComputationTest, CubatureFilterTest) TEST(CubatureFilterComputationTest, CubatureFilterTest)
{ {
Cubature_filter kf_cubature; CubatureFilter kf_cubature;
arma::vec kf_x; arma::vec kf_x;
arma::mat kf_P_x; arma::mat kf_P_x;
@ -88,8 +88,8 @@ TEST(CubatureFilterComputationTest, CubatureFilterTest)
arma::mat kf_P_y; arma::mat kf_P_y;
arma::mat kf_K; arma::mat kf_K;
Model_Function* transition_function; ModelFunction* transition_function;
Model_Function* measurement_function; ModelFunction* measurement_function;
//--- Perform initializations ------------------------------ //--- Perform initializations ------------------------------
@ -97,14 +97,15 @@ TEST(CubatureFilterComputationTest, CubatureFilterTest)
std::default_random_engine e1(r()); std::default_random_engine e1(r());
std::normal_distribution<float> normal_dist(0, 5); std::normal_distribution<float> normal_dist(0, 5);
std::uniform_real_distribution<float> uniform_dist(0.1, 5.0); std::uniform_real_distribution<float> uniform_dist(0.1, 5.0);
std::uniform_int_distribution<> uniform_dist_int(1, 5);
uint8_t nx = 0; uint8_t nx = 0;
uint8_t ny = 0; uint8_t ny = 0;
for (uint16_t k = 0; k < CUBATURE_TEST_N_TRIALS; k++) for (uint16_t k = 0; k < CUBATURE_TEST_N_TRIALS; k++)
{ {
nx = std::rand() % 5 + 1; nx = static_cast<uint8_t>(uniform_dist_int(e1));
ny = std::rand() % 5 + 1; ny = static_cast<uint8_t>(uniform_dist_int(e1));
kf_x = arma::randn<arma::vec>(nx, 1); kf_x = arma::randn<arma::vec>(nx, 1);
@ -117,7 +118,7 @@ TEST(CubatureFilterComputationTest, CubatureFilterTest)
kf_F = arma::randu<arma::mat>(nx, nx); kf_F = arma::randu<arma::mat>(nx, nx);
kf_Q = arma::diagmat(arma::randu<arma::vec>(nx, 1)); kf_Q = arma::diagmat(arma::randu<arma::vec>(nx, 1));
transition_function = new Transition_Model(kf_F); transition_function = new TransitionModel(kf_F);
arma::mat ttx = (*transition_function)(kf_x_post); arma::mat ttx = (*transition_function)(kf_x_post);
kf_cubature.predict_sequential(kf_x_post, kf_P_x_post, transition_function, kf_Q); kf_cubature.predict_sequential(kf_x_post, kf_P_x_post, transition_function, kf_Q);
@ -140,7 +141,7 @@ TEST(CubatureFilterComputationTest, CubatureFilterTest)
kf_y = kf_H * (kf_F * kf_x + eta) + nu; kf_y = kf_H * (kf_F * kf_x + eta) + nu;
measurement_function = new Measurement_Model(kf_H); measurement_function = new MeasurementModel(kf_H);
kf_cubature.update_sequential(kf_y, kf_x_pre, kf_P_x_pre, measurement_function, kf_R); 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_x_post = kf_cubature.get_x_est();

View File

@ -36,21 +36,21 @@
#define UNSCENTED_TEST_N_TRIALS 10 #define UNSCENTED_TEST_N_TRIALS 10
#define UNSCENTED_TEST_TOLERANCE 10 #define UNSCENTED_TEST_TOLERANCE 10
class Transition_Model_UKF : public Model_Function class TransitionModelUKF : public ModelFunction
{ {
public: public:
Transition_Model_UKF(arma::mat kf_F) { coeff_mat = kf_F; }; TransitionModelUKF(const arma::mat& kf_F) { coeff_mat = kf_F; };
virtual arma::vec operator()(arma::vec input) { return coeff_mat * input; }; virtual arma::vec operator()(const arma::vec& input) { return coeff_mat * input; };
private: private:
arma::mat coeff_mat; arma::mat coeff_mat;
}; };
class Measurement_Model_UKF : public Model_Function class MeasurementModelUKF : public ModelFunction
{ {
public: public:
Measurement_Model_UKF(arma::mat kf_H) { coeff_mat = kf_H; }; MeasurementModelUKF(const arma::mat& kf_H) { coeff_mat = kf_H; };
virtual arma::vec operator()(arma::vec input) { return coeff_mat * input; }; virtual arma::vec operator()(const arma::vec& input) { return coeff_mat * input; };
private: private:
arma::mat coeff_mat; arma::mat coeff_mat;
@ -58,7 +58,7 @@ private:
TEST(UnscentedFilterComputationTest, UnscentedFilterTest) TEST(UnscentedFilterComputationTest, UnscentedFilterTest)
{ {
Unscented_filter kf_unscented; UnscentedFilter kf_unscented;
arma::vec kf_x; arma::vec kf_x;
arma::mat kf_P_x; arma::mat kf_P_x;
@ -88,8 +88,8 @@ TEST(UnscentedFilterComputationTest, UnscentedFilterTest)
arma::mat kf_P_y; arma::mat kf_P_y;
arma::mat kf_K; arma::mat kf_K;
Model_Function* transition_function; ModelFunction* transition_function;
Model_Function* measurement_function; ModelFunction* measurement_function;
//--- Perform initializations ------------------------------ //--- Perform initializations ------------------------------
@ -97,14 +97,15 @@ TEST(UnscentedFilterComputationTest, UnscentedFilterTest)
std::default_random_engine e1(r()); std::default_random_engine e1(r());
std::normal_distribution<float> normal_dist(0, 5); std::normal_distribution<float> normal_dist(0, 5);
std::uniform_real_distribution<float> uniform_dist(0.1, 5.0); std::uniform_real_distribution<float> uniform_dist(0.1, 5.0);
std::uniform_int_distribution<> uniform_dist_int(1, 5);
uint8_t nx = 0; uint8_t nx = 0;
uint8_t ny = 0; uint8_t ny = 0;
for (uint16_t k = 0; k < UNSCENTED_TEST_N_TRIALS; k++) for (uint16_t k = 0; k < UNSCENTED_TEST_N_TRIALS; k++)
{ {
nx = std::rand() % 5 + 1; nx = static_cast<uint8_t>(uniform_dist_int(e1));
ny = std::rand() % 5 + 1; ny = static_cast<uint8_t>(uniform_dist_int(e1));
kf_x = arma::randn<arma::vec>(nx, 1); kf_x = arma::randn<arma::vec>(nx, 1);
@ -117,7 +118,7 @@ TEST(UnscentedFilterComputationTest, UnscentedFilterTest)
kf_F = arma::randu<arma::mat>(nx, nx); kf_F = arma::randu<arma::mat>(nx, nx);
kf_Q = arma::diagmat(arma::randu<arma::vec>(nx, 1)); kf_Q = arma::diagmat(arma::randu<arma::vec>(nx, 1));
transition_function = new Transition_Model_UKF(kf_F); transition_function = new TransitionModelUKF(kf_F);
arma::mat ttx = (*transition_function)(kf_x_post); arma::mat ttx = (*transition_function)(kf_x_post);
kf_unscented.predict_sequential(kf_x_post, kf_P_x_post, transition_function, kf_Q); kf_unscented.predict_sequential(kf_x_post, kf_P_x_post, transition_function, kf_Q);
@ -140,7 +141,7 @@ TEST(UnscentedFilterComputationTest, UnscentedFilterTest)
kf_y = kf_H * (kf_F * kf_x + eta) + nu; kf_y = kf_H * (kf_F * kf_x + eta) + nu;
measurement_function = new Measurement_Model_UKF(kf_H); measurement_function = new MeasurementModelUKF(kf_H);
kf_unscented.update_sequential(kf_y, kf_x_pre, kf_P_x_pre, measurement_function, kf_R); kf_unscented.update_sequential(kf_y, kf_x_pre, kf_P_x_pre, measurement_function, kf_R);
ukf_x_post = kf_unscented.get_x_est(); ukf_x_post = kf_unscented.get_x_est();

View File

@ -99,3 +99,5 @@ else()
message(STATUS "Boost Iostreams library not found.") message(STATUS "Boost Iostreams library not found.")
message(STATUS " rinex2assist will not be built.") message(STATUS " rinex2assist will not be built.")
endif() endif()
set(Boost_FOUND TRUE) # trick for summary report