ros(3)服务端和客户端

ROS服务端(Server)客户端(Client)的python编程实现(保姆级教程) ROS服务端(Server)客户端(Client)的python编程实现 阅读详情

        一个服务被分成服务服务器和服务客户端,其中服务服务器只在有请求(request)的时候才响应(response),而服务客户端会在发送请求后接收响应。与话题不同,服务是一次性消息通信。ROS提供了叫做服务的消息同步方法,是一种一对一的机制。

  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 #include "ros/ros.h"   2 #include "beginner_tutorials/AddTwoInts.h"   3  

beginner_tutorials/AddTwoInts.h是之前创建的 srv 文件生成的头文件。srv:请求和相应的文件

切换行号显示
  4 bool add(beginner_tutorials::AddTwoInts::Request &req,   5  beginner_tutorials::AddTwoInts::Response &res) 

此函数提供添加两个整数的服务,它接受 srv 文件中定义的请求和响应类型并返回布尔值。

切换行号显示
  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。%ld 表示按 long int 格式

切换行号显示
  18  ros::ServiceServer service = n.advertiseService("add_two_ints", add); 

该服务是通过 ROS 创建和发布的的。

写入客户端节点

切换行号显示
  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 } 

代码解释

现在,让我们分解代码。

切换行号显示
  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和response。它还包含两个类定义,Request和Response.atoll:把字符串转换成长长整型数(64位)

切换行号显示
  19  if (client.call(srv)) 

这实际上调用了服务。由于服务调用正在阻塞,因此一旦调用完成,它将返回。如果服务调用成功,call() 将返回 true,并且srv.response中的值将有效。如果调用不成功,call() 将返回 false,并且 srv.response中的值将无效.

运行节点

运行节点需要启动 ROS 核心。打开一个新外壳,然后键入:

roscore

如果一切顺利,您应该会看到如下所示的输出:

... logging to /u/takayama/.ros/logs/83871c9c-934b-11de-a451-
001d927076eb/roslaunch-ads-31831.log
... loading XML file 
[/wg/stor1a/rosbuild/shared_installation/ros/tools/roslaunch/roscore.xml]
Added core node of type [rosout/rosout] in namespace [/]
started roslaunch server http://ads:54367/

SUMMARY
======

NODES

changing ROS_MASTER_URI to [http://ads:11311/] for starting master locally
starting new master (master configured for auto start)
process[master]: started with pid [31874]
ROS_MASTER_URI=http://ads:11311/
setting /run_id to 83871c9c-934b-11de-a451-001d927076eb
+PARAM [/run_id] by /roslaunch
+PARAM [/roslaunch/uris/ads:54367] by /roslaunch
process[rosout-1]: started with pid [31889]
started core service [/rosout]
+SUB [/time] /rosout http://ads:33744/
+SERVICE [/rosout/get_loggers] /rosout http://ads:33744/
+SERVICE [/rosout/set_logger_level] /rosout http://ads:33744/
+PUB [/rosout_agg] /rosout http://ads:33744/
+SUB [/rosout] /rosout http://ads:33744/

现在一切都设置为运行服务器和客户端。

运行服务器

首先运行服务器。打开一个新外壳并键入:

rosrun beginner_tutorials add_two_ints_server

您应该看到类似于以下内容的内容:

Ready to add two ints.

运行客户端

现在让我们在另一个 shell 中运行具有必要参数的客户端:

$ rosrun beginner_tutorials add_two_ints_client 1 3

在客户端的 shell 中,您应该看到类似于以下内容的内容:

Sum: 4

相反,在服务器的 shell 中,您应该看到类似于以下内容的内容:

request: x=1, y=3
sending back response: [4]

原网址:ROS/Tutorials/WritingServiceClient(c++) - ROS Wiki

ros2】ROS2 Python服务端客户端开发指南 继承Nodesuper().__init__('face_detection_server') # 节点名称# 创建服务:参数为(接口类型,服务名称,回调函数)FaceDetector, # 服务接口'/face_detect', # 服务名称(客户端需匹配)self.detect_face_callback # 请求处理回调函数# 工具初始化self.bridge = CvBridge() # 图像转换工具。 阅读详情

相关推荐

ROS服务通信——学号查询(服务端客户端

ROS服务通信——学号查询(服务端客户端

m0_66920337的博客 866

ROS2】ROS2实现简单客户端

服务接口实现:服务端实现:代码如下: 运行结果如下:

pangweijian的博客 357

创建ROS服务端(service)客户端(client)

服务端客户端的关系实际上就是请求响应的关系。我们在定义服务类型的时候实际上只是定义了请求时客户端发送的数据类型及个数,还有服务端响应时返回来的数据类型个数。对C++语言而言、服务端客户端同样是.cpp文件编译生成的可执行文件。 服务端: 1、cd到包目录下,然后在src文件夹下创建.cpp文件; 2、.cpp文件包括以下部分:      ①包含(include)依赖库,

DjangoBUAA的博客 3931

ROS开发之如何使用客户端服务端服务数据?

笔者因研究课题涉及ROS开发,学习了古月居出品的ROS入门21讲,为巩固服务通信(用于实时通信、有一定逻辑处理的应用场景)知识,本文将ROS客户端服务端服务数据三讲内容进行总结。

【cacrle】的博客 922

ROS第 8 课 编写简单的客户端 Client

本节以创建简单的服务(Client)节点turtle_spawn.py为例进行讲解。该节点通过程序的形式发布一个让客户端产生一个新的小乌龟的请求。3) 输入指令“chmod +x turtle_spawn.py”回车,为保存的turtle_spawn.py赋予可执行权限。

m0_73841621的博客 775

ros---服务端客户端

想对于发布订阅模型的区别:请求一次才会接收一次,而不是不断的发布。 3.在CMakeLists.txt添加编译选项 4.编译生成语言的相关文件 第一个.h文件是后两个的集合,前面的PersonRequest.h是“---”上面的,Person Response.h是“---”下面的。添加到cMakeLists.txt客户端服务端

weixin_63032791的博客 784

ROS学习3)——python实现话题发布者订阅者,服务端客户端

对于发布者订阅者 上次用C语言编程,觉得没python简洁,就尝试用python,具体过程我不写了,记一些我自己要注意的问题,官网有教程 实现话题发布者订阅者:这里 英语不好的,解释给出一个别人的博客链接:这里 这里的确没有C语言还需要在cmake.listpackage.xml中改些什么,但请记住在写完python代码后,要给python文件添加可执行权限,就是这一步: chmod +x ...

lwq123free的博客 2187

ros2 实现一个简单的加减法服务端客户端

在 example_service_rclcpp/src 中创建节点,如客户端服务端等。工作空间为 chapt3_ws,创建功能包。再起另一个终端,运行客户端。然后在工作空间中进行编译。

qq_50679120的博客 182

ROS学习笔记(5)

用c++编写简单的服务端客户端 服务端 #include "ros/ros.h" #include "beginner_tutorials/AddTwoInts.h" // 这里的头文件是编译系统根据我们之前创建的srv文件自动生成的,对应该文件的头文件 // 求的两个int值从srv文件中的request里获取,求结果放入response当中去 bool add(beginne...

qq_40134052的博客 266

ROS通信编程+OpenCV

其中的---是上面是请求数据,下面是响应数据。ros根据这个符号解析数据。package.xml文件中加上:编译时需要message_generation依赖,运行时需要message_runtime依赖。作用是把msg、srv文件转化成c++,py格式可编译执行。ROS自带的消息结构CMakeLists.txt文件中使用find_package()查找包catkin的所有依赖项。添加运行时的依赖message_runtime添加自定义的文件。

wakeup_high的博客 1851

ros2 动作回调函数

创建服务实例,并初始化3个回调函数,回调函数的顺序很重要,第一个回调函数用来确定是否接受该任务,第二个用来处理取消,第三个用来执行接收该任务后的逻辑(一般会异步启动任务)。

qq_50679120的博客 356

3.ROS学习之服务通信

文章目录0.服务通信理论模型1.服务数据类型建立编译配置1.1.srv数据类型建立1.2.CMakelists.txt配置编译生成srv实体文件2.服务通信编程实现2.1.server端实现2.1.1.注册server的函数2.1.2.回调函数的形参2.1.3.ros::spin回调2.1.4.命令行调用测试2.2.client端实现2.2.1.注册client2.2.2.等待服务启动成功2.2.3.将终端输入的字符转化为数字2.2.4.client请求server服务3.编译配置 参考教程 0.服务通信

qq_42731705的博客 484

ROS总结——ROS服务器客户端

服务器客户端 (C++) 上一个博客总结了ROS消息发布订阅,本博客将继续总结ROS如何用 C++ 编写服务器节点客户端节点。 1. 编写ROS服务器节点 在这里,将创建一个简单的service节点(“add_two_ints_server”),该节点将接收到两个整形数字,并返回它们的。进入先前在catkin workspace教程中所创建的beginner_tutorials包所在

YongqiangGao的专栏 8290

ROS学习(五)客户端服务端通信

客户端服务端通信 基于海龟仿真器的通信案例 自定义服务的通信案例

m0_56451176的博客 1771

ROS服务通信】服务端客户端

ROS服务通信】服务端客户端

丑小鸭 849

ROS客户端Client服务端Server的编程实现

ROS客户端Client的编程实现 前情 之前学习ROS节点中订阅者发布者通讯方式,接下来了解的是另外一种通讯方式,也就是客户端服务器之间的通讯。 包含客户端服务端的服务模型(客户端/服务器)如下图(来自古月居ROS21讲) 建立客户端 进入src文件夹,新建功能包 ~/catkin_ws/src$ catkin_create_pkg learning_service roscpp rospy std_msgs geometry_msgs turtlesim 其中后面的几项是功能包

qq_43569735的博客 1167

ros2】ROS2 C++服务端客户端开发指南

定义服务接口(.srv)并编译接口包。服务端:继承,创建服务对象,实现请求处理回调函数,通过发布者/订阅者完成业务逻辑。客户端:创建客户端对象,异步发送请求,通过回调处理响应。相比Python,C++需更多关注内存管理(如智能指针SharedPtr)线程安全(如互斥锁),但能提供更高的性能。结合参数动态配置超时控制,可实现更健壮的服务通信逻辑,满足机器人系统的实时性需求。

EnHengNa的博客 1143

ROS手动编写服务端客户端service demo(C++)

service demo

Nikki_o3o的博客 1720
上一篇: ros(2)订阅话题的主要函数
下一篇: rviz插件错误
bakabakaa
博客等级 码龄5年 1粉丝 5原创
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值