diff --git a/CMakeLists.txt b/CMakeLists.txt index d70a2e1..8515781 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,51 +1,39 @@ -# --- CMake version và project name --- -cmake_minimum_required(VERSION 3.10) -project(custom_planner) +cmake_minimum_required(VERSION 3.0.2) +project(custom_planner VERSION 1.0.0 LANGUAGES CXX) -# --- C++ standard và position independent code --- -set(CMAKE_CXX_STANDARD 17) # Sử dụng C++17 -set(CMAKE_POSITION_INDEPENDENT_CODE ON) # Thư viện có thể build thành shared lib +if(DEFINED CATKIN_DEVEL_PREFIX OR DEFINED CATKIN_TOPLEVEL) + set(BUILDING_WITH_CATKIN TRUE) + message(STATUS "Building custom_planner with Catkin") -# --- RPATH settings: ưu tiên thư viện build tại chỗ --- -# Dùng để runtime linker tìm thư viện đã build trước khi install -set(CMAKE_SKIP_BUILD_RPATH FALSE) -set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE) -set(CMAKE_BUILD_RPATH "${CMAKE_BINARY_DIR}/custom_planner") -set(CMAKE_INSTALL_RPATH "${CMAKE_BINARY_DIR}/custom_planner") -set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) +else() + set(BUILDING_WITH_CATKIN FALSE) + message(STATUS "Building custom_planner with Standalone CMake") +endif() -# --- Dependencies --- -# Tìm các thư viện cần thiết -# find_package(tf3 REQUIRED) # Nếu dùng tf3 -find_package(Eigen3 REQUIRED) # Thư viện Eigen cho toán học -find_package(Boost REQUIRED COMPONENTS system thread filesystem) # Boost: system, thread, filesystem +# C++ Standard - must be set before find_package +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_CXX_EXTENSIONS OFF) -# --- Include directories --- -# Thêm các folder chứa header files -include_directories( - include - ${EIGEN3_INCLUDE_DIRS} - ${Boost_INCLUDE_DIRS} -) +# Find dependencies +find_package(Eigen3 REQUIRED) +find_package(Boost REQUIRED COMPONENTS system thread filesystem) -# --- Eigen và PCL definitions --- -add_definitions(${EIGEN3_DEFINITIONS}) +if (NOT BUILDING_WITH_CATKIN) -# --- Core library: custom_planner --- -# Tạo thư viện chính -add_library(custom_planner - src/custom_planner.cpp - src/pathway.cc - src/pose.cc - src/Curve_common.cpp - src/merge_path_calc.cpp -) + # Enable Position Independent Code + set(CMAKE_POSITION_INDEPENDENT_CODE ON) -# --- Link các thư viện phụ thuộc --- -target_link_libraries(custom_planner - ${Boost_LIBRARIES} # Boost + # Cấu hình RPATH để tránh cycle trong runtime search path + set(CMAKE_BUILD_RPATH_USE_ORIGIN TRUE) + set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) + set(CMAKE_BUILD_RPATH "${CMAKE_BINARY_DIR}") + + set(PACKAGES_DIR robot_visualization_msgs robot_nav_msgs + robot_std_msgs + robot_geometry_msgs tf3 robot_tf3_geometry_msgs robot_time @@ -53,58 +41,139 @@ target_link_libraries(custom_planner robot_costmap_2d robot_nav_core robot_protocol_msgs + robot_cpp + ) + +else() + +# ======================================================== +# Catkin specific configuration +# ======================================================== + find_package(catkin REQUIRED COMPONENTS + robot_visualization_msgs + robot_nav_msgs + robot_std_msgs + robot_geometry_msgs + tf3 + robot_tf3_geometry_msgs + robot_time + data_convert + robot_costmap_2d + robot_nav_core + robot_protocol_msgs + robot_cpp + ) + + catkin_package( + INCLUDE_DIRS include + LIBRARIES ${PROJECT_NAME} + CATKIN_DEPENDS robot_visualization_msgs robot_nav_msgs robot_std_msgs robot_geometry_msgs tf3 robot_tf3_geometry_msgs robot_time data_convert robot_costmap_2d robot_nav_core robot_protocol_msgs robot_cpp + DEPENDS Eigen3 Boost + ) + + include_directories( + include + ${catkin_INCLUDE_DIRS} + ${EIGEN3_INCLUDE_DIRS} + ${Boost_INCLUDE_DIRS} + ) +endif() + +# ======================================================== +# Libraries +# ======================================================== +add_library(${PROJECT_NAME} SHARED + src/custom_planner.cpp + src/pathway.cc + src/pose.cc + src/Curve_common.cpp + src/merge_path_calc.cpp ) -# --- Include directories cho target --- -target_include_directories(custom_planner - PUBLIC - ${Boost_INCLUDE_DIRS} # Boost headers - $ # Khi build từ source - $ # Khi install - ) +if(BUILDING_WITH_CATKIN) + add_dependencies(${PROJECT_NAME} ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) -# --- Cài đặt thư viện vào hệ thống khi chạy make install --- -install(TARGETS custom_planner - EXPORT custom_planner-targets - ARCHIVE DESTINATION lib # Thư viện tĩnh .a - LIBRARY DESTINATION lib # Thư viện động .so - RUNTIME DESTINATION bin # File thực thi (nếu có) - INCLUDES DESTINATION include # Cài đặt include -) + target_include_directories(${PROJECT_NAME} + PUBLIC + $ + $ + ) -# --- Xuất export set robot_costmap_2dTargets thành file CMake module --- -# --- Tạo file lib/cmake/custom_planner/robot_costmap_2dTargets.cmake --- -# --- File này chứa cấu hình giúp project khác có thể dùng --- -# --- Find_package(custom_planner REQUIRED) --- -# --- Target_link_libraries(my_app PRIVATE custom_planner::custom_planner) --- -install(EXPORT custom_planner-targets - FILE custom_planner-targets.cmake - NAMESPACE custom_planner:: - DESTINATION lib/cmake/custom_planner -) + target_link_libraries(${PROJECT_NAME} + PUBLIC ${catkin_LIBRARIES} + PRIVATE Eigen3::Eigen Boost::system Boost::thread Boost::filesystem + ) -# --- Cài đặt headers --- -install(DIRECTORY include/${PROJECT_NAME}/ - DESTINATION include/${PROJECT_NAME} -) +else() -# # --- Plugin libraries --- -# # Tạo các plugin shared library -# add_library(plugins -# SHARED -# plugins/static_layer.cpp -# plugins/obstacle_layer.cpp -# plugins/inflation_layer.cpp -# plugins/voxel_layer.cpp -# plugins/critical_layer.cpp -# plugins/directional_layer.cpp -# plugins/preferred_layer.cpp -# plugins/unpreferred_layer.cpp -# ) + target_include_directories(${PROJECT_NAME} + PUBLIC + $ + $ + ) -# target_link_libraries(plugins -# custom_planner -# ${Boost_LIBRARIES} -# yaml-cpp -# robot_time -# ) \ No newline at end of file + target_link_libraries(${PROJECT_NAME} + PUBLIC + ${PACKAGES_DIR} + PRIVATE + Eigen3::Eigen Boost::system Boost::thread Boost::filesystem + ) + + 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 +# ======================================================== +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 + RUNTIME DESTINATION bin + ) + + # Export targets + install(EXPORT ${PROJECT_NAME}-targets + FILE ${PROJECT_NAME}-targets.cmake + NAMESPACE ${PROJECT_NAME}:: + DESTINATION lib/cmake/${PROJECT_NAME} + ) + + ## Mark cpp header files for installation + install(DIRECTORY include/${PROJECT_NAME}/ + DESTINATION include + FILES_MATCHING PATTERN "*.h" + PATTERN ".svn" EXCLUDE + ) + + # Print configuration info + message(STATUS "=================================") + message(STATUS "Project: ${PROJECT_NAME}") + message(STATUS "Version: ${PROJECT_VERSION}") + message(STATUS "C++ Standard: ${CMAKE_CXX_STANDARD}") + message(STATUS "Dependencies: robot_visualization_msgs, robot_nav_msgs, robot_std_msgs, robot_geometry_msgs, tf3, robot_tf3_geometry_msgs, robot_time, data_convert, robot_costmap_2d, robot_nav_core, robot_protocol_msgs, robot_cpp, Eigen3, Boost") + message(STATUS "=================================") +endif() diff --git a/package.xml b/package.xml new file mode 100644 index 0000000..e29ff1a --- /dev/null +++ b/package.xml @@ -0,0 +1,58 @@ + + custom_planner + 0.7.10 + + custom_planner is the second generation of the transform library, which lets + the user keep track of multiple coordinate frames over time. custom_planner + maintains the relationship between coordinate frames in a tree + structure buffered in time, and lets the user transform points, + vectors, etc between any two coordinate frames at any desired + point in time. + + Tully Foote + Eitan Marder-Eppstein + Wim Meeussen + Tully Foote + BSD + + http://www.ros.org/wiki/custom_planner + + catkin + + robot_costmap_2d + robot_costmap_2d + + robot_nav_core + robot_nav_core + + robot_geometry_msgs + robot_geometry_msgs + + robot_nav_msgs + robot_nav_msgs + + robot_std_msgs + robot_std_msgs + + tf3 + tf3 + + robot_tf3_geometry_msgs + robot_tf3_geometry_msgs + + robot_cpp + robot_cpp + + robot_protocol_msgs + robot_protocol_msgs + + robot_time + robot_time + + robot_visualization_msgs + robot_visualization_msgs + + data_convert + data_convert + + \ No newline at end of file