ROS-launch文件

launch中文含义是启动,launch文件顾名思义就是启动文件,如果没有launch文件,就需要手动rosrun逐个

启动node,遇到大工程的时候,其繁杂程度不可想象,roslaunch是一个用于自动启动ros节点的命令行工具。

roslaunch的启动命令如下:PACKAGE_NAME问功能包名称,LAUNCH_FILE_NAME为launch文件名称

roslaunch PACKAGE_NAME LAUNCH_FILE_NAME

简单的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>

launch文件标签:

所有的launch文件都由<launch>开头,由</launch>结尾,所有的描述标签都要写在<launch></launch>之间

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

1、节点

<node> 启动节点,
    <node>常用属性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等
    <node>常用标签tag:
    param:设置变量到参数服务器
    remap:名称映射 from:被映射名称 to:目标名称
    rosparam:常用来加载程序的参数配置文件到参数服务器,然后程序从参数服务器取得参数值
    lannch机制不保证节点的启动顺序,虽然launch文件是顺序分析,但节点初始化的时间长度不一,启动时间不一
</node>

属性功能
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"这个属性可以让你在自定义的命名空间里运行节点

2、<include>

 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"/>

3、<remap>

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

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

4、<param>

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

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

5、<rosparam>

rosparam标签允许从YAML文件中一次性导入大量参数,如下所示:

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

6、<arg>

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

<arg name="demo"/>

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

<arg name="demo" value="100"/>
<arg name="demo" default="200"/>

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

roslaunch demo demo.launch demo:=1000

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>

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

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

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

第一种情况,当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>

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>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值