【ROS】如何让ROS中节点实现数据交换Ⅱ --服务通信

本文涉及的产品
资源编排,不限时长
简介: 在ros中,一个节点想要获取某种服务(例如:一个节点想要获取此时的相机数据,节点就需要向相机发送一个请求,而相机接收到请求后可以根据消息类型将数据类型返回),这就是基本的服务通信使用场景。

Halo,这里是Ppeua。平时主要更新C语言,C++,数据结构算法…感兴趣就关注我吧!你定不会失望。

本章将介绍如何通过服务通信的方式实现节点数据交换以及ROS相关指令


7f1e0841ff604c82ad26664e64713d65.jpg


0.服务通信概念


在ros中,一个节点想要获取某种服务(例如:一个节点想要获取此时的相机数据,节点就需要向相机发送一个请求,而相机接收到请求后可以根据消息类型将数据类型返回),这就是基本的服务通信使用场景。


以请求响应的方式实现不同节点间的数据交互


8fedcc8fbaa04b6e9c494f587825cddd.png


我们现阶段也不需要了解具体这代表什么意思,只需要知道:

client客户端/server服务端先后在rosmaster中注册本身信息,然后通过相同话题匹配.

1.server 与 client 的启动无先后顺序要求

2.server 与 client 都可以有多个

3.server 与 client 连接后不再需要rosmaster,也就是说仅在尝试连接的时候需要rosmaster


1.自定义srv消息


srv消息是服务端与客户端之间通信的一个数据载体,可用数据类型与std_msgs里的数据类型一致,但需要自己定义.

步骤大概为以下几步:

1.根据需要定义srv格式消息

2.修改配置文件

3.编译生成中间文件并引用


1.1定义srv格式消息


这是一个自己定义的srv的消息格式

因为要实现的是两个数相加,所以这样定义。


其中—上方为client客户端发送的消息格式,下方为服务端响应的消息格式。


# 客户端请求
int32 num1
int32 num2
---
# 服务端响应
int32 ans


1.2修改配置文件


1.和定义msg类似,也要先修改功能包目录下的package.xml,


6b8aef070af94145ad85373e84c4ce5d.png


其中54行的message_generation是编译时的消息软件包

而59行message_runtime是运行时的消息软件包


2.在CMakeList中找到这些地方并修改


 # 1.编译时的依赖包
 find_package(catkin REQUIRED COMPONENTS
 rospy
 std_msgs
 message_generation
 )
 # 2.加入自己定义的srv文件名字
 add_service_files(
 FILES
 Addints.srv 
 )
 # 3.编译包时的消息依赖
 generate_messages(
 DEPENDENCIES
 std_msgs
 )
 # 4.加入message_runtime,但官网没有这一步似乎也可以.
 catkin_package(**chmod +x py文件**
 CATKIN_DEPENDS rospy std_msgs message_runtime
 )


3.编译一下,可以在这个路径中找到刚刚编译完的中间件

之后调用的方法如下:

# 
from packagename.srv import * 

至于为什么要import * 我们可以先来看看编译完产生的文件是什么样的:

a99b175799484b96a58637c97ccbcbc0.png


其产生了一个srv的中间件,出现了三个类,我们之后这三个类都需要使用到,所以一般都是直接import*

2.自定义srv服务通信客户端python实现:


先来分析下作为一个客户端我们需要做什么事:

1.初始化ros节点

2.创建请求对象,设置通信话题

3.请求响应,获得响应结果


import rospy
import lesson3_srv.srv import *
rospy.init_node("sum_client")
client=rospy.ServiceProxy("sum2",Addints)
if(len(sys.argv)!=3):
    rospy.logerr("参数不对")
    sys.exit(1)
num=int(sys.argv[1])
num2=int(sys.argv[2])
response=client.call(num,num2)
rospy.loginfo("%d",response.ans)


这里先导入了rospy的包以及消息类型,初始化了节点信息与话题。


创建了请求服务的对象,serviceprovy(话题,srv消息)


对传入的参数进行了一个处理

clint.call返回类型为自定义消息类型的格式,call(srv中的参数)


最后处理返回的消息


这就是客户端实现,当然还有一些优化内容,等服务端实现完在提

3.自定义srv服务通信服务端python实现:


先来分析下作为一个服务端我们需要做什么事:


1.初始化节点

2.设置订阅话题

3.设置处理消息的回调函数


import rospy
from lesson3_srv.srv import *
def doNum(request):
    num1=request.num1
    num2=request.num2
    sum=num1+num2
    response=AddintsResponse()
    response.ans=sum
    rospy.loginfo("%d %d %d",request.num1,request.num2,response.ans)
    return response
rospy.init_node("sum")
server=rospy.Service("sum2",Addints,doNum)
rospy.spin()


这里先导包


然后通过service(话题名称,srv消息类型,回调函数)创建服务对象


刚刚客户端传入的数据,会作为回调函数的参数


先将其取出,之后通过AddintsResponse的方法创建一个返回对象,改变ans后返回此时的返回值是给了客户端


4.优化客户端


这里的客户端有个很小的问题,仅能在服务器启动后进行通信,若服务器没有启动,而先启动了客户端就会出错,ros官方提供了两个解决方法,二者选其一即可


# rospy.wait_for_service(话题名称)
# client.wait_for_service()


所以改进的客户端代码如下:


import rospy
import sys
from lesson3_srv.srv import *
rospy.init_node("sum_client")
client=rospy.ServiceProxy("sum2",Addints)
if(len(sys.argv)!=3):
    rospy.logerr("参数不对")
    sys.exit(1)
num=int(sys.argv[1])
num2=int(sys.argv[2])
#client.wait_for_service()
rospy.wait_for_service("sum2")
response=client.call(num,num2)
rospy.loginfo("%d",response.ans)


5.启动运行


1.先添加可执行权限 chmod +x py文件

2.之后配置一下CMakeList.txt


 catkin_install_python(
     PROGRAMS
 scripts/demo01_server.py
 scripts/demo01_client.py
 DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
 )


3.

 rosrun lesson3_srv demo01_client.py
 rosrun lesson3_srv demo01_server.py


运行效果:传入2 3 返回值为 5


295cbb75c513413e9876c81a4a2cf99c.png

251031d341a748ed90a2212c1d2d54c1.png


至此服务通信内容结束

相关实践学习
使用ROS创建VPC和VSwitch
本场景主要介绍如何利用阿里云资源编排服务,定义资源编排模板,实现自动化创建阿里云专有网络和交换机。
阿里云资源编排ROS使用教程
资源编排(Resource Orchestration)是一种简单易用的云计算资源管理和自动化运维服务。用户通过模板描述多个云计算资源的依赖关系、配置等,并自动完成所有资源的创建和配置,以达到自动化部署、运维等目的。编排模板同时也是一种标准化的资源和应用交付方式,并且可以随时编辑修改,使基础设施即代码(Infrastructure as Code)成为可能。 产品详情:https://www.aliyun.com/product/ros/
目录
相关文章
|
2月前
|
弹性计算 持续交付 API
基于 ROS 的Terraform托管服务轻松部署ChatGLM-6B
文章介绍了如何利用ROS和Terraform模板轻松自动化部署基于GLM架构、优化中文对话的ChatGLM-6B模型至阿里云,提高了部署效率与便捷性,适用于多种应用场景,且模型部署过程详细,彰显了基础设施即代码(IaC)的优势。
48 3
基于 ROS 的Terraform托管服务轻松部署ChatGLM-6B
|
2月前
|
弹性计算 人工智能 持续交付
基于 ROS 的Terraform托管服务轻松部署Qwen-7B-Chat
文章介绍了如何利用ROS和Terraform模板轻松自动化部署阿里云的Qwen-7B-Chat大语言模型服务,提高了部署效率与便捷性,是实现云资源和服务快速上线的最佳实践。
68 2
基于 ROS 的Terraform托管服务轻松部署Qwen-7B-Chat
|
3月前
|
机器人 Shell Python
ROS2教程05 ROS2服务
这篇文章是关于ROS2(Robot Operating System 2)服务的教程,涵盖了服务的概念、特性、命令行工具的使用,以及如何编写服务的服务器和客户端代码,并提供了测试服务通信机制的示例。
88 4
ROS2教程05 ROS2服务
|
3月前
|
传感器 自然语言处理 机器人
ROS2教程03 ROS2节点
本文是关于ROS2(机器人操作系统2)节点的教程,涵盖了节点的概念、特性、使用方法,以及如何编写、测试和使用ROS2节点相关的命令行工具。文章介绍了节点的独立性、任务执行、跨硬件分布和多语言编写能力。详细解释了如何启动节点、查看节点信息、编写节点代码(包括面向过程和面向对象的方法),以及如何为功能包添加依赖和入口点。此外,还探讨了重映射节点名称和使用节点命令行工具的方法,如 `ros2 node info` 和 `ros2 node list`。适合已安装ROS2 Humble和Ubuntu 22.04操作系统,并具有Shell基础知识的读者学习。
94 1
|
3月前
|
机器人
ROS2教程 05 服务Service
本文是关于ROS2(机器人操作系统2)中服务(Service)机制的教程,介绍了服务与话题(Topic)的区别、ROS2服务的相关命令,包括列出服务、查找服务、获取服务类型和调用服务,并通过示例代码展示了如何创建服务端(Server)和客户端(Client),以及如何测试服务调用过程。
147 0
ROS2教程 05 服务Service
|
3月前
|
机器人 Python
ROS2教程 03 节点Node
本文是关于ROS2(机器人操作系统2)的教程,介绍了ROS2的节点概念、与ROS1的区别、节点的编写和基本流程、ros2的node相关命令,以及如何对节点名进行重映射,旨在帮助读者理解ROS2中节点的创建和操作。
107 0
ROS2教程 03 节点Node
|
3月前
|
XML 网络协议 机器人
ROS1 Noetic主从机通信使用详解
这篇文章详细介绍了在ROS1 Noetic环境下配置主从机通信的步骤,包括获取IP和主机名、设置`/etc/hosts`文件、配置ROS环境变量以及测试通信是否成功。同时,文章还提供了一些ROS环境变量的相关知识和参考资料链接。
80 0
|
5月前
|
弹性计算 API 持续交付
基于 ROS 的 Terraform 托管服务轻松部署文本转语音系统 ChatTTS
基于 IaC 的理念,通过定义一个模板,使用 ROS 提供的 Terraform 托管服务进行自动化部署,可以非常高效快捷地部署任意云资源和应用(比如 ChatTTS 服务)。相比于手动部署或者通过 API、SDK 的部署方式,有着高效、稳定等诸多优势,也是服务上云的最佳实践。
69 1
基于 ROS 的 Terraform 托管服务轻松部署文本转语音系统 ChatTTS
|
4月前
|
机器人 Shell 开发者
`roslibpy`是一个Python库,它允许非ROS(Robot Operating System)环境(如Web浏览器、移动应用等)与ROS环境进行交互。通过使用`roslibpy`,开发者可以编写Python代码来远程控制ROS节点,发布和订阅话题,以及调用服务。
`roslibpy`是一个Python库,它允许非ROS(Robot Operating System)环境(如Web浏览器、移动应用等)与ROS环境进行交互。通过使用`roslibpy`,开发者可以编写Python代码来远程控制ROS节点,发布和订阅话题,以及调用服务。
|
1月前
|
Ubuntu 机器人 Linux

推荐镜像

更多