ament_make 详细范例
以下是一个整合了ament_cmake核心功能的详细模板范例,涵盖基础配置、编译选项、依赖管理、目标链接、安装规则、测试集成和资源索引等关键模块,可直接用于ROS 2包开发:
完整CMakeLists.txt模板
cmake_minimum_required(VERSION 3.8)
project(my_ros2_package)# 1. 设置C++标准(ROS 2推荐C++17)
if(NOT CMAKE_CXX_STANDARD)set(CMAKE_CXX_STANDARD 17)set(CMAKE_CXX_STANDARD_REQUIRED ON)
endif()# 2. 编译器警告选项(GCC/Clang推荐)
if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")add_compile_options(-Wall -Wextra -Wpedantic -Wshadow)
endif()# 3. 查找依赖包
find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)
find_package(std_msgs REQUIRED)
find_package(Eigen3 REQUIRED)# 4. 创建库目标(示例)
add_library(my_library SHAREDsrc/my_library.cpp
)# 5. 设置库的头文件路径(构建和安装阶段)
target_include_directories(my_libraryPUBLIC"$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>""$<INSTALL_INTERFACE:include/${PROJECT_NAME}>"
)# 6. 链接依赖库(推荐使用ament_target_dependencies)
ament_target_dependencies(my_libraryPUBLICrclcppstd_msgsEigen3
)# 7. 创建可执行文件(示例)
add_executable(my_nodesrc/my_node.cpp
)
target_link_libraries(my_nodePRIVATEmy_library
)# 8. 安装规则
# 安装头文件
install(DIRECTORY include/DESTINATION include/${PROJECT_NAME}
)# 安装库和可执行文件
install(TARGETS my_library my_nodeEXPORT export_${PROJECT_NAME}LIBRARY DESTINATION libARCHIVE DESTINATION libRUNTIME DESTINATION lib/${PROJECT_NAME}
)# 9. 导出目标(供其他包使用)
ament_export_targets(export_${PROJECT_NAME} HAS_LIBRARY_TARGET)
ament_export_dependencies(rclcpp std_msgs Eigen3)# 10. 添加资源到ament索引(示例:注册插件)
pluginlib_export_plugin_description_file(rviz_common "plugins_description.xml"
)# 11. 测试配置
if(BUILD_TESTING)find_package(ament_lint_auto REQUIRED)ament_lint_auto_find_test_dependencies()# 添加GTestfind_package(ament_cmake_gtest REQUIRED)ament_add_gtest(test_my_librarytest/test_my_library.cpp)target_link_libraries(test_my_library my_library)
endif()# 12. 调用ament_package(必须最后执行)
ament_package(CONFIG_EXTRAS "my_package_config_extras.cmake"
)
配套package.xml模板
<?xml version="1.0"?>
<package format="3"><name>my_ros2_package</name><version>0.1.0</version><description>示例ROS 2包</description><maintainer email="user@example.com">用户名</maintainer><license>Apache License 2.0</license><!-- 构建依赖 --><buildtool_depend>ament_cmake</buildtool_depend><build_depend>rclcpp</build_depend><build_depend>std_msgs</build_depend><build_depend>eigen3</build_depend><!-- 执行依赖 --><exec_depend>rclcpp</exec_depend><exec_depend>std_msgs</exec_depend><exec_depend>eigen3</exec_depend><!-- 测试依赖 --><test_depend>ament_lint_auto</test_depend><test_depend>ament_lint_common</test_depend><test_depend>ament_cmake_gtest</test_depend><!-- 声明为接口包(如有自定义消息) --><member_of_group>rosidl_interface_packages</member_of_group><export><build_type>ament_cmake</build_type></export>
</package>
关键模块解析
1. 基础配置
- C++标准:强制使用C++17,确保与ROS 2兼容。
- 编译器警告:GCC/Clang下启用严格警告,提升代码质量。
2. 依赖管理
find_package:显式声明构建时依赖(如rclcpp、Eigen3)。ament_target_dependencies:自动处理依赖传递和链接。
3. 目标管理
- 库目标:分离头文件和源文件,支持跨包头文件安装。
- 可执行文件:链接到库目标,避免重复代码。
4. 安装规则
- 头文件安装:使用
<BUILD_INTERFACE>和<INSTALL_INTERFACE>区分构建和安装路径。 - 目标导出:通过
ament_export_targets生成CMake配置文件,供其他包调用。
5. 测试集成
- Lint检查:
ament_lint_auto自动运行静态分析(如cppcheck、uncrustify)。 - 单元测试:
ament_add_gtest集成Google Test,支持超时、环境变量等配置。
6. 资源索引
- 插件注册:通过
pluginlib_export_plugin_description_file将插件信息写入ament索引,供RViz等工具加载。
7. 环境钩子(可选)
- 环境变量:通过
ament_environment_hooks设置持久化环境变量(如DDS配置)。
使用说明
- 创建包:
ros2 pkg create my_ros2_package --build-type ament_cmake --dependencies rclcpp std_msgs - 替换模板内容:
将上述CMakeLists.txt和package.xml替换到包目录中。 - 构建与测试:
colcon build --packages-select my_ros2_package source install/setup.bash ros2 run my_ros2_package my_node
最佳实践
- 模块化设计:将库和可执行文件分离,提升复用性。
- 依赖明确:在
package.xml和CMakeLists.txt中同步声明依赖。 - 测试覆盖:为关键功能添加单元测试,确保代码健壮性。
- 文档完善:在
package.xml中填写完整的维护者、许可证等信息。
此模板覆盖了ROS 2包开发的绝大多数场景,可直接用于实际项目开发。
