需求描述: 编码实现向 turtlesim 发送请求,在乌龟显示节点的窗体指定位置生成一乌龟,这是一个服务请求操作。
实现分析:
- 首先,需要启动乌龟显示节点。
- 要通过ROS命令,来获取乌龟生成服务的服务名称以及服务消息类型。
- 编写服务请求节点,生成新的乌龟。
实现流程:
- 通过ros命令获取服务与服务消息信息。
- 编码实现服务请求节点。
- 启动 roscore、turtlesim_node 、乌龟生成节点,生成新的乌龟。
1. 服务名称与服务消息获取
获取话题: /spawn
rosservice list
获取消息类型: turtlesim/Spawn
rosservice type /spawn
获取消息格式:
rossrv info turtlesim/Spawn
响应结果:
float32 x
float32 y
float32 theta
string name
---
string name
2. 服务客户端实现
本次案例在ROS实操_话题发布
创建的dotopic
功能包内进行,因此无需开展功能的包的创建等相关操作,只需在scripts
目录内配置订阅节点相关的python文件即可。
touch service_topic.py
#! /usr/bin/env python
# coding=utf-8
"""
生成一只小乌龟
准备工作:
1.服务话题 /spawn
2.服务消息类型 turtlesim/Spawn
3.运行前先启动 turtlesim_node 节点
实现流程:
1.导包
需要包含 turtlesim 包下资源,注意在 package.xml 配置
2.初始化 ros 节点
3.创建 service 客户端
4.等待服务启动
5.发送请求
6.处理响应
"""
import rospy
from turtlesim.srv import Spawn,SpawnRequest,SpawnResponse
if __name__ == "__main__":
# 2.初始化 ros 节点
rospy.init_node("set_turtle_p")
# 3.创建 service 客户端
client = rospy.ServiceProxy("/spawn",Spawn)
# 4.等待服务启动
client.wait_for_service()
# 5.发送请求
req = SpawnRequest()
req.x = 2.0
req.y = 2.0
req.theta = -1.57
req.name = "my_turtle_p"
try:
response = client.call(req)
# 6.处理响应
rospy.loginfo("乌龟创建成功!,叫:%s",response.name)
except expression as identifier:
rospy.loginfo("服务调用失败")
chmod +x sub_topic.py
编辑dotopic
下的CmakeLists.txt文件
catkin_install_python(PROGRAMS
scripts/pub_topic.py
scripts/sub_topic.py
scripts/service_topic.py
DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)
3. 运行
工作空间下,编译并初始化环境变量
catkin_make
source devel/setup.bash
roscore
rosrun turtlesim turtlesim_node
rosrun dotopic pub_topic.py
rosrun dotopic service_topic.py