需求描述:
编码实现向 turtlesim 发送请求,在乌龟显示节点的窗体指定位置生成一乌龟,这是一个服务请求操作。
结果演示:
参考案例:小乌龟显示节点
即:请求产生一个小乌龟,属于service_client模型
#启动小乌龟显示节点
rosrun turtlesim turtlesim_node
查看服务列表:
rosservice list
得到产生服务:/spawn
查看服务具体信息:
rosservice info /spawn
得到消息类型:turtlesim/Spawn
查看消息结构:
rossrv info turtlesim/Spawn
实现思路
编写请求服务的节点,通过传入乌龟的名称,位置进行产生乌龟
准备工作
准备工作,可供参考:
https://blog.csdn.net/ccy1522929997/article/details/141064438?spm=1001.2014.3001.5502
代码实现:
#! usr/bin/env python
import rospy
from turtlesim.srv import Spawn,SpawnRequest,SpawnResponse
import sys
'''
需求描述:编码实现向 turtlesim 发送请求,在乌龟显示节点的窗体指定位置生成一乌龟,这是一个服务请求操作。
实现流程:
1. 导入相关包
2. 初始化ROS节点
3. 创建服务客户端,并调用服务
4. 创建服务请求对象,并发送请求
5. 处理服务响应结果
6. 循环执行
'''
if __name__ == "__main__":
#节点初始化
rospy.init_node(sys.argv[1])
rospy.loginfo("服务客户端启动")
#创建服务客户端
'''
服务话题:/Spawn
消息类型:turtlesim/Spawn
'''
client = rospy.ServiceProxy("/spawn",Spawn)
#发送请求
req = SpawnRequest()
#发送的内容
'''
float32 x
float32 y
float32 theta
string name
---
string name
'''
rospy.loginfo(sys.argv[1])
req.name = sys.argv[1]
req.x = float(sys.argv[2])
req.y = float(sys.argv[3])
req.theta = float(sys.argv[4])
rospy.loginfo( type(
req.x))
rospy.loginfo( req.x)
rospy.loginfo( req.y)
rospy.loginfo( req.theta)
#等待服务启动
client.wait_for_service()
#处理响应
resp = client.call(req)
实现结果:通过输入命令行,可以添加不同的乌龟
rosrun comunication_learn turtlesim_create.py turtle3 5.2 2.3 1.57
总结:
关键API:
client = rospy.ServiceProxy(“/spawn”,Spawn)
服务话题:/Spawn
消息类型:turtlesim/Spawn
req = SpawnRequest()
#发送请求
根据消息结构,编写发送内容
req.name =
req.x =
req.y =
req.theta =
client.wait_for_service()
等待服务启动
resp = client.call(req)
处理响应
细节注意:
通信分为:
发布方和订阅方模型:通常用来信息查询
服务端与客户端模型:通常用来处理短暂事件,如要请求产生等
服务端与客户端模型有先后顺序,要先有服务端模型,才能启动客户端模型发送请求,得到响应。
所以之间在客户端进行优化,等待服务端的启动即可
client.wait_for_service()