大家好,我是小鱼。今天我们来讲一讲launch文件。

一、为什么需要launch文件

1.1 需要启动的节点太多

看过小鱼动手学ROS2教程的同学都知道,我们每启动一个节点的时候,都是先打开一个新的终端,然后使用下面这种方式来启动节点:

ros2 run package-name  execute-name

如果只启动一个节点的确没有问题,一行ros2 run指令就完成了,但是如果我们要启动三个甚至更多的节点,重复的动作做很多遍?是不是就很浪费生命。

1.2 节点之间有依赖关系管理

我们在前面的章节中学习客户端服务端通信时,客户端李三要找服务端李四借钱吃麻辣烫,假设李四节点没启动(这个人还不存在),我们先启动李三节点,李三节点直接不检查李四服务是否存在就发送了请求,这个时候肯定是会请求失败的。

再比如我们想在原有的导航地图上设置一个虚拟墙(原本不存在墙,人为加上,不让机器人过去),如果地图服务都没启动,在地图上设置虚拟墙肯定会失败。

从上面的例子我们可以得出,节点之间的启动有时会有依赖关系。

1.3 秘密武器-launch介绍

可不可以编写一个类似于脚本的文件来管理节点的启动呢?ROS2设计时就为我们想好了,为我们设计了一套完整的语法和规则的文件来帮助我们组织节点的启动,这个武器就叫launch文件。

launch文件允许我们同时启动和配置多个包含 ROS 2 节点的可执行文件

在ROS1中launch文件只有一种格式以.launch结尾的xml文档,不熟悉的同学写起来被xml语法折磨的死去活来。不过在ROS2中不要担心,因为在ROS2你可以使用Python代码来编写launch文件

二、编写第一个ROS2的launch文件

2.1 三种编写launch文件的方法

ROS2的launch文件有三种格式,python、xml、yaml。其中ROS2官方推荐的时python方式编写launch文件。
原因在于,相较于XML和YAML,Python是一个编程语言,更加的灵活,我们可以利用Python的很多库来做一些其他工作(比如创建一些初始化的目录等)。

除了灵活还有另外一个原因是ros2/launch(一般launch共功能)和ros2/launch_ros(ROS 2 launch的特性)是用 Python 编写的,我们使用python编写launch文件可以使用 XML 和 YAML 中不能用的launch功能。
要说使用python版本的launch有什么坏处,那就是写起来比yaml要冗余

2.2 使用Python同时启动李四和王二节点

这里举例的是小鱼动手学ROS2课程中的程序,相关源码获取

git clone https://github.com/fishros/ros2_town.git -b charpter3

我们的目标是编写一个launch文件,最后使用launch指令,同时启动李四和王二节点。

2.2.1 创建文件

在功能包village_livillage_wang目录下创建launch文件夹。

2.2.2 编写launch文件

接着我们开始编写launch文件,在village_li目录下创建village.launch.py文件。
我们需要导入两个库,一个叫做LaunchDescription,用于对launch文件内容进行描述,一个是Node,用于声明节点所在的位置。

接着我们就可以编写代码了,注意这里要定一个名字叫做generate_launch_description的函数,ROS2会对该函数名字做识别。

# 导入库
from launch import LaunchDescription
from launch_ros.actions import Node# 定义函数名称为:generate_launch_description
def generate_launch_description():# 创建Actions.Node对象li_node,标明李四所在位置li4_node = Node(package="village_li",executable="li4_node")# 创建Actions.Node对象wang2_node,标明王二所在位置wang2_node = Node(package="village_wang",executable="wang2_node")# 创建LaunchDescription对象launch_description,用于描述launch文件launch_description = LaunchDescription([li4_node,wang2_node])# 返回让ROS2根据launch描述执行节点return launch_description

2.2.3 修改setup.py将launch文件拷贝到安装目录

如果你编写完成后直接编译你会发现install目录下根本没有你编写的launch文件,后续launch自然也找不到这个launch文件。

from setuptools import setup
from glob import glob
import ospackage_name = 'village_li'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']),(os.path.join('share', package_name, 'launch'), glob('launch/*.launch.py')),],install_requires=['setuptools'],zip_safe=True,maintainer='ros2',maintainer_email='sangxin2014@sina.com',description='TODO: Package description',license='TODO: License declaration',tests_require=['pytest'],entry_points={'console_scripts': ["li4_node = village_li.li4:main","li3_node = village_li.li3:main"],},
)

2.2.4编译测试

使用colcon指令编译我们的程序

colcon build

编译完成后,我们source以下工作空间,就可以运行我们的village.launch.py文件了

source install/setup.bash
ros2 launch village_li village.launch.py

运行结果如下,可以看到李四和王二在统一终端和大家打了招呼,我们也可以使用,ros2 node list 看一看两个节点是否都存在。

2.3 cmake编译类型功能包的launch文件安装

如果是ament_cmake或者是cmake类型的功能包,我们需要在CmakeLists.txt中添加安装指令,将launch文件夹安装到install目录。

install(DIRECTORY launchDESTINATION share/${PROJECT_NAME})

将village_li/launch目录下的village.launch.py复制到village_wang/launch下,接着我们编译运行试一试

colcon build
ros2 launch village_wang village.launch.py

三、小总结

今天只是简单讲了下,使用launch文件来同时启动多个接待年,但对节点的一些参数也可以在launch中配置等操作,小鱼就放到动手学ROS2课程中来说了。

最近在紧张的录制课程,比较忙,大家的一些问题回答没那么及时,今天就到这里,欢迎大家点赞分享~

ROS2的launch文件如何编写?快来学习一下使用Python编写launch文件~相关推荐

  1. png文件合并_程序员学习之在Python中使用PDF:阅读、旋转、合并和拆分

    私信我或关注微信号:猿来如此呀,回复:学习,获取免费学习资源包. PDF 文档格式 今天,可移植文档格式(PDF)属于最常用的数据格式. 1990年,Adobe定义了PDF文档格式. PDF格式背后的 ...

  2. python写入excel文件保存在哪里_万字长文记录Python读写EXCEL文件常用方法大全

    python读写excel的方式有很多,不同的模块在读写的讲法上稍有区别,这里我主要介绍几个常用的方式. 用xlrd和xlwt进行excel读写; 用openpyxl进行excel读写; 用panda ...

  3. python编写高质量代码_用 Python 编写干净、可测试、高质量的代码

    用 Python 编写干净.可测试.高质量的代码 Noah Gift 2010 年 12 月 20 日发布 简介 编写软件是人所承担的最复杂的任务之一.AWK 编程语言和 "K and R ...

  4. linux 网络传输压塑文件,萌新的Linux学习之路(十一)文件压缩传输

    一.文件归档 1.文件归档,就是把多个文件变成一个归档文件 2. 将etc目录下的文件归档到桌面 向归档的文件中添加文件 显示归档文件中的内容 取出归档文件中的单个文件 删除归档文件中的单个文件 取出 ...

  5. python中编写函数素数_如何用Python编写素数程序?

    成为一个认证的专业素数是一个大于1的自然数,它没有除1以外的任何除数.你可以用Python编写一个代码来帮助你找到所有的素数.在本文中,我们将按照以下顺序在Python中编写一个素数程序:什么是素数? ...

  6. python处理csv文件案例_让繁琐的工作自动化——python处理CSV文件

    让繁琐的工作自动化--python处理CSV文件 CSV:CSV文件是一种简化的电子表格,不同于Excle(二进制文件),CSV是纯文本文件. 1.环境 python3.8 pycharm2020.1 ...

  7. python读json文件中不同的数据类型_怎么使用python提取json文件中的字段

    python中为什么用json有什么作用 python的json模块中如何将变量添加到里面 python的json模块第一个是要打开的文件,第二个是打开的操作,为什么会如果你早认清你在别人心中没那么重 ...

  8. python csv文件复制时的编码问题_使用python读取CSV文件时的编码问题

    尝试使用python读取CSV文件时遇到障碍. 更新:如果只想跳过字符或错误,可以打开文件,如下所示: with open(os.path.join(directory, file), 'r', en ...

  9. 读写文件、文件方法、python2的乱码问题、python对passwd文件进行排序

    读写文件 if __name__=='__main__':filename=input('请输入保存的文件:')fdfile=open(filename,'w+')while 1:text=input ...

  10. python文件处理seek()方法的参数是,在Python中操作文件之seek()方法的使用教程

    在Python中操作文件之seek()方法的使用教程 seek()方法在偏移设定该文件的当前位置.参数是可选的,默认为0,这意味着绝对的文件定位,它的值如果是1,这意味着寻求相对于当前位置,2表示相对 ...

最新文章

  1. CentOS7下启动Nginx出现Failed to start nginx.service:unit not found
  2. Python--三元运算与lambda表达式
  3. 深度学习主机环境配置: Win10+Nvidia GTX 1080i+CUDA8.0+CUDDN6
  4. linux fdisk 磁盘空间使用率,linux查看磁盘剩余空间以及cpu使用情况
  5. linux 查看zookeepr所在路径,Linux系统:Centos7下搭建ZooKeeper3.4中间件,常用命令总结...
  6. php实现微信红包金额随机分配的函数
  7. eclipse设置代码自动提示
  8. 大班音乐机器人反思_大班音乐活动机器人
  9. RecyclerView的横向展示、item滑动居中
  10. 用引流脚本有什么好处,引流脚本是什么意思呢
  11. 工业设备数字孪生白皮书
  12. VSCode配置C++环境【报错interpreter=mi】
  13. Javascript的设计模式之从设计到模式(其他设计模式)
  14. Netty心跳检测代码及源码流程
  15. 电脑黑屏只有鼠标能动怎么办???
  16. View 事件分发规律总结(超详细)
  17. 难道真的忘记放洗衣粉了??
  18. devops_关于DevOps的故事
  19. 网龙3D人物部件制作工艺介绍
  20. java求矩阵的逆矩阵_java n*n矩阵求值及求逆矩阵

热门文章

  1. python的invalid syntax是什么意思_请问在python 中 出现 invalid syntax 是什么意思 ?
  2. 如何将word转换成pdf?超实用的使用教程免费分享
  3. 【转载】软件质量报告模板-产品质量度量
  4. 《梁宁·产品思维30讲》
  5. 人类数据总量_人类身体的11个极限数据
  6. Windows远程桌面连接全屏切换--笔记本没有break键的办法
  7. Nginx的stub_status模块的作用及配置文件修改
  8. MySQL主从复制与读写分离
  9. 时间转换 Wed Sep 16 2020 00:00:00 GMT+0800 (中国标准时间)
  10. 树莓派的产品定位,以及探讨与ARM开发板的区别