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后缀作为文件名,放在package的launch文件夹下。最简单的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: 也可以写成 如果该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_id是master启动后生成的特殊标识符,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” Eg:launch-prefix=”xterm -e” 等价于 xterm -e rosrunturtlesim turtle_teleop_key xterm 命令表示新建一个terminal; -e参数告诉xterm执行剩下的命令行。 当然,launch-prefix属性不仅仅限于xterm。它可用于调试(通过gdb或valgrind),或用于降低进程的执行顺序(通过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 names是relative names。同一个launch文件中,允许不同namespace中出现相同的node names。Roslaunch要求node names必须是base names——不指定任何namespaces的relative names;如果node element中出现node name为global name,则会报错。 4 重映射names(remappingnames) 除了解析relative names和private names,ROS也支持重映射,用于修改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,包括original和new 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。
这样做是正确的:
这样做是错误的:
5.2 Launcharguments
为便于launch文件重构,roslaunch支持launcharguments,也成为arguments或者args,类似于局部变量。
注意:尽管argument和parameter有时可互换,但他们在ROS中的意义完全不同。Parameters是ROS系统使用的数值,存在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表示(included)launch文件中的argument,第二个arg_name表示launch文件中的argument.其结果是指定的argument在launch文件及included launch文件中都有相同的值。
注意,这里的 arg 元素不同于我们已经知道的arg 声明,在 inchude 标签内的arguments是给包含 (included) 的launch文件提供的arguments,不是为本launch文件提供的。
一种常见的情况是,被包含(included)的launch文件和本launch文件会有共同的参数。在这种情况下,我们希望这些值(values)永远不变。像这样的元素,在这两个地方使用相同的argument name (参数名),要这样做:
在这种情况下,第一个 arg-name 和往常一样。第二个arg-name 是launch文件中提供的。结果是,这两个launch文件中给定的argument具有相同的值(value)。
argument和parameter有区别
尽管术语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,那么该node的namespace是其relative name,并以group namespace为后缀。
其二,group可以同时启动或者终止一组nodes。
......
如果该属性的值是1,一切正常;如果该属性的值为0,那么group内所有的nodes都不会运行。
同理,除了if,还有unless ,unless 属性的工作方式类似 if 属性,但是含义颠倒。
......
注意,这些属性的合法值只有0和1.
另外,group element中只能使用ns,if,unless这三个属性。
当然了,通常我们不会给这些属性使用简单的0 或 1 这样的赋值。建议:结合 arg 的 $() 技术,它们会将你的launch文件的配置变得非常的强大
依赖包,
$ catkin_create_pkg beginner_tutorialsstd_msgs rospy roscpp
# catkin_create_pkg
每个程序包创建时可以生成一些依赖包(就是引用的文件)如上代码就引用了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]
roslaunch [options]
launch文件的一般格式,参数:
参数说明
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)"
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是参 数文件
file=''$(find pkg-name)/path/launch-file.launch''
name=''environment-variable-name''
value=''environment-variable-value''
from=''original-name''
to=''new-name''
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: :设置变量到参数服务器,参数服务器的概念看roswiki 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等 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文件开头是以
2.Roslaunch/XML/remap
1. 元素
设置参数服务器上的参数
2 .launch文件的重映射(remap)
据我理解,重映射就是甲节点得到相关的信息,通过重映射使乙节点得到甲节点一样的信息,从而使得乙节点模仿甲节点做出相应的响应。
其他较好的launch文件教程:
http://blog.csdn.net/zqxf123456789/article/details/52497833
http://blog.csdn.net/qq_33444963/article/details/77893881