ROS学习之launch文件


https://blog.csdn.net/try_again_later/article/details/82933533
https://blog.csdn.net/zqxf123456789/article/details/52497833
http://www.guyuehome.com/2195

简单介绍

launch文件本质上是XML文件,根标签由launch标签定义。子标签包括node,machine,param,rosparam,include,group,test,arg等

node标签

node标签定义了 ROS系统启动的节点,但需要注意的是,由于无法获知节点何时初始化完成,节点的启动顺序无法保证,因此在节点的实现上,应保证节点对启动顺序没有依赖。在生产环境中,对于存在依赖的节点,可以将节点分散到不同的launch文件中。

<node name="hello" pkg="example_1" type="hello"/>

name表示节点的名称,name为必选属性
pkg表示包名称,pkg为必选属性
type表示节点类型,需与节点生成的可执行文件同名,type为必选属性

<node name="listener1" pkg="rospy_tutorials" type="listener.py" args="--test" respawn="true"/>

args 表示节点启动参数,多个参数之间用空格隔开,args为可选属性。
respawn 表示是否复位,当节点因为某种原因而终止运行时,若respawn设为true,则roslaunch会重启该节点,respawn默认为false,respawn为可选属性。

其他的一些属性解释:
== machine==表示节点所在的设备名,machine为可选属性。
respawn_delay表示节点终止后延迟重启的时间,单位为秒,默认为0秒,为可选属性
required表示关键节点,若设为true,则当节点终止时,roslaunch会杀死自己启动的所有节点并退出运行,required为可选属性。
ns表示名称空间,默认为“/”,ns为可选属性。
clear_params表示是否在启动前删除节点私有名称空间中的参数,若设为true则删除, clear_params为可选属性。
output表示日志输出的位置,若设为log,则输出到日志文件中,若设为screen,则输出到终端上,默认为log,output为可选属性。
cmd表示节点的工作路径,若设为node则表示工作路径为节点的可执行文件位置,若设为ROS_HOME,则为ROS的根目录即~/.ros, cmd为可选属性
launch-prefix表示启动前缀,用于启动gdb,valgrind,xterm,nice等工具。为可选属性。如launch-prefix="xterm -e"等价于:

$xterm -e rosrun turtlesim turtle_teleop_key

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

利用GDB进行调试的代码如下:

<node name="client" pkg="example_3" type="client" output="screen" launch-prefix="xterm -e gdb --args"/>

利用valgrind来检测内存泄漏,并进行性能分析,示例代码如下:

<node name="client" pkg="example_3" type="client" output="screen" launch-prefix="valgrind"/>

node子标签

除属性外,node标签还支持env remap rosparam param等子标签,其中env表示节点的环境变量;remap表示节点的重映射remap标签的一个示例代码如下:

<node name="listener" pkg="example_3" type="listener" output="screen">
    <remap from="chatter" to="hello"/>
</node>

以上代码表示listener节点订阅了chatter话题,但实际上,由于代码实现,开发者仅有一个发布了hello话题的节点,并且因为两者支持的消息类型相同,故利用remap进行了重映射。

rosparam支持load dump delete 三种参数操作。
load操作表示加载一个YAML文件,并将其中的参数存入ROS参数服务器中。
dump操作表示将ROS参数服务器中的参数存入YAML文件。
delete操作表示删除参数。

rosparam的属性中,
command表示load dump delete三种参数操作;
file表示YAML文件名
param表示参数名
ns表示名称空间 可选
subst_value表示是否运行在YAML文件中使用替代参数 可选
示例代码:

<!--加载YAML文件->
<rosparam command="load" file="$(find rosparam)/example.yaml"/>
<!--删除参数->
<rosparam command="delete" param="my/param"/>
<!--设置参数->
<rosparam param="a_list">[1,2,3,4]</rosparam>
<!--设置参数->
<rosparam>
a:1
b:2
</rosparam>
<!--替换部分参数>
<args name="whitelist" default="[3,2]"/>
<rosparam param="whitelist" subst_value="True">
    $(arg whitelist)
</rosparam>

param表示定义参数并设置到参数服务器中,其属性包括name表示参数名;type表示参数类型,目前支持str int double bool 等类型;
value表示参数值。
示例代码如下:

<param name="publish_frequency" type="double" value="10.0"/>

machine标签

machine定义了ROS节点运行的设备,当节点在本地运行时,无须使用machine标签,跨设备的ROS节点则基于SSH通信。

machine标签的属性:
name表示设备的主机名,为必选属性。
address表示设备的网络地址或者主机名(hostname),为必选属性
env-loader表示远程设备上的环境变量文件,env-loader在ROS Fuerte新增,为必选属性。

user表示远程登录方法的SSH的用户名
password表示远程登录方法的SSH的密码
由于SSH通常会配置为无密码登录,故为可选属性。

default表示节点默认运行的设备,属性值可为true false never default
为可选属性
timeout表示节点启动的超时时间,默认为10s,为可选属性
除了属性之外,machine标签还支持env标签,env标签表示设置在该设备上的一个环境变量。 machine标签的示例代码如下:

<machine name="jjp" address="192.168.2.127" env-loader="/opt/ros/kinetic/env.sh" user="miaozl">
   <env name="LUCKY_NUMBER" value="88"/>
</machine>

(呼叫其他launch 档)

它的语法其实就是让ROS去找目标launch档的路径,一个很有用的写法,是用$(find
)这种语法来直接找包裹下的路径,所以不管这个包裹的路径被更改,程式照样能找得到目标。请看下面范例:示例代码如下:

<include file="$(find openni2_launch)/launch/openni2.launch">
<arg name="camera" value="rgbd_front_top"/>
<arg name="d​​evice_id" value="#1″/>
<arg name="d​​epth_registration" default="true"/>
</include>

以上是一个启动openni2.launch这个launch
档的语法,包含在里面的则是其引数。那又要怎么知道设定那些引数呢?最简单的方法就是去看看目标launch档一开头的
标签,看看有那些设定可以更改。

group标签

标签group可以将不同的launch文件,节点组合起来,例如,放在同一名称空间中,或者同时终止,启动一组节点。
示例代码如下:

<launch>
  <group name="wg">
     <include file="$(find pr2_alpha)/$(env_ROBOT).machine"/>
     <include file="$(find 2dnav_pr2)/config/new_amcl_node.xml"/>
     <include file="$(find 2dnav_pr2)/config/base_odom_teleop.xml"/>
     <include file="$(find 2dnav_pr2)/config/laser_and_filters.xml"/>
     <include file="$(find 2dnav_pr2)/config/map_server.xml"/>
     <include file="$(find 2dnav_pr2)/config/ground_plane.xml"/>
     <!--The navigation stack and associated parameters-->
     <include file="$(find 2dnav_pr2)/move_base/move_base.xml"/>
  </group>
</launch>

放在同一个名称空间中的示例代码如下:

<group ns="example">
   .......
</group>

同时启动一组节点,示例代码如下

<group if="1">
   .......
</group>

类似的,如果if属性的值为0,则终止该组节点

条件属性

在launch文件中,所有标签均支持if unless属性
示例代码如下:

<!--如果foo为true 则执行group标签中的内容-->
<group if="$(arg foo)">
    .......
</group>

<!--如果foo为false,则执行group标签中的内容-->
<group unless="$(arg foo)">
   ........
</group>

引数

引数通常用来作为执行各节点或launch 档所需要的输入参数,换句话说,设定区域变数,通常需要使用者输入所需的数值,但也可以事先写好预设的数值。另外一种用法,是用引数作为一个逻辑判断,决定那些节点要执行,哪些不用。
引数的语法会像这样:

<arg name="" value="">

其中name是参数的名称。Value 是参数的值。有时候也用default=”…”来设定预设值。以下举几个例子:

<arg name=”max_value” value=”0.5”>
<arg name=”height_above_ground” default=”1.6”>
<arg name=”camera_input” value=”/camera”>
<arg name=”sensors_on” value=”true”>

替代参数

  • 替代环境变量,ros提供了env optenv两种方法,适用于不同的场景:env表示替换当前环境的变量,如果该变量没有设置,则会启动失败;optenv替换变量时,如果该变量没有设置,则optenv将使用默认值,如果默认值没有提供,则使用空字符串代替。示例代码如下:
<param name="foo" value="$(optenv NUM_CPUS 1)"/>
  • 替代文件路径 ROS使用find参数来替代文件路径,使用程序包的相对路径而不是绝对路径,可以避免文件路径硬编码问题。示例代码如下:
<param name="configfile" textfile="$(find roslaunch)/example.xml"/>
  • 替代节点名称 ROS使用anon基于节点名称产生一个替代节点名称,需要注意的是,基于相同的节点名称多次调用产生的替代节点名称也是相同的,示例代码如下:
<node name="$(anon foo)" pkg="rospy_tutorials" type="talker.py"/>
  • 替代参数值 ROS使用arg产生替代参数值,既可以进行参数间的传递,也可以接收命令行传递的参数替代。参数间替代的方法如下:
<param name="foo" values="$(arg my_foo)"/>

以上代码表示将my_foo的值赋予foo
命令行传递参数替代的方法如下:

<node name="client" pkg="example_1" type="client" args="$(arg a) $(arg b)"/>

roslaunch 传递参数的方法如下:

roslaunch example_1 example_1.launch a:=1 b:=6
  • 启动时计算 ROS melodic 中新增了一个eval,专门用于处理复杂python表达式的替代计算,示例代码如下:
<param name="circumference" value="eval 2.*3.1415*arg('radius')"/>
  • 当前绝对路径ROS Lunar中新增了一个dirname,用于返回当前launch文件所在的绝对路径,从而避免了文件硬编码问题。示例代码如下:
<include file=$(dirname)/other.launch/>

launch文件脚本调用

通过脚本既可以对launch文件进行单个调用,也可以对launch文件按照一定的时间顺序进行连续调用,特别是存在时序依赖的节点,应该将节点分布到不同的launch文件中通过脚本进行调用,示例代码如下:

#!bin/bash
roslaunch bhand_controller bhand_controller.launch &
sleep 5
echo "bhand controller starting success"
roslaunch beginner_tutorials bhand_control.launch &
sleep 0.1
wait
exit 0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值