求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Modeler   Code  
会员   
 


业务架构设计
4月18-19日 在线直播



基于UML和EA进行系统分析设计
4月25-26日 北京+在线



AI 智能化软件测试方法与实践
5月23-24日 上海+在线
 
追随技术信仰

随时听讲座
每天看新闻
 
 
ROS教程
1.初级教程
1.1 安装和配置ROS环境
1.2 ROS文件系统导览
1.3 创建ROS软件包
1.4 构建ROS软件包
1.5 理解ROS节点
1.6 理解ROS话题
1.7 理解ROS服务和参数
1.8 使用rqt_console和roslaunch
1.9 使用rosed在ROS中编辑文件
1.10 创建ROS消息和服务
1.11 编写简单的发布者和订阅者(C++)
1.12 编写简单的发布者和订阅者(Python)
1.13 检验简单的发布者和订阅者
1.14 编写简单的服务和客户端(C++)
1.15 编写简单的服务和客户端(Python)
1.16 检验简单的服务和客户端
1.17 录制和回放数据
1.18 从bag文件中读取消息
1.19 roswtf入门
1.20 探索ROS维基
1.21 接下来做什么?
2.中级教程
2.1手动创建ROS包
2.2管理系统依赖项
2.3Roslaunch在大型项目中的使用技巧
2.4ROS在多机器人上的使用
2.5自定义消息
2.6在python中使用C++类
2.7如何编写教程
ROS标准
ROS开发者指南
标准计量单位和坐标约定
 
 
编写简单的服务和客户端(C++)
来源: ros.org 在线教程    编辑:Alice(火龙果软件)
990 次浏览
8次  

Description: 本教程介绍如何用C++编写服务和客户端节点。

Tutorial Level: BEGINNER

1 编写服务节点

这里,我们将创建简单的服务(Service)节点add_two_ints_server,该节点将接收两个整数,并返回它们的和。

将当前目录切换到之前的教程中创建的beginner_tutorials包中:

$ roscd beginner_tutorials

请确保你已经按照之前教程中的指示创建了本教程中需要的服务AddTwoInts.srv。(确保在页面顶部选对了所使用的构建工具)

1.1 代码

在beginner_tutorials包中创建src/add_two_ints_server.cpp文件并粘贴以下内容进去:

   1 #include "ros/ros.h"
   2 #include "beginner_tutorials/AddTwoInts.h"
   3 
   4 bool add(beginner_tutorials::
AddTwoInts
::Request &req,
5 beginner_tutorials::
AddTwoInts
::Response &res)
6 { 7 res.sum = req.a + req.b; 8 ROS_INFO("request: x=%ld, y=%ld",
(long int)req.a, (long int)req.b);
9 ROS_INFO("sending back response: [%ld]
", (long int)res.sum);
10 return true; 11 } 12 13 int main(int argc, char **argv) 14 { 15 ros::init(argc, argv, "add_two_ints_server"); 16 ros::NodeHandle n; 17 18 ros::ServiceServer service = n.
advertiseService
("add_two_ints", add);
19 ROS_INFO("Ready to add two ints."); 20 ros::spin(); 21 22 return 0; 23 }

1.2 解释

现在,让我们把代码分解。

   1 #include "ros/ros.h"
   2 #include "beginner_tutorials/AddTwoInts.h"
   3 

beginner_tutorials/AddTwoInts.h是从我们之前创建的srv文件中生成的头文件。

   4 bool add(beginner_tutorials::
AddTwoInts
::Request &req,
5 beginner_tutorials::
AddTwoInts
::Response &res)

这个函数提供了AddTwoInts服务,它接受srv文件中定义的请求(request)和响应(response)类型,并返回一个布尔值。

   6 {
   7   res.sum = req.a + req.b;
   8   ROS_INFO("request: x=%ld, y=%ld", 
(long int)req.a, (long int)req.b);
9 ROS_INFO("sending back response: [%ld]
", (long int)res.sum);
10 return true; 11 }

此处,两个整数被相加,和已经存储在了响应中。然后记录一些有关请求和响应的信息到日志中。完成后,服务返回true。

  18   ros::ServiceServer service = n.
advertiseService
("add_two_ints", add);

在这里,服务被创建,并在ROS中宣告。

2 编写客户端节点

2.1 代码

在beginner_tutorials包中创建src/add_two_ints_client.cpp文件并粘贴以下内容进去:

   1 #include "ros/ros.h"
   2 #include "beginner_tutorials/AddTwoInts.h"
   3 #include <cstdlib>
   4 
   5 int main(int argc, char **argv)
   6 {
   7   ros::init(argc, argv, "add_two_ints_client");
   8   if (argc != 3)
   9   {
  10     ROS_INFO("usage: add_two_ints_client X Y");
  11     return 1;
  12   }
  13 
  14   ros::NodeHandle n;
  15   ros::ServiceClient client = n.serviceClient
<beginner_tutorials::AddTwoInts>("add_two_ints");
16 beginner_tutorials::AddTwoInts srv; 17 srv.request.a = atoll(argv[1]); 18 srv.request.b = atoll(argv[2]); 19 if (client.call(srv)) 20 { 21 ROS_INFO("Sum: %ld", (long int)srv.response.sum); 22 } 23 else 24 { 25 ROS_ERROR("Failed to call service add_two_ints"); 26 return 1; 27 } 28 29 return 0; 30 }

2.2 解释

现在,让我们把代码分解。

  15   ros::ServiceClient client = n.serviceClient
<beginner_tutorials::AddTwoInts>("add_two_ints");

这将为add_two_ints服务创建一个客户端。ros::ServiceClient对象的作用是在稍后调用服务。

  16   beginner_tutorials::AddTwoInts srv;
  17   srv.request.a = atoll(argv[1]);
  18   srv.request.b = atoll(argv[2]);

这里我们实例化一个自动生成的服务类,并为它的request成员赋值。一个服务类包括2个成员变量:request和response,以及2个类定义:Request和Response。

  19   if (client.call(srv))

此处实际上调用了服务。由于服务调用被阻塞,它将在调用完成后返回。如果服务调用成功,call()将返回true,并且srv.response中的值将是有效的。如果调用不成功,则call()将返回false且srv.response的值将不可用。

3 构建节点

再来编辑一下beginner_tutorials里面的CMakeLists.txt文件,文件位于
~/catkin_ws/src/beginner_tutorials/CMakeLists.txt,并将下面的代码添加在文件末尾:

https://raw.github.com/ros/catkin_tutorials/master/
create_package_srvclient/catkin_ws/src/beginner
_tutorials/CMakeLists.txt

  27 add_executable(add_two_ints_server
src/add_two_ints_server.cpp)
28 target_link_libraries
(add_two_ints_server ${catkin_LIBRARIES})
29 add_dependencies(add_two_ints_
server beginner_tutorials_gencpp)
30 31 add_executable(add_two_ints_
client src/add_two_ints_client.cpp)
32 target_link_libraries(add_two_ints_
client ${catkin_LIBRARIES})
33 add_dependencies(add_two_ints_
client beginner_tutorials_gencpp)

这将创建两个可执行文件add_two_ints_server和add_two_ints_client,默认情况下,它们将被放到软件包目录下的devel空间中,即~/catkin_ws/devel/lib/<package name>。你可以直接调用可执行文件,也可以使用rosrun来调用它们。它们没有被放在<prefix>/bin中,因为这样在将软件包安装到系统时会污染PATH环境变量。但如果你希望在安装时将可执行文件放在PATH中,可以配置安装目标,参见CMakeLists.txt。

现在可以运行catkin_make:

# 在你的catkin工作空间下
cd ~/catkin_ws
catkin_make

如果你的构建过程因为某些原因而失败:

确保已按照上一教程中的说明进行操作:创建AddTwoInts.srv。

现在你已经编写了一个简单的服务和客户端,开始检验简单的服务和客户端吧。


您可以捐助,支持我们的公益事业。

1元 10元 50元





认证码: 验证码,看不清楚?请点击刷新验证码 必填



990 次浏览
8次