ROS入门之——浅谈launch

0.何为launch?

launch,中文含义是启动,launch文件顾名思义就是启动文件,要说这launch文件啊,那还得从roslaunch说起。
相传,在程序猿们还没有使用roslaunch之前,需要手动rosrun逐个启动node,遇到大工程的时候,其繁杂程度不可想象,一度民不聊生。直到神实在看不下去了,于是送给程序猿们一份礼物,唤名roslaunch。roslaunch法力无边,只需程序猿们编写一个launch文件,启动大量节点弹指之间。从此一传十,十传百,程序猿们过上了幸福快乐的生活……
(故事纯属虚构,看着玩就行了)
这故事虽假,但roslaunch大法却不虚。roslaunch是一个用于自动启动ros节点的命令行工具,从命令的字面上看还跟rosrun有些相似:

roslaunch PACKAGE_NAME LAUNCH_FILE_NAME

    1

只不过roslaunch的操作对象并非节点,而是launch文件。launch文件是描述一组节点及其话题重映射和参数的XML文件。根据规范,这些文件的后缀都是.launch
一个最简单的launch文件可以像下面这样

<launch>
    <node name="demo" pkg="demo_package"
          type="demo_pub" output="screen"/>
    <node name="demo" pkg="demo_package"
          type="demo_sub" output="screen"/>
</launch>

    1
    2
    3
    4
    5
    6

1.launch标签小结
1.0 <launch>

launch标签就像一个有容乃大的括号,规定了一片区域,所有的launch文件都由<launch>开头,由</launch>结尾,所有的描述标签都要写在<launch></launch>之间

<launch>
……
……
……
</launch>

    1
    2
    3
    4
    5

1.1 <node>

node标签可以说是launch文件里最常见的标签了,每个node标签里包括了ROS图中节点的名称属性name、该节点所在的包名pkg以及节点的类型type(其实就是可执行文件的名称,如果是用Python编写的就填写xxx.py,如果是cpp就写编译生成的可执行文件名),在上面的例子中还出现了output这个东西,这个属性在调试阶段很有用,output=“screen”表示了将终端输出转储在当前的控制台上,而不是在日志文件中。
属性     属性作用
name="NODE_NAME"     为节点指派名称,这将会覆盖掉ros::init()定义的node_name
pkg="PACKAGE_NAME"     节点所在的包名
type="FILE_NAME"     执行文件的名称如果是用Python编写的就填写xxx.py,如果是cpp就写编译生成的可执行文件名
output="screen"     终端输出转储在当前的控制台上,而不是在日志文件中
respawn="true"     当roslaunch启动完所有该启动的节点之后,会监测每一个节点,保证它们正常的运行状态。对于任意节点,当它终止时,roslaunch 会将该节点重启
required="true"     当被此属性标记的节点终止时,roslaunch会将其他的节点一并终止。注意此属性不可以与respawn="true"一起描述同一个节点
launch-prefix = "command-prefix"     我的理解是,相当于在执行启动命令时加上一段命令前缀
ns = "NAME_SPACE"     这个属性可以让你在自定义的命名空间里运行节点
1.2<include>

该标签可以导入另一个roslaunch XML文件到当前文件。
属性     属性作用
file ="$(find pkg-name)/path/filename.xml"     指明我们想要包含进来的文件
ns="NAME_SPACE"     相对NAME_SPACE命名空间导入文件

使用起来就像下面这样

<include file="$(find demo)/launch/demo.launch" ns="demo_namespace"/>

    1

1.3<remap>

remap标签顾名思义重映射,ROS支持topic的重映射,remap标签里包含一个original-name和一个new-name,及原名称和新名称。
比如现在你拿到一个节点,这个节点订阅了"/chatter"topic,然而你自己写的节点只能发布到"/demo/chatter"topic,由于这两个topic的消息类型是一致的,你想让这两个节点进行通讯,那么可以在launch文件中这样写:

<remap from="chatter" to="demo/chatter"/>

    1

这样就可以直接把/chattertopic重映射到/demo/chatter,这样子不用修改任何代码,就可以让两个节点进行通讯。
如果这个 remap标签写在与 node 元素的同一级,而且在launch 元素内的最顶层。 那么这个重映射将会作用于launch文件中所有的节点。
1.4<param>

param标签的作用相当于命令行中的rosparam set
比如现在在参数服务器中添加一个名为demo_param,值为666的参数

<param name="demo_param" type="int" value="666"/>

    1

1.5<rosparam>

rosparam标签允许从YAML文件中一次性导入大量参数。
使用起来就像这样:

<rosparam command="load" file="$(find pkg-name)/path/name.yaml"/>

    1

1.6<arg>

arg标签用来在launch文件中定义参数,arg和param在ROS里有根本性的区别,就像局部变量和全局变量的区别一样。arg不储存在参数服务器中,不能提供给节点使用,只能在launch文件中使用。param则是储存在参数服务器中,可以被节点使用。

<arg name="demo"/>

    1

像上面这样,就简单地声明了一个参数,名叫demo,但是声明不等于定义,我们需要给他赋值,在赋值之后参数才能够发挥作用。

<arg name="demo" value="666"/>
<arg name="demo" default="666"/>

    1
    2

以上是两种简单的赋值方法,两者的区别是使用后者赋值的参数可以在命令行中像下面这样被修改,前者则不行。

roslaunch demo demo.launch demo:=6666

    1

arg还有更加高级,也更加灵活的用法:
$(arg arg_name)
当$(arg arg_name)出现在launch文件任意位置时,将会自动替代为所给参数的值。
1.7<group>

group标签可以将若干个节点同时划分进某个工作空间。

<group ns="demo_1">
    <node name="demo_1" pkg="demo_1" type="demo_pub_1" output="screen"/>
    <node name="demo_1" pkg="demo_1" type="demo_sub_1" output="screen"/>
</group>
<group ns="demo_2">
    <node name="demo_2" pkg="demo_2" type="demo_pub_2" output="screen"/>
    <node name="demo_2" pkg="demo_2" type="demo_sub_2" output="screen"/>
</group>

    1
    2
    3
    4
    5
    6
    7
    8

group标签还可以做到对node的批量管理。比如我可以同时终止在同一个group中的节点。

<group if="1-or-0">
……
……
……
</group>

<group unless="1-or-0">
……
……
……
</group>

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11

第一种情况,当if属性的值为0的时候将会忽略掉<group></group>之间的标签。
第二种恰好相反,当if属性的值为1的时候将会忽略掉<group></group>之间的标签。
但是我们通常不会直接用1或0来定义if标签。因为这样不够灵活。
通常会搭配$(arg arg_name)来使用。
demo.launch文件

<launch>
    <include file="include.launch">
        <arg name="demo_arg" value="1"/>
    </include>
</launch>

    1
    2
    3
    4
    5

include.launch文件

<launch>
    <arg name="demo_arg"/>
    <group if="$(demo_arg)">
        <node name="demo" pkg="demo" type="demo_pub" output="screen"/>
        <node name="demo" pkg="demo" type="demo_sub" output="screen"/>
    </group>
</launch>
---------------------  
作者:沐棋  
来源:CSDN  
原文:https://blog.csdn.net/weixin_41995979/article/details/81784987  
版权声明:本文为博主原创文章,转载请附上博文链接!

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

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

相关文章

2)机器学习基石笔记Lecture2:Learning to Answer Yes/No

目录 0.上节回顾 1. Perceptron Hypothesis Set 2. Perceptron Learning Algorithm(PLA)&#xff08;重点&#xff09; 3. Guarantee of PLA&#xff08;难点&#xff09; 4. Non-Separable Data 0.上节回顾 第一节课主要讲述了机器学习的定义及机器学习的过程&#xff0…

【CodeForces - 616C】The Labyrinth(bfs,并查集,STLset)

题干&#xff1a; 求每个*能够到达的格子数量&#xff0c;只有.可以走&#xff08;四个方向扩展&#xff09;&#xff0c;结果mod 10&#xff0c;替换 * 后输出。 Input The first line contains two integers n, m (1 ≤ n, m ≤ 1000) — the number of rows and co…

scapy和dpkt使用

scapy官方文档 Scapy 下载 # (临时换pip源) pip install scapy (-i https://pypi.tuna.tsinghua.edu.cn/simple/)导入 from scapy.all import *读取pcap文件&#xff0c;进行相关操作 # 读取文件 # 整个文件&#xff1a;packets&#xff1a;scapy.plist.PacketList对象 &…

Google Colab——谷歌免费GPU使用教程

Google Colab简介 Google Colaboratory是谷歌开放的一款研究工具&#xff0c;主要用于机器学习的开发和研究。这款工具现在可以免费使用。Google Colab最大的好处是给广大的AI开发者提供了免费的GPU使用&#xff01;GPU型号是Tesla K80&#xff01;你可以在上面轻松地跑例如&am…

javaBean和Servlet的区别

可以像使用一般的类一样使用JavaBean,Bean只是一种特殊的类。特殊在可以通过<jsp:useBean />调用JavaBean。而其他类,可以和一般java中一样使用。 Bean的参数中还可以指定范围, <jsp:useBean scope"application" />该Bean在服务器的JVM中将只有一个…

pyecharts简单使用

pyecharts 是一个用于生成 Echarts 图表的类库。 Echarts 是百度开源的一个数据可视化 JS 库。可以生成很多效果很棒的图表。 pycharts文档 |分割| echarts官网 本文主要介绍pycharts的简单使用 安装 # 安装 1.0.x 以上版本 &#xff08;需要python3.6及以上&#xff09; $ …

【POJ - 2373】Dividing the Path(单调队列优化dp)

题干&#xff1a; Farmer Johns cows have discovered that the clover growing along the ridge of the hill in his field is particularly good. To keep the clover watered, Farmer John is installing water sprinklers along the ridge of the hill. To make installa…

Ubuntu16.4(64位)下gcc-linaro-arm-linux-gnueabihf交叉编译环境安装

1. 下载压缩包 文件分享 2. 新建目录并解压 3. 配置环境变量 sudo gedit /etc/bash.bashrc 添加路径并更新路径&#xff1a;&#xff08;PATH$PATH之间无空格&#xff09; PATH$PATH://linaro-arm/gcc-linaro-arm-linux-gnueabihf-4.7-2013.03-20130313_linux/binexport P…

JAVA高级工程师课程笔记整理——(八)tomcat与九大内置对象

&#xff08;八&#xff09;tomcat与九大内置对象 tomcat B/S 浏览器/服务器 请求&#xff1a;request 响应: response C/S&#xff1a; 客户端/服务器 URL: 网址 URI: 范围包括url http https: 更安…

tshark 小技巧

将pcap转换成json文件&#xff0c;全部特征名都会在json中 tshark -T json -r D:\test.pcap > test.json合并数据包 mergecap -w all.pcap 1.pcap 2.pcap ...all.pcap: 合并之后的数据包 1.pcap ... 要合并的数据包&#xff0c;可以合并n个

【CodeForces - 1201C】Maximum Median(思维,水题)

题干&#xff1a; You are given an array aa of nn integers, where nn is odd. You can make the following operation with it: Choose one of the elements of the array (for example aiai) and increase it by 11(that is, replace it with ai1ai1). You want to make …

Apollo进阶课程 ④ | 开源模块讲解(下)

目录 1&#xff09;Apollo平台技术框架 2&#xff09;Apollo版本迭代 原文链接&#xff1a;​Apollo进阶课程 ④ | 开源模块讲解&#xff08;下&#xff09; 上周&#xff0c;阿波君与大家讨论了自动驾驶的核心问题——安全性。本期&#xff0c;我们将为大家具体介绍百度Apo…

SM4 简介

SM4 我国国家密码管理局在20012年公布了无线局域网产品使用的SM4密码算法——商用密码算法。它是分组算法当中的一种&#xff0c;算法特点是设计简沽&#xff0c;结构有特点&#xff0c;安全高效。数据分组长度为128比特&#xff0c;密钥长度为128 比特。加密算法与密钥扩展算法…

九大内置对象

指在JSP的<%%> 和<% %>中可以直接使用的对象&#xff1a;没有特别说明可以开关的默认是开启的 一servlet理论上可以处理多种形式的请求响应形式http只是其中之一所以HttpServletRequest HttpServletResponse分别是ServletRequest和ServletResponse的之类 二 Http…

3)机器学习基石笔记 Lecture3:Types of Learning

目录 1&#xff09;Learning with Different Output Space Y 2&#xff09;Learning with Different Data Label 3&#xff09;Learning with Different Protocol 4&#xff09;Learning with Different Input Space X 在上一节课中&#xff0c;我们学到了第一个机器学习…

【BZOJ - 3436】小K的农场(差分约束)

题干&#xff1a; 背景 小K是个特么喜欢玩MC的孩纸。。。 描述 小K在MC里面建立很多很多的农场&#xff0c;总共n个&#xff0c;以至于他自己都忘记了每个农场中种植作物的具体数量了&#xff0c;他只记得 一些含糊的信息&#xff08;共m个&#xff09;&#xff0c;以下列…

分组密码简介和五大分组模式

分组密码 分组密码&#xff08;blockcipher&#xff09;是每次只能处理特定长度的一块数据的一类密码算法&#xff0c;这里的一块"就称为分组&#xff08;block&#xff09;。此外&#xff0c;一个分组的比特数就称为分组长度&#xff08;blocklength&#xff09;。例如&…

Java Web(五) JSP详解(四大作用域九大内置对象等)

前面讲解了Servlet&#xff0c;了解了Servlet的继承结构&#xff0c;生命周期等&#xff0c;并且在其中的ServletConfig和ServletContext对象有了一些比较详细的了解&#xff0c;但是我们会发现在Servlet中编写一些HTML代码&#xff0c;是很不方便的一件事情&#xff0c;每次都…

Apollo进阶课程 ⑤ | Apollo硬件开发平台介绍

目录 1&#xff09;Uber事故原因分析 2&#xff09;自动驾驶的第一天条-----安全 3&#xff09;自动驾驶汽车的硬件系统 4&#xff09;自动驾驶汽车感知类传感器介绍 5&#xff09;自动驾驶汽车的传感器 6&#xff09;自动驾驶的计算单元 7&#xff09;自动驾驶的线控系…

【HDU - 3440】House Man(差分约束)

题干&#xff1a; In Fuzhou, there is a crazy super man. He can’t fly, but he could jump from housetop to housetop. Today he plans to use N houses to hone his house hopping skills. He will start at the shortest house and make N-1 jumps, with each jump tak…