机器人 · 2024年 10月 12日·150 次浏览 0

ROS1 的CMakeLists.txt详解

ROS1 中,CMakeLists.txt 是一个关键文件,用于定义如何构建和编译你的 ROS 包。以下是一个典型的 ROS1 CMakeLists.txt 文件的主要部分及其作用说明。

1. cmake_minimum_required

cmake_minimum_required(VERSION 3.0.2)
  • 作用: 指定所需的最小 CMake 版本。ROS1 Noetic 通常使用 3.0.2 或更高版本。确保 CMake 构建系统在合适的版本上运行。

2. project

project(my_ros_pkg)
  • 作用: 声明项目的名称。这里的项目名 my_ros_pkg 通常与包名保持一致。CMake 将使用该名称作为生成构建系统的标识。

3. find_package

find_package(catkin REQUIRED COMPONENTS
roscpp
std_msgs
)
  • 作用: 查找并加载指定的 catkin 包及其依赖项。REQUIRED 表示这些组件是必需的,COMPONENTS 关键字后列出的是你项目依赖的 ROS 包。常用的组件有 roscpp(用于 C++ 开发),std_msgs(标准消息类型包)等。

4. catkin_package

catkin_package(
CATKIN_DEPENDS roscpp std_msgs
)
  • 作用: 定义你的项目作为 catkin 包,并声明该包对其他包的依赖。CATKIN_DEPENDS 中列出的包表明此包在运行时或编译时依赖于这些 ROS 包。catkin_package() 还会自动为该包生成必要的配置文件,使得其他 ROS 包可以依赖该包。

5. include_directories

include_directories(
include
${catkin_INCLUDE_DIRS}
)
  • 作用: 定义编译时需要包含的头文件目录。include 是你的包的头文件路径,${catkin_INCLUDE_DIRS}catkin 和其他依赖包的头文件路径,它们在运行 find_package(catkin ...) 后会自动获取。

6. add_executable

add_executable(${PROJECT_NAME}_node src/main.cpp)
  • 作用: 定义一个可执行文件。add_executable 用于将源文件(如 src/main.cpp)编译为一个可执行程序。在这个例子中,${PROJECT_NAME}_node 会解析为 my_ros_pkg_node,即生成的可执行文件的名称。

7. target_link_libraries

target_link_libraries(${PROJECT_NAME}_node
${catkin_LIBRARIES}
)
  • 作用: 将生成的可执行文件与所需的库进行链接。${catkin_LIBRARIES} 是所有由 catkin_package()find_package() 中列出的依赖包所提供的库。它确保你的 ROS 程序在运行时能够访问所有需要的库函数。

8. add_dependencies

add_dependencies(${PROJECT_NAME}_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
  • 作用: 指定该节点的依赖关系。如果你有自动生成的消息、服务或动作文件,或者依赖于其他包的生成目标,add_dependencies 可以确保在编译过程中正确处理这些依赖,保证生成的目标文件按顺序编译。

9. 消息、服务和动作生成

如果你的包定义了自定义的消息、服务或动作文件,你还需要在 CMakeLists.txt 中进行特殊的处理。

find_package 部分:

find_package(catkin REQUIRED COMPONENTS
roscpp
std_msgs
message_generation
)

添加消息/服务文件:

add_message_files(
FILES
MyMessage.msg
)

add_service_files(
FILES
MyService.srv
)

生成消息、服务和动作:

generate_messages(
DEPENDENCIES
std_msgs
)

添加依赖项:

catkin_package(
CATKIN_DEPENDS message_runtime roscpp std_msgs
)

10. 安装可执行文件

如果你需要安装生成的可执行文件,你可以添加如下命令:

install(TARGETS ${PROJECT_NAME}_node
RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)
  • 作用: 将生成的可执行文件安装到 catkin 的二进制目录中。

11. 编译选项

如果你需要设置编译器的选项(如使用 C++11 标准),可以添加如下编译选项:

add_compile_options(-std=c++11)
  • 作用: 这里是让你的编译器支持 C++11 标准。如果你使用现代 C++,比如 ROS Noetic,则应设置为 C++14C++17

12. 自定义安装路径

如果你有需要安装的配置文件或其他资源,可以使用以下命令:

install(DIRECTORY launch/
DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}/launch
)
  • 作用: 将 launch 文件夹中的文件安装到指定路径中。常用于将启动文件安装到 catkin 的共享目录中。

示例完整的 CMakeLists.txt 文件

cmake_minimum_required(VERSION 3.0.2)
project(my_ros_pkg)

find_package(catkin REQUIRED COMPONENTS
roscpp
std_msgs
)

catkin_package(
CATKIN_DEPENDS roscpp std_msgs
)

include_directories(
include
${catkin_INCLUDE_DIRS}
)

add_executable(${PROJECT_NAME}_node src/main.cpp)

target_link_libraries(${PROJECT_NAME}_node
${catkin_LIBRARIES}
)

add_dependencies(${PROJECT_NAME}_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})

install(TARGETS ${PROJECT_NAME}_node
RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)

install(DIRECTORY launch/
DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}/launch
)

总结

  • cmake_minimum_requiredproject 用于定义基本的 CMake 项目。
  • find_package 查找并加载 ROS 依赖包。
  • catkin_package 声明此包是一个 catkin 包,并处理依赖关系。
  • add_executabletarget_link_libraries 用于生成并链接 ROS 节点。
  • add_dependencies 确保所有依赖的生成目标按顺序编译。
  • 安装规则 install 用于安装可执行文件和其他资源。

通过这些声明,你可以创建一个功能完善的 ROS1 包,并且能够与 ROS 库和其他工具正确链接。