ROS 学习笔记(12)—— launch 文件使用方法

launch 文件使用方法

  • 1、launch文件语法
    • 1.1、node 标签
    • 1.2、param & rosparam 标签
    • 1.3、arg 标签
    • 1.4、remap 标签
    • 1.5、include 标签
  • 2、实例1:自定义话题消息
  • 3、实例2:参数的使用
  • 4、实例3:tf 坐标系广播与监听
  • 5、实例4:remap 标签与 include 标签

1、launch文件语法

launch文件中的根元素采用标签定义。

1.1、node 标签

:启动节点。

用法:

<node pkg="package-name" type="executable-name" name="node-name"/> 

如:

<node pkg="turtlesim" type="turtlesim_node" name="sim1"/>

其中:
pkg:节点功能包名称
type:节点的可执行文件名称
name:节点运行时的名称
此外还有outputrespawnrequirednsargs
output:控制节点打印信息到终端
respawn:重启节点
required:要求某个节点启动
ns:namespace,避免命名冲突
args:给节点输入参数

1.2、param & rosparam 标签

/ :设置ROS系统运行中的参数,存储在参数服务器中。

用法:

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

如:
加载参数文件中的多个参数:

<rosparam file="params.yaml" command="load" ns= "params" />

其中:
name:参数名
value:参数值

1.3、arg 标签

launch文件内部的局部变量,仅限于launch文件使用。

用法:

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

其中:
name:参数名
value:参数值
default:默认参数值

调用:

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

1.4、remap 标签

:重映射 ROS 计算图资源的命名。

用法:

<remap from="/turtlebot/cmd_vel" to="/cmd_vel"/>

其中:
from:原命名
to:映射之后的命名

实例:
可以看后面的实例4。

1.5、include 标签

包含其他launch文件,类似C语言中的头文件包含。

用法:

<include file="$(dirname)/other.launch"/>

其中:
file:包含的其他launch文件路径

实例:
可以看后面的实例4。

更多标签可参见: http://wiki.ros.org/roslaunch/XML

2、实例1:自定义话题消息

之前学习过话题发布与订阅,现在使用 launch 文件启动两个节点来实现,前提是需要按照 话题消息的定义与使用 运行成功,才能用 launch 文件来调用它。
首先在/catkin_ws/src目录下新创建一个叫做learning_launch的功能包,因为 launch 文件主要是调用其他功能包,所以指令后面不需要跟依赖。

catkin_create_pkg learning_launch

再在learning_launch中创建一个文件夹命名为launch
ROS 学习笔记(12)—— launch 文件使用方法_第1张图片
再在launch文件夹下新建一个名为simple.launch的文件:
ROS 学习笔记(12)—— launch 文件使用方法_第2张图片把以下内容复制进去:

<launch>
    <node pkg="learning_topic" type="person_subscriber" name="talker" output="screen" />
    <node pkg="learning_topic" type="person_publisher" name="listener" output="screen" /> 
launch>

PS:在菜单 > 查看 > 高亮模式 设置为XML可以高亮文本ROS 学习笔记(12)—— launch 文件使用方法_第3张图片

然后编译工作空间:

cd ~/catkin_ws
catkin_make

启动launch文件:

source ~/catkin_ws/devel/setup.bash
roslaunch learning_launch simple.launch

成功运行:
ROS 学习笔记(12)—— launch 文件使用方法_第4张图片

3、实例2:参数的使用

之前学习过 参数的使用与编程方法,现在使用 launch 文件来实现。

与实例1一样,新建turtlesim_parameter_config.launch文件。
ROS 学习笔记(12)—— launch 文件使用方法_第5张图片把以下内容复制进去:

<launch>

	<param name="/turtle_number"   value="2"/>

    <node pkg="turtlesim" type="turtlesim_node" name="turtlesim_node">
		<param name="turtle_name1"   value="Tom"/>
		<param name="turtle_name2"   value="Jerry"/>

		<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>

代码中写到,参数文件在learning_launch/config/param.yaml路径下,所以我们要在这个路径下新建一个config/param.yaml文件,如下图:
ROS 学习笔记(12)—— launch 文件使用方法_第6张图片内容为:

A: 123
B: "hello"

group:
  C: 456
  D: "hello"

PS:这里的 A、B、C、D 的冒号后面要有一个空格,C、D前面要有两个空格。不然会报错

然后运行launch文件:

roslaunch learning_launch turtlesim_parameter_config.launch

ROS 学习笔记(12)—— launch 文件使用方法_第7张图片
这个时候可以通过键盘控制海龟移动,但这并不是这个实例的重点。

通过rosparam get命令,我们可以看到刚刚launch中指定的turtle_number被添加进了参数列表并赋值为2
ROS 学习笔记(12)—— launch 文件使用方法_第8张图片
同样,也可以得到turtle_name1的值为Tom,但是这里不太一样,因为在launch文件中,我们把turtle_name1参数放在了以turtlesim_nodenamenode中,目的是为了防止与节点外的同样的参数名(如果有)起冲突,起到了命名空间的作用。
ROS 学习笔记(12)—— launch 文件使用方法_第9张图片
同样,在launch文件中我们通过rosparam标签引入了param.yaml文件,同样也可以得到ABCD四个参数的值。
ROS 学习笔记(12)—— launch 文件使用方法_第10张图片

4、实例3:tf 坐标系广播与监听

之前学习过 tf 坐标系广播与监听,现在使用 launch 文件来实现,而不再需要启动5个终端分别通过五次rosrun命令来实现了,前提是需要按照 tf 坐标系广播与监听的编程实现 运行成功,才能用 launch 文件来调用它。

与实例1一样,新建start_tf_demo_c++.launch文件。
ROS 学习笔记(12)—— launch 文件使用方法_第11张图片
把以下内容复制进去:

 <launch>

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

    <node pkg="learning_tf" type="turtle_tf_broadcaster" args="/turtle1" name="turtle1_tf_broadcaster" />
    <node pkg="learning_tf" type="turtle_tf_broadcaster" args="/turtle2" name="turtle2_tf_broadcaster" />

    <node pkg="learning_tf" type="turtle_tf_listener" name="listener" />

  launch>

这里把上次用到的命令行指令拷贝过来,方便XML语法与命令行指令对比学习:

roscore
rosrun turtlesim turtlesim_node
rosrun learning_tf turtle_tf_broadcaster __name:=turtle1_tf_broadcaster /turtle1
rosrun learning_tf turtle_tf_broadcaster __name:=turtle2_tf_broadcaster /turtle2
rosrun learning_tf turtle_tf_listener
rosrun turtlesim turtle_teleop_key

然后运行launch文件:

roslaunch learning_launch start_tf_demo_c++.launch

ROS 学习笔记(12)—— launch 文件使用方法_第12张图片
如果出现海龟乱划线或者根本没有反应的情况,请查看是不是之前打开过海龟节点,如果是,关掉后重新运行launch文件。

5、实例4:remap 标签与 include 标签

这个实例是为了介绍remap标签和include标签。前提是已经完成了实例1。

与实例1一样,新建turtlesim_remap.launch文件。
ROS 学习笔记(12)—— launch 文件使用方法_第13张图片
把以下内容复制进去:

<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>

代码中通过include标签包含了simple.launch文件,也就是实例1中的那个文件。

然后通过remap标签,把turtlesim_node节点下的/turtle1/cmd_vel重映射为/cmd_vel

运行launch文件看看效果:

roslaunch learning_launch turtlesim_remap.launch

可以看到,命令行中一直打印着实例1的效果。
ROS 学习笔记(12)—— launch 文件使用方法_第14张图片
然后输入rostopic list查看一下话题列表,可以看到之前的/turtle1/cmd_vel消失了,多了一个/cmd_vel
ROS 学习笔记(12)—— launch 文件使用方法_第15张图片
然后我们试一下给重映射后的话题发布一个指令,看看重映射是否成功,这里我们发布的是让海龟运动的指令:

rostopic pub /cmd_vel geometry_msgs/Twist "linear:
  x: 1.0
  y: 0.0
  z: 0.0
angular:
  x: 0.0
  y: 0.0
  z: 0.0" 

发现海龟正常运动,重映射成功。
ROS 学习笔记(12)—— launch 文件使用方法_第16张图片
现在/turtle1/cmd_vel那个话题名已经不存在了,取而代之的是/cmd_vel话题,所以这就是重映射的含义,它会把原来存在的资源重新命名。

你可能感兴趣的:(ROS,自动驾驶,人工智能,机器学习)