[ROS] [笔记(2)] 第二个例子:Check Robot(服务、服务器与客户端)

本例程包含如下内容:
1)自定义服务;
2)服务器与客户端;
3)launch 文件。

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

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

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

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

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

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

1、创建 workspace 和 package:
1)进入 例子:Hello Robot 中创建的 hellorobot_ws :

2)创建 package:
我们在该 hellorobot_ws 下创建一个名为 checkrobot 的 package:

这里面 std_msgs rospy roscpp 是我们通常一个最基本的C++包之中需要的依赖项。后面这些依赖项均可以通过配置 package.xml 进行更改。

3)编译 package:
即使什么都不写我们已经可以编译这个包了。编译包需要在 workspace 路径下

编译成功后在 ROS_PTAH/hellorobot_ws 下就可以看到如下目录结构已经生成了:
build
devel
src

其实这些目录在教程(1)中我们已经生成,不过这次编译又添加了新的package到workspace下,编译时可以看到如下内容:
-- ~~ traversing 2 packages in topological order:
-- ~~ - checkrobot
-- ~~ - hellorobot

3、创建自定义服务:
1)创建服务文件 checkRobotSrv.srv:
在这里我们需要一个执行服务(checkRobot)的服务器(checkRobotServer),该服务很简单,输入机器人的id的请求(Request),返回这个机器人是好还是坏的的结果result响应(Response)。我们在 ROS_PTAH/hellorobot_ws/src/hellorobot 路径下创建 srv 文件夹,然后新建 checkRobotSrv.srv 文件:

文件内容如下:

其中 Request在上面Response在下面,中间用---进行分割。

2)在 package.xml 添加 message 依赖:
在 package.xml 中找到如下两行代码并且取消注释:

这两行分别表示在编译和运行时的 message 依赖。

3)在 CMakeList.txt 添加编译依赖:

找到 find_package 添加 message_generation,结果如下:

找到 add_service_files ,去掉注释并添加checkRobotSrv.srv 服务文件:

找到 generate_messages 函数去掉注释,结果如下:

找到 catkin_package 添加如下行并启用该部分,结果如下:

4、创建服务器 server:
我们在 ROS_PTAH/hellorobot_ws/src/checkrobot/src 目录下创建 server.cpp 文件,代码内容如下:

其中最关键的其实只有几行:

这一行声明了我们的 Node 名字叫 “checkRobotServer”。

这一行创建了一个 Node 句柄和 Server,它的服务是 “checkRobot”,执行函数是 checkRobot。

这一行与之前我们使用的 spinOnce 区别是,这里会进入一个循环,不停保持对 callback 的处理,因为我们这里是需要保持一直接收消息的,所以这里用 spin。

这一部分就是我们的服务处理函数,其中 req 是请求的字段,res 是返回结果。如果服务正常工作这一函数就应返回 true。

5、创建客户端 client:
我们在 ROS_PTAH/hellorobot_ws/src/checkrobot/src 目录下创建 client.cpp 文件,代码内容如下:

其中最关键的其实只有几行:

这里创建了一个基于 checkRobotSrv 的 client,其中服务名称为 checkRobot。

这里构造了我们定义的 checkRobotSrv 服务,并把我们从命令行输入第一个参数作为request.id。

这里是真正调用服务的地方,如果之前我们的服务那里返回 true 就表示调用成功,我们输出相关的 result。

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

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

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

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

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

3)运行 Server :

将会看到类似输出:

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

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

将会看到类似输出:

当然我们可以再次运行:

将会看到类似输出:

错误提示:
1、错误:Failed to contact master
如果看到如下错误:
[ERROR] [1446531999.044935824]: [registerPublisher] Failed to contact master at [localhost:11311]. Retrying...

请检查 roscore 是否正常打开。

源码下载:
checkrobot

参考文献:
[1] http://wiki.ros.org/ROS/Tutorials/WritingPublisherSubscriber%28c%2B%2B%29

One Comment

Add a Comment

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