first commit

This commit is contained in:
2026-09-02 15:13:13 +08:00
commit cb00322a50
107 changed files with 10918 additions and 0 deletions
@@ -0,0 +1,122 @@
cmake_minimum_required(VERSION 3.16)
# =============================================================================
# visual_track_control —— 视觉跟踪控制律静态库(独立子工程)
#
# 实现 docs/物理追踪思路.md 的水平航向控制(§4)、垂直/高度双支路控制(§5)、
# 距离 PID(§6)、全量限幅(§8)、Coast 清积分与判丢刹车(§6.4)、
# 超龄降级(§7.1、§9.2)。
#
# 构建约束:
# - 与主工程完全解耦:根 CMakeLists.txt 零改动,可独立构建;
# - 仅依赖 third_party:nlohmann(单头文件)、spdlog(源码)、
# c_library_v2-master(MAVLink 纯头文件);
# - target_tracker 为 SHARED 库且零源码修改,原样 add_subdirectory 复用,
# TrackResult 出现在本库公共头(vtc_types.h),故以 PUBLIC 链接;
# - MAVLink include 目录设为 SYSTEM PRIVATE:压告警噪音且不泄漏给下游,
# 全工程仅 src/mavlink_command_gateway.cpp 一个 TU 包含 mavlink.h
# (MAVLINK_HELPER 默认空宏,多 TU 包含会多重定义)。
# =============================================================================
project(visual_track_control LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
# target_tracker 是 SHARED 库:BUILD_RPATH 指向构建目录,示例无需
# LD_LIBRARY_PATH 即可直接运行(部署时需随带 libtarget_tracker.so.1)。
set(CMAKE_BUILD_RPATH "${CMAKE_BINARY_DIR};${CMAKE_BINARY_DIR}/target_tracker;$ORIGIN")
# ---- 依赖:target_tracker(零改动复用;其测试块由 -DBUILD_TESTING=OFF 压制) ----
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/../target_tracker
${CMAKE_BINARY_DIR}/target_tracker)
# ---- 依赖:spdlog(守卫引入,避免挂载进根构建时重复定义;关闭示例/测试/动态库/安装) ----
if(NOT TARGET spdlog::spdlog)
set(SPDLOG_BUILD_EXAMPLE OFF CACHE BOOL "" FORCE)
set(SPDLOG_BUILD_EXAMPLE_HO OFF CACHE BOOL "" FORCE)
set(SPDLOG_BUILD_TESTS OFF CACHE BOOL "" FORCE)
set(SPDLOG_BUILD_TESTS_HO OFF CACHE BOOL "" FORCE)
set(SPDLOG_BUILD_SHARED OFF CACHE BOOL "" FORCE)
set(SPDLOG_INSTALL OFF CACHE BOOL "" FORCE)
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/../third_party/spdlog
${CMAKE_BINARY_DIR}/spdlog)
endif()
# ---- 静态库本体 ----
add_library(visual_track_control STATIC
src/vtc_config.cpp
src/pid_controller.cpp
src/line_of_sight.cpp
src/tracking_control_law.cpp
src/mavlink_command_gateway.cpp)
target_include_directories(visual_track_control PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>)
# nlohmann JSON:单头文件,仅配置加载器(启动期)使用,不进入热路径
target_include_directories(visual_track_control PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}/../third_party/nlohmann)
# MAVLink 纯头文件库:SYSTEM 压告警、PRIVATE 不泄漏(公共头无任何 mavlink_* 类型)
target_include_directories(visual_track_control SYSTEM PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}/../third_party/c_library_v2-master)
target_link_libraries(visual_track_control
PUBLIC target_tracker
PRIVATE spdlog::spdlog)
target_compile_features(visual_track_control PUBLIC cxx_std_17)
# 编译告警:与主工程一致
if(MSVC)
target_compile_options(visual_track_control PRIVATE /W4 /permissive-)
else()
target_compile_options(visual_track_control PRIVATE -Wall -Wextra -Wpedantic)
endif()
# ---- 示例可执行文件(合成检测 → 追踪 → 控制律 → MAVLink 字节流打印) ----
add_executable(track_control_demo examples/track_control_demo.cpp)
target_link_libraries(track_control_demo PRIVATE visual_track_control spdlog::spdlog)
target_compile_definitions(track_control_demo PRIVATE
VTC_DEMO_DEFAULT_CONFIG="${CMAKE_CURRENT_SOURCE_DIR}/config/track_control.json")
if(MSVC)
target_compile_options(track_control_demo PRIVATE /W4 /permissive-)
else()
target_compile_options(track_control_demo PRIVATE -Wall -Wextra -Wpedantic)
endif()
# ---- 单元测试(Google Test) ----
# 独立选项:构建本子工程时需 -DBUILD_TESTING=OFF 压制 target_tracker 的测试,
# 故本库测试开关不复用 BUILD_TESTING,二者互不干扰。
# 开发机未安装 GTest 时自动跳过(不影响库与示例构建)。
option(VTC_BUILD_TESTS "构建 visual_track_control 单元测试" ON)
if(VTC_BUILD_TESTS)
find_package(GTest QUIET)
if(GTest_FOUND)
enable_testing()
include(GoogleTest)
add_executable(vtc_unit_tests
tests/rate_limiter_test.cpp
tests/staleness_checker_test.cpp
tests/frame_transform_test.cpp
tests/line_of_sight_test.cpp
tests/pid_controller_test.cpp
tests/tracking_control_law_test.cpp
tests/vtc_config_test.cpp
tests/mavlink_command_gateway_test.cpp)
target_link_libraries(vtc_unit_tests PRIVATE
visual_track_control GTest::gtest GTest::gtest_main)
target_compile_definitions(vtc_unit_tests PRIVATE
VTC_TEST_CONFIG="${CMAKE_CURRENT_SOURCE_DIR}/config/track_control.json"
VTC_TEST_TMP_DIR="${CMAKE_CURRENT_BINARY_DIR}")
if(MSVC)
target_compile_options(vtc_unit_tests PRIVATE /W4 /permissive-)
else()
target_compile_options(vtc_unit_tests PRIVATE -Wall -Wextra -Wpedantic)
endif()
gtest_discover_tests(vtc_unit_tests)
else()
message(STATUS "未找到 GTest:跳过 vtc_unit_tests 单元测试")
endif()
endif()