ROS1ROS2之CmakeList.txt和package.xml用法详解

news2024/11/28 6:33:15

前言:目前还在学习ROS+无人机框架中,,,
更多更新文章详见我的个人博客主页【前往】

文章目录

    • 1. CMakeLists.txt与package.xml的作用
    • 2. 生成CMakeLists.txt
      • 2.1 ROS1
      • 2.2 ROS2
    • 3. CMakeLists.txt编写
      • 3.1 ROS1
      • 3.2 ROS2
    • 4. package.xml编写
    • 5. 其他--Setup.py的修改

1. CMakeLists.txt与package.xml的作用

ROS系统的功能包中 要包含 CMakeLists.txtpackage.xml 文件来编译功能包的内容

CMakeLists.txt原本是Cmake编译系统的规则文件,而Catkin编译系统基本沿用了CMake的编译风格,只是针对ROS工程添加了一些宏定义。所以在写法上,catkinCMakeLists.txtCMake的基本一致。用cmake命令创建功能包时,会自动生成CMakeList.txt文件,已配置了多数编译选项,且包含详细的注释,只需稍作修改便可编译自己的文件。

package.xml文件是描述功能包清单的文件,包括功能包的名称版本号作者信息许可信息编译依赖运行依赖等。

所以 CMakeLists.txt 非常重要,它指定了由源码到目标文件的规则,catkin编译系统在工作时首先会找到每个package下的 CMakeLists.txt ,然后按照规则来编译构建

2. 生成CMakeLists.txt

2.1 ROS1

ROS1可通过用catkin_create_pkg命令创建功能包,这会自动生成CMakeLists.txtpackage.xml文件的。

# 创建工作空间
mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/src

# 注:std msgs rospy roscpp为创建功能时指定的铱赖,test为包名
# 也可以先不指定,后面在CMakeLists.txt和package.xmL中手动添加
catkin_create_pkg test std_msgs rospy roscpp

# 查看一下在~/catkin_ws/src目录下自动生成了哪些文件夹和文件
tree

通过上面的命令生成的工作空间如下

image-20230726150753757

include:存放**.h**的头文件

src:可同时存放**.cpp.py的源文件,但一般.py**文件存放在scripts目录中

scripts:习惯存放**.pypython**文件,需要自己创建

注:python代码和c++代码不分家,可同时存放在同一功能包中

2.2 ROS2

ROS2可通过如下的命令来创建功能包以及必要的CMakeList.txtpackage.xml文件

# 创建工作空间
mkdir -p ~/dev_ws/src
cd ~/dev_ws/src

# ament_cmake和ament_python分别代表c++和python两种代码的功能包
# test_c和test_python代表包名
ros2 pkg create --build-type ament_cmake test_c
ros2 pkg create --build-type ament_python test_python

# 查看一下在~/dev_ws/src目录下自动生成了哪些文件夹和文件
tree

通过以上命令生成的工作空间如下:

image-20230726151618480

  • test_c/include:存放**.h**的头文件

  • test_c/src:存放**.cppC++**源文件

  • test_python/test_python:存放**.pypython**文件

注:与ROS1不同,同一功能包内只能同时包含python文件或者C++文件中的一种

3. CMakeLists.txt编写

3.1 ROS1

  1. 常用的ROS1CMakeLists.txt架构如下

视频解析参考:中科院软件所-机器人操作系统入门(ROS入门教程)

cmake_minimum_required()	#CMake的最低版本号

project()					#项目名称

find_package()				#找到编译需要的其他CMake/Catkin	package 

catkin_python_setup()		#catkin新加宏,打开catkin的Python Module的支持

add_message_files()			#catkin新加宏,添加自定义Message文件 

add_service_files()         #catkin新加宏,添加自定义Service文件 

add_action_files()          #catkin新加宏,添加自定义Action文件 

generate_message()			#catkin新加宏,生成不同语言版本的msg/srv/action接口 

catkin_package()			#catkin新加宏,生成当前package的cmake配置,供依赖本包的其他软件包调用 

add_library()				#生成库 

add_executable()			#生成可执行二进制文件

add_dependencies()			#定义目标文件依赖于其他目标文件,确保其他目标已被构建 

target_link_libraries()		#链接

catkin_add_gtest()			#catkin新加宏,生成测试

install()					#生成可安装目标

需要自己配置的项目一般就下面几种:

  • include_directories

    • 用于设置头文件的相对路径
    • 全局路径默认为功能包所在目录,功能包的头文件一般放在功能包根目录下的include文件夹,
      所以需要此处添加此文件夹
    • 还包含catkin编译器默认的其他头文件路径,如:ROS默认安装路径、Linux系统路径等
  • add_exectuable

    • 用于设置需要编译的代码和可执行文件
    • 第一个参数为期望生成的可执行文件(节点)名称
    • 后面的参数为参与编译的源文件(.cpp),若需要多个代码文件,可依次列出,空格分隔
  • target_link_libraries

    • 用于设置链接库
    • 有些功需要使用系统或第三方库函数,通过该选项可以配置执行文件链接的库文件
    • 第一个参数与add_exectuable相同,为可执行文件(节点)名称
    • 后面的参数为需要链接的库,依次列出,空格分隔
  • add_dependencies

    • 用于设置依赖
    • 有时候需要自定义消息类型,消息类型会在编译过程中产生相应语言的代码。若编译的可执行文
      件依赖这些动态生成的代码,则需要添加${PROJECT NAME}generate messages_cpp配置
  • 自定义数据类型:消息msg、服务srv、动作action

    • find_package(catkin REQUIRE COMPONENTS message_generation)
    • catkin_package(CATKIN_DEPENDS message_runtime)
    • add_message_files(FILES xxx.msg)
    • add_service_files(FILES xxx.srv)
    • add_action_files(FILES xxx.action)
    • generate_messages(DEPENDENCIES std_msgs)

CMakeLists.txt模板参考:CMakeLists.txt

更多教程参考:catkin/CMakeLists.txt - ROS Wiki

3.2 ROS2

常用的ROS2CMakeLists.txt架构如下

cmake_minimum_required()			#CMake的最低版本号

project()				  		   #项目名称

find_package()   				    #查找系统中的依赖项

ament_target_dependencies()          #依赖于其他目标文件,确保其他目标已被构建 

add_executable()				    #生成可执行二进制文件

install()						   #生成可安装目标

ament_package()						#生成功能包

rosidl_generate_interfaces()		# 自定义消息类型接口

示例模板如下

cmake_minimum_required(VERSION 3.5)
project(test_c)

# Default to C99
if(NOT CMAKE_C_STANDARD)
  set(CMAKE_C_STANDARD 99)
endif()

# Default to C++14
if(NOT CMAKE_CXX_STANDARD)
  set(CMAKE_CXX_STANDARD 14)
endif()

if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
  add_compile_options(-Wall -Wextra -Wpedantic)
endif()

# find dependencies
find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)
find_package(std_msgs REQUIRED)
# uncomment the following section in order to fill in
# further dependencies manually.
# find_package(<dependency> REQUIRED)

add_executable(talker src/publisher_member_function.cpp)	# 修改2
ament_target_dependencies(talker rclcpp std_msgs)			# 修改3

install(TARGETS
  talker												# 修改4
  DESTINATION lib/${PROJECT_NAME})

if(BUILD_TESTING)
  find_package(ament_lint_auto REQUIRED)
  # the following line skips the linter which checks for copyrights
  # uncomment the line when a copyright and license is not present in all source files
  #set(ament_cmake_copyright_FOUND TRUE)
  # the following line skips cpplint (only works in a git repo)
  # uncomment the line when this package is not in a git repo
  #set(ament_cmake_cpplint_FOUND TRUE)
  ament_lint_auto_find_test_dependencies()
endif()

# 添加自定义消息类型需要添加项
find_package(geometry_msgs REQUIRED)
find_package(rosidl_default_generators REQUIRED)

rosidl_generate_interfaces(${PROJECT_NAME}
  "msg/Num.msg"				# 自定义1
  "msg/Sphere.msg"			# 自定义2
  "srv/AddThreeInts.srv"     # 自定义3
  DEPENDENCIES geometry_msgs
)

ament_package()

相较于基于catkinCMake文件,基于ament的明显简洁很多

假设你编写了~/dev_ws/src/test.cpp文件后,需要修改的步骤如下:

  1. 链接源代码
add_executable(test src/test.cpp)	# test为你输入节点后执行的名称,如ros2 run test_c test(前一个test_c为包名,后一个test则为这里的设置的名称,代表具体执行的代码)
ament_target_dependencies(test rclcpp)	# 添加依赖项
  1. 添加下面这两行代码的目的是让编译器编译~/dev_ws/src/test_c/test.cpp这个文件
install(TARGETS
  test
  DESTINATION lib/${PROJECT_NAME}
)

当你自定义消息类型时还需要消息类型文件

# 添加自定义消息类型需要添加项
# 下面两项是固定的,geometry_msgs是用于生成消息依赖包
find_package(geometry_msgs REQUIRED)
find_package(rosidl_default_generators REQUIRED)

rosidl_generate_interfaces(${PROJECT_NAME}
  "msg/Num.msg"				# 自定义1
  "msg/Sphere.msg"			# 自定义2
  "srv/AddThreeInts.srv"     # 自定义3
  DEPENDENCIES geometry_msgs
)

4. package.xml编写

package.xml的框架如下

<package format="3">
  <name>..</name>
  <version>0.0.0</version>
  <description>...</description>
  <maintainer email="lanhanba@todo.todo">...</maintainer>
  <license>...</license>
  <buildtool_depend>...</buildtool_depend>
  <exec_depend>...</exec_depend>
  <exec_depend>...</exec_depend>

  <export>
    <build_type>...</build_type>
  </export>
</package>

相较于CMakeList.txtpackage.xml的语法就简单许多,且ROS1ROS2的标签语法通用

  • <build_depend></build_depend>: 标签定义了功能包中代码编译时所依赖的其他功能包
  • <exec_depend><exec_depend>: 标签定义了功能包中可执行程序运行时所依赖的其他功能包
  • 自定义数据类型:话题消息msg、服务数据srv、动作数据action

模板如下

<?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>test_c</name>
  <version>0.0.0</version>
  <description>TODO: Package description</description>
  <maintainer email="lanhanba@todo.todo">lanhanba</maintainer>
  <license>TODO: License declaration</license>

  <!-- ROS1 -->
  <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>
  
  <!-- ROS2_C++ -->
  <buildtool_depend>ament_cmake</buildtool_depend>
  <test_depend>ament_lint_auto</test_depend>
  <test_depend>ament_lint_common</test_depend>
  <export>
    <build_type>ament_cmake</build_type>
  </export>
    
  <!-- ROS2_python -->
  <test_depend>ament_copyright</test_depend>
  <test_depend>ament_flake8</test_depend>
  <test_depend>ament_pep257</test_depend>
  <test_depend>python3-pytest</test_depend>
  <export>
    <build_type>ament_python</build_type>
  </export>
  
  <!-- ROS2中C++功能包添加自定义消息类型还需添加下面三行(固定形式,和上面的CMake修改搭配使用,python不需要) -->
  <depend>rosidl_default_generators</depend>
  <depend>geometry_msgs</depend>
  <member_of_group>rosidl_interface_packages</member_of_group>
    
</package>

5. 其他–Setup.py的修改

ROS2-Python功能包中,如果添加类似~/dev_ws/src/test_python/test.pypython文件,则需要对功能包中的Setup.py进行如下的修改

from setuptools import setup

package_name = 'test_python'

setup(
    name=package_name,
    version='0.0.0',
    packages=[package_name],
    data_files=[
        ('share/ament_index/resource_index/packages',
            ['resource/' + package_name]),
        ('share/' + package_name, ['package.xml']),
    ],
    install_requires=['setuptools'],
    zip_safe=True,
    maintainer='lanhanba',
    maintainer_email='lanhanba@todo.todo',
    description='TODO: Package description',
    license='TODO: License declaration',
    tests_require=['pytest'],
    entry_points={
        'console_scripts': [
            # 结构如下:节点名 = 功能包名.代码文件.执行入口函数名(一般执行入口函数名都是main,也就是说python代码中一般要有main函数)
            # 通过ros2 run test_python test 来执行test_python.test:main下的函数
            # 如果有多个python代码文件都需要一一添加,名称不能一样
            "test = test_python.test:main",
            "test2 = test_python.test2:main"
        ],
    },
)

参考:

  • catkin/CMakeLists.txt - ROS Wiki

  • CMakeLists.txt - ROS Humble Wiki

  • 【ROS 学习笔记】CMakeLists.txt 与 package.xml - 知乎 (zhihu.com)

  • 详细分析一个ROS2 CMakeLists.txt文件_首飞爱玩机器人的博客-CSDN博客

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

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

相关文章

【Linux指令集】---tar指令(超详细)

个人主页&#xff1a;平行线也会相交 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 平行线也会相交 原创 收录于专栏【Linux专栏】&#x1f388; 本专栏旨在分享学习Linux的一点学习心得&#xff0c;欢迎大家在评论区讨论&#x1f48c; 演示环境&#xff1…

常见面试题之设计模式--策略模式

1. 概述 先看下面的图片&#xff0c;我们去旅游选择出行模式有很多种&#xff0c;可以骑自行车、可以坐汽车、可以坐火车、可以坐飞机。 作为一个程序猿&#xff0c;开发需要选择一款开发工具&#xff0c;当然可以进行代码开发的工具有很多&#xff0c;可以选择Idea进行开发&a…

(学习日记)2023.04.30

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…

JS基础算法03--俩数之和

最简单 &#xff0c; 最基础的。 如果不会 &#xff0c; 请写会 &#xff0c;请掌握&#xff0c;请让心安定 给定一个数组 nums 和一个目标值 target&#xff0c;在该数组中找出和为目标值的两个数 const nums [1, 2, 3, 4, 5, 6, 7, 8]const target 5function find(nums, t…

Vue.js入门指南:从基础到进阶,掌握现代JavaScript框架的核心概念与高级特性(2W字小白教程)

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

基于 Python 的性能测试工具 locust (与 LR 的简单对比)

目录 前言&#xff1a; 背景 基础 测试需求 服务器端 LR 中的测试脚本 locust 中的测试脚本 LR 中的测试过程和结果 Locust 中的测试过程和结果 结果比较 总结 前言&#xff1a; Locust 是一种开源的性能测试工具&#xff0c;可以帮助我们快速地进行网站、应用程序…

Linux:入门学习知识及常见指令

文章目录 入门介绍操作系统的概念Linux机器的使用Linux上的指令 对文件知识的补充文件的定义和一些含义文件和目录的存储绝对路径和相对路径 ls指令pwd指令cd指令touch指令mkdir指令rmdir指令rm指令man指令cp指令mv指令cat指令more指令echo指令输出重定向 less指令find指令grep…

【UE5 多人联机教程】05-生成玩家

步骤 1. 新建一个游戏模式基础 命名为“GM_Lobby” 2. 新建一个玩家控制器&#xff0c;命名为“PC_Lobby” 3. 新建一个游戏状态基础 命名为“GS_Lobby” 重新设置游戏模式重载、玩家控制器类、游戏状态类 4. 新建一个控件蓝图&#xff0c;命名为“UMG_Lobby” 打开“UMG_Lobb…

AI数字人为千行百业赋能,具有哪些优势?

AI产业的发展迅速&#xff0c;促使AI数字人产业也迎来了高速发展&#xff0c;数字人凭借愈发逼真的形象&#xff0c;开始在更多的场景、行业中进行赋能&#xff0c;为千行百业注入新的灵魂。 现阶段&#xff0c;数字人理论和技术正在不断成熟&#xff0c;应用范围也在不断扩大&…

opencv-25 图像几何变换04- 重映射-函数 cv2.remap()

什么是重映射&#xff1f; 重映射&#xff08;Remapping&#xff09;是图像处理中的一种操作&#xff0c;用于将图像中的像素从一个位置映射到另一个位置。重映射可以实现图像的平移、旋转、缩放和透视变换等效果。它是一种基于像素级的图像变换技术&#xff0c;可以通过定义映…

为什么需要GP(Global Platform)认证?

TEE之GP(Global Platform)认证汇总 一、为什么需要认证&#xff1f; 二、为什么是GP&#xff1f; 参考&#xff1a; GlobalPlatform Certification - GlobalPlatform

Unity光照相关知识和实践 (烘焙光照,环境光设置,全局光照)

简介 本文将会通过一个简单的场景搭建&#xff0c;介绍如何使用烘焙光照以及相关的注意事项。另外还介绍了Unity内全局光照&#xff08;GI&#xff09;的知识和GI实际在游戏内的表现效果。 Unity关于光照相关的参考文档地址&#xff1a;https://docs.unity.cn/cn/current/Man…

黑客自学笔记(网络安全)

一、黑客是什么 原是指热心于计算机技术&#xff0c;水平高超的电脑专家&#xff0c;尤其是程序设计人员。但后来&#xff0c;黑客一词已被用于泛指那些专门利用电脑网络搞破坏或者恶作剧的家伙。 二、学习黑客技术的原因 其实&#xff0c;网络信息空间安全已经成为海陆空之…

使用goldengate 迁移Oracle到postgresql

环境&#xff1a; --源端&#xff1a; IP&#xff1a;10.0.4.16 hostname&#xff1a;tencent Oracle数据库版本&#xff1a;12.2.0.1.0 ogg for oracle版本&#xff1a;19.1.0.0.4 SID&#xff1a;orcl --目标端&#xff1a; IP&#xff1a;10.0.4.16 hostname&#…

Spring 6【p命名空间和c命名空间】(五)-全面详解(学习总结---从入门到深化)

目录 十、p命名空间和c命名空间 十、p命名空间和c命名空间 老版本的Spring框架XML配置文件是使用DTD的&#xff0c;但是在目前Spring框架中多使用XSD。因为在XSD扩 展支持。这也是为什么Spring框架配置文件由原来的DTD更换成XML Schema&#xff0c;毕竟Spring现在是模块化了&…

java 锁详解

死锁有四个条件 1. 互斥性 某个锁单元只能被某个运算单元占用 2. 不可以剥夺 线程获取某个资源, 这个资源不可以被其他资源剥夺, 只能自己释放, 3. 请求并保持 请求别的资源的同时却保持占有某个资源 4. 形成循环链路 一般锁都有互斥性, 读锁没有互斥性. 一般的锁都不…

视觉系统相关的网站

1.视觉系统设计 视觉系统设计网址&#xff1a;http://www.vision-systems-china.com/emag/emag.asp

宿主可以访问公网 Docker容器里无法访问 Temporary failure in name resolution

宿主可以访问公网 Docker容器里无法访问 Temporary failure in name resolution 容器参数 docker-compose.yml 的 dns我也设置&#xff0c;按理来说应该可以访问&#xff0c;然而就是不断的按在地上摩擦 web:build: .restart: alwaysports:- "6699:80"dns:- 114.11…

公司内部重要文件如何加密防止泄露?

现如今&#xff0c;是互联网时代&#xff0c;数据安全在互联网时代中的数据安全岌岌可危&#xff0c;企业中&#xff0c;都会拥有终端&#xff0c;终端中每天都要处理文档&#xff0c;文件&#xff0c;表格&#xff0c;产生一系列的数据问题等&#xff0c;这个时候就要先企业中…

Windows OS CMD 常用工具 の 命令合集

# First Of All 每次想要修改环境变量都要按部就班点开系统属性、高级系统设置、环境变量。这种操作实在是太繁琐了&#xff0c;对于我一个懒人来讲实在是 忍无可忍 。如果可以使用 WINR 或 CMD 直接打开系统内的一些工具&#xff0c;是不是就可以节省很多时间&#xff1b;是不…