Brings the C++ library in line with the Rust wrmath crate in astro-rs, which extends this library with additional geometry and estimation primitives. All changes generated with AI assistance (Claude Fable 5). New headers: - wrmath/geom/matrix.h: Matrix<T,M,N> with rank, det, inv, transpose, and matrix-vector/matrix-matrix multiplication - wrmath/geom/coord2d.h: Polar<T> 2D polar coordinates with navigation convention (clockwise-positive heading) - wrmath/geom/coord3d.h: Spherical<T> 3D spherical coordinates with yaw/pitch, slerp, great-circle path interpolation, and quaternion direction - wrmath/estim/imu.h: IMU<T> for 6-DoF and 9-DoF (MARG) sensor fusion Extensions to existing headers: - math.h: Epsilon3/6/Max constants; AbsTolerance (NaN/inf-safe), AbsError, RotateRadians, Circumference - vector.h: zero(), withEpsilon(), asArray(), fromArray/Eps(), map(), isNaN(), angle2() (signed), euclidist(), projectLower/Tail<M>(), x()/y()/z() accessors; fixed isParallel() to use unit-vector equality (matches Rust fix for macOS/arm64 acos domain issue) - quaternion.h: lerp(), slerp() methods; jacobian() returning Matrix<T,3,4>; direction() - filter/madgwick.h: beta gain field, setDeltaT(), setGain(), direction(), updateFrame2(), updateAngularOrientation2() - orientation.h/.cc: RBearing3d/f, ABearing3d/f, CompassHeading3d/f Infrastructure: - C++ standard bumped to C++17 (required for std::optional) - CMake include path fixed so source-relative includes work - Umbrella headers (geom.h, filter.h) updated Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
113 lines
3.4 KiB
CMake
113 lines
3.4 KiB
CMake
if (DEFINED ENV{CMAKE_GCOV})
|
|
cmake_minimum_required(VERSION 3.15)
|
|
else()
|
|
cmake_minimum_required(VERSION 3.10)
|
|
endif()
|
|
cmake_policy(SET CMP0048 NEW)
|
|
|
|
|
|
## CONFIG
|
|
|
|
project(wrmath VERSION 0.0.1 LANGUAGES CXX)
|
|
set(CMAKE_CXX_STANDARD 17)
|
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
|
set(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake" ${CMAKE_MODULE_PATH})
|
|
|
|
# Don't warn on unused functions, because this is a library and not all
|
|
# functions might be used.
|
|
# add_compile_options(-Werror -Wno-unused-function -Wall -g -O0)
|
|
|
|
if (DEFINED ENV{CMAKE_GCOV})
|
|
add_compile_options(-fprofile-arcs -ftest-coverage)
|
|
# Need CMake 3.15+.
|
|
add_link_options(-fprofile-arcs -ftest-coverage)
|
|
add_custom_target(coverage COMMAND lcov -d . -t wrmath -o wrmath.info -c -i
|
|
COMMAND lcov -d . -t wrmath -o wrmath.info -c
|
|
COMMAND lcov -d . -t wrmath -o wrmath.info -r wrmath.info *gtest*
|
|
COMMAND genhtml -o coverage-report wrmath.info)
|
|
message(STATUS, "Code coverage enabled.")
|
|
endif()
|
|
|
|
|
|
include_directories(${PROJECT_SOURCE_DIR})
|
|
|
|
file(GLOB_RECURSE ${PROJECT_NAME}_HEADERS wrmath/**.h)
|
|
file(GLOB_RECURSE ${PROJECT_NAME}_SOURCES wrmath/*.cc)
|
|
|
|
|
|
## BUILD
|
|
|
|
add_library(${PROJECT_NAME} ${${PROJECT_NAME}_SOURCES})
|
|
|
|
add_executable(euler2quat tools/euler2quat.cc)
|
|
target_link_libraries(euler2quat ${PROJECT_NAME})
|
|
set_target_properties(euler2quat PROPERTIES
|
|
FOLDER bin
|
|
RUNTIME_OUTPUT_DIRECTORY bin)
|
|
|
|
add_executable(quaternion tools/quaternion.cc)
|
|
target_link_libraries(quaternion ${PROJECT_NAME})
|
|
set_target_properties(quaternion PROPERTIES
|
|
FOLDER bin
|
|
RUNTIME_OUTPUT_DIRECTORY bin)
|
|
|
|
## INSTALL
|
|
|
|
install(TARGETS ${PROJECT_NAME} DESTINATION lib)
|
|
install(TARGETS euler2quat DESTINATION bin)
|
|
install(TARGETS quaternion DESTINATION bin)
|
|
install(DIRECTORY include/${PROJECT_NAME}
|
|
DESTINATION include/
|
|
FILES_MATCHING PATTERN "*.h")
|
|
install(DIRECTORY docs/sphinx/_build/html/
|
|
DESTINATION share/doc/${PROJECT_NAME}
|
|
FILES_MATCHING PATTERN "*.html")
|
|
|
|
|
|
|
|
## TEST
|
|
|
|
# From Modern CMake:
|
|
# https://cliutils.gitlab.io/modern-cmake/chapters/testing/googletest.html
|
|
add_subdirectory("${PROJECT_SOURCE_DIR}/extern/googletest" "extern/googletest" EXCLUDE_FROM_ALL)
|
|
include_directories("${gtest_SOURCE_DIR}/include")
|
|
mark_as_advanced(
|
|
BUILD_GMOCK BUILD_GTEST BUILD_SHARED_LIBS
|
|
gmock_build_tests gtest_build_samples gtest_build_tests
|
|
gtest_disable_pthreads gtest_force_shared_crt gtest_hide_internal_symbols
|
|
)
|
|
set_target_properties(gtest PROPERTIES FOLDER extern)
|
|
set_target_properties(gtest_main PROPERTIES FOLDER extern)
|
|
set_target_properties(gmock PROPERTIES FOLDER extern)
|
|
set_target_properties(gmock_main PROPERTIES FOLDER extern)
|
|
|
|
include(CTest)
|
|
set(TEST_EXECS)
|
|
macro(package_add_gtest TESTNAME)
|
|
add_executable(${TESTNAME} ${ARGN})
|
|
target_link_libraries(${TESTNAME} gtest_main ${PROJECT_NAME})
|
|
target_compile_options(${TESTNAME} PUBLIC ${GTEST_CFLAGS})
|
|
add_test(NAME ${TESTNAME} COMMAND ${TESTNAME})
|
|
set_target_properties(${TESTNAME} PROPERTIES
|
|
FOLDER tests
|
|
RUNTIME_OUTPUT_DIRECTORY tests)
|
|
list(APPEND TEST_EXECS ${TESTNAME})
|
|
endmacro()
|
|
|
|
# define the tests
|
|
package_add_gtest(vector_test test/vector_test.cc)
|
|
package_add_gtest(orientation_test test/orientation_test.cc)
|
|
package_add_gtest(quaternion_test test/quaternion_test.cc)
|
|
package_add_gtest(madgwick_test test/madgwick_test.cc)
|
|
|
|
add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND} --verbose DEPENDS ${TEST_EXECS})
|
|
|
|
|
|
## DEPLOY
|
|
|
|
include(CMakePack.txt)
|
|
|
|
|
|
## DOCUMENTATE
|
|
## add_subdirectory ("docs")
|