From 768573b2bbd7534e2f7ce08ee4632bbe62bab80a Mon Sep 17 00:00:00 2001 From: HiepLM Date: Wed, 7 Jan 2026 17:01:51 +0700 Subject: [PATCH] update for ROS --- .../Cores/score_algorithm/CMakeLists.txt | 224 +++++------ .../Libraries/angles/CMakeLists.txt | 135 +++++-- .../Libraries/kalman/CMakeLists.txt | 265 +++++++------ .../Libraries/mkt_algorithm/CMakeLists.txt | 277 +++++++------ .../Libraries/mkt_msgs/CMakeLists.txt | 177 +++++---- .../Libraries/mkt_plugins/CMakeLists.txt | 306 ++++++++------- .../Packages/global_planners/custom_planner | 2 +- .../Packages/global_planners/dock_planner | 2 +- .../two_points_planner/CMakeLists.txt | 243 ++++++------ .../two_points_planner/package.xml | 10 +- .../pnkx_local_planner/CMakeLists.txt | 323 +++++++-------- .../pnkx_local_planner/package.xml | 14 +- src/Libraries/common_msgs | 2 +- src/Libraries/costmap_2d | 2 +- src/Libraries/geometry2 | 2 +- src/Libraries/laser_geometry | 2 +- src/Libraries/robot_cpp/CMakeLists.txt | 263 +++++++------ .../include/robot/plugin_loader_helper.h | 15 +- .../robot_cpp/src/plugin_loader_helper.cpp | 124 +++++- .../robot_nav_2d_msgs/CMakeLists.txt | 179 +++++---- src/Libraries/robot_nav_2d_msgs/package.xml | 4 + .../robot_nav_2d_utils/CMakeLists.txt | 367 +++++++++--------- src/Libraries/robot_time | 2 +- src/Libraries/tf3/CMakeLists.txt | 243 ++++++++---- src/Libraries/tf3/package.xml | 4 +- src/Libraries/voxel_grid | 2 +- src/Libraries/xmlrpcpp | 2 +- .../Cores/move_base_core/CMakeLists.txt | 178 ++++++--- .../Cores/robot_nav_core/CMakeLists.txt | 180 +++++---- .../Cores/robot_nav_core2/CMakeLists.txt | 200 +++++----- .../Cores/robot_nav_core2/package.xml | 3 + .../robot_nav_core_adapter/CMakeLists.txt | 356 +++++++++-------- .../Libraries/nav_grid/CMakeLists.txt | 184 +++++---- .../Packages/move_base/CMakeLists.txt | 301 +++++++------- 34 files changed, 2630 insertions(+), 1963 deletions(-) diff --git a/src/Algorithms/Cores/score_algorithm/CMakeLists.txt b/src/Algorithms/Cores/score_algorithm/CMakeLists.txt index 2adf05e..7f0ca0e 100644 --- a/src/Algorithms/Cores/score_algorithm/CMakeLists.txt +++ b/src/Algorithms/Cores/score_algorithm/CMakeLists.txt @@ -1,30 +1,34 @@ -cmake_minimum_required(VERSION 3.10) -# Tên dự án +cmake_minimum_required(VERSION 3.0.2) project(score_algorithm VERSION 1.0.0 LANGUAGES CXX) -# Chuẩn C++ -set(CMAKE_CXX_STANDARD 17) -set(CMAKE_CXX_STANDARD_REQUIRED ON) - -if(NOT CMAKE_BUILD_TYPE) - set(CMAKE_BUILD_TYPE Release) -endif() - -# ======================================================== -# Find Packages -# ======================================================== - if(DEFINED CATKIN_DEVEL_PREFIX OR DEFINED CATKIN_TOPLEVEL) set(BUILDING_WITH_CATKIN TRUE) message(STATUS "Building score_algorithm with Catkin") + else() set(BUILDING_WITH_CATKIN FALSE) message(STATUS "Building score_algorithm with Standalone CMake") endif() -if(BUILDING_WITH_CATKIN) - ## Find catkin macros and libraries - find_package(catkin REQUIRED COMPONENTS +# C++ Standard - must be set before find_package +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_CXX_EXTENSIONS OFF) + +# Find dependencies +find_package(Boost REQUIRED COMPONENTS filesystem system) + +if (NOT BUILDING_WITH_CATKIN) + + # Enable Position Independent Code + set(CMAKE_POSITION_INDEPENDENT_CODE ON) + + # Cấu hình RPATH để tránh cycle trong runtime search path + set(CMAKE_BUILD_RPATH_USE_ORIGIN TRUE) + set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) + set(CMAKE_BUILD_RPATH "${CMAKE_BINARY_DIR}") + + set(PACKAGES_DIR robot_nav_2d_msgs robot_nav_2d_utils robot_nav_core2 @@ -33,124 +37,122 @@ if(BUILDING_WITH_CATKIN) mkt_msgs angles ) -endif() -## System dependencies -find_package(Boost REQUIRED COMPONENTS filesystem system) +else() # ======================================================== # Catkin specific configuration # ======================================================== + find_package(catkin REQUIRED COMPONENTS + robot_nav_2d_msgs + robot_nav_2d_utils + robot_nav_core2 + robot_nav_core + robot_cpp + mkt_msgs + angles + ) -if(BUILDING_WITH_CATKIN) - ## The catkin_package macro generates cmake config files for your package catkin_package( INCLUDE_DIRS include - LIBRARIES score_algorithm - CATKIN_DEPENDS robot_nav_2d_msgs robot_nav_2d_utils robot_nav_core robot_nav_core2 robot_cpp mkt_msgs + LIBRARIES ${PROJECT_NAME} + CATKIN_DEPENDS robot_nav_2d_msgs robot_nav_2d_utils robot_nav_core robot_nav_core2 robot_cpp mkt_msgs angles + DEPENDS Boost + ) + + include_directories( + include + ${catkin_INCLUDE_DIRS} + ${Boost_INCLUDE_DIRS} ) endif() -# Thư mục include -include_directories( - ${PROJECT_SOURCE_DIR}/include +# Libraries +add_library(${PROJECT_NAME} SHARED + src/score_algorithm.cpp ) if(BUILDING_WITH_CATKIN) - include_directories(${catkin_INCLUDE_DIRS}) -endif() -# ======================================================== -# Build -# ======================================================== + add_dependencies(${PROJECT_NAME} ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) -# Tạo thư viện shared (.so) -add_library(score_algorithm src/score_algorithm.cpp) - -# Link libraries -if(BUILDING_WITH_CATKIN) - target_link_libraries(score_algorithm + target_include_directories(${PROJECT_NAME} PUBLIC - ${catkin_LIBRARIES} - PRIVATE - Boost::filesystem - Boost::system + $ + $ ) + + target_link_libraries(${PROJECT_NAME} + PUBLIC ${catkin_LIBRARIES} + PRIVATE Boost::filesystem Boost::system + ) + else() - # Standalone mode: link dependencies directly - target_link_libraries(score_algorithm + + target_include_directories(${PROJECT_NAME} PUBLIC - robot_nav_2d_msgs - robot_nav_2d_utils - robot_nav_core2 - robot_nav_core2 - robot_cpp - mkt_msgs - angles - PRIVATE - Boost::filesystem - Boost::system + $ + $ ) + + target_link_libraries(${PROJECT_NAME} + PUBLIC + ${PACKAGES_DIR} + PRIVATE + Boost::filesystem Boost::system + ) + + set_target_properties(${PROJECT_NAME} PROPERTIES + LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR} + BUILD_RPATH "${CMAKE_BINARY_DIR}" + INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib" + ) + endif() -set_target_properties(score_algorithm PROPERTIES - LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR} -) - -## Add cmake target dependencies if(BUILDING_WITH_CATKIN) - add_dependencies(score_algorithm ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) -endif() + ## Mark libraries for installation + ## See http://docs.ros.org/melodic/api/catkin/html/howto/format1/building_libraries.html + install(TARGETS ${PROJECT_NAME} + ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} + LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} + RUNTIME DESTINATION ${CATKIN_GLOBAL_BIN_DESTINATION} + ) -target_include_directories(score_algorithm PUBLIC - $ - $) + ## Mark cpp header files for installation + install(DIRECTORY include/${PROJECT_NAME}/ + DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION} + FILES_MATCHING PATTERN "*.h" + PATTERN ".svn" EXCLUDE + ) -# ======================================================== -# Installation -# ======================================================== - -# Export target trong mọi trường hợp để các target khác có thể export và phụ thuộc vào nó -install(TARGETS score_algorithm - EXPORT score_algorithm-targets - LIBRARY DESTINATION lib - ARCHIVE DESTINATION lib - RUNTIME DESTINATION bin) - -if(NOT BUILDING_WITH_CATKIN) - # Cài đặt header files (chỉ cho standalone mode) - install(DIRECTORY include/score_algorithm - DESTINATION include - FILES_MATCHING PATTERN "*.h") - - # Export targets (chỉ cho standalone mode) - install(EXPORT score_algorithm-targets - FILE score_algorithm-targets.cmake - DESTINATION lib/cmake/score_algorithm) else() - # Khi build với Catkin, vẫn cần export để các target khác có thể export - install(EXPORT score_algorithm-targets - FILE score_algorithm-targets.cmake - DESTINATION lib/cmake/score_algorithm) + + install(TARGETS ${PROJECT_NAME} + EXPORT ${PROJECT_NAME}-targets + ARCHIVE DESTINATION lib + LIBRARY DESTINATION lib + RUNTIME DESTINATION bin + ) + + # Export targets + install(EXPORT ${PROJECT_NAME}-targets + FILE ${PROJECT_NAME}-targets.cmake + NAMESPACE ${PROJECT_NAME}:: + DESTINATION lib/cmake/${PROJECT_NAME} + ) + + ## Mark cpp header files for installation + install(DIRECTORY include/${PROJECT_NAME}/ + DESTINATION include + FILES_MATCHING PATTERN "*.h" + PATTERN ".svn" EXCLUDE + ) + + # Print configuration info + message(STATUS "=================================") + message(STATUS "Project: ${PROJECT_NAME}") + message(STATUS "Version: ${PROJECT_VERSION}") + message(STATUS "C++ Standard: ${CMAKE_CXX_STANDARD}") + message(STATUS "Dependencies: robot_nav_2d_msgs, robot_nav_2d_utils, robot_nav_core, robot_nav_core2, robot_cpp, mkt_msgs, angles, Boost") + message(STATUS "=================================") endif() - -# Tùy chọn build -option(BUILD_SHARED_LIBS "Build shared libraries" ON) -option(BUILD_TESTS "Build test programs" OFF) - -# Flags biên dịch -# Warning flags - disabled to suppress warnings during build -# set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Wpedantic") -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -w") # -w suppresses all warnings -set(CMAKE_CXX_FLAGS_DEBUG "-g -O0") -set(CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG") - -# In thông tin cấu hình -message(STATUS "=================================") -message(STATUS "Project: ${PROJECT_NAME}") -message(STATUS "Version: ${PROJECT_VERSION}") -message(STATUS "C++ Standard: ${CMAKE_CXX_STANDARD}") -message(STATUS "Headers found:") -foreach(hdr ${HEADERS}) - message(STATUS " - ${hdr}") -endforeach() -message(STATUS "=================================") \ No newline at end of file diff --git a/src/Algorithms/Libraries/angles/CMakeLists.txt b/src/Algorithms/Libraries/angles/CMakeLists.txt index db59f61..3eb856a 100644 --- a/src/Algorithms/Libraries/angles/CMakeLists.txt +++ b/src/Algorithms/Libraries/angles/CMakeLists.txt @@ -1,70 +1,129 @@ -cmake_minimum_required(VERSION 3.10) +cmake_minimum_required(VERSION 3.0.2) +project(angles VERSION 1.0.0 LANGUAGES CXX) -# ======================================================== -# Dual-mode CMakeLists.txt: Supports both Catkin and Standalone CMake -# ======================================================== - -# Detect if building with Catkin if(DEFINED CATKIN_DEVEL_PREFIX OR DEFINED CATKIN_TOPLEVEL) set(BUILDING_WITH_CATKIN TRUE) message(STATUS "Building angles with Catkin") + else() set(BUILDING_WITH_CATKIN FALSE) message(STATUS "Building angles with Standalone CMake") endif() -project(angles VERSION 1.0.0 LANGUAGES CXX) - +# C++ Standard - must be set before find_package set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) -set(CMAKE_POSITION_INDEPENDENT_CODE ON) +set(CMAKE_CXX_EXTENSIONS OFF) + +if (NOT BUILDING_WITH_CATKIN) + + # Enable Position Independent Code + set(CMAKE_POSITION_INDEPENDENT_CODE ON) + + # Cấu hình RPATH để tránh cycle trong runtime search path + set(CMAKE_BUILD_RPATH_USE_ORIGIN TRUE) + set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) + set(CMAKE_BUILD_RPATH "${CMAKE_BINARY_DIR}") + +else() # ======================================================== # Catkin specific configuration # ======================================================== - -if(BUILDING_WITH_CATKIN) find_package(catkin REQUIRED) + catkin_package( INCLUDE_DIRS include - # Header-only library; keep LIBRARIES for visibility when exporting - LIBRARIES angles + # LIBRARIES không cần vì đây là header-only library + ) + + include_directories( + include + ${catkin_INCLUDE_DIRS} ) endif() -# Create interface library (header-only) -add_library(angles INTERFACE) +# Tìm tất cả header files +file(GLOB_RECURSE HEADERS "include/angles/*.h") -# Set include directories -target_include_directories(angles INTERFACE - $ - $ -) +# Tạo INTERFACE library (header-only) +add_library(${PROJECT_NAME} INTERFACE) if(BUILDING_WITH_CATKIN) - add_dependencies(angles ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) + add_dependencies(${PROJECT_NAME} ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) + + # Set include directories + target_include_directories(${PROJECT_NAME} + INTERFACE + $ + $ + ) + + # Link dependencies (header-only, chỉ cần include paths) + target_link_libraries(${PROJECT_NAME} + INTERFACE + ${catkin_LIBRARIES} + ) + +else() + + # Set include directories + target_include_directories(${PROJECT_NAME} + INTERFACE + $ + $ + ) + endif() -# ======================================================== -# Installation -# ======================================================== +if(BUILDING_WITH_CATKIN) + ## Mark libraries for installation + ## See http://docs.ros.org/melodic/api/catkin/html/howto/format1/building_libraries.html + install(TARGETS ${PROJECT_NAME} + ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} + LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} + RUNTIME DESTINATION ${CATKIN_GLOBAL_BIN_DESTINATION} + ) -install(TARGETS angles - EXPORT angles-targets - INCLUDES DESTINATION include -) + ## Mark cpp header files for installation + install(DIRECTORY include/${PROJECT_NAME}/ + DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION} + FILES_MATCHING PATTERN "*.h" + PATTERN ".svn" EXCLUDE + ) -if(NOT BUILDING_WITH_CATKIN) - # Install headers (standalone) - install(DIRECTORY include/angles +else() + + install(TARGETS ${PROJECT_NAME} + EXPORT ${PROJECT_NAME}-targets + ARCHIVE DESTINATION lib + LIBRARY DESTINATION lib + RUNTIME DESTINATION bin + ) + + # Export targets + install(EXPORT ${PROJECT_NAME}-targets + FILE ${PROJECT_NAME}-targets.cmake + NAMESPACE ${PROJECT_NAME}:: + DESTINATION lib/cmake/${PROJECT_NAME} + ) + + ## Mark cpp header files for installation + install(DIRECTORY include/${PROJECT_NAME}/ DESTINATION include FILES_MATCHING PATTERN "*.h" + PATTERN ".svn" EXCLUDE ) + + # Print configuration info + message(STATUS "=================================") + message(STATUS "Project: ${PROJECT_NAME} (Header-Only)") + message(STATUS "Version: ${PROJECT_VERSION}") + message(STATUS "C++ Standard: ${CMAKE_CXX_STANDARD}") + message(STATUS "Headers found:") + foreach(hdr ${HEADERS}) + message(STATUS " - ${hdr}") + endforeach() + message(STATUS "Dependencies: None") + message(STATUS "=================================") endif() - -# Export targets -install(EXPORT angles-targets - FILE angles-targets.cmake - DESTINATION lib/cmake/angles -) - diff --git a/src/Algorithms/Libraries/kalman/CMakeLists.txt b/src/Algorithms/Libraries/kalman/CMakeLists.txt index e7b8621..7742396 100755 --- a/src/Algorithms/Libraries/kalman/CMakeLists.txt +++ b/src/Algorithms/Libraries/kalman/CMakeLists.txt @@ -1,142 +1,181 @@ -cmake_minimum_required(VERSION 3.10) +cmake_minimum_required(VERSION 3.0.2) +project(kalman VERSION 1.0.0 LANGUAGES CXX) -# ======================================================== -# Dual-mode CMakeLists.txt: Supports both Catkin and Standalone CMake -# ======================================================== - -# Detect if building with Catkin if(DEFINED CATKIN_DEVEL_PREFIX OR DEFINED CATKIN_TOPLEVEL) set(BUILDING_WITH_CATKIN TRUE) message(STATUS "Building kalman with Catkin") + else() set(BUILDING_WITH_CATKIN FALSE) message(STATUS "Building kalman with Standalone CMake") endif() -project(kalman VERSION 1.0.0 LANGUAGES CXX) - -# Chuẩn C++ +# C++ Standard - must be set before find_package set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) -set(CMAKE_POSITION_INDEPENDENT_CODE ON) +set(CMAKE_CXX_EXTENSIONS OFF) -if(NOT CMAKE_BUILD_TYPE) - set(CMAKE_BUILD_TYPE Release) -endif() - -# ======================================================== # Find dependencies -# ======================================================== find_package(Eigen3 REQUIRED) -if(BUILDING_WITH_CATKIN) +if (NOT BUILDING_WITH_CATKIN) + + # Enable Position Independent Code + set(CMAKE_POSITION_INDEPENDENT_CODE ON) + + # Cấu hình RPATH để tránh cycle trong runtime search path + set(CMAKE_BUILD_RPATH_USE_ORIGIN TRUE) + set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) + set(CMAKE_BUILD_RPATH "${CMAKE_BINARY_DIR}") + +else() + +# ======================================================== +# Catkin specific configuration +# ======================================================== find_package(catkin REQUIRED) + catkin_package( INCLUDE_DIRS include - LIBRARIES kalman + LIBRARIES ${PROJECT_NAME} DEPENDS Eigen3 ) -endif() -# Thư mục include -include_directories( - ${PROJECT_SOURCE_DIR}/include + include_directories( + include + ${catkin_INCLUDE_DIRS} ${EIGEN3_INCLUDE_DIRS} -) - -if(BUILDING_WITH_CATKIN) - include_directories(${catkin_INCLUDE_DIRS}) -endif() - -# Tìm tất cả file source -file(GLOB SOURCES "src/kalman.cpp") -file(GLOB HEADERS "include/kalman/kalman.h") - -# Tạo thư viện shared (.so) -add_library(kalman SHARED ${SOURCES} ${HEADERS}) - -# Link libraries -target_link_libraries(kalman - PUBLIC - Eigen3::Eigen - $<$:${catkin_LIBRARIES}> -) - -set_target_properties(kalman PROPERTIES - LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR} -) - -# Set include directories -target_include_directories(kalman - PUBLIC - $ - $ - ${EIGEN3_INCLUDE_DIRS} -) - -if(BUILDING_WITH_CATKIN) - add_dependencies(kalman ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) -endif() - -# Tạo executable cho test -add_executable(kalman_node src/kalman-test.cpp) -target_link_libraries(kalman_node - PRIVATE - kalman - Eigen3::Eigen -) - -set_target_properties(kalman_node PROPERTIES - LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR} -) - -# ======================================================== -# Installation -# ======================================================== - -# Cài đặt library -install(TARGETS kalman - EXPORT kalman-targets - LIBRARY DESTINATION lib - ARCHIVE DESTINATION lib - RUNTIME DESTINATION bin -) - -# Cài đặt executable (optional) -install(TARGETS kalman_node - RUNTIME DESTINATION bin -) - -if(NOT BUILDING_WITH_CATKIN) - # Cài đặt header files (standalone) - install(DIRECTORY include/kalman - DESTINATION include - FILES_MATCHING PATTERN "*.h" ) endif() -# Export targets -install(EXPORT kalman-targets - FILE kalman-targets.cmake - DESTINATION lib/cmake/kalman +# ======================================================== +# Libraries +# ======================================================== +add_library(${PROJECT_NAME} SHARED + src/kalman.cpp ) -# Tùy chọn build -option(BUILD_SHARED_LIBS "Build shared libraries" ON) -option(BUILD_TESTS "Build test programs" OFF) +if(BUILDING_WITH_CATKIN) + add_dependencies(${PROJECT_NAME} ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) -# Flags biên dịch -# Warning flags - disabled to suppress warnings during build -# set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Wpedantic") -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -w") # -w suppresses all warnings -set(CMAKE_CXX_FLAGS_DEBUG "-g -O0") -set(CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG") + target_include_directories(${PROJECT_NAME} + PUBLIC + $ + $ + ) -# In thông tin cấu hình -message(STATUS "=================================") -message(STATUS "Project: ${PROJECT_NAME}") -message(STATUS "Version: ${PROJECT_VERSION}") -message(STATUS "C++ Standard: ${CMAKE_CXX_STANDARD}") -message(STATUS "Eigen3 found: ${EIGEN3_FOUND}") -message(STATUS "Eigen3 include dir: ${EIGEN3_INCLUDE_DIRS}") -message(STATUS "=================================") + target_link_libraries(${PROJECT_NAME} + PUBLIC ${catkin_LIBRARIES} + PRIVATE Eigen3::Eigen + ) + +else() + + target_include_directories(${PROJECT_NAME} + PUBLIC + $ + $ + ) + + target_link_libraries(${PROJECT_NAME} + PUBLIC + Eigen3::Eigen + ) + + set_target_properties(${PROJECT_NAME} PROPERTIES + LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR} + BUILD_RPATH "${CMAKE_BINARY_DIR}" + INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib" + ) + +endif() + +# ======================================================== +# Test executable +# ======================================================== +if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/src/kalman-test.cpp) + add_executable(${PROJECT_NAME}_node src/kalman-test.cpp) + + target_link_libraries(${PROJECT_NAME}_node PRIVATE + ${PROJECT_NAME} + Eigen3::Eigen + ) + + if(NOT BUILDING_WITH_CATKIN) + # Configure RPATH to find libraries in devel space + set_target_properties(${PROJECT_NAME}_node PROPERTIES + BUILD_WITH_INSTALL_RPATH FALSE + INSTALL_RPATH_USE_LINK_PATH TRUE + BUILD_RPATH "${CMAKE_BINARY_DIR}" + ) + endif() +endif() + +# ======================================================== +# Install +# ======================================================== +if(BUILDING_WITH_CATKIN) + ## Mark libraries for installation + ## See http://docs.ros.org/melodic/api/catkin/html/howto/format1/building_libraries.html + install(TARGETS ${PROJECT_NAME} + ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} + LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} + RUNTIME DESTINATION ${CATKIN_GLOBAL_BIN_DESTINATION} + ) + + ## Mark cpp header files for installation + install(DIRECTORY include/${PROJECT_NAME}/ + DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION} + FILES_MATCHING PATTERN "*.h" + PATTERN ".svn" EXCLUDE + ) + + ## Install test executable if it exists + if(TARGET ${PROJECT_NAME}_node) + install(TARGETS ${PROJECT_NAME}_node + RUNTIME DESTINATION ${CATKIN_GLOBAL_BIN_DESTINATION} + ) + endif() + +else() + + install(TARGETS ${PROJECT_NAME} + EXPORT ${PROJECT_NAME}-targets + ARCHIVE DESTINATION lib + LIBRARY DESTINATION lib + RUNTIME DESTINATION bin + ) + + # Export targets + install(EXPORT ${PROJECT_NAME}-targets + FILE ${PROJECT_NAME}-targets.cmake + NAMESPACE ${PROJECT_NAME}:: + DESTINATION lib/cmake/${PROJECT_NAME} + ) + + ## Mark cpp header files for installation + install(DIRECTORY include/${PROJECT_NAME}/ + DESTINATION include + FILES_MATCHING PATTERN "*.h" + PATTERN ".svn" EXCLUDE + ) + + ## Install test executable if it exists + if(TARGET ${PROJECT_NAME}_node) + install(TARGETS ${PROJECT_NAME}_node + RUNTIME DESTINATION bin + ) + endif() + + # Print configuration info + message(STATUS "=================================") + message(STATUS "Project: ${PROJECT_NAME}") + message(STATUS "Version: ${PROJECT_VERSION}") + message(STATUS "C++ Standard: ${CMAKE_CXX_STANDARD}") + message(STATUS "Libraries: ${PROJECT_NAME}") + if(TARGET ${PROJECT_NAME}_node) + message(STATUS "Executables: ${PROJECT_NAME}_node") + endif() + message(STATUS "Dependencies: Eigen3") + message(STATUS "=================================") +endif() diff --git a/src/Algorithms/Libraries/mkt_algorithm/CMakeLists.txt b/src/Algorithms/Libraries/mkt_algorithm/CMakeLists.txt index 89880a3..1f54a64 100644 --- a/src/Algorithms/Libraries/mkt_algorithm/CMakeLists.txt +++ b/src/Algorithms/Libraries/mkt_algorithm/CMakeLists.txt @@ -1,36 +1,53 @@ -cmake_minimum_required(VERSION 3.10) +cmake_minimum_required(VERSION 3.0.2) +project(mkt_algorithm VERSION 1.0.0 LANGUAGES CXX) -# ======================================================== -# Dual-mode CMakeLists.txt: Supports both Catkin and Standalone CMake -# ======================================================== - -# Detect if building with Catkin if(DEFINED CATKIN_DEVEL_PREFIX OR DEFINED CATKIN_TOPLEVEL) set(BUILDING_WITH_CATKIN TRUE) message(STATUS "Building mkt_algorithm with Catkin") + else() set(BUILDING_WITH_CATKIN FALSE) message(STATUS "Building mkt_algorithm with Standalone CMake") endif() -project(mkt_algorithm VERSION 1.0.0 LANGUAGES CXX) - -# Chuẩn C++ +# C++ Standard - must be set before find_package set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) -set(CMAKE_POSITION_INDEPENDENT_CODE ON) +set(CMAKE_CXX_EXTENSIONS OFF) -if(NOT CMAKE_BUILD_TYPE) - set(CMAKE_BUILD_TYPE Release) -endif() - -# ======================================================== # Find dependencies -# ======================================================== find_package(Boost REQUIRED COMPONENTS system) find_package(Eigen3 REQUIRED) -if(BUILDING_WITH_CATKIN) +if (NOT BUILDING_WITH_CATKIN) + + # Enable Position Independent Code + set(CMAKE_POSITION_INDEPENDENT_CODE ON) + + # Cấu hình RPATH để tránh cycle trong runtime search path + set(CMAKE_BUILD_RPATH_USE_ORIGIN TRUE) + set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) + set(CMAKE_BUILD_RPATH "${CMAKE_BINARY_DIR}") + + set(PACKAGES_DIR + geometry_msgs + score_algorithm + robot_nav_2d_msgs + robot_nav_2d_utils + kalman + angles + nav_grid + robot_costmap_2d + robot_sensor_msgs + robot_std_msgs + robot_cpp + ) + +else() + +# ======================================================== +# Catkin specific configuration +# ======================================================== find_package(catkin REQUIRED COMPONENTS geometry_msgs score_algorithm @@ -44,128 +61,130 @@ if(BUILDING_WITH_CATKIN) robot_std_msgs robot_cpp ) -endif() -# Thư mục include -include_directories( - ${PROJECT_SOURCE_DIR}/include + catkin_package( + INCLUDE_DIRS include + LIBRARIES ${PROJECT_NAME}_diff + CATKIN_DEPENDS geometry_msgs score_algorithm robot_nav_2d_msgs robot_nav_2d_utils kalman angles nav_grid robot_costmap_2d robot_sensor_msgs robot_std_msgs robot_cpp + DEPENDS Boost Eigen3 + ) + + include_directories( + include + ${catkin_INCLUDE_DIRS} ${EIGEN3_INCLUDE_DIRS} -) - -if(BUILDING_WITH_CATKIN) - include_directories(${catkin_INCLUDE_DIRS}) -endif() - -# Dependencies packages -set(PACKAGES_DIR - geometry_msgs - score_algorithm - robot_nav_2d_msgs - robot_nav_2d_utils - kalman - angles - nav_grid - robot_costmap_2d - robot_sensor_msgs - robot_std_msgs -) - -# Tìm tất cả file source cho diff library -file(GLOB DIFF_SOURCES - "src/diff/diff_predictive_trajectory.cpp" - "src/diff/diff_rotate_to_goal.cpp" - "src/diff/diff_go_straight.cpp" -) - -file(GLOB DIFF_HEADERS - "include/mkt_algorithm/diff/*.h" -) - -# Tạo thư viện shared cho diff -add_library(mkt_algorithm_diff SHARED ${DIFF_SOURCES} ${DIFF_HEADERS}) - -# Link libraries -if(BUILDING_WITH_CATKIN) - target_link_libraries(mkt_algorithm_diff - PUBLIC - ${catkin_LIBRARIES} - Boost::system - Eigen3::Eigen - ) -else() - target_link_libraries(mkt_algorithm_diff - PUBLIC - ${PACKAGES_DIR} - robot_cpp - Boost::system - Eigen3::Eigen + ${Boost_INCLUDE_DIRS} ) endif() -if(BUILDING_WITH_CATKIN) - add_dependencies(mkt_algorithm_diff ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) -endif() - -set_target_properties(mkt_algorithm_diff PROPERTIES - LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR} +# ======================================================== +# Libraries +# ======================================================== +add_library(${PROJECT_NAME}_diff SHARED + src/diff/diff_predictive_trajectory.cpp + src/diff/diff_rotate_to_goal.cpp + src/diff/diff_go_straight.cpp ) -# Set include directories -target_include_directories(mkt_algorithm_diff +if(BUILDING_WITH_CATKIN) + add_dependencies(${PROJECT_NAME}_diff ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) + + target_include_directories(${PROJECT_NAME}_diff PUBLIC - $ - $ - ${EIGEN3_INCLUDE_DIRS} -) - -# ======================================================== -# Installation -# ======================================================== - -# Cài đặt library -install(TARGETS mkt_algorithm_diff - EXPORT mkt_algorithm-targets - LIBRARY DESTINATION lib - ARCHIVE DESTINATION lib - RUNTIME DESTINATION bin -) - -if(NOT BUILDING_WITH_CATKIN) - # Cài đặt header files (standalone) - install(DIRECTORY include/mkt_algorithm - DESTINATION include - FILES_MATCHING PATTERN "*.h" + $ + $ ) + + target_link_libraries(${PROJECT_NAME}_diff + PUBLIC ${catkin_LIBRARIES} + PRIVATE Boost::system Eigen3::Eigen + ) + +else() + + target_include_directories(${PROJECT_NAME}_diff + PUBLIC + $ + $ + ) + + target_link_libraries(${PROJECT_NAME}_diff + PUBLIC + ${PACKAGES_DIR} + PRIVATE + Boost::system Eigen3::Eigen + ) + + set_target_properties(${PROJECT_NAME}_diff PROPERTIES + LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR} + BUILD_RPATH "${CMAKE_BINARY_DIR}" + INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib" + ) + endif() -# Cài đặt plugins.xml (nếu cần cho pluginlib) -if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/plugins.xml) +# ======================================================== +# Install +# ======================================================== +if(BUILDING_WITH_CATKIN) + ## Mark libraries for installation + ## See http://docs.ros.org/melodic/api/catkin/html/howto/format1/building_libraries.html + install(TARGETS ${PROJECT_NAME}_diff + ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} + LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} + RUNTIME DESTINATION ${CATKIN_GLOBAL_BIN_DESTINATION} + ) + + ## Mark cpp header files for installation + install(DIRECTORY include/${PROJECT_NAME}/ + DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION} + FILES_MATCHING PATTERN "*.h" + PATTERN ".svn" EXCLUDE + ) + + ## Install plugins.xml if it exists + if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/plugins.xml) install(FILES plugins.xml - DESTINATION share/${PROJECT_NAME} -) + DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION} + ) + endif() + +else() + + install(TARGETS ${PROJECT_NAME}_diff + EXPORT ${PROJECT_NAME}-targets + ARCHIVE DESTINATION lib + LIBRARY DESTINATION lib + RUNTIME DESTINATION bin + ) + + # Export targets + install(EXPORT ${PROJECT_NAME}-targets + FILE ${PROJECT_NAME}-targets.cmake + NAMESPACE ${PROJECT_NAME}:: + DESTINATION lib/cmake/${PROJECT_NAME} + ) + + ## Mark cpp header files for installation + install(DIRECTORY include/${PROJECT_NAME}/ + DESTINATION include + FILES_MATCHING PATTERN "*.h" + PATTERN ".svn" EXCLUDE + ) + + ## Install plugins.xml if it exists + if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/plugins.xml) + install(FILES plugins.xml + DESTINATION share/${PROJECT_NAME} + ) + endif() + + # Print configuration info + message(STATUS "=================================") + message(STATUS "Project: ${PROJECT_NAME}") + message(STATUS "Version: ${PROJECT_VERSION}") + message(STATUS "C++ Standard: ${CMAKE_CXX_STANDARD}") + message(STATUS "Libraries: ${PROJECT_NAME}_diff") + message(STATUS "Dependencies: geometry_msgs, score_algorithm, robot_nav_2d_msgs, robot_nav_2d_utils, kalman, angles, nav_grid, robot_costmap_2d, robot_sensor_msgs, robot_std_msgs, robot_cpp, Boost, Eigen3") + message(STATUS "=================================") endif() - -# Export targets -install(EXPORT mkt_algorithm-targets - FILE mkt_algorithm-targets.cmake - DESTINATION lib/cmake/mkt_algorithm -) - -# Tùy chọn build -option(BUILD_SHARED_LIBS "Build shared libraries" ON) -option(BUILD_TESTS "Build test programs" OFF) - -# Flags biên dịch -# Warning flags - disabled to suppress warnings during build -# set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Wpedantic") -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -w") # -w suppresses all warnings -set(CMAKE_CXX_FLAGS_DEBUG "-g -O0") -set(CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG") - -# In thông tin cấu hình -message(STATUS "=================================") -message(STATUS "Project: ${PROJECT_NAME}") -message(STATUS "Version: ${PROJECT_VERSION}") -message(STATUS "C++ Standard: ${CMAKE_CXX_STANDARD}") -message(STATUS "Eigen3 found: ${EIGEN3_FOUND}") -message(STATUS "=================================") diff --git a/src/Algorithms/Libraries/mkt_msgs/CMakeLists.txt b/src/Algorithms/Libraries/mkt_msgs/CMakeLists.txt index 55bade6..a837f12 100644 --- a/src/Algorithms/Libraries/mkt_msgs/CMakeLists.txt +++ b/src/Algorithms/Libraries/mkt_msgs/CMakeLists.txt @@ -1,103 +1,144 @@ -cmake_minimum_required(VERSION 3.10) -# Tên dự án +cmake_minimum_required(VERSION 3.0.2) project(mkt_msgs VERSION 1.0.0 LANGUAGES CXX) -# Chuẩn C++ -set(CMAKE_CXX_STANDARD 17) -set(CMAKE_CXX_STANDARD_REQUIRED ON) - -# ======================================================== -# Find Packages -# ======================================================== if(DEFINED CATKIN_DEVEL_PREFIX OR DEFINED CATKIN_TOPLEVEL) set(BUILDING_WITH_CATKIN TRUE) message(STATUS "Building mkt_msgs with Catkin") + else() set(BUILDING_WITH_CATKIN FALSE) message(STATUS "Building mkt_msgs with Standalone CMake") endif() -if(BUILDING_WITH_CATKIN) - ## Find catkin macros and libraries - find_package(catkin REQUIRED COMPONENTS +# C++ Standard - must be set before find_package +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_CXX_EXTENSIONS OFF) + +if (NOT BUILDING_WITH_CATKIN) + + # Enable Position Independent Code + set(CMAKE_POSITION_INDEPENDENT_CODE ON) + + # Cấu hình RPATH để tránh cycle trong runtime search path + set(CMAKE_BUILD_RPATH_USE_ORIGIN TRUE) + set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) + set(CMAKE_BUILD_RPATH "${CMAKE_BINARY_DIR}") + + set(PACKAGES_DIR robot_nav_2d_msgs geometry_msgs ) -endif() -# Cho phép các project khác include được header của mkt_msgs -set(mkt_msgs_INCLUDE_DIRS - ${CMAKE_CURRENT_SOURCE_DIR}/include - PARENT_SCOPE -) - -include_directories( - ${PROJECT_SOURCE_DIR}/include -) - -if(BUILDING_WITH_CATKIN) - include_directories(${catkin_INCLUDE_DIRS}) -endif() +else() # ======================================================== # Catkin specific configuration # ======================================================== -if(BUILDING_WITH_CATKIN) - ## The catkin_package macro generates cmake config files for your package + find_package(catkin REQUIRED COMPONENTS + robot_nav_2d_msgs + geometry_msgs + ) + catkin_package( INCLUDE_DIRS include - # Header-only library so LIBRARIES is optional; keep for visibility - LIBRARIES mkt_msgs + # LIBRARIES không cần vì đây là header-only library CATKIN_DEPENDS robot_nav_2d_msgs geometry_msgs ) + + include_directories( + include + ${catkin_INCLUDE_DIRS} + ) endif() -# ======================================================== -# Build (header-only INTERFACE) -# ======================================================== -add_library(mkt_msgs INTERFACE) +# Tìm tất cả header files +file(GLOB_RECURSE HEADERS "include/mkt_msgs/*.h") + +# Tạo INTERFACE library (header-only) +add_library(${PROJECT_NAME} INTERFACE) if(BUILDING_WITH_CATKIN) - target_link_libraries(mkt_msgs INTERFACE ${catkin_LIBRARIES}) - add_dependencies(mkt_msgs ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) + add_dependencies(${PROJECT_NAME} ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) + + # Set include directories + target_include_directories(${PROJECT_NAME} + INTERFACE + $ + $ + ) + + # Link dependencies (header-only, chỉ cần include paths) + target_link_libraries(${PROJECT_NAME} + INTERFACE + ${catkin_LIBRARIES} + ) + else() - target_link_libraries(mkt_msgs INTERFACE robot_nav_2d_msgs geometry_msgs) + + # Set include directories + target_include_directories(${PROJECT_NAME} + INTERFACE + $ + $ + ) + + # Link dependencies (header-only, chỉ cần include paths) + target_link_libraries(${PROJECT_NAME} + INTERFACE + ${PACKAGES_DIR} + ) + endif() -# Set include directories -target_include_directories(mkt_msgs - INTERFACE - $ - $ -) +if(BUILDING_WITH_CATKIN) + ## Mark libraries for installation + ## See http://docs.ros.org/melodic/api/catkin/html/howto/format1/building_libraries.html + install(TARGETS ${PROJECT_NAME} + ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} + LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} + RUNTIME DESTINATION ${CATKIN_GLOBAL_BIN_DESTINATION} + ) -# ======================================================== -# Installation -# ======================================================== + ## Mark cpp header files for installation + install(DIRECTORY include/${PROJECT_NAME}/ + DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION} + FILES_MATCHING PATTERN "*.h" + PATTERN ".svn" EXCLUDE + ) -install(TARGETS mkt_msgs - EXPORT mkt_msgs-targets - LIBRARY DESTINATION lib - ARCHIVE DESTINATION lib - RUNTIME DESTINATION bin) +else() -# Cài đặt header files (cả catkin và standalone) -install(DIRECTORY include/mkt_msgs - DESTINATION include - FILES_MATCHING PATTERN "*.h") + install(TARGETS ${PROJECT_NAME} + EXPORT ${PROJECT_NAME}-targets + ARCHIVE DESTINATION lib + LIBRARY DESTINATION lib + RUNTIME DESTINATION bin + ) -# Export targets (cho cả hai chế độ) -install(EXPORT mkt_msgs-targets - FILE mkt_msgs-targets.cmake - DESTINATION lib/cmake/mkt_msgs) + # Export targets + install(EXPORT ${PROJECT_NAME}-targets + FILE ${PROJECT_NAME}-targets.cmake + NAMESPACE ${PROJECT_NAME}:: + DESTINATION lib/cmake/${PROJECT_NAME} + ) -# In thông tin cấu hình -message(STATUS "=================================") -message(STATUS "Project: ${PROJECT_NAME} (Header-Only)") -message(STATUS "Version: ${PROJECT_VERSION}") -message(STATUS "C++ Standard: ${CMAKE_CXX_STANDARD}") -message(STATUS "Headers found:") -foreach(hdr ${HEADERS}) + ## Mark cpp header files for installation + install(DIRECTORY include/${PROJECT_NAME}/ + DESTINATION include + FILES_MATCHING PATTERN "*.h" + PATTERN ".svn" EXCLUDE + ) + + # Print configuration info + message(STATUS "=================================") + message(STATUS "Project: ${PROJECT_NAME} (Header-Only)") + message(STATUS "Version: ${PROJECT_VERSION}") + message(STATUS "C++ Standard: ${CMAKE_CXX_STANDARD}") + message(STATUS "Headers found:") + foreach(hdr ${HEADERS}) message(STATUS " - ${hdr}") -endforeach() -message(STATUS "=================================") \ No newline at end of file + endforeach() + message(STATUS "Dependencies: robot_nav_2d_msgs, geometry_msgs") + message(STATUS "=================================") +endif() diff --git a/src/Algorithms/Libraries/mkt_plugins/CMakeLists.txt b/src/Algorithms/Libraries/mkt_plugins/CMakeLists.txt index 0aa2845..8217e36 100644 --- a/src/Algorithms/Libraries/mkt_plugins/CMakeLists.txt +++ b/src/Algorithms/Libraries/mkt_plugins/CMakeLists.txt @@ -1,38 +1,50 @@ -cmake_minimum_required(VERSION 3.10) +cmake_minimum_required(VERSION 3.0.2) +project(mkt_plugins VERSION 1.0.0 LANGUAGES CXX) -# ======================================================== -# Dual-mode CMakeLists.txt: Supports both Catkin and Standalone CMake -# ======================================================== - -# Detect if building with Catkin if(DEFINED CATKIN_DEVEL_PREFIX OR DEFINED CATKIN_TOPLEVEL) set(BUILDING_WITH_CATKIN TRUE) message(STATUS "Building mkt_plugins with Catkin") + else() set(BUILDING_WITH_CATKIN FALSE) message(STATUS "Building mkt_plugins with Standalone CMake") endif() -project(mkt_plugins VERSION 1.0.0 LANGUAGES CXX) - -# Chuẩn C++ +# C++ Standard - must be set before find_package set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) -set(CMAKE_POSITION_INDEPENDENT_CODE ON) +set(CMAKE_CXX_EXTENSIONS OFF) -# Build type -if(NOT CMAKE_BUILD_TYPE) - set(CMAKE_BUILD_TYPE Release) -endif() - -# ======================================================== # Find dependencies -# ======================================================== - -# Find system dependencies find_package(Boost REQUIRED COMPONENTS system) -if(BUILDING_WITH_CATKIN) +if (NOT BUILDING_WITH_CATKIN) + + # Enable Position Independent Code + set(CMAKE_POSITION_INDEPENDENT_CODE ON) + + # Cấu hình RPATH để tránh cycle trong runtime search path + set(CMAKE_BUILD_RPATH_USE_ORIGIN TRUE) + set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) + set(CMAKE_BUILD_RPATH "${CMAKE_BINARY_DIR}") + + set(PACKAGES_DIR + score_algorithm + robot_nav_2d_msgs + robot_nav_2d_utils + robot_nav_core2 + geometry_msgs + robot_nav_msgs + robot_std_msgs + robot_sensor_msgs + angles + ) + +else() + +# ======================================================== +# Catkin specific configuration +# ======================================================== find_package(catkin REQUIRED COMPONENTS score_algorithm robot_nav_2d_msgs @@ -44,155 +56,153 @@ if(BUILDING_WITH_CATKIN) robot_sensor_msgs angles ) -endif() -# Flags biên dịch -# Warning flags - disabled to suppress warnings during build -# set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Wpedantic") -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -w") # -w suppresses all warnings -set(CMAKE_CXX_FLAGS_DEBUG "-g -O0") -set(CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG") - -# ======================================================== -# Catkin specific configuration -# ======================================================== - -if(BUILDING_WITH_CATKIN) catkin_package( INCLUDE_DIRS include - LIBRARIES mkt_plugins_goal_checker mkt_plugins_standard_traj_generator + LIBRARIES ${PROJECT_NAME}_goal_checker ${PROJECT_NAME}_standard_traj_generator CATKIN_DEPENDS score_algorithm robot_nav_2d_msgs robot_nav_2d_utils robot_nav_core2 geometry_msgs robot_nav_msgs robot_std_msgs robot_sensor_msgs angles + DEPENDS Boost + ) + + include_directories( + include + ${catkin_INCLUDE_DIRS} + ${Boost_INCLUDE_DIRS} ) endif() -# Thư mục include -include_directories( - ${PROJECT_SOURCE_DIR}/include -) - -if(BUILDING_WITH_CATKIN) - include_directories(${catkin_INCLUDE_DIRS}) -endif() - -# Dependencies packages (internal libraries) -set(PACKAGES_DIR - score_algorithm - robot_nav_2d_msgs - robot_nav_2d_utils - robot_nav_core2 - geometry_msgs - robot_nav_msgs - robot_std_msgs - robot_sensor_msgs - angles -) - -########### -## Build ## -########### - -# Library 1: goal_checker +# ======================================================== +# Libraries +# ======================================================== add_library(${PROJECT_NAME}_goal_checker SHARED - src/goal_checker.cpp - src/simple_goal_checker.cpp - src/equation_line.cpp + src/goal_checker.cpp + src/simple_goal_checker.cpp + src/equation_line.cpp ) -# Link libraries -if(BUILDING_WITH_CATKIN) - target_link_libraries(${PROJECT_NAME}_goal_checker - PUBLIC ${catkin_LIBRARIES} - PRIVATE Boost::boost - ) -else() - target_link_libraries(${PROJECT_NAME}_goal_checker - PUBLIC ${PACKAGES_DIR} - PRIVATE Boost::boost - ) -endif() - -set_target_properties(${PROJECT_NAME}_goal_checker PROPERTIES - LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR} -) - -target_include_directories(${PROJECT_NAME}_goal_checker - PUBLIC - $ - $ -) - -# Library 3: standard_traj_generator add_library(${PROJECT_NAME}_standard_traj_generator SHARED - src/kinematic_parameters.cpp - src/xy_theta_iterator.cpp - src/standard_traj_generator.cpp - src/limited_accel_generator.cpp -) - -if(BUILDING_WITH_CATKIN) - target_link_libraries(${PROJECT_NAME}_standard_traj_generator - PUBLIC ${catkin_LIBRARIES} - PRIVATE Boost::boost - ) -else() - target_link_libraries(${PROJECT_NAME}_standard_traj_generator - PUBLIC ${PACKAGES_DIR} - PRIVATE Boost::boost - ) -endif() - -set_target_properties(${PROJECT_NAME}_standard_traj_generator PROPERTIES - LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR} -) - -target_include_directories(${PROJECT_NAME}_standard_traj_generator - PUBLIC - $ - $ + src/kinematic_parameters.cpp + src/xy_theta_iterator.cpp + src/standard_traj_generator.cpp + src/limited_accel_generator.cpp ) if(BUILDING_WITH_CATKIN) add_dependencies(${PROJECT_NAME}_goal_checker ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) add_dependencies(${PROJECT_NAME}_standard_traj_generator ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) -endif() -############# -## Install ## -############# - -# Cài đặt libraries -install(TARGETS - ${PROJECT_NAME}_standard_traj_generator - ${PROJECT_NAME}_goal_checker - EXPORT ${PROJECT_NAME}-targets - LIBRARY DESTINATION lib - ARCHIVE DESTINATION lib - RUNTIME DESTINATION bin -) - -if(NOT BUILDING_WITH_CATKIN) - # Cài đặt header files (standalone) - install(DIRECTORY include/${PROJECT_NAME}/ - DESTINATION include/${PROJECT_NAME} - FILES_MATCHING PATTERN "*.h" - PATTERN ".svn" EXCLUDE + target_include_directories(${PROJECT_NAME}_goal_checker + PUBLIC + $ + $ ) + + target_include_directories(${PROJECT_NAME}_standard_traj_generator + PUBLIC + $ + $ + ) + + target_link_libraries(${PROJECT_NAME}_goal_checker + PUBLIC ${catkin_LIBRARIES} + PRIVATE Boost::system + ) + + target_link_libraries(${PROJECT_NAME}_standard_traj_generator + PUBLIC ${catkin_LIBRARIES} + PRIVATE Boost::system + ) + +else() + + target_include_directories(${PROJECT_NAME}_goal_checker + PUBLIC + $ + $ + ) + + target_include_directories(${PROJECT_NAME}_standard_traj_generator + PUBLIC + $ + $ + ) + + target_link_libraries(${PROJECT_NAME}_goal_checker + PUBLIC + ${PACKAGES_DIR} + PRIVATE + Boost::system + ) + + target_link_libraries(${PROJECT_NAME}_standard_traj_generator + PUBLIC + ${PACKAGES_DIR} + PRIVATE + Boost::system + ) + + set_target_properties(${PROJECT_NAME}_goal_checker PROPERTIES + LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR} + BUILD_RPATH "${CMAKE_BINARY_DIR}" + INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib" + ) + + set_target_properties(${PROJECT_NAME}_standard_traj_generator PROPERTIES + LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR} + BUILD_RPATH "${CMAKE_BINARY_DIR}" + INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib" + ) + endif() -# Export targets -install(EXPORT ${PROJECT_NAME}-targets +# ======================================================== +# Install +# ======================================================== +if(BUILDING_WITH_CATKIN) + ## Mark libraries for installation + ## See http://docs.ros.org/melodic/api/catkin/html/howto/format1/building_libraries.html + install(TARGETS ${PROJECT_NAME}_goal_checker ${PROJECT_NAME}_standard_traj_generator + ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} + LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} + RUNTIME DESTINATION ${CATKIN_GLOBAL_BIN_DESTINATION} + ) + + ## Mark cpp header files for installation + install(DIRECTORY include/${PROJECT_NAME}/ + DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION} + FILES_MATCHING PATTERN "*.h" + PATTERN ".svn" EXCLUDE + ) + +else() + + install(TARGETS ${PROJECT_NAME}_goal_checker ${PROJECT_NAME}_standard_traj_generator + EXPORT ${PROJECT_NAME}-targets + ARCHIVE DESTINATION lib + LIBRARY DESTINATION lib + RUNTIME DESTINATION bin + ) + + # Export targets + install(EXPORT ${PROJECT_NAME}-targets FILE ${PROJECT_NAME}-targets.cmake + NAMESPACE ${PROJECT_NAME}:: DESTINATION lib/cmake/${PROJECT_NAME} -) + ) -# Tùy chọn build -option(BUILD_SHARED_LIBS "Build shared libraries" ON) -option(BUILD_TESTS "Build test programs" OFF) + ## Mark cpp header files for installation + install(DIRECTORY include/${PROJECT_NAME}/ + DESTINATION include + FILES_MATCHING PATTERN "*.h" + PATTERN ".svn" EXCLUDE + ) -# In thông tin cấu hình -message(STATUS "=================================") -message(STATUS "Project: ${PROJECT_NAME}") -message(STATUS "Version: ${PROJECT_VERSION}") -message(STATUS "C++ Standard: ${CMAKE_CXX_STANDARD}") -message(STATUS "Build type: ${CMAKE_BUILD_TYPE}") -message(STATUS "=================================") + # Print configuration info + message(STATUS "=================================") + message(STATUS "Project: ${PROJECT_NAME}") + message(STATUS "Version: ${PROJECT_VERSION}") + message(STATUS "C++ Standard: ${CMAKE_CXX_STANDARD}") + message(STATUS "Libraries: ${PROJECT_NAME}_goal_checker, ${PROJECT_NAME}_standard_traj_generator") + message(STATUS "Dependencies: score_algorithm, robot_nav_2d_msgs, robot_nav_2d_utils, robot_nav_core2, geometry_msgs, robot_nav_msgs, robot_std_msgs, robot_sensor_msgs, angles, Boost") + message(STATUS "=================================") +endif() diff --git a/src/Algorithms/Packages/global_planners/custom_planner b/src/Algorithms/Packages/global_planners/custom_planner index 0b01c22..540d793 160000 --- a/src/Algorithms/Packages/global_planners/custom_planner +++ b/src/Algorithms/Packages/global_planners/custom_planner @@ -1 +1 @@ -Subproject commit 0b01c22019b66c905d6d67611d333742e1e37a55 +Subproject commit 540d79321b53ef36a4979f15c6e36b759c134e07 diff --git a/src/Algorithms/Packages/global_planners/dock_planner b/src/Algorithms/Packages/global_planners/dock_planner index 22aa83f..c4ae396 160000 --- a/src/Algorithms/Packages/global_planners/dock_planner +++ b/src/Algorithms/Packages/global_planners/dock_planner @@ -1 +1 @@ -Subproject commit 22aa83fe5a66f5c090bcb8c1fafb41cfe777ebc1 +Subproject commit c4ae3961ab21c5a2fc48bdcfa9007369fa2efe4c diff --git a/src/Algorithms/Packages/global_planners/two_points_planner/CMakeLists.txt b/src/Algorithms/Packages/global_planners/two_points_planner/CMakeLists.txt index b1a2c6f..541d177 100755 --- a/src/Algorithms/Packages/global_planners/two_points_planner/CMakeLists.txt +++ b/src/Algorithms/Packages/global_planners/two_points_planner/CMakeLists.txt @@ -1,166 +1,165 @@ -cmake_minimum_required(VERSION 3.10) +cmake_minimum_required(VERSION 3.0.2) +project(two_points_planner VERSION 1.0.0 LANGUAGES CXX) -# ======================================================== -# Dual-mode CMakeLists.txt: Supports both Catkin and Standalone CMake -# ======================================================== - -# Detect if building with Catkin if(DEFINED CATKIN_DEVEL_PREFIX OR DEFINED CATKIN_TOPLEVEL) set(BUILDING_WITH_CATKIN TRUE) message(STATUS "Building two_points_planner with Catkin") + else() set(BUILDING_WITH_CATKIN FALSE) message(STATUS "Building two_points_planner with Standalone CMake") endif() -# Tên dự án -project(two_points_planner VERSION 1.0.0 LANGUAGES CXX) - -# Chuẩn C++ +# C++ Standard - must be set before find_package set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) -set(CMAKE_POSITION_INDEPENDENT_CODE ON) +set(CMAKE_CXX_EXTENSIONS OFF) -# Build type -if(NOT CMAKE_BUILD_TYPE) - set(CMAKE_BUILD_TYPE Release) -endif() - -# ======================================================== # Find dependencies -# ======================================================== - -# Find system dependencies find_package(Boost REQUIRED COMPONENTS filesystem system) -if(BUILDING_WITH_CATKIN) - find_package(catkin REQUIRED COMPONENTS +if (NOT BUILDING_WITH_CATKIN) + + # Enable Position Independent Code + set(CMAKE_POSITION_INDEPENDENT_CODE ON) + + # Cấu hình RPATH để tránh cycle trong runtime search path + set(CMAKE_BUILD_RPATH_USE_ORIGIN TRUE) + set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) + set(CMAKE_BUILD_RPATH "${CMAKE_BINARY_DIR}") + + set(PACKAGES_DIR robot_costmap_2d robot_nav_core - geometry_msgs + robot_geometry_msgs robot_nav_msgs - robot_std_msgs tf3 robot_tf3_geometry_msgs + robot_time robot_cpp ) -endif() + +else() # ======================================================== # Catkin specific configuration # ======================================================== - -if(BUILDING_WITH_CATKIN) - catkin_package( - INCLUDE_DIRS include - LIBRARIES two_points_planner - CATKIN_DEPENDS robot_costmap_2d robot_nav_core geometry_msgs robot_nav_msgs robot_std_msgs tf3 robot_tf3_geometry_msgs robot_cpp - ) -endif() - -# Thư mục include -include_directories( - ${PROJECT_SOURCE_DIR}/include -) - -if(BUILDING_WITH_CATKIN) - include_directories(${catkin_INCLUDE_DIRS}) -endif() - -# Tìm tất cả file source -file(GLOB SOURCES "src/two_points_planner.cpp") -file(GLOB HEADERS "include/two_points_planner/*.h") - -# Dependencies packages (internal libraries) -set(PACKAGES_DIR + find_package(catkin REQUIRED COMPONENTS robot_costmap_2d robot_nav_core - geometry_msgs + robot_geometry_msgs robot_nav_msgs - robot_std_msgs tf3 robot_tf3_geometry_msgs -) - -# Tạo thư viện shared (.so) -add_library(two_points_planner SHARED ${SOURCES} ${HEADERS}) - -# Link libraries -if(BUILDING_WITH_CATKIN) - target_link_libraries(two_points_planner - PUBLIC ${catkin_LIBRARIES} - PRIVATE Boost::filesystem - PRIVATE Boost::system + robot_time + robot_cpp ) -else() - target_link_libraries(two_points_planner - PUBLIC ${PACKAGES_DIR} - PUBLIC robot_cpp - PRIVATE Boost::boost + + catkin_package( + INCLUDE_DIRS include + LIBRARIES ${PROJECT_NAME} + CATKIN_DEPENDS robot_costmap_2d robot_nav_core robot_geometry_msgs robot_nav_msgs tf3 robot_tf3_geometry_msgs robot_time robot_cpp + DEPENDS Boost + ) + + include_directories( + include + ${catkin_INCLUDE_DIRS} + ${Boost_INCLUDE_DIRS} ) endif() -if(BUILDING_WITH_CATKIN) - add_dependencies(two_points_planner ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) -endif() - -set_target_properties(two_points_planner PROPERTIES - LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR} +# ======================================================== +# Libraries +# ======================================================== +add_library(${PROJECT_NAME} SHARED + src/two_points_planner.cpp ) -# Set include directories -target_include_directories(two_points_planner +if(BUILDING_WITH_CATKIN) + add_dependencies(${PROJECT_NAME} ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) + + target_include_directories(${PROJECT_NAME} PUBLIC - $ - $ -) - -# ======================================================== -# Installation -# ======================================================== - -# Cài đặt library -install(TARGETS two_points_planner - EXPORT two_points_planner-targets - LIBRARY DESTINATION lib - ARCHIVE DESTINATION lib - RUNTIME DESTINATION bin -) - -if(NOT BUILDING_WITH_CATKIN) - # Cài đặt header files (standalone) - install(DIRECTORY include/two_points_planner - DESTINATION include - FILES_MATCHING PATTERN "*.h" - PATTERN ".svn" EXCLUDE + $ + $ ) + + target_link_libraries(${PROJECT_NAME} + PUBLIC ${catkin_LIBRARIES} + PRIVATE Boost::filesystem Boost::system + ) + +else() + + target_include_directories(${PROJECT_NAME} + PUBLIC + $ + $ + ) + + target_link_libraries(${PROJECT_NAME} + PUBLIC + ${PACKAGES_DIR} + PRIVATE + Boost::filesystem Boost::system + ) + + set_target_properties(${PROJECT_NAME} PROPERTIES + LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR} + BUILD_RPATH "${CMAKE_BINARY_DIR}" + INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib" + ) + endif() -# Export targets -install(EXPORT two_points_planner-targets - FILE two_points_planner-targets.cmake - DESTINATION lib/cmake/two_points_planner -) +# ======================================================== +# Install +# ======================================================== +if(BUILDING_WITH_CATKIN) + ## Mark libraries for installation + ## See http://docs.ros.org/melodic/api/catkin/html/howto/format1/building_libraries.html + install(TARGETS ${PROJECT_NAME} + ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} + LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} + RUNTIME DESTINATION ${CATKIN_GLOBAL_BIN_DESTINATION} + ) -# Tùy chọn build -option(BUILD_SHARED_LIBS "Build shared libraries" ON) -option(BUILD_TESTS "Build test programs" OFF) + ## Mark cpp header files for installation + install(DIRECTORY include/${PROJECT_NAME}/ + DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION} + FILES_MATCHING PATTERN "*.h" + PATTERN ".svn" EXCLUDE + ) -# Flags biên dịch -# Warning flags - disabled to suppress warnings during build -# set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Wpedantic") -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -w") # -w suppresses all warnings -set(CMAKE_CXX_FLAGS_DEBUG "-g -O0") -set(CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG") +else() -# In thông tin cấu hình -message(STATUS "=================================") -message(STATUS "Project: two_points_planner") -message(STATUS "Version: ${PROJECT_VERSION}") -message(STATUS "C++ Standard: ${CMAKE_CXX_STANDARD}") -message(STATUS "Build type: ${CMAKE_BUILD_TYPE}") -message(STATUS "Headers found:") -foreach(hdr ${HEADERS}) - message(STATUS " - ${hdr}") -endforeach() -message(STATUS "=================================") + install(TARGETS ${PROJECT_NAME} + EXPORT ${PROJECT_NAME}-targets + ARCHIVE DESTINATION lib + LIBRARY DESTINATION lib + RUNTIME DESTINATION bin + ) + + # Export targets + install(EXPORT ${PROJECT_NAME}-targets + FILE ${PROJECT_NAME}-targets.cmake + NAMESPACE ${PROJECT_NAME}:: + DESTINATION lib/cmake/${PROJECT_NAME} + ) + + ## Mark cpp header files for installation + install(DIRECTORY include/${PROJECT_NAME}/ + DESTINATION include + FILES_MATCHING PATTERN "*.h" + PATTERN ".svn" EXCLUDE + ) + + # Print configuration info + message(STATUS "=================================") + message(STATUS "Project: ${PROJECT_NAME}") + message(STATUS "Version: ${PROJECT_VERSION}") + message(STATUS "C++ Standard: ${CMAKE_CXX_STANDARD}") + message(STATUS "Dependencies: robot_costmap_2d, robot_nav_core, robot_geometry_msgs, robot_nav_msgs, tf3, robot_tf3_geometry_msgs, robot_time, robot_cpp, Boost") + message(STATUS "=================================") +endif() diff --git a/src/Algorithms/Packages/global_planners/two_points_planner/package.xml b/src/Algorithms/Packages/global_planners/two_points_planner/package.xml index 9f68659..09fc119 100644 --- a/src/Algorithms/Packages/global_planners/two_points_planner/package.xml +++ b/src/Algorithms/Packages/global_planners/two_points_planner/package.xml @@ -25,21 +25,21 @@ robot_nav_core robot_nav_core - geometry_msgs - geometry_msgs + robot_geometry_msgs + robot_geometry_msgs robot_nav_msgs robot_nav_msgs - robot_std_msgs - robot_std_msgs - tf3 tf3 robot_tf3_geometry_msgs robot_tf3_geometry_msgs + robot_time + robot_time + robot_cpp robot_cpp diff --git a/src/Algorithms/Packages/local_planners/pnkx_local_planner/CMakeLists.txt b/src/Algorithms/Packages/local_planners/pnkx_local_planner/CMakeLists.txt index f073bab..8748544 100644 --- a/src/Algorithms/Packages/local_planners/pnkx_local_planner/CMakeLists.txt +++ b/src/Algorithms/Packages/local_planners/pnkx_local_planner/CMakeLists.txt @@ -1,44 +1,39 @@ -cmake_minimum_required(VERSION 3.10) +cmake_minimum_required(VERSION 3.0.2) +project(pnkx_local_planner VERSION 1.0.0 LANGUAGES CXX) -# ======================================================== -# Dual-mode CMakeLists.txt: Supports both Catkin and Standalone CMake -# ======================================================== - -# Detect if building with Catkin if(DEFINED CATKIN_DEVEL_PREFIX OR DEFINED CATKIN_TOPLEVEL) set(BUILDING_WITH_CATKIN TRUE) message(STATUS "Building pnkx_local_planner with Catkin") + else() set(BUILDING_WITH_CATKIN FALSE) message(STATUS "Building pnkx_local_planner with Standalone CMake") endif() -project(pnkx_local_planner VERSION 1.0.0 LANGUAGES CXX) - -# Chuẩn C++ +# C++ Standard - must be set before find_package set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) -set(CMAKE_POSITION_INDEPENDENT_CODE ON) +set(CMAKE_CXX_EXTENSIONS OFF) -# Build type -if(NOT CMAKE_BUILD_TYPE) - set(CMAKE_BUILD_TYPE Release) -endif() - -# ======================================================== # Find dependencies -# ======================================================== - -# Find system dependencies find_package(Boost REQUIRED COMPONENTS system) -if(BUILDING_WITH_CATKIN) - find_package(catkin REQUIRED COMPONENTS - geometry_msgs +if (NOT BUILDING_WITH_CATKIN) + + # Enable Position Independent Code + set(CMAKE_POSITION_INDEPENDENT_CODE ON) + + # Cấu hình RPATH để tránh cycle trong runtime search path + set(CMAKE_BUILD_RPATH_USE_ORIGIN TRUE) + set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) + set(CMAKE_BUILD_RPATH "${CMAKE_BINARY_DIR}") + + set(PACKAGES_DIR + robot_geometry_msgs robot_nav_msgs robot_std_msgs - robot_sensor_msgs robot_visualization_msgs + robot_nav_2d_msgs robot_nav_2d_utils robot_nav_core2 mkt_msgs @@ -46,47 +41,22 @@ if(BUILDING_WITH_CATKIN) robot_costmap_2d tf3 robot_tf3_geometry_msgs - robot_tf3_sensor_msgs + data_convert robot_cpp angles ) -endif() -# Flags biên dịch -# Warning flags - disabled to suppress warnings during build -# set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Wpedantic") -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -w") # -w suppresses all warnings -set(CMAKE_CXX_FLAGS_DEBUG "-g -O0") -set(CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG") +else() # ======================================================== # Catkin specific configuration # ======================================================== - -if(BUILDING_WITH_CATKIN) - catkin_package( - INCLUDE_DIRS include - LIBRARIES pnkx_local_planner pnkx_local_planner_utils - CATKIN_DEPENDS geometry_msgs robot_nav_msgs robot_std_msgs robot_sensor_msgs robot_visualization_msgs robot_nav_2d_utils robot_nav_core2 mkt_msgs score_algorithm robot_costmap_2d tf3 robot_tf3_geometry_msgs robot_tf3_sensor_msgs robot_cpp angles - ) -endif() - -# Thư mục include -include_directories( - ${PROJECT_SOURCE_DIR}/include -) - -if(BUILDING_WITH_CATKIN) - include_directories(${catkin_INCLUDE_DIRS}) -endif() - -# Dependencies packages (internal libraries) -set(PACKAGES_DIR - geometry_msgs + find_package(catkin REQUIRED COMPONENTS + robot_geometry_msgs robot_nav_msgs robot_std_msgs - robot_sensor_msgs robot_visualization_msgs + robot_nav_2d_msgs robot_nav_2d_utils robot_nav_core2 mkt_msgs @@ -94,125 +64,172 @@ set(PACKAGES_DIR robot_costmap_2d tf3 robot_tf3_geometry_msgs - robot_tf3_sensor_msgs + data_convert robot_cpp angles -) - -# Tạo thư viện utils trước -add_library(${PROJECT_NAME}_utils SHARED - src/transforms.cpp -) - -# Link libraries cho utils -if(BUILDING_WITH_CATKIN) - target_link_libraries(${PROJECT_NAME}_utils - PUBLIC ${catkin_LIBRARIES} - PRIVATE Boost::boost ) -else() - target_link_libraries(${PROJECT_NAME}_utils - PUBLIC ${PACKAGES_DIR} - PRIVATE Boost::boost + + catkin_package( + INCLUDE_DIRS include + LIBRARIES ${PROJECT_NAME} ${PROJECT_NAME}_utils + CATKIN_DEPENDS robot_geometry_msgs robot_nav_msgs robot_std_msgs robot_visualization_msgs robot_nav_2d_msgs robot_nav_2d_utils robot_nav_core2 mkt_msgs score_algorithm robot_costmap_2d tf3 robot_tf3_geometry_msgs data_convert robot_cpp angles + DEPENDS Boost + ) + + include_directories( + include + ${catkin_INCLUDE_DIRS} + ${Boost_INCLUDE_DIRS} ) endif() -set_target_properties(${PROJECT_NAME}_utils PROPERTIES - LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR} -) - -# Set include directories cho utils -target_include_directories(${PROJECT_NAME}_utils - PUBLIC - $ - $ +# ======================================================== +# Libraries +# ======================================================== +# Tạo thư viện utils trước +add_library(${PROJECT_NAME}_utils SHARED + src/transforms.cpp ) # Tạo thư viện chính add_library(${PROJECT_NAME} SHARED - src/pnkx_local_planner.cpp - # src/pnkx_docking_local_planner.cpp - src/pnkx_go_straight_local_planner.cpp - src/pnkx_rotate_local_planner.cpp + src/pnkx_local_planner.cpp + src/pnkx_go_straight_local_planner.cpp + src/pnkx_rotate_local_planner.cpp ) -# Link libraries cho thư viện chính -if(BUILDING_WITH_CATKIN) - target_link_libraries(${PROJECT_NAME} - PUBLIC ${PROJECT_NAME}_utils - PUBLIC ${catkin_LIBRARIES} - PRIVATE Boost::boost - ) -else() - target_link_libraries(${PROJECT_NAME} - PUBLIC ${PROJECT_NAME}_utils - PUBLIC ${PACKAGES_DIR} - PRIVATE Boost::boost - ) -endif() - -set_target_properties(${PROJECT_NAME} PROPERTIES - LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR} -) - -# Set include directories cho thư viện chính -target_include_directories(${PROJECT_NAME} - PUBLIC - $ - $ -) - -# Compile options -target_compile_options(${PROJECT_NAME} PUBLIC "-Wno-terminate") - if(BUILDING_WITH_CATKIN) add_dependencies(${PROJECT_NAME}_utils ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) add_dependencies(${PROJECT_NAME} ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) -endif() -# Tùy chọn build -option(BUILD_SHARED_LIBS "Build shared libraries" ON) -option(BUILD_TESTS "Build test programs" OFF) - -############# -## Install ## -############# - -# Cài đặt libraries -install(TARGETS ${PROJECT_NAME} ${PROJECT_NAME}_utils - EXPORT ${PROJECT_NAME}-targets - LIBRARY DESTINATION lib - ARCHIVE DESTINATION lib - RUNTIME DESTINATION bin -) - -if(NOT BUILDING_WITH_CATKIN) - # Cài đặt header files (standalone) - install(DIRECTORY include/${PROJECT_NAME}/ - DESTINATION include/${PROJECT_NAME} - FILES_MATCHING PATTERN "*.h" - PATTERN ".svn" EXCLUDE + target_include_directories(${PROJECT_NAME}_utils + PUBLIC + $ + $ ) + + target_include_directories(${PROJECT_NAME} + PUBLIC + $ + $ + ) + + target_link_libraries(${PROJECT_NAME}_utils + PUBLIC ${catkin_LIBRARIES} + PRIVATE Boost::system + ) + + target_link_libraries(${PROJECT_NAME} + PUBLIC ${PROJECT_NAME}_utils + PUBLIC ${catkin_LIBRARIES} + PRIVATE Boost::system + ) + +else() + + target_include_directories(${PROJECT_NAME}_utils + PUBLIC + $ + $ + ) + + target_include_directories(${PROJECT_NAME} + PUBLIC + $ + $ + ) + + target_link_libraries(${PROJECT_NAME}_utils + PUBLIC + ${PACKAGES_DIR} + PRIVATE + Boost::system + ) + + target_link_libraries(${PROJECT_NAME} + PUBLIC ${PROJECT_NAME}_utils + PUBLIC + ${PACKAGES_DIR} + PRIVATE + Boost::system + ) + + set_target_properties(${PROJECT_NAME}_utils PROPERTIES + LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR} + BUILD_RPATH "${CMAKE_BINARY_DIR}" + INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib" + ) + + set_target_properties(${PROJECT_NAME} PROPERTIES + LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR} + BUILD_RPATH "${CMAKE_BINARY_DIR}" + INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib" + ) + endif() -# Export targets -install(EXPORT ${PROJECT_NAME}-targets - FILE ${PROJECT_NAME}-targets.cmake - DESTINATION lib/cmake/${PROJECT_NAME} -) +# ======================================================== +# Install +# ======================================================== +if(BUILDING_WITH_CATKIN) + ## Mark libraries for installation + ## See http://docs.ros.org/melodic/api/catkin/html/howto/format1/building_libraries.html + install(TARGETS ${PROJECT_NAME} ${PROJECT_NAME}_utils + ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} + LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} + RUNTIME DESTINATION ${CATKIN_GLOBAL_BIN_DESTINATION} + ) -# Cài đặt plugins.xml nếu có -if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/plugins.xml) - install(FILES - plugins.xml - DESTINATION share/${PROJECT_NAME} + ## Mark cpp header files for installation + install(DIRECTORY include/${PROJECT_NAME}/ + DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION} + FILES_MATCHING PATTERN "*.h" + PATTERN ".svn" EXCLUDE + ) + + ## Install plugins.xml if it exists + if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/plugins.xml) + install(FILES plugins.xml + DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION} ) -endif() + endif() -# In thông tin cấu hình -message(STATUS "=================================") -message(STATUS "Project: ${PROJECT_NAME}") -message(STATUS "Version: ${PROJECT_VERSION}") -message(STATUS "C++ Standard: ${CMAKE_CXX_STANDARD}") -message(STATUS "Build type: ${CMAKE_BUILD_TYPE}") -message(STATUS "=================================") +else() + + install(TARGETS ${PROJECT_NAME} ${PROJECT_NAME}_utils + EXPORT ${PROJECT_NAME}-targets + ARCHIVE DESTINATION lib + LIBRARY DESTINATION lib + RUNTIME DESTINATION bin + ) + + # Export targets + install(EXPORT ${PROJECT_NAME}-targets + FILE ${PROJECT_NAME}-targets.cmake + NAMESPACE ${PROJECT_NAME}:: + DESTINATION lib/cmake/${PROJECT_NAME} + ) + + ## Mark cpp header files for installation + install(DIRECTORY include/${PROJECT_NAME}/ + DESTINATION include + FILES_MATCHING PATTERN "*.h" + PATTERN ".svn" EXCLUDE + ) + + ## Install plugins.xml if it exists + if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/plugins.xml) + install(FILES plugins.xml + DESTINATION share/${PROJECT_NAME} + ) + endif() + + # Print configuration info + message(STATUS "=================================") + message(STATUS "Project: ${PROJECT_NAME}") + message(STATUS "Version: ${PROJECT_VERSION}") + message(STATUS "C++ Standard: ${CMAKE_CXX_STANDARD}") + message(STATUS "Libraries: ${PROJECT_NAME}, ${PROJECT_NAME}_utils") + message(STATUS "Dependencies: robot_geometry_msgs, robot_nav_msgs, robot_std_msgs, robot_visualization_msgs, robot_nav_2d_msgs, robot_nav_2d_utils, robot_nav_core2, mkt_msgs, score_algorithm, robot_costmap_2d, tf3, robot_tf3_geometry_msgs, data_convert, robot_cpp, angles, Boost") + message(STATUS "=================================") +endif() diff --git a/src/Algorithms/Packages/local_planners/pnkx_local_planner/package.xml b/src/Algorithms/Packages/local_planners/pnkx_local_planner/package.xml index cfca858..176dae9 100644 --- a/src/Algorithms/Packages/local_planners/pnkx_local_planner/package.xml +++ b/src/Algorithms/Packages/local_planners/pnkx_local_planner/package.xml @@ -19,8 +19,8 @@ catkin - geometry_msgs - geometry_msgs + robot_geometry_msgs + robot_geometry_msgs robot_nav_msgs robot_nav_msgs @@ -28,12 +28,12 @@ robot_std_msgs robot_std_msgs - robot_sensor_msgs - robot_sensor_msgs - robot_visualization_msgs robot_visualization_msgs + robot_nav_2d_msgs + robot_nav_2d_msgs + robot_nav_2d_utils robot_nav_2d_utils @@ -55,8 +55,8 @@ robot_tf3_geometry_msgs robot_tf3_geometry_msgs - robot_tf3_sensor_msgs - robot_tf3_sensor_msgs + data_convert + data_convert robot_cpp robot_cpp diff --git a/src/Libraries/common_msgs b/src/Libraries/common_msgs index 1df5ed6..b8b0528 160000 --- a/src/Libraries/common_msgs +++ b/src/Libraries/common_msgs @@ -1 +1 @@ -Subproject commit 1df5ed676fe374c63665d434f4d8b2c9923d41a1 +Subproject commit b8b0528f1e649b93ff07b3458aa01f251b286405 diff --git a/src/Libraries/costmap_2d b/src/Libraries/costmap_2d index 80bde38..f052dac 160000 --- a/src/Libraries/costmap_2d +++ b/src/Libraries/costmap_2d @@ -1 +1 @@ -Subproject commit 80bde38f4d5dbb66bab5a8bd5c2c3faaa870aa9f +Subproject commit f052dac1421e7e2bedba4088780526a8775b0c29 diff --git a/src/Libraries/geometry2 b/src/Libraries/geometry2 index e0db8d0..ff90ea2 160000 --- a/src/Libraries/geometry2 +++ b/src/Libraries/geometry2 @@ -1 +1 @@ -Subproject commit e0db8d0e20142df254de7232ada253c9ba4d0a08 +Subproject commit ff90ea2f297258555863a2b6e9cf8442ede3a481 diff --git a/src/Libraries/laser_geometry b/src/Libraries/laser_geometry index 7cb758a..4fb3fdc 160000 --- a/src/Libraries/laser_geometry +++ b/src/Libraries/laser_geometry @@ -1 +1 @@ -Subproject commit 7cb758a986f481ee91afb8be7b407b6329dd61b0 +Subproject commit 4fb3fdc28cc8fdd58fa3ab2d60857feb228948be diff --git a/src/Libraries/robot_cpp/CMakeLists.txt b/src/Libraries/robot_cpp/CMakeLists.txt index ed5881b..2b9ecc5 100644 --- a/src/Libraries/robot_cpp/CMakeLists.txt +++ b/src/Libraries/robot_cpp/CMakeLists.txt @@ -1,40 +1,64 @@ cmake_minimum_required(VERSION 3.0.2) +project(robot_cpp VERSION 1.0.0 LANGUAGES CXX) -# ======================================================== -# Dual-mode CMakeLists.txt: Supports both Catkin and Standalone CMake -# ======================================================== - -# Detect if building with Catkin if(DEFINED CATKIN_DEVEL_PREFIX OR DEFINED CATKIN_TOPLEVEL) set(BUILDING_WITH_CATKIN TRUE) message(STATUS "Building robot_cpp with Catkin") + else() set(BUILDING_WITH_CATKIN FALSE) message(STATUS "Building robot_cpp with Standalone CMake") endif() -project(robot_cpp) - +# C++ Standard - must be set before find_package set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) -set(CMAKE_POSITION_INDEPENDENT_CODE ON) +set(CMAKE_CXX_EXTENSIONS OFF) -# ======================================================== -# Find Packages -# ======================================================== +# Find dependencies +find_package(yaml-cpp REQUIRED) +find_package(console_bridge REQUIRED) -if(BUILDING_WITH_CATKIN) - ## Find catkin macros and libraries - find_package(catkin REQUIRED COMPONENTS +if (NOT BUILDING_WITH_CATKIN) + + # Enable Position Independent Code + set(CMAKE_POSITION_INDEPENDENT_CODE ON) + + # Cấu hình RPATH để tránh cycle trong runtime search path + set(CMAKE_BUILD_RPATH_USE_ORIGIN TRUE) + set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) + set(CMAKE_BUILD_RPATH "${CMAKE_BINARY_DIR}") + + set(PACKAGES_DIR robot_xmlrpcpp + robot_time + ) + +else() + +# ======================================================== +# Catkin specific configuration +# ======================================================== + find_package(catkin REQUIRED COMPONENTS + robot_xmlrpcpp + robot_time + ) + + catkin_package( + INCLUDE_DIRS include + LIBRARIES ${PROJECT_NAME} + CATKIN_DEPENDS robot_xmlrpcpp robot_time + # Note: yaml-cpp and console_bridge are system dependencies, + # linked via target_link_libraries, not via catkin_package DEPENDS + ) + + include_directories( + include + ${catkin_INCLUDE_DIRS} ) endif() -## System dependencies -# Find yaml-cpp library -find_package(yaml-cpp REQUIRED) - -# Use target if available (modern CMake) +# Use yaml-cpp target if available (modern CMake) if(TARGET yaml-cpp::yaml-cpp) set(YAML_CPP_TARGET yaml-cpp::yaml-cpp) message(STATUS "Using yaml-cpp target: yaml-cpp::yaml-cpp") @@ -51,80 +75,83 @@ else() message(STATUS "Using yaml-cpp library name: yaml-cpp") endif() -find_package(console_bridge REQUIRED) - -# ======================================================== -# Catkin specific configuration -# ======================================================== - -if(BUILDING_WITH_CATKIN) - ## The catkin_package macro generates cmake config files for your package - ## Note: yaml-cpp and console_bridge are system dependencies, not declared in DEPENDS - ## as they don't provide the required INCLUDE_DIRS/LIBRARIES variables for catkin - catkin_package( - INCLUDE_DIRS include - LIBRARIES robot_cpp - CATKIN_DEPENDS robot_xmlrpcpp - ) -endif() - -########### -## Build ## -########### - -## Compiler flags +# Compiler flags if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") # Warning flags - disabled to suppress warnings during build # add_compile_options(-Wall -Wextra -Wpedantic -fPIC) add_compile_options(-w -fPIC) # -w suppresses all warnings endif() -## Include directories -include_directories( - include -) - -# yaml-cpp and console_bridge are linked via targets, so we don't need to add their include dirs -# if they provide targets (modern CMake), or we handle them via target_link_libraries - -if(BUILDING_WITH_CATKIN) - include_directories(${catkin_INCLUDE_DIRS}) -endif() - -# Create unified robot_cpp library combining console and node_handle +# Libraries add_library(${PROJECT_NAME} SHARED src/console.cpp src/node_handle.cpp src/plugin_loader_helper.cpp ) -target_include_directories(${PROJECT_NAME} - PUBLIC - $ - $ -) +# Enable C++17 filesystem feature +target_compile_features(${PROJECT_NAME} PUBLIC cxx_std_17) -## Link libraries -# Use the determined yaml-cpp target/library -target_link_libraries(${PROJECT_NAME} - PUBLIC - ${YAML_CPP_TARGET} - robot_xmlrpcpp - robot_time - PRIVATE - dl # Required for dladdr() function used in plugin_loader_helper.cpp -) - - - -## Add cmake target dependencies if(BUILDING_WITH_CATKIN) add_dependencies(${PROJECT_NAME} ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) -endif() -set_target_properties(${PROJECT_NAME} PROPERTIES - LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR} -) + target_include_directories(${PROJECT_NAME} + PUBLIC + $ + $ + ) + + # Link filesystem library if needed (for GCC < 9 or Clang) + set(FILESYSTEM_LIB "") + if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS "9.0") + set(FILESYSTEM_LIB "stdc++fs") + elseif(CMAKE_CXX_COMPILER_ID MATCHES "Clang") + find_library(FILESYSTEM_LIB c++fs) + endif() + + target_link_libraries(${PROJECT_NAME} + PUBLIC ${catkin_LIBRARIES} + PRIVATE ${YAML_CPP_TARGET} + PRIVATE dl # Required for dladdr() function used in plugin_loader_helper.cpp + ) + + if(FILESYSTEM_LIB) + target_link_libraries(${PROJECT_NAME} PRIVATE ${FILESYSTEM_LIB}) + endif() + +else() + + target_include_directories(${PROJECT_NAME} + PUBLIC + $ + $ + ) + + # Link filesystem library if needed (for GCC < 9 or Clang) + set(FILESYSTEM_LIB "") + if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS "9.0") + set(FILESYSTEM_LIB "stdc++fs") + elseif(CMAKE_CXX_COMPILER_ID MATCHES "Clang") + find_library(FILESYSTEM_LIB c++fs) + endif() + + target_link_libraries(${PROJECT_NAME} + PUBLIC + ${PACKAGES_DIR} + ${YAML_CPP_TARGET} + PRIVATE + dl # Required for dladdr() function used in plugin_loader_helper.cpp + ) + + if(FILESYSTEM_LIB) + target_link_libraries(${PROJECT_NAME} PRIVATE ${FILESYSTEM_LIB}) + endif() + + set_target_properties(${PROJECT_NAME} PROPERTIES + LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR} + ) + +endif() # Define CMAKE_BINARY_DIR as compile definition so it's available at runtime target_compile_definitions(${PROJECT_NAME} @@ -132,25 +159,44 @@ target_compile_definitions(${PROJECT_NAME} PNKX_NAV_CORE_BUILD_DIR="${CMAKE_BINARY_DIR}" ) -# ======================================================== -# Installation (Standalone CMake only) -# ======================================================== +if(BUILDING_WITH_CATKIN) + ## Mark libraries for installation + ## See http://docs.ros.org/melodic/api/catkin/html/howto/format1/building_libraries.html + install(TARGETS ${PROJECT_NAME} + ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} + LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} + RUNTIME DESTINATION ${CATKIN_GLOBAL_BIN_DESTINATION} + ) -# Export target trong mọi trường hợp để các target khác có thể export và phụ thuộc vào nó -install(TARGETS ${PROJECT_NAME} - EXPORT ${PROJECT_NAME}-targets - ARCHIVE DESTINATION lib - LIBRARY DESTINATION lib - RUNTIME DESTINATION bin) + ## Mark cpp header files for installation + install(DIRECTORY include/ + DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION} + FILES_MATCHING PATTERN "*.h" + PATTERN ".svn" EXCLUDE + ) + +else() -if(NOT BUILDING_WITH_CATKIN) + install(TARGETS ${PROJECT_NAME} + EXPORT ${PROJECT_NAME}-targets + ARCHIVE DESTINATION lib + LIBRARY DESTINATION lib + RUNTIME DESTINATION bin + ) + + # Export targets + install(EXPORT ${PROJECT_NAME}-targets + FILE ${PROJECT_NAME}-targets.cmake + NAMESPACE ${PROJECT_NAME}:: + DESTINATION lib/cmake/${PROJECT_NAME} + ) + + ## Mark cpp header files for installation install(DIRECTORY include/ DESTINATION include - FILES_MATCHING PATTERN "*.h") - - install(EXPORT ${PROJECT_NAME}-targets - # NAMESPACE robot:: - DESTINATION lib/cmake/${PROJECT_NAME}) + FILES_MATCHING PATTERN "*.h" + PATTERN ".svn" EXCLUDE + ) # ======================================================== # Install CMake Config File for find_package() @@ -167,29 +213,16 @@ if(NOT BUILDING_WITH_CATKIN) ${CMAKE_CURRENT_BINARY_DIR}/robot_cppConfig.cmake DESTINATION lib/cmake/${PROJECT_NAME} ) -else() - # Khi build với Catkin, vẫn cần export để các target khác có thể export - install(EXPORT ${PROJECT_NAME}-targets - # NAMESPACE robot:: - DESTINATION lib/cmake/${PROJECT_NAME}) + + # Print configuration info + message(STATUS "=================================") + message(STATUS "Project: ${PROJECT_NAME}") + message(STATUS "Version: ${PROJECT_VERSION}") + message(STATUS "C++ Standard: ${CMAKE_CXX_STANDARD}") + message(STATUS "Dependencies: robot_xmlrpcpp, robot_time, yaml-cpp, console_bridge") + message(STATUS "=================================") endif() -# ======================================================== -# Install CMake Config File for find_package() -# ======================================================== -# Generate config file from template -configure_file( - ${CMAKE_CURRENT_SOURCE_DIR}/robot_cppConfig.cmake.in - ${CMAKE_CURRENT_BINARY_DIR}/robot_cppConfig.cmake - @ONLY -) - -# Install config file -install(FILES - ${CMAKE_CURRENT_BINARY_DIR}/robot_cppConfig.cmake - DESTINATION lib/cmake/${PROJECT_NAME} -) - # ======================================================== # Test executable # ======================================================== @@ -207,8 +240,8 @@ if(BUILD_TESTS) target_link_libraries(test_node_handle PRIVATE - robot_cpp - yaml-cpp + ${PROJECT_NAME} + ${YAML_CPP_TARGET} ) set_target_properties(test_node_handle PROPERTIES diff --git a/src/Libraries/robot_cpp/include/robot/plugin_loader_helper.h b/src/Libraries/robot_cpp/include/robot/plugin_loader_helper.h index 76532d5..6cea10b 100644 --- a/src/Libraries/robot_cpp/include/robot/plugin_loader_helper.h +++ b/src/Libraries/robot_cpp/include/robot/plugin_loader_helper.h @@ -38,10 +38,15 @@ class PluginLoaderHelper public: /** * @brief Constructor - * @param nh NodeHandle to read parameters from (default: root NodeHandle) + */ + PluginLoaderHelper(); + + /** + * @brief Constructor + * @param nh NodeHandle to read parameters from * @param config_namespace Namespace in NodeHandle where plugins are stored (default: root) */ - PluginLoaderHelper(robot::NodeHandle nh = robot::NodeHandle(), const std::string& config_namespace = ""); + PluginLoaderHelper(robot::NodeHandle nh, const std::string& config_namespace = ""); /** * @brief Find library path from symbol name (export name) @@ -76,6 +81,12 @@ public: */ static std::string getBuildDirectory(); + /** + * @brief Get workspace path at runtime + * @return Workspace path (e.g., /home/robotics/AGV/Diff_Wheel_Prj/t800_v2_ws), or empty if not found + */ + static std::string getWorkspacePath(); + private: /** * @brief Resolve library path (handle relative paths, search in search_paths) diff --git a/src/Libraries/robot_cpp/src/plugin_loader_helper.cpp b/src/Libraries/robot_cpp/src/plugin_loader_helper.cpp index 00c90c1..bcdbdc9 100644 --- a/src/Libraries/robot_cpp/src/plugin_loader_helper.cpp +++ b/src/Libraries/robot_cpp/src/plugin_loader_helper.cpp @@ -27,17 +27,25 @@ namespace robot { +PluginLoaderHelper::PluginLoaderHelper() + : PluginLoaderHelper(robot::NodeHandle(), "") +{ + // Delegate to the other constructor with default NodeHandle +} + PluginLoaderHelper::PluginLoaderHelper(robot::NodeHandle nh, const std::string& config_namespace) : nh_(nh), config_namespace_(config_namespace) { std::string build_dir = getBuildDirectory(); if (!build_dir.empty()) { search_paths_.push_back(build_dir); - // Thêm các subdirectories thường dùng - search_paths_.push_back(build_dir + "/src/Algorithms/Packages/global_planners"); - search_paths_.push_back(build_dir + "/src/Algorithms/Packages/local_planners"); - search_paths_.push_back(build_dir + "/src/Navigations/Cores/robot_nav_core2_adapter"); - search_paths_.push_back(build_dir + "/src/Libraries/robot_costmap_2d"); + } + + // Thêm các subdirectories thường dùng từ workspace path + std::string workspace_path = getWorkspacePath(); + if (!workspace_path.empty()) { + search_paths_.push_back(workspace_path + "/install/lib"); + search_paths_.push_back(workspace_path + "/devel/lib"); } } @@ -56,7 +64,6 @@ std::string PluginLoaderHelper::findLibraryPath(const std::string& symbol_name) } else { param_path = symbol_name + "/library_path"; } - // Try to read from NodeHandle std::string library_path; if (nh_.hasParam(param_path)) { @@ -97,12 +104,13 @@ std::string PluginLoaderHelper::findLibraryPath(const std::string& symbol_name) std::string ld_path_str(ld_path); std::stringstream ss(ld_path_str); std::string path; + while (std::getline(ss, path, ':')) { if (!path.empty()) { // Try different naming conventions std::vector possible_names = { - "lib" + symbol_name + ".so", - symbol_name + ".so" + "lib" + library_path + ".so", + library_path + ".so" }; // Also try without namespace @@ -111,7 +119,7 @@ std::string PluginLoaderHelper::findLibraryPath(const std::string& symbol_name) possible_names.push_back("lib" + short_name + ".so"); possible_names.push_back(short_name + ".so"); } - + for (const auto& name : possible_names) { std::filesystem::path full_path = std::filesystem::path(path) / name; if (std::filesystem::exists(full_path)) { @@ -327,5 +335,103 @@ std::string PluginLoaderHelper::getBuildDirectory() return ""; } +std::string PluginLoaderHelper::getWorkspacePath() +{ + // Method 1: Từ environment variable PNKX_NAV_CORE_DIR + const char* workspace_path = std::getenv("PNKX_NAV_CORE_DIR"); + if (workspace_path && std::filesystem::exists(workspace_path)) { + return std::string(workspace_path); + } + + // Method 2: Từ environment variable ROS_WORKSPACE hoặc CATKIN_WS + const char* ros_workspace = std::getenv("ROS_WORKSPACE"); + if (ros_workspace && std::filesystem::exists(ros_workspace)) { + return std::string(ros_workspace); + } + + const char* catkin_ws = std::getenv("CATKIN_WS"); + if (catkin_ws && std::filesystem::exists(catkin_ws)) { + return std::string(catkin_ws); + } + + // Method 3: Từ build directory (lấy parent directory) + std::string build_dir = getBuildDirectory(); + if (!build_dir.empty()) { + std::filesystem::path build_path(build_dir); + std::filesystem::path parent = build_path.parent_path(); + // Kiểm tra xem có phải workspace không (có thư mục src/) + if (std::filesystem::exists(parent / "src") && std::filesystem::is_directory(parent / "src")) { + return parent.string(); + } + } + + // Method 4: Từ executable path và tìm workspace + try { + char exe_path[PATH_MAX]; + ssize_t count = readlink("/proc/self/exe", exe_path, PATH_MAX); + if (count != -1) { + exe_path[count] = '\0'; + std::filesystem::path exe_dir = std::filesystem::path(exe_path).parent_path(); + + // Thử các relative paths: ../.., ../../.., etc. để tìm workspace + std::vector relative_paths = { + exe_dir.parent_path().parent_path(), // ../.. + exe_dir.parent_path().parent_path().parent_path(), // ../../.. + exe_dir.parent_path().parent_path().parent_path().parent_path() // ../../../.. + }; + + for (const auto& rel_path : relative_paths) { + // Kiểm tra xem có phải workspace không (có thư mục src/ hoặc build/) + if (std::filesystem::exists(rel_path) && + std::filesystem::is_directory(rel_path) && + (std::filesystem::exists(rel_path / "src") || + std::filesystem::exists(rel_path / "build"))) { + try { + return std::filesystem::canonical(rel_path).string(); + } catch (...) { + return rel_path.string(); + } + } + } + } + } catch (const std::exception&) { + // Ignore errors + } + + // Method 5: Từ library path (librobot_cpp.so) và tìm workspace + Dl_info dl_info; + if (dladdr(reinterpret_cast(&PluginLoaderHelper::getWorkspacePath), &dl_info) != 0) { + if (dl_info.dli_fname) { + std::filesystem::path lib_path(dl_info.dli_fname); + std::filesystem::path lib_dir = lib_path.parent_path(); + + // Tìm workspace từ library path + std::filesystem::path current = lib_dir; + for (int i = 0; i < 5; ++i) { // Tối đa 5 levels up + if (std::filesystem::exists(current / "src") || + std::filesystem::exists(current / "build")) { + try { + return std::filesystem::canonical(current).string(); + } catch (...) { + return current.string(); + } + } + current = current.parent_path(); + if (current == current.parent_path()) { // Reached root + break; + } + } + } + } + + // Method 6: Hardcoded fallback (nếu các phương pháp trên không hoạt động) + std::string fallback = "/home/robotics/AGV/Diff_Wheel_Prj/t800_v2_ws"; + if (std::filesystem::exists(fallback)) { + return fallback; + } + + return ""; +} + } // namespace robot diff --git a/src/Libraries/robot_nav_2d_msgs/CMakeLists.txt b/src/Libraries/robot_nav_2d_msgs/CMakeLists.txt index 50b06f0..42db3eb 100755 --- a/src/Libraries/robot_nav_2d_msgs/CMakeLists.txt +++ b/src/Libraries/robot_nav_2d_msgs/CMakeLists.txt @@ -1,106 +1,149 @@ -cmake_minimum_required(VERSION 3.10) +cmake_minimum_required(VERSION 3.0.2) +project(robot_nav_2d_msgs VERSION 1.0.0 LANGUAGES CXX) -# ======================================================== -# Dual-mode CMakeLists.txt: Supports both Catkin and Standalone CMake -# ======================================================== - -# Detect if building with Catkin if(DEFINED CATKIN_DEVEL_PREFIX OR DEFINED CATKIN_TOPLEVEL) set(BUILDING_WITH_CATKIN TRUE) message(STATUS "Building robot_nav_2d_msgs with Catkin") - find_package(catkin REQUIRED) + else() set(BUILDING_WITH_CATKIN FALSE) message(STATUS "Building robot_nav_2d_msgs with Standalone CMake") endif() -project(robot_nav_2d_msgs VERSION 1.0.0 LANGUAGES CXX) +if (NOT BUILDING_WITH_CATKIN) -# Chuẩn C++ -set(CMAKE_CXX_STANDARD 17) -set(CMAKE_CXX_STANDARD_REQUIRED ON) -set(CMAKE_CXX_EXTENSIONS OFF) + set(CMAKE_CXX_STANDARD 17) + set(CMAKE_CXX_STANDARD_REQUIRED ON) + set(CMAKE_CXX_EXTENSIONS OFF) + + # Enable Position Independent Code + set(CMAKE_POSITION_INDEPENDENT_CODE ON) + + # Cấu hình RPATH để tránh cycle trong runtime search path + set(CMAKE_BUILD_RPATH_USE_ORIGIN TRUE) + set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) + set(CMAKE_BUILD_RPATH "${CMAKE_BINARY_DIR}") + + set(PACKAGES_DIR + robot_std_msgs + robot_geometry_msgs + ) + +else() # ======================================================== # Catkin specific configuration # ======================================================== + find_package(catkin REQUIRED COMPONENTS + robot_std_msgs + robot_geometry_msgs + ) -if(BUILDING_WITH_CATKIN) - ## The catkin_package macro generates cmake config files for your package - ## Note: Dependencies (robot_std_msgs, geometry_msgs) are not Catkin packages, - ## they are built as CMake targets in the same workspace and will be available - ## when this package is built. They are linked via target_link_libraries instead of CATKIN_DEPENDS catkin_package( INCLUDE_DIRS include # LIBRARIES không cần vì đây là header-only library # CATKIN_DEPENDS không cần vì dependencies không phải Catkin packages ) + + include_directories( + include + ${catkin_INCLUDE_DIRS} + ) endif() # Tìm tất cả header files file(GLOB_RECURSE HEADERS "include/robot_nav_2d_msgs/*.h") # Tạo INTERFACE library (header-only) -add_library(robot_nav_2d_msgs INTERFACE) +add_library(${PROJECT_NAME} INTERFACE) -# Set include directories -target_include_directories(robot_nav_2d_msgs - INTERFACE - $ - $ -) - -# Link dependencies (header-only, chỉ cần include paths) -# Các dependencies này cũng là header-only từ common_msgs -target_link_libraries(robot_nav_2d_msgs - INTERFACE - robot_std_msgs - geometry_msgs -) - -# Add include directories from dependencies explicitly for Catkin build if(BUILDING_WITH_CATKIN) + add_dependencies(${PROJECT_NAME} ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) + + # Set include directories + target_include_directories(${PROJECT_NAME} + INTERFACE + $ + $ + ) + + # Link dependencies (header-only, chỉ cần include paths) + target_link_libraries(${PROJECT_NAME} + INTERFACE + ${catkin_LIBRARIES} + ) + + # Add include directories from dependencies explicitly for Catkin build # Use relative paths from current source directory - # From robot_nav_2d_msgs (pnkx_robot_nav_core2/src/Libraries/robot_nav_2d_msgs) - # to robot_std_msgs (pnkx_robot_nav_core2/src/Libraries/common_msgs/robot_std_msgs) is ../common_msgs/robot_std_msgs - get_filename_component(ROBOT_STD_MSGS_INCLUDE "${CMAKE_CURRENT_SOURCE_DIR}/../common_msgs/robot_std_msgs/include" ABSOLUTE) - get_filename_component(GEOMETRY_MSGS_INCLUDE "${CMAKE_CURRENT_SOURCE_DIR}/../common_msgs/robot_geometry_msgs/include" ABSOLUTE) - target_include_directories(robot_nav_2d_msgs INTERFACE + target_include_directories(${PROJECT_NAME} INTERFACE $ $ ) + +else() + + # Set include directories + target_include_directories(${PROJECT_NAME} + INTERFACE + $ + $ + ) + + # Link dependencies (header-only, chỉ cần include paths) + target_link_libraries(${PROJECT_NAME} + INTERFACE + ${PACKAGES_DIR} + ) + endif() -# Cài đặt header files -if(NOT BUILDING_WITH_CATKIN) - install(DIRECTORY include/robot_nav_2d_msgs - DESTINATION include - FILES_MATCHING PATTERN "*.h") -endif() +if(BUILDING_WITH_CATKIN) + ## Mark libraries for installation + ## See http://docs.ros.org/melodic/api/catkin/html/howto/format1/building_libraries.html + install(TARGETS ${PROJECT_NAME} + ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} + LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} + RUNTIME DESTINATION ${CATKIN_GLOBAL_BIN_DESTINATION} + ) -# Cài đặt target -install(TARGETS robot_nav_2d_msgs - EXPORT robot_nav_2d_msgs-targets - ARCHIVE DESTINATION lib - LIBRARY DESTINATION lib - RUNTIME DESTINATION bin) + ## Mark cpp header files for installation + install(DIRECTORY include/${PROJECT_NAME}/ + DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION} + FILES_MATCHING PATTERN "*.h" + PATTERN ".svn" EXCLUDE + ) +else() -# Export targets -# Bây giờ có thể export dependencies vì robot_std_msgs và geometry_msgs đã được export -install(EXPORT robot_nav_2d_msgs-targets - FILE robot_nav_2d_msgs-targets.cmake - NAMESPACE robot_nav_2d_msgs:: - DESTINATION lib/cmake/robot_nav_2d_msgs) + install(TARGETS ${PROJECT_NAME} + EXPORT ${PROJECT_NAME}-targets + ARCHIVE DESTINATION lib + LIBRARY DESTINATION lib + RUNTIME DESTINATION bin + ) -# In thông tin cấu hình -message(STATUS "=================================") -message(STATUS "Project: ${PROJECT_NAME} (Header-Only)") -message(STATUS "Version: ${PROJECT_VERSION}") -message(STATUS "C++ Standard: ${CMAKE_CXX_STANDARD}") -message(STATUS "Headers found:") -foreach(hdr ${HEADERS}) + # Export targets + install(EXPORT ${PROJECT_NAME}-targets + FILE ${PROJECT_NAME}-targets.cmake + NAMESPACE ${PROJECT_NAME}:: + DESTINATION lib/cmake/${PROJECT_NAME} + ) + + ## Mark cpp header files for installation + install(DIRECTORY include/${PROJECT_NAME}/ + DESTINATION include + FILES_MATCHING PATTERN "*.h" + PATTERN ".svn" EXCLUDE + ) + + # Print configuration info + message(STATUS "=================================") + message(STATUS "Project: ${PROJECT_NAME} (Header-Only)") + message(STATUS "Version: ${PROJECT_VERSION}") + message(STATUS "C++ Standard: ${CMAKE_CXX_STANDARD}") + message(STATUS "Headers found:") + foreach(hdr ${HEADERS}) message(STATUS " - ${hdr}") -endforeach() -message(STATUS "Dependencies: robot_std_msgs, geometry_msgs") -message(STATUS "=================================") - + endforeach() + message(STATUS "Dependencies: robot_std_msgs, geometry_msgs") + message(STATUS "=================================") +endif() diff --git a/src/Libraries/robot_nav_2d_msgs/package.xml b/src/Libraries/robot_nav_2d_msgs/package.xml index ec19a12..03d59ed 100755 --- a/src/Libraries/robot_nav_2d_msgs/package.xml +++ b/src/Libraries/robot_nav_2d_msgs/package.xml @@ -19,4 +19,8 @@ catkin + robot_std_msgs + robot_geometry_msgs + robot_std_msgs + robot_geometry_msgs \ No newline at end of file diff --git a/src/Libraries/robot_nav_2d_utils/CMakeLists.txt b/src/Libraries/robot_nav_2d_utils/CMakeLists.txt index bed6cbc..db7ba10 100755 --- a/src/Libraries/robot_nav_2d_utils/CMakeLists.txt +++ b/src/Libraries/robot_nav_2d_utils/CMakeLists.txt @@ -1,22 +1,6 @@ -cmake_minimum_required(VERSION 3.10) +cmake_minimum_required(VERSION 3.0.2) project(robot_nav_2d_utils VERSION 1.0.0 LANGUAGES CXX) -set(CMAKE_CXX_STANDARD 17) -set(CMAKE_CXX_STANDARD_REQUIRED ON) -set(CMAKE_CXX_EXTENSIONS OFF) - -# Enable Position Independent Code -set(CMAKE_POSITION_INDEPENDENT_CODE ON) - -# Cấu hình RPATH để tránh cycle trong runtime search path -set(CMAKE_BUILD_RPATH_USE_ORIGIN TRUE) -set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) -set(CMAKE_BUILD_RPATH "${CMAKE_BINARY_DIR}") - -# ======================================================== -# Catkin specific configuration -# ======================================================== - if(DEFINED CATKIN_DEVEL_PREFIX OR DEFINED CATKIN_TOPLEVEL) set(BUILDING_WITH_CATKIN TRUE) message(STATUS "Building robot_nav_2d_utils with Catkin") @@ -26,7 +10,41 @@ else() message(STATUS "Building robot_nav_2d_utils with Standalone CMake") endif() -if(BUILDING_WITH_CATKIN) +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_CXX_EXTENSIONS OFF) + +# Find dependencies +find_package(console_bridge REQUIRED) +find_package(Boost REQUIRED COMPONENTS system thread) + +if (NOT BUILDING_WITH_CATKIN) + +# Enable Position Independent Code + set(CMAKE_POSITION_INDEPENDENT_CODE ON) + +# Cấu hình RPATH để tránh cycle trong runtime search path + set(CMAKE_BUILD_RPATH_USE_ORIGIN TRUE) + set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) + set(CMAKE_BUILD_RPATH "${CMAKE_BINARY_DIR}") + + set(PACKAGES_DIR + robot_nav_2d_msgs + robot_geometry_msgs + robot_nav_msgs + nav_grid + robot_nav_core2 + tf3 + robot_tf3_geometry_msgs + robot_cpp + console_bridge + ) + +else() + +# ======================================================== +# Catkin specific configuration +# ======================================================== find_package(catkin REQUIRED COMPONENTS robot_nav_2d_msgs robot_geometry_msgs @@ -38,183 +56,178 @@ if(BUILDING_WITH_CATKIN) robot_cpp ) +# Find dependencies + find_package(console_bridge REQUIRED) + find_package(Boost REQUIRED COMPONENTS system thread) + catkin_package( INCLUDE_DIRS include LIBRARIES ${PROJECT_NAME}_conversions ${PROJECT_NAME}_path_ops ${PROJECT_NAME}_polygons ${PROJECT_NAME}_bounds ${PROJECT_NAME}_tf_help ${PROJECT_NAME} - # CATKIN_DEPENDS không cần vì dependencies không phải Catkin packages + CATKIN_DEPENDS robot_cpp robot_geometry_msgs robot_nav_2d_msgs robot_nav_msgs nav_grid robot_nav_core2 DEPENDS console_bridge Boost ) + + include_directories( + include + ${catkin_INCLUDE_DIRS} + ${Boost_INCLUDE_DIRS} + ) endif() -# Find dependencies -find_package(console_bridge REQUIRED) -find_package(Boost REQUIRED COMPONENTS system thread) - # Libraries add_library(${PROJECT_NAME}_conversions src/conversions.cpp) -target_include_directories(${PROJECT_NAME}_conversions - PUBLIC - $ - $ -) -target_link_libraries(${PROJECT_NAME}_conversions - PUBLIC - robot_nav_2d_msgs - robot_geometry_msgs - robot_nav_msgs - nav_grid - robot_nav_core2 - robot_cpp - PRIVATE - console_bridge::console_bridge - Boost::system - Boost::thread -) - -set_target_properties(${PROJECT_NAME}_conversions PROPERTIES - LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR} - BUILD_RPATH "${CMAKE_BINARY_DIR}" - INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib" -) - add_library(${PROJECT_NAME}_path_ops src/path_ops.cpp) -target_include_directories(${PROJECT_NAME}_path_ops - PUBLIC - $ - $ -) -target_link_libraries(${PROJECT_NAME}_path_ops - PUBLIC - robot_nav_2d_msgs - robot_geometry_msgs - robot_cpp -) - -set_target_properties(${PROJECT_NAME}_path_ops PROPERTIES - LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR} - BUILD_RPATH "${CMAKE_BINARY_DIR}" - INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib" -) - add_library(${PROJECT_NAME}_polygons src/polygons.cpp src/footprint.cpp) -target_include_directories(${PROJECT_NAME}_polygons - PUBLIC - $ - $ -) - -if(robot_xmlrpcpp_FOUND) - target_include_directories(${PROJECT_NAME}_polygons PRIVATE ${robot_xmlrpcpp_INCLUDE_DIRS}) - target_link_libraries(${PROJECT_NAME}_polygons - PUBLIC robot_nav_2d_msgs robot_geometry_msgs robot_cpp - PRIVATE ${robot_xmlrpcpp_LIBRARIES}) -elseif(XmlRpcCpp_FOUND) - target_include_directories(${PROJECT_NAME}_polygons PRIVATE ${XmlRpcCpp_INCLUDE_DIRS}) - target_link_libraries(${PROJECT_NAME}_polygons - PUBLIC robot_nav_2d_msgs robot_geometry_msgs robot_cpp - PRIVATE ${XmlRpcCpp_LIBRARIES}) -else() - target_include_directories(${PROJECT_NAME}_polygons PRIVATE ${robot_xmlrpcpp_INCLUDE_DIRS}) - target_link_libraries(${PROJECT_NAME}_polygons - PUBLIC robot_nav_2d_msgs robot_geometry_msgs robot_cpp - PRIVATE ${robot_xmlrpcpp_LIBRARIES}) -endif() - -set_target_properties(${PROJECT_NAME}_polygons PROPERTIES - LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR} - BUILD_RPATH "${CMAKE_BINARY_DIR}" - INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib" -) - add_library(${PROJECT_NAME}_bounds src/bounds.cpp) -target_include_directories(${PROJECT_NAME}_bounds - PUBLIC - $ - $ -) -target_link_libraries(${PROJECT_NAME}_bounds - PUBLIC - nav_grid - robot_nav_core2 - robot_cpp -) - -set_target_properties(${PROJECT_NAME}_bounds PROPERTIES - LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR} - BUILD_RPATH "${CMAKE_BINARY_DIR}" - INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib" -) - add_library(${PROJECT_NAME}_tf_help src/tf_help.cpp) -target_include_directories(${PROJECT_NAME}_tf_help +add_library(${PROJECT_NAME} INTERFACE) + +if(BUILDING_WITH_CATKIN) + add_dependencies(${PROJECT_NAME}_conversions ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) + add_dependencies(${PROJECT_NAME}_path_ops ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) + add_dependencies(${PROJECT_NAME}_polygons ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) + add_dependencies(${PROJECT_NAME}_bounds ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) + add_dependencies(${PROJECT_NAME}_tf_help ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) + add_dependencies(${PROJECT_NAME} ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) + + target_link_libraries(${PROJECT_NAME}_conversions ${PACKAGES_DIR} ${Boost_LIBRARIES}) + target_link_libraries(${PROJECT_NAME}_path_ops ${PACKAGES_DIR} ${Boost_LIBRARIES}) + target_link_libraries(${PROJECT_NAME}_polygons ${PACKAGES_DIR} ${Boost_LIBRARIES}) + target_link_libraries(${PROJECT_NAME}_bounds ${PACKAGES_DIR} ${Boost_LIBRARIES}) + target_link_libraries(${PROJECT_NAME}_tf_help ${PACKAGES_DIR} ${Boost_LIBRARIES}) + target_link_libraries(${PROJECT_NAME} INTERFACE ${PACKAGES_DIR} ${Boost_LIBRARIES}) + +else() + + target_link_libraries(${PROJECT_NAME}_conversions + PUBLIC + ${PACKAGES_DIR} + ${Boost_LIBRARIES} + ) + target_link_libraries(${PROJECT_NAME}_path_ops + PUBLIC + ${PACKAGES_DIR} + ${Boost_LIBRARIES} + ) + target_link_libraries(${PROJECT_NAME}_polygons + PUBLIC + ${PACKAGES_DIR} + ${Boost_LIBRARIES} + ) + target_link_libraries(${PROJECT_NAME}_bounds + PUBLIC + ${PACKAGES_DIR} + ${Boost_LIBRARIES} + ) + target_link_libraries(${PROJECT_NAME}_tf_help + PUBLIC + ${PACKAGES_DIR} + ${Boost_LIBRARIES} + ) + target_link_libraries(${PROJECT_NAME} + INTERFACE + ${PACKAGES_DIR} + ${Boost_LIBRARIES} + ) + + set_target_properties(${PROJECT_NAME}_conversions PROPERTIES + LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR} + ) + set_target_properties(${PROJECT_NAME}_path_ops PROPERTIES + LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR} + ) + set_target_properties(${PROJECT_NAME}_polygons PROPERTIES + LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR} + ) + set_target_properties(${PROJECT_NAME}_bounds PROPERTIES + LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR} + ) + set_target_properties(${PROJECT_NAME}_tf_help PROPERTIES + LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR} + ) + # Note: ${PROJECT_NAME} is an INTERFACE library, so it cannot have LIBRARY_OUTPUT_DIRECTORY + + target_include_directories(${PROJECT_NAME}_conversions PUBLIC $ $ -) -target_link_libraries(${PROJECT_NAME}_tf_help - PUBLIC - robot_nav_2d_msgs - robot_geometry_msgs - robot_nav_msgs - robot_nav_core2 - tf3 - robot_tf3_geometry_msgs - robot_cpp -) + ) + target_include_directories(${PROJECT_NAME}_path_ops + PUBLIC + $ + $ + ) + target_include_directories(${PROJECT_NAME}_polygons + PUBLIC + $ + $ + ) + target_include_directories(${PROJECT_NAME}_bounds + PUBLIC + $ + $ + ) + target_include_directories(${PROJECT_NAME}_tf_help + PUBLIC + $ + $ + ) + target_include_directories(${PROJECT_NAME} + INTERFACE + $ + $ + ) -set_target_properties(${PROJECT_NAME}_tf_help PROPERTIES - LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR} - BUILD_RPATH "${CMAKE_BINARY_DIR}" - INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib" -) - -# Create an INTERFACE library that represents all robot_nav_2d_utils libraries -add_library(${PROJECT_NAME} INTERFACE) -target_include_directories(${PROJECT_NAME} - INTERFACE - $ - $ -) -target_link_libraries(${PROJECT_NAME} - INTERFACE - ${PROJECT_NAME}_conversions - ${PROJECT_NAME}_path_ops - ${PROJECT_NAME}_polygons - ${PROJECT_NAME}_bounds - ${PROJECT_NAME}_tf_help - robot_cpp -) - -# Install header files -if(NOT BUILDING_WITH_CATKIN) - install(DIRECTORY include/${PROJECT_NAME} - DESTINATION include - FILES_MATCHING PATTERN "*.h") - - # Install mapbox headers - install(DIRECTORY include/mapbox - DESTINATION include - FILES_MATCHING PATTERN "*.hpp") endif() -# Install targets -install(TARGETS ${PROJECT_NAME} ${PROJECT_NAME}_conversions ${PROJECT_NAME}_path_ops ${PROJECT_NAME}_polygons ${PROJECT_NAME}_bounds ${PROJECT_NAME}_tf_help - EXPORT ${PROJECT_NAME}-targets - ARCHIVE DESTINATION lib - LIBRARY DESTINATION lib - RUNTIME DESTINATION bin) +if(BUILDING_WITH_CATKIN) + ## Mark libraries for installation + ## See http://docs.ros.org/melodic/api/catkin/html/howto/format1/building_libraries.html + install(TARGETS ${PROJECT_NAME} ${PROJECT_NAME}_conversions ${PROJECT_NAME}_path_ops ${PROJECT_NAME}_polygons ${PROJECT_NAME}_bounds ${PROJECT_NAME}_tf_help + ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} + LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} + RUNTIME DESTINATION ${CATKIN_GLOBAL_BIN_DESTINATION} + ) + + ## Mark cpp header files for installation + install(DIRECTORY include/${PROJECT_NAME}/ include/mapbox + DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION} + FILES_MATCHING PATTERN "*.h" PATTERN "*.hpp" + PATTERN ".svn" EXCLUDE + ) +else() + + install(TARGETS ${PROJECT_NAME} ${PROJECT_NAME}_conversions ${PROJECT_NAME}_path_ops ${PROJECT_NAME}_polygons ${PROJECT_NAME}_bounds ${PROJECT_NAME}_tf_help + EXPORT ${PROJECT_NAME}-targets + LIBRARY DESTINATION lib + ARCHIVE DESTINATION lib + RUNTIME DESTINATION bin + ) + + # Export targets + install(EXPORT ${PROJECT_NAME}-targets + FILE ${PROJECT_NAME}-targets.cmake + DESTINATION lib/cmake/${PROJECT_NAME} + ) + + ## Mark cpp header files for installation + install(DIRECTORY include/${PROJECT_NAME}/ include/mapbox + DESTINATION include + FILES_MATCHING PATTERN "*.h" PATTERN "*.hpp" + PATTERN ".svn" EXCLUDE + ) + + # Print configuration info + message(STATUS "=================================") + message(STATUS "Project: ${PROJECT_NAME}") + message(STATUS "Version: ${PROJECT_VERSION}") + message(STATUS "C++ Standard: ${CMAKE_CXX_STANDARD}") + message(STATUS "Libraries: ${PROJECT_NAME}_conversions, ${PROJECT_NAME}_path_ops, ${PROJECT_NAME}_polygons, ${PROJECT_NAME}_bounds, ${PROJECT_NAME}_tf_help") + message(STATUS "Dependencies: robot_nav_2d_msgs, robot_geometry_msgs, robot_nav_msgs, nav_grid, robot_nav_core2, tf3, console_bridge, Boost") + message(STATUS "=================================") +endif() + + + -# Export targets -install(EXPORT ${PROJECT_NAME}-targets - FILE ${PROJECT_NAME}-targets.cmake - NAMESPACE ${PROJECT_NAME}:: - DESTINATION lib/cmake/${PROJECT_NAME}) -# Print configuration info -message(STATUS "=================================") -message(STATUS "Project: ${PROJECT_NAME}") -message(STATUS "Version: ${PROJECT_VERSION}") -message(STATUS "C++ Standard: ${CMAKE_CXX_STANDARD}") -message(STATUS "Libraries: ${PROJECT_NAME}_conversions, ${PROJECT_NAME}_path_ops, ${PROJECT_NAME}_polygons, ${PROJECT_NAME}_bounds, ${PROJECT_NAME}_tf_help") -message(STATUS "Dependencies: robot_nav_2d_msgs, robot_geometry_msgs, robot_nav_msgs, nav_grid, robot_nav_core2, tf3, console_bridge, Boost") -message(STATUS "=================================") diff --git a/src/Libraries/robot_time b/src/Libraries/robot_time index 504de86..6b23f32 160000 --- a/src/Libraries/robot_time +++ b/src/Libraries/robot_time @@ -1 +1 @@ -Subproject commit 504de86ee92a2684564cc3a561f3f534eb798160 +Subproject commit 6b23f32c6e3d3b969c840ef763c5fb22cc2e14d7 diff --git a/src/Libraries/tf3/CMakeLists.txt b/src/Libraries/tf3/CMakeLists.txt index 12ba4b6..450e89c 100644 --- a/src/Libraries/tf3/CMakeLists.txt +++ b/src/Libraries/tf3/CMakeLists.txt @@ -1,113 +1,208 @@ cmake_minimum_required(VERSION 3.0.2) -project(tf3) +project(tf3 VERSION 1.0.0 LANGUAGES CXX) -set(CMAKE_POSITION_INDEPENDENT_CODE ON) - -# Cấu hình RPATH để tránh cycle trong runtime search path -set(CMAKE_BUILD_RPATH_USE_ORIGIN TRUE) -set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) -set(CMAKE_BUILD_RPATH "${CMAKE_BINARY_DIR}") - -# ======================================================== -# Find Packages -# ======================================================== -# ======================================================== -# Dual-mode CMakeLists.txt: Supports both Catkin and Standalone CMake -# ======================================================== - -# Detect if building with Catkin if(DEFINED CATKIN_DEVEL_PREFIX OR DEFINED CATKIN_TOPLEVEL) set(BUILDING_WITH_CATKIN TRUE) + message(STATUS "Building tf3 with Catkin") - find_package(catkin REQUIRED COMPONENTS console_bridge) else() set(BUILDING_WITH_CATKIN FALSE) + message(STATUS "Building tf3 with Standalone CMake") endif() +# C++ Standard - must be set before find_package +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_CXX_EXTENSIONS OFF) + +# Find dependencies find_package(console_bridge REQUIRED) find_package(Boost REQUIRED COMPONENTS system thread) +if (NOT BUILDING_WITH_CATKIN) + + # Enable Position Independent Code + set(CMAKE_POSITION_INDEPENDENT_CODE ON) + + # Cấu hình RPATH để tránh cycle trong runtime search path + set(CMAKE_BUILD_RPATH_USE_ORIGIN TRUE) + set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) + set(CMAKE_BUILD_RPATH "${CMAKE_BINARY_DIR}") + +else() + # ======================================================== # Catkin specific configuration # ======================================================== + find_package(catkin REQUIRED) -if(BUILDING_WITH_CATKIN) - ## The catkin_package macro generates cmake config files for your package catkin_package( INCLUDE_DIRS include - LIBRARIES tf3 - DEPENDS console_bridge + LIBRARIES ${PROJECT_NAME} + DEPENDS console_bridge Boost + ) + + include_directories( + include + ${catkin_INCLUDE_DIRS} + ${console_bridge_INCLUDE_DIRS} ) endif() -include_directories(include ${console_bridge_INCLUDE_DIRS}) -# export user definitions - -#CPP Libraries -add_library(tf3 src/cache.cpp src/buffer_core.cpp src/static_cache.cpp) -target_link_libraries(tf3 ${Boost_LIBRARIES} ${console_bridge_LIBRARIES}) -set_target_properties(tf3 PROPERTIES - LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR} - BUILD_RPATH "${CMAKE_BINARY_DIR}" - INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib" +# Libraries +add_library(${PROJECT_NAME} SHARED + src/cache.cpp + src/buffer_core.cpp + src/static_cache.cpp ) -## Add cmake target dependencies if(BUILDING_WITH_CATKIN) - add_dependencies(tf3 ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) + add_dependencies(${PROJECT_NAME} ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) + + target_include_directories(${PROJECT_NAME} + PUBLIC + $ + $ + ) + + target_link_libraries(${PROJECT_NAME} + PUBLIC ${catkin_LIBRARIES} + PRIVATE Boost::boost Boost::system Boost::thread + PRIVATE console_bridge::console_bridge + ) + +else() + + target_include_directories(${PROJECT_NAME} + PUBLIC + $ + $ + ) + + target_link_libraries(${PROJECT_NAME} + PUBLIC + Boost::boost Boost::system Boost::thread + console_bridge::console_bridge + ) + + set_target_properties(${PROJECT_NAME} PROPERTIES + LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR} + BUILD_RPATH "${CMAKE_BINARY_DIR}" + INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib" + ) + endif() -target_include_directories(tf3 PUBLIC - $ - $) -add_executable(simple_tf3_example examples/simple_tf3_example.cpp) -target_include_directories(simple_tf3_example PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include) -target_link_libraries(simple_tf3_example PRIVATE tf3 pthread ${console_bridge_LIBRARIES}) -set_target_properties(simple_tf3_example PROPERTIES - LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR} -) -# Export target trong mọi trường hợp để các target khác có thể export và phụ thuộc vào nó -install(TARGETS tf3 - EXPORT tf3-targets - ARCHIVE DESTINATION lib - LIBRARY DESTINATION lib - RUNTIME DESTINATION bin -) +if(BUILDING_WITH_CATKIN) + ## Mark libraries for installation + ## See http://docs.ros.org/melodic/api/catkin/html/howto/format1/building_libraries.html + install(TARGETS ${PROJECT_NAME} + ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} + LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} + RUNTIME DESTINATION ${CATKIN_GLOBAL_BIN_DESTINATION} + ) -if(NOT BUILDING_WITH_CATKIN) + ## Mark cpp header files for installation install(DIRECTORY include/${PROJECT_NAME}/ - DESTINATION include/${PROJECT_NAME} + DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION} + FILES_MATCHING PATTERN "*.h" + PATTERN ".svn" EXCLUDE + ) + +else() + + install(TARGETS ${PROJECT_NAME} + EXPORT ${PROJECT_NAME}-targets + ARCHIVE DESTINATION lib + LIBRARY DESTINATION lib + RUNTIME DESTINATION bin + ) + + # Export targets + install(EXPORT ${PROJECT_NAME}-targets + FILE ${PROJECT_NAME}-targets.cmake + NAMESPACE ${PROJECT_NAME}:: + DESTINATION lib/cmake/${PROJECT_NAME} + ) + + ## Mark cpp header files for installation + install(DIRECTORY include/${PROJECT_NAME}/ + DESTINATION include + FILES_MATCHING PATTERN "*.h" + PATTERN ".svn" EXCLUDE + ) + + # Print configuration info + message(STATUS "=================================") + message(STATUS "Project: ${PROJECT_NAME}") + message(STATUS "Version: ${PROJECT_VERSION}") + message(STATUS "C++ Standard: ${CMAKE_CXX_STANDARD}") + message(STATUS "Dependencies: console_bridge, Boost") + message(STATUS "=================================") +endif() + +# ======================================================== +# Example executables +# ======================================================== +if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/examples/simple_tf3_example.cpp) + add_executable(${PROJECT_NAME}_example examples/simple_tf3_example.cpp) + target_include_directories(${PROJECT_NAME}_example PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include) + target_link_libraries(${PROJECT_NAME}_example PRIVATE + ${PROJECT_NAME} + pthread + console_bridge::console_bridge ) endif() -# Export targets - cần trong mọi trường hợp -install(EXPORT tf3-targets - FILE tf3-targets.cmake - NAMESPACE tf3:: - DESTINATION lib/cmake/tf3) - -# Tests +# ======================================================== +# Test executables +# ======================================================== option(BUILD_TESTING "Build tests" OFF) if(BUILD_TESTING) enable_testing() - add_executable(test_cache_unittest test/cache_unittest.cpp) - target_link_libraries(test_cache_unittest tf3 ${console_bridge_LIBRARIES}) + + if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/test/cache_unittest.cpp) + add_executable(${PROJECT_NAME}_cache_test test/cache_unittest.cpp) + target_link_libraries(${PROJECT_NAME}_cache_test PRIVATE + ${PROJECT_NAME} + console_bridge::console_bridge + ) + add_test(NAME ${PROJECT_NAME}_cache_test COMMAND ${PROJECT_NAME}_cache_test) + endif() - add_executable(test_static_cache_unittest test/static_cache_test.cpp) - target_link_libraries(test_static_cache_unittest tf3 ${console_bridge_LIBRARIES}) + if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/test/static_cache_test.cpp) + add_executable(${PROJECT_NAME}_static_cache_test test/static_cache_test.cpp) + target_link_libraries(${PROJECT_NAME}_static_cache_test PRIVATE + ${PROJECT_NAME} + console_bridge::console_bridge + ) + add_test(NAME ${PROJECT_NAME}_static_cache_test COMMAND ${PROJECT_NAME}_static_cache_test) + endif() - add_executable(test_simple test/simple_tf3_core.cpp) - target_link_libraries(test_simple tf3 ${console_bridge_LIBRARIES}) + if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/test/simple_tf3_core.cpp) + add_executable(${PROJECT_NAME}_simple_test test/simple_tf3_core.cpp) + target_link_libraries(${PROJECT_NAME}_simple_test PRIVATE + ${PROJECT_NAME} + console_bridge::console_bridge + ) + add_test(NAME ${PROJECT_NAME}_simple_test COMMAND ${PROJECT_NAME}_simple_test) + endif() - add_executable(speed_test test/speed_test.cpp) - target_link_libraries(speed_test tf3 ${console_bridge_LIBRARIES}) + if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/test/speed_test.cpp) + add_executable(${PROJECT_NAME}_speed_test test/speed_test.cpp) + target_link_libraries(${PROJECT_NAME}_speed_test PRIVATE + ${PROJECT_NAME} + console_bridge::console_bridge + ) + add_test(NAME ${PROJECT_NAME}_speed_test COMMAND ${PROJECT_NAME}_speed_test) + endif() - add_executable(test_transform_datatypes test/test_transform_datatypes.cpp) - target_link_libraries(test_transform_datatypes tf3 ${console_bridge_LIBRARIES}) - - add_test(NAME test_cache_unittest COMMAND test_cache_unittest) - add_test(NAME test_static_cache_unittest COMMAND test_static_cache_unittest) - add_test(NAME test_simple COMMAND test_simple) - add_test(NAME speed_test COMMAND speed_test) - add_test(NAME test_transform_datatypes COMMAND test_transform_datatypes) + if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/test/test_transform_datatypes.cpp) + add_executable(${PROJECT_NAME}_transform_datatypes_test test/test_transform_datatypes.cpp) + target_link_libraries(${PROJECT_NAME}_transform_datatypes_test PRIVATE + ${PROJECT_NAME} + console_bridge::console_bridge + ) + add_test(NAME ${PROJECT_NAME}_transform_datatypes_test COMMAND ${PROJECT_NAME}_transform_datatypes_test) + endif() endif() diff --git a/src/Libraries/tf3/package.xml b/src/Libraries/tf3/package.xml index e2e74f8..35f74df 100644 --- a/src/Libraries/tf3/package.xml +++ b/src/Libraries/tf3/package.xml @@ -19,5 +19,7 @@ catkin - + console_bridge + console_bridge + \ No newline at end of file diff --git a/src/Libraries/voxel_grid b/src/Libraries/voxel_grid index 4303737..3daeae6 160000 --- a/src/Libraries/voxel_grid +++ b/src/Libraries/voxel_grid @@ -1 +1 @@ -Subproject commit 4303737ff92db94dc1bcde2d8a3bef527e76355a +Subproject commit 3daeae614788ff326feb04bfd6ad9d76ffc7a105 diff --git a/src/Libraries/xmlrpcpp b/src/Libraries/xmlrpcpp index 5f7ae12..948405b 160000 --- a/src/Libraries/xmlrpcpp +++ b/src/Libraries/xmlrpcpp @@ -1 +1 @@ -Subproject commit 5f7ae1233dc66c6fa8c75e881b7100f0d77f9a64 +Subproject commit 948405bba436a164cb27f1b24cbb2bcf8ca053b2 diff --git a/src/Navigations/Cores/move_base_core/CMakeLists.txt b/src/Navigations/Cores/move_base_core/CMakeLists.txt index 1cf0697..8b1bd4e 100644 --- a/src/Navigations/Cores/move_base_core/CMakeLists.txt +++ b/src/Navigations/Cores/move_base_core/CMakeLists.txt @@ -1,84 +1,150 @@ -cmake_minimum_required(VERSION 3.10) +cmake_minimum_required(VERSION 3.0.2) project(move_base_core VERSION 1.0.0 LANGUAGES CXX) -# Chuẩn C++ -set(CMAKE_CXX_STANDARD 17) -set(CMAKE_CXX_STANDARD_REQUIRED ON) - -# ======================================================== -# Catkin specific configuration -# ======================================================== if(DEFINED CATKIN_DEVEL_PREFIX OR DEFINED CATKIN_TOPLEVEL) set(BUILDING_WITH_CATKIN TRUE) message(STATUS "Building move_base_core with Catkin") + else() set(BUILDING_WITH_CATKIN FALSE) message(STATUS "Building move_base_core with Standalone CMake") endif() -if(BUILDING_WITH_CATKIN) - find_package(catkin REQUIRED COMPONENTS tf3 robot_time robot_geometry_msgs robot_protocol_msgs robot_nav_2d_msgs) +# C++ Standard - must be set before find_package +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_CXX_EXTENSIONS OFF) + +if (NOT BUILDING_WITH_CATKIN) + + # Enable Position Independent Code + set(CMAKE_POSITION_INDEPENDENT_CODE ON) + + # Cấu hình RPATH để tránh cycle trong runtime search path + set(CMAKE_BUILD_RPATH_USE_ORIGIN TRUE) + set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) + set(CMAKE_BUILD_RPATH "${CMAKE_BINARY_DIR}") + + set(PACKAGES_DIR + tf3 + robot_time + robot_geometry_msgs + robot_protocol_msgs + robot_nav_2d_msgs + ) + +else() + +# ======================================================== +# Catkin specific configuration +# ======================================================== + find_package(catkin REQUIRED COMPONENTS + tf3 + robot_time + robot_geometry_msgs + robot_protocol_msgs + robot_nav_2d_msgs + ) catkin_package( INCLUDE_DIRS include - LIBRARIES move_base_core + # LIBRARIES không cần vì đây là header-only library CATKIN_DEPENDS tf3 robot_time robot_geometry_msgs robot_protocol_msgs robot_nav_2d_msgs - # CATKIN_DEPENDS không cần vì dependencies không phải Catkin packages + ) + + include_directories( + include + ${catkin_INCLUDE_DIRS} ) endif() # Tìm tất cả header files -file(GLOB HEADERS "include/move_base_core/*.h") +file(GLOB_RECURSE HEADERS "include/move_base_core/*.h") + # Tạo INTERFACE library (header-only) -add_library(move_base_core INTERFACE) +add_library(${PROJECT_NAME} INTERFACE) -# Set include directories trước khi link libraries -target_include_directories(move_base_core - INTERFACE - $ - $ -) - -# Link với dependencies - include directories sẽ được truyền tự động qua INTERFACE properties if(BUILDING_WITH_CATKIN) - target_link_libraries(move_base_core INTERFACE ${catkin_TARGETS}) -else() - target_link_libraries(move_base_core - INTERFACE - tf3 - robot_time - robot_geometry_msgs - robot_protocol_msgs - robot_nav_2d_msgs # Thêm vì navigation.h include robot_nav_2d_msgs/Twist2DStamped.h + add_dependencies(${PROJECT_NAME} ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) + + # Set include directories + target_include_directories(${PROJECT_NAME} + INTERFACE + $ + $ ) + + # Link dependencies (header-only, chỉ cần include paths) + target_link_libraries(${PROJECT_NAME} + INTERFACE + ${catkin_LIBRARIES} + ) + +else() + + # Set include directories + target_include_directories(${PROJECT_NAME} + INTERFACE + $ + $ + ) + + # Link dependencies (header-only, chỉ cần include paths) + target_link_libraries(${PROJECT_NAME} + INTERFACE + ${PACKAGES_DIR} + ) + endif() -# Cài đặt header files -if(NOT BUILDING_WITH_CATKIN) - install(DIRECTORY include/move_base_core - DESTINATION include - FILES_MATCHING PATTERN "*.h") -endif() +if(BUILDING_WITH_CATKIN) + ## Mark libraries for installation + ## See http://docs.ros.org/melodic/api/catkin/html/howto/format1/building_libraries.html + install(TARGETS ${PROJECT_NAME} + ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} + LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} + RUNTIME DESTINATION ${CATKIN_GLOBAL_BIN_DESTINATION} + ) -# Cài đặt target -install(TARGETS move_base_core - EXPORT move_base_core-targets - LIBRARY DESTINATION lib - ARCHIVE DESTINATION lib - RUNTIME DESTINATION bin) + ## Mark cpp header files for installation + install(DIRECTORY include/${PROJECT_NAME}/ + DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION} + FILES_MATCHING PATTERN "*.h" + PATTERN ".svn" EXCLUDE + ) -# Export targets -install(EXPORT move_base_core-targets - FILE move_base_core-targets.cmake - DESTINATION lib/cmake/move_base_core) +else() -# In thông tin cấu hình -message(STATUS "=================================") -message(STATUS "Project: ${PROJECT_NAME} (Header-Only)") -message(STATUS "Version: ${PROJECT_VERSION}") -message(STATUS "C++ Standard: ${CMAKE_CXX_STANDARD}") -message(STATUS "Headers found:") -foreach(hdr ${HEADERS}) + install(TARGETS ${PROJECT_NAME} + EXPORT ${PROJECT_NAME}-targets + ARCHIVE DESTINATION lib + LIBRARY DESTINATION lib + RUNTIME DESTINATION bin + ) + + # Export targets + install(EXPORT ${PROJECT_NAME}-targets + FILE ${PROJECT_NAME}-targets.cmake + NAMESPACE ${PROJECT_NAME}:: + DESTINATION lib/cmake/${PROJECT_NAME} + ) + + ## Mark cpp header files for installation + install(DIRECTORY include/${PROJECT_NAME}/ + DESTINATION include + FILES_MATCHING PATTERN "*.h" + PATTERN ".svn" EXCLUDE + ) + + # Print configuration info + message(STATUS "=================================") + message(STATUS "Project: ${PROJECT_NAME} (Header-Only)") + message(STATUS "Version: ${PROJECT_VERSION}") + message(STATUS "C++ Standard: ${CMAKE_CXX_STANDARD}") + message(STATUS "Headers found:") + foreach(hdr ${HEADERS}) message(STATUS " - ${hdr}") -endforeach() -message(STATUS "=================================") \ No newline at end of file + endforeach() + message(STATUS "Dependencies: tf3, robot_time, robot_geometry_msgs, robot_protocol_msgs, robot_nav_2d_msgs") + message(STATUS "=================================") +endif() diff --git a/src/Navigations/Cores/robot_nav_core/CMakeLists.txt b/src/Navigations/Cores/robot_nav_core/CMakeLists.txt index 2063b22..d56828c 100644 --- a/src/Navigations/Cores/robot_nav_core/CMakeLists.txt +++ b/src/Navigations/Cores/robot_nav_core/CMakeLists.txt @@ -1,120 +1,146 @@ -cmake_minimum_required(VERSION 3.10) +cmake_minimum_required(VERSION 3.0.2) +project(robot_nav_core VERSION 1.0.0 LANGUAGES CXX) -# ======================================================== -# Dual-mode CMakeLists.txt: Supports both Catkin and Standalone CMake -# ======================================================== - -# Detect if building with Catkin if(DEFINED CATKIN_DEVEL_PREFIX OR DEFINED CATKIN_TOPLEVEL) set(BUILDING_WITH_CATKIN TRUE) message(STATUS "Building robot_nav_core with Catkin") + else() set(BUILDING_WITH_CATKIN FALSE) message(STATUS "Building robot_nav_core with Standalone CMake") endif() -# Tên dự án -project(robot_nav_core VERSION 1.0.0 LANGUAGES CXX) - -# Chuẩn C++ +# C++ Standard - must be set before find_package set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_CXX_EXTENSIONS OFF) -# ======================================================== -# Find dependencies -# ======================================================== +if (NOT BUILDING_WITH_CATKIN) -if(BUILDING_WITH_CATKIN) - find_package(catkin REQUIRED COMPONENTS + # Enable Position Independent Code + set(CMAKE_POSITION_INDEPENDENT_CODE ON) + + # Cấu hình RPATH để tránh cycle trong runtime search path + set(CMAKE_BUILD_RPATH_USE_ORIGIN TRUE) + set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) + set(CMAKE_BUILD_RPATH "${CMAKE_BINARY_DIR}") + + set(PACKAGES_DIR robot_costmap_2d tf3 robot_protocol_msgs ) -endif() + +else() # ======================================================== # Catkin specific configuration # ======================================================== + find_package(catkin REQUIRED COMPONENTS + robot_costmap_2d + tf3 + robot_protocol_msgs + ) -if(BUILDING_WITH_CATKIN) catkin_package( INCLUDE_DIRS include - # Header-only library; keep LIBRARIES for visibility when exporting - LIBRARIES robot_nav_core + # LIBRARIES không cần vì đây là header-only library CATKIN_DEPENDS robot_costmap_2d tf3 robot_protocol_msgs ) + + include_directories( + include + ${catkin_INCLUDE_DIRS} + ) endif() -# Cho phép các project khác include được header của robot_nav_core -set(${PROJECT_NAME}_INCLUDE_DIRS - ${CMAKE_CURRENT_SOURCE_DIR}/include - PARENT_SCOPE -) - -include_directories( - ${PROJECT_SOURCE_DIR}/include -) - -if(BUILDING_WITH_CATKIN) - include_directories(${catkin_INCLUDE_DIRS}) -endif() +# Tìm tất cả header files +file(GLOB_RECURSE HEADERS "include/robot_nav_core/*.h") # Tạo INTERFACE library (header-only) add_library(${PROJECT_NAME} INTERFACE) -# Link libraries -if(BUILDING_WITH_CATKIN) - target_link_libraries(${PROJECT_NAME} INTERFACE - ${catkin_LIBRARIES} - ) -else() - target_link_libraries(${PROJECT_NAME} INTERFACE - robot_costmap_2d - tf3 - robot_protocol_msgs - ) -endif() - if(BUILDING_WITH_CATKIN) add_dependencies(${PROJECT_NAME} ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) -endif() -# Set include directories -target_include_directories(${PROJECT_NAME} + # Set include directories + target_include_directories(${PROJECT_NAME} INTERFACE - $ - $ -) + $ + $ + ) -# ======================================================== -# Installation -# ======================================================== + # Link dependencies (header-only, chỉ cần include paths) + target_link_libraries(${PROJECT_NAME} + INTERFACE + ${catkin_LIBRARIES} + ) -install(TARGETS ${PROJECT_NAME} - EXPORT ${PROJECT_NAME}-targets - LIBRARY DESTINATION lib - ARCHIVE DESTINATION lib - RUNTIME DESTINATION bin) +else() + + # Set include directories + target_include_directories(${PROJECT_NAME} + INTERFACE + $ + $ + ) + + # Link dependencies (header-only, chỉ cần include paths) + target_link_libraries(${PROJECT_NAME} + INTERFACE + ${PACKAGES_DIR} + ) -if(NOT BUILDING_WITH_CATKIN) - # Cài đặt header files (standalone) - install(DIRECTORY include/${PROJECT_NAME} - DESTINATION include - FILES_MATCHING PATTERN "*.h") endif() -# Export targets -install(EXPORT ${PROJECT_NAME}-targets - FILE ${PROJECT_NAME}-targets.cmake - DESTINATION lib/cmake/${PROJECT_NAME}) +if(BUILDING_WITH_CATKIN) + ## Mark libraries for installation + ## See http://docs.ros.org/melodic/api/catkin/html/howto/format1/building_libraries.html + install(TARGETS ${PROJECT_NAME} + ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} + LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} + RUNTIME DESTINATION ${CATKIN_GLOBAL_BIN_DESTINATION} + ) -# In thông tin cấu hình -message(STATUS "=================================") -message(STATUS "Project: ${PROJECT_NAME} (Header-Only)") -message(STATUS "Version: ${PROJECT_VERSION}") -message(STATUS "C++ Standard: ${CMAKE_CXX_STANDARD}") -message(STATUS "Headers found:") -foreach(hdr ${HEADERS}) + ## Mark cpp header files for installation + install(DIRECTORY include/${PROJECT_NAME}/ + DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION} + FILES_MATCHING PATTERN "*.h" + PATTERN ".svn" EXCLUDE + ) + +else() + + install(TARGETS ${PROJECT_NAME} + EXPORT ${PROJECT_NAME}-targets + ARCHIVE DESTINATION lib + LIBRARY DESTINATION lib + RUNTIME DESTINATION bin + ) + + # Export targets + install(EXPORT ${PROJECT_NAME}-targets + FILE ${PROJECT_NAME}-targets.cmake + NAMESPACE ${PROJECT_NAME}:: + DESTINATION lib/cmake/${PROJECT_NAME} + ) + + ## Mark cpp header files for installation + install(DIRECTORY include/${PROJECT_NAME}/ + DESTINATION include + FILES_MATCHING PATTERN "*.h" + PATTERN ".svn" EXCLUDE + ) + + # Print configuration info + message(STATUS "=================================") + message(STATUS "Project: ${PROJECT_NAME} (Header-Only)") + message(STATUS "Version: ${PROJECT_VERSION}") + message(STATUS "C++ Standard: ${CMAKE_CXX_STANDARD}") + message(STATUS "Headers found:") + foreach(hdr ${HEADERS}) message(STATUS " - ${hdr}") -endforeach() -message(STATUS "=================================") \ No newline at end of file + endforeach() + message(STATUS "Dependencies: robot_costmap_2d, tf3, robot_protocol_msgs") + message(STATUS "=================================") +endif() diff --git a/src/Navigations/Cores/robot_nav_core2/CMakeLists.txt b/src/Navigations/Cores/robot_nav_core2/CMakeLists.txt index 83eaf01..e4f86a3 100755 --- a/src/Navigations/Cores/robot_nav_core2/CMakeLists.txt +++ b/src/Navigations/Cores/robot_nav_core2/CMakeLists.txt @@ -1,138 +1,152 @@ -cmake_minimum_required(VERSION 3.10) +cmake_minimum_required(VERSION 3.0.2) +project(robot_nav_core2 VERSION 1.0.0 LANGUAGES CXX) -# ======================================================== -# Dual-mode CMakeLists.txt: Supports both Catkin and Standalone CMake -# ======================================================== - -# Detect if building with Catkin if(DEFINED CATKIN_DEVEL_PREFIX OR DEFINED CATKIN_TOPLEVEL) set(BUILDING_WITH_CATKIN TRUE) message(STATUS "Building robot_nav_core2 with Catkin") + else() set(BUILDING_WITH_CATKIN FALSE) message(STATUS "Building robot_nav_core2 with Standalone CMake") endif() -# Tên dự án -project(robot_nav_core2 VERSION 1.0.0 LANGUAGES CXX) - -# Chuẩn C++ +# C++ Standard - must be set before find_package set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_CXX_EXTENSIONS OFF) -# ======================================================== -# Find dependencies -# ======================================================== +if (NOT BUILDING_WITH_CATKIN) -if(BUILDING_WITH_CATKIN) - find_package(catkin REQUIRED COMPONENTS + # Enable Position Independent Code + set(CMAKE_POSITION_INDEPENDENT_CODE ON) + + # Cấu hình RPATH để tránh cycle trong runtime search path + set(CMAKE_BUILD_RPATH_USE_ORIGIN TRUE) + set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) + set(CMAKE_BUILD_RPATH "${CMAKE_BINARY_DIR}") + + set(PACKAGES_DIR robot_costmap_2d tf3 nav_grid robot_nav_2d_msgs robot_cpp - robot_sensor_msgs - robot_std_msgs - geometry_msgs - robot_nav_msgs - robot_map_msgs - robot_laser_geometry - robot_visualization_msgs - robot_voxel_grid - robot_tf3_geometry_msgs - robot_tf3_sensor_msgs - data_convert - robot_xmlrpcpp + robot_geometry_msgs ) -endif() + +else() # ======================================================== # Catkin specific configuration # ======================================================== + find_package(catkin REQUIRED COMPONENTS + robot_costmap_2d + tf3 + nav_grid + robot_nav_2d_msgs + robot_cpp + robot_geometry_msgs + ) -if(BUILDING_WITH_CATKIN) catkin_package( INCLUDE_DIRS include - # Header-only library; keep LIBRARIES for visibility when exporting - LIBRARIES robot_nav_core2 - CATKIN_DEPENDS robot_costmap_2d tf3 nav_grid robot_nav_2d_msgs robot_cpp + # LIBRARIES không cần vì đây là header-only library + CATKIN_DEPENDS robot_costmap_2d tf3 nav_grid robot_nav_2d_msgs robot_cpp robot_geometry_msgs + ) + + include_directories( + include + ${catkin_INCLUDE_DIRS} ) endif() -# Cho phép các project khác include được header của robot_nav_core2 -set(robot_nav_core2_INCLUDE_DIRS - ${CMAKE_CURRENT_SOURCE_DIR}/include - PARENT_SCOPE -) - -include_directories( - ${PROJECT_SOURCE_DIR}/include -) - -if(BUILDING_WITH_CATKIN) - include_directories(${catkin_INCLUDE_DIRS}) -endif() - # Tìm tất cả header files -file(GLOB HEADERS "include/robot_nav_core2/*.h") +file(GLOB_RECURSE HEADERS "include/robot_nav_core2/*.h") # Tạo INTERFACE library (header-only) add_library(${PROJECT_NAME} INTERFACE) -# Link libraries -if(BUILDING_WITH_CATKIN) - target_link_libraries(${PROJECT_NAME} INTERFACE - ${catkin_LIBRARIES} - ) -else() - target_link_libraries(${PROJECT_NAME} INTERFACE - robot_costmap_2d - tf3 - nav_grid - robot_nav_2d_msgs - robot_cpp - ) -endif() - if(BUILDING_WITH_CATKIN) add_dependencies(${PROJECT_NAME} ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) -endif() -# Set include directories -target_include_directories(${PROJECT_NAME} + # Set include directories + target_include_directories(${PROJECT_NAME} INTERFACE - $ - $ -) + $ + $ + ) -# ======================================================== -# Installation -# ======================================================== + # Link dependencies (header-only, chỉ cần include paths) + target_link_libraries(${PROJECT_NAME} + INTERFACE + ${catkin_LIBRARIES} + ) -# Cài đặt target -install(TARGETS ${PROJECT_NAME} - EXPORT ${PROJECT_NAME}-targets) +else() + + # Set include directories + target_include_directories(${PROJECT_NAME} + INTERFACE + $ + $ + ) + + # Link dependencies (header-only, chỉ cần include paths) + target_link_libraries(${PROJECT_NAME} + INTERFACE + ${PACKAGES_DIR} + ) -if(NOT BUILDING_WITH_CATKIN) - # Cài đặt header files (standalone) - install(DIRECTORY include/${PROJECT_NAME} - DESTINATION include - FILES_MATCHING PATTERN "*.h") endif() -# Export targets -install(EXPORT ${PROJECT_NAME}-targets - FILE ${PROJECT_NAME}-targets.cmake - NAMESPACE ${PROJECT_NAME}:: - DESTINATION lib/cmake/${PROJECT_NAME}) +if(BUILDING_WITH_CATKIN) + ## Mark libraries for installation + ## See http://docs.ros.org/melodic/api/catkin/html/howto/format1/building_libraries.html + install(TARGETS ${PROJECT_NAME} + ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} + LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} + RUNTIME DESTINATION ${CATKIN_GLOBAL_BIN_DESTINATION} + ) -# In thông tin cấu hình -message(STATUS "=================================") -message(STATUS "Project: ${PROJECT_NAME} (Header-Only)") -message(STATUS "Version: ${PROJECT_VERSION}") -message(STATUS "C++ Standard: ${CMAKE_CXX_STANDARD}") -message(STATUS "Headers found:") -foreach(hdr ${HEADERS}) + ## Mark cpp header files for installation + install(DIRECTORY include/${PROJECT_NAME}/ + DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION} + FILES_MATCHING PATTERN "*.h" + PATTERN ".svn" EXCLUDE + ) + +else() + + install(TARGETS ${PROJECT_NAME} + EXPORT ${PROJECT_NAME}-targets + ARCHIVE DESTINATION lib + LIBRARY DESTINATION lib + RUNTIME DESTINATION bin + ) + + # Export targets + install(EXPORT ${PROJECT_NAME}-targets + FILE ${PROJECT_NAME}-targets.cmake + NAMESPACE ${PROJECT_NAME}:: + DESTINATION lib/cmake/${PROJECT_NAME} + ) + + ## Mark cpp header files for installation + install(DIRECTORY include/${PROJECT_NAME}/ + DESTINATION include + FILES_MATCHING PATTERN "*.h" + PATTERN ".svn" EXCLUDE + ) + + # Print configuration info + message(STATUS "=================================") + message(STATUS "Project: ${PROJECT_NAME} (Header-Only)") + message(STATUS "Version: ${PROJECT_VERSION}") + message(STATUS "C++ Standard: ${CMAKE_CXX_STANDARD}") + message(STATUS "Headers found:") + foreach(hdr ${HEADERS}) message(STATUS " - ${hdr}") -endforeach() -message(STATUS "=================================") \ No newline at end of file + endforeach() + message(STATUS "Dependencies: robot_costmap_2d, tf3, nav_grid, robot_nav_2d_msgs, robot_cpp, robot_geometry_msgs") + message(STATUS "=================================") +endif() diff --git a/src/Navigations/Cores/robot_nav_core2/package.xml b/src/Navigations/Cores/robot_nav_core2/package.xml index 1689471..b82cebc 100644 --- a/src/Navigations/Cores/robot_nav_core2/package.xml +++ b/src/Navigations/Cores/robot_nav_core2/package.xml @@ -34,4 +34,7 @@ robot_cpp robot_cpp + robot_geometry_msgs + robot_geometry_msgs + \ No newline at end of file diff --git a/src/Navigations/Cores/robot_nav_core_adapter/CMakeLists.txt b/src/Navigations/Cores/robot_nav_core_adapter/CMakeLists.txt index f130068..9f6f595 100755 --- a/src/Navigations/Cores/robot_nav_core_adapter/CMakeLists.txt +++ b/src/Navigations/Cores/robot_nav_core_adapter/CMakeLists.txt @@ -1,38 +1,35 @@ -cmake_minimum_required(VERSION 3.10) +cmake_minimum_required(VERSION 3.0.2) +project(robot_nav_core_adapter VERSION 1.0.0 LANGUAGES CXX) -# ======================================================== -# Dual-mode CMakeLists.txt: Supports both Catkin and Standalone CMake -# ======================================================== - -# Detect if building with Catkin if(DEFINED CATKIN_DEVEL_PREFIX OR DEFINED CATKIN_TOPLEVEL) set(BUILDING_WITH_CATKIN TRUE) message(STATUS "Building robot_nav_core_adapter with Catkin") + else() set(BUILDING_WITH_CATKIN FALSE) message(STATUS "Building robot_nav_core_adapter with Standalone CMake") endif() -# Tên dự án -project(robot_nav_core_adapter VERSION 1.0.0 LANGUAGES CXX) - -# Chuẩn C++ +# C++ Standard - must be set before find_package set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_CXX_EXTENSIONS OFF) -if(NOT CMAKE_BUILD_TYPE) - set(CMAKE_BUILD_TYPE Release) -endif() - -# ======================================================== # Find dependencies -# ======================================================== - -# Find system dependencies find_package(Boost REQUIRED COMPONENTS filesystem system) +find_package(Threads REQUIRED) -if(BUILDING_WITH_CATKIN) - find_package(catkin REQUIRED COMPONENTS +if (NOT BUILDING_WITH_CATKIN) + + # Enable Position Independent Code + set(CMAKE_POSITION_INDEPENDENT_CODE ON) + + # Cấu hình RPATH để tránh cycle trong runtime search path + set(CMAKE_BUILD_RPATH_USE_ORIGIN TRUE) + set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) + set(CMAKE_BUILD_RPATH "${CMAKE_BINARY_DIR}") + + set(PACKAGES_DIR geometry_msgs robot_std_msgs robot_nav_core @@ -40,173 +37,208 @@ if(BUILDING_WITH_CATKIN) robot_nav_2d_utils robot_cpp ) -endif() -# Dependencies packages (internal libraries) -set(PACKAGES_DIR geometry_msgs robot_std_msgs robot_nav_core robot_nav_core2 robot_nav_2d_utils pthread) +else() # ======================================================== # Catkin specific configuration # ======================================================== + find_package(catkin REQUIRED COMPONENTS + geometry_msgs + robot_std_msgs + robot_nav_core + robot_nav_core2 + robot_nav_2d_utils + robot_cpp + ) -if(BUILDING_WITH_CATKIN) catkin_package( INCLUDE_DIRS include LIBRARIES costmap_adapter local_planner_adapter global_planner_adapter CATKIN_DEPENDS geometry_msgs robot_std_msgs robot_nav_core robot_nav_core2 robot_nav_2d_utils robot_cpp + DEPENDS Boost + ) + + include_directories( + include + ${catkin_INCLUDE_DIRS} + ${Boost_INCLUDE_DIRS} ) endif() -# Thư mục include -include_directories( - ${PROJECT_SOURCE_DIR}/include +# ======================================================== +# Libraries +# ======================================================== +add_library(costmap_adapter SHARED + src/costmap_adapter.cpp ) -if(BUILDING_WITH_CATKIN) - include_directories(${catkin_INCLUDE_DIRS}) -endif() +add_library(local_planner_adapter SHARED + src/local_planner_adapter.cpp +) -# ======================================================== -# Build -# ======================================================== - -# Tạo thư viện shared (.so) -add_library(costmap_adapter src/costmap_adapter.cpp) - -# Link libraries -if(BUILDING_WITH_CATKIN) - target_link_libraries(costmap_adapter - PRIVATE ${catkin_LIBRARIES} - ) -else() - target_link_libraries(costmap_adapter - PRIVATE ${PACKAGES_DIR} - ) -endif() -target_include_directories(costmap_adapter PUBLIC - $ - $) - -add_library(local_planner_adapter src/local_planner_adapter.cpp) - -if(BUILDING_WITH_CATKIN) - target_link_libraries(local_planner_adapter - PRIVATE - Boost::filesystem - Boost::system - dl - costmap_adapter - ${catkin_LIBRARIES} - ) -else() - target_link_libraries(local_planner_adapter - PRIVATE - Boost::filesystem - Boost::system - dl - costmap_adapter - robot_cpp - ${PACKAGES_DIR} - ) -endif() -target_include_directories(local_planner_adapter PRIVATE - $ - $) - -add_library(global_planner_adapter src/global_planner_adapter.cpp) - -if(BUILDING_WITH_CATKIN) - target_link_libraries(global_planner_adapter - PRIVATE - Boost::filesystem - Boost::system - dl - costmap_adapter - ${catkin_LIBRARIES} - ) -else() - target_link_libraries(global_planner_adapter - PRIVATE - Boost::filesystem - Boost::system - dl - costmap_adapter - ${PACKAGES_DIR} - ) -endif() +add_library(global_planner_adapter SHARED + src/global_planner_adapter.cpp +) if(BUILDING_WITH_CATKIN) add_dependencies(costmap_adapter ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) add_dependencies(local_planner_adapter ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) add_dependencies(global_planner_adapter ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) + + # costmap_adapter + target_include_directories(costmap_adapter + PUBLIC + $ + $ + ) + + target_link_libraries(costmap_adapter + PUBLIC ${catkin_LIBRARIES} + ) + + # local_planner_adapter + target_include_directories(local_planner_adapter + PUBLIC + $ + $ + ) + + target_link_libraries(local_planner_adapter + PUBLIC costmap_adapter + PRIVATE ${catkin_LIBRARIES} + PRIVATE Boost::filesystem Boost::system + PRIVATE dl + PRIVATE robot_cpp + ) + + # global_planner_adapter + target_include_directories(global_planner_adapter + PUBLIC + $ + $ + ) + + target_link_libraries(global_planner_adapter + PUBLIC costmap_adapter + PRIVATE ${catkin_LIBRARIES} + PRIVATE Boost::filesystem Boost::system + PRIVATE dl + ) + +else() + + # costmap_adapter + target_include_directories(costmap_adapter + PUBLIC + $ + $ + ) + + target_link_libraries(costmap_adapter + PUBLIC + ${PACKAGES_DIR} + ) + + set_target_properties(costmap_adapter PROPERTIES + LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR} + BUILD_RPATH "${CMAKE_BINARY_DIR}" + INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib" + ) + + # local_planner_adapter + target_include_directories(local_planner_adapter + PUBLIC + $ + $ + ) + + target_link_libraries(local_planner_adapter + PUBLIC costmap_adapter + PRIVATE + ${PACKAGES_DIR} + Boost::filesystem Boost::system + dl + robot_cpp + ) + + set_target_properties(local_planner_adapter PROPERTIES + LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR} + BUILD_RPATH "${CMAKE_BINARY_DIR}" + INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib" + ) + + # global_planner_adapter + target_include_directories(global_planner_adapter + PUBLIC + $ + $ + ) + + target_link_libraries(global_planner_adapter + PUBLIC costmap_adapter + PRIVATE + ${PACKAGES_DIR} + Boost::filesystem Boost::system + dl + ) + + set_target_properties(global_planner_adapter PROPERTIES + LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR} + BUILD_RPATH "${CMAKE_BINARY_DIR}" + INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib" + ) + endif() -target_include_directories(global_planner_adapter PRIVATE - $ - $) - -# Ensure runtime loader prefers in-tree adapter libs over system/ROS libs. -# Without this, dlopen() may resolve libcostmap_adapter.so from /opt/ros/noetic/lib, -# which has a different ABI (Costmap2DROBOT) and causes missing symbols. -set(_ROBOT_NAV_CORE_ADAPTER_RPATH - "${CMAKE_BINARY_DIR}/src/Navigations/Cores/robot_nav_core_adapter" - "${CMAKE_BINARY_DIR}/src/Libraries/robot_costmap_2d" - "${CMAKE_BINARY_DIR}/src/Libraries/tf3" - "${CMAKE_BINARY_DIR}/src/Libraries/robot_time" - "${CMAKE_BINARY_DIR}/src/Libraries/robot_cpp" -) - -set_target_properties(costmap_adapter PROPERTIES - LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR} -) -set_target_properties(local_planner_adapter PROPERTIES - LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR} -) -set_target_properties(global_planner_adapter PROPERTIES - LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR} -) - # ======================================================== -# Installation +# Install # ======================================================== +if(BUILDING_WITH_CATKIN) + ## Mark libraries for installation + ## See http://docs.ros.org/melodic/api/catkin/html/howto/format1/building_libraries.html + install(TARGETS costmap_adapter local_planner_adapter global_planner_adapter + ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} + LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} + RUNTIME DESTINATION ${CATKIN_GLOBAL_BIN_DESTINATION} + ) -# Cài đặt library -install(TARGETS global_planner_adapter local_planner_adapter costmap_adapter - EXPORT robot_nav_core_adapter-targets - LIBRARY DESTINATION lib - ARCHIVE DESTINATION lib - RUNTIME DESTINATION bin) + ## Mark cpp header files for installation + install(DIRECTORY include/${PROJECT_NAME}/ + DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION} + FILES_MATCHING PATTERN "*.h" + PATTERN ".svn" EXCLUDE + ) -if(NOT BUILDING_WITH_CATKIN) - # Cài đặt header files (standalone) - install(DIRECTORY include/robot_nav_core_adapter - DESTINATION include - FILES_MATCHING PATTERN "*.h") +else() + + install(TARGETS costmap_adapter local_planner_adapter global_planner_adapter + EXPORT ${PROJECT_NAME}-targets + ARCHIVE DESTINATION lib + LIBRARY DESTINATION lib + RUNTIME DESTINATION bin + ) + + # Export targets + install(EXPORT ${PROJECT_NAME}-targets + FILE ${PROJECT_NAME}-targets.cmake + NAMESPACE ${PROJECT_NAME}:: + DESTINATION lib/cmake/${PROJECT_NAME} + ) + + ## Mark cpp header files for installation + install(DIRECTORY include/${PROJECT_NAME}/ + DESTINATION include + FILES_MATCHING PATTERN "*.h" + PATTERN ".svn" EXCLUDE + ) + + # Print configuration info + message(STATUS "=================================") + message(STATUS "Project: ${PROJECT_NAME}") + message(STATUS "Version: ${PROJECT_VERSION}") + message(STATUS "C++ Standard: ${CMAKE_CXX_STANDARD}") + message(STATUS "Libraries: costmap_adapter, local_planner_adapter, global_planner_adapter") + message(STATUS "Dependencies: geometry_msgs, robot_std_msgs, robot_nav_core, robot_nav_core2, robot_nav_2d_utils, robot_cpp, Boost") + message(STATUS "=================================") endif() - -# Export targets -install(EXPORT robot_nav_core_adapter-targets - FILE robot_nav_core_adapter-targets.cmake - DESTINATION lib/cmake/robot_nav_core_adapter) - -# Tùy chọn build -option(BUILD_SHARED_LIBS "Build shared libraries" ON) -option(BUILD_TESTS "Build test programs" OFF) - -# Flags biên dịch -# Warning flags - disabled to suppress warnings during build -# set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Wpedantic") -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -w") # -w suppresses all warnings -set(CMAKE_CXX_FLAGS_DEBUG "-g -O0") -set(CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG") - -# In thông tin cấu hình -message(STATUS "=================================") -message(STATUS "Project: ${PROJECT_NAME}") -message(STATUS "Version: ${PROJECT_VERSION}") -message(STATUS "C++ Standard: ${CMAKE_CXX_STANDARD}") -message(STATUS "Headers found:") -foreach(hdr ${HEADERS}) - message(STATUS " - ${hdr}") -endforeach() -message(STATUS "=================================") \ No newline at end of file diff --git a/src/Navigations/Libraries/nav_grid/CMakeLists.txt b/src/Navigations/Libraries/nav_grid/CMakeLists.txt index 1f0384b..c1f3d05 100755 --- a/src/Navigations/Libraries/nav_grid/CMakeLists.txt +++ b/src/Navigations/Libraries/nav_grid/CMakeLists.txt @@ -1,41 +1,48 @@ -cmake_minimum_required(VERSION 3.10) +cmake_minimum_required(VERSION 3.0.2) +project(nav_grid VERSION 1.0.0 LANGUAGES CXX) -# ======================================================== -# Dual-mode CMakeLists.txt: Supports both Catkin and Standalone CMake -# ======================================================== - -# Detect if building with Catkin if(DEFINED CATKIN_DEVEL_PREFIX OR DEFINED CATKIN_TOPLEVEL) set(BUILDING_WITH_CATKIN TRUE) message(STATUS "Building nav_grid with Catkin") + else() set(BUILDING_WITH_CATKIN FALSE) message(STATUS "Building nav_grid with Standalone CMake") endif() -project(nav_grid VERSION 1.0.0 LANGUAGES CXX) - -# Chuẩn C++ +# C++ Standard - must be set before find_package set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) -# ======================================================== # Find dependencies -# ======================================================== +find_package(GTest QUIET) -if(BUILDING_WITH_CATKIN) - find_package(catkin REQUIRED) -endif() +if (NOT BUILDING_WITH_CATKIN) + + # Enable Position Independent Code + set(CMAKE_POSITION_INDEPENDENT_CODE ON) + + # Cấu hình RPATH để tránh cycle trong runtime search path + set(CMAKE_BUILD_RPATH_USE_ORIGIN TRUE) + set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) + set(CMAKE_BUILD_RPATH "${CMAKE_BINARY_DIR}") + +else() # ======================================================== # Catkin specific configuration # ======================================================== + find_package(catkin REQUIRED) -if(BUILDING_WITH_CATKIN) catkin_package( INCLUDE_DIRS include - LIBRARIES nav_grid + # LIBRARIES không cần vì đây là header-only library + ) + + include_directories( + include + ${catkin_INCLUDE_DIRS} ) endif() @@ -43,67 +50,104 @@ endif() file(GLOB_RECURSE HEADERS "include/nav_grid/*.h") # Tạo INTERFACE library (header-only) -add_library(nav_grid INTERFACE) - -# Set include directories -target_include_directories(nav_grid - INTERFACE - $ - $ -) +add_library(${PROJECT_NAME} INTERFACE) if(BUILDING_WITH_CATKIN) - add_dependencies(nav_grid ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) + add_dependencies(${PROJECT_NAME} ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) + + # Set include directories + target_include_directories(${PROJECT_NAME} + INTERFACE + $ + $ + ) + + # Link dependencies (header-only, chỉ cần include paths) + target_link_libraries(${PROJECT_NAME} + INTERFACE + ${catkin_LIBRARIES} + ) + +else() + + # Set include directories + target_include_directories(${PROJECT_NAME} + INTERFACE + $ + $ + ) + endif() -# Cài đặt header files -if(NOT BUILDING_WITH_CATKIN) - install(DIRECTORY include/nav_grid - DESTINATION include - FILES_MATCHING PATTERN "*.h") -endif() +if(BUILDING_WITH_CATKIN) + ## Mark libraries for installation + ## See http://docs.ros.org/melodic/api/catkin/html/howto/format1/building_libraries.html + install(TARGETS ${PROJECT_NAME} + ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} + LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} + RUNTIME DESTINATION ${CATKIN_GLOBAL_BIN_DESTINATION} + ) -# Cài đặt target -install(TARGETS nav_grid - EXPORT nav_grid-targets - ARCHIVE DESTINATION lib - LIBRARY DESTINATION lib - RUNTIME DESTINATION bin) + ## Mark cpp header files for installation + install(DIRECTORY include/${PROJECT_NAME}/ + DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION} + FILES_MATCHING PATTERN "*.h" + PATTERN ".svn" EXCLUDE + ) -# Export targets -install(EXPORT nav_grid-targets - FILE nav_grid-targets.cmake - NAMESPACE nav_grid:: - DESTINATION lib/cmake/nav_grid) +else() -# Tùy chọn build tests -option(BUILD_TESTING "Build test programs" OFF) + install(TARGETS ${PROJECT_NAME} + EXPORT ${PROJECT_NAME}-targets + ARCHIVE DESTINATION lib + LIBRARY DESTINATION lib + RUNTIME DESTINATION bin + ) -if(BUILD_TESTING) - find_package(GTest REQUIRED) - - # Tạo test executable - add_executable(nav_grid_test test/utest.cpp) - target_link_libraries(nav_grid_test - PRIVATE - nav_grid - GTest::GTest - GTest::Main - ) - - # Thêm test vào CTest - enable_testing() - add_test(NAME nav_grid_test COMMAND nav_grid_test) -endif() + # Export targets + install(EXPORT ${PROJECT_NAME}-targets + FILE ${PROJECT_NAME}-targets.cmake + NAMESPACE ${PROJECT_NAME}:: + DESTINATION lib/cmake/${PROJECT_NAME} + ) -# In thông tin cấu hình -message(STATUS "=================================") -message(STATUS "Project: ${PROJECT_NAME} (Header-Only)") -message(STATUS "Version: ${PROJECT_VERSION}") -message(STATUS "C++ Standard: ${CMAKE_CXX_STANDARD}") -message(STATUS "Headers found:") -foreach(hdr ${HEADERS}) + ## Mark cpp header files for installation + install(DIRECTORY include/${PROJECT_NAME}/ + DESTINATION include + FILES_MATCHING PATTERN "*.h" + PATTERN ".svn" EXCLUDE + ) + + # Print configuration info + message(STATUS "=================================") + message(STATUS "Project: ${PROJECT_NAME} (Header-Only)") + message(STATUS "Version: ${PROJECT_VERSION}") + message(STATUS "C++ Standard: ${CMAKE_CXX_STANDARD}") + message(STATUS "Headers found:") + foreach(hdr ${HEADERS}) message(STATUS " - ${hdr}") -endforeach() -message(STATUS "Build tests: ${BUILD_TESTING}") -message(STATUS "=================================") + endforeach() + message(STATUS "Dependencies: None") + message(STATUS "=================================") +endif() + +# ======================================================== +# Test executables +# ======================================================== +if(GTest_FOUND OR GTEST_FOUND) + enable_testing() + find_package(Threads REQUIRED) + + if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/test/utest.cpp) + add_executable(${PROJECT_NAME}_test test/utest.cpp) + target_link_libraries(${PROJECT_NAME}_test PRIVATE + ${PROJECT_NAME} + GTest::GTest + GTest::Main + Threads::Threads + ) + add_test(NAME ${PROJECT_NAME}_test COMMAND ${PROJECT_NAME}_test) + endif() +else() + message(STATUS "Google Test not found. Tests will not be built.") +endif() diff --git a/src/Navigations/Packages/move_base/CMakeLists.txt b/src/Navigations/Packages/move_base/CMakeLists.txt index 1b52695..3f035f8 100644 --- a/src/Navigations/Packages/move_base/CMakeLists.txt +++ b/src/Navigations/Packages/move_base/CMakeLists.txt @@ -1,36 +1,55 @@ -cmake_minimum_required(VERSION 3.10) +cmake_minimum_required(VERSION 3.0.2) +project(move_base VERSION 1.0.0 LANGUAGES CXX) -# ======================================================== -# Dual-mode CMakeLists.txt: Supports both Catkin and Standalone CMake -# ======================================================== - -# Detect if building with Catkin if(DEFINED CATKIN_DEVEL_PREFIX OR DEFINED CATKIN_TOPLEVEL) set(BUILDING_WITH_CATKIN TRUE) message(STATUS "Building move_base with Catkin") + else() set(BUILDING_WITH_CATKIN FALSE) message(STATUS "Building move_base with Standalone CMake") endif() -# Tên dự án -project(move_base VERSION 1.0.0 LANGUAGES CXX) - -# Chuẩn C++ +# C++ Standard - must be set before find_package set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_CXX_EXTENSIONS OFF) -if(NOT CMAKE_BUILD_TYPE) - set(CMAKE_BUILD_TYPE Release) -endif() - -# ======================================================== -# Find Packages -# ======================================================== +# Find dependencies find_package(Boost REQUIRED COMPONENTS filesystem system) +find_package(Threads REQUIRED) +find_package(yaml-cpp REQUIRED) -if(BUILDING_WITH_CATKIN) - find_package(catkin REQUIRED COMPONENTS +if (NOT BUILDING_WITH_CATKIN) + + # Enable Position Independent Code + set(CMAKE_POSITION_INDEPENDENT_CODE ON) + + # Cấu hình RPATH để tránh cycle trong runtime search path + set(CMAKE_BUILD_RPATH_USE_ORIGIN TRUE) + set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) + set(CMAKE_BUILD_RPATH "${CMAKE_BINARY_DIR}") + + set(PACKAGES_DIR + geometry_msgs + robot_std_msgs + move_base_core + robot_nav_core + robot_costmap_2d + plugins + robot_tf3_sensor_msgs + robot_tf3_geometry_msgs + data_convert + robot_nav_2d_utils + robot_cpp + ) + +else() + +# ======================================================== +# Catkin specific configuration +# ======================================================== + find_package(catkin REQUIRED COMPONENTS geometry_msgs robot_std_msgs move_base_core @@ -42,175 +61,145 @@ if(BUILDING_WITH_CATKIN) robot_nav_2d_utils robot_cpp ) -endif() - -# ======================================================== -# Source Files -# ======================================================== -file(GLOB SOURCES "src/move_base.cpp") -file(GLOB HEADERS "include/move_base/move_base.h") - -# ======================================================== -# Catkin specific configuration -# ======================================================== - -if(BUILDING_WITH_CATKIN) catkin_package( INCLUDE_DIRS include - LIBRARIES move_base + LIBRARIES ${PROJECT_NAME} CATKIN_DEPENDS geometry_msgs robot_std_msgs move_base_core robot_nav_core robot_costmap_2d robot_tf3_sensor_msgs robot_tf3_geometry_msgs data_convert robot_nav_2d_utils robot_cpp + DEPENDS Boost yaml-cpp + ) + + include_directories( + include + ${catkin_INCLUDE_DIRS} + ${Boost_INCLUDE_DIRS} ) endif() # ======================================================== -# Include Directories +# Libraries # ======================================================== -include_directories( - ${PROJECT_SOURCE_DIR}/include +add_library(${PROJECT_NAME} SHARED + src/move_base.cpp ) if(BUILDING_WITH_CATKIN) - include_directories(${catkin_INCLUDE_DIRS}) -endif() + add_dependencies(${PROJECT_NAME} ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) + target_include_directories(${PROJECT_NAME} + PUBLIC + $ + $ + ) -# ======================================================== -# RPATH settings: ưu tiên thư viện build tại chỗ -# ======================================================== -set(CMAKE_SKIP_BUILD_RPATH FALSE) -set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE) -set(CMAKE_BUILD_RPATH "${CMAKE_BINARY_DIR}/src/Libraries/robot_costmap_2d:${CMAKE_BINARY_DIR}/src/Libraries/node_handle:${CMAKE_BINARY_DIR}/src/Libraries/tf3:${CMAKE_BINARY_DIR}/src/Libraries/robot_time:${CMAKE_BINARY_DIR}/src/Libraries/xmlrpcpp") -set(CMAKE_INSTALL_RPATH "${CMAKE_BINARY_DIR}/src/Libraries/robot_costmap_2d:${CMAKE_BINARY_DIR}/src/Libraries/node_handle:${CMAKE_BINARY_DIR}/src/Libraries/tf3:${CMAKE_BINARY_DIR}/src/Libraries/robot_time:${CMAKE_BINARY_DIR}/src/Libraries/xmlrpcpp") -set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) - -# ======================================================== -# Create Library -# ======================================================== -add_library(move_base SHARED ${SOURCES} ${HEADERS}) - -# ======================================================== -# Dependencies and Link Libraries -# ======================================================== - -if(BUILDING_WITH_CATKIN) - target_link_libraries(move_base + target_link_libraries(${PROJECT_NAME} PUBLIC ${catkin_LIBRARIES} PRIVATE Boost::filesystem Boost::system - ) -else() - # Standalone CMake mode: link all dependencies manually - set(PACKAGES_DIR - geometry_msgs - robot_std_msgs - move_base_core - robot_nav_core - robot_costmap_2d - plugins # Link với plugins library để có StaticLayer typeinfo - yaml-cpp - robot_tf3_sensor_msgs - robot_tf3_geometry_msgs - data_convert dl - pthread - robot_nav_2d_utils ) - target_link_libraries(move_base - PUBLIC ${PACKAGES_DIR} - PUBLIC robot_cpp - PRIVATE Boost::filesystem Boost::system +else() + + target_include_directories(${PROJECT_NAME} + PUBLIC + $ + $ ) + + target_link_libraries(${PROJECT_NAME} + PUBLIC + ${PACKAGES_DIR} + PRIVATE + Boost::filesystem Boost::system + yaml-cpp + dl + ) + + set_target_properties(${PROJECT_NAME} PROPERTIES + LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR} + BUILD_RPATH "${CMAKE_BINARY_DIR}" + INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib" + ) + endif() -# Set RPATH để ưu tiên thư viện build cục bộ -set_target_properties(move_base PROPERTIES - LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR} -) - -if(BUILDING_WITH_CATKIN) - add_dependencies(move_base ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) -endif() - - -# ======================================================== -# Include Directories for Target -# ======================================================== -target_include_directories(move_base - PUBLIC - $ - $ -) - - # ======================================================== # Executable # ======================================================== -add_executable(move_base_main src/move_base_main.cpp) -target_link_libraries(move_base_main - PRIVATE move_base robot_cpp - PRIVATE Boost::filesystem Boost::system -) +add_executable(${PROJECT_NAME}_main src/move_base_main.cpp) -# Set RPATH for executable to find libraries in build directory first -# Use RPATH instead of RUNPATH for higher priority +if(BUILDING_WITH_CATKIN) + target_link_libraries(${PROJECT_NAME}_main PRIVATE + ${PROJECT_NAME} + robot_cpp + Boost::filesystem Boost::system + dl + ) +else() + target_link_libraries(${PROJECT_NAME}_main PRIVATE + ${PROJECT_NAME} + robot_cpp + Boost::filesystem Boost::system + dl + ) -# Force use of RPATH instead of RUNPATH -set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--disable-new-dtags") + # Configure RPATH to find libraries in devel space + set_target_properties(${PROJECT_NAME}_main PROPERTIES + BUILD_WITH_INSTALL_RPATH FALSE + INSTALL_RPATH_USE_LINK_PATH TRUE + BUILD_RPATH "${CMAKE_BINARY_DIR}" + ) +endif() # ======================================================== -# Installation +# Install # ======================================================== +if(BUILDING_WITH_CATKIN) + ## Mark libraries for installation + ## See http://docs.ros.org/melodic/api/catkin/html/howto/format1/building_libraries.html + install(TARGETS ${PROJECT_NAME} ${PROJECT_NAME}_main + ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} + LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} + RUNTIME DESTINATION ${CATKIN_GLOBAL_BIN_DESTINATION} + ) -if(NOT BUILDING_WITH_CATKIN) - # Standalone CMake installation - install(DIRECTORY include/move_base + ## Mark cpp header files for installation + install(DIRECTORY include/${PROJECT_NAME}/ + DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION} + FILES_MATCHING PATTERN "*.h" + PATTERN ".svn" EXCLUDE + ) + +else() + + install(TARGETS ${PROJECT_NAME} ${PROJECT_NAME}_main + EXPORT ${PROJECT_NAME}-targets + ARCHIVE DESTINATION lib + LIBRARY DESTINATION lib + RUNTIME DESTINATION bin + ) + + # Export targets + install(EXPORT ${PROJECT_NAME}-targets + FILE ${PROJECT_NAME}-targets.cmake + NAMESPACE ${PROJECT_NAME}:: + DESTINATION lib/cmake/${PROJECT_NAME} + ) + + ## Mark cpp header files for installation + install(DIRECTORY include/${PROJECT_NAME}/ DESTINATION include FILES_MATCHING PATTERN "*.h" + PATTERN ".svn" EXCLUDE ) + + # Print configuration info + message(STATUS "=================================") + message(STATUS "Project: ${PROJECT_NAME}") + message(STATUS "Version: ${PROJECT_VERSION}") + message(STATUS "C++ Standard: ${CMAKE_CXX_STANDARD}") + message(STATUS "Libraries: ${PROJECT_NAME}") + message(STATUS "Executables: ${PROJECT_NAME}_main") + message(STATUS "Dependencies: geometry_msgs, robot_std_msgs, move_base_core, robot_nav_core, robot_costmap_2d, robot_tf3_sensor_msgs, robot_tf3_geometry_msgs, data_convert, robot_nav_2d_utils, robot_cpp, Boost, yaml-cpp") + message(STATUS "=================================") endif() - -install(TARGETS move_base move_base_main - EXPORT move_base-targets - LIBRARY DESTINATION lib - ARCHIVE DESTINATION lib - RUNTIME DESTINATION bin -) - -if(NOT BUILDING_WITH_CATKIN) - install(EXPORT move_base-targets - FILE move_base-targets.cmake - DESTINATION lib/cmake/move_base - ) -endif() - - -# ======================================================== -# Build Options -# ======================================================== -option(BUILD_SHARED_LIBS "Build shared libraries" ON) -option(BUILD_TESTS "Build test programs" OFF) - -# ======================================================== -# Compiler Flags -# ======================================================== -# Warning flags - disabled to suppress warnings during build -# set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Wpedantic") -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -w") # -w suppresses all warnings -set(CMAKE_CXX_FLAGS_DEBUG "-g -O0") -set(CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG") - -# ======================================================== -# Status Messages -# ======================================================== -message(STATUS "=================================") -message(STATUS "Project: ${PROJECT_NAME}") -message(STATUS "Version: ${PROJECT_VERSION}") -message(STATUS "Build mode: ${BUILDING_WITH_CATKIN}") -message(STATUS "C++ Standard: ${CMAKE_CXX_STANDARD}") -message(STATUS "Build type: ${CMAKE_BUILD_TYPE}") -message(STATUS "Headers found:") -foreach(hdr ${HEADERS}) - message(STATUS " - ${hdr}") -endforeach() -message(STATUS "=================================")