当前位置:网站首页>[ROS] (10) ROS Communication - Service Communication
[ROS] (10) ROS Communication - Service Communication
2022-08-05 02:18:00 【CynalFly】
文章只是个人学习过程中学习笔记,主要参考ROS教程1.
目录
1、概念
服务(Services):是节点之间通讯的另一种方式.服务允许节点发送一个请求(request)并获得一个响应(response).
2、 服务通信机制
服务通信 是也是ROS通信中最常用的一种基于 请求和响应 模型的通信方式.Used for temporary、非周期性、Data transmission scenarios with certain logic processing.
服务通信 By allowing the request-Respond to communication for tighter coupling.The service client sends a request message to the service server and waits for a response(The client will block,直到收到响应).The server will use the data in the request to construct a response message and send it back to the client.Every service has a type,It determines the structure of request and response messages.Services also have names that are unique within a network.
ROS Node想通过service方式来传递消息: 首先Server节点和Client节点都要到ROS Master(节点管理器)中进行注册节点名称、服务(Sevice)名称、消息类型、URI地址和端口;然后, ROS Master会根据注册表中的信息匹配Server和 Client,并向Client发送 Server 的 TCP 地址信息;其次,Client 根据Server的信息,使用TCP与Server 建立连接,and request to send a message;最后, Server 接收、解析请求的数据,并产生响应结果返回给 Client.

1.客户端请求被处理时,需要保证服务器已经启动;
2.服务端和客户端都可以存在多个;
3、服务命令rosservice
rosservice2 Can be easily attached to via a serviceROS客户端/服务器框架上.
| 命令 | 功能 |
|---|---|
rosservice argc | Parameters of the output service |
rosservice call | 用给定的参数调用服务 |
rosservice find | 按服务的类型查找服务 |
rosservice info | Information about the output service |
rosservice list | Output active services |
rosservice type | 输出服务的类型 |
rosservice uri | 输出服务的ROSRPC uri |
Tips:使用
rosservice <command> -h帮助选项获取更详细的用法.
4、Service communication practice – Hatches a baby turtle at the designated location in the turtle simulator
通过ROS内置的乌龟模拟器(turtlesim)to carry out the practical operation of service communication,Hatches a baby turtle at the designated location in the turtle simulator.
实现的步骤如下:
步骤1:在新终端中启动roscore
roscore
步骤2:Start the turtle simulator node in a new terminalturtlesim_node
rosrun turtlesim turtlesim_node
步骤3:通过调试工具rqt_service_callerAnd programmatically hatch a baby turtle at the designated location in the turtle simulator.
4.1 调试工具实现
通过rqt_service_callerTool simulates service requests:
- 启动
rqt_service_caller工具
rosrun rqt_service_caller rqt_service_caller
- Configure parameters graphically,如果所示,Choose Incubation Services
/spawn,在RequestConfigure the hatching location in 、角度、Turtle name request parameter,然后点击右上角call 发送请求,If the turtle simulator responds successfully,会在Response中显示结果,And in turtle simulatorturtlesimA small turtle hatched.

4.2 编程实现(C++)
在beginner_tutorials软件包的srcCreate a service client source file in the directory:
roscd beginner_tutorials
cd src
touch turtle_spawn_client.cpp
4.2.1 服务客户端程序(turtle_spawn_client.cpp)
#include "ros/ros.h"
#include "turtlesim/Spawn.h"
int main(int argc, char **argv)
{
setlocale(LC_ALL,"");
/* 初始化ROS节点 */
ros::init(argc,argv,"turtle_spawn_client");
/* Create a handle for this node */
ros::NodeHandle nh;
/* 创建service client 指定服务类型为turtlesim::Spawn */
ros::ServiceClient client = nh.serviceClient<turtlesim::Spawn>("/spawn");
/* 等待服务器启动 */
ros::service::waitForService("/spawn");
/* Instantiate the service data type,and to membersrequest赋值 */
turtlesim::Spawn spawn;
spawn.request.x = 2;
spawn.request.y = 8;
spawn.request.theta = 1.8;
spawn.request.name = "new_turtle1";
/* 服务调用 */
if(client.call(spawn))
{
ROS_INFO("小乌龟[%s]已孵化", spawn.response.name.c_str());
}
else
{
ROS_INFO("The baby turtle failed to hatch!");
}
return 0;
}
4.2.2 配置CMakeLists.txt
只需将这几行添加到CMakeLists.txt文件的底部:
add_executable(turtle_spawn_client src/turtle_spawn_client.cpp)
target_link_libraries(turtle_spawn_client ${catkin_LIBRARIES})
add_dependencies(turtle_spawn_client ${PROJECT_NAME}_gencpp)
4.2.3 编译、运行
在你的工作空间下执行catkin_make编译,将turtle_spawn_client.cpp编译成可执行文件turtle_spawn_client.编译后,在终端中执行过程如下所示.
4.3 编程实现(Python)
在beginner_tutorials软件包的scriptsCreate a service client source file in the directory:
roscd beginner_tutorials
cd scripts
touch turtle_client.py
chmod +x turtle_client.py
4.3.1 服务客户端程序(turtle_spawn_client.py)
#!/usr/bin/env python
# encoding: utf-8
import rospy
from turtlesim.srv import Spawn,SpawnRequest
def turtle_spawn_client():
# 初始化ROS节点
rospy.init_node("turtle_spawn_client")
# 创建sevice client
spawn_client = rospy.ServiceProxy('/spawn',Spawn)
# 等待服务开启
spawn_client.wait_for_service()
# 创建请求数据
spawn_req = SpawnRequest()
spawn_req.x = 8.0
spawn_req.y = 8.0
spawn_req.theta = 0.8
spawn_req.name = "new_turtle2"
try:
# Call the service and get the corresponding result
spawn_res = spawn_client.call(spawn_req)
rospy.loginfo("小乌龟[%s]turtle has hatched", spawn_res.name)
except rospy.ServiceException as e:
rospy.loginfo("The baby turtle failed to hatch!")
if __name__ == '__main__':
turtle_spawn_client()
4.2.2 配置CMakeLists.txt
只需catkin_install_python中添加 scripts/turtle_spawn_client.py即可:
# 安装python可执行脚本
catkin_install_python(PROGRAMS
scripts/turtle_spawn_client.py
...
DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)
4.2.3 编译、运行
其实这个例子很简单,不需要编译,直接执行python文件就行.但是我们还是养成习惯吧,每次创建和修改代码后,就catkin_make编译一下,即使是Python节点也必须使用它.这是为了确保能为创建的消息和服务自动生成Python代码.
5、Service command practice
ROSSome command line tools are provided to help us seeService的信息.Through the little turtle simulator(turtlesim)to implement the service command.
5.1 rosservice list
rosservice list Output is active(当前正在运行)服务的信息.

listThe command shows that there are two ANDsrosoutNode related services:/rosout/get_loggers和/rosout/set_logger_level.其余的都是turtlesim节点提供了9个服务.
5.2 rosservice argc
rosservice argc[service] All parameters of the output service.

5.3 rosservice type
rosservice type [service] 输出服务的类型.

5.4 rosservice find
rosservice call [service] 按服务的类型查找服务.
5.5 rosservice uri
rosservice uri 输出服务的ROSRPC uri.

5.6 rosservice info
rosservice info [service] Information about the output service.
5.7 rosservice call
rosservice call [service] [args] 用给定的参数调用服务.
# 调用服务 /spawn ,给定参数:位置(8.0,2.0)、角度为1.8、名字为new_turtle3,Then hatch baby turtles.
rosservice call /spawn 8.0 2.0 1.8 "new_turtle3"

ROS.otg. ROS教程[EB/OL]. 2020-12-22[2022-7-5].
http://wiki.ros.org/cn/ROS/Tutorials. ︎ROS.otg. rosservice[EB/OL]. 2020-12-22[2022-7-5].
https://wiki.ros.org/rosservice. ︎
边栏推荐
- MySQL学习
- Intel XDC 2022 Wonderful Review: Build an Open Ecosystem and Unleash the Potential of "Infrastructure"
- nodeJs--封装路由
- Advanced Numbers_Review_Chapter 1: Functions, Limits, Continuity
- Xunrui cms website cannot be displayed normally after relocation and server change
- Using OpenVINO to implement the flying paddle version of the PGNet inference program
- ExcelPatternTool: Excel table-database mutual import tool
- 后期学习计划
- C学生管理系统 头添加学生节点
- 学习笔记-----左偏树
猜你喜欢

刷爆朋友圈,Alibaba出品亿级并发设计速成笔记太香了

Tree search (bintree)

HOG特征学习笔记

编译预处理等细节

【genius_platform软件平台开发】第七十六讲:vs预处理器定义的牛逼写法!!!!(其他组牛逼conding人员告知这么配置来取消宏定义)

LeetCode使用最小花费爬楼梯----dp问题
![[Unity Entry Plan] Handling of Occlusion Problems in 2D Games & Pseudo Perspective](/img/de/944b31c68cc5b9ffa6a585530e7be9.png)
[Unity Entry Plan] Handling of Occlusion Problems in 2D Games & Pseudo Perspective

【Unity入门计划】2D游戏中遮挡问题的处理方法&伪透视

2022了你还不会『低代码』?数据科学也能玩转Low-Code啦!

Transfer Learning - Joint Geometrical and Statistical Alignment for Visual Domain Adaptation
随机推荐
fragment可见性判断
Exploding the circle of friends, Alibaba produced billion-level concurrent design quick notes are too fragrant
MySQL learning
重新审视分布式系统:永远不会有完美的一致性方案……
多线程(2)
继承关系下构造方法的访问特点
sql语句多字段多个值如何进行排序
C语言日记 9 if的3种语句
[ROS](10)ROS通信 —— 服务(Service)通信
Live playback including PPT download | Build Online Deep Learning based on Flink & DeepRec
Xunrui cms website cannot be displayed normally after relocation and server change
SuperMap iDesktop.Net之布尔运算求交——修复含拓扑错误复杂模型
居民用水问题
【Unity入门计划】2D游戏中遮挡问题的处理方法&伪透视
【OpenCV 图像处理2】:OpenCV 基础知识
释放技术创新引擎,英特尔携手生态合作伙伴推动智慧零售蓬勃发展
nodeJs--封装路由
如何基于OpenVINO POT工具简单实现对模型的量化压缩
继承关系下构造方法的访问特点
Advanced Numbers_Review_Chapter 1: Functions, Limits, Continuity