详细解释一个ros的CMakeLists.txt文件
一. CMake环境变量设置
# 指定 CMake 的最低版本要求(3.0.2)。
cmake_minimum_required(VERSION 3.0.2)
# 定义项目名称 ocs2_legged_robot_ros。
project(ocs2_legged_robot_ros)# 生成 compile_commands.json 文件,用于支持 clang-tidy 等静态分析工具。
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)# 定义该 ROS 包依赖的其他 ROS 包,包括:
# 基础 ROS 库(roslib, tf, urdf)
# OCS2 相关库(ocs2_core, ocs2_oc, ocs2_ddp, ocs2_mpc 等)
# 机器人相关库(kdl_parser, robot_state_publisher)
set(CATKIN_PACKAGE_DEPENDENCIESroslibcmake_modulestfurdfkdl_parserrobot_state_publisherocs2_coreocs2_ococs2_ddpocs2_mpcocs2_sqpocs2_ipmocs2_robotic_toolsocs2_pinocchio_interfaceocs2_centroidal_modelocs2_robotic_assetsocs2_msgsocs2_ros_interfacesocs2_legged_robot
)
二. 包查询
关于包查询的具体的命令解析可以看这篇文章
# 使用 catkin(ROS 的构建系统)查找并加载所有依赖的 ROS 包。
find_package(catkin REQUIRED COMPONENTS${CATKIN_PACKAGE_DEPENDENCIES}
)# 查找 Boost 库,并指定需要 system 和 filesystem 组件。
find_package(Boost REQUIRED COMPONENTSsystemfilesystem
)# 查找 Eigen3(线性代数库),要求版本 ≥ 3.3
find_package(Eigen3 3.3 REQUIRED NO_MODULE)# 使用 pkg-config 查找 pinocchio(机器人动力学库)。
find_package(PkgConfig REQUIRED)
pkg_check_modules(pinocchio REQUIRED pinocchio)
###################################
## catkin specific configuration ##
#################################### catkin_package(...)
# 定义该 ROS 包的导出信息:
# INCLUDE_DIRS:指定头文件目录(include 和 Eigen3)。
# LIBRARIES:生成的库(${PROJECT_NAME})。
# CATKIN_DEPENDS:依赖的 ROS 包。
# DEPENDS:非 ROS 依赖(Boost, pinocchio)。
catkin_package(INCLUDE_DIRSinclude${EIGEN3_INCLUDE_DIRS}LIBRARIES${PROJECT_NAME}CATKIN_DEPENDS${CATKIN_PACKAGE_DEPENDENCIES}DEPENDSBoostpinocchio
)###########
## Build ##
############ 四. 构建配置
# 添加头文件搜索路径:
# 本地 include 目录
# pinocchio, Eigen3, Boost, catkin 的头文件目录
include_directories(include${pinocchio_INCLUDE_DIRS}${EIGEN3_INCLUDE_DIRS}${Boost_INCLUDE_DIRS}${catkin_INCLUDE_DIRS}
)# 添加 pinocchio 的库文件搜索路径。
link_directories(${pinocchio_LIBRARY_DIRS}
)# 五. 构建目标
# 主库 add_library(${PROJECT_NAME} ...)
# 编译 src/gait/ 和 src/visualization/ 下的源文件,生成库 ocs2_legged_robot_ros。
# add_dependencies 确保依赖项先构建。
# target_link_libraries 链接 catkin 和 Boost 库。
# target_compile_options 应用 OCS2_CXX_FLAGS(可能是优化或警告选项)。
add_library(${PROJECT_NAME}src/gait/GaitKeyboardPublisher.cppsrc/gait/GaitReceiver.cppsrc/visualization/LeggedRobotVisualizer.cpp
)
add_dependencies(${PROJECT_NAME}${${PROJECT_NAME}_EXPORTED_TARGETS}${catkin_EXPORTED_TARGETS}
)
target_link_libraries(${PROJECT_NAME}${catkin_LIBRARIES}${Boost_LIBRARIES}
)
target_compile_options(${PROJECT_NAME} PUBLIC ${OCS2_CXX_FLAGS})# 多个可执行文件
# DDP-MPC 控制节点
# DDP-MPC node for legged robot
add_executable(legged_robot_ddp_mpcsrc/LeggedRobotDdpMpcNode.cpp
)
add_dependencies(legged_robot_ddp_mpc${PROJECT_NAME}${${PROJECT_NAME}_EXPORTED_TARGETS}${catkin_EXPORTED_TARGETS}
)
target_link_libraries(legged_robot_ddp_mpc${PROJECT_NAME}${catkin_LIBRARIES}
)
target_compile_options(legged_robot_ddp_mpc PRIVATE ${OCS2_CXX_FLAGS})# SQP-MPC 控制节点
## SQP-MPC node for legged robot
add_executable(legged_robot_sqp_mpcsrc/LeggedRobotSqpMpcNode.cpp
)
add_dependencies(legged_robot_sqp_mpc${PROJECT_NAME}${${PROJECT_NAME}_EXPORTED_TARGETS}${catkin_EXPORTED_TARGETS}
)
target_link_libraries(legged_robot_sqp_mpc${PROJECT_NAME}${catkin_LIBRARIES}
)
target_compile_options(legged_robot_sqp_mpc PRIVATE ${OCS2_CXX_FLAGS})# IPM-MPC 控制节点
## IPM-MPC node for legged robot
add_executable(legged_robot_ipm_mpcsrc/LeggedRobotIpmMpcNode.cpp
)
add_dependencies(legged_robot_ipm_mpc${PROJECT_NAME}${${PROJECT_NAME}_EXPORTED_TARGETS}${catkin_EXPORTED_TARGETS}
)
target_link_libraries(legged_robot_ipm_mpc${PROJECT_NAME}${catkin_LIBRARIES}
)
target_compile_options(legged_robot_ipm_mpc PRIVATE ${OCS2_CXX_FLAGS})# 虚拟节点(可能用于测试)
# Dummy node
add_executable(legged_robot_dummysrc/LeggedRobotDummyNode.cpp
)
add_dependencies(legged_robot_dummy${PROJECT_NAME}${${PROJECT_NAME}_EXPORTED_TARGETS}${catkin_EXPORTED_TARGETS}
)
target_link_libraries(legged_robot_dummy${PROJECT_NAME}${catkin_LIBRARIES}
)
target_compile_options(legged_robot_dummy PRIVATE ${OCS2_CXX_FLAGS})# 键盘控制目标位姿节点
# Keyboard command node for target trajectories
add_executable(legged_robot_targetsrc/LeggedRobotPoseCommandNode.cpp
)
add_dependencies(legged_robot_target${PROJECT_NAME}${${PROJECT_NAME}_EXPORTED_TARGETS}${catkin_EXPORTED_TARGETS}
)
target_link_libraries(legged_robot_target${PROJECT_NAME}${catkin_LIBRARIES}
)
target_compile_options(legged_robot_target PRIVATE ${OCS2_CXX_FLAGS})# 键盘控制步态节点
# Keyboard command node for gait
add_executable(legged_robot_gait_commandsrc/LeggedRobotGaitCommandNode.cpp
)
add_dependencies(legged_robot_gait_command${PROJECT_NAME}${${PROJECT_NAME}_EXPORTED_TARGETS}${catkin_EXPORTED_TARGETS}
)
target_link_libraries(legged_robot_gait_command${PROJECT_NAME}${catkin_LIBRARIES}
)
target_compile_options(legged_robot_gait_command PRIVATE ${OCS2_CXX_FLAGS})#########################
### CLANG TOOLING ###
#########################
# 查找 cmake_clang_tools(用于静态代码分析)。
# 如果找到,调用 add_clang_tooling 对目标进行代码检查:
# 检查 TARGETS 指定的所有可执行文件和库。
# 扫描 src/ 和 include/ 目录下的代码。
# 启用严格模式(CF_WERROR 将警告视为错误)。find_package(cmake_clang_tools QUIET)
if(cmake_clang_tools_FOUND)message(STATUS "Run clang tooling for target ocs2_legged_robot_ros")add_clang_tooling(TARGETS${PROJECT_NAME}legged_robot_ddp_mpclegged_robot_sqp_mpclegged_robot_ipm_mpclegged_robot_dummylegged_robot_targetlegged_robot_gait_commandSOURCE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/src ${CMAKE_CURRENT_SOURCE_DIR}/includeCT_HEADER_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/includeCF_WERROR
)
endif(cmake_clang_tools_FOUND)#############
## Install ##
#############
# 七. 安装规则
# 安装头文件到 CATKIN_PACKAGE_INCLUDE_DESTINATION(通常为 include/ocs2_legged_robot_ros)。
install(DIRECTORY include/${PROJECT_NAME}/DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION}
)# 安装主库到lib目录
install(TARGETS ${PROJECT_NAME}ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)# 安装所有可执行文件到bin目录
install(TARGETSlegged_robot_ddp_mpclegged_robot_sqp_mpclegged_robot_ipm_mpclegged_robot_dummylegged_robot_targetlegged_robot_gait_commandRUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)# 安装launch和rviz包到ROS包的共享目录
install(DIRECTORY launch rvizDESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}
)# 八. 测试
# 文件中没有定义测试,但预留了 ############# Testing ############# 部分,可以后续添加 catkin_add_gtest 等测试规则。
#############
## Testing ##
#############