CMakeLists.txt和Package.xml

CMakeLists.txt和Package.xml

CMakeLists.txt

总览

CMakeLists.txt 是用于定义如何构建 ROS (Robot Operating System) 包的 CMake 脚本文件。CMake 是一个跨平台的构建系统,用于自动化编译过程。在 ROS 中,CMakeLists.txt 文件指定了如何编译代码和链接库,以及如何安装各种文件和程序。以下是 CMakeLists.txt 的详细解释:

基本结构

CMakeLists.txt 文件通常包含以下部分:

  1. CMake 最低版本要求:

    • 指定编译此包所需的最低 CMake 版本。
    cmake_minimum_required(VERSION 3.0.2)
    
  2. 项目名称:

    • 设置项目名称,通常与 ROS 包名称相同。
    project(my_ros_package)
    
  3. 查找依赖项:

    • 使用 find_package 命令查找编译包所需的依赖项。
    find_package(catkin REQUIRED COMPONENTSroscpprospystd_msgs
    )
    
  4. 设置 catkin 包:

    • 使用 catkin_package 命令定义包的属性,如包含的库、依赖项和包含目录。
    catkin_package(#  INCLUDE_DIRS include#  LIBRARIES my_ros_package#  CATKIN_DEPENDS roscpp rospy std_msgs#  DEPENDS system_lib
    )
    
  5. 指定头文件的路径:

    • 通常用于包含库的头文件。
    include_directories(# include${catkin_INCLUDE_DIRS}
    )
    
  6. 添加可执行文件:

    • 使用 add_executable 命令添加每个节点的可执行文件。
    add_executable(${PROJECT_NAME}_node src/my_node.cpp)
    
  7. 添加依赖项:

    • 使用 add_dependencies 确保在编译节点之前生成所有消息和服务。
    add_dependencies(${PROJECT_NAME}_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
    
  8. 链接库:

    • 使用 target_link_libraries 将可执行文件与库链接起来。
    target_link_libraries(${PROJECT_NAME}_node${catkin_LIBRARIES}
    )
    
  9. 安装目标:

    • 指定如何安装各种文件和程序,以便它们可以在 ROS 环境中找到。
    install(TARGETS ${PROJECT_NAME}_nodeRUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
    )
    
  10. 其他指令:

    • 如设置测试、配置文件和其他特殊构建指令。
重要性

CMakeLists.txt 文件对于 ROS 包的构建至关重要。它确保了代码能够根据定义的规则和依赖关系正确编译。良好维护的 CMakeLists.txt 文件对于项目的可移植性和可维护性非常重要,尤其是当涉及到大型项目或多人协作时。

此外,通过 CMakeLists.txt,开发者可以细粒度地控制编译过程,比如定义不同的构建类型(如调试或发布),以及设置特定的编译器标志。

1. find_package指令

find_package(catkin REQUIRED COMPONENTSroscpprospystd_msgs
)

这段代码是CMakeLists.txt文件中的一个部分,用于在ROS包中找到和包含依赖项。

  • find_package:这是CMake的一个命令,用于在构建过程中定位和使用外部项目或库。在这种情况下,它被用来找到catkin,这是ROS的一个构建系统。

  • catkin REQUIRED:指明catkin是必需的。如果CMake无法找到catkin,构建过程将停止。

  • COMPONENTS:后面跟着的是一个列表,指定了你的ROS包所依赖的其他ROS包或库。

    • roscpp:ROS的C++客户端库,用于写C++节点。
    • rospy:ROS的Python客户端库,用于写Python节点。
    • std_msgs:一个标准消息包,包含了一些常用的消息类型,如整数、浮点数、字符串等。

2. add_executable指令

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

这行代码用于添加一个可执行文件到你的ROS包。

  • add_executable:这是CMake的命令,用于创建一个可执行文件。在这里,它指定了可执行文件的名称和源代码文件。

  • ${PROJECT_NAME}_node:这是可执行文件的名称。${PROJECT_NAME}是一个变量,代表当前项目的名称。在这里,它被用来为可执行文件命名,通常后面会附加_node以表示这是一个ROS节点。

  • src/atr_pkg_node.cpp:这是可执行文件的源代码文件路径。这里假设你的源代码文件名为atr_pkg_node.cpp,位于src目录下。

3. add_dependencies指令

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

这行代码为你的可执行文件添加构建依赖。

  • add_dependencies:这是CMake的命令,用于添加目标(在这种情况下是你的可执行文件)的依赖项。这确保了在构建你的节点之前,所有必需的头文件和服务消息都已经可用。

  • ${PROJECT_NAME}_node:这是你之前用add_executable创建的目标(即可执行文件)。

  • ${${PROJECT_NAME}_EXPORTED_TARGETS}${catkin_EXPORTED_TARGETS}:这些是CMake变量,包含了所有必须在你的节点之前构建的目标。这通常包括由消息生成的目标,确保在构建你的节点之前,所有自定义消息、服务或操作的头文件都已生成。

总的来说,这些代码片段在ROS包的CMake配置中起着非常重要的作用,确保了包的依赖项被正确地找到和包含,可执行文件被正确地构建,以及所有必要的依赖在构建过程中得到满足。

4.target_link_libraries指令

这段代码是ROS包中CMakeLists.txt文件的一部分,用于配置ROS包的构建过程。它具体涉及到链接库的设置。下面是对这段代码的详细解释:

target_link_libraries(${PROJECT_NAME}_node${catkin_LIBRARIES}
)
  • target_link_libraries:这是CMake的一个命令,用于指定可执行文件或库应该链接哪些库。在构建一个目标(如可执行文件或库)时,它告诉CMake将指定的库链接到这个目标上。

  • ${PROJECT_NAME}_node:这是之前使用add_executable命令创建的目标的名称。${PROJECT_NAME}是一个CMake变量,表示当前项目(即ROS包)的名称。通常情况下,${PROJECT_NAME}_node是可执行文件的名称,表示ROS包中的一个节点。

  • ${catkin_LIBRARIES}:这是一个CMake变量,包含了所有由find_package(catkin REQUIRED COMPONENTS ...)找到的catkin组件的库。在ROS中,catkin_LIBRARIES变量通常包含了所有必要的ROS相关库,如roscpp(ROS的C++库)和其他你在CMakeLists.txt中声明为依赖的库。

简而言之,这个target_link_libraries命令确保你的可执行文件(节点)在构建时,会链接到所有在find_package中指定的、及其依赖的ROS和其他库。这对于确保你的节点能够正确地访问和使用这些库的功能是必要的。

Package.xml

总览

package.xml 文件是 ROS (Robot Operating System) 包的一个关键组件,用于定义包的元数据和依赖关系。这个文件遵循特定的 XML 结构,并提供了关于包的重要信息,包括名称、版本、维护者、许可证和依赖项。以下是 package.xml 的详细解释:

基本结构

package.xml 文件通常包含以下基本部分:

  1. 包名称 (<name>): 包的唯一标识符。
  2. 版本 (<version>): 包的版本号。
  3. 描述 (<description>): 关于包的简短描述。
  4. 维护者 (<maintainer>): 负责维护包的人的联系信息。
  5. 许可证 (<license>): 指定包的开源许可证类型。
  6. 依赖关系:
    • <build_depend>: 构建时需要的依赖。
    • <build_export_depend>: 构建和运行时需要的依赖。
    • <exec_depend>: 运行时需要的依赖。
    • <depend>: 同时是构建和运行时需要的依赖。
示例

下面是一个 package.xml 的示例:

<?xml version="1.0"?>
<package format="2"><name>example_package</name><version>0.0.1</version><description>An example ROS package</description><maintainer email="maintainer@example.com">Your Name</maintainer><license>BSD</license><build_depend>roscpp</build_depend><build_depend>std_msgs</build_depend><build_export_depend>roscpp</build_export_depend><exec_depend>roscpp</exec_depend><exec_depend>std_msgs</exec_depend><export><!-- Other export tags go here --></export>
</package>

在这个示例中:

  • 包名为 example_package
  • 版本号设为 0.0.1
  • 提供了包的简短描述。
  • 维护者信息包括名字和电子邮件地址。
  • 指定了 BSD 许可证。
  • 包括了对 roscppstd_msgs 的依赖,这些在构建和运行时都是必需的。
重要性

package.xml 文件对于 ROS 包的构建和分发至关重要。它不仅提供了包的基本信息,还确定了包与其他包之间的关系。正确配置 package.xml 对于确保包的正确编译和运行是必要的。

当你从源代码编译 ROS 包或者使用 ROS 工具(如 rospackroslaunch)管理包时,package.xml 中的信息都会被使用。因此,维护一个准确、完整的 package.xml 文件对于任何 ROS 项目都是非常重要的。

  <buildtool_depend>catkin</buildtool_depend><build_depend>roscpp</build_depend><build_depend>rospy</build_depend><build_depend>std_msgs</build_depend><build_export_depend>roscpp</build_export_depend><build_export_depend>rospy</build_export_depend><build_export_depend>std_msgs</build_export_depend><exec_depend>roscpp</exec_depend><exec_depend>rospy</exec_depend><exec_depend>std_msgs</exec_depend>

这段代码是来自ROS包的package.xml文件,它定义了包的依赖项。package.xml文件在ROS中用于声明包的元数据和依赖关系,这对于包的构建和运行至关重要。下面是对这段代码的详细解释:

  • <buildtool_depend>catkin</buildtool_depend>:指定了一个构建工具依赖。这表示此包在构建过程中需要catkincatkin是ROS的构建系统,用于编译和配置ROS包。

  • <build_depend>:这些标签指定了构建依赖。构建依赖是指在编译时间需要的依赖项。在这个例子中,它包括了roscpprospystd_msgs

    • roscpp:ROS的C++客户端库,用于C++节点的开发。
    • rospy:ROS的Python客户端库,用于Python节点的开发。
    • std_msgs:包含标准消息类型的ROS包,这些消息在不同的ROS节点之间进行通信时常常用到。
  • <build_export_depend>:这些标签指定了构建导出依赖。这意味着当其他包依赖于此包时,这些依赖也将被考虑。在这个例子中,同样包括了roscpprospystd_msgs

  • <exec_depend>:这些标签指定了执行依赖,即在运行时需要的依赖项。在这个例子中,也包括了roscpprospystd_msgs。这意味着当此包的节点被运行时,这些依赖项需要被满足。

总的来说,这段代码详细描述了包的依赖关系,包括构建工具、构建时依赖、构建导出依赖以及执行时依赖。这些信息对于ROS的构建系统来说是必需的,以确保包可以正确地编译和运行。

后续增加,减少,更改依赖

在ROS(Robot Operating System)中更改依赖时,需要修改CMakeLists.txtpackage.xml两个文件。这些文件定义了ROS包的构建和运行时依赖。以下是详细的步骤说明:

修改package.xml

package.xml文件定义了包的元数据和依赖关系。当你需要添加、移除或更改依赖时,应相应地更新这个文件。

  1. 添加依赖

    • 使用<depend>标签添加新的依赖。这个标签表示包在编译和运行时都需要这个依赖。
    • 如果依赖仅在编译时需要,使用<build_depend>;如果仅在运行时需要,使用<exec_depend>
  2. 移除依赖

    • 直接删除相应的依赖标签。
  3. 修改依赖

    • 替换或更改现有的依赖标签。

例如,假设你需要添加一个名为sensor_msgs的依赖:

<depend>sensor_msgs</depend>

修改CMakeLists.txt

CMakeLists.txt控制着包的构建过程。你需要在这个文件中添加、移除或更改find_package()中的依赖项。

  1. 添加依赖

    • find_package(catkin REQUIRED COMPONENTS ...)部分添加新的依赖项。
  2. 移除依赖

    • find_package()中删除不再需要的依赖项。
  3. 修改依赖

    • 根据需要更改find_package()中的依赖项。

例如,添加sensor_msgs依赖:

find_package(catkin REQUIRED COMPONENTSroscppstd_msgssensor_msgs
)

重构建包

修改package.xmlCMakeLists.txt后,需要重新构建ROS包以应用这些更改:

  1. 在终端中,导航到你的catkin工作空间(通常是~/catkin_ws)。

  2. 运行catkin_make命令

    cd ~/catkin_ws
    catkin_make
    

这将重新构建你的包,包括任何新添加的依赖。

测试包

更改依赖后,建议进行适当的测试以确保包正常工作,并且新的依赖没有引入任何问题。

总结

通过适当地管理package.xmlCMakeLists.txt文件,你可以确保你的ROS包正确地包含了所有必要的依赖,这对于包的功能性、可移植性和维护性至关重要。

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

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

相关文章

门面模式Api网关(SpringCloudGateway)

1. 前言 当前通过Eureka、Nacos解决了服务注册和服务发现问题&#xff0c;使用Spring Cloud LoadBalance解决了负载均衡的需求&#xff0c;同时借助OpenFeign实现了远程调用。然而&#xff0c;现有的微服务接口都直接对外暴露&#xff0c;容易被外部访问。为保障对外服务的安全…

分布式系统常用的三注解:@DS,@DistributeLock,@GlobalTransactional【开发实践】

文章目录 一、多数据源的动态切换&#xff1a;DS1.1 多数据源的背景1.1.1 主从复制1.1.2 读写分离1.1.3 分库分表 1.2 DS的使用流程1.2.1 添加依赖1.2.2 配置数据源1.2.3 使用 DS 切换数据源 1.3 使用DS切换数据源失效1.3.1 情形二&#xff1a;同类中的方法调用DS方法1.3.2 情形…

关于Golang中自定义包的简单使用-Go Mod

1. go env 查看 GO111MODULE 是否为 on&#xff0c;不是修改成on go env -w GO111MODULEon 2 .自定义包的目录格式 3. test.go 内容 package calc func Add(x, y int) int { // 首字母大写表示公有方法return x y }func Sub(x, y int) int {return x - y } 4.生成calc目…

CORSscannerburp的插件jsonp-hunterdnsub

1.CORSscanner 下载地址&#xff1a;CORScanner: Fast CORS misconfiguration vulnerabilities scanner 有时候会出一些警告没引入变量之类的&#xff0c;用pip安装一下就可以了 打开之后是这样的 2.jsonp-hunter 安装jython&#xff1a;Jython的安装和配置环境_jython安装…

前后端分离与实现 ajax 异步请求 和动态网页局部生成

前端 <!DOCTYPE html><!-- 来源 --> <!-- https://cloud.tencent.com/developer/article/1705089 --> <!-- https://geek-docs.com/ajax/ajax-questions/19_ajax_javascript_send_json_object_with_ajax.html --> <!-- 配合java后端可以监听 --&…

最新OpenAI免费API-openai api key获取方式

最近又开始准备LLM 应用开发&#xff0c;要用到api key&#xff0c;才发现过我之前免费发放的额度没了&#xff01;我都没咋用过&#xff0c;痛心&#x1f62d;&#x1f62d;&#x1f62d;&#xff01; 现在 OpenAI 有要求必须充值 5 刀才能使用&#xff0c;问就是没钱&#x…

Leetcode-438-找到字符串中所有的字母异位词

题目说明 给定一个字符串 s 和一个非空字符串 p&#xff0c;找到 s 中所有是 p 的字母异位词的子串&#xff0c;返回这些子串的起始索引。 字符串只包含小写英文字母&#xff0c;并且字符串 s 和 p 的长度都不超过 20100。 说明&#xff1a; 字母异位词指字母相同&#xff…

前端面试指南(一面)

知识点梳理 变量类型 ECMAScript 中定义了 6 种原始类型&#xff1a; 6种: Boolean String Number Null Undefinded Symbol 注意&#xff1a;原始类型不包含 Object。 typeof typeof xxx得到的值有以下几种类型&#xff1a;undefined boolean number string object function、…

除visio以外的几款好用流程图绘制工具

流程图绘制软件在嵌入式软件开发中扮演着重要的角色&#xff0c;它们能够帮助用户清晰、直观地展示工作流程。以下是几款流行的流程图绘制软件及其特点的详细报告&#xff1a; 思维导图MindMaster MindMaster作为一款专业的思维导图软件&#xff0c;不仅具备强大的思维导图制作…

硕士课程 可穿戴设备之作业一

作业一 第一个代码使用的方法是出自于[1]。 框架结构 如下图&#xff0c;不过根据对代码的解读&#xff0c;发现作者在代码中省去了对SSR部件的实现&#xff0c;下文再说。 Troika框架由三个关键部件组成&#xff1a;信号分解&#xff0c;SSR和光谱峰值跟踪。&#xff08;粗…

游戏缺失xinput1_3.dll怎么修复,总结几种有效的修复方法

在现代科技日新月异的时代&#xff0c;电脑已经成为我们生活和工作中不可或缺的工具。然而&#xff0c;由于各种原因&#xff0c;电脑可能会出现一些错误或问题&#xff0c;其中之一就是找不到xinput13.dll文件&#xff0c;这个问题会导致软件或者游戏无法正常启动运行&#xf…

面试 Redis 八股文十问十答第二期

面试 Redis 八股文十问十答第二期 作者&#xff1a;程序员小白条&#xff0c;个人博客 相信看了本文后&#xff0c;对你的面试是有一定帮助的&#xff01;关注专栏后就能收到持续更新&#xff01; ⭐点赞⭐收藏⭐不迷路&#xff01;⭐ 1&#xff09;redis 一般都用在什么场景…

搜维尔科技:使用Touch 触觉力反馈设备,用户可以完全沉浸在培训模拟、神经康复或远程的机器人操控中

使用Touch 触觉力反馈设备&#xff0c;用户可以完全沉浸在培训模拟、神经康复或远程的机器人操控中 搜维尔科技&#xff1a;使用Touch 触觉力反馈设备&#xff0c;用户可以完全沉浸在培训模拟、神经康复或远程的机器人操控中

文件编码概念

文件的读取 open()函数&#xff1a; 打开一个已存在的文件&#xff0c;或者创建一个新文件 open(name,mode,encoding) name:是要打开的目标文件名的字符串&#xff08;可以包含文件所在的具体路径&#xff09; mode:设置打开文件的模式&#xff08;访问模式&#xff09;&am…

C语言—字符函数和字符串函数

1.字符分类函数 C语言中有一系列的函数是专门做字符分类的&#xff0c;也就是一个字符是属于什么类型的字符的。 这些函数的使用都需要包含一个头文件 ctype.h。 例&#xff1a;将一句话中的小写字母改成大写字母。 2.字符转换函数 头文件&#xff1a;ctype.h C语言提供了2…

【数据集划分】假如你有超百万条oracle数据库数据(成真版)

【数据集划分】假如你有接近百万条oracle数据库数据&#xff08;成真版&#xff09; 写在最前面小结 数据集划分原因注意事项 1. 留出法&#xff08;Hold-out Method&#xff09;原理算法复杂度代码示例Scikit-learn的train_test_split分布式计算框架&#xff08;如Apache Spar…

JVMの垃圾回收

在上一篇中&#xff0c;介绍了JVM组件中的运行时数据区域&#xff0c;这一篇主要介绍垃圾回收器 JVM架构图&#xff1a; 1、垃圾回收概述 在第一篇中介绍JVM特点时&#xff0c;有提到过内存管理&#xff0c;即Java语言相对于C&#xff0c;C进行的优化&#xff0c;可以在适当的…

DRIVEN|15分的CNN+LightGBM怎么做特征分类,适用于转录组

说在前面 今天分享一篇做深度学习模型的文章&#xff0c;这是一篇软硬结合的研究&#xff0c;排除转换实体产品&#xff0c;我们做生信基础研究的可以学习模仿这个算法&#xff0c;适用且不局限于临床资料&#xff0c;转录组数据&#xff0c;GWAS数据。 今天给大家分享的一篇文…

用香橙派AIpro部署大模型、安装宝塔搭建私有随身WEB开发环境

什么是香橙派 Orange Pi AI Pro 开发板是香橙派联合华为精心打造的高性能 AI 开发板&#xff0c;其搭载了昇腾 AI 处理器&#xff0c;可提供 8TOPS INT8 的计算能力&#xff0c;内存提供了 8GB 和 16GB两种版本。可以实现图像、视频等多种数据分析与推理计算&#xff0c;可广泛…

【路径规划】基于蚁群算法ACO促进水果检测数据集的获取附matlab代码

% 初始化蚁群算法参数 num_ants 20; % 蚂蚁数量 num_iterations 100; % 迭代次数 alpha 1; % 信息素重要程度参数 beta 2; % 启发式信息重要程度参数 rho 0.5; % 信息素挥发率 Q 1; % 信息素增加量 pheromone_initial 0.1; % 初始信息素浓度 num_nodes 100; % 图中节点…