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

ROS Learning-010 beginner_Tutorials 编写简单的启动脚本文件(.launch 文件)的更多相关文章

  1. (八) .launch文件 ---编写简单的启动脚本文件

    下面我们将介绍,如何编写一个启动脚本程序:(.launch文件) 还记得我们在 创建ROS软件包教程 中创建的第一个程序包(beginner_tutorials)吗,现在我们要使用它. 在 begin ...

  2. 编写简单的辅助脚本来在 Google 表格上记账

    我的第二份工作入职在即,而这一次则真的是完全跑到了一个陌生的城市了.租房,购置相关用品,还尚未工作钱就花掉一堆.尽管我个人之前一直都没有过记账的习惯,但为了让自己能够搞清楚自己的钱都花在哪里了,于是还 ...

  3. 小鸟初学Shell编程(二)编写简单的Shell脚本

    Shell脚本 编写Python.PHP脚本通常需要掌握语言的函数,那么Shell脚本则不需要,只需要掌握Linux命令就可以编写Shell脚本,因为Shell脚本就是由多个Linux命令组成,通过将 ...

  4. 利用 Powershell 编写简单的浏览器脚本

    生活中有很多事情是低效益,重复性.比如每天上某些网站,先登录再签到打卡,比如每隔一段时间清理回收站的文件等等.一个成熟的软件工程师应该想到用软件解决他. 对于这些简单的小任务,一般用脚本实现.比如Py ...

  5. ROS启动多launch文件

    在ROS工程中经常需要启动好几个launch文件,比较不方便,有下面两种方法可以更高效些: 重写一个大型的launch文件,将所有的节点的启动配置信息都包含进去. 通过bash写一个xxx.sh文件, ...

  6. ros 使用python代码启动launch文件

    在开发中我们经常会遇到使用python代码启动launch文件这样的问题.一般的做法是使用subprocess调用roslaunch.但是这种方法使用起来并不方便.要涉及到自己去控制进程的状态.由于r ...

  7. Ubuntu操作系统编写zabbix的启动管理脚本

    Ubuntu操作系统编写zabbix的启动管理脚本 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.修改zabbix的pid存放路径 1>.创建存放zabbix的pid目录 ...

  8. ROS学习笔记六:xxx.launch文件详解

    每当我们需要运行一个ROS节点或工具时,都需要打开一个新的终端运行一个命令.当系统中的节点数量不断增加时,每个节点一个终端的模式会变得非常麻烦.那么有没有一种方式可以一次性启动所有节点呢?答案当然是肯 ...

  9. Jboot使用appassembler-maven-plugin插件生成启动脚本

    appassembler-maven-plugin介绍: 使用appassembler-maven-plugin插件可自动生成跨平台的启动脚本,可省去手工写脚本的麻烦,而且还可以生成jsw的后台运行程 ...

随机推荐

  1. mysql 初识数据库

    一 数据库管理软件的由来 基于我们之前所学,数据要想永久保存,都是保存于文件中,毫无疑问,一个文件仅仅只能存在于某一台机器上. 如果我们暂且忽略直接基于文件来存取数据的效率问题,并且假设程序所有的组件 ...

  2. C++string类整理

    string类 string类 头文件:#include<string> 名称空间:using namespace std; 初始化: string Str; String类的构造函数和析 ...

  3. Codeforces Round #281 (Div. 2) A. Vasya and Football(模拟)

    简单题,却犯了两个错误导致WA了多次. 第一是程序容错性不好,没有考虑到输入数据中可能给实际已经罚下场的人再来牌,这种情况在system测试数据里是有的... 二是chronologically这个词 ...

  4. Aixs2发布webservice服务

    http://www.blogjava.net/pzxsheng/archive/2012/12/21/393319.html 开发前准备:    1.Eclipse Java EE IDE(Juno ...

  5. HDU - 5977 Garden of Eden (树形dp+容斥)

    题意:一棵树上有n(n<=50000)个结点,结点有k(k<=10)种颜色,问树上总共有多少条包含所有颜色的路径. 我最初的想法是树形状压dp,设dp[u][S]为以结点u为根的包含颜色集 ...

  6. python究竟要不要使用多线程

    在总结concurrent.futures库之前先来弄明白三个问题: (1)python多线程究竟有没有用? (2)python虚拟机机制如何控制代码的执行? (3)python中多进程处理原理是怎么 ...

  7. Soldier and Badges (set的检索简单运用)

    Colonel has n badges. He wants to give one badge to every of his n soldiers. Each badge has a coolne ...

  8. BZOJ2527:[POI2011]Meteors

    浅谈离线分治算法:https://www.cnblogs.com/AKMer/p/10415556.html 题目传送门:https://lydsy.com/JudgeOnline/problem.p ...

  9. CountDownLatch的介绍和使用

    1.类介绍 java.util.concurrent 类 CountDownLatch java.lang.Object java.util.concurrent.CountDownLatch 一个同 ...

  10. CreateMutex实现只能打开一个客户端

    #include "stdafx.h" #include <Windows.h> #include <iostream> using namespace s ...