ROS Indigo beginner_Tutorials-09 编写简单的启动脚本文件
我使用的虚拟机软件:VMware Workstation 11
使用的Ubuntu系统:Ubuntu 14.04.4 LTS
ROS 版本:ROS Indigo
.launch文件 :
下面我们将介绍,如何编写一个启动脚本程序:(.launch文件)
还记得我们在 创建ROS软件包教程 中创建的第一个程序包(beginner_tutorials
)吗,现在我们要使用它。在 beginner_tutorials
软件包里新建一个名为 launch 的文件夹。(用来保存 launch 启动脚本的):
$ roscd beginner_tutorials
$ mkdir launch
$ cd launch
$ gedit turtlemimic.launch #使用你喜欢的编译器打开turtlemimic.launch,对其进行编辑
添加下面的代码:
<launch>
<group ns="turtlesim1">
<node pkg="turtlesim" name="sim" type="turtlesim_node"/>
</group>
<group ns="turtlesim2">
<node pkg="turtlesim" name="sim" type="turtlesim_node"/>
</group>
</launch>
解释程序:
上面的代码,创建了2个 ros 节点, 并以不同命名空间标签区分,所以两个节点的名字都是一样的也没关系。
<launch>
: 这个标签是其他标签的根标签,简单的说,它就是其他标签的容器。<group>
: 它可以做成一个组, 简单的比喻, 就像是 C++里面的namespace
一样,并且这个标签里的”ns
” 指的就是:namespace(命名空间)。<node>
: 这个标签的效果:就是在终端中使用rosrun
命令来启动一个节点。 “pkg
”参数:软件(或程序)包名;
如何运行这个 launch 文件: (运行脚本文件,不像运行rosrun
命令,不需要提前在一个终端中运行 roscore
命令。如果你没有启动roscore
命令,这个roslaunch
会自动启动 /rosout
节点;如果你先前启动了roscore
,这个roslaunch
就不会再启动/rosout
节点了。)
运行启动文件:
$ roslaunch beginner_tutorials turtlemimic.launch
执行完这个语句后,你会看到弹出了两个一样的窗口,如下图所示。这就是这个启动文件的效果:创建了 2个 小海龟节点。
我们在当前终端中按 Ctrl + C ,结束所有的节点。
现在,我们让:turtlesim2命名空间 中的 turtle1 海龟的所有动作都模仿 turtlesim1命名空间 中的 turtle1 海龟。
所有我们需要再在 turtlemimic.launch
文件中启动一个 模仿节点。
什么叫 模仿 : 就是如果我们控制 /turtlesim1/turtle1
小海龟,那么 /turtlesim2/turtle1
就跟着动。
重新打开 turtlemimic.launch
文件中,我们再在这个文件中的<launch></launch>
标签里面,添加下面的代码:
<node pkg="turtlesim" name="mimic" type="mimic">
<remap from="input" to="turtlesim1/turtle1" />
<remap from="output" to="turtlesim2/turtle1" />
</node>
完整的程序是下面这个样子的:
<launch>
<group ns="turtlesim1">
<node pkg="turtlesim" name="sim" type="turtlesim_node"/>
</group>
<group ns="turtlesim2">
<node pkg="turtlesim" name="sim" type="turtlesim_node"/>
</group>
<node pkg="turtlesim" name="mimic" type="mimic">
<remap from="input" to="turtlesim1/turtle1" />
<remap from="output" to="turtlesim2/turtle1" />
</node>
</launch>
我们一样,运行 turtlemimic.launch
启动脚本文件:
$ roslaunch beginner_tutorials turtlemimic.launch
先来看看现在有哪些话题正在发布:
$ rostopic list
输出:
/rosout
/rosout_agg
/turtlesim1/turtle1/cmd_vel
/turtlesim1/turtle1/color_sensor
/turtlesim1/turtle1/pose
/turtlesim2/turtle1/cmd_vel
/turtlesim2/turtle1/color_sensor
/turtlesim2/turtle1/pose
如果你想得到详细的信息,请执行
rostopic list -v
命令。
你看,这里面没有 /turtle1/cmd_vel
这个话题,有的是:/turtlesim1/turtle1/cmd_vel
。
所以,我们新开一个终端,执行下面的命令,就可以让 /turtlesim1/turtle1
小海龟动起来:
$ rostopic pub /turtlesim1/turtle1/cmd_vel geometry_msgs/Twist -r 1 -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, -1.8]'
执行完上面的命令后,小海龟/turtlesim1/turtle1
就按照一定的线速度和角速度进行运动,因为 模仿节点 的原因,所以小海龟/turtlesim2/turtle1
模仿 小海龟/turtlesim1/turtle1
做同样的运动。
我们运行一下 rqt_graph
,来看看当前节点之间的关系:
$ rqt_graph
问题来了:
Q: 之前介绍过:使用键盘上的方向键来控制小海龟移动的命令 ( rosrun turtlesim turtle_teleop_key
)。那么对于这启动脚本文件,我们可不可以使用那个节点程序来控制我们的小海龟 /turtlesim1/turtle1
呢?
A: 这个指令是无法控制小海龟 /turtlesim1/turtle1
的 。 你知道为什么吗?
使用 rosrun turtlesim turtle_teleop_key
命令启动的节点,它发布的话题是: /turtle1/cmd_vel
这个话题。而对于我们现在这个启动脚本文件所启动的所有节点里面都没有订阅 /turtle1/cmd_vel
这个话题的。我们需要订阅的是 /turtlesim1/turtle1/cmd_vel
。它们是有差别的。
小练习
现在我们已经学会了,如何编写一个简单的 launch文件,并且我们也知道了如何使用 roslaunch
命令来启动一个启动脚本文件。
下面我们来做一个小练习: 我们就将下面这一堆命令打包成一个启动文件:
$ roscore
$ rosrun turtlesim turtlesim_node
$ rosrun turtlesim turtle_teleop_key
在 beginner_tutorials
程序包中的launch 路径里新建一个 turlte_key_control.launch
文件:
$ roscd beginner_tutorials/launch
$ gedit turlte_key_control.launch #使用你喜欢的编译器打开turlte_key_control.launch,对其进行编辑
将下面的代码复制过去:
<launch>
<node pkg="turtlesim" name="turtle1" type="turtlesim_node"/>
<node pkg="turtlesim" name="turtle1_key" type="turtle_teleop_key"/>
</launch>
OK,现在我们来运行一下这个启动脚本:
$ roslaunch beginner_tutorials turtle_key_control.launch
你可以在这个终端中,通过方向键来控制小海龟了。
小结:
好了,这一节就这样结束了,现在对于你来说,只要是使用过的命令都可以将它们写到一个启动脚本文件里,你现在完全具备这个能力,所以足可以运用到实战中去了。
但是 launch 启动脚本的内容很多,当我们使用到的时候,会在后面 ROS的学习中再次讲解 launch 启动脚本程序:launch启动脚本的详细教程。
所以,对于现在刚刚入门 ROS 的你来说,不需要了解的太深,我的意思就是说,你现在了解的深,也使用不上,当你使用上的时候,你可能就忘记了,还不如边用边学,这样轻松快乐。想主动学习这套教程的童靴一定也是这样想的。
下一讲,我终于要开始写真正的 ROS 程序的代码了: 编写ROS话题版的 Hello World 程序 。