【ROS学习笔记11】ROS元功能包与launch文件的使用
创始人
2024-05-29 01:08:56

【ROS学习笔记11】ROS元功能包与launch文件的使用

文章目录

  • 【ROS学习笔记11】ROS元功能包与launch文件的使用
    • 前言
    • 一、ROS元功能包
    • 二、ROS节点运行管理launch文件
      • 2.1 launch文件标签之launch
      • 2.2 launch文件标签之node
      • 2.3 launch文件标签之include
      • 2.4 launch文件标签之remap
      • 2.5 launch文件标签之param
      • 2.6 launch文件标签之rosparam
      • 2.7 launch文件标签之group
      • 2.8 launch文件标签之arg
    • Reference

写在前面,本系列笔记参考的是AutoLabor的教程,具体项目地址在 这里

前言


ROS是多进程(节点)的分布式框架,一个完整的ROS系统实现:

可能包含多台主机;
每台主机上又有多个工作空间(workspace);
每个的工作空间中又包含多个功能包(package);
每个功能包又包含多个节点(Node),不同的节点都有自己的节点名称;
每个节点可能还会设置一个或多个话题(topic)…


一、ROS元功能包

**场景:**完成ROS中一个系统性的功能,可能涉及到多个功能包,比如实现了机器人导航模块,该模块下有地图、定位、路径规划…等不同的子级功能包。那么调用者安装该模块时,需要逐一的安装每一个功能包吗?

显而易见的,逐一安装功能包的效率低下,在ROS中,提供了一种方式可以将不同的功能包打包成一个功能包,当安装某个功能模块时,直接调用打包后的功能包即可,该包又称之为元功能包(metapackage)。

概念

MetaPackage是Linux的一个文件管理系统的概念。是ROS中的一个虚包,里面没有实质性的内容,但是它依赖了其他的软件包,通过这种方法可以把其他包组合起来,我们可以认为它是一本书的目录索引,告诉我们这个包集合中有哪些子包,并且该去哪里下载。

例如:

  • sudo apt install ros-noetic-desktop-full 命令安装ros时就使用了元功能包,该元功能包依赖于ROS中的其他一些功能包,安装该包时会一并安装依赖。

还有一些常见的MetaPackage:navigation moveit! turtlebot3 …

作用

方便用户的安装,我们只需要这一个包就可以把其他相关的软件包组织到一起安装了。

实现

先,新建一个功能包,不需要新增依赖,然后修改package.xml,内容如下:

 被集成的功能包.....

最后,修改CMakeLists.txt,内容如下:CMakeLists不可以有换行,否则会导致编译失败。

cmake_minimum_required(VERSION 3.0.2)
project(demo)
find_package(catkin REQUIRED)
catkin_metapackage()

另请参考:

  • http://wiki.ros.org/catkin/package.xml#Metapackages

举一个新建元功能包的示例:

想新建一个MetaPackage将上面三个功能包整合到一起,我们可以这样做,首先新建一个元功能包,并且不包含任何依赖。

这里直接为空就可以。

然后修改package.xml,如下:

然后修改CMakeLists.txt,如下:


二、ROS节点运行管理launch文件

关于 launch 文件的使用我们已经不陌生了,在第一章内容中,就曾经介绍到:

一个程序中可能需要启动多个节点,比如:ROS 内置的小乌龟案例,如果要控制乌龟运动,要启动多个窗口,分别启动 roscore、乌龟界面节点、键盘控制节点。如果每次都调用 rosrun 逐一启动,显然效率低下,如何优化?

采用的优化策略便是使用roslaunch 命令集合 launch 文件启动管理节点,并且在后续教程中,也多次使用到了 launch 文件。

概念

launch 文件是一个 XML 格式的文件,可以启动本地和远程的多个节点,还可以在参数服务器中设置参数。

作用

简化节点的配置与启动,提高ROS程序的启动效率。

1、新建launch文件

在功能包下添加 launch目录, 目录下新建 xxxx.launch 文件,编辑 launch 文件



2、调用launch文件

roslaunch 包名 xxx.launch

注意: roslaunch 命令执行launch文件时,首先会判断是否启动了 roscore,如果启动了,则不再启动,否则,会自动调用 roscore

示例效果如下:


2.1 launch文件标签之launch

标签是所有launch文件的根标签,充当其他标签的容器

1、属性

  • deprecated="弃用声明"

告知用户当前launch文件已经被启用

2、子集标签

所有其他标签都是launch的子集标签

示例:

2.2 launch文件标签之node

标签用于指定 ROS 节点,是最常见的标签,需要注意的是: roslaunch 命令不能保证按照 node 的声明顺序来启动节点(节点的启动是多进程的)

1、属性

  • pkg=“包名”

    节点所属的包

  • type=“nodeType”

    节点类型(与之相同名称的可执行文件)

  • name=“nodeName”

    节点名称(在 ROS 网络拓扑中节点的名称)

  • args=“xxx xxx xxx” (可选)

    将参数传递给节点

  • machine=“机器名”

    在指定机器上启动节点

  • respawn=“true | false” (可选)

    如果节点退出,是否自动重启

示例:

  • respawn_delay=" N" (可选)

    如果 respawn 为 true, 那么延迟 N 秒后启动节点

  • required=“true | false” (可选)

    该节点是否必须,如果为 true,那么如果该节点退出,将杀死整个 roslaunch

示例:

  • ns=“xxx” (可选)

    在指定命名空间 xxx 中启动节点

示例:

  • clear_params=“true | false” (可选)

    在启动前,删除节点的私有空间的所有参数

  • output=“log | screen” (可选)

    日志发送目标,可以设置为 log 日志文件,或 screen 屏幕,默认是 log

2、子级标签

  • env 环境变量设置
  • remap 重映射节点名称
  • rosparam 参数设置
  • param 参数设置

2.3 launch文件标签之include

include标签用于将另一个 xml 格式的 launch 文件导入到当前文件

1、属性

  • file=“$(find 包名)/xxx/xxx.launch”

    要包含的文件路径

  • ns=“xxx” (可选)

    在指定命名空间导入文件

2、子级标签

  • env 环境变量设置
  • arg 将参数传递给被包含的文件

示例:

2.4 launch文件标签之remap

用于话题重命名

1、属性

  • from=“xxx”

    原始话题名称

  • to=“yyy”

    目标名称

2、子集标签

示例:

想使用python内置的键盘控制节点来控制乌龟的运动

rosrun teleop_twist_keyboard teleop_twist_keyboard.py

会产生冲突,因为

键盘控制输入的话题是/cmd_vel而乌龟控制输入所需要的话题是/hello/turtle1/cmd_vel,两者不同所以不能进行控制。

现在我们使用remap可以完成这一目的。


2.5 launch文件标签之param

标签主要用于在参数服务器上设置参数,参数源可以在标签中通过 value 指定,也可以通过外部文件加载,在标签中时,相当于私有命名空间。

1、属性

  • name=“命名空间/参数名”

    参数名称,可以包含命名空间

  • value=“xxx” (可选)

    定义参数值,如果此处省略,必须指定外部文件作为参数源

  • type=“str | int | double | bool | yaml” (可选)

    指定参数类型,如果未指定,roslaunch 会尝试确定参数类型,规则如下:

    • 如果包含 ‘.’ 的数字解析未浮点型,否则为整型
    • “true” 和 “false” 是 bool 值(不区分大小写)
    • 其他是字符串

2、子级标签

示例效果如下:


2.6 launch文件标签之rosparam

标签可以从 YAML 文件导入参数,或将参数导出到 YAML 文件,也可以用来删除参数,标签在标签中时被视为私有。

1、属性

  • command=“load | dump | delete” (可选,默认 load)

    加载、导出或删除参数

  • file=“$(find xxxxx)/xxx/yyy…”

    加载或导出到的 yaml 文件

  • param=“参数名称”

  • ns=“命名空间” (可选)

2、子级标签

一个示例:

首先yaml文件这样设置

然后再导入yaml中的参数


2.7 launch文件标签之group

标签可以对节点分组,具有 ns 属性,可以让节点归属某个命名空间

1、属性

  • ns=“名称空间” (可选)

  • clear_params=“true | false” (可选)

    启动前,是否删除组名称空间的所有参数(慎用…此功能危险)

2、子级标签

  • 除了launch 标签外的其他标签

示例:


2.8 launch文件标签之arg

标签是用于动态传参,类似于函数的参数,可以增强launch文件的灵活性

1、属性

  • name=“参数名称”

  • default=“默认值” (可选)

  • value=“数值” (可选)

    不可以与 default 并存

  • doc=“描述”

    参数说明

2、子级标签

3、示例

  • launch文件传参语法实现,hello.lcaunch

    
    
    Copy
    
  • 命令行调用launch传参

    roslaunch hello.launch xxx:=值
    

Reference

http://www.autolabor.com.cn/book/ROSTutorials/di-2-zhang-ros-jia-gou-she-ji/23-fu-wu-tong-xin/224-fu-wu-tong-xin-zi-ding-yi-srv-diao-yong-b-python.html

相关内容

热门资讯

世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...