ROS2 CMakeLists.txt
cmake
cmake_minimum_required(VERSION 3.8)
project(bumperbot_cpp_examples)
# 设置编译器警告选项
if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
add_compile_options(-Wall -Wextra -Wpedantic)
endif()
# 查找并加载ROS 2和C++客户端库相关的包
find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)
find_package(std_msgs REQUIRED)
# 添加可执行文件目标
add_executable(simple_publisher src/simple_publisher.cpp)
# 设置可执行文件的依赖项
ament_target_dependencies(simple_publisher rclcpp std_msgs)
# 安装可执行文件
install(TARGETS simple_publisher DESTINATION lib/${PROJECT_NAME})
# 如果启用了测试构建,则查找并运行代码检查工具
if(BUILD_TESTING)
find_package(ament_lint_auto REQUIRED)
# 注意:以下两行在实际项目中可能是不必要的,除非有特定需求
# 这里只是为了展示如何设置这些变量,但在ament_lint_auto中它们可能不是必需的
set(ament_cmake_copyright_FOUND TRUE)
set(ament_cmake_cpplint_FOUND TRUE)
ament_lint_auto_find_test_dependencies()
# 通常,你会在这里添加测试目标,但这里没有给出具体的测试文件
endif()
# 生成CMake包配置文件
ament_package()
逐一解释这段代码中的每行指令,以及它们的作用。这段代码是一个CMake脚本,用于配置和构建C++项目,特别是与ROS 2相关的项目。CMake是一个跨平台的自动化构建系统,它使用文本文件CMakeLists.txt来指导构建过程。
cmake
cmake_minimum_required(VERSION 3.8)
这行指定了构建这个项目所需的最小CMake版本是3.8。这是为了确保CMake拥有所有必要的特性和兼容性。
cmake
project(bumperbot_cpp_examples)
这里定义了项目的名称,即bumperbot_cpp_examples
。这个名称将用于在构建过程中引用整个项目。
cmake
if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
add_compile_options(-Wall -Wextra -Wpedantic)
endif()
这个条件块检查是否使用的是GCC或Clang编译器。如果是,它将添加一些编译选项,这些选项会增加编译时的警告和错误检查级别。-Wall
启用大多数警告,-Wextra
启用额外的警告,-Wpedantic
要求编译器遵循严格的ISO C++标准。
cmake
find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)
find_package(std_msgs REQUIRED)
这些行使用find_package
命令来查找并加载其他CMake包。ament_cmake
是ROS 2的一部分,提供了额外的CMake函数和宏。rclcpp
是ROS 2的C++客户端库,提供了与ROS 2通信的功能。std_msgs
包含了ROS 2中常用的标准消息类型。
cmake
add_executable(simple_publisher src/simple_publisher.cpp)
这行代码定义了一个可执行文件目标,名为simple_publisher
,并指定其源文件为src/simple_publisher.cpp
。
cmake
ament_target_dependencies(simple_publisher rclcpp std_msgs)
这行代码将rclcpp
和std_msgs
包作为simple_publisher
目标的依赖项。这意味着在构建simple_publisher
之前,CMake会确保这些依赖项已被正确配置。
cmake
install(TARGETS simple_publisher DESTINATION lib/${PROJECT_NAME})
这行代码指定了安装simple_publisher
可执行文件的目标路径。${PROJECT_NAME}
变量会被替换为项目名称,即bumperbot_cpp_examples
。因此,可执行文件将被安装到lib/bumperbot_cpp_examples
目录下。
cmake
if(BUILD_TESTING)
find_package(ament_lint_auto REQUIRED)
set(ament_cmake_copyright_FOUND TRUE)
set(ament_cmake_cpplint_FOUND TRUE)
ament_lint_auto_find_test_dependencies()
endif()
这个条件块检查是否启用了测试构建(BUILD_TESTING
)。如果是,它会查找ament_lint_auto
包,该包用于自动发现和运行代码检查工具。接下来,它设置两个标志变量为TRUE
,尽管这些设置可能在实际项目中是多余的,除非它们被某些后续操作检查。最后,它调用ament_lint_auto_find_test_dependencies
函数来查找与代码检查相关的依赖项。
cmake
ament_package()
最后,这行代码调用ament_package
宏,该宏是ROS 2中用于生成CMake包配置文件的。这使得其他CMake项目能够找到并使用这个包。
ROS 2 XML结构文件
xml
<?xml version="1.0"?>
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
<package format="3">
<name>bumperbot_cpp_examples</name>
<version>0.0.1</version>
<description>TODO: Package description</description>
<maintainer email="antonio.brandi@outlook.it">alien</maintainer>
<license>TODO: License declaration</license>
<buildtool_depend>ament_cmake</buildtool_depend>
<depend>rclcpp</depend>
<depend>std_msgs</depend>
<test_depend>ament_lint_auto</test_depend>
<test_depend>ament_lint_common</test_depend>
<export>
<build_type>ament_cmake</build_type>
</export>
</package>
这段XML代码定义了一个ROS 2包的基本结构,包括包的名称、版本号、描述、维护者信息、许可证声明、构建工具依赖、包依赖以及测试依赖等。此外,还指定了构建类型为ament_cmake,这是ROS 2中常用的构建系统。