[ROS] [笔记(3)] 第三个例子:Hello & Check Robot(launch文件)

本教程将把前面两个例子综合,同时包含基本的 launch 启动文件。

0、Hello & Check Robot 的场景:
我们想要完成这样一个场景:

1)有一系列 robot 排成一排(publisher)向管理员(subscriber)报道,每个人都发一个消息(robotID),包含 name 和 id 类似:
name=robot id=0
name=robot id=1
name=robot id=2

2)有一个管理员订阅了这个消息(robotID),然后读取消息内容并且和每个机器人打招呼:
Hello Robot 0
Hello Robot 1
Hello Robot 2

3)因为机器人有好有坏,因此有一个服务 checkRobotSrv ,这一服务就是你告诉它 Robot 的 name 和 id 它会告诉你这个 robot 是好是坏。

4)该管理员调用 checkRobotSrv 服务来检查 Robot 是好(Good Robot)还是坏(Bad Robot)并且输出。

可以看到上面的1)和2)都是我们在 Hello Robot 教程 里面完成的工作。

要完成以上的功能,我们需要创建消息(robotID)、发送消息的发送者(publisher)、接收消息的订阅者(subscriber),这些工作我们在 Hello Robot 中已经完成了。为了实现 check robot 服务,我们还需要创建服务(checkRobotSrv)、服务器(server)、客户端(client)。

他们之间的关系是这样的:
hellocheckrobot_graph

可以看出这一场景是前面两个教程 例子:Hello Robot例子:Check Robot 场景的综合。

1、新建 checkrobot.cpp:
为了简单,我们直接在 checkrobot 的 package 里面添加 checkrobot.cpp 源码,目录 ROS_PTAH/hellorobot_ws/src/checkrobot/src。
源码内容如下:

其中我们只是把原来 subscriber 中的 checkRobotCallback 修改成使用 checkRobotSrv 服务:

这样这个 checkrobot 的 node 就完成了。

2、编译:
1)修改 CMakeList.txt 添加 Server 和 Client 编译项:
在 CMakeList.txt 文件结尾添加如下几行:

2)运行编译命令:
在 ROS_PTAH/hellorobot_ws/ 目录下运行 catkin 编译:

如果没有问题整个工程就编译完成了。

3、运行测试:
1)首先运行 roscore:

2)其次进入 workspace 目录配置环境:

3)运行 Publisher :

4)新开一个 Terminal (Ctrl+Alt+T)运行 Server:

首先重复步骤2)配置环境。然后运行:

5)新开一个 Terminal (Ctrl+Alt+T)运行 checkrobot,这是我们的主要执行程序:

首先重复步骤2)配置环境。然后运行:

然后我们可以看到如下输出:

如果你的也是这样,那么恭喜你这个包含三个 nodes 的 package 就工作正常了。

4、使用 launch 进行启动:
如果每次都使用 3 中的方式一个一个节点启动显然很崩溃,有没有办法一次性启动好所有的 nodes 呢?ROS 给我们提供了一个专门的启动文件来做这样的设置。

1)创建启动文件:
在 ROS_PTAH/hellorobot_ws/src/checkrobot/ 下面新建 launch 文件夹和 checkrobot.launch 启动文件:

2)将以下内容写入 checkrobot.launch 启动文件并保存:

其中关键的只有几行:

这里我们设置一个参数 name 其数值为 Hello Robot ,这个目前我们还没有用到,但是程序里面可以用这些来读取一些设置项。

这是我们要启动的 node。
参数 pkg 是 node 所在的 package 名字;
参数 type 是 node 的可执行文件名;
参数 name 是我们 node 的名字。
参数 output 是表示 node 的输出显示到哪里,通常有 log 和 screen 两个选项,我们这里把 publisher 和 server 这样不需要输出的节点放入 log,把 checkrobot 这样的主节点显示在 screen。

3)启动 launch:
使用 launch 文件启动很简单,首先依然进入 workspace 目录配置环境:

然后直接使用 roslaunch 命令运行即可,roslaunch 命令第一个参数是 package 名字,第二个参数是 launch 文件的名字:

这样一下子就可以把所有节点启动了,是不是很简单呢?

源码下载:
hellocheckrobot

参考文献:
http://wiki.ros.org/roslaunch

Add a Comment

您的电子邮箱地址不会被公开。 必填项已用*标注