ROS 学习笔记(七)—— roslaunch 详解

1. rosrun 与 roslaunch

rosrun 启动单个节点

rosrun package_name executable_file_name

roslaunch 是一个用于同时启动多个ros节点的命令行工具:

roslaunch package_name  launch_file_name

launch 文件是实现多个节点配置和启动的 XML 文件。根据规范,这些文件的后缀都是.launch 。通常会在packages 的 src 文件中创建一个 launch 文件夹,用于存放.launch文件。
一个最简单的launch文件可以像下面这样:

<launch>
    <node name="demo1" pkg="demo_package" type="demo_pub" output="screen"/>
    <node name="demo2" pkg="demo_package" type="demo_sub" output="screen"/>
</launch>

roslaunch 启动节点时,如果没有 ros Master 节点,则 roslaunch 会自动创建一个。

2. roslaunch 的 标签

参考:ROS入门之——浅谈launch
roslaunch

2.1 节点 <node>

node标签是launch文件里最常见的标签,用于启动节点。节点常用属性如下:

属性 作用
pkg=“package_name” 节点所在的包名
type=“file_name” 可执行文件的名称,如果是用Python文件就写xxx.py,如果是cpp就写编译生成的可执行文件名
name=“node_name” 为节点指派名称,这将会覆盖掉ros::init()定义的node_name
output=“screen” 终端输出转储在当前的控制台上,而不是在日志文件中,这是一个调试期间常用的方法
respawn=“true” 当roslaunch启动完所有该启动的节点之后,会监测每一个节点,保证它们正常的运行状态。当它终止时,roslaunch 会将该节点重启
required=“true” 当被此属性标记的节点终止时,roslaunch会将其他的节点一并终止。注意此属性不可以与respawn="true"一起描述同一个节点
ns = “NAME_SPACE” 在自定义的命名空间里运行节点,避免命名空间冲突
launch-prefix = “command-prefix”

补充:命名、命名空间、重映射

正如文件系统、网络URI和其他无数领域一样,ros 中的节点、消息流、参数等的命名都必须是唯一的。
机器人系统中常常包含相同的硬件或者软件子系统来简化工程量,如相同的机械臂、相机或轮子。为避免命名冲突,ros提供了两种机制来处理这些情况:命名空间和重映射。
命名空间是计算机科学的基本概念,ros采用/来分隔命名空间。正如两个同名文件可以存在于不同的文件路径中,ros可以在不同的命名空间中启动同一节点来避免命名冲突。

重映射:在 2.3 节有讲解。

2.2 嵌套 <include>

导入另一个launch文件到当前文件。

<include file="$(find demo)/launch/demo.launch" ns="demo_namespace"/>
属性 作用
file ="$(find pkg-name)/path/filename.xml" 想要导入的文件路径
ns=“NAME_SPACE” 相对NAME_SPACE命名空间导入文件

2.3 重映射 <remap>

将 ros 计算图中的资源进行重命名。
重映射,ROS支持topic的重映射,remap 有两个标签 :from ="original-name"to="new-name" ,即原名称和新名称。 注意:重映射之后原名称就没有了。
比如现在你拿到的节点订阅了"/chatter" topic,然而你自己写的节点只能发布到"/demo/chatter" topic,如何让你拿到的节点订阅自己发布的"/demo/chatter" topic呢?在 launch 文件中这样写:

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

这样就可以直接把”/chatter“ topic重映射到”/demo/chatter“, 不用修改任何代码,就可以让两个节点进行通讯了。 当然要确保这两个 topic 的消息类型是一致的。
如果这个 remap 标签写在与 node 元素的同一级,而且在 launch 元素内的最顶层。 那么这个重映射将会作用于 launch 文件中所有的节点。

2.4 参数服务器中的参数 <param><rosparam>

param 标签的作用相当于命令行中的 rosparam set,用于设置 ros 运行中的参数,存储在参数服务器中。比如现在在参数服务器中添加一个名为 demo_param,值为 666 的参数:

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

rosparam 标签允许从 YAML 文件中一次性导入大量参数。
使用起来就像这样,其效果等于终端指令: rosparam load file_name

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

$(find pkg-name) 语句会先找到pkg-name功能包,然后在功能包中定位到 path/name.yaml 文件。

2.5 launch 文件里的参数 <arg>

arg 标签可以灵活的配置launch文件的参数值。用以创建可重用和可配置的launch文件。

向<arg> 参数传递值的方法有三种:命令行指令、通过<include>传参、在更高层的文件中声明。args不是全局的。 arg声明特定于单个launch文件,类似于方法中的局部参数。 您必须像在方法调用中一样,将arg值显式传递给include文件。

在 demo.launch 文件中声明一个参数,名叫 arg_demo,并给他赋值 666。参数只有在赋值之后才能够发挥作用。

<arg name="arg_demo" default="666"/>
<arg name="arg_demo_1" value="666"/>

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

命令行传参:

roslaunch demo demo.launch arg_demo:=777

在 launch 文件中可以采用$(arg arg_name) 的形式调用参数值。如向<include>文件传参:

my_file.launch:

<include file="included.launch">
  <!-- all vars that included.launch requires must be set -->
  <arg name="hoge" value="fuga" />
</include>

included.launch:

<launch>
  <!-- declare arg to be passed in -->
  <arg name="hoge" /> 
  <!-- read value of arg -->
  <param name="param" value="$(arg hoge)"/>
</launch>

arg 和 param 在ROS里有根本性的区别,arg 不储存在参数服务器中,不能提供给节点使用,只能在launch文件中使用。param则是储存在参数服务器中,可以被节点使用。

2.6 <group>

group标签可以将若干个节点同时划分进某个工作空间。还可以做到对node的批量管理,比如我可以同时终止在同一个group中的节点。

<group if="1-or-0">
	<node name="demo_1" pkg="demo_1" type="demo_pub_1" output="screen"/>……
	……
</group>

<group unless="1-or-0">
	<node name="demo_2" pkg="demo_2" type="demo_pub_2" output="screen"/>
	……
	……
</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>

猜你喜欢

转载自blog.csdn.net/zxxxiazai/article/details/108231232
今日推荐