321 lines
9.0 KiB
CMake
321 lines
9.0 KiB
CMake
cmake_minimum_required(VERSION 3.0)
|
|
|
|
project(flightlib VERSION 0.1.0)
|
|
|
|
message(STATUS "====================== !Flightmare! ======================")
|
|
|
|
# ###############################################################################
|
|
# Options
|
|
# ###############################################################################
|
|
option(ENABLE_FAST "Build with optimizations for speed" ON)
|
|
option(ENABLE_BLAS "Build using BLAS and LAPACK libraries" OFF)
|
|
option(ENABLE_PARALLEL "Build using openmp parallelization" ON)
|
|
option(EIGEN_FROM_SYSTTEM "Use the system-provided Eigen" ON)
|
|
set(
|
|
EIGEN_ALTERNATIVE "" CACHE STRING
|
|
"Path to alternative Eigen, autodownload if blank"
|
|
)
|
|
|
|
# ###############################################################################
|
|
# Finding Dependencies
|
|
# ###############################################################################
|
|
|
|
# Eigen3
|
|
message(STATUS "======> Setup Dependencies")
|
|
|
|
if(EIGEN_FROM_SYSTTEM)
|
|
find_package(Eigen3 3.3.4 QUIET)
|
|
|
|
if(EIGEN3_FOUND)
|
|
message(STATUS "Using system provided Eigen.")
|
|
message(${EIGEN3_INCLUDE_DIR})
|
|
else()
|
|
message(STATUS "No sufficient Eigen version (3.3.4) found.")
|
|
message(STATUS "Restoring to download Eigen sources.")
|
|
include(cmake/eigen.cmake)
|
|
endif()
|
|
elseif(EIGEN_ALTERNATIVE STREQUAL "")
|
|
include(cmake/eigen.cmake)
|
|
else()
|
|
set(EIGEN_INCLUDE_DIR ${EIGEN_ALTERNATIVE})
|
|
endif()
|
|
|
|
message(STATUS "Eigen3 include dir: ${EIGEN3_INCLUDE_DIR}")
|
|
|
|
# PCL (Many VTK errors are reported, but do not affect compilation)
|
|
find_package(PCL 1.10 REQUIRED)
|
|
message(STATUS "Using system provided PCL.")
|
|
message(${PCL_INCLUDE_DIRS})
|
|
include_directories(${PCL_INCLUDE_DIRS})
|
|
link_directories(${PCL_LIBRARY_DIRS})
|
|
add_definitions(${PCL_DEFINITIONS})
|
|
|
|
# Including dependencies
|
|
find_package(OpenCV REQUIRED)
|
|
include_directories(${OpenCV_INCLUDE_DIRS})
|
|
|
|
# Including dependencies
|
|
include(cmake/pybind11.cmake)
|
|
include(cmake/yaml.cmake)
|
|
|
|
# Including OpenMP & CUDA
|
|
find_package(OpenMP REQUIRED)
|
|
find_package(CUDA REQUIRED)
|
|
|
|
if(ENABLE_BLAS)
|
|
set(BLA_VENDOR "Generic")
|
|
find_package(BLAS REQUIRED)
|
|
|
|
if(BLAS_FOUND)
|
|
message(STATUS "Found BLAS: ${BLAS_LIBRARIES}")
|
|
else()
|
|
message(ERROR "Could not enable BLAS because BLAS was not found")
|
|
endif()
|
|
|
|
find_package(LAPACK REQUIRED)
|
|
|
|
if(LAPACK_FOUND)
|
|
message(STATUS "Found Lapack: ${LAPACK_LIBRARIES}")
|
|
else()
|
|
message(ERROR "Could not enable LAPACK because LAPACK was not found")
|
|
endif()
|
|
endif()
|
|
|
|
# Check for ccache
|
|
if(NOT DEFINED CATKIN_DEVEL_PREFIX)
|
|
find_program(CCACHE_PROGRAM ccache)
|
|
|
|
if(CCACHE_PROGRAM)
|
|
set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "${CCACHE_PROGRAM}")
|
|
else()
|
|
message(INFO "Build time could be improved with ccache!")
|
|
message(INFO "sudo apt install ccache")
|
|
endif()
|
|
endif()
|
|
|
|
# ###############################################################################
|
|
# Setup Compilation Flag
|
|
# ###############################################################################
|
|
message(STATUS "======> Setup Compilation ")
|
|
|
|
add_definitions(-DEIGEN_STACK_ALLOCATION_LIMIT=1048576)
|
|
include_directories(${EIGEN_INCLUDE_DIR} "tests")
|
|
include_directories(${OpenCV_INCLUDE_DIRS})
|
|
|
|
# Set default build type
|
|
if(NOT EXISTS ${CMAKE_BINARY_DIR}/CMakeCache.txt)
|
|
if(NOT CMAKE_BUILD_TYPE)
|
|
set(CMAKE_BUILD_TYPE "Release" CACHE STRING "" FORCE)
|
|
endif()
|
|
endif()
|
|
|
|
cuda_select_nvcc_arch_flags(CUDA_ARCH_FLAGS)
|
|
message("CUDA Architecture: ${CUDA_ARCH_FLAGS}")
|
|
|
|
if(${CMAKE_BUILD_TYPE} STREQUAL Release)
|
|
SET(CUDA_NVCC_FLAGS "${CUDA_ARCH_FLAGS};-O3;-use_fast_math" CACHE STRING "nvcc flags" FORCE)
|
|
message("build CUDA with -O3")
|
|
else()
|
|
message("build CUDA with Debug")
|
|
SET(CUDA_NVCC_FLAGS "-g ;-G ;${CUDA_ARCH_FLAGS}" CACHE STRING "nvcc flags" FORCE)
|
|
SET(CUDA_VERBOSE_BUILD ON CACHE BOOL "nvcc verbose" FORCE)
|
|
endif()
|
|
|
|
# Add c++ flags
|
|
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS} -fPIC -Wall -DNDEBUG -fopenmp")
|
|
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS} -fPIC -Wall -g -fopenmp")
|
|
set(CMAKE_CXX_STANDARD 17)
|
|
|
|
# Architectural flags
|
|
if("${CMAKE_HOST_SYSTEM_PROCESSOR}" STREQUAL "armv7l")
|
|
message(STATUS "Using ARMv7 optimized flags!")
|
|
set(CMAKE_CXX_ARCH_FLAGS " -Wno-psabi -march=armv7-a -mfpu=neon -mfloat-abi=hard -funsafe-math-optimizations")
|
|
elseif("${CMAKE_HOST_SYSTEM_PROCESSOR}" STREQUAL "aarch64")
|
|
message(STATUS "Using ARM aarch64 optimized flags!")
|
|
set(CMAKE_CXX_ARCH_FLAGS " -Wno-psabi -march=armv8-a+crypto -mcpu=cortex-a57+crypto")
|
|
else()
|
|
set(CMAKE_CXX_ARCH_FLAGS " -march=native")
|
|
endif()
|
|
|
|
# Optimized flags
|
|
if(ENABLE_FAST)
|
|
message(STATUS "Enabling fast optimization flags!")
|
|
set(CMAKE_CXX_FAST_FLAGS " -Ofast")
|
|
else()
|
|
set(CMAKE_CXX_FAST_FLAGS " -O0")
|
|
endif()
|
|
|
|
# BLAS Flags
|
|
if(BLAS_FOUND AND LAPACK_FOUND)
|
|
message(STATUS "Enabling BLAS and LAPACK")
|
|
set(CMAKE_CXX_BLAS_FLAGS " -DEIGEN_USE_BLAS -DEIGEN_USE_LAPACK -DEIGEN_USE_LAPACKE")
|
|
else()
|
|
set(CMAKE_CXX_BLAS_FLAGS "")
|
|
endif()
|
|
|
|
# Summarize Flags
|
|
set(CMAKE_CXX_FLAGS_RELEASE
|
|
"${CMAKE_CXX_FLAGS_RELEASE} ${CMAKE_CXX_FAST_FLAGS} ${CMAKE_CXX_ARCH_FLAGS} ${CMAKE_CXX_PAR_FLAGS}")
|
|
string(REPLACE "-DNDEBUG" "" CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}")
|
|
message(STATUS "The activated CXX RELEASE configuration is:\n ${CMAKE_CXX_FLAGS_RELEASE}")
|
|
message(STATUS "The activated CXX DEBUG configuration is:\n ${CMAKE_CXX_FLAGS_DEBUG}")
|
|
|
|
# ###############################################################################
|
|
# Specify Build Resources
|
|
# ###############################################################################
|
|
message(STATUS "======> Setup Build ")
|
|
|
|
add_subdirectory(${PROJECT_SOURCE_DIR}/third_party/arc_utilities)
|
|
add_subdirectory(${PROJECT_SOURCE_DIR}/third_party/sdf_tools)
|
|
|
|
# Create file lists for flightlib source
|
|
file(GLOB_RECURSE FLIGHTLIB_SOURCES
|
|
src/bridges/*.cpp
|
|
src/objects/*.cpp
|
|
src/sensors/*.cpp
|
|
src/sensors/*.cu
|
|
src/envs/*.cpp
|
|
src/common/*.cpp
|
|
src/grad_traj_optimization/*.cpp
|
|
)
|
|
|
|
# Create file lists for flightlib_gym source
|
|
file(GLOB_RECURSE FLIGHTLIB_GYM_SOURCES
|
|
src/wrapper/*.cpp
|
|
)
|
|
|
|
# ###############################################################################
|
|
# Optional Catkin Build
|
|
# ###############################################################################
|
|
if(DEFINED CATKIN_DEVEL_PREFIX)
|
|
message(STATUS "======> Building with -- catkin -- ")
|
|
include(cmake/catkin.cmake)
|
|
return()
|
|
endif()
|
|
|
|
find_package(catkin REQUIRED COMPONENTS
|
|
roscpp
|
|
sdf_tools
|
|
pcl_ros
|
|
pcl_conversions
|
|
sensor_msgs
|
|
)
|
|
|
|
# ###############################################################################
|
|
# Setup Build
|
|
# ###############################################################################
|
|
|
|
# Library and Executables
|
|
include_directories(include)
|
|
include_directories(${PROJECT_SOURCE_DIR}/third_party/sdf_tools/include)
|
|
include_directories(${PROJECT_SOURCE_DIR}/third_party/arc_utilities/include)
|
|
|
|
# 1. The Training Lib
|
|
if(NOT FLIGHTLIB_SOURCES)
|
|
set(LIBRARY_NAME)
|
|
else()
|
|
# flightlib -CUDA
|
|
cuda_add_library(${PROJECT_NAME} ${FLIGHTLIB_SOURCES})
|
|
target_link_libraries(${PROJECT_NAME} # PRIVATE
|
|
${OpenCV_LIBRARIES}
|
|
${PCL_LIBRARIES}
|
|
${CUDA_curand_LIBRARY}
|
|
${CUDA_cublas_LIBRARY}
|
|
${CUDA_LIBRARIES}
|
|
${catkin_LIBRARIES} ${PCL_LIBRARIES} ${PROJECT_SOURCE_DIR}
|
|
yaml-cpp
|
|
zmq
|
|
zmqpp
|
|
stdc++fs)
|
|
set(LIBRARY_NAME ${PROJECT_NAME})
|
|
set_target_properties(${PROJECT_NAME} PROPERTIES POSITION_INDEPENDENT_CODE TRUE)
|
|
endif()
|
|
|
|
if(FLIGHTLIB_GYM_SOURCES)
|
|
# flightlib_gym (python3 binding with Pybind11)
|
|
pybind11_add_module(flightgym MODULE
|
|
${FLIGHTLIB_GYM_SOURCES})
|
|
|
|
if(EIGEN3_FOUND)
|
|
target_include_directories(flightgym PRIVATE
|
|
|
|
# ${PROJECT_SOURCE_DIR}/externals/pybind11-src/include
|
|
${PYBIND11_INCLUDE_DIR}
|
|
${PROJECT_SOURCE_DIR}/include
|
|
${EIGEN3_INCLUDE_DIR})
|
|
else()
|
|
target_include_directories(flightgym PRIVATE
|
|
|
|
# ${PROJECT_SOURCE_DIR}/externals/pybind11-src/include
|
|
${PYBIND11_INCLUDE_DIR}
|
|
${PROJECT_SOURCE_DIR}/externals/eigen/eigen3 # pybind11 use #include <Eigen/Core>, however, flightmare use #include <eigen3/Eigen/Core>
|
|
${PROJECT_SOURCE_DIR}/include)
|
|
endif()
|
|
|
|
target_link_libraries(flightgym PRIVATE ${LIBRARY_NAME})
|
|
endif()
|
|
|
|
if(ENABLE_BLAS AND BLAS_FOUND AND LAPACK_FOUND)
|
|
message(STATUS "Linking standard BLAS ${BLAS_LIBRARIES}")
|
|
target_link_libraries(${LIBRARY_NAME}
|
|
${BLAS_LIBRARIES}
|
|
${LAPACK_LIBRARIES}
|
|
${LAPACKE_LIBRARIES}
|
|
)
|
|
endif()
|
|
|
|
# Build Other ROS PKG
|
|
find_package(catkin REQUIRED COMPONENTS
|
|
tf
|
|
nav_msgs
|
|
cv_bridge
|
|
)
|
|
|
|
include_directories(
|
|
${catkin_INCLUDE_DIRS}
|
|
${PROJECT_SOURCE_DIR}/include
|
|
)
|
|
|
|
# 2. ROS Simulation Node
|
|
add_executable(flightros_node
|
|
src/ros_nodes/flight_pilot.cpp
|
|
src/ros_nodes/flight_pilot_node.cpp
|
|
)
|
|
|
|
target_link_libraries(flightros_node
|
|
${LIBRARY_NAME}
|
|
${catkin_LIBRARIES}
|
|
${OpenCV_LIBRARIES}
|
|
zmqpp
|
|
stdc++fs
|
|
)
|
|
|
|
# 3. The Planner
|
|
add_executable(yopo_planner_node
|
|
src/ros_nodes/yopo_planner_node.cpp
|
|
)
|
|
target_link_libraries(yopo_planner_node
|
|
${LIBRARY_NAME}
|
|
${catkin_LIBRARIES}
|
|
)
|
|
|
|
# 4. Tool: Trajectory Evaluation
|
|
add_executable(traj_eval_node
|
|
src/ros_nodes/traj_eval_node.cpp
|
|
)
|
|
target_link_libraries(traj_eval_node
|
|
${LIBRARY_NAME}
|
|
${catkin_LIBRARIES}
|
|
)
|
|
|
|
# 5. Tool: Map Visualization
|
|
add_executable(map_visual_node
|
|
src/ros_nodes/map_visual_node.cpp
|
|
)
|
|
target_link_libraries(map_visual_node
|
|
${LIBRARY_NAME}
|
|
${catkin_LIBRARIES}
|
|
)
|
|
|
|
message(STATUS "================ !Done. No more nightmare! ================")
|