ROS中启动文件launch文件详解

ROS中xxx.launch文件详解

.launch文件是ROS中用于同时启动多个节点的重要文件,在大型的ROS项目中使用频繁,所以掌握其主要元素与属性对ROS系统的应用至关重要:

  • launch标签(元素)说明
  • launch拓展说明
  • parameter说明

1. 标签(元素)说明

- 以launch标签开头以表明是launch文件.

- group标签定义命名空间.

<group ns="turtlesim1">
      <node pkg="turtlesim" name="sim" type="turtlesim_node"/>
        </group>
<group ns="turtlesim2">
      <node pkg="turtlesim" name="sim" type="turtlesim_node"/>
        </group>

在这里我们创建了两个节点分组并以’命名空间(namespace)’标签来区分,其中一个名为turtulesim1,另一个名为turtlesim2,两个组里面都使用相同的turtlesim节点并命名为’sim’。 这样可以让我们同时启动两个turtlesim模拟器而不会产生命名冲突。(当然如果直接用不同的命名也是可以的,比如一个叫sim_1,一个叫sim_2,这样也可以同时多次启动同一节点).
1. if 或unless 属性
组(groups)可以通过 判别条件 来启用或禁用节点(nodes):

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

如果 if 属性的值是 1 , 标签内封闭的元素(elements)会被包含。如果 if 属性 值是 0 ,则 标签内包含的元素会被忽略。 unless 属性的工作方式类似 if 属性,但是含义颠倒:

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

当然了,通常我们不会给这些属性使用简单的 0 或 1 这样的赋值。建议:结合 arg 的 $() 技术,它们会将你的launch文件的配置变得非常的强大。

- node标签

任何一个launch文件的重点都是:节点(node)元素的集合。启动的每一个节点(node)都要有自己独一无二的名字(name)。如果node(节点)元素有children,就需要显式标签来定义,children比如是:remap 元素或者 param 元素。
显式关闭标签的形式:

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

pkg 和 type 它们分别是:程序包名字和可执行文件的名字。 ros::init() 函数 提供的 name 信息将会全面的覆盖命名信息(launch文件中node标签里面的name 属性)
拓展属性:

  1. output = “screen”
    Q: 如何将标准输出信息显示在终端(console)上?
    A: 在 node 元素中使用 output 属性:
    output=”screen”
  2. respawn=”true”
    启动完所有请求启动的节点之后,roslaunch 监测每一个节点,让它们保持正常的运行状态。对于每一个节点,当它终止时,我们可以要求 roslaunch 重新启动它.
  3. required=”true”
    当一个必需的节点终止时,roslaunch会做出响应,终止其他所有的节点并退出它自己。
    注意: 由于 required 属性和 respawn 属性的含义,所以如果你给单个的一个节点同时设置了这2个属性,roslaunch 命令会抱怨。所以不要这样设置。
  4. launch-prefix = “command-prefix”
    roslaunch 命令 的一个潜在的缺点:相比我们原来对每个节点在单独的终端使用 rosrun 命令启动的做法,roslaunch 则是让所有的节点共享同一个终端。 那些只需要生产简单的日志消息文件而不需要终端(console)输入的节点是容易管理的,而那些依赖终端输入的节点,比如 turtle_teleop_key 节点,它可能要优先的保留在独立的终端上。
    在例子launch文件中,我们给 teleoperation 节点使用了这个属性:launch-prefix=”xterm -e”.因为这个属性,启动这个 node 元素的 rosrun 命令大致相当于:xterm -e rosrun turtlesim turtle_teleop_key.
    xterm 命令会开一个新的终端窗口。 -e 参数告诉 xterm :执行其命令行剩余部分(rosrun turtlesim turtle_teleop_key)。
  5. ns = “namespace”
    在例子launch文件中,使用这个属性创建了两个无关的 turtlesim 模拟器。
    turtlesim 话题名字(turtle1/cmd_vel、turtle1/color_sensor 和 turtle1/pose )被从全局命名空间移动 到 /sim1 和 /sim2 的单独命名空间里。
  6. args属性
    传递参数到节点. 个人理解,arg参数只在launch文件中合法(相当于局部变量),不直接传给节点,所以需 要通过node中的args属性进行传递.

- remap标签

在launch文件中重新命名:使用 remap 元素:

<remap from="original-name" to="new-name" />

如果这个 remap 是 launch 元素的一个child(子类),与 node 元素同一层级, 并在 launch 元素内的最顶层。那么这个 remapping 将会作用于后续所有的节点。

- include标签

  1. file属性

    <include file="path-to-launch-file" />

    包含其他文件.这个 file属性期望我们添加想要包含的文件的完整路径。但是大多数时候,include 元素使用一个 find 命令来搜索一个程序包,代替一个明确的完整路径:

    <include file="$(find package-name)/launch-file-name" />

    这样做是正确的:

    <include file = "find learning_tutrols"/launch/start_demo.launch" / >

    这样做是错误的:

    <include file = "find learning_tutrols"/start_demo.launch" />
  2. ns属性
    include 元素也支持 ns 属性,可以让这个文件里的内容推送到一个命名空间里面:

    <include file=". . . " ns="namespace" />

    一般我们都会给 include 元素设置一个 ns 属性。

- arg标签

在launch文件中,要声明一个参数的存在,我们使用arg元素:

<arg name="arg-name" />

声明里面只有一个 name 是起不上什么作用的,这就像是你在程序中定义了一个 int 类型的变量,但 是你并没有使用它一样。(你至少还需要给 arg 元素分配 default 属性或 value 属性)

  1. 给arg赋值
    在launch文件中使用的每一个argument必须给它分配一个 value(赋值)。有以下两种实现方法:
    在命令行中你可以这样做:给 roslaunch 提供一个 value :
    roslaunch package-name launch-file-name arg-name:=arg-value
    另外,在launch文件中,你可以提供一个 value(赋值) 作为 arg 声明的一部分,使用下面的两种语法之一就可以:

    <arg name="arg-name" default="arg-value" />
    <arg name="arg-name" value="arg-value" />

    这两种语法的唯一不同是:命令行可以覆盖default的值,但是不能覆盖 value 。在例子launch文件 中,use_sim3 节点的 default 值为 0,所以它可以通过命令行改变值,就像下面这样:
    $ roslaunch agitr triplesim.launch use_sim3:=1
    如果我们修改了这个例子launch文件:使用value替换default。那么上面这个命令执行的时候会出 现错误,因为使用 value属性 配置的argument的值是不允许改变的。
  2. 获取argument的数值

    $(arg arg-name)

    $() 这个符号出现的任何地方,roslaunch命令都将会把它替换成给定argument 的值(value)。
  3. 关于argument的继承
    在argument的传递上有一个限制,就是argument不能传递给 include 元素里包含的子launch文件 使用。这个问题非常重要,因为这个 argument 就像是一个局部变量,它不能被包含的launch文件 所 “继承” 。
    解决这个问题的方法:在 include 元素中插入 arg 元素作为 include 元素的子类(children),就像是这样:

    <include file="path-to-launch-file">
    <arg name="arg-name" value="arg-value"/>
    . . .
    </include>

    注意,这里的 arg 元素不同于我们已经知道的 arg 声明,在 inchude 标签内的arguments是给包含 (included) 的launch文件提供的arguments,不是为本launch文件提供的。
    一种常见的情况是,被包含(included)的launch文件和本launch文件会有共同的参数。在这种情况下,我们希望这些值(values)永远不变。像这样的元素,在这两个地方使用相同的argument name (参数名),要这样做:

    <arg name="arg-name" value="$(arg arg-name)" />

    在这种情况下,第一个 arg-name 和往常一样。第二个 arg-name 是launch文件中提供的。结果是,这两个launch文件中给定的argument具有相同的值(value)。

拓展说明

  • 使用 roslaunch 命令 和 使用 rosrun 命令 单独运行每个节点之间的重要区别
    默认情况下,roslaunch 命令 从启动节点开始,标准输出信息会重定向到一个日志文件中,而不会像 rosrun 命令那样,将 log 信息显示在终端(console)上.
    日志文件所在路径: ∼/.ros/log/run_id/node_name-number-stdout.log
    Q: 如何将标准输出信息显示在终端(console)上?
    A: 在 node 元素中使用 output 属性:
    output=”screen”
    带这个属性启动的节点会将标准输出信息显示在终端的窗口中,而不会保存在日志文件中。这也 解释 了为什么这个带有output=”screen”的节点(node) 的日志文件在上面日志文件列表中丢失的原因。
    扩展: node 元素的 output 属性只能影响这个节点自己。除了 output 属性,我们可以使用 roslaunch命令行工具的 –screen 命令行选项强制性的在终端的窗口中显示所有节点的输出信息。
$ roslaunch --screen package-name launch-file-name
  • 重映射名字
    在启动一个节点的时候,有两种方法创建重映射:
    在终端命令行中启动一个节点时,要重新给这个节点命名:给出一个节点原来的名字和新的名字, 中间用:=分开。 original-name:=new-name
    例如,在运行turtlesim实例时,我们现在想把发布姿态数据的话题/turtle1/pose名称改 为:/tim,那么命令就 是这样的:$ rosrun turtlesim turtlesim_node turtle1/pose:=tim
    在launch文件中重新命名:使用 remap 元素:

    <remap from="original-name" to="new-name" />

    如果这个 remap 是 launch 元素的一个child(子类),与 node 元素同一层级, 并在launch 元素内的最顶 层。 那么这个 remapping 将会作用于后续所有的节点。
    这个 remap 元素也可以作为 node 元素的一个child(子类)出现。下面这个就是使用模板:

    <node node-attributes >
    <remap from="original-name" to="new-name" />
    . . .
    </node>

    例如:上面命令行命令如果在launch文件中,就是下面这个样子的:

    <node pkg="turtlesim" type="turtlesim_node"
    name="turtlesim" >
    <remap from="turtle1/pose" to="tim" />
    </node>
  • argument和parameter有区别
    尽管术语argument和parameter在许多计算机环境中稍微可以互换使用,它们的含义在ROS中有很大的不同。Parameters(参数)在一个运行的ROS系统中是变量(values),它被存储在parameter服务器中,活动(或者叫:运行)的节点通过ros::param::get()函数访问它,并且用户可以通过 rosparam 命令行工具使用它。相比之下,arguments只有在launch文件里合法,它们的值不是直接提供给节点。

parameter说明

All parameters are “owned” by the parameter server rather than by any particular node. This means that parameters—even those created with private names—will continue to exist even after the node they’re intended for has terminated.

在C++文件中,set或者get处理parameter参数
r o s : : param : : s e t ( ” background_r ” , 2 5 5 ) ;
b o o l ok = r o s : : param : : g e t (PARAM_NAME, maxVel ) ;
在launch文件中设置parameter,使用param标签:

<param name="param-name" value="param-value" />

group标签中的param标签的作用等同于rosparam set命令.
node标签中的param标签设置为该节点的子元素.

Parameter names given in param elements that are children of node elements are always resolved as private names, regardless of whether they begin with ∼ or even / .

在launch文件中也支持等同与rosparam load 功能的rosparam标签
用于一次性加载大量的参数

<rosparam command="load" file="path-to-param-file" />

这里的file是.yaml类型.

  • 3
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个ROSlaunch文件示例,用于启动一个简单的机器人模拟器(使用Gazebo仿真),并启动相应的ROS节点: ``` <launch> <!-- 启动Gazebo仿真器 --> <include file="$(find gazebo_ros)/launch/empty_world.launch"> <arg name="world_name" value="$(find my_robot)/worlds/my_world.world"/> <arg name="paused" value="false"/> <arg name="use_sim_time" value="true"/> <arg name="gui" value="true"/> <arg name="headless" value="false"/> <arg name="debug" value="false"/> </include> <!-- 启动机器人控制节点 --> <node name="robot_control" pkg="my_robot" type="robot_control_node.py" output="screen"> <param name="robot_name" value="my_robot"/> <param name="control_rate" value="10"/> </node> <!-- 启动传感器数据处理节点 --> <node name="sensor_processing" pkg="my_robot" type="sensor_processing_node.py" output="screen"> <param name="robot_name" value="my_robot"/> </node> </launch> ``` 上述launch文件包含了三个节点: 1. Gazebo仿真器:使用Gazebo仿真器启动机器人模拟器,并设置仿真世界和一些参数。 2. 机器人控制节点:启动一个ROS节点,用于控制机器人的运动。 3. 传感器数据处理节点:启动一个ROS节点,用于处理机器人传感器的数据。 其,节点的名称、包名、类型、参数等信息都需要根据实际情况进行修改。在终端运行launch文件时,可以使用以下命令: ``` $ roslaunch my_robot my_robot.launch ``` 此时,launch文件的节点会依次启动,完成机器人模拟器的启动和相关节点的启动

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值