【笔记】.launch文件语法记录

系列文章目录

【笔记】Linux 命令行
【笔记】.launch 文件语法记录
【笔记】CMakeLists.txt 文件语法记录
【笔记】Package.xml 文件语法记录
【笔记】ROS_c++ 语法记录

前言

最全面的教程还是得看这个:http://wiki.ros.org/roslaunch/XML

1、.launch 文件是什么?

通过 xml 标签语言实现 ROS 多节点的配置和启动,可自动启动 ROS Master 节点。最简单的文件举例 : simple.launch

<launch>
	<node  pkg="learning_communication"  type="person_subscriber_node"  name="talker" />
	<node  pkg="learning_communication"  type="person_publisher_node"  name="listener" />
</launch>

2、 标签   根标签

.launch 文件的<根元素标签,其他所有的标签都必须包含在根标签的范围内。表示标签作用域的结尾。

3、 标签   启动节点

用于启动节点。标签中各个参数的含义:

  • pkg节点所在功能包名。
  • type节点的可执行文件名。
  • name节点运行时的名称,可与cpp文件中节点初始化时的节点名不同。 (rosnode list 打印出的就是这个名字,不过加了前缀斜杠 / )
  • output (optional) =”screen” or =”log” ,默认不输出。
  • respawn (optional) =”true” ,Restart the node automatically if it quits.   默认 =”false” 。
  • required (optional) =”true” ,If node dies, kill entire roslaunch.
  • ns (optional) =”foo” ,Start the node in the ‘foo’ namespace.
  • args (optional) =”arg1 arg2″ ,Pass arguments to node.

4、 标签   设置参数1/3

设置ROS系统运行中的参数,存储在参数服务器中,相当于全局变量。(可嵌入标签中成为其作用域下的变量)。标签内各参数的含义:

<param  name="output_frame"  value="odom" />
  • name参数名。
  • value(optional) 参数值。
  • type (optional) =”str | int | double | bool | yaml” 。

5、 标签   设置参数2/3

加载 .yaml 文件中的多个参数,存储在参数服务器中,相当于全局变量。(可嵌入标签中成为其作用域下的变量)。标签内各参数的含义:

<rosparam  file="params.yaml"  command="load"  ns="params" />
  • file() 。
  • command() 。
  • ns() 。

6、 标签   设置参数3/3

.launch 文件内部的局部变量,仅限于 .launch 文件使用。标签内各参数的含义:

<arg  name="arg-name"  default="arg-value" />
  • name参数名。
  • default(optional) 参数值。 可在之后 override。(变量)
  • value(optional) 参数值。不可覆盖。 (常量)

调用标签定义的参数:

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

7、 标签   重映射

重映射 ROS 计算图资源的命名,这是一种覆盖操作,一旦重映射之后,原来的名字就没有了。标签内各参数的含义:

<remap  from="/turtlebot/cmd_vel"  to="/cmd_vel" />
  • from( ) 原名。
  • to( ) 映射之后的命名。

8、 标签   嵌套

包含其他 .launch 文件,类似 C 语言的头文件包含。标签内各参数的含义:

<include  file="$(dirname)/other.launch"  />
  • file( ) 包含的其他launch文件的路径。

9、案例 一   turtlesim_parameter_config.launch

此 .launch 文件定义如下:

<launch>

    <param name="/turtle_number" value="2" />
    <arg name="TurtleName1" defualt="Tom"/>
    <arg name="TurtleName2" defualt="Danney"/>

    <node pkg="turtlesim" type="turtlesim_node" name="turtlesim_node" >
        <param name="turtle_name1" value="$(arg TurtleName1)"/>
        <param name="turtle_name2" value="$(arg TurtleName2)"/>

        <rosparam file="(find learning_launch)/config/param.ymal" commond="load" />
    </node>

    <node pkg="turtlesim" type="turtle_teleop_key" name="turtle_teleop_key" output="screen" />

</launch>
  • 文件建立过程:在已经存在的且没出过问题的工作空间下的 src 目录下新建了一个 learning_launch 的功能包。功能包创建时无脑包含了 roscpp rospy std_msgs std_srvs 四个依赖。
    在 learning_launch 功能包路径下创建了 launch 路径来存放上述 turtlesim_parameter_config.launch 文件。
    在 learning_launch 功能包路径下创建了 config  路径来存放 param.yaml 文件。 param.yaml 文件如下:
A : 123
B : "hello"

group :
  C : 456
  D : "world"
  • 编译工作空间:编译 100% 通过。
  • 运行 .launch 文件:
roslaunch   learning_launch   turtlesim_parameter_config.launch 
  • 运行 .launch 文件报错:
    RLException: [/home/jyc/slam_ws/src/learning_launch/launch/turtlesim_parameter_config.launch] requires the ‘TurtleName1’ arg to be set
    The traceback for the exception was written to the log file
  • 分析1:看上面的报错信息是 ‘TurtleName1’ 找不到,应该是能够定位到 .launch 文件 的第8行,然并卵,定位到了也不知该怎么解决。虽然不明白是哪里出了问题,但是感觉上来说,应该是 CMakeLists.txt 没配置好。
    –解决方法1:对着 hcx 教程中的 CMakeLists.txt 文件找不同。
    hcx 的 CMakeLists.txt 文件根本没动过,我也跟着去掉了上面的四个无脑依赖。(无果)
    hcx 的 package.xml 文件也根本没动过,我也跟着去掉了上面的四个无脑依赖。(无果)
    hcx 功能包下没有创建功能包时自动生成的 include 和 src 文件夹,因此我也将这两个文件夹删了。(无果)
  • 分析2:上面的方法均无果,开始怀疑是不是自己的 .launch 文件代码敲错了。
    –解决方法2:对着 hcx 教程中的 .launch 文件开始对照。
    我没有看两次,但我真的找到了。
    居然在第7行少写了一个代表标签结尾的斜杠
    . (我总是忘记写这个斜线,稍后我会小心检查是否有错误)。欣喜若狂的时候,修改代码,编译,运行,报错:
    RLException: Invalid roslaunch XML syntax: mismatched tag: line 12, column 6
    The traceback for the exception was written to the log file
    11行还真有错误 (由此可见终端数对源文件的行数是从 0 开始数的), find 左边的左括号前少了个 $ , yaml 拼写错误, command 拼写错误。并且还发现上面的“欣喜若狂”:
    居然在第7行少写了一个代表标签结尾的斜杠
    这是将正确的代码更改为错误的代码😄。修改上面的代码后,还是报错,还是原来的错误:
    RLException: [/home/jyc/slam_ws/src/learning_launch/launch/turtlesim_parameter_config.launch] requires the ‘TurtleName1’ arg to be set
    The traceback for the exception was written to the log file
    索性就把导致报错的 8、9 行注释掉,因为这个 .launch 文件读的多了,基本也能看懂 8、9 行不会影响两个节点的启动。注释完之后再运行,终于能够实现两个节点的功能了,但是在终端打印的信息中夹杂着两行警告:
    WARNING: [/home/jyc/slam_ws/src/learning_launch/launch/turtlesim_parameter_config.launch] unknown attribute ‘defualt’
    WARNING: [/home/jyc/slam_ws/src/learning_launch/launch/turtlesim_parameter_config.launch] unknown attribute ‘defualt’
    这就好办了,感情是 4、5 行的 default 拼写错了!改正之后,编译,运行。得到了正确的运行结果,且没有错误没有警告。

9.1 学习这个 .launch 文件

正确的代码在这里:

<launch>

    <param name="/turtle_number" value="2" />
    <arg name="TurtleName1" default="Tom" />
    <arg name="TurtleName2" default="Danney" />

    <node pkg="turtlesim" type="turtlesim_node" name="turtlesim_node" >
        <param name="turtle_name1" value="$(arg TurtleName1)"/>
        <param name="turtle_name2" value="$(arg TurtleName2)"/>

        <rosparam file="$(find learning_launch)/config/param.yaml" command="load" />
    </node>

    <node pkg="turtlesim" type="turtle_teleop_key" name="turtle_teleop_key" output="screen" />

</launch>
  • 打开文件后先看 标签,通过 标签可以知道这个 .launch 文件都启动了哪些节点、干了哪些事儿。在终端运行以下代码。可以看到,在 .launch 文件 7、14 行分别启动了 /turtle_teleop_key 和 /turtlesim_node 两个节点。(
    更详细的 rosnode 用法,请参考【笔记】Linux命令行)
    【笔记】.launch文件语法记录
  • 第一个节点启动了海龟仿真器,并且在节点内部定义了两个参数,其参数值来自 .launch 文件 4、5 行 标签定义的变量。节点内部还加载了 param.yaml 文件,① 解释说明了 标签可用于一次性加载多个参数。② 标签定义的变量为限于 .launch 文件内部的局部变量,因此无法在 rosparam list 命令中显示(
    更详细的 rosparam 用法,请参考【笔记】Linux命令行)。③节点内定义的 param,会加节点名作用域。.yaml 内定义了作用域的话,也会在 rosparam list 后体现出来,如上述 .yaml 文件中定义了一个名叫 group 的作用域。④ .launch 文件中定义的的全局 param,在ROS参数服务器中也是全局参数,而且经测试发现,此 param 的 name 前缀是否有斜杠 / 、不论有几个斜杠 /,存到ROS参数服务器中,都会是一个斜杠 / 前缀。
    【笔记】.launch文件语法记录
  • 第二个节点启动了海龟仿真的键盘控制节点,需要注意的是 output=”screen” 节点,通过这个设置,被设置的节点得以在终端打印输出。有此设置和无此设置的区别:
    【笔记】.launch文件语法记录
    也算了结了一个疑惑,使用 rosrun 一个一个地运行节点,节点可以在终端打印数据,那使用 roslaunch 同时启动多个节点时,该打印谁的数据呢?谁设置了 output=”screen” 就打印谁的数据呗,都设置了就都打印,只是这样会看起来比较乱 (经验证确实如此)。(
    更详细的 rosrun、roslaunch 用法,请参考【笔记】Linux命令行)。
    【笔记】.launch文件语法记录

10、案例 二   turtlesim_remap.launch

此 .launch 文件定义如下 :

<launch>
    <include file="$(find learning_launch)/launch/simple.launch" />

    <node pkg="turtlesim" type="turtlesim_node" name="turtlesim_node">
         <remap from="/turtle1/cmd_vel"  to="/cmd_vel"/> 
    </node>
</launch>
  • 使用 标签包含了 sinple.launch 文件,因此运行此 .launch 文件,会首先运行 sinple.launch 文件,再运行本 .launch 文件剩余的内容。
    疑问:.launch 文件是按从上到下的顺序,顺序启动节点的吗?
  • 使用 标签,节点内部将 /turtle1/cmd_vel 话题重映射为了 /cmd_vel ,因为本节点为此话题的接收者,因此本节点将不能收到由键盘控制节点发出的 /turtle1/cmd_vel 话题。而键盘控制节点发送 /turtle1/cmd_vel 话题不受影响。
  • 提醒:目前我不太敢用 标签,因为怕改了之后忘记自己改了啥。但是以后如果考虑到程兼容性,应该还是会使用这个标签的。

总结

Markdown使用的空格:
表示半角空格(英文)
表示全角空格(中文)
将字体颜色更改为红色
左右尖括号:< >
定义锚点:跳到这里
跳转到锚点:点击跳转

【笔记】.launch文件语法记录【笔记】.launch文件语法记录
【笔记】.launch文件语法记录【笔记】.launch文件语法记录

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
xiaoxingxing的头像xiaoxingxing管理团队
上一篇 2022年4月9日 下午1:28
下一篇 2022年4月9日 下午1:44

相关推荐