ROS之launch文件解析

Launch 文件

1 使用launch文件

1.1 运行launch文件

$ roslaunch package_namelaunch_file_name

Eg: roslaunchturtlesim example.launch

(1)Tip1: rosrun只能运行一个nodes, roslaunch可以同时运行多个nodes.

Tip2: launch文件可以不被包含于package中。此时,只需指出该launch文件的绝对路径,即可运行。

$ roslaunchcompletely_path

Eg:$ roslaunch~/opt/ros/indigo/share/turtlesim/launch/example.launch

Tip3: 为便于执行,每个node最好是相互独立的。

(2)详细显示(requestverbosity)

$ roslaunch -vpackage_name launch_file_name

(3) 结束launch文件

ctrl+c

2 创建launch文件

(1) launch文件一般以.launch后缀作为文件名,放在packagelaunch文件夹下。最简单的launch文件可以仅包含几个nodes

(2) Launch文件是XML文件,每个XML文件必须有一个root element而launch文件的rootelement由一对launch 标签定义。

...

Launch文件中的其他elements必须都在这一对tags之间。

(3) launch文件的核心是一系列nodeelements,每个node element启动一个node。Node element看起来如下:

  pkg=”package_name” type=”executable_name”name=”node_name”

/>

Tip1: 最后的“/”是必不可少的

Tip2: 也可以写成.. type=... name=...>

如果该node中有其他tags,则必须使用这种形式。

(4) 一个node element包含三个必须的属性:pkg, type, name.

pkg和type属性指出ROS应该运行哪个pkg中的哪个node,注意:此处的type是可执行文件的名称name则是可以任意给出的,它覆盖了原有文件中ros::init指定的node name

(5) 使用匿名(anonymousname)

  name=”$(anon base_name)”

(6) node 日志文件(log file)

运行roslaunch和用rosrun运行单个节点的区别之一是,默认情况下,roslaunch运行的nodes的标准输出会重定向到logfile,不显示在控制台。   ??????????????

该日志文件的位置和名称如下:

~/.ros/log/run_id/node_name-number-stdout.log

其中,run_idmaster启动后生成的特殊标识符,number是表示nodes数量的整数。如,turtlesim-1-stdout.log;teleop_key-3-stdout.log.

(7) 输出到控制台

output属性, output=screen”;这种方法仅显示一个node

若显示所有nodes的输出,用--screen命令行。

$ roslaunch--screen package_name launch_file_name

如果正在运行的文件没有显示想要对输出,可以查看该node属性集中是否有 output=screen.

(8) 要求重生(requestrespawning)

    开启所有nodes后,roslaunch会监视每个node,记录那些仍然活动的nodes。对于每个node,当其终止后,我们可以要求roslaunch重启该node,通过使用respawn属性。

    respawn=”true”

(10) 必需的nodes

required属性与respawn相反,不能同时对同一个node使用。当一个必需的节点终止时,roslaunch会做出响应,终止其他所有的节点并退出它自己。所以如果你给单个的一个节点同时设置了这2个属性,roslaunch 命令会抱怨

required=”true”

当一个required node终止后,所有其他的nodes都会终止,并退出。这种命令有时很有用。比如,当一个很重要的node失败后,整个会话都会被扔掉,那些加上了respawn属性的nodes也会停止。

(11) 在独立的窗口运行各nodes

我们在各自的termin运行rosrun node_name;但是运行roslaunch时,所有的nodes共用一个相同的terminal,这对于那些需要从控制台输入的nodes很不方便。可以使用launch-prefix属性。

launch-prefix=”command-prefix”

Eglaunch-prefix=xterm -e

等价于 xterm -e rosrunturtlesim turtle_teleop_key

xterm 命令表示新建一个terminal -e参数告诉xterm执行剩下的命令行。

当然,launch-prefix属性不仅仅限于xterm。它可用于调试(通过gdbvalgrind),或用于降低进程的执行顺序(通过nice.

 roslaunch 命令 的一个潜在的缺点:相比我们原来对每个节点在单独的终端使用 rosrun 命令启动的做法,roslaunch 则是让所有的节点共享同一个终端。那些只需要生产简单的日志消息文件而不需要终端(console)输入的节点是容易管理的,而那些依赖终端输入的节点,比如 turtle_teleop_key 节点,它可能要优先的保留在独立的终端上。

在例子launch文件中,我们给teleoperation 节点使用了这个属性:launch-prefix=”xterm -e”.因为这个属性,启动这个 node 元素的 rosrun 命令大致相当于:xterm -e rosrun turtlesim turtle_teleop_key.

xterm 命令会开一个新的终端窗口。-e 参数告诉 xterm :执行其命令行剩余部分(rosrun turtlesim turtle_teleop_key)。

3 在namespace中执行nodes

为node设置默认的namespace的常用方法——被称为“pushingdown into a namespace”的进程,用于launch文件,并在其node element中指定ns属性。

ns=”namespace”

launch文件中的node namesrelative names。同一个launch文件中,允许不同namespace中出现相同的node namesRoslaunch要求node names必须是base names——不指定任何namespacesrelative names;如果node element中出现node nameglobal name,则会报错。

4 重映射names(remappingnames)

除了解析relative namesprivate namesROS也支持重映射,用于修改nodes当前使用的名称。

重映射相当于换名,每次重映射需提供一个originalname和一个new name。每次node使用它的original name, ROS client library都会将其替换为remapping name。

创建remapping name两种方法:

1. 对于单个node,在命令行进行remapping(remap对象可以是node,topic等)。

   original-name:=new-name

Eg: $ rosrunturtlesim turtlesim_node turtle1/pose:=tim

2. launch文件内remap names,使用remapelement

 

如果remap出现在launch文件开头,作为launch文件的子元素,则该remapping将被用于随后所有的nodes。如果remap作为某个node的子元素,则只用于该节点。

Eg:

   

注意:在ROS进行remapping之前,remaping的所有name,包括originalnew names,都将被解析为global names。所以,remapping之后所有的名字通常都是relative names

5 其他的launch elements

5.1 including其他文件

为包含其他launch文件,包括这些launch文件的所有nodes和parameters,用includeelement。

这种情况下,file属性必须写出该launch文件的全部路径名称,显得很繁琐。因此,常用

注意,执行该launch文件时,roslaunch会搜索该package下的所有子目录;因此,必须给出package_name。此外,include也支持ns属性,将它的内容放进指定的namespace

这样做是正确的: /launch/start_demo.launch"/ >

这样做是错误的: start_demo.launch"/>

5.2 Launcharguments

为便于launch文件重构,roslaunch支持launcharguments,也成为arguments或者args,类似于局部变量

注意:尽管argumentparameter有时可互换,但他们在ROS中的意义完全不同。ParametersROS系统使用的数值,存在parameter server上,nodes可通过ros::param::get函数编程得到,用户可通过rosparam获取。与之不同,arguments仅在launch文件内部有意义,nodes不能直接获取它们的值。

(1)声明argument

(2)指定argument的值

Launch文件中的每个argument都必须有指定值。赋值方法有好几种。

第一种,在命令行赋值

$ roslaunchpackage_name launch_file_name arg-name:=arg_value

第二种,在声明argument时赋值

上面两行的区别在于,命令行参数可以覆盖default,但是不能重写value的值。

在例子launch文件 中,use_sim3 节点的 default 值为 0,所以它可以通过命令行改变值,就像下面这样:

$ roslaunchagitr triplesim.launch use_sim3:=1

如果我们修改了这个例子launch文件:使用value替换default。那么上面这个命令执行的时候会出 现错误,因为使用value属性配置的argument的值是不允许改变的。

 (3)获取变量值

一旦声明某个argument并赋值后,我们可以通过arg使用该argument.

$(arg arg-name)

如果该行出现,roslaunch将会用给定arg-name的值替换其左边的值。

 (4)argument值传给included launch文件

在argument的传递上有一个限制,就是argument不能传递给 include元素里包含的子launch文件使用。这个问题非常重要,因为这个 argument 就像是一个局部变量,它不能被包含的launch文件所 “继承” 。

解决这个问题的方法:在 include 元素中插入 arg 元素作为 include 元素的子类(children),就像是这样:

......

若在launch文件中,launch文件及其包含的launch文件出现相同的arguments,则需在launch文件及included launch文件中同时写:

第一个arg_name表示(includedlaunch文件中的argument,第二个arg_name表示launch文件中的argument.其结果是指定的argumentlaunch文件及included launch文件中都有相同的值。

注意,这里的 arg 元素不同于我们已经知道的arg 声明,在 inchude 标签内的arguments是给包含 (included) 的launch文件提供的arguments,不是为本launch文件提供的。

一种常见的情况是,被包含(included)的launch文件和本launch文件会有共同的参数。在这种情况下,我们希望这些值(values)永远不变。像这样的元素,在这两个地方使用相同的argument name (参数名),要这样做:

在这种情况下,第一个 arg-name 和往常一样。第二个arg-name 是launch文件中提供的。结果是,这两个launch文件中给定的argument具有相同的值(value)。

argumentparameter有区别

尽管术语argument和parameter在许多计算机环境中稍微可以互换使用,它们的含义在ROS中有很大的不同。Parameters(参数)在一个运行的ROS系统中是变量(values),它被存储在parameter服务器中,活动(或者叫:运行)的节点通过ros::param::get()函数访问它,并且用户可以通过 rosparam 命令行工具使用它。相比之下,arguments只有在launch文件里合法,它们的值不是直接提供给节点。

5.3 创建groups

Group element可以再大型的launch文件中将指定的nodes组织起来。它有两个用处:

其一,group可以将几个nodes放进同一个namespace

......

注意,如果grouped node已经有它自己的namespace,并且是relative name,那么该nodenamespace是其relative name,并以group namespace为后缀。

其二,group可以同时启动或者终止一组nodes

......

如果该属性的值是1,一切正常;如果该属性的值为0,那么group内所有的nodes都不会运行。

同理,除了if,还有unless unless 属性的工作方式类似 if 属性,但是含义颠倒。

......

注意,这些属性的合法值只有01.

另外,group element中只能使用nsifunless这三个属性

当然了,通常我们不会给这些属性使用简单的0 或 1 这样的赋值。建议:结合 arg 的 $() 技术,它们会将你的launch文件的配置变得非常的强大

依赖包,

$ catkin_create_pkg beginner_tutorialsstd_msgs rospy roscpp

# catkin_create_pkg [depend1] [depend2] [depend3]

每个程序包创建时可以生成一些依赖包(就是引用的文件)如上代码就引用了std_msgs rospy roscpp这三个依赖包,可以在生成的pack.xml文件中找到,

$ rospack depends1 beginner_tutorials  //列出beginner_tutorials中的一级依赖包,

 

https://www.cnblogs.com/CZM-/p/5943821.html

launch

在ROS应用中,每个节点通常有许多参数需要设置,为了方便高效操作多个节点,可以编写launch文件,然后用roslaunch命令运行

roslaunch: roslaunch [options] [package] [arg_name:=value...]

                    roslaunch [options] [...] [arg_name:=value...]

launch文件的一般格式,参数:

   

   

   

   

   

   

   

参数说明

要启动的node参数

name=''nodename''  //该节点的名字,相当于代码中ros::int的命名信息,有了它代码中的名称会被覆盖。

pkg=''mypackage''   //该节点属于哪个包,相当于rosrun命令后面的第一个参数

type=''nodetype''   //可执行文件的名字,rosrun命令的第二个参数

以上每个节点元素由三个必须的属性:

    args=''arg1....''(可选)

   respawn=''ture''(可选)如果节点停止,自动重启节点 //请求复位,当该属性的值为respawn="true"时,roslaunch会在该节点崩溃时重新启动该节点

   ns=''foo''(可选)在foo命名空间启动节点//在命名空间中启动节点。

output=''log|screen''(可选)    //将标准输出显示在屏幕上而不是记录在日志中

required //必要节点,当该值为required="true"时,roslaunch会在该节点终止时终止其他活跃节点

启动前缀:在启动命令加上前缀。例如当其设置为launch-prefix="xterm -e"时,效果类似于xterm -erosrun X X。也就是为该节点保留独立的终端

remap重映射:使用方法remapfrom="original-name(turtle/pose)"to"new-name(tim)"

操作yaml文件参数

include包含其他文件include file="path to launch file"

在启动文件中包含其他启动文件的内容(包括所有的节点和参数),可使用如下命令使路径更为简单include file="($find package-name)/launch-file-name"

 

 

 

   command=''load|dump|delete''(默认load)

   file=''$(find pkg-name)/path/foo.yaml''(load或dump命令)yaml文件的名字

   param=''param-name''参数名

定义一个设置在参数服务器的参数,它可以添加到

   name=''namespace/name''

   value=''value''(可选)如果省略这个参数,则应指定一个文件(binfile/textfile)或命令

   type=''str|int|double|boot''(可选)指定参数的类型

   textfile=''$(find pkg-name)/path/file''(可选)  

 

   binfile=''$(find pkg-name)/path/file''()

   command=''(find pkg-name)/exe '$(find pkg-name)/arg.txt' ''(可选)exe是可执行文件(cpp、py),arg.txt是参        数文件

在当前launch文件中调用另一个launch文件

   file=''$(find pkg-name)/path/launch-file.launch''   

设置节点的环境变量

   name=''environment-variable-name''

   value=''environment-variable-value''   

将一个参数名映射为另一个名字

   from=''original-name''

   to=''new-name''   

定义一个局部参数,该参数只能在一个launch文件中使用

   声明一个参数foo,后面需要给它赋值

   声明一个参数foo,如不赋值取默认值

声明一常量foo,它的值不能修改

http://blog.csdn.net/seawolfe/article/details/69525113

roslaunch工具是ros中python实现的程序启动工具,通过读取launch文件中的参数配置、属性配置等来启动一系列节点;

很多ROS包或源码包中都有launch文件,一般为该程序包能够运行起来的基本demo配置,运行下面指令自动补全会提示该包现有的launch文件:

$roslaunch  package_name file.launch

launch文件的位置并不是很重要,如果放在任意一个位置,可以运行下面指令:

$roslaunch  path-to-where/file.launch

 

launch文件是XML格式标记文本,后缀名无关紧要,一般为.launch/.xml/.test/无后缀

最简单的配置如下:

 

启动上面的launch文件就会启动package_name包下的exe_name执行文件,you_define_node_name自定义的node_name

一个复杂的配置:

   

   

   

   

   

   

   

   

   

         

 

         

         

       

    -->

      

       

       

   

   

   

   

   

     

     

       

       

       

       

 

 

       

       

 

       

 

       

      

     

     

       

       

       

       

 

 

       

       

 

       

 

       

   

     

     

       

       

       

       

       

   

     

            args="-d $(findpkg_name)/launch/VLP16_2D.rviz"/>

   

上面的launch文件首先声明了一些参数,之后include另一个launch文件,included.launch文件中的节点会按深度优先执行配置和启动;

之后该launch文件启动3个节点,前两个节点来自同一个包的同一个可执行文件,节点命名不能相同,每个节点可以进行自己的参数配置;

之后该launch文件启动rviz节点,参数传递 rviz的配置文件,不同配置用于显示不同的信息

可以作为一组标签的容器,从而使该组有独立的名称空间

所以标签可使用 if/unless属性,如果条件成立则包含标签

 

launch常用标签tag:

参数声明,arg_1 通过命令行传递,arg_2 传递到included.launch arg_3 默认值可以被重写覆盖,agr_4不能被重写   ????

 

包含其他文件,包含文件中定义的参数、变量、节点都会按深度优先遍历依次执行生效

 

:设置变量到参数服务器,参数服务器的概念看roswiki

 

:dump/load、delete parameters from/to Parameter Server,常用来加载程序的参数配置文件到参数服务器,然后程序从参数服务器取得参数值;

 

:名称映射 from:被映射名称 to:目标名称,名称映射的概念看roswiki

 

启动节点,

    常用属性tag:

    pkg:"pkg_name"  包名

    type:"exe_name"  节点类型,即编译生成的可执行文件

    name:"node_name" 节点名称,自定义但不能重复

    args:"arg1 ..."  传递节点的参数列表

    respawn:"true" 如果节点退出自动重启default:false

    output:"screen" 标准输出/标准错误输出重定向屏幕,log重定向log文件,default:log

    required:"true" 如果节点退出,杀死全部launch进程

    launch-prefix:"prefix arguments" 前置的参数,可以使用其他工具如gdb,valgrind等

 

    常用标签tag:

    param

    remap

    rosparam

 

    lannch机制不保证节点的启动顺序,虽然launch文件是顺序分析,但节点初始化的时间长度不一,启动时间不一

 

http://blog.csdn.net/rosjjfdfd/article/details/49781295

.launch文件分析

  在我们的功能包中可以看到launch文件夹下有很多的.launch文件,这些文件​写入了我们想要同时运行的节点,当我们需要有很多节点同时启动时,一个个启动它们会费时费力,这时我们可以写一个.launch文件把这些节点都包括进去,这样可以通过roslaunch命令来把这些节点都启动了。

       到这里假设我们都已经知道怎样使用roslaunch命令了,这次重先简单介绍一下.launch文件的结构,然后重点说一下.launch文件中的重映射(remap)。

1 .launch文件的结构

           

                      

                       

           

      上面是.launch文件的最小例子。.launch文件开头是以​为标签,让我们知道这是一个.launch文件,以为结尾。而中间就是写自己要启动的节点,是以 开始,结束,其中pkg="rospy_tutorials",这是自己要启动的节点所在的包;type="talker",这是自己写的节点.cpp程序通过编译生产的可执行文件的名字,你最初编译.cpp程序的时候要在CMakeLists.txt添加cpp程序编译的设置,这个可执行文件的名字在CMakeLists.txt中就可以找到;name="talker",这是节点的名字。

2.Roslaunch/XML/remap     ​

 1. 元素

启动一个节点.

设置参数服务器上的参数

声明一个名称的映射,允许你通过名称映射参数到ROS 节点(通过更结构化的方式而不是直接设置节点参数属性来启动的节点)。

声明启动要使用的机器.

使用rosparam 文件设置启动要用的ROS 参数

包含roslaunch 文件.

制定启动节点的环境变量

启动一个测试节点seerostest).

声明参数

共享一个命名空间或映射的封闭的元素组。

2 .launch文件的重映射(remap

       据我理解,重映射就是甲节点得到相关的信息,通过重映射使乙节点得到甲节点一样的信息,从而使得乙节点模仿甲节点做出相应的响应。

标签适用于在其范围内随后的所有声明(, or)。

 

其他较好的launch文件教程:

http://blog.csdn.net/zqxf123456789/article/details/52497833

http://blog.csdn.net/qq_33444963/article/details/77893881

你可能感兴趣的:(ROS,launch)