130 lines
5.7 KiB
CMake
130 lines
5.7 KiB
CMake
cmake_minimum_required(VERSION 3.16)
|
|
project(unitree_legged_sdk VERSION 3.8.6 LANGUAGES CXX)
|
|
|
|
if(POLICY CMP0167)
|
|
cmake_policy(SET CMP0167 NEW)
|
|
endif()
|
|
|
|
include(GNUInstallDirs)
|
|
include(CMakePackageConfigHelpers)
|
|
find_package(Threads REQUIRED)
|
|
find_package(Boost REQUIRED)
|
|
|
|
option(GO1_PRO_BUILD_EXAMPLES "Build portable official-API C++ examples" ON)
|
|
option(GO1_PRO_BUILD_TESTS "Build C++ compatibility tests" ON)
|
|
option(GO1_PRO_BUILD_BENCHMARKS "Build C++ codec benchmarks" OFF)
|
|
|
|
add_library(unitree_legged_sdk
|
|
src/loop.cpp
|
|
src/pro_codec.cpp
|
|
src/quadruped.cpp
|
|
src/safety.cpp
|
|
src/udp.cpp
|
|
)
|
|
add_library(unitree_legged_sdk::unitree_legged_sdk ALIAS unitree_legged_sdk)
|
|
target_compile_features(unitree_legged_sdk PUBLIC cxx_std_14)
|
|
target_include_directories(unitree_legged_sdk
|
|
PUBLIC
|
|
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
|
|
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
|
|
PRIVATE
|
|
${CMAKE_CURRENT_SOURCE_DIR}/src
|
|
)
|
|
target_compile_definitions(unitree_legged_sdk PRIVATE
|
|
GO1_PRO_SOURCE_STATE_FILE="${CMAKE_CURRENT_SOURCE_DIR}/go1_pro_sdk/_data/blowfish_state.bin"
|
|
GO1_PRO_INSTALL_STATE_FILE="${CMAKE_INSTALL_FULL_DATADIR}/go1_pro_sdk/blowfish_state.bin"
|
|
)
|
|
if(TARGET Boost::headers)
|
|
set(GO1_PRO_BOOST_TARGET Boost::headers)
|
|
else()
|
|
set(GO1_PRO_BOOST_TARGET Boost::boost)
|
|
endif()
|
|
target_link_libraries(unitree_legged_sdk PUBLIC Threads::Threads ${GO1_PRO_BOOST_TARGET})
|
|
|
|
if(GO1_PRO_BUILD_EXAMPLES)
|
|
add_executable(example_official_compatible_position
|
|
examples/cpp/example_official_compatible_position.cpp)
|
|
target_link_libraries(example_official_compatible_position PRIVATE unitree_legged_sdk)
|
|
endif()
|
|
|
|
if(GO1_PRO_BUILD_TESTS)
|
|
enable_testing()
|
|
add_executable(test_cpp_compat tests/cpp/test_compat.cpp)
|
|
target_include_directories(test_cpp_compat PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src)
|
|
set(GO1_PRO_CAPTURE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/data/captures" CACHE PATH
|
|
"Optional private real-robot capture fixture directory")
|
|
if(EXISTS "${GO1_PRO_CAPTURE_DIR}/mcu_response_new.bin"
|
|
AND EXISTS "${GO1_PRO_CAPTURE_DIR}/mcu_response.bin"
|
|
AND EXISTS "${GO1_PRO_CAPTURE_DIR}/real_lowcmd.bin"
|
|
AND EXISTS "${GO1_PRO_CAPTURE_DIR}/real_lowcmd_decrypted.bin")
|
|
target_compile_definitions(test_cpp_compat PRIVATE
|
|
GO1_PRO_HAVE_CAPTURE_FIXTURES=1
|
|
GO1_PRO_TEST_CAPTURE="${GO1_PRO_CAPTURE_DIR}/mcu_response_new.bin"
|
|
GO1_PRO_TEST_CAPTURE_OLD="${GO1_PRO_CAPTURE_DIR}/mcu_response.bin"
|
|
GO1_PRO_TEST_LOWCMD="${GO1_PRO_CAPTURE_DIR}/real_lowcmd.bin"
|
|
GO1_PRO_TEST_LOWCMD_PLAIN="${GO1_PRO_CAPTURE_DIR}/real_lowcmd_decrypted.bin")
|
|
else()
|
|
message(STATUS "Private data/captures fixtures not found; C++ capture checks disabled")
|
|
endif()
|
|
target_link_libraries(test_cpp_compat PRIVATE unitree_legged_sdk)
|
|
add_test(NAME cpp_official_compat COMMAND test_cpp_compat)
|
|
|
|
set(GO1_PRO_TEST_INSTALL_DIR "${CMAKE_CURRENT_BINARY_DIR}/test-install")
|
|
set(GO1_PRO_TEST_CONSUMER_BUILD "${CMAKE_CURRENT_BINARY_DIR}/package-consumer")
|
|
add_test(NAME cpp_package_install
|
|
COMMAND ${CMAKE_COMMAND} --install ${CMAKE_CURRENT_BINARY_DIR}
|
|
--prefix ${GO1_PRO_TEST_INSTALL_DIR})
|
|
add_test(NAME cpp_package_configure
|
|
COMMAND ${CMAKE_COMMAND}
|
|
-S ${CMAKE_CURRENT_SOURCE_DIR}/tests/cpp/package_consumer
|
|
-B ${GO1_PRO_TEST_CONSUMER_BUILD}
|
|
-DCMAKE_PREFIX_PATH=${GO1_PRO_TEST_INSTALL_DIR}
|
|
"-DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS}"
|
|
"-DCMAKE_EXE_LINKER_FLAGS=${CMAKE_EXE_LINKER_FLAGS}")
|
|
set_tests_properties(cpp_package_configure PROPERTIES DEPENDS cpp_package_install)
|
|
add_test(NAME cpp_package_build
|
|
COMMAND ${CMAKE_COMMAND} --build ${GO1_PRO_TEST_CONSUMER_BUILD})
|
|
set_tests_properties(cpp_package_build PROPERTIES DEPENDS cpp_package_configure)
|
|
add_test(NAME cpp_package_run
|
|
COMMAND ${GO1_PRO_TEST_CONSUMER_BUILD}/package_consumer)
|
|
set_tests_properties(cpp_package_run PROPERTIES DEPENDS cpp_package_build)
|
|
endif()
|
|
|
|
if(GO1_PRO_BUILD_BENCHMARKS)
|
|
add_executable(benchmark_cpp_codec tests/cpp/benchmark_codec.cpp)
|
|
target_include_directories(benchmark_cpp_codec PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src)
|
|
set(GO1_PRO_BENCHMARK_CAPTURE
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/data/captures/mcu_response_new.bin" CACHE FILEPATH
|
|
"Optional real-robot LowState packet used by the C++ codec benchmark")
|
|
if(EXISTS "${GO1_PRO_BENCHMARK_CAPTURE}")
|
|
target_compile_definitions(benchmark_cpp_codec PRIVATE
|
|
GO1_PRO_BENCHMARK_CAPTURE="${GO1_PRO_BENCHMARK_CAPTURE}")
|
|
endif()
|
|
target_link_libraries(benchmark_cpp_codec PRIVATE unitree_legged_sdk)
|
|
endif()
|
|
|
|
install(TARGETS unitree_legged_sdk EXPORT unitree_legged_sdkTargets
|
|
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
|
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
|
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
|
|
INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
|
|
install(DIRECTORY include/unitree_legged_sdk DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
|
|
install(FILES go1_pro_sdk/_data/blowfish_state.bin DESTINATION ${CMAKE_INSTALL_DATADIR}/go1_pro_sdk)
|
|
install(EXPORT unitree_legged_sdkTargets
|
|
FILE unitree_legged_sdkTargets.cmake
|
|
NAMESPACE unitree_legged_sdk::
|
|
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/unitree_legged_sdk)
|
|
|
|
configure_package_config_file(
|
|
cmake/unitree_legged_sdkConfig.cmake.in
|
|
${CMAKE_CURRENT_BINARY_DIR}/unitree_legged_sdkConfig.cmake
|
|
INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/unitree_legged_sdk)
|
|
write_basic_package_version_file(
|
|
${CMAKE_CURRENT_BINARY_DIR}/unitree_legged_sdkConfigVersion.cmake
|
|
VERSION ${PROJECT_VERSION}
|
|
COMPATIBILITY SameMajorVersion)
|
|
install(FILES
|
|
${CMAKE_CURRENT_BINARY_DIR}/unitree_legged_sdkConfig.cmake
|
|
${CMAKE_CURRENT_BINARY_DIR}/unitree_legged_sdkConfigVersion.cmake
|
|
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/unitree_legged_sdk)
|