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、节点
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:名称映射 from:被映射名称 to:目标名称
rosparam:常用来加载程序的参数配置文件到参数服务器,然后程序从参数服务器取得参数值
lannch机制不保证节点的启动顺序,虽然launch文件是顺序分析,但节点初始化的时间长度不一,启动时间不一
属性 | 功能 |
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的时候将会忽略掉
第二种恰好相反,当if属性的值为1的时候将会忽略掉
但是我们通常不会直接用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>
还没有评论,来说两句吧...