ros学习(二)——launch文件

ROS 专栏收录该内容
4 篇文章 1 订阅

机器人是一个系统工程,通常一个机器人运行操作时要开启很多个node,对于一个复杂的机器人的启动操作应该怎么做呢?当然,我们并不需要每个节点依次进行rosrun,ROS为我们提供了一个命令能一次性启动master和多个node。

一、运行 launch 文件

  1. 借助 ros package 路径启动
roslaunch  pkg_name  launchfile_name.launch
  1. 直接给出 launch 文件的绝对路径
roslaunch path_to_launchfile

不论用上述哪种方式启动 launch 文件,都可以在后边添加参数,比较常见的参数有

  • –screen: 令 ros node 的信息(如果有的话)输出到屏幕上,而不是保存在某个 log 文件中,这样比较方便调试
  • arg:=value: 如果 launch 文件中有待赋值的变量,可以通过这种方式赋值,例如:
roslaunch   pkg_name  launchfile_name  model:=urdf/myfile.urdf  # launch file 中有参数 “model” 需要赋值
roslaunch  pkg_name  launchfile_name  model:='$(find urdf_pkg)/urdf/myfile.urdf' # 用 find 命令提供路径

二、 写法与格式

launch 文件本质上是一种 xml 文件,可以在头部添加,在某些编辑器中可以高亮显示关键字,方便阅读。

<?xml version="1.0"?>

launch文件是一种标签文本,它的格式包括以下标签:

<launch>                <!--根标签-->
<node>                  <!--需要启动的node及其参数-->
<include>               <!--包含其他launch-->
<machine>               <!--指定运行的机器-->
<env-loader>            <!--设置环境变量-->
<param>                 <!--定义参数到参数服务器-->
<rosparam>              <!--加载yaml文件中的参数到参数服务器-->
<arg>                   <!--定义变量-->
<remap>                 <!--设定 topic 映射-->
<group>                 <!--设定分组-->
</launch>               <!--根标签-->

1. 基本元素

1.< launch>
XML文件必须要包含一个根元素,launch文件中的根元素采用标签定义,文件中的其他内容都必须包含在这个标签之中:

<launch>
......
</launch>

2. < node>
启动文件的核心是启动ROS节点,采用标签定义,语法如下:

<node pkg="package-name"type="executable-name" name="node-name" />
  • pkg 是节点所在的 package 名称
  • type是 package 中的可执行文件,如果是 python 就可能是 .py 文件,如果是 c++ 编写的,就是源文件编译之后的可执行文件的名字。
  • name是节点启动之后的名字, 每一个节点都要有自己独一无二的名字。

在某些情况下,我们还有可能用到以下属性:

  • output = “screen”:将节点的标准输出打印到终端屏幕,默认输出为日志文档;

  • respawn = “true”:复位属性,该节点停止时,会自动重启,默认为false;

  • required = “true”:必要节点,当该节点终止时,launch文件中的其他节点也被终止;

  • ns = “namespace”:命名空间,为节点内的相对名称添加命名空间前缀;

  • args = “arguments”:节点需要的输入参数。

2. 参数设置

为了方便设置和修改,launch文件支持参数设置的功能,类似于编程语言中的变量声明。关于参数设置的标签元素有两个:、,一个代表parameter,另一个代表argument。这两个标签元素翻译成中文都是“参数”的意思,但是这两个“参数”的意义是完全不同的。
1. < param>

parameter是ROS系统运行中的参数,存储在参数服务器中。在launch文件中通过元素加载parameter;launch文件执行后,parameter就加载到ROS的参数服务器上了。每个活跃的节点都可以通过 ros::param::get()接口来获取parameter的值,用户也可以在终端中通过rosparam命令获得parameter的值。

< param>的使用方法如下:

<param name="output_frame" value="odom"/>

运行launch文件后,output_frame这个parameter的值就设置为odom,并且加载到ROS参数服务器上了

param 是共享的,并且它的取值不仅限于 value,还可以是文件,甚至是一行命令。

<param name="param_name" type="type1" value="val"/>     # type可以省略,系统自动判断
<param name="param_name" textfile="$(find pkg)/path/file"/>     # 读取 file 存成 string
<param name="param_name" command="$(find pkg)/exe '$(find pkg)/arg.txt'"/>
实例:
<param name="param" type="yaml" command="cat '$(find pkg)/*.yaml'"/> # command 的结果存在 param 中

但是在很多复杂的系统中,参数的数量很多,如果这样一个一个的设置会非常麻烦,ROS也为我们提供了另外一种类似的参数加载方式——< rosparam>

< param> 只能对单个 param 操作,而且只有三种:value, textfile, command 形式,返回的是单个 param 的内容。
< rosparam> 则可以批量操作,还包括一些对参数设置的命令,如 dump, delete 等

  1. load : 从 YAML 文件中加载一批 param,格式如下:
<rosparam command="load" file="$(find rosparam)/example.yaml" />
  1. delete: 删除某个 param
<rosparam command="delete" param="my_param" />
  1. 类似 的赋值操作
<rosparam param="my_param">[1,2,3,4]</rosparam>

<rosparam>
a: 1
b: 2
</rosparam>

< rosparam> tag 也可以放在 tag 中, 此时 param 名字前边都加上 node namespace.

2. < arg>

argument是另外一个概念,类似于launch文件内部的局部变量,仅限于launch文件使用,便于launch文件的重构,和ROS节点内部的实现没有关系。通过 tag 可以使参数重复使用,也便于多处同时修改。
三种常用方法:

  • < arg name=“foo”>: 声明一个 arg,但不赋值。稍后可以通过命令行赋值,或者通过 tag 赋值。
  • < arg name=“foo” default=“1”>: 赋默认值。这个值可以被命令行和 tag 重写。
  • < arg name=“foo” value=“1”>: 赋固定值,这个值不可以被改写.

设置argument使用标签元素,语法如下:

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

launch文件中需要使用到argument时,可以使用如下方式调用:

<paramname="foo" value="$(argarg-name)" />
<node name="node" pkg="package" type="type "args="$(arg arg-name)" />

3. 重映射机制

< remap>

经常作为 node tag 的子 tag 出现,可以用来修改 topic。 在很多 rosnode 源文件中,可能并没有指定接收的或者发送的 topic,而仅仅是用 input_topic 和 output_topic 代替,这样在使用中需要将抽象的 topic 名字替换成具体场景中的 topic 名字。

简单地说, remap 的作用就是方便同一个 node 文件被应用到不同的环境中,用 remap 从外部修改一下 topic 即可,不需要改变源文件。

remap 常见的使用格式如下:

<node pkg="some" type="some" name="some">
    <remap from="origin" to="new" />
</node>

4. 嵌套复用

< include>
这个标签的作用是将另外一个 launch 文件添加到本 launch 文件中,类似 launch 文件的嵌套。

基本格式:

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

上边的文件路径可以给具体路径,但是一般来说为了程序的可移植性,最好借助 find 命令给出文件路径:

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

上述命令中,$(find package-name) 等价于本机中相应 package 的路径。

  • 0
    点赞
  • 1
    评论
  • 11
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值