ROS 2中,CMakeList.txt常见语法

在ROS 2中,CMakeList.txt 文件扮演着配置和管理构建过程的重要角色。这个文件遵循CMake的语法,用于定义如何编译和链接源代码。下面是一些在ROS 2项目CMakeList.txt文件中常见的语法和用法。

1. 基本结构和命令

cmake_minimum_required(VERSION ):指定CMake的最低版本要求。
project():定义项目的名称,这个名称会用于构建过程中生成的目录和变量。

2. 查找和包含ROS 2的CMake宏

find_package(ament_cmake REQUIRED COMPONENTS …):查找ament_cmake包,这是ROS 2中用于包管理的CMake工具集。COMPONENTS后列出你需要的ament_cmake组件,比如dependencies、tests等。
find_package(rclcpp REQUIRED):查找并包含rclcpp包,rclcpp是ROS 2的C++客户端库。REQUIRED表明这个包是必需的,如果找不到则CMake会报错。

3. 添加源文件

set(CMAKE_CXX_STANDARD 14)(或更高版本):设置C++标准。
add_executable( …):添加一个可执行文件目标。是构建后生成的可执行文件的名称, …是构成该可执行文件的源文件列表。
add_library( SHARED|STATIC …):添加一个库目标。可以是共享库(SHARED)或静态库(STATIC)。

4. 链接库

target_link_libraries( <PRIVATE|INTERFACE|PUBLIC> …):为指定的目标(可执行文件或库)链接库。PRIVATE、INTERFACE、PUBLIC指定了链接属性的可见性。

5. 设置编译选项和依赖

ament_target_dependencies( …):为ament管理的目标(如ROS 2包)添加依赖。这确保了这些依赖在构建你的包之前被构建。
if(DEFINED ENV{}) 和 else()、endif():条件语句,可以根据环境变量或CMake变量的值来决定是否执行某些操作。

6. 安装目标和文件

install(TARGETS DESTINATION

):安装指定的目标(如可执行文件或库)到指定的目录。
install(FILES … DESTINATION ):安装指定的文件到指定的目录。

7. ROS 2特有的CMake宏

ROS 2还提供了一些特有的CMake宏,如:

ament_package():标记这个CMakeLists.txt定义的是一个ament包,用于ROS 2的包管理。
rosidl_generate_interfaces(…):自动生成ROS 2消息、服务和动作的接口代码。
ament_auto_add_library 是 ROS 2 中 ament_cmake_auto 包提供的一个宏,用于简化 CMakeLists.txt 文件中添加库的过程。这个宏结合了多个 CMake 命令的功能,使得添加库变得更加简单和直观。以下是 ament_auto_add_library 的基本用法:

8 ament_auto_add_library 基本语法

ament_auto_add_library(<library_name> [SHARED|STATIC|MODULE|INTERFACE|OBJECT] <source_files> ...)
  • <library_name>:你想要创建的库的目标名称。
  • [SHARED|STATIC|MODULE|INTERFACE|OBJECT]:指定库的类型。如果不指定,默认为 SHARED(共享库)。
  • <source_files> ...:构成库的源文件列表。

使用示例

假设你有一个 ROS 2 包,其中包含了一些 C++ 源文件,你想要将它们编译成一个共享库。你的 CMakeLists.txt 文件可能看起来像这样:

cmake_minimum_required(VERSION 3.5)
project(my_ros2_package)# 查找并包含ament_cmake_auto包
find_package(ament_cmake_auto REQUIRED)# 自动查找构建依赖
ament_auto_find_build_dependencies()# 添加库
ament_auto_add_library(my_library SHAREDsrc/my_library.cppinclude/my_library/my_library.hpp
)# 打包ament包
ament_auto_package()

在这个例子中,ament_auto_add_library 宏被用来创建一个名为 my_library 的共享库,它包含了 src/my_library.cpp 源文件和 include/my_library/my_library.hpp 头文件。ament_auto_find_build_dependencies() 宏用于自动查找并包含构建这个库所需的依赖项。最后,ament_auto_package() 宏用于打包这个 ament 包,以便它可以被 ROS 2 的包管理系统识别和使用。

优点

  • 简化 CMakeLists.txtament_auto_add_library 宏减少了需要编写的 CMake 命令数量,使得 CMakeLists.txt 文件更加简洁易读。
  • 自动处理依赖:通过 ament_auto_find_build_dependencies() 宏,ament_auto_add_library 能够自动查找并包含构建库所需的依赖项,减少了手动查找和包含依赖的麻烦。
  • 提高构建效率:由于 ament_cmake_auto 提供了许多自动化功能,因此它可以提高 ROS 2 包的构建效率。

注意事项

  • 确保你的 ROS 2 环境已经安装了 ament_cmake_auto 包。
  • 在使用 ament_auto_add_library 之前,需要调用 find_package(ament_cmake_auto REQUIRED) 来查找并包含这个包。
  • 如果你的库依赖于其他 ROS 2 包或第三方库,请确保在调用 ament_auto_add_library 之前使用 find_package() 命令来查找这些依赖项。然而,对于 ROS 2 包内的依赖项,ament_auto_find_build_dependencies() 宏通常能够自动处理。

9 rclcpp_components_register_node的用法

rclcpp_components_register_node 是 ROS 2 中用于注册组件式节点的一个宏,它允许你将一个类作为组件注册到 ROS 2 的组件容器中。这样,你就可以在运行时动态地加载、卸载和重新配置这些组件,而无需重新编译整个系统。这对于构建模块化、可扩展的 ROS 2 应用程序非常有用。

然而,需要注意的是,rclcpp_components_register_node 宏本身并不是 ROS 2 API 的一部分,或者至少不是以这种方式直接使用的。实际上,你可能是在寻找如何使用 rclcpp::Node 派生类与 ROS 2 组件系统结合的方法。

在 ROS 2 中,注册组件通常涉及以下几个步骤:

  1. 定义组件类:首先,你需要定义一个从 rclcpp::Node 派生的类,并在这个类中实现你的逻辑。但是,对于组件,你通常会从 rclcpp_components::NodeComponentrclcpp_lifecycle::LifecycleNode(如果你还需要生命周期管理)派生。

  2. 注册组件:然后,你需要使用 rclcpp_components 提供的宏(如 RCLCPP_COMPONENTS_REGISTER_NODE)来注册你的组件。这个宏会在编译时生成必要的代码,以便 ROS 2 的组件容器能够识别并加载你的组件。

  3. 在组件容器中加载组件:最后,你可以使用 ROS 2 的组件客户端(如 rclcpp_components::ComponentClient)来在运行时加载你的组件。

示例

下面是一个简化的示例,展示了如何定义一个组件并注册它:

#include "rclcpp/rclcpp.hpp"
#include "rclcpp_components/register_node_macro.hpp"// 假设我们有一个简单的组件类
class MyComponent : public rclcpp::NodeComponent {
public:explicit MyComponent(rclcpp::Node::SharedPtr node): NodeComponent(node) {// 初始化代码RCLCPP_INFO(this->get_logger(), "MyComponent initialized");}// 组件的其他成员函数...
};// 使用 RCLCPP_COMPONENTS_REGISTER_NODE 宏注册组件
// 注意:这里的宏参数需要根据你的包名和组件类名进行调整
RCLCPP_COMPONENTS_REGISTER_NODE(my_package::MyComponent)// 注意:上面的宏调用实际上是在内部生成了一些代码,
// 这些代码会在编译时添加到你的库中,以便 ROS 2 的组件系统能够识别它。
// 你不需要(也不应该)在你的代码中直接调用这个宏生成的任何函数或类。

注意RCLCPP_COMPONENTS_REGISTER_NODE 宏的确切用法可能会根据你的 ROS 2 版本和配置有所不同。上面的示例是一个简化的表示,旨在说明概念。在实际应用中,你可能需要查阅 ROS 2 的官方文档或源代码来获取准确的宏用法和参数。

此外,如果你的组件需要生命周期管理,你可能需要从 rclcpp_lifecycle::LifecycleNode 派生,并使用 rclcpp_lifecycle::register_node_macro 宏进行注册。但是,这通常涉及到更复杂的设置,包括定义生命周期状态和转换。

10 ament_auto_package 用法

ament_auto_package 是 ROS 2 中 ament_cmake_auto 包提供的一个宏,用于简化 CMakeLists.txt 文件中与包打包相关的操作。这个宏封装了多个 CMake 命令,以便在 ROS 2 包的构建过程中自动执行必要的打包步骤。

基本用法

在 CMakeLists.txt 文件的末尾调用 ament_auto_package() 宏,通常是在添加了所有可执行文件、库和测试之后。这个宏会处理与包打包相关的各种任务,如生成必要的配置文件、安装头文件和库文件等。

示例

以下是一个使用 ament_auto_package 宏的 CMakeLists.txt 文件的示例片段:

cmake_minimum_required(VERSION 3.5)
project(my_ros2_package)# 查找并包含ament_cmake_auto包
find_package(ament_cmake_auto REQUIRED)# 自动查找构建依赖
ament_auto_find_build_dependencies()# 添加可执行文件或库
# ...(省略了添加可执行文件或库的代码)# 打包ament包
ament_auto_package()

功能概述

ament_auto_package 宏执行以下主要功能:

  1. 生成必要的配置文件:为 ROS 2 包生成必要的配置文件,如 setup.pysetup.bash 等,这些文件用于在 ROS 2 环境中设置包的路径和依赖项。

  2. 安装头文件和库文件:将包中的头文件和库文件安装到 ROS 2 的安装目录中,以便其他包可以在编译时找到它们。

  3. 处理依赖项:虽然 ament_auto_find_build_dependencies() 宏用于在编译时查找依赖项,但 ament_auto_package 宏也可能涉及与依赖项相关的打包任务,如生成依赖项列表等。

  4. 生成元数据:为 ROS 2 包生成元数据,如版本信息、作者信息等,这些信息对于包的分发和使用非常重要。

注意事项

  • 确保在调用 ament_auto_package() 宏之前已经添加了所有必要的可执行文件、库和测试。
  • 如果你的包包含自定义的 CMake 宏或函数,并且这些宏或函数需要在打包过程中执行特定任务,请确保它们在 ament_auto_package() 宏之前被定义和调用。
  • ament_cmake_auto 包是 ROS 2 的一部分,因此在使用它之前,请确保你的 ROS 2 环境已经正确安装并配置了所有必要的依赖项。
    总之,ament_auto_package 宏是 ROS 2 中用于简化包打包过程的一个非常有用的工具。通过自动执行与打包相关的各种任务,它可以帮助开发者节省时间和精力,并减少因手动配置错误而导致的问题。

11 ament_auto_find_build_dependencies()的用法

ament_auto_find_build_dependencies() 是 ROS 2 中 ament_cmake 包提供的一个宏,用于在 CMakeLists.txt 文件中自动查找并包含构建依赖项。这个宏简化了依赖项查找的过程,使得开发者不需要手动为每个依赖项调用 find_package()

基本用法

在 CMakeLists.txt 文件中,ament_auto_find_build_dependencies() 宏通常位于文件的顶部或靠近顶部的位置,以便在添加任何库、可执行文件或测试之前找到并包含所有必要的依赖项。

示例

以下是一个使用 ament_auto_find_build_dependencies() 宏的 CMakeLists.txt 文件的示例片段:

cmake_minimum_required(VERSION 3.5)
project(my_ros2_package)# 查找并包含ament_cmake包
find_package(ament_cmake REQUIRED)# 自动查找构建依赖
ament_auto_find_build_dependencies()# 添加库或可执行文件
# ...(省略了添加库或可执行文件的代码)# 打包ament包
ament_package()
# 注意:在ROS 2 Foxy及更高版本中,建议使用 ament_auto_package() 替代 ament_package(),
# 但这里的重点是展示 ament_auto_find_build_dependencies() 的用法。

注意:在 ROS 2 Foxy 及更高版本中,推荐使用 ament_auto_package() 而不是 ament_package() 来打包你的包,因为 ament_auto_package() 提供了更多的自动化和简化。但是,ament_auto_find_build_dependencies() 的用法在所有支持 ROS 2 的版本中都是相似的。

功能概述

ament_auto_find_build_dependencies() 宏执行以下主要功能:

  1. 查找构建依赖项:它会自动查找并包含你的包在构建过程中所需的所有依赖项。这通常是通过读取 package.xml 文件中列出的依赖项来完成的,因为 ROS 2 使用 package.xml 文件来管理包的依赖关系。

  2. 包含依赖项:对于找到的每个依赖项,它会调用 find_package()(或等效的 CMake 命令)来包含该依赖项。这确保了你的包在编译时能够找到并使用这些依赖项提供的库、头文件等。

注意事项

  • 确保你的 package.xml 文件已经正确列出了所有必要的构建依赖项。
  • 如果你的包依赖于特定的 CMake 版本或具有特殊要求的依赖项,则可能需要手动调用 find_package() 来确保这些依赖项被正确包含。
  • 在某些情况下,你可能需要为特定的依赖项设置 CMake 变量或目标属性。这通常需要在 ament_auto_find_build_dependencies() 宏之后手动完成。

总之,ament_auto_find_build_dependencies() 宏是 ROS 2 中用于自动查找并包含构建依赖项的一个非常有用的工具。通过简化依赖项查找的过程,它可以帮助开发者节省时间和精力,并减少因手动配置错误而导致的问题。

通过上述介绍的语法和命令,你可以定义项目的构建目标、添加源文件、链接库、设置编译选项
和依赖,以及安装目标和文件。这些功能使得CMake成为ROS 2中不可或缺的构建系统。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/52050.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【设计模式】装饰器模式和适配模式

装饰器模式 装饰器模式能够很好的对已有功能进行拓展&#xff0c;这样不会更改原有的代码&#xff0c;对其他的业务产生影响&#xff0c;这方便我们在较少的改动下对软件功能进行拓展。 类似于 router 的前置守卫和后置守卫。 Function.prototype.before function (beforeFn)…

【C++】————智能指针

作者主页&#xff1a; 作者主页 本篇博客专栏&#xff1a;C 创作时间 &#xff1a;2024年8月20日 一&#xff0c;什么是智能指针 在C中没有垃圾回收机制&#xff0c;必须自己释放分配的内存&#xff0c;否则就会造成内存泄露。解决这个问题最有效的方法是使用智能指针&…

异常信息转储预研笔记-堆栈地址转换

addr2line命令 addr2line -e <exec> <addr> -f | xargs cfilt<exec>: 进程名 <addr>&#xff1a;堆栈地址eg&#xff1a; addr2line -e backtrace 0x4009d2 -f | xargs cfilt此方案测试了&#xff0c;不知道什么原因只显示?? ??:0 &#xff0c;而…

Java面试题--分布式锁

分布式锁 你说一下什么是分布式锁 分布式锁是在分布式/集群环境中解决多线程并发造成的一系列数据安全问题.所用到的锁就是分布式锁&#xff0c;这种锁需要被多个应用共享才可以&#xff0c;通常使用Redis和zookeeper来实现。 分布式锁有哪些解决方案 常用的三种方案 基于…

Spring模块详解Ⅱ

目录 Spring Beans模块详解1. 什么是 Bean?2. Spring Bean的配置方式2.1 基于 XML 配置例子&#xff1a; 2.2 基于注解配置例子&#xff1a; 2.3 基于 Java 配置&#xff08;JavaConfig&#xff09;例子&#xff1a; 3. Bean 的生命周期生命周期回调的例子&#xff1a; 4. Bea…

Oracle+ASM+High冗余详解及空间计算

Oracle ASM&#xff08;Automatic Storage Management&#xff09;的High冗余模式是一种提供高度数据保护的策略&#xff0c;它通过创建多个数据副本来确保数据的可用性和安全性。 以下是关于Oracle ASM High冗余的详细解释&#xff1a; 一、High冗余的特点 1.数据冗余度 在Hi…

极速闪存启动:SD与SPI模式的智能初始化指南

最近很多客户朋友在询问我们 CS 创世 SD NAND 能不能使用 SPI 接口&#xff0c;两者使用起来有何区别&#xff0c;下面为大家详细解答。 SD MODE: CS 创世 SD NAND 支持 SD 模式和 SPI 模式&#xff0c;SD NAND 默认为 SD 模式&#xff0c;上电后&#xff0c;其初始化过程如下…

链游:基于telegram和TON wallet在mac本地运行Flappy bird项目

【好看的灵魂千篇一律,有趣的鲲志一百六七!】- 可查看详情~~ 作者:鲲志说 (公众号、B站同名,视频号:鲲志说996) 后端研发:java、go,前电商、现web3 博客专家:阿里云社区、CSDN博客专家 超级个体:COC杭州开发者社区主理人 AI爱好者: AI电影共创社杭州核心成员…

【Word多级标题完整设置】设置各级标题样式将多级列表链接到各级标题样式中

Word多级标题完整设置 一、设置各级标题样式主标题样式设置中英文字体、字形以及字号设置段落设置&#xff08;缩进、间距和行距&#xff09; 一级标题样式设置中英文字体、字形以及字号设置段落设置&#xff08;缩进、间距和行距&#xff09; 二级标题样式设置中英文字体、字形…

深度学习基础—Batch Norm

对于一个神经网络我们知道&#xff0c;归一化输入特征是加速网络训练的技巧之一&#xff0c;因为归一化后&#xff0c;损失函数的图像就会由狭长变得更圆&#xff0c;那么这是否启发我们&#xff0c;在深度更深模型中&#xff0c;对各层的输出进行归一化&#xff0c;有益于下一…

day6 测试基础知识积累

JMeter 服务端系统性能测试是针对服务器端应用程序或服务 在特定负载下的运行能力和稳定性进行评估的方法。 产品文档应该有产品的性能指标&#xff0c;做性能测试前&#xff0c;如果需求文档没有性能指标则要向产品团队要。服务端系统性能测试 的常见指标有&#xff1a;TPS、…

Go 1.21在性能方面有哪些提升?

Go 1.21版本在性能方面取得了多项重要进展&#xff0c;主要体现在以下几个方面&#xff1a; 1. Profile-Guided Optimization (PGO) Go 1.21正式推出了PGO功能&#xff0c;使用PGO构建的Go程序性能通常可提升2-7%[2][5]。编译器本身也采用了PGO优化&#xff0c;使得编译速度提…

Abstract Class抽象类

抽象类&#xff08;Abstract Class&#xff09;在面向对象编程中是一种特殊的类&#xff0c;它不能被实例化&#xff0c;即不能创建该类的对象。抽象类主要用于定义一组接口&#xff08;即方法&#xff09;&#xff0c;这些方法的具体实现由子类来完成。抽象类通常用于表示一种…

ebpf教程(4.1):XDP程序的加载

文章目录 前言环境准备加载XDP程序源码构建过程运行 前言 前置阅读要求&#xff1a; ebpf教程(3):使用cmake构建ebpf项目-CSDN博客[译] [论文] XDP (eXpress Data Path)&#xff1a;在操作系统内核中实现快速、可编程包处理&#xff08;ACM&#xff0c;2018&#xff09;xdp-t…

C++中数据类型的学习

目录 一、整形 二、sizeof关键字 三、实型&#xff08;浮点型&#xff09; 四、字符型 五、转义字符 六、字符串型 七、布尔类型bool 八、数据的输入 数据类型 C规定在创建一个变量或者常量时&#xff0c;必须要指定出相应的数据类型&#xff0c;否则无法给变量分配内…

Java设计模式之中介者模式(Mediator Pattern)

Java设计模式之中介者模式&#xff08;Mediator Pattern&#xff09; 引言 在软件开发中&#xff0c;设计模式是解决常见设计问题的一系列最佳实践。中介者模式&#xff08;Mediator Pattern&#xff09;是行为型设计模式之一&#xff0c;它的主要目的是减少对象之间的直接相…

kubeadm搭建生产环境高可用集群

前言 搞了好多天&#xff08;今天是20240819&#xff09;&#xff0c;中途遇到各种各样的问题&#xff0c;总算是可以用了 我这里用的vmware开了5台服务器做学习实践 K8S因为直接使用的 pkgs.k8s.io 仓库&#xff0c;所以直接拉取的最新release版&#xff08;v1.31&#xff09…

SIRA-PCR: Sim-to-Real Adaptation for 3D Point Cloud Registration 论文解读

目录 一、导言 二、 相关工作 1、三维点云配准工作 2、无监督域适应 三、SIRA-PCR 1、FlyingShape数据集 2、Sim-to-real自适应方法 3、配准 4、损失函数 一、导言 该论文来自于ICCV2023&#xff0c;论文提出了一种新的方法SIRA-PCR&#xff0c;通过利用合成数据Flying…

网易云音乐故障 2 小时,这次到底谁背锅?(今天记得领补偿)

大家好&#xff0c;我是程序员鱼皮&#xff0c;8 月 19 日下午&#xff0c;网易云音乐突发严重故障&#xff0c;并登顶微博热搜&#xff0c;跟黑神话悟空抢了热度。 根据用户的反馈&#xff0c;故障的具体表现为&#xff1a;用户无法登录、歌单加载失败、播放信息获取失败、无法…

了解数据库中常用存储引擎数据结构(2)

目录 深入了解B树及其变种 BTree BTree B*Tree BTree并发机制 B-Link Tree 深入了解B树及其变种 先把我们要解释的B树变种都列出来&#xff0c;B树的变种主要有B树、B*树、B-Link树、COW B树、惰性B树、Bw树等。 下面具体来分析这些变种的优势和发展趋势。 BTree 下图…