Compare commits

..

No commits in common. "6054f72ba85e8897b02e136c682a09ad3a79f5f9" and "ca9e100bd91c94975480244be32e6ee0a3fd0f92" have entirely different histories.

35 changed files with 1964 additions and 2631 deletions

View File

@ -1,48 +1,29 @@
cmake_minimum_required(VERSION 3.0.2) cmake_minimum_required(VERSION 3.10)
# Tên d án
project(score_algorithm VERSION 1.0.0 LANGUAGES CXX) project(score_algorithm VERSION 1.0.0 LANGUAGES CXX)
# Chun 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) if(DEFINED CATKIN_DEVEL_PREFIX OR DEFINED CATKIN_TOPLEVEL)
set(BUILDING_WITH_CATKIN TRUE) set(BUILDING_WITH_CATKIN TRUE)
message(STATUS "Building score_algorithm with Catkin") message(STATUS "Building score_algorithm with Catkin")
else() else()
set(BUILDING_WITH_CATKIN FALSE) set(BUILDING_WITH_CATKIN FALSE)
message(STATUS "Building score_algorithm with Standalone CMake") message(STATUS "Building score_algorithm with Standalone CMake")
endif() endif()
# C++ Standard - must be set before find_package if(BUILDING_WITH_CATKIN)
set(CMAKE_CXX_STANDARD 17) ## Find catkin macros and libraries
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)
# Cu 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
robot_nav_core
robot_cpp
mkt_msgs
angles
)
else()
# ========================================================
# Catkin specific configuration
# ========================================================
find_package(catkin REQUIRED COMPONENTS find_package(catkin REQUIRED COMPONENTS
robot_nav_2d_msgs robot_nav_2d_msgs
robot_nav_2d_utils robot_nav_2d_utils
@ -52,107 +33,124 @@ else()
mkt_msgs mkt_msgs
angles angles
) )
endif()
## System dependencies
find_package(Boost REQUIRED COMPONENTS filesystem system)
# ========================================================
# Catkin specific configuration
# ========================================================
if(BUILDING_WITH_CATKIN)
## The catkin_package macro generates cmake config files for your package
catkin_package( catkin_package(
INCLUDE_DIRS include INCLUDE_DIRS include
LIBRARIES ${PROJECT_NAME} LIBRARIES score_algorithm
CATKIN_DEPENDS robot_nav_2d_msgs robot_nav_2d_utils robot_nav_core robot_nav_core2 robot_cpp mkt_msgs angles CATKIN_DEPENDS robot_nav_2d_msgs robot_nav_2d_utils robot_nav_core robot_nav_core2 robot_cpp mkt_msgs
DEPENDS Boost
) )
endif()
# Thư mc include
include_directories( include_directories(
include ${PROJECT_SOURCE_DIR}/include
${catkin_INCLUDE_DIRS}
${Boost_INCLUDE_DIRS}
)
endif()
# Libraries
add_library(${PROJECT_NAME} SHARED
src/score_algorithm.cpp
) )
if(BUILDING_WITH_CATKIN) if(BUILDING_WITH_CATKIN)
add_dependencies(${PROJECT_NAME} ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) include_directories(${catkin_INCLUDE_DIRS})
endif()
# ========================================================
# Build
# ========================================================
target_include_directories(${PROJECT_NAME} # To thư vin shared (.so)
add_library(score_algorithm src/score_algorithm.cpp)
# Link libraries
if(BUILDING_WITH_CATKIN)
target_link_libraries(score_algorithm
PUBLIC PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> ${catkin_LIBRARIES}
$<INSTALL_INTERFACE:include>
)
target_link_libraries(${PROJECT_NAME}
PUBLIC ${catkin_LIBRARIES}
PRIVATE Boost::filesystem Boost::system
)
else()
target_include_directories(${PROJECT_NAME}
PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>
)
target_link_libraries(${PROJECT_NAME}
PUBLIC
${PACKAGES_DIR}
PRIVATE PRIVATE
Boost::filesystem Boost::system Boost::filesystem
Boost::system
) )
else()
set_target_properties(${PROJECT_NAME} PROPERTIES # Standalone mode: link dependencies directly
LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR} target_link_libraries(score_algorithm
BUILD_RPATH "${CMAKE_BINARY_DIR}" PUBLIC
INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib" robot_nav_2d_msgs
robot_nav_2d_utils
robot_nav_core2
robot_nav_core2
robot_cpp
mkt_msgs
angles
PRIVATE
Boost::filesystem
Boost::system
) )
endif() endif()
set_target_properties(score_algorithm PROPERTIES
LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}
)
## Add cmake target dependencies
if(BUILDING_WITH_CATKIN) if(BUILDING_WITH_CATKIN)
## Mark libraries for installation add_dependencies(score_algorithm ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
## See http://docs.ros.org/melodic/api/catkin/html/howto/format1/building_libraries.html endif()
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 target_include_directories(score_algorithm PUBLIC
install(DIRECTORY include/${PROJECT_NAME}/ $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION} $<INSTALL_INTERFACE:include>)
FILES_MATCHING PATTERN "*.h"
PATTERN ".svn" EXCLUDE
)
else() # ========================================================
# Installation
# ========================================================
install(TARGETS ${PROJECT_NAME} # Export target trong mi trưng hp đ các target khác có th export và ph thuc vào nó
EXPORT ${PROJECT_NAME}-targets install(TARGETS score_algorithm
ARCHIVE DESTINATION lib EXPORT score_algorithm-targets
LIBRARY DESTINATION lib LIBRARY DESTINATION lib
RUNTIME DESTINATION bin ARCHIVE DESTINATION lib
) RUNTIME DESTINATION bin)
# Export targets if(NOT BUILDING_WITH_CATKIN)
install(EXPORT ${PROJECT_NAME}-targets # Cài đt header files (chỉ cho standalone mode)
FILE ${PROJECT_NAME}-targets.cmake install(DIRECTORY include/score_algorithm
NAMESPACE ${PROJECT_NAME}::
DESTINATION lib/cmake/${PROJECT_NAME}
)
## Mark cpp header files for installation
install(DIRECTORY include/${PROJECT_NAME}/
DESTINATION include DESTINATION include
FILES_MATCHING PATTERN "*.h" FILES_MATCHING PATTERN "*.h")
PATTERN ".svn" EXCLUDE
)
# Print configuration info # Export targets (chỉ cho standalone mode)
install(EXPORT score_algorithm-targets
FILE score_algorithm-targets.cmake
DESTINATION lib/cmake/score_algorithm)
else()
# Khi build vi Catkin, vn cn export đ các target khác có th export
install(EXPORT score_algorithm-targets
FILE score_algorithm-targets.cmake
DESTINATION lib/cmake/score_algorithm)
endif()
# Tùy chn build
option(BUILD_SHARED_LIBS "Build shared libraries" ON)
option(BUILD_TESTS "Build test programs" OFF)
# Flags biên dch
# 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 cu hình
message(STATUS "=================================") message(STATUS "=================================")
message(STATUS "Project: ${PROJECT_NAME}") message(STATUS "Project: ${PROJECT_NAME}")
message(STATUS "Version: ${PROJECT_VERSION}") message(STATUS "Version: ${PROJECT_VERSION}")
message(STATUS "C++ Standard: ${CMAKE_CXX_STANDARD}") 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 "Headers found:")
foreach(hdr ${HEADERS})
message(STATUS " - ${hdr}")
endforeach()
message(STATUS "=================================") message(STATUS "=================================")
endif()

View File

@ -1,129 +1,70 @@
cmake_minimum_required(VERSION 3.0.2) cmake_minimum_required(VERSION 3.10)
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) if(DEFINED CATKIN_DEVEL_PREFIX OR DEFINED CATKIN_TOPLEVEL)
set(BUILDING_WITH_CATKIN TRUE) set(BUILDING_WITH_CATKIN TRUE)
message(STATUS "Building angles with Catkin") message(STATUS "Building angles with Catkin")
else() else()
set(BUILDING_WITH_CATKIN FALSE) set(BUILDING_WITH_CATKIN FALSE)
message(STATUS "Building angles with Standalone CMake") message(STATUS "Building angles with Standalone CMake")
endif() endif()
# C++ Standard - must be set before find_package project(angles VERSION 1.0.0 LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON) 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) set(CMAKE_POSITION_INDEPENDENT_CODE ON)
# Cu 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 # Catkin specific configuration
# ======================================================== # ========================================================
find_package(catkin REQUIRED)
if(BUILDING_WITH_CATKIN)
find_package(catkin REQUIRED)
catkin_package( catkin_package(
INCLUDE_DIRS include INCLUDE_DIRS include
# LIBRARIES không cn vì đây là header-only library # Header-only library; keep LIBRARIES for visibility when exporting
) LIBRARIES angles
include_directories(
include
${catkin_INCLUDE_DIRS}
) )
endif() endif()
# Tìm tt c header files # Create interface library (header-only)
file(GLOB_RECURSE HEADERS "include/angles/*.h") add_library(angles INTERFACE)
# To INTERFACE library (header-only)
add_library(${PROJECT_NAME} INTERFACE)
if(BUILDING_WITH_CATKIN)
add_dependencies(${PROJECT_NAME} ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
# Set include directories # Set include directories
target_include_directories(${PROJECT_NAME} target_include_directories(angles INTERFACE
INTERFACE
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>
)
# 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
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include> $<INSTALL_INTERFACE:include>
) )
if(BUILDING_WITH_CATKIN)
add_dependencies(angles ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
endif() endif()
if(BUILDING_WITH_CATKIN) # ========================================================
## Mark libraries for installation # 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} install(TARGETS angles
LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} EXPORT angles-targets
RUNTIME DESTINATION ${CATKIN_GLOBAL_BIN_DESTINATION} INCLUDES DESTINATION include
) )
## Mark cpp header files for installation if(NOT BUILDING_WITH_CATKIN)
install(DIRECTORY include/${PROJECT_NAME}/ # Install headers (standalone)
DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION} install(DIRECTORY include/angles
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 DESTINATION include
FILES_MATCHING PATTERN "*.h" FILES_MATCHING PATTERN "*.h"
PATTERN ".svn" EXCLUDE )
endif()
# Export targets
install(EXPORT angles-targets
FILE angles-targets.cmake
DESTINATION lib/cmake/angles
) )
# 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()

View File

@ -1,181 +1,142 @@
cmake_minimum_required(VERSION 3.0.2) cmake_minimum_required(VERSION 3.10)
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) if(DEFINED CATKIN_DEVEL_PREFIX OR DEFINED CATKIN_TOPLEVEL)
set(BUILDING_WITH_CATKIN TRUE) set(BUILDING_WITH_CATKIN TRUE)
message(STATUS "Building kalman with Catkin") message(STATUS "Building kalman with Catkin")
else() else()
set(BUILDING_WITH_CATKIN FALSE) set(BUILDING_WITH_CATKIN FALSE)
message(STATUS "Building kalman with Standalone CMake") message(STATUS "Building kalman with Standalone CMake")
endif() endif()
# C++ Standard - must be set before find_package project(kalman VERSION 1.0.0 LANGUAGES CXX)
# Chun C++
set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
# Find dependencies
find_package(Eigen3 REQUIRED)
if (NOT BUILDING_WITH_CATKIN)
# Enable Position Independent Code
set(CMAKE_POSITION_INDEPENDENT_CODE ON) set(CMAKE_POSITION_INDEPENDENT_CODE ON)
# Cu hình RPATH đ tránh cycle trong runtime search path if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_RPATH_USE_ORIGIN TRUE) set(CMAKE_BUILD_TYPE Release)
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 ${PROJECT_NAME}
DEPENDS Eigen3
)
include_directories(
include
${catkin_INCLUDE_DIRS}
${EIGEN3_INCLUDE_DIRS}
)
endif() endif()
# ======================================================== # ========================================================
# Libraries # Find dependencies
# ======================================================== # ========================================================
add_library(${PROJECT_NAME} SHARED find_package(Eigen3 REQUIRED)
src/kalman.cpp
if(BUILDING_WITH_CATKIN)
find_package(catkin REQUIRED)
catkin_package(
INCLUDE_DIRS include
LIBRARIES kalman
DEPENDS Eigen3
)
endif()
# Thư mc include
include_directories(
${PROJECT_SOURCE_DIR}/include
${EIGEN3_INCLUDE_DIRS}
) )
if(BUILDING_WITH_CATKIN) if(BUILDING_WITH_CATKIN)
add_dependencies(${PROJECT_NAME} ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) include_directories(${catkin_INCLUDE_DIRS})
target_include_directories(${PROJECT_NAME}
PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>
)
target_link_libraries(${PROJECT_NAME}
PUBLIC ${catkin_LIBRARIES}
PRIVATE Eigen3::Eigen
)
else()
target_include_directories(${PROJECT_NAME}
PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>
)
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() endif()
# ======================================================== # Tìm tt c file source
# Test executable file(GLOB SOURCES "src/kalman.cpp")
# ======================================================== file(GLOB HEADERS "include/kalman/kalman.h")
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 # To thư vin shared (.so)
${PROJECT_NAME} add_library(kalman SHARED ${SOURCES} ${HEADERS})
# Link libraries
target_link_libraries(kalman
PUBLIC
Eigen3::Eigen Eigen3::Eigen
$<$<BOOL:${BUILDING_WITH_CATKIN}>:${catkin_LIBRARIES}>
)
set_target_properties(kalman PROPERTIES
LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}
)
# Set include directories
target_include_directories(kalman
PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>
${EIGEN3_INCLUDE_DIRS}
)
if(BUILDING_WITH_CATKIN)
add_dependencies(kalman ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
endif()
# To 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) if(NOT BUILDING_WITH_CATKIN)
# Configure RPATH to find libraries in devel space # Cài đt header files (standalone)
set_target_properties(${PROJECT_NAME}_node PROPERTIES install(DIRECTORY include/kalman
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 DESTINATION include
FILES_MATCHING PATTERN "*.h" 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() endif()
# Print configuration info # Export targets
install(EXPORT kalman-targets
FILE kalman-targets.cmake
DESTINATION lib/cmake/kalman
)
# Tùy chn build
option(BUILD_SHARED_LIBS "Build shared libraries" ON)
option(BUILD_TESTS "Build test programs" OFF)
# Flags biên dch
# 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 cu hình
message(STATUS "=================================") message(STATUS "=================================")
message(STATUS "Project: ${PROJECT_NAME}") message(STATUS "Project: ${PROJECT_NAME}")
message(STATUS "Version: ${PROJECT_VERSION}") message(STATUS "Version: ${PROJECT_VERSION}")
message(STATUS "C++ Standard: ${CMAKE_CXX_STANDARD}") message(STATUS "C++ Standard: ${CMAKE_CXX_STANDARD}")
message(STATUS "Libraries: ${PROJECT_NAME}") message(STATUS "Eigen3 found: ${EIGEN3_FOUND}")
if(TARGET ${PROJECT_NAME}_node) message(STATUS "Eigen3 include dir: ${EIGEN3_INCLUDE_DIRS}")
message(STATUS "Executables: ${PROJECT_NAME}_node")
endif()
message(STATUS "Dependencies: Eigen3")
message(STATUS "=================================") message(STATUS "=================================")
endif()

View File

@ -1,53 +1,36 @@
cmake_minimum_required(VERSION 3.0.2) cmake_minimum_required(VERSION 3.10)
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) if(DEFINED CATKIN_DEVEL_PREFIX OR DEFINED CATKIN_TOPLEVEL)
set(BUILDING_WITH_CATKIN TRUE) set(BUILDING_WITH_CATKIN TRUE)
message(STATUS "Building mkt_algorithm with Catkin") message(STATUS "Building mkt_algorithm with Catkin")
else() else()
set(BUILDING_WITH_CATKIN FALSE) set(BUILDING_WITH_CATKIN FALSE)
message(STATUS "Building mkt_algorithm with Standalone CMake") message(STATUS "Building mkt_algorithm with Standalone CMake")
endif() endif()
# C++ Standard - must be set before find_package project(mkt_algorithm VERSION 1.0.0 LANGUAGES CXX)
# Chun C++
set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF) set(CMAKE_POSITION_INDEPENDENT_CODE ON)
if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE Release)
endif()
# ========================================================
# Find dependencies # Find dependencies
# ========================================================
find_package(Boost REQUIRED COMPONENTS system) find_package(Boost REQUIRED COMPONENTS system)
find_package(Eigen3 REQUIRED) find_package(Eigen3 REQUIRED)
if (NOT BUILDING_WITH_CATKIN) if(BUILDING_WITH_CATKIN)
# Enable Position Independent Code
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
# Cu 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 find_package(catkin REQUIRED COMPONENTS
geometry_msgs geometry_msgs
score_algorithm score_algorithm
@ -61,130 +44,128 @@ else()
robot_std_msgs robot_std_msgs
robot_cpp robot_cpp
) )
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}
${Boost_INCLUDE_DIRS}
)
endif() endif()
# ======================================================== # Thư mc include
# Libraries include_directories(
# ======================================================== ${PROJECT_SOURCE_DIR}/include
add_library(${PROJECT_NAME}_diff SHARED ${EIGEN3_INCLUDE_DIRS}
src/diff/diff_predictive_trajectory.cpp
src/diff/diff_rotate_to_goal.cpp
src/diff/diff_go_straight.cpp
) )
if(BUILDING_WITH_CATKIN) if(BUILDING_WITH_CATKIN)
add_dependencies(${PROJECT_NAME}_diff ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) include_directories(${catkin_INCLUDE_DIRS})
endif()
target_include_directories(${PROJECT_NAME}_diff # 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 tt 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"
)
# To thư vin 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 PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> ${catkin_LIBRARIES}
$<INSTALL_INTERFACE:include> Boost::system
Eigen3::Eigen
) )
target_link_libraries(${PROJECT_NAME}_diff
PUBLIC ${catkin_LIBRARIES}
PRIVATE Boost::system Eigen3::Eigen
)
else() else()
target_link_libraries(mkt_algorithm_diff
target_include_directories(${PROJECT_NAME}_diff
PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>
)
target_link_libraries(${PROJECT_NAME}_diff
PUBLIC PUBLIC
${PACKAGES_DIR} ${PACKAGES_DIR}
PRIVATE robot_cpp
Boost::system Eigen3::Eigen 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() endif()
# ========================================================
# Install
# ========================================================
if(BUILDING_WITH_CATKIN) if(BUILDING_WITH_CATKIN)
## Mark libraries for installation add_dependencies(mkt_algorithm_diff ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
## 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 ${CATKIN_PACKAGE_SHARE_DESTINATION}
)
endif() endif()
else() set_target_properties(mkt_algorithm_diff PROPERTIES
LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}
)
install(TARGETS ${PROJECT_NAME}_diff # Set include directories
EXPORT ${PROJECT_NAME}-targets target_include_directories(mkt_algorithm_diff
ARCHIVE DESTINATION lib PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>
${EIGEN3_INCLUDE_DIRS}
)
# ========================================================
# Installation
# ========================================================
# Cài đt library
install(TARGETS mkt_algorithm_diff
EXPORT mkt_algorithm-targets
LIBRARY DESTINATION lib LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib
RUNTIME DESTINATION bin RUNTIME DESTINATION bin
) )
# Export targets if(NOT BUILDING_WITH_CATKIN)
install(EXPORT ${PROJECT_NAME}-targets # Cài đt header files (standalone)
FILE ${PROJECT_NAME}-targets.cmake install(DIRECTORY include/mkt_algorithm
NAMESPACE ${PROJECT_NAME}::
DESTINATION lib/cmake/${PROJECT_NAME}
)
## Mark cpp header files for installation
install(DIRECTORY include/${PROJECT_NAME}/
DESTINATION include DESTINATION include
FILES_MATCHING PATTERN "*.h" FILES_MATCHING PATTERN "*.h"
PATTERN ".svn" EXCLUDE
) )
endif()
## Install plugins.xml if it exists # Cài đt plugins.xml (nếu cần cho pluginlib)
if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/plugins.xml) if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/plugins.xml)
install(FILES plugins.xml install(FILES plugins.xml
DESTINATION share/${PROJECT_NAME} DESTINATION share/${PROJECT_NAME}
) )
endif() endif()
# Print configuration info # Export targets
install(EXPORT mkt_algorithm-targets
FILE mkt_algorithm-targets.cmake
DESTINATION lib/cmake/mkt_algorithm
)
# Tùy chn build
option(BUILD_SHARED_LIBS "Build shared libraries" ON)
option(BUILD_TESTS "Build test programs" OFF)
# Flags biên dch
# 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 cu hình
message(STATUS "=================================") message(STATUS "=================================")
message(STATUS "Project: ${PROJECT_NAME}") message(STATUS "Project: ${PROJECT_NAME}")
message(STATUS "Version: ${PROJECT_VERSION}") message(STATUS "Version: ${PROJECT_VERSION}")
message(STATUS "C++ Standard: ${CMAKE_CXX_STANDARD}") message(STATUS "C++ Standard: ${CMAKE_CXX_STANDARD}")
message(STATUS "Libraries: ${PROJECT_NAME}_diff") message(STATUS "Eigen3 found: ${EIGEN3_FOUND}")
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 "=================================") message(STATUS "=================================")
endif()

View File

@ -1,136 +1,97 @@
cmake_minimum_required(VERSION 3.0.2) cmake_minimum_required(VERSION 3.10)
# Tên d án
project(mkt_msgs VERSION 1.0.0 LANGUAGES CXX) project(mkt_msgs VERSION 1.0.0 LANGUAGES CXX)
# Chun C++
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# ========================================================
# Find Packages
# ========================================================
if(DEFINED CATKIN_DEVEL_PREFIX OR DEFINED CATKIN_TOPLEVEL) if(DEFINED CATKIN_DEVEL_PREFIX OR DEFINED CATKIN_TOPLEVEL)
set(BUILDING_WITH_CATKIN TRUE) set(BUILDING_WITH_CATKIN TRUE)
message(STATUS "Building mkt_msgs with Catkin") message(STATUS "Building mkt_msgs with Catkin")
else() else()
set(BUILDING_WITH_CATKIN FALSE) set(BUILDING_WITH_CATKIN FALSE)
message(STATUS "Building mkt_msgs with Standalone CMake") message(STATUS "Building mkt_msgs with Standalone CMake")
endif() endif()
# C++ Standard - must be set before find_package if(BUILDING_WITH_CATKIN)
set(CMAKE_CXX_STANDARD 17) ## Find catkin macros and libraries
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)
# Cu 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
)
else()
# ========================================================
# Catkin specific configuration
# ========================================================
find_package(catkin REQUIRED COMPONENTS find_package(catkin REQUIRED COMPONENTS
robot_nav_2d_msgs robot_nav_2d_msgs
geometry_msgs geometry_msgs
) )
endif()
catkin_package( # Cho phép các project khác include đưc header ca mkt_msgs
INCLUDE_DIRS include set(mkt_msgs_INCLUDE_DIRS
# LIBRARIES không cn vì đây là header-only library ${CMAKE_CURRENT_SOURCE_DIR}/include
CATKIN_DEPENDS robot_nav_2d_msgs geometry_msgs PARENT_SCOPE
) )
include_directories( include_directories(
include ${PROJECT_SOURCE_DIR}/include
${catkin_INCLUDE_DIRS} )
if(BUILDING_WITH_CATKIN)
include_directories(${catkin_INCLUDE_DIRS})
endif()
# ========================================================
# Catkin specific configuration
# ========================================================
if(BUILDING_WITH_CATKIN)
## The catkin_package macro generates cmake config files for your package
catkin_package(
INCLUDE_DIRS include
# Header-only library so LIBRARIES is optional; keep for visibility
LIBRARIES mkt_msgs
CATKIN_DEPENDS robot_nav_2d_msgs geometry_msgs
) )
endif() endif()
# Tìm tt c header files # ========================================================
file(GLOB_RECURSE HEADERS "include/mkt_msgs/*.h") # Build (header-only INTERFACE)
# ========================================================
# To INTERFACE library (header-only) add_library(mkt_msgs INTERFACE)
add_library(${PROJECT_NAME} INTERFACE)
if(BUILDING_WITH_CATKIN) if(BUILDING_WITH_CATKIN)
add_dependencies(${PROJECT_NAME} ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) target_link_libraries(mkt_msgs INTERFACE ${catkin_LIBRARIES})
add_dependencies(mkt_msgs ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
else()
target_link_libraries(mkt_msgs INTERFACE robot_nav_2d_msgs geometry_msgs)
endif()
# Set include directories # Set include directories
target_include_directories(${PROJECT_NAME} target_include_directories(mkt_msgs
INTERFACE INTERFACE
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include> $<INSTALL_INTERFACE:include>
) )
# Link dependencies (header-only, chỉ cần include paths) # ========================================================
target_link_libraries(${PROJECT_NAME} # Installation
INTERFACE # ========================================================
${catkin_LIBRARIES}
)
else() install(TARGETS mkt_msgs
EXPORT mkt_msgs-targets
# Set include directories
target_include_directories(${PROJECT_NAME}
INTERFACE
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>
)
# Link dependencies (header-only, chỉ cần include paths)
target_link_libraries(${PROJECT_NAME}
INTERFACE
${PACKAGES_DIR}
)
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}
)
## 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 LIBRARY DESTINATION lib
RUNTIME DESTINATION bin ARCHIVE DESTINATION lib
) RUNTIME DESTINATION bin)
# Export targets # Cài đt header files (cả catkin standalone)
install(EXPORT ${PROJECT_NAME}-targets install(DIRECTORY include/mkt_msgs
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 DESTINATION include
FILES_MATCHING PATTERN "*.h" FILES_MATCHING PATTERN "*.h")
PATTERN ".svn" EXCLUDE
)
# Print configuration info # Export targets (cho cả hai chế độ)
install(EXPORT mkt_msgs-targets
FILE mkt_msgs-targets.cmake
DESTINATION lib/cmake/mkt_msgs)
# In thông tin cu hình
message(STATUS "=================================") message(STATUS "=================================")
message(STATUS "Project: ${PROJECT_NAME} (Header-Only)") message(STATUS "Project: ${PROJECT_NAME} (Header-Only)")
message(STATUS "Version: ${PROJECT_VERSION}") message(STATUS "Version: ${PROJECT_VERSION}")
@ -139,6 +100,4 @@ else()
foreach(hdr ${HEADERS}) foreach(hdr ${HEADERS})
message(STATUS " - ${hdr}") message(STATUS " - ${hdr}")
endforeach() endforeach()
message(STATUS "Dependencies: robot_nav_2d_msgs, geometry_msgs")
message(STATUS "=================================") message(STATUS "=================================")
endif()

View File

@ -1,33 +1,80 @@
cmake_minimum_required(VERSION 3.0.2) cmake_minimum_required(VERSION 3.10)
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) if(DEFINED CATKIN_DEVEL_PREFIX OR DEFINED CATKIN_TOPLEVEL)
set(BUILDING_WITH_CATKIN TRUE) set(BUILDING_WITH_CATKIN TRUE)
message(STATUS "Building mkt_plugins with Catkin") message(STATUS "Building mkt_plugins with Catkin")
else() else()
set(BUILDING_WITH_CATKIN FALSE) set(BUILDING_WITH_CATKIN FALSE)
message(STATUS "Building mkt_plugins with Standalone CMake") message(STATUS "Building mkt_plugins with Standalone CMake")
endif() endif()
# C++ Standard - must be set before find_package project(mkt_plugins VERSION 1.0.0 LANGUAGES CXX)
# Chun C++
set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
# Find dependencies
find_package(Boost REQUIRED COMPONENTS system)
if (NOT BUILDING_WITH_CATKIN)
# Enable Position Independent Code
set(CMAKE_POSITION_INDEPENDENT_CODE ON) set(CMAKE_POSITION_INDEPENDENT_CODE ON)
# Cu hình RPATH đ tránh cycle trong runtime search path # Build type
set(CMAKE_BUILD_RPATH_USE_ORIGIN TRUE) if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) set(CMAKE_BUILD_TYPE Release)
set(CMAKE_BUILD_RPATH "${CMAKE_BINARY_DIR}") endif()
# ========================================================
# Find dependencies
# ========================================================
# Find system dependencies
find_package(Boost REQUIRED COMPONENTS system)
if(BUILDING_WITH_CATKIN)
find_package(catkin REQUIRED COMPONENTS
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
)
endif()
# Flags biên dch
# 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
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
)
endif()
# Thư mc include
include_directories(
${PROJECT_SOURCE_DIR}/include
)
if(BUILDING_WITH_CATKIN)
include_directories(${catkin_INCLUDE_DIRS})
endif()
# Dependencies packages (internal libraries)
set(PACKAGES_DIR set(PACKAGES_DIR
score_algorithm score_algorithm
robot_nav_2d_msgs robot_nav_2d_msgs
@ -40,46 +87,41 @@ if (NOT BUILDING_WITH_CATKIN)
angles angles
) )
else() ###########
## Build ##
###########
# ======================================================== # Library 1: goal_checker
# Catkin specific configuration
# ========================================================
find_package(catkin REQUIRED COMPONENTS
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
)
catkin_package(
INCLUDE_DIRS include
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()
# ========================================================
# Libraries
# ========================================================
add_library(${PROJECT_NAME}_goal_checker SHARED add_library(${PROJECT_NAME}_goal_checker SHARED
src/goal_checker.cpp src/goal_checker.cpp
src/simple_goal_checker.cpp src/simple_goal_checker.cpp
src/equation_line.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
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>
)
# Library 3: standard_traj_generator
add_library(${PROJECT_NAME}_standard_traj_generator SHARED add_library(${PROJECT_NAME}_standard_traj_generator SHARED
src/kinematic_parameters.cpp src/kinematic_parameters.cpp
src/xy_theta_iterator.cpp src/xy_theta_iterator.cpp
@ -88,121 +130,69 @@ add_library(${PROJECT_NAME}_standard_traj_generator SHARED
) )
if(BUILDING_WITH_CATKIN) 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})
target_include_directories(${PROJECT_NAME}_goal_checker
PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>
)
target_include_directories(${PROJECT_NAME}_standard_traj_generator
PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>
)
target_link_libraries(${PROJECT_NAME}_goal_checker
PUBLIC ${catkin_LIBRARIES}
PRIVATE Boost::system
)
target_link_libraries(${PROJECT_NAME}_standard_traj_generator target_link_libraries(${PROJECT_NAME}_standard_traj_generator
PUBLIC ${catkin_LIBRARIES} PUBLIC ${catkin_LIBRARIES}
PRIVATE Boost::system PRIVATE Boost::boost
) )
else() else()
target_include_directories(${PROJECT_NAME}_goal_checker
PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>
)
target_include_directories(${PROJECT_NAME}_standard_traj_generator
PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>
)
target_link_libraries(${PROJECT_NAME}_goal_checker
PUBLIC
${PACKAGES_DIR}
PRIVATE
Boost::system
)
target_link_libraries(${PROJECT_NAME}_standard_traj_generator target_link_libraries(${PROJECT_NAME}_standard_traj_generator
PUBLIC PUBLIC ${PACKAGES_DIR}
${PACKAGES_DIR} PRIVATE Boost::boost
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"
) )
endif()
set_target_properties(${PROJECT_NAME}_standard_traj_generator PROPERTIES set_target_properties(${PROJECT_NAME}_standard_traj_generator PROPERTIES
LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR} LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}
BUILD_RPATH "${CMAKE_BINARY_DIR}"
INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib"
) )
target_include_directories(${PROJECT_NAME}_standard_traj_generator
PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>
)
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() endif()
# ======================================================== #############
# Install ## Install ##
# ======================================================== #############
if(BUILDING_WITH_CATKIN)
## Mark libraries for installation # Cài đt libraries
## See http://docs.ros.org/melodic/api/catkin/html/howto/format1/building_libraries.html install(TARGETS
install(TARGETS ${PROJECT_NAME}_goal_checker ${PROJECT_NAME}_standard_traj_generator ${PROJECT_NAME}_standard_traj_generator
ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} ${PROJECT_NAME}_goal_checker
LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} EXPORT ${PROJECT_NAME}-targets
RUNTIME DESTINATION ${CATKIN_GLOBAL_BIN_DESTINATION} LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib
RUNTIME DESTINATION bin
) )
## Mark cpp header files for installation if(NOT BUILDING_WITH_CATKIN)
# Cài đt header files (standalone)
install(DIRECTORY include/${PROJECT_NAME}/ install(DIRECTORY include/${PROJECT_NAME}/
DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION} DESTINATION include/${PROJECT_NAME}
FILES_MATCHING PATTERN "*.h" FILES_MATCHING PATTERN "*.h"
PATTERN ".svn" EXCLUDE PATTERN ".svn" EXCLUDE
) )
endif()
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 # Export targets
install(EXPORT ${PROJECT_NAME}-targets install(EXPORT ${PROJECT_NAME}-targets
FILE ${PROJECT_NAME}-targets.cmake FILE ${PROJECT_NAME}-targets.cmake
NAMESPACE ${PROJECT_NAME}::
DESTINATION lib/cmake/${PROJECT_NAME} DESTINATION lib/cmake/${PROJECT_NAME}
) )
## Mark cpp header files for installation # Tùy chn build
install(DIRECTORY include/${PROJECT_NAME}/ option(BUILD_SHARED_LIBS "Build shared libraries" ON)
DESTINATION include option(BUILD_TESTS "Build test programs" OFF)
FILES_MATCHING PATTERN "*.h"
PATTERN ".svn" EXCLUDE
)
# Print configuration info # In thông tin cu hình
message(STATUS "=================================") message(STATUS "=================================")
message(STATUS "Project: ${PROJECT_NAME}") message(STATUS "Project: ${PROJECT_NAME}")
message(STATUS "Version: ${PROJECT_VERSION}") message(STATUS "Version: ${PROJECT_VERSION}")
message(STATUS "C++ Standard: ${CMAKE_CXX_STANDARD}") message(STATUS "C++ Standard: ${CMAKE_CXX_STANDARD}")
message(STATUS "Libraries: ${PROJECT_NAME}_goal_checker, ${PROJECT_NAME}_standard_traj_generator") message(STATUS "Build type: ${CMAKE_BUILD_TYPE}")
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 "=================================") message(STATUS "=================================")
endif()

@ -1 +1 @@
Subproject commit 540d79321b53ef36a4979f15c6e36b759c134e07 Subproject commit 0b01c22019b66c905d6d67611d333742e1e37a55

@ -1 +1 @@
Subproject commit c4ae3961ab21c5a2fc48bdcfa9007369fa2efe4c Subproject commit 22aa83fe5a66f5c090bcb8c1fafb41cfe777ebc1

View File

@ -1,165 +1,166 @@
cmake_minimum_required(VERSION 3.0.2) cmake_minimum_required(VERSION 3.10)
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) if(DEFINED CATKIN_DEVEL_PREFIX OR DEFINED CATKIN_TOPLEVEL)
set(BUILDING_WITH_CATKIN TRUE) set(BUILDING_WITH_CATKIN TRUE)
message(STATUS "Building two_points_planner with Catkin") message(STATUS "Building two_points_planner with Catkin")
else() else()
set(BUILDING_WITH_CATKIN FALSE) set(BUILDING_WITH_CATKIN FALSE)
message(STATUS "Building two_points_planner with Standalone CMake") message(STATUS "Building two_points_planner with Standalone CMake")
endif() endif()
# C++ Standard - must be set before find_package # Tên d án
project(two_points_planner VERSION 1.0.0 LANGUAGES CXX)
# Chun C++
set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON) 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) set(CMAKE_POSITION_INDEPENDENT_CODE ON)
# Cu hình RPATH đ tránh cycle trong runtime search path # Build type
set(CMAKE_BUILD_RPATH_USE_ORIGIN TRUE) if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) set(CMAKE_BUILD_TYPE Release)
set(CMAKE_BUILD_RPATH "${CMAKE_BINARY_DIR}") endif()
set(PACKAGES_DIR # ========================================================
# Find dependencies
# ========================================================
# Find system dependencies
find_package(Boost REQUIRED COMPONENTS filesystem system)
if(BUILDING_WITH_CATKIN)
find_package(catkin REQUIRED COMPONENTS
robot_costmap_2d robot_costmap_2d
robot_nav_core robot_nav_core
robot_geometry_msgs geometry_msgs
robot_nav_msgs robot_nav_msgs
robot_std_msgs
tf3 tf3
robot_tf3_geometry_msgs robot_tf3_geometry_msgs
robot_time
robot_cpp robot_cpp
) )
endif()
else()
# ======================================================== # ========================================================
# Catkin specific configuration # Catkin specific configuration
# ======================================================== # ========================================================
find_package(catkin REQUIRED COMPONENTS
robot_costmap_2d
robot_nav_core
robot_geometry_msgs
robot_nav_msgs
tf3
robot_tf3_geometry_msgs
robot_time
robot_cpp
)
if(BUILDING_WITH_CATKIN)
catkin_package( catkin_package(
INCLUDE_DIRS include INCLUDE_DIRS include
LIBRARIES ${PROJECT_NAME} LIBRARIES two_points_planner
CATKIN_DEPENDS robot_costmap_2d robot_nav_core robot_geometry_msgs robot_nav_msgs tf3 robot_tf3_geometry_msgs robot_time robot_cpp CATKIN_DEPENDS robot_costmap_2d robot_nav_core geometry_msgs robot_nav_msgs robot_std_msgs tf3 robot_tf3_geometry_msgs robot_cpp
DEPENDS Boost
) )
endif()
# Thư mc include
include_directories( include_directories(
include ${PROJECT_SOURCE_DIR}/include
${catkin_INCLUDE_DIRS}
${Boost_INCLUDE_DIRS}
)
endif()
# ========================================================
# Libraries
# ========================================================
add_library(${PROJECT_NAME} SHARED
src/two_points_planner.cpp
) )
if(BUILDING_WITH_CATKIN) if(BUILDING_WITH_CATKIN)
add_dependencies(${PROJECT_NAME} ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) include_directories(${catkin_INCLUDE_DIRS})
endif()
target_include_directories(${PROJECT_NAME} # Tìm tt c file source
PUBLIC file(GLOB SOURCES "src/two_points_planner.cpp")
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> file(GLOB HEADERS "include/two_points_planner/*.h")
$<INSTALL_INTERFACE:include>
# Dependencies packages (internal libraries)
set(PACKAGES_DIR
robot_costmap_2d
robot_nav_core
geometry_msgs
robot_nav_msgs
robot_std_msgs
tf3
robot_tf3_geometry_msgs
) )
target_link_libraries(${PROJECT_NAME} # To thư vin 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} PUBLIC ${catkin_LIBRARIES}
PRIVATE Boost::filesystem Boost::system PRIVATE Boost::filesystem
PRIVATE Boost::system
)
else()
target_link_libraries(two_points_planner
PUBLIC ${PACKAGES_DIR}
PUBLIC robot_cpp
PRIVATE Boost::boost
)
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}
) )
else() # Set include directories
target_include_directories(two_points_planner
target_include_directories(${PROJECT_NAME}
PUBLIC PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include> $<INSTALL_INTERFACE:include>
) )
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()
# ======================================================== # ========================================================
# Install # 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}
)
## Mark cpp header files for installation # Cài đt library
install(DIRECTORY include/${PROJECT_NAME}/ install(TARGETS two_points_planner
DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION} EXPORT two_points_planner-targets
FILES_MATCHING PATTERN "*.h"
PATTERN ".svn" EXCLUDE
)
else()
install(TARGETS ${PROJECT_NAME}
EXPORT ${PROJECT_NAME}-targets
ARCHIVE DESTINATION lib
LIBRARY DESTINATION lib LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib
RUNTIME DESTINATION bin RUNTIME DESTINATION bin
) )
# Export targets if(NOT BUILDING_WITH_CATKIN)
install(EXPORT ${PROJECT_NAME}-targets # Cài đt header files (standalone)
FILE ${PROJECT_NAME}-targets.cmake install(DIRECTORY include/two_points_planner
NAMESPACE ${PROJECT_NAME}::
DESTINATION lib/cmake/${PROJECT_NAME}
)
## Mark cpp header files for installation
install(DIRECTORY include/${PROJECT_NAME}/
DESTINATION include DESTINATION include
FILES_MATCHING PATTERN "*.h" FILES_MATCHING PATTERN "*.h"
PATTERN ".svn" EXCLUDE PATTERN ".svn" EXCLUDE
) )
endif()
# Print configuration info # Export targets
install(EXPORT two_points_planner-targets
FILE two_points_planner-targets.cmake
DESTINATION lib/cmake/two_points_planner
)
# Tùy chn build
option(BUILD_SHARED_LIBS "Build shared libraries" ON)
option(BUILD_TESTS "Build test programs" OFF)
# Flags biên dch
# 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 cu hình
message(STATUS "=================================") message(STATUS "=================================")
message(STATUS "Project: ${PROJECT_NAME}") message(STATUS "Project: two_points_planner")
message(STATUS "Version: ${PROJECT_VERSION}") message(STATUS "Version: ${PROJECT_VERSION}")
message(STATUS "C++ Standard: ${CMAKE_CXX_STANDARD}") 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 "Build type: ${CMAKE_BUILD_TYPE}")
message(STATUS "Headers found:")
foreach(hdr ${HEADERS})
message(STATUS " - ${hdr}")
endforeach()
message(STATUS "=================================") message(STATUS "=================================")
endif()

View File

@ -25,21 +25,21 @@
<build_depend>robot_nav_core</build_depend> <build_depend>robot_nav_core</build_depend>
<run_depend>robot_nav_core</run_depend> <run_depend>robot_nav_core</run_depend>
<build_depend>robot_geometry_msgs</build_depend> <build_depend>geometry_msgs</build_depend>
<run_depend>robot_geometry_msgs</run_depend> <run_depend>geometry_msgs</run_depend>
<build_depend>robot_nav_msgs</build_depend> <build_depend>robot_nav_msgs</build_depend>
<run_depend>robot_nav_msgs</run_depend> <run_depend>robot_nav_msgs</run_depend>
<build_depend>robot_std_msgs</build_depend>
<run_depend>robot_std_msgs</run_depend>
<build_depend>tf3</build_depend> <build_depend>tf3</build_depend>
<run_depend>tf3</run_depend> <run_depend>tf3</run_depend>
<build_depend>robot_tf3_geometry_msgs</build_depend> <build_depend>robot_tf3_geometry_msgs</build_depend>
<run_depend>robot_tf3_geometry_msgs</run_depend> <run_depend>robot_tf3_geometry_msgs</run_depend>
<build_depend>robot_time</build_depend>
<run_depend>robot_time</run_depend>
<build_depend>robot_cpp</build_depend> <build_depend>robot_cpp</build_depend>
<run_depend>robot_cpp</run_depend> <run_depend>robot_cpp</run_depend>

View File

@ -1,39 +1,44 @@
cmake_minimum_required(VERSION 3.0.2) cmake_minimum_required(VERSION 3.10)
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) if(DEFINED CATKIN_DEVEL_PREFIX OR DEFINED CATKIN_TOPLEVEL)
set(BUILDING_WITH_CATKIN TRUE) set(BUILDING_WITH_CATKIN TRUE)
message(STATUS "Building pnkx_local_planner with Catkin") message(STATUS "Building pnkx_local_planner with Catkin")
else() else()
set(BUILDING_WITH_CATKIN FALSE) set(BUILDING_WITH_CATKIN FALSE)
message(STATUS "Building pnkx_local_planner with Standalone CMake") message(STATUS "Building pnkx_local_planner with Standalone CMake")
endif() endif()
# C++ Standard - must be set before find_package project(pnkx_local_planner VERSION 1.0.0 LANGUAGES CXX)
# Chun C++
set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
# Find dependencies
find_package(Boost REQUIRED COMPONENTS system)
if (NOT BUILDING_WITH_CATKIN)
# Enable Position Independent Code
set(CMAKE_POSITION_INDEPENDENT_CODE ON) set(CMAKE_POSITION_INDEPENDENT_CODE ON)
# Cu hình RPATH đ tránh cycle trong runtime search path # Build type
set(CMAKE_BUILD_RPATH_USE_ORIGIN TRUE) if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) set(CMAKE_BUILD_TYPE Release)
set(CMAKE_BUILD_RPATH "${CMAKE_BINARY_DIR}") endif()
set(PACKAGES_DIR # ========================================================
robot_geometry_msgs # Find dependencies
# ========================================================
# Find system dependencies
find_package(Boost REQUIRED COMPONENTS system)
if(BUILDING_WITH_CATKIN)
find_package(catkin REQUIRED COMPONENTS
geometry_msgs
robot_nav_msgs robot_nav_msgs
robot_std_msgs robot_std_msgs
robot_sensor_msgs
robot_visualization_msgs robot_visualization_msgs
robot_nav_2d_msgs
robot_nav_2d_utils robot_nav_2d_utils
robot_nav_core2 robot_nav_core2
mkt_msgs mkt_msgs
@ -41,22 +46,47 @@ if (NOT BUILDING_WITH_CATKIN)
robot_costmap_2d robot_costmap_2d
tf3 tf3
robot_tf3_geometry_msgs robot_tf3_geometry_msgs
data_convert robot_tf3_sensor_msgs
robot_cpp robot_cpp
angles angles
) )
endif()
else() # Flags biên dch
# 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 # Catkin specific configuration
# ======================================================== # ========================================================
find_package(catkin REQUIRED COMPONENTS
robot_geometry_msgs 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ư mc 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
robot_nav_msgs robot_nav_msgs
robot_std_msgs robot_std_msgs
robot_sensor_msgs
robot_visualization_msgs robot_visualization_msgs
robot_nav_2d_msgs
robot_nav_2d_utils robot_nav_2d_utils
robot_nav_core2 robot_nav_core2
mkt_msgs mkt_msgs
@ -64,172 +94,125 @@ else()
robot_costmap_2d robot_costmap_2d
tf3 tf3
robot_tf3_geometry_msgs robot_tf3_geometry_msgs
data_convert robot_tf3_sensor_msgs
robot_cpp robot_cpp
angles angles
) )
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()
# ========================================================
# Libraries
# ========================================================
# To thư vin utils trưc # To thư vin utils trưc
add_library(${PROJECT_NAME}_utils SHARED add_library(${PROJECT_NAME}_utils SHARED
src/transforms.cpp 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
)
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
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>
)
# To thư vin chính # To thư vin chính
add_library(${PROJECT_NAME} SHARED add_library(${PROJECT_NAME} SHARED
src/pnkx_local_planner.cpp src/pnkx_local_planner.cpp
# src/pnkx_docking_local_planner.cpp
src/pnkx_go_straight_local_planner.cpp src/pnkx_go_straight_local_planner.cpp
src/pnkx_rotate_local_planner.cpp src/pnkx_rotate_local_planner.cpp
) )
# Link libraries cho thư vin chính
if(BUILDING_WITH_CATKIN) 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})
target_include_directories(${PROJECT_NAME}_utils
PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>
)
target_include_directories(${PROJECT_NAME}
PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>
)
target_link_libraries(${PROJECT_NAME}_utils
PUBLIC ${catkin_LIBRARIES}
PRIVATE Boost::system
)
target_link_libraries(${PROJECT_NAME} target_link_libraries(${PROJECT_NAME}
PUBLIC ${PROJECT_NAME}_utils PUBLIC ${PROJECT_NAME}_utils
PUBLIC ${catkin_LIBRARIES} PUBLIC ${catkin_LIBRARIES}
PRIVATE Boost::system PRIVATE Boost::boost
) )
else() else()
target_include_directories(${PROJECT_NAME}_utils
PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>
)
target_include_directories(${PROJECT_NAME}
PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>
)
target_link_libraries(${PROJECT_NAME}_utils
PUBLIC
${PACKAGES_DIR}
PRIVATE
Boost::system
)
target_link_libraries(${PROJECT_NAME} target_link_libraries(${PROJECT_NAME}
PUBLIC ${PROJECT_NAME}_utils PUBLIC ${PROJECT_NAME}_utils
PUBLIC PUBLIC ${PACKAGES_DIR}
${PACKAGES_DIR} PRIVATE Boost::boost
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"
) )
endif()
set_target_properties(${PROJECT_NAME} PROPERTIES set_target_properties(${PROJECT_NAME} PROPERTIES
LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR} LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}
BUILD_RPATH "${CMAKE_BINARY_DIR}"
INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib"
) )
# Set include directories cho thư vin chính
target_include_directories(${PROJECT_NAME}
PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>
)
# 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() endif()
# ======================================================== # Tùy chn build
# Install option(BUILD_SHARED_LIBS "Build shared libraries" ON)
# ======================================================== option(BUILD_TESTS "Build test programs" OFF)
if(BUILDING_WITH_CATKIN)
## Mark libraries for installation #############
## See http://docs.ros.org/melodic/api/catkin/html/howto/format1/building_libraries.html ## Install ##
#############
# Cài đt libraries
install(TARGETS ${PROJECT_NAME} ${PROJECT_NAME}_utils install(TARGETS ${PROJECT_NAME} ${PROJECT_NAME}_utils
ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} EXPORT ${PROJECT_NAME}-targets
LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} LIBRARY DESTINATION lib
RUNTIME DESTINATION ${CATKIN_GLOBAL_BIN_DESTINATION} ARCHIVE DESTINATION lib
RUNTIME DESTINATION bin
) )
## Mark cpp header files for installation if(NOT BUILDING_WITH_CATKIN)
# Cài đt header files (standalone)
install(DIRECTORY include/${PROJECT_NAME}/ install(DIRECTORY include/${PROJECT_NAME}/
DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION} DESTINATION include/${PROJECT_NAME}
FILES_MATCHING PATTERN "*.h" FILES_MATCHING PATTERN "*.h"
PATTERN ".svn" EXCLUDE 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()
else()
install(TARGETS ${PROJECT_NAME} ${PROJECT_NAME}_utils
EXPORT ${PROJECT_NAME}-targets
ARCHIVE DESTINATION lib
LIBRARY DESTINATION lib
RUNTIME DESTINATION bin
)
# Export targets # Export targets
install(EXPORT ${PROJECT_NAME}-targets install(EXPORT ${PROJECT_NAME}-targets
FILE ${PROJECT_NAME}-targets.cmake FILE ${PROJECT_NAME}-targets.cmake
NAMESPACE ${PROJECT_NAME}::
DESTINATION lib/cmake/${PROJECT_NAME} DESTINATION lib/cmake/${PROJECT_NAME}
) )
## Mark cpp header files for installation # Cài đt plugins.xml nếu có
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) if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/plugins.xml)
install(FILES plugins.xml install(FILES
plugins.xml
DESTINATION share/${PROJECT_NAME} DESTINATION share/${PROJECT_NAME}
) )
endif() endif()
# Print configuration info # In thông tin cu hình
message(STATUS "=================================") message(STATUS "=================================")
message(STATUS "Project: ${PROJECT_NAME}") message(STATUS "Project: ${PROJECT_NAME}")
message(STATUS "Version: ${PROJECT_VERSION}") message(STATUS "Version: ${PROJECT_VERSION}")
message(STATUS "C++ Standard: ${CMAKE_CXX_STANDARD}") message(STATUS "C++ Standard: ${CMAKE_CXX_STANDARD}")
message(STATUS "Libraries: ${PROJECT_NAME}, ${PROJECT_NAME}_utils") message(STATUS "Build type: ${CMAKE_BUILD_TYPE}")
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 "=================================") message(STATUS "=================================")
endif()

View File

@ -19,8 +19,8 @@
<buildtool_depend version_gte="0.5.68">catkin</buildtool_depend> <buildtool_depend version_gte="0.5.68">catkin</buildtool_depend>
<build_depend>robot_geometry_msgs</build_depend> <build_depend>geometry_msgs</build_depend>
<run_depend>robot_geometry_msgs</run_depend> <run_depend>geometry_msgs</run_depend>
<build_depend>robot_nav_msgs</build_depend> <build_depend>robot_nav_msgs</build_depend>
<run_depend>robot_nav_msgs</run_depend> <run_depend>robot_nav_msgs</run_depend>
@ -28,12 +28,12 @@
<build_depend>robot_std_msgs</build_depend> <build_depend>robot_std_msgs</build_depend>
<run_depend>robot_std_msgs</run_depend> <run_depend>robot_std_msgs</run_depend>
<build_depend>robot_sensor_msgs</build_depend>
<run_depend>robot_sensor_msgs</run_depend>
<build_depend>robot_visualization_msgs</build_depend> <build_depend>robot_visualization_msgs</build_depend>
<run_depend>robot_visualization_msgs</run_depend> <run_depend>robot_visualization_msgs</run_depend>
<build_depend>robot_nav_2d_msgs</build_depend>
<run_depend>robot_nav_2d_msgs</run_depend>
<build_depend>robot_nav_2d_utils</build_depend> <build_depend>robot_nav_2d_utils</build_depend>
<run_depend>robot_nav_2d_utils</run_depend> <run_depend>robot_nav_2d_utils</run_depend>
@ -55,8 +55,8 @@
<build_depend>robot_tf3_geometry_msgs</build_depend> <build_depend>robot_tf3_geometry_msgs</build_depend>
<run_depend>robot_tf3_geometry_msgs</run_depend> <run_depend>robot_tf3_geometry_msgs</run_depend>
<build_depend>data_convert</build_depend> <build_depend>robot_tf3_sensor_msgs</build_depend>
<run_depend>data_convert</run_depend> <run_depend>robot_tf3_sensor_msgs</run_depend>
<build_depend>robot_cpp</build_depend> <build_depend>robot_cpp</build_depend>
<run_depend>robot_cpp</run_depend> <run_depend>robot_cpp</run_depend>

@ -1 +1 @@
Subproject commit b8b0528f1e649b93ff07b3458aa01f251b286405 Subproject commit 1df5ed676fe374c63665d434f4d8b2c9923d41a1

@ -1 +1 @@
Subproject commit f052dac1421e7e2bedba4088780526a8775b0c29 Subproject commit 80bde38f4d5dbb66bab5a8bd5c2c3faaa870aa9f

@ -1 +1 @@
Subproject commit 004dd7f0ffafe6b3d3a1c86e40bc7041b561756c Subproject commit d7eed928fbfb26d822fd4c4cb7ab84e3cb46866a

@ -1 +1 @@
Subproject commit ff90ea2f297258555863a2b6e9cf8442ede3a481 Subproject commit e0db8d0e20142df254de7232ada253c9ba4d0a08

@ -1 +1 @@
Subproject commit 4fb3fdc28cc8fdd58fa3ab2d60857feb228948be Subproject commit 7cb758a986f481ee91afb8be7b407b6329dd61b0

View File

@ -1,64 +1,40 @@
cmake_minimum_required(VERSION 3.0.2) 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) if(DEFINED CATKIN_DEVEL_PREFIX OR DEFINED CATKIN_TOPLEVEL)
set(BUILDING_WITH_CATKIN TRUE) set(BUILDING_WITH_CATKIN TRUE)
message(STATUS "Building robot_cpp with Catkin") message(STATUS "Building robot_cpp with Catkin")
else() else()
set(BUILDING_WITH_CATKIN FALSE) set(BUILDING_WITH_CATKIN FALSE)
message(STATUS "Building robot_cpp with Standalone CMake") message(STATUS "Building robot_cpp with Standalone CMake")
endif() endif()
# C++ Standard - must be set before find_package project(robot_cpp)
set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
# Find dependencies
find_package(yaml-cpp REQUIRED)
find_package(console_bridge REQUIRED)
if (NOT BUILDING_WITH_CATKIN)
# Enable Position Independent Code
set(CMAKE_POSITION_INDEPENDENT_CODE ON) set(CMAKE_POSITION_INDEPENDENT_CODE ON)
# Cu 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 Packages
# ======================================================== # ========================================================
if(BUILDING_WITH_CATKIN)
## Find catkin macros and libraries
find_package(catkin REQUIRED COMPONENTS find_package(catkin REQUIRED COMPONENTS
robot_xmlrpcpp 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() endif()
# Use yaml-cpp target if available (modern CMake) ## System dependencies
# Find yaml-cpp library
find_package(yaml-cpp REQUIRED)
# Use target if available (modern CMake)
if(TARGET yaml-cpp::yaml-cpp) if(TARGET yaml-cpp::yaml-cpp)
set(YAML_CPP_TARGET yaml-cpp::yaml-cpp) set(YAML_CPP_TARGET yaml-cpp::yaml-cpp)
message(STATUS "Using yaml-cpp target: yaml-cpp::yaml-cpp") message(STATUS "Using yaml-cpp target: yaml-cpp::yaml-cpp")
@ -75,128 +51,106 @@ else()
message(STATUS "Using yaml-cpp library name: yaml-cpp") message(STATUS "Using yaml-cpp library name: yaml-cpp")
endif() endif()
# Compiler flags 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
if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
# Warning flags - disabled to suppress warnings during build # Warning flags - disabled to suppress warnings during build
# add_compile_options(-Wall -Wextra -Wpedantic -fPIC) # add_compile_options(-Wall -Wextra -Wpedantic -fPIC)
add_compile_options(-w -fPIC) # -w suppresses all warnings add_compile_options(-w -fPIC) # -w suppresses all warnings
endif() endif()
# Libraries ## 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
add_library(${PROJECT_NAME} SHARED add_library(${PROJECT_NAME} SHARED
src/console.cpp src/console.cpp
src/node_handle.cpp src/node_handle.cpp
src/plugin_loader_helper.cpp src/plugin_loader_helper.cpp
) )
# Enable C++17 filesystem feature
target_compile_features(${PROJECT_NAME} PUBLIC cxx_std_17)
if(BUILDING_WITH_CATKIN)
add_dependencies(${PROJECT_NAME} ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
target_include_directories(${PROJECT_NAME} target_include_directories(${PROJECT_NAME}
PUBLIC PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include> $<INSTALL_INTERFACE:include>
) )
# Link filesystem library if needed (for GCC < 9 or Clang) ## Link libraries
set(FILESYSTEM_LIB "") # Use the determined yaml-cpp target/library
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
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>
)
# 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} target_link_libraries(${PROJECT_NAME}
PUBLIC PUBLIC
${PACKAGES_DIR}
${YAML_CPP_TARGET} ${YAML_CPP_TARGET}
robot_xmlrpcpp
robot_time
PRIVATE PRIVATE
dl # Required for dladdr() function used in plugin_loader_helper.cpp dl # Required for dladdr() function used in plugin_loader_helper.cpp
) )
if(FILESYSTEM_LIB)
target_link_libraries(${PROJECT_NAME} PRIVATE ${FILESYSTEM_LIB})
## Add cmake target dependencies
if(BUILDING_WITH_CATKIN)
add_dependencies(${PROJECT_NAME} ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
endif() endif()
set_target_properties(${PROJECT_NAME} PROPERTIES set_target_properties(${PROJECT_NAME} PROPERTIES
LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR} LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}
) )
endif()
# Define CMAKE_BINARY_DIR as compile definition so it's available at runtime # Define CMAKE_BINARY_DIR as compile definition so it's available at runtime
target_compile_definitions(${PROJECT_NAME} target_compile_definitions(${PROJECT_NAME}
PRIVATE PRIVATE
PNKX_NAV_CORE_BUILD_DIR="${CMAKE_BINARY_DIR}" PNKX_NAV_CORE_BUILD_DIR="${CMAKE_BINARY_DIR}"
) )
if(BUILDING_WITH_CATKIN) # ========================================================
## Mark libraries for installation # Installation (Standalone CMake only)
## 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/
DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION}
FILES_MATCHING PATTERN "*.h"
PATTERN ".svn" EXCLUDE
)
else()
# Export target trong mi trưng hp đ các target khác có th export và ph thuc vào nó
install(TARGETS ${PROJECT_NAME} install(TARGETS ${PROJECT_NAME}
EXPORT ${PROJECT_NAME}-targets EXPORT ${PROJECT_NAME}-targets
ARCHIVE DESTINATION lib ARCHIVE DESTINATION lib
LIBRARY DESTINATION lib LIBRARY DESTINATION lib
RUNTIME DESTINATION bin RUNTIME DESTINATION bin)
)
# Export targets if(NOT BUILDING_WITH_CATKIN)
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/ install(DIRECTORY include/
DESTINATION include DESTINATION include
FILES_MATCHING PATTERN "*.h" FILES_MATCHING PATTERN "*.h")
PATTERN ".svn" EXCLUDE
) install(EXPORT ${PROJECT_NAME}-targets
# NAMESPACE robot::
DESTINATION lib/cmake/${PROJECT_NAME})
# ======================================================== # ========================================================
# Install CMake Config File for find_package() # Install CMake Config File for find_package()
@ -213,16 +167,29 @@ else()
${CMAKE_CURRENT_BINARY_DIR}/robot_cppConfig.cmake ${CMAKE_CURRENT_BINARY_DIR}/robot_cppConfig.cmake
DESTINATION lib/cmake/${PROJECT_NAME} DESTINATION lib/cmake/${PROJECT_NAME}
) )
else()
# Print configuration info # Khi build vi Catkin, vn cn export đ các target khác có th export
message(STATUS "=================================") install(EXPORT ${PROJECT_NAME}-targets
message(STATUS "Project: ${PROJECT_NAME}") # NAMESPACE robot::
message(STATUS "Version: ${PROJECT_VERSION}") DESTINATION lib/cmake/${PROJECT_NAME})
message(STATUS "C++ Standard: ${CMAKE_CXX_STANDARD}")
message(STATUS "Dependencies: robot_xmlrpcpp, robot_time, yaml-cpp, console_bridge")
message(STATUS "=================================")
endif() 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 # Test executable
# ======================================================== # ========================================================
@ -240,8 +207,8 @@ if(BUILD_TESTS)
target_link_libraries(test_node_handle target_link_libraries(test_node_handle
PRIVATE PRIVATE
${PROJECT_NAME} robot_cpp
${YAML_CPP_TARGET} yaml-cpp
) )
set_target_properties(test_node_handle PROPERTIES set_target_properties(test_node_handle PROPERTIES

View File

@ -38,15 +38,10 @@ class PluginLoaderHelper
public: public:
/** /**
* @brief Constructor * @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) * @param config_namespace Namespace in NodeHandle where plugins are stored (default: root)
*/ */
PluginLoaderHelper(robot::NodeHandle nh, const std::string& config_namespace = ""); PluginLoaderHelper(robot::NodeHandle nh = robot::NodeHandle(), const std::string& config_namespace = "");
/** /**
* @brief Find library path from symbol name (export name) * @brief Find library path from symbol name (export name)
@ -81,12 +76,6 @@ public:
*/ */
static std::string getBuildDirectory(); 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: private:
/** /**
* @brief Resolve library path (handle relative paths, search in search_paths) * @brief Resolve library path (handle relative paths, search in search_paths)

View File

@ -27,25 +27,17 @@
namespace robot 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) PluginLoaderHelper::PluginLoaderHelper(robot::NodeHandle nh, const std::string& config_namespace)
: nh_(nh), config_namespace_(config_namespace) : nh_(nh), config_namespace_(config_namespace)
{ {
std::string build_dir = getBuildDirectory(); std::string build_dir = getBuildDirectory();
if (!build_dir.empty()) { if (!build_dir.empty()) {
search_paths_.push_back(build_dir); 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");
// Thêm các subdirectories thường dùng từ workspace path search_paths_.push_back(build_dir + "/src/Algorithms/Packages/local_planners");
std::string workspace_path = getWorkspacePath(); search_paths_.push_back(build_dir + "/src/Navigations/Cores/robot_nav_core2_adapter");
if (!workspace_path.empty()) { search_paths_.push_back(build_dir + "/src/Libraries/robot_costmap_2d");
search_paths_.push_back(workspace_path + "/install/lib");
search_paths_.push_back(workspace_path + "/devel/lib");
} }
} }
@ -64,6 +56,7 @@ std::string PluginLoaderHelper::findLibraryPath(const std::string& symbol_name)
} else { } else {
param_path = symbol_name + "/library_path"; param_path = symbol_name + "/library_path";
} }
// Try to read from NodeHandle // Try to read from NodeHandle
std::string library_path; std::string library_path;
if (nh_.hasParam(param_path)) { if (nh_.hasParam(param_path)) {
@ -104,13 +97,12 @@ std::string PluginLoaderHelper::findLibraryPath(const std::string& symbol_name)
std::string ld_path_str(ld_path); std::string ld_path_str(ld_path);
std::stringstream ss(ld_path_str); std::stringstream ss(ld_path_str);
std::string path; std::string path;
while (std::getline(ss, path, ':')) { while (std::getline(ss, path, ':')) {
if (!path.empty()) { if (!path.empty()) {
// Try different naming conventions // Try different naming conventions
std::vector<std::string> possible_names = { std::vector<std::string> possible_names = {
"lib" + library_path + ".so", "lib" + symbol_name + ".so",
library_path + ".so" symbol_name + ".so"
}; };
// Also try without namespace // Also try without namespace
@ -335,103 +327,5 @@ std::string PluginLoaderHelper::getBuildDirectory()
return ""; 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<std::filesystem::path> 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<void*>(&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 } // namespace robot

View File

@ -1,141 +1,98 @@
cmake_minimum_required(VERSION 3.0.2) cmake_minimum_required(VERSION 3.10)
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) if(DEFINED CATKIN_DEVEL_PREFIX OR DEFINED CATKIN_TOPLEVEL)
set(BUILDING_WITH_CATKIN TRUE) set(BUILDING_WITH_CATKIN TRUE)
message(STATUS "Building robot_nav_2d_msgs with Catkin") message(STATUS "Building robot_nav_2d_msgs with Catkin")
find_package(catkin REQUIRED)
else() else()
set(BUILDING_WITH_CATKIN FALSE) set(BUILDING_WITH_CATKIN FALSE)
message(STATUS "Building robot_nav_2d_msgs with Standalone CMake") message(STATUS "Building robot_nav_2d_msgs with Standalone CMake")
endif() endif()
if (NOT BUILDING_WITH_CATKIN) project(robot_nav_2d_msgs VERSION 1.0.0 LANGUAGES CXX)
# Chun C++
set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF) set(CMAKE_CXX_EXTENSIONS OFF)
# Enable Position Independent Code
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
# Cu 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 # 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( catkin_package(
INCLUDE_DIRS include INCLUDE_DIRS include
# LIBRARIES không cn vì đây là header-only library # LIBRARIES không cn vì đây là header-only library
# CATKIN_DEPENDS không cn vì dependencies không phi Catkin packages # CATKIN_DEPENDS không cn vì dependencies không phi Catkin packages
) )
include_directories(
include
${catkin_INCLUDE_DIRS}
)
endif() endif()
# Tìm tt c header files # Tìm tt c header files
file(GLOB_RECURSE HEADERS "include/robot_nav_2d_msgs/*.h") file(GLOB_RECURSE HEADERS "include/robot_nav_2d_msgs/*.h")
# To INTERFACE library (header-only) # To INTERFACE library (header-only)
add_library(${PROJECT_NAME} INTERFACE) add_library(robot_nav_2d_msgs INTERFACE)
if(BUILDING_WITH_CATKIN)
add_dependencies(${PROJECT_NAME} ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
# Set include directories # Set include directories
target_include_directories(${PROJECT_NAME} target_include_directories(robot_nav_2d_msgs
INTERFACE INTERFACE
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include> $<INSTALL_INTERFACE:include>
) )
# Link dependencies (header-only, chỉ cần include paths) # Link dependencies (header-only, chỉ cần include paths)
target_link_libraries(${PROJECT_NAME} # Các dependencies này cũng là header-only t common_msgs
target_link_libraries(robot_nav_2d_msgs
INTERFACE INTERFACE
${catkin_LIBRARIES} robot_std_msgs
geometry_msgs
) )
# Add include directories from dependencies explicitly for Catkin build # Add include directories from dependencies explicitly for Catkin build
if(BUILDING_WITH_CATKIN)
# Use relative paths from current source directory # Use relative paths from current source directory
target_include_directories(${PROJECT_NAME} INTERFACE # 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
$<BUILD_INTERFACE:${ROBOT_STD_MSGS_INCLUDE}> $<BUILD_INTERFACE:${ROBOT_STD_MSGS_INCLUDE}>
$<BUILD_INTERFACE:${GEOMETRY_MSGS_INCLUDE}> $<BUILD_INTERFACE:${GEOMETRY_MSGS_INCLUDE}>
) )
else()
# Set include directories
target_include_directories(${PROJECT_NAME}
INTERFACE
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>
)
# Link dependencies (header-only, chỉ cần include paths)
target_link_libraries(${PROJECT_NAME}
INTERFACE
${PACKAGES_DIR}
)
endif() endif()
if(BUILDING_WITH_CATKIN) # Cài đt header files
## Mark libraries for installation if(NOT BUILDING_WITH_CATKIN)
## See http://docs.ros.org/melodic/api/catkin/html/howto/format1/building_libraries.html install(DIRECTORY include/robot_nav_2d_msgs
install(TARGETS ${PROJECT_NAME} DESTINATION include
ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} FILES_MATCHING PATTERN "*.h")
LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} endif()
RUNTIME DESTINATION ${CATKIN_GLOBAL_BIN_DESTINATION}
)
## Mark cpp header files for installation # Cài đt target
install(DIRECTORY include/${PROJECT_NAME}/ install(TARGETS robot_nav_2d_msgs
DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION} EXPORT robot_nav_2d_msgs-targets
FILES_MATCHING PATTERN "*.h"
PATTERN ".svn" EXCLUDE
)
else()
install(TARGETS ${PROJECT_NAME}
EXPORT ${PROJECT_NAME}-targets
ARCHIVE DESTINATION lib ARCHIVE DESTINATION lib
LIBRARY DESTINATION lib LIBRARY DESTINATION lib
RUNTIME DESTINATION bin RUNTIME DESTINATION bin)
)
# Export targets # Export targets
install(EXPORT ${PROJECT_NAME}-targets # Bây gi có th export dependencies vì robot_std_msgs và geometry_msgs đã đưc export
FILE ${PROJECT_NAME}-targets.cmake install(EXPORT robot_nav_2d_msgs-targets
NAMESPACE ${PROJECT_NAME}:: FILE robot_nav_2d_msgs-targets.cmake
DESTINATION lib/cmake/${PROJECT_NAME} NAMESPACE robot_nav_2d_msgs::
) DESTINATION lib/cmake/robot_nav_2d_msgs)
## Mark cpp header files for installation # In thông tin cu hình
install(DIRECTORY include/${PROJECT_NAME}/
DESTINATION include
FILES_MATCHING PATTERN "*.h"
PATTERN ".svn" EXCLUDE
)
# Print configuration info
message(STATUS "=================================") message(STATUS "=================================")
message(STATUS "Project: ${PROJECT_NAME} (Header-Only)") message(STATUS "Project: ${PROJECT_NAME} (Header-Only)")
message(STATUS "Version: ${PROJECT_VERSION}") message(STATUS "Version: ${PROJECT_VERSION}")
@ -146,4 +103,4 @@ else()
endforeach() endforeach()
message(STATUS "Dependencies: robot_std_msgs, geometry_msgs") message(STATUS "Dependencies: robot_std_msgs, geometry_msgs")
message(STATUS "=================================") message(STATUS "=================================")
endif()

View File

@ -19,8 +19,4 @@
<buildtool_depend version_gte="0.5.68">catkin</buildtool_depend> <buildtool_depend version_gte="0.5.68">catkin</buildtool_depend>
<build_depend>robot_std_msgs</build_depend>
<build_depend>robot_geometry_msgs</build_depend>
<run_depend>robot_std_msgs</run_depend>
<run_depend>robot_geometry_msgs</run_depend>
</package> </package>

View File

@ -1,6 +1,22 @@
cmake_minimum_required(VERSION 3.0.2) cmake_minimum_required(VERSION 3.10)
project(robot_nav_2d_utils VERSION 1.0.0 LANGUAGES CXX) 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)
# Cu 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) if(DEFINED CATKIN_DEVEL_PREFIX OR DEFINED CATKIN_TOPLEVEL)
set(BUILDING_WITH_CATKIN TRUE) set(BUILDING_WITH_CATKIN TRUE)
message(STATUS "Building robot_nav_2d_utils with Catkin") message(STATUS "Building robot_nav_2d_utils with Catkin")
@ -10,41 +26,7 @@ else()
message(STATUS "Building robot_nav_2d_utils with Standalone CMake") message(STATUS "Building robot_nav_2d_utils with Standalone CMake")
endif() endif()
set(CMAKE_CXX_STANDARD 17) if(BUILDING_WITH_CATKIN)
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)
# Cu 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 find_package(catkin REQUIRED COMPONENTS
robot_nav_2d_msgs robot_nav_2d_msgs
robot_geometry_msgs robot_geometry_msgs
@ -56,166 +38,177 @@ else()
robot_cpp robot_cpp
) )
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 cn vì dependencies không phi Catkin packages
DEPENDS console_bridge Boost
)
endif()
# Find dependencies # Find dependencies
find_package(console_bridge REQUIRED) find_package(console_bridge REQUIRED)
find_package(Boost REQUIRED COMPONENTS system thread) 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 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()
# Libraries # Libraries
add_library(${PROJECT_NAME}_conversions src/conversions.cpp) add_library(${PROJECT_NAME}_conversions src/conversions.cpp)
add_library(${PROJECT_NAME}_path_ops src/path_ops.cpp)
add_library(${PROJECT_NAME}_polygons src/polygons.cpp src/footprint.cpp)
add_library(${PROJECT_NAME}_bounds src/bounds.cpp)
add_library(${PROJECT_NAME}_tf_help src/tf_help.cpp)
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 target_include_directories(${PROJECT_NAME}_conversions
PUBLIC PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include> $<INSTALL_INTERFACE:include>
) )
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 target_include_directories(${PROJECT_NAME}_path_ops
PUBLIC PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include> $<INSTALL_INTERFACE:include>
) )
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 target_include_directories(${PROJECT_NAME}_polygons
PUBLIC PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include> $<INSTALL_INTERFACE:include>
) )
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 target_include_directories(${PROJECT_NAME}_bounds
PUBLIC PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include> $<INSTALL_INTERFACE:include>
) )
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 target_include_directories(${PROJECT_NAME}_tf_help
PUBLIC PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include> $<INSTALL_INTERFACE:include>
) )
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
)
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} target_include_directories(${PROJECT_NAME}
INTERFACE INTERFACE
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include> $<INSTALL_INTERFACE:include>
) )
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() endif()
if(BUILDING_WITH_CATKIN) # Install targets
## 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 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 EXPORT ${PROJECT_NAME}-targets
LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib ARCHIVE DESTINATION lib
RUNTIME DESTINATION bin LIBRARY DESTINATION lib
) RUNTIME DESTINATION bin)
# Export targets # Export targets
install(EXPORT ${PROJECT_NAME}-targets install(EXPORT ${PROJECT_NAME}-targets
FILE ${PROJECT_NAME}-targets.cmake FILE ${PROJECT_NAME}-targets.cmake
DESTINATION lib/cmake/${PROJECT_NAME} NAMESPACE ${PROJECT_NAME}::
) 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 # Print configuration info
message(STATUS "=================================") message(STATUS "=================================")
@ -225,9 +218,3 @@ else()
message(STATUS "Libraries: ${PROJECT_NAME}_conversions, ${PROJECT_NAME}_path_ops, ${PROJECT_NAME}_polygons, ${PROJECT_NAME}_bounds, ${PROJECT_NAME}_tf_help") 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 "Dependencies: robot_nav_2d_msgs, robot_geometry_msgs, robot_nav_msgs, nav_grid, robot_nav_core2, tf3, console_bridge, Boost")
message(STATUS "=================================") message(STATUS "=================================")
endif()

@ -1 +1 @@
Subproject commit 6b23f32c6e3d3b969c840ef763c5fb22cc2e14d7 Subproject commit 504de86ee92a2684564cc3a561f3f534eb798160

View File

@ -1,27 +1,6 @@
cmake_minimum_required(VERSION 3.0.2) cmake_minimum_required(VERSION 3.0.2)
project(tf3 VERSION 1.0.0 LANGUAGES CXX) project(tf3)
if(DEFINED CATKIN_DEVEL_PREFIX OR DEFINED CATKIN_TOPLEVEL)
set(BUILDING_WITH_CATKIN TRUE)
message(STATUS "Building tf3 with Catkin")
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) set(CMAKE_POSITION_INDEPENDENT_CODE ON)
# Cu hình RPATH đ tránh cycle trong runtime search path # Cu hình RPATH đ tránh cycle trong runtime search path
@ -29,180 +8,106 @@ if (NOT BUILDING_WITH_CATKIN)
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
set(CMAKE_BUILD_RPATH "${CMAKE_BINARY_DIR}") 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)
find_package(catkin REQUIRED COMPONENTS console_bridge)
else() else()
set(BUILDING_WITH_CATKIN FALSE)
endif()
find_package(console_bridge REQUIRED)
find_package(Boost REQUIRED COMPONENTS system thread)
# ======================================================== # ========================================================
# Catkin specific configuration # Catkin specific configuration
# ======================================================== # ========================================================
find_package(catkin REQUIRED)
catkin_package(
INCLUDE_DIRS include
LIBRARIES ${PROJECT_NAME}
DEPENDS console_bridge Boost
)
include_directories(
include
${catkin_INCLUDE_DIRS}
${console_bridge_INCLUDE_DIRS}
)
endif()
# Libraries
add_library(${PROJECT_NAME} SHARED
src/cache.cpp
src/buffer_core.cpp
src/static_cache.cpp
)
if(BUILDING_WITH_CATKIN) if(BUILDING_WITH_CATKIN)
add_dependencies(${PROJECT_NAME} ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) ## The catkin_package macro generates cmake config files for your package
catkin_package(
target_include_directories(${PROJECT_NAME} INCLUDE_DIRS include
PUBLIC LIBRARIES tf3
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> DEPENDS console_bridge
$<INSTALL_INTERFACE:include>
) )
endif()
include_directories(include ${console_bridge_INCLUDE_DIRS})
target_link_libraries(${PROJECT_NAME} # export user definitions
PUBLIC ${catkin_LIBRARIES}
PRIVATE Boost::boost Boost::system Boost::thread
PRIVATE console_bridge::console_bridge
)
else() #CPP Libraries
add_library(tf3 src/cache.cpp src/buffer_core.cpp src/static_cache.cpp)
target_include_directories(${PROJECT_NAME} target_link_libraries(tf3 ${Boost_LIBRARIES} ${console_bridge_LIBRARIES})
PUBLIC set_target_properties(tf3 PROPERTIES
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>
)
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} LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}
BUILD_RPATH "${CMAKE_BINARY_DIR}" BUILD_RPATH "${CMAKE_BINARY_DIR}"
INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib" INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib"
) )
endif() ## Add cmake target dependencies
if(BUILDING_WITH_CATKIN) if(BUILDING_WITH_CATKIN)
## Mark libraries for installation add_dependencies(tf3 ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
## See http://docs.ros.org/melodic/api/catkin/html/howto/format1/building_libraries.html endif()
install(TARGETS ${PROJECT_NAME} target_include_directories(tf3 PUBLIC
ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} $<INSTALL_INTERFACE:include>)
RUNTIME DESTINATION ${CATKIN_GLOBAL_BIN_DESTINATION}
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 mi trưng hp đ các target khác có th export và ph thuc vào nó
## Mark cpp header files for installation install(TARGETS tf3
install(DIRECTORY include/${PROJECT_NAME}/ EXPORT tf3-targets
DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION}
FILES_MATCHING PATTERN "*.h"
PATTERN ".svn" EXCLUDE
)
else()
install(TARGETS ${PROJECT_NAME}
EXPORT ${PROJECT_NAME}-targets
ARCHIVE DESTINATION lib ARCHIVE DESTINATION lib
LIBRARY DESTINATION lib LIBRARY DESTINATION lib
RUNTIME DESTINATION bin RUNTIME DESTINATION bin
) )
# Export targets if(NOT BUILDING_WITH_CATKIN)
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}/ install(DIRECTORY include/${PROJECT_NAME}/
DESTINATION include DESTINATION include/${PROJECT_NAME}
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() endif()
# ======================================================== # Export targets - cn trong mi trưng hp
# Test executables install(EXPORT tf3-targets
# ======================================================== FILE tf3-targets.cmake
NAMESPACE tf3::
DESTINATION lib/cmake/tf3)
# Tests
option(BUILD_TESTING "Build tests" OFF) option(BUILD_TESTING "Build tests" OFF)
if(BUILD_TESTING) if(BUILD_TESTING)
enable_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(test_static_cache_unittest test/static_cache_test.cpp)
add_executable(${PROJECT_NAME}_cache_test test/cache_unittest.cpp) target_link_libraries(test_static_cache_unittest tf3 ${console_bridge_LIBRARIES})
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()
if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/test/static_cache_test.cpp) add_executable(test_simple test/simple_tf3_core.cpp)
add_executable(${PROJECT_NAME}_static_cache_test test/static_cache_test.cpp) target_link_libraries(test_simple tf3 ${console_bridge_LIBRARIES})
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()
if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/test/simple_tf3_core.cpp) add_executable(speed_test test/speed_test.cpp)
add_executable(${PROJECT_NAME}_simple_test test/simple_tf3_core.cpp) target_link_libraries(speed_test tf3 ${console_bridge_LIBRARIES})
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()
if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/test/speed_test.cpp) add_executable(test_transform_datatypes test/test_transform_datatypes.cpp)
add_executable(${PROJECT_NAME}_speed_test test/speed_test.cpp) target_link_libraries(test_transform_datatypes tf3 ${console_bridge_LIBRARIES})
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()
if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/test/test_transform_datatypes.cpp) add_test(NAME test_cache_unittest COMMAND test_cache_unittest)
add_executable(${PROJECT_NAME}_transform_datatypes_test test/test_transform_datatypes.cpp) add_test(NAME test_static_cache_unittest COMMAND test_static_cache_unittest)
target_link_libraries(${PROJECT_NAME}_transform_datatypes_test PRIVATE add_test(NAME test_simple COMMAND test_simple)
${PROJECT_NAME} add_test(NAME speed_test COMMAND speed_test)
console_bridge::console_bridge add_test(NAME test_transform_datatypes COMMAND test_transform_datatypes)
)
add_test(NAME ${PROJECT_NAME}_transform_datatypes_test COMMAND ${PROJECT_NAME}_transform_datatypes_test)
endif()
endif() endif()

View File

@ -19,7 +19,5 @@
<buildtool_depend version_gte="0.5.68">catkin</buildtool_depend> <buildtool_depend version_gte="0.5.68">catkin</buildtool_depend>
<build_depend>console_bridge</build_depend>
<run_depend>console_bridge</run_depend>
</package> </package>

@ -1 +1 @@
Subproject commit 3daeae614788ff326feb04bfd6ad9d76ffc7a105 Subproject commit 4303737ff92db94dc1bcde2d8a3bef527e76355a

@ -1 +1 @@
Subproject commit 948405bba436a164cb27f1b24cbb2bcf8ca053b2 Subproject commit 5f7ae1233dc66c6fa8c75e881b7100f0d77f9a64

View File

@ -1,142 +1,78 @@
cmake_minimum_required(VERSION 3.0.2) cmake_minimum_required(VERSION 3.10)
project(move_base_core VERSION 1.0.0 LANGUAGES CXX) project(move_base_core VERSION 1.0.0 LANGUAGES CXX)
# Chun C++
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# ========================================================
# Catkin specific configuration
# ========================================================
if(DEFINED CATKIN_DEVEL_PREFIX OR DEFINED CATKIN_TOPLEVEL) if(DEFINED CATKIN_DEVEL_PREFIX OR DEFINED CATKIN_TOPLEVEL)
set(BUILDING_WITH_CATKIN TRUE) set(BUILDING_WITH_CATKIN TRUE)
message(STATUS "Building move_base_core with Catkin") message(STATUS "Building move_base_core with Catkin")
else() else()
set(BUILDING_WITH_CATKIN FALSE) set(BUILDING_WITH_CATKIN FALSE)
message(STATUS "Building move_base_core with Standalone CMake") message(STATUS "Building move_base_core with Standalone CMake")
endif() endif()
# C++ Standard - must be set before find_package if(BUILDING_WITH_CATKIN)
set(CMAKE_CXX_STANDARD 17) find_package(catkin REQUIRED COMPONENTS tf3 robot_time robot_geometry_msgs robot_protocol_msgs robot_nav_2d_msgs)
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)
# Cu 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( catkin_package(
INCLUDE_DIRS include INCLUDE_DIRS include
# LIBRARIES không cn vì đây là header-only library LIBRARIES move_base_core
CATKIN_DEPENDS tf3 robot_time robot_geometry_msgs robot_protocol_msgs robot_nav_2d_msgs CATKIN_DEPENDS tf3 robot_time robot_geometry_msgs robot_protocol_msgs robot_nav_2d_msgs
) # CATKIN_DEPENDS không cn vì dependencies không phi Catkin packages
include_directories(
include
${catkin_INCLUDE_DIRS}
) )
endif() endif()
# Tìm tt c header files # Tìm tt c header files
file(GLOB_RECURSE HEADERS "include/move_base_core/*.h") file(GLOB HEADERS "include/move_base_core/*.h")
# To INTERFACE library (header-only) # To INTERFACE library (header-only)
add_library(${PROJECT_NAME} INTERFACE) add_library(move_base_core INTERFACE)
# Set include directories trưc khi link libraries
target_include_directories(move_base_core
INTERFACE
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>
)
# Link vi dependencies - include directories s đưc truyn t đng qua INTERFACE properties
if(BUILDING_WITH_CATKIN) if(BUILDING_WITH_CATKIN)
add_dependencies(${PROJECT_NAME} ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) target_link_libraries(move_base_core INTERFACE ${catkin_TARGETS})
# Set include directories
target_include_directories(${PROJECT_NAME}
INTERFACE
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>
)
# Link dependencies (header-only, chỉ cần include paths)
target_link_libraries(${PROJECT_NAME}
INTERFACE
${catkin_LIBRARIES}
)
else() else()
target_link_libraries(move_base_core
# Set include directories
target_include_directories(${PROJECT_NAME}
INTERFACE INTERFACE
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> tf3
$<INSTALL_INTERFACE:include> robot_time
robot_geometry_msgs
robot_protocol_msgs
robot_nav_2d_msgs # Thêm vì navigation.h include robot_nav_2d_msgs/Twist2DStamped.h
) )
# Link dependencies (header-only, chỉ cần include paths)
target_link_libraries(${PROJECT_NAME}
INTERFACE
${PACKAGES_DIR}
)
endif() endif()
if(BUILDING_WITH_CATKIN) # Cài đt header files
## Mark libraries for installation if(NOT BUILDING_WITH_CATKIN)
## See http://docs.ros.org/melodic/api/catkin/html/howto/format1/building_libraries.html install(DIRECTORY include/move_base_core
install(TARGETS ${PROJECT_NAME} DESTINATION include
ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} FILES_MATCHING PATTERN "*.h")
LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} endif()
RUNTIME DESTINATION ${CATKIN_GLOBAL_BIN_DESTINATION}
)
## Mark cpp header files for installation # Cài đt target
install(DIRECTORY include/${PROJECT_NAME}/ install(TARGETS move_base_core
DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION} EXPORT move_base_core-targets
FILES_MATCHING PATTERN "*.h"
PATTERN ".svn" EXCLUDE
)
else()
install(TARGETS ${PROJECT_NAME}
EXPORT ${PROJECT_NAME}-targets
ARCHIVE DESTINATION lib
LIBRARY DESTINATION lib LIBRARY DESTINATION lib
RUNTIME DESTINATION bin ARCHIVE DESTINATION lib
) RUNTIME DESTINATION bin)
# Export targets # Export targets
install(EXPORT ${PROJECT_NAME}-targets install(EXPORT move_base_core-targets
FILE ${PROJECT_NAME}-targets.cmake FILE move_base_core-targets.cmake
NAMESPACE ${PROJECT_NAME}:: DESTINATION lib/cmake/move_base_core)
DESTINATION lib/cmake/${PROJECT_NAME}
)
## Mark cpp header files for installation # In thông tin cu hình
install(DIRECTORY include/${PROJECT_NAME}/
DESTINATION include
FILES_MATCHING PATTERN "*.h"
PATTERN ".svn" EXCLUDE
)
# Print configuration info
message(STATUS "=================================") message(STATUS "=================================")
message(STATUS "Project: ${PROJECT_NAME} (Header-Only)") message(STATUS "Project: ${PROJECT_NAME} (Header-Only)")
message(STATUS "Version: ${PROJECT_VERSION}") message(STATUS "Version: ${PROJECT_VERSION}")
@ -145,6 +81,4 @@ else()
foreach(hdr ${HEADERS}) foreach(hdr ${HEADERS})
message(STATUS " - ${hdr}") message(STATUS " - ${hdr}")
endforeach() endforeach()
message(STATUS "Dependencies: tf3, robot_time, robot_geometry_msgs, robot_protocol_msgs, robot_nav_2d_msgs")
message(STATUS "=================================") message(STATUS "=================================")
endif()

View File

@ -1,138 +1,114 @@
cmake_minimum_required(VERSION 3.0.2) cmake_minimum_required(VERSION 3.10)
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) if(DEFINED CATKIN_DEVEL_PREFIX OR DEFINED CATKIN_TOPLEVEL)
set(BUILDING_WITH_CATKIN TRUE) set(BUILDING_WITH_CATKIN TRUE)
message(STATUS "Building robot_nav_core with Catkin") message(STATUS "Building robot_nav_core with Catkin")
else() else()
set(BUILDING_WITH_CATKIN FALSE) set(BUILDING_WITH_CATKIN FALSE)
message(STATUS "Building robot_nav_core with Standalone CMake") message(STATUS "Building robot_nav_core with Standalone CMake")
endif() endif()
# C++ Standard - must be set before find_package # Tên d án
project(robot_nav_core VERSION 1.0.0 LANGUAGES CXX)
# Chun C++
set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON) 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)
# Cu 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
)
else()
# ======================================================== # ========================================================
# Catkin specific configuration # Find dependencies
# ======================================================== # ========================================================
if(BUILDING_WITH_CATKIN)
find_package(catkin REQUIRED COMPONENTS find_package(catkin REQUIRED COMPONENTS
robot_costmap_2d robot_costmap_2d
tf3 tf3
robot_protocol_msgs robot_protocol_msgs
) )
endif()
# ========================================================
# Catkin specific configuration
# ========================================================
if(BUILDING_WITH_CATKIN)
catkin_package( catkin_package(
INCLUDE_DIRS include INCLUDE_DIRS include
# LIBRARIES không cn vì đây là header-only library # Header-only library; keep LIBRARIES for visibility when exporting
LIBRARIES robot_nav_core
CATKIN_DEPENDS robot_costmap_2d tf3 robot_protocol_msgs CATKIN_DEPENDS robot_costmap_2d tf3 robot_protocol_msgs
) )
include_directories(
include
${catkin_INCLUDE_DIRS}
)
endif() endif()
# Tìm tt c header files # Cho phép các project khác include đưc header ca robot_nav_core
file(GLOB_RECURSE HEADERS "include/robot_nav_core/*.h") 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()
# To INTERFACE library (header-only) # To INTERFACE library (header-only)
add_library(${PROJECT_NAME} INTERFACE) add_library(${PROJECT_NAME} INTERFACE)
# Link libraries
if(BUILDING_WITH_CATKIN) if(BUILDING_WITH_CATKIN)
add_dependencies(${PROJECT_NAME} ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) target_link_libraries(${PROJECT_NAME} INTERFACE
# Set include directories
target_include_directories(${PROJECT_NAME}
INTERFACE
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>
)
# Link dependencies (header-only, chỉ cần include paths)
target_link_libraries(${PROJECT_NAME}
INTERFACE
${catkin_LIBRARIES} ${catkin_LIBRARIES}
) )
else() else()
target_link_libraries(${PROJECT_NAME} INTERFACE
# Set include directories robot_costmap_2d
target_include_directories(${PROJECT_NAME} tf3
INTERFACE robot_protocol_msgs
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>
) )
# Link dependencies (header-only, chỉ cần include paths)
target_link_libraries(${PROJECT_NAME}
INTERFACE
${PACKAGES_DIR}
)
endif() endif()
if(BUILDING_WITH_CATKIN) if(BUILDING_WITH_CATKIN)
## Mark libraries for installation add_dependencies(${PROJECT_NAME} ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
## See http://docs.ros.org/melodic/api/catkin/html/howto/format1/building_libraries.html endif()
install(TARGETS ${PROJECT_NAME}
ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} # Set include directories
LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} target_include_directories(${PROJECT_NAME}
RUNTIME DESTINATION ${CATKIN_GLOBAL_BIN_DESTINATION} INTERFACE
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>
) )
## Mark cpp header files for installation # ========================================================
install(DIRECTORY include/${PROJECT_NAME}/ # Installation
DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION} # ========================================================
FILES_MATCHING PATTERN "*.h"
PATTERN ".svn" EXCLUDE
)
else()
install(TARGETS ${PROJECT_NAME} install(TARGETS ${PROJECT_NAME}
EXPORT ${PROJECT_NAME}-targets EXPORT ${PROJECT_NAME}-targets
ARCHIVE DESTINATION lib
LIBRARY DESTINATION lib LIBRARY DESTINATION lib
RUNTIME DESTINATION bin ARCHIVE DESTINATION lib
) RUNTIME DESTINATION bin)
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 # Export targets
install(EXPORT ${PROJECT_NAME}-targets install(EXPORT ${PROJECT_NAME}-targets
FILE ${PROJECT_NAME}-targets.cmake FILE ${PROJECT_NAME}-targets.cmake
NAMESPACE ${PROJECT_NAME}:: DESTINATION lib/cmake/${PROJECT_NAME})
DESTINATION lib/cmake/${PROJECT_NAME}
)
## Mark cpp header files for installation # In thông tin cu hình
install(DIRECTORY include/${PROJECT_NAME}/
DESTINATION include
FILES_MATCHING PATTERN "*.h"
PATTERN ".svn" EXCLUDE
)
# Print configuration info
message(STATUS "=================================") message(STATUS "=================================")
message(STATUS "Project: ${PROJECT_NAME} (Header-Only)") message(STATUS "Project: ${PROJECT_NAME} (Header-Only)")
message(STATUS "Version: ${PROJECT_VERSION}") message(STATUS "Version: ${PROJECT_VERSION}")
@ -141,6 +117,4 @@ else()
foreach(hdr ${HEADERS}) foreach(hdr ${HEADERS})
message(STATUS " - ${hdr}") message(STATUS " - ${hdr}")
endforeach() endforeach()
message(STATUS "Dependencies: robot_costmap_2d, tf3, robot_protocol_msgs")
message(STATUS "=================================") message(STATUS "=================================")
endif()

View File

@ -1,144 +1,132 @@
cmake_minimum_required(VERSION 3.0.2) cmake_minimum_required(VERSION 3.10)
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) if(DEFINED CATKIN_DEVEL_PREFIX OR DEFINED CATKIN_TOPLEVEL)
set(BUILDING_WITH_CATKIN TRUE) set(BUILDING_WITH_CATKIN TRUE)
message(STATUS "Building robot_nav_core2 with Catkin") message(STATUS "Building robot_nav_core2 with Catkin")
else() else()
set(BUILDING_WITH_CATKIN FALSE) set(BUILDING_WITH_CATKIN FALSE)
message(STATUS "Building robot_nav_core2 with Standalone CMake") message(STATUS "Building robot_nav_core2 with Standalone CMake")
endif() endif()
# C++ Standard - must be set before find_package # Tên d án
project(robot_nav_core2 VERSION 1.0.0 LANGUAGES CXX)
# Chun C++
set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON) 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)
# Cu 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_geometry_msgs
)
else()
# ======================================================== # ========================================================
# Catkin specific configuration # Find dependencies
# ======================================================== # ========================================================
if(BUILDING_WITH_CATKIN)
find_package(catkin REQUIRED COMPONENTS find_package(catkin REQUIRED COMPONENTS
robot_costmap_2d robot_costmap_2d
tf3 tf3
nav_grid nav_grid
robot_nav_2d_msgs robot_nav_2d_msgs
robot_cpp robot_cpp
robot_geometry_msgs robot_sensor_msgs
) robot_std_msgs
geometry_msgs
catkin_package( robot_nav_msgs
INCLUDE_DIRS include robot_map_msgs
# LIBRARIES không cn vì đây là header-only library robot_laser_geometry
CATKIN_DEPENDS robot_costmap_2d tf3 nav_grid robot_nav_2d_msgs robot_cpp robot_geometry_msgs robot_visualization_msgs
) robot_voxel_grid
robot_tf3_geometry_msgs
include_directories( robot_tf3_sensor_msgs
include data_convert
${catkin_INCLUDE_DIRS} robot_xmlrpcpp
) )
endif() endif()
# ========================================================
# Catkin specific configuration
# ========================================================
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
)
endif()
# Cho phép các project khác include đưc header ca 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 tt c header files # Tìm tt c header files
file(GLOB_RECURSE HEADERS "include/robot_nav_core2/*.h") file(GLOB HEADERS "include/robot_nav_core2/*.h")
# To INTERFACE library (header-only) # To INTERFACE library (header-only)
add_library(${PROJECT_NAME} INTERFACE) add_library(${PROJECT_NAME} INTERFACE)
# Link libraries
if(BUILDING_WITH_CATKIN) if(BUILDING_WITH_CATKIN)
add_dependencies(${PROJECT_NAME} ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) target_link_libraries(${PROJECT_NAME} INTERFACE
# Set include directories
target_include_directories(${PROJECT_NAME}
INTERFACE
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>
)
# Link dependencies (header-only, chỉ cần include paths)
target_link_libraries(${PROJECT_NAME}
INTERFACE
${catkin_LIBRARIES} ${catkin_LIBRARIES}
) )
else() else()
target_link_libraries(${PROJECT_NAME} INTERFACE
# Set include directories robot_costmap_2d
target_include_directories(${PROJECT_NAME} tf3
INTERFACE nav_grid
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> robot_nav_2d_msgs
$<INSTALL_INTERFACE:include> robot_cpp
) )
# Link dependencies (header-only, chỉ cần include paths)
target_link_libraries(${PROJECT_NAME}
INTERFACE
${PACKAGES_DIR}
)
endif() endif()
if(BUILDING_WITH_CATKIN) if(BUILDING_WITH_CATKIN)
## Mark libraries for installation add_dependencies(${PROJECT_NAME} ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
## See http://docs.ros.org/melodic/api/catkin/html/howto/format1/building_libraries.html endif()
# Set include directories
target_include_directories(${PROJECT_NAME}
INTERFACE
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>
)
# ========================================================
# Installation
# ========================================================
# Cài đt target
install(TARGETS ${PROJECT_NAME} install(TARGETS ${PROJECT_NAME}
ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} EXPORT ${PROJECT_NAME}-targets)
LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
RUNTIME DESTINATION ${CATKIN_GLOBAL_BIN_DESTINATION}
)
## Mark cpp header files for installation if(NOT BUILDING_WITH_CATKIN)
install(DIRECTORY include/${PROJECT_NAME}/ # Cài đt header files (standalone)
DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION} install(DIRECTORY include/${PROJECT_NAME}
FILES_MATCHING PATTERN "*.h" DESTINATION include
PATTERN ".svn" EXCLUDE FILES_MATCHING PATTERN "*.h")
) endif()
else()
install(TARGETS ${PROJECT_NAME}
EXPORT ${PROJECT_NAME}-targets
ARCHIVE DESTINATION lib
LIBRARY DESTINATION lib
RUNTIME DESTINATION bin
)
# Export targets # Export targets
install(EXPORT ${PROJECT_NAME}-targets install(EXPORT ${PROJECT_NAME}-targets
FILE ${PROJECT_NAME}-targets.cmake FILE ${PROJECT_NAME}-targets.cmake
NAMESPACE ${PROJECT_NAME}:: NAMESPACE ${PROJECT_NAME}::
DESTINATION lib/cmake/${PROJECT_NAME} DESTINATION lib/cmake/${PROJECT_NAME})
)
## Mark cpp header files for installation # In thông tin cu hình
install(DIRECTORY include/${PROJECT_NAME}/
DESTINATION include
FILES_MATCHING PATTERN "*.h"
PATTERN ".svn" EXCLUDE
)
# Print configuration info
message(STATUS "=================================") message(STATUS "=================================")
message(STATUS "Project: ${PROJECT_NAME} (Header-Only)") message(STATUS "Project: ${PROJECT_NAME} (Header-Only)")
message(STATUS "Version: ${PROJECT_VERSION}") message(STATUS "Version: ${PROJECT_VERSION}")
@ -147,6 +135,4 @@ else()
foreach(hdr ${HEADERS}) foreach(hdr ${HEADERS})
message(STATUS " - ${hdr}") message(STATUS " - ${hdr}")
endforeach() endforeach()
message(STATUS "Dependencies: robot_costmap_2d, tf3, nav_grid, robot_nav_2d_msgs, robot_cpp, robot_geometry_msgs")
message(STATUS "=================================") message(STATUS "=================================")
endif()

View File

@ -34,7 +34,4 @@
<build_depend>robot_cpp</build_depend> <build_depend>robot_cpp</build_depend>
<run_depend>robot_cpp</run_depend> <run_depend>robot_cpp</run_depend>
<build_depend>robot_geometry_msgs</build_depend>
<run_depend>robot_geometry_msgs</run_depend>
</package> </package>

View File

@ -1,48 +1,37 @@
cmake_minimum_required(VERSION 3.0.2) cmake_minimum_required(VERSION 3.10)
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) if(DEFINED CATKIN_DEVEL_PREFIX OR DEFINED CATKIN_TOPLEVEL)
set(BUILDING_WITH_CATKIN TRUE) set(BUILDING_WITH_CATKIN TRUE)
message(STATUS "Building robot_nav_core_adapter with Catkin") message(STATUS "Building robot_nav_core_adapter with Catkin")
else() else()
set(BUILDING_WITH_CATKIN FALSE) set(BUILDING_WITH_CATKIN FALSE)
message(STATUS "Building robot_nav_core_adapter with Standalone CMake") message(STATUS "Building robot_nav_core_adapter with Standalone CMake")
endif() endif()
# C++ Standard - must be set before find_package # Tên d án
project(robot_nav_core_adapter VERSION 1.0.0 LANGUAGES CXX)
# Chun C++
set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON) 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 dependencies
# ========================================================
# Find system dependencies
find_package(Boost REQUIRED COMPONENTS filesystem system) find_package(Boost REQUIRED COMPONENTS filesystem system)
find_package(Threads REQUIRED)
if (NOT BUILDING_WITH_CATKIN) if(BUILDING_WITH_CATKIN)
# Enable Position Independent Code
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
# Cu 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
robot_nav_core2
robot_nav_2d_utils
robot_cpp
)
else()
# ========================================================
# Catkin specific configuration
# ========================================================
find_package(catkin REQUIRED COMPONENTS find_package(catkin REQUIRED COMPONENTS
geometry_msgs geometry_msgs
robot_std_msgs robot_std_msgs
@ -51,194 +40,173 @@ else()
robot_nav_2d_utils robot_nav_2d_utils
robot_cpp 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)
# ========================================================
# Catkin specific configuration
# ========================================================
if(BUILDING_WITH_CATKIN)
catkin_package( catkin_package(
INCLUDE_DIRS include INCLUDE_DIRS include
LIBRARIES costmap_adapter local_planner_adapter global_planner_adapter 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 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() endif()
# ======================================================== # Thư mc include
# Libraries include_directories(
# ======================================================== ${PROJECT_SOURCE_DIR}/include
add_library(costmap_adapter SHARED
src/costmap_adapter.cpp
) )
add_library(local_planner_adapter SHARED if(BUILDING_WITH_CATKIN)
src/local_planner_adapter.cpp include_directories(${catkin_INCLUDE_DIRS})
) endif()
add_library(global_planner_adapter SHARED # ========================================================
src/global_planner_adapter.cpp # Build
# ========================================================
# To thư vin 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
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>)
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
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>)
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()
if(BUILDING_WITH_CATKIN) if(BUILDING_WITH_CATKIN)
add_dependencies(costmap_adapter ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) 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(local_planner_adapter ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
add_dependencies(global_planner_adapter ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) add_dependencies(global_planner_adapter ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
endif()
# costmap_adapter target_include_directories(global_planner_adapter PRIVATE
target_include_directories(costmap_adapter
PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include> $<INSTALL_INTERFACE:include>)
)
target_link_libraries(costmap_adapter # Ensure runtime loader prefers in-tree adapter libs over system/ROS libs.
PUBLIC ${catkin_LIBRARIES} # 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
# local_planner_adapter "${CMAKE_BINARY_DIR}/src/Navigations/Cores/robot_nav_core_adapter"
target_include_directories(local_planner_adapter "${CMAKE_BINARY_DIR}/src/Libraries/robot_costmap_2d"
PUBLIC "${CMAKE_BINARY_DIR}/src/Libraries/tf3"
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> "${CMAKE_BINARY_DIR}/src/Libraries/robot_time"
$<INSTALL_INTERFACE:include> "${CMAKE_BINARY_DIR}/src/Libraries/robot_cpp"
)
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
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>
)
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
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>
)
target_link_libraries(costmap_adapter
PUBLIC
${PACKAGES_DIR}
) )
set_target_properties(costmap_adapter PROPERTIES set_target_properties(costmap_adapter PROPERTIES
LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR} 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
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>
)
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 set_target_properties(local_planner_adapter PROPERTIES
LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR} 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
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>
)
target_link_libraries(global_planner_adapter
PUBLIC costmap_adapter
PRIVATE
${PACKAGES_DIR}
Boost::filesystem Boost::system
dl
)
set_target_properties(global_planner_adapter PROPERTIES set_target_properties(global_planner_adapter PROPERTIES
LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR} LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}
BUILD_RPATH "${CMAKE_BINARY_DIR}"
INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib"
) )
# ========================================================
# Installation
# ========================================================
# 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)
if(NOT BUILDING_WITH_CATKIN)
# Cài đt header files (standalone)
install(DIRECTORY include/robot_nav_core_adapter
DESTINATION include
FILES_MATCHING PATTERN "*.h")
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 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}
)
## 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 costmap_adapter local_planner_adapter global_planner_adapter
EXPORT ${PROJECT_NAME}-targets
ARCHIVE DESTINATION lib
LIBRARY DESTINATION lib
RUNTIME DESTINATION bin
)
# Export targets # Export targets
install(EXPORT ${PROJECT_NAME}-targets install(EXPORT robot_nav_core_adapter-targets
FILE ${PROJECT_NAME}-targets.cmake FILE robot_nav_core_adapter-targets.cmake
NAMESPACE ${PROJECT_NAME}:: DESTINATION lib/cmake/robot_nav_core_adapter)
DESTINATION lib/cmake/${PROJECT_NAME}
)
## Mark cpp header files for installation # Tùy chn build
install(DIRECTORY include/${PROJECT_NAME}/ option(BUILD_SHARED_LIBS "Build shared libraries" ON)
DESTINATION include option(BUILD_TESTS "Build test programs" OFF)
FILES_MATCHING PATTERN "*.h"
PATTERN ".svn" EXCLUDE
)
# Print configuration info # Flags biên dch
# 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 cu hình
message(STATUS "=================================") message(STATUS "=================================")
message(STATUS "Project: ${PROJECT_NAME}") message(STATUS "Project: ${PROJECT_NAME}")
message(STATUS "Version: ${PROJECT_VERSION}") message(STATUS "Version: ${PROJECT_VERSION}")
message(STATUS "C++ Standard: ${CMAKE_CXX_STANDARD}") message(STATUS "C++ Standard: ${CMAKE_CXX_STANDARD}")
message(STATUS "Libraries: costmap_adapter, local_planner_adapter, global_planner_adapter") message(STATUS "Headers found:")
message(STATUS "Dependencies: geometry_msgs, robot_std_msgs, robot_nav_core, robot_nav_core2, robot_nav_2d_utils, robot_cpp, Boost") foreach(hdr ${HEADERS})
message(STATUS " - ${hdr}")
endforeach()
message(STATUS "=================================") message(STATUS "=================================")
endif()

View File

@ -1,48 +1,41 @@
cmake_minimum_required(VERSION 3.0.2) cmake_minimum_required(VERSION 3.10)
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) if(DEFINED CATKIN_DEVEL_PREFIX OR DEFINED CATKIN_TOPLEVEL)
set(BUILDING_WITH_CATKIN TRUE) set(BUILDING_WITH_CATKIN TRUE)
message(STATUS "Building nav_grid with Catkin") message(STATUS "Building nav_grid with Catkin")
else() else()
set(BUILDING_WITH_CATKIN FALSE) set(BUILDING_WITH_CATKIN FALSE)
message(STATUS "Building nav_grid with Standalone CMake") message(STATUS "Building nav_grid with Standalone CMake")
endif() endif()
# C++ Standard - must be set before find_package project(nav_grid VERSION 1.0.0 LANGUAGES CXX)
# Chun C++
set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF) set(CMAKE_CXX_EXTENSIONS OFF)
# ========================================================
# Find dependencies # Find dependencies
find_package(GTest QUIET) # ========================================================
if (NOT BUILDING_WITH_CATKIN) if(BUILDING_WITH_CATKIN)
find_package(catkin REQUIRED)
# Enable Position Independent Code endif()
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
# Cu 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 # Catkin specific configuration
# ======================================================== # ========================================================
find_package(catkin REQUIRED)
if(BUILDING_WITH_CATKIN)
catkin_package( catkin_package(
INCLUDE_DIRS include INCLUDE_DIRS include
# LIBRARIES không cn vì đây là header-only library LIBRARIES nav_grid
)
include_directories(
include
${catkin_INCLUDE_DIRS}
) )
endif() endif()
@ -50,75 +43,60 @@ endif()
file(GLOB_RECURSE HEADERS "include/nav_grid/*.h") file(GLOB_RECURSE HEADERS "include/nav_grid/*.h")
# To INTERFACE library (header-only) # To INTERFACE library (header-only)
add_library(${PROJECT_NAME} INTERFACE) add_library(nav_grid INTERFACE)
# Set include directories
target_include_directories(nav_grid
INTERFACE
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>
)
if(BUILDING_WITH_CATKIN) if(BUILDING_WITH_CATKIN)
add_dependencies(${PROJECT_NAME} ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) add_dependencies(nav_grid ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
# Set include directories
target_include_directories(${PROJECT_NAME}
INTERFACE
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>
)
# 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
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>
)
endif() endif()
if(BUILDING_WITH_CATKIN) # Cài đt header files
## Mark libraries for installation if(NOT BUILDING_WITH_CATKIN)
## See http://docs.ros.org/melodic/api/catkin/html/howto/format1/building_libraries.html install(DIRECTORY include/nav_grid
install(TARGETS ${PROJECT_NAME} DESTINATION include
ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} FILES_MATCHING PATTERN "*.h")
LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} endif()
RUNTIME DESTINATION ${CATKIN_GLOBAL_BIN_DESTINATION}
)
## Mark cpp header files for installation # Cài đt target
install(DIRECTORY include/${PROJECT_NAME}/ install(TARGETS nav_grid
DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION} EXPORT nav_grid-targets
FILES_MATCHING PATTERN "*.h"
PATTERN ".svn" EXCLUDE
)
else()
install(TARGETS ${PROJECT_NAME}
EXPORT ${PROJECT_NAME}-targets
ARCHIVE DESTINATION lib ARCHIVE DESTINATION lib
LIBRARY DESTINATION lib LIBRARY DESTINATION lib
RUNTIME DESTINATION bin RUNTIME DESTINATION bin)
)
# Export targets # Export targets
install(EXPORT ${PROJECT_NAME}-targets install(EXPORT nav_grid-targets
FILE ${PROJECT_NAME}-targets.cmake FILE nav_grid-targets.cmake
NAMESPACE ${PROJECT_NAME}:: NAMESPACE nav_grid::
DESTINATION lib/cmake/${PROJECT_NAME} DESTINATION lib/cmake/nav_grid)
# Tùy chn build tests
option(BUILD_TESTING "Build test programs" OFF)
if(BUILD_TESTING)
find_package(GTest REQUIRED)
# To test executable
add_executable(nav_grid_test test/utest.cpp)
target_link_libraries(nav_grid_test
PRIVATE
nav_grid
GTest::GTest
GTest::Main
) )
## Mark cpp header files for installation # Thêm test vào CTest
install(DIRECTORY include/${PROJECT_NAME}/ enable_testing()
DESTINATION include add_test(NAME nav_grid_test COMMAND nav_grid_test)
FILES_MATCHING PATTERN "*.h" endif()
PATTERN ".svn" EXCLUDE
)
# Print configuration info # In thông tin cu hình
message(STATUS "=================================") message(STATUS "=================================")
message(STATUS "Project: ${PROJECT_NAME} (Header-Only)") message(STATUS "Project: ${PROJECT_NAME} (Header-Only)")
message(STATUS "Version: ${PROJECT_VERSION}") message(STATUS "Version: ${PROJECT_VERSION}")
@ -127,27 +105,5 @@ else()
foreach(hdr ${HEADERS}) foreach(hdr ${HEADERS})
message(STATUS " - ${hdr}") message(STATUS " - ${hdr}")
endforeach() endforeach()
message(STATUS "Dependencies: None") message(STATUS "Build tests: ${BUILD_TESTING}")
message(STATUS "=================================") 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()

View File

@ -1,54 +1,35 @@
cmake_minimum_required(VERSION 3.0.2) cmake_minimum_required(VERSION 3.10)
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) if(DEFINED CATKIN_DEVEL_PREFIX OR DEFINED CATKIN_TOPLEVEL)
set(BUILDING_WITH_CATKIN TRUE) set(BUILDING_WITH_CATKIN TRUE)
message(STATUS "Building move_base with Catkin") message(STATUS "Building move_base with Catkin")
else() else()
set(BUILDING_WITH_CATKIN FALSE) set(BUILDING_WITH_CATKIN FALSE)
message(STATUS "Building move_base with Standalone CMake") message(STATUS "Building move_base with Standalone CMake")
endif() endif()
# C++ Standard - must be set before find_package # Tên d án
project(move_base VERSION 1.0.0 LANGUAGES CXX)
# Chun C++
set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
# Find dependencies if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE Release)
endif()
# ========================================================
# Find Packages
# ========================================================
find_package(Boost REQUIRED COMPONENTS filesystem system) find_package(Boost REQUIRED COMPONENTS filesystem system)
find_package(Threads REQUIRED)
find_package(yaml-cpp REQUIRED)
if (NOT BUILDING_WITH_CATKIN) if(BUILDING_WITH_CATKIN)
# Enable Position Independent Code
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
# Cu 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 find_package(catkin REQUIRED COMPONENTS
geometry_msgs geometry_msgs
robot_std_msgs robot_std_msgs
@ -61,145 +42,175 @@ else()
robot_nav_2d_utils robot_nav_2d_utils
robot_cpp 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( catkin_package(
INCLUDE_DIRS include INCLUDE_DIRS include
LIBRARIES ${PROJECT_NAME} LIBRARIES move_base
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 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() endif()
# ======================================================== # ========================================================
# Libraries # Include Directories
# ======================================================== # ========================================================
add_library(${PROJECT_NAME} SHARED include_directories(
src/move_base.cpp ${PROJECT_SOURCE_DIR}/include
) )
if(BUILDING_WITH_CATKIN) if(BUILDING_WITH_CATKIN)
add_dependencies(${PROJECT_NAME} ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) include_directories(${catkin_INCLUDE_DIRS})
endif()
target_include_directories(${PROJECT_NAME}
PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>
)
target_link_libraries(${PROJECT_NAME} # ========================================================
# RPATH settings: ưu tiên thư vin build ti 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
PUBLIC ${catkin_LIBRARIES} PUBLIC ${catkin_LIBRARIES}
PRIVATE Boost::filesystem Boost::system 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 vi plugins library đ có StaticLayer typeinfo
yaml-cpp
robot_tf3_sensor_msgs
robot_tf3_geometry_msgs
data_convert
dl dl
pthread
robot_nav_2d_utils
) )
else() target_link_libraries(move_base
PUBLIC ${PACKAGES_DIR}
PUBLIC robot_cpp
PRIVATE Boost::filesystem Boost::system
)
endif()
target_include_directories(${PROJECT_NAME} # Set RPATH đ ưu tiên thư vin build cc 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 PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include> $<INSTALL_INTERFACE:include>
) )
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()
# ======================================================== # ========================================================
# Executable # Executable
# ======================================================== # ========================================================
add_executable(${PROJECT_NAME}_main src/move_base_main.cpp) add_executable(move_base_main src/move_base_main.cpp)
target_link_libraries(move_base_main
if(BUILDING_WITH_CATKIN) PRIVATE move_base robot_cpp
target_link_libraries(${PROJECT_NAME}_main PRIVATE PRIVATE Boost::filesystem Boost::system
${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
) )
# Configure RPATH to find libraries in devel space # Set RPATH for executable to find libraries in build directory first
set_target_properties(${PROJECT_NAME}_main PROPERTIES # Use RPATH instead of RUNPATH for higher priority
BUILD_WITH_INSTALL_RPATH FALSE
INSTALL_RPATH_USE_LINK_PATH TRUE # Force use of RPATH instead of RUNPATH
BUILD_RPATH "${CMAKE_BINARY_DIR}" set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--disable-new-dtags")
# ========================================================
# Installation
# ========================================================
if(NOT BUILDING_WITH_CATKIN)
# Standalone CMake installation
install(DIRECTORY include/move_base
DESTINATION include
FILES_MATCHING PATTERN "*.h"
) )
endif() endif()
# ======================================================== install(TARGETS move_base move_base_main
# Install EXPORT move_base-targets
# ========================================================
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}
)
## 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 LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib
RUNTIME DESTINATION bin RUNTIME DESTINATION bin
) )
# Export targets if(NOT BUILDING_WITH_CATKIN)
install(EXPORT ${PROJECT_NAME}-targets install(EXPORT move_base-targets
FILE ${PROJECT_NAME}-targets.cmake FILE move_base-targets.cmake
NAMESPACE ${PROJECT_NAME}:: DESTINATION lib/cmake/move_base
DESTINATION lib/cmake/${PROJECT_NAME}
) )
endif()
## Mark cpp header files for installation
install(DIRECTORY include/${PROJECT_NAME}/
DESTINATION include
FILES_MATCHING PATTERN "*.h"
PATTERN ".svn" EXCLUDE
)
# Print configuration info # ========================================================
# 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 "=================================")
message(STATUS "Project: ${PROJECT_NAME}") message(STATUS "Project: ${PROJECT_NAME}")
message(STATUS "Version: ${PROJECT_VERSION}") message(STATUS "Version: ${PROJECT_VERSION}")
message(STATUS "Build mode: ${BUILDING_WITH_CATKIN}")
message(STATUS "C++ Standard: ${CMAKE_CXX_STANDARD}") message(STATUS "C++ Standard: ${CMAKE_CXX_STANDARD}")
message(STATUS "Libraries: ${PROJECT_NAME}") message(STATUS "Build type: ${CMAKE_BUILD_TYPE}")
message(STATUS "Executables: ${PROJECT_NAME}_main") message(STATUS "Headers found:")
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") foreach(hdr ${HEADERS})
message(STATUS " - ${hdr}")
endforeach()
message(STATUS "=================================") message(STATUS "=================================")
endif()