当前位置: 首页 > news >正文

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:显式声明构建时依赖(如rclcppEigen3)。
  • ament_target_dependencies:自动处理依赖传递和链接。
3. 目标管理
  • 库目标:分离头文件和源文件,支持跨包头文件安装。
  • 可执行文件:链接到库目标,避免重复代码。
4. 安装规则
  • 头文件安装:使用<BUILD_INTERFACE><INSTALL_INTERFACE>区分构建和安装路径。
  • 目标导出:通过ament_export_targets生成CMake配置文件,供其他包调用。
5. 测试集成
  • Lint检查ament_lint_auto自动运行静态分析(如cppcheckuncrustify)。
  • 单元测试ament_add_gtest集成Google Test,支持超时、环境变量等配置。
6. 资源索引
  • 插件注册:通过pluginlib_export_plugin_description_file将插件信息写入ament索引,供RViz等工具加载。
7. 环境钩子(可选)
  • 环境变量:通过ament_environment_hooks设置持久化环境变量(如DDS配置)。

使用说明

  1. 创建包
    ros2 pkg create my_ros2_package --build-type ament_cmake --dependencies rclcpp std_msgs
    
  2. 替换模板内容
    将上述CMakeLists.txtpackage.xml替换到包目录中。
  3. 构建与测试
    colcon build --packages-select my_ros2_package
    source install/setup.bash
    ros2 run my_ros2_package my_node
    

最佳实践

  • 模块化设计:将库和可执行文件分离,提升复用性。
  • 依赖明确:在package.xmlCMakeLists.txt中同步声明依赖。
  • 测试覆盖:为关键功能添加单元测试,确保代码健壮性。
  • 文档完善:在package.xml中填写完整的维护者、许可证等信息。

此模板覆盖了ROS 2包开发的绝大多数场景,可直接用于实际项目开发。

http://www.dtcms.com/a/523948.html

相关文章:

  • Git Stash 用法详解
  • tailwindcss使用@apply指令定义自己的样式
  • Ubuntu安装nvm(无需梯子自动连接github下载安装)
  • 襄阳云平台网站建设做网络竞拍的网站需要什么
  • 一个虚拟主机怎么做多个网站建立网站花钱吗
  • MySQL一篇速通
  • 用 Cloudflare + Gmail 免费搭建自定义域名邮箱(example.com 实操教程)
  • 02_prometheus监控Grafana展示
  • MYSQL之内置函数
  • 网站内容维护外包协议自己建网站难吗
  • Linux修炼:基础IO(二)
  • 什么是知识茧房,如何破除?是不是应该破除?
  • 李嘉诚发展史
  • Android15适配Edge
  • 标准NEMA语句GST及说明
  • php网站建设设计方法wordpress点击图片悬浮
  • Java的匿名内部类(重要)
  • 基于PCA算法降维设备多维度传感器数据
  • java基础-方法
  • 51单片机基础-DS18B20温度传感器
  • 时空的几何化:论黑洞视界下光速的绝对不变性与表观变异
  • Uni-App(Vue3 + TypeScript)项目结构详解 ------ 以 Lighting-UniApp 为例,提供源代码
  • 如何帮网站广州广告推广公司
  • EPLAN电气设计常见报错与解决方案(一)
  • Unity TextMeshPro 输入表情
  • php简易企业网站源码nodejs网站开发
  • 《打破数据孤岛:3D手游角色表情骨骼协同的实践指南》
  • 【数据结构】数据结构核心考点:AVL树删除操作详解(附平衡旋转实例)
  • 当“Make”坏了,我们该如何“Make”
  • 【北京迅为】iTOP-4412精英版使用手册-第六十七章 USB鼠标驱动详解