2023年7月26日发(作者:)
ROS中的launch⽂件launch ⽂件简介从 ROS ⾓度来看,机器⼈系统就是⼀堆 node 和 topic (再添加⼀些 parameter, service 等)构成的⽹络(rosgraph),其中每个 node 都可以完成⼀定的功能。通常⼀个机器⼈运⾏时要开启很多 node,如果⼀个 node ⼀个 node 的启动,⽐较⿇烦。通过 launch⽂件以及roslaunch 命令可以⼀次性启动多个 node,并且可以设置丰富的参数。⽬前来看,官⽅ ros package ⼤部分都包含名为 launch 的⽂件夹,⾥⾯存放了 launch ⽂件。我们⾃⼰编写的 package 也应该尽量使⽤这种结构,⽅便“⼀键启动”。运⾏ launch ⽂件⽤ roslaunch 命令启动 launch ⽂件⾄少有两种⽅式:1. 借助 ros package 路径启动格式如下:roslaunch pkg_name launchfile_
2. 直接给出 launch ⽂件的绝对路径格式如下:roslaunch path_to_launchfile不论⽤上述哪种⽅式启动 launch ⽂件,都可以在后边添加参数,⽐较常见的参数有--screen: 令 ros node 的信息(如果有的话)输出到屏幕上,⽽不是保存在某个 log ⽂件中,这样⽐较⽅便调试arg:=value: 如果 launch ⽂件中有待赋值的变量,可以通过这种⽅式赋值,例如:roslaunch pkg_name launchfile_name model:=urdf/ # launch file 中有参数 “model” 需要赋值或roslaunch pkg_name launchfile_name model:='$(find urdf_pkg)/urdf/' # ⽤ find 命令提供路径roslaunch 命令运⾏时⾸先会检测系统的rosmaster是否运⾏,如果已经启动,就⽤现有的
rosmaster;如果没有启动,会先启动rosmaster,然后再执⾏ launch ⽂件中的设置,⼀次性把多个节点按照我们预先的配置启动起来。需要注意的是, launch ⽂件不需要编译,设置好之后可以直接⽤上述⽅式运⾏。launch ⽂件的格式launch ⽂件本质上是⼀种 xml ⽂件,可以在头部添加在某些编辑器中可以⾼亮显⽰关键字,⽅便阅读。与其他 xml 格式的⽂件类似,launch ⽂件也是通过标签 (tag) 的⽅式书写。主要的 tag 如下: , 这两个 tag 是 launch ⽂件的核⼼部分。基本格式如下: ...其中pkg 是节点所在的 package 名称type是 package 中的可执⾏⽂件,如果是 python 或者 Julia 编写的,就可能是 .py 或者 .jl ⽂件,如果是 c++ 编写的,就是源⽂件编译之后的可执⾏⽂件的名字。name是节点启动之后的名字, 每⼀个节点都要有⾃⼰独⼀⽆⼆的名字。注意: roslaunch 不能保证 node 的启动顺序,因此 launch ⽂件中所有的 node 都应该对启动顺序有鲁棒性。实际上 中除了
pkg,
type,
name 之外还可以设置更多参数,如下: respawn="true"
required="true" launch-prefix="xterm -e" output="screen" ns="some_namespace" />
上述命令中,respawn:若该节点关闭,是否⾃动重新启动required:若该节点关闭,是否关闭其他所有节点launch-prefix: 是否新开⼀个窗⼝执⾏。例如,需要通过窗⼝进⾏机器⼈移动控制的时候,应该为控制 node 新开⼀个窗⼝;或者当 node 有些信息输出,不希望与其他 node 信息混杂在⼀起的时候。output:默认情况下,launch 启动 node 的信息会存⼊下⾯的 log ⽂件中/.ros/log/run_id/node_可以通过此处参数设置,令信息显⽰在屏幕上ns:将 node 归⼊不同的 namespace,即在 node name 前边加
ns 指定的前缀。为了实现这类操作,在 node 源⽂件中定义 nodename 和 topic name 时要采⽤ relative name, 即不加slash符号
/.经常作为 node tag 的⼦ tag 出现,可以⽤来修改 topic。 在很多 rosnode 源⽂件中,可能并没有指定接收的或者发送的 topic,⽽仅仅是⽤
input_topic 和
output_topic 代替,这样在使⽤中需要将抽象的 topic 名字替换成具体场景中的 topic 名字。简单地说, remap 的作⽤就是⽅便同⼀个 node ⽂件被应⽤到不同的环境中,⽤ remap 从外部修改⼀下 topic 即可,不需要改变源⽂件。remap 常见的使⽤格式如下: 这个标签的作⽤是将另外⼀个 launch ⽂件添加到本 launch ⽂件中,类似 launch ⽂件的嵌套。基本格式:上边的⽂件路径可以给具体路径,但是⼀般来说为了程序的可移植性,最好借助
find 命令给出⽂件路径:上述命令中,$(find package-name) 等价于本机中相应 package 的路径。这样即使换了其他机⼦,只要安装了同样的 package,就可以找到对应的路径。有时,另⼀个 launch 引⼊的 node 可能需要统⼀命名,或者具有类似特征的 node 名字,⽐如 /vehicle1/gps, /vehicle1/lidar,/vehicle1/imu,即 node 具有统⼀的前缀,⽅便查找。这可以通过设置
ns (namespace)属性来实现,命令如下:通过 tag 可以使参数重复使⽤,也便于多处同时修改。 三种常⽤⽅法:: 声明⼀个 arg,但不赋值。稍后可以通过命令⾏赋值,或者通过 tag 赋值。: 赋默认值。这个值可以被命令⾏和 tag 重写。: 赋固定值,这个值不可以被改写.从 command-line 赋值roslaunch package_name file_ arg1:=value1 arg2:=value2变量替换
$(find *) 和
$(arg *)在 launch ⽂件中常⽤的变量替换形式有两个$(find pkg): 例如$(find rospy)/. 如果可能,强烈推荐这种基于 package 的路径设置$(arg arg_name): 将此处替换成
tag 指定的 arg value.例如:
# 先设置默认值,如果没有额外的赋值,就⽤这个默认值了另⼀个例⼦:这样设置之后,在启动 roslaunch 时,可以为 args 赋值roslaunch beginner_tutorials launch_ a:=1 b:=5 与 提到 param ⾸先要知道 parameter server, 它由 ROS Master 管理,提供了⼀个共享的字典 (dict) 类型数据。节点通过这个 server 存储、获取运⾏时所需的参数。param server 设计时就不是针对⾼速存取的,因此⼀般只适合存放静态数据,例如配置参数.由于是全局可获取, 我们可以很容易的查看其中的 param 并且修改。param 的命名与 topic 和 node 相同,都是有 namespace hierarchy 结构的,这可以防⽌不同来源的名字冲突。它的存取也是体现了结构性,例如下边的 params/camera/left/name: leftcamera/camera/left/exposure: 1/camera/right/name: rightcamera/camera/right/exposure: 1.1对于上述数据,如果读取参数
/camare/left/name 可以得到
leftcamera如果读取 param
/camera/left可以得到 dict 为{name: leftcamera, exposure: 1}如果读取 param
/camera,则得到 dict 为{left: {name: leftcamera, exposure: 1},
right: {name: rightcamera, exposure: 1.1}}
与 arg 不同,param 是共享的,并且它的取值不仅限于 value,还可以是⽂件,甚⾄是⼀⾏命令。格式 # type可以省略,系统⾃动判断 # 读取 file 存成 string实例: # command 的结果存在 param 中param 可以是在 global scope 中,它的 name 就是原本的 name,也可以在某个更⼩的 scope 中,⽐如 node,那么它在全局的名字就是node/param 形式.例如在 global scope 中定义如下 param再在 node scope 中定义如下 param 如果⽤
rosparam list列出server 中的 param,则有/publish_frequency/node1/param1 # ⾃动加上了 namespace 前缀注意:虽然 param 名字前加了 namespace,但是依然 global viewable> 只能对单个 param 操作,⽽且只有三种:value, textfile, command 形式,返回的是单个 param 的内容。 则可以批量操作,还包括⼀些对参数设置的命令,如 dump, delete 等load : 从 YAML ⽂件中加载⼀批 param,格式如下:delete: 删除某个 param类似 的赋值操作[1,2,3,4]或者a: 1b: 2 tag 也可以放在 tag 中, 此时 param 名字前边都加上 node namespace.如果要对多个 node 进⾏同样的设置,⽐如都在同⼀个特定的 namespace,remap 相同的topic 等,可以⽤ tag。在 group 中可以使⽤所有常见的 tag 进⾏设置,例如 # 对该 group 中后续所有 node 都有效 # 各个 node 中可以重新设置 remap Written by
SHRevised by QP
发布者:admin,转转请注明出处:http://www.yc00.com/xiaochengxu/1690366509a338932.html
评论列表(0条)