ROS实操_服务调用


需求描述: 编码实现向 turtlesim 发送请求,在乌龟显示节点的窗体指定位置生成一乌龟,这是一个服务请求操作。

实现分析:

  1. 首先,需要启动乌龟显示节点。
  2. 要通过ROS命令,来获取乌龟生成服务的服务名称以及服务消息类型。
  3. 编写服务请求节点,生成新的乌龟。

实现流程:

  1. 通过ros命令获取服务与服务消息信息。
  2. 编码实现服务请求节点。
  3. 启动 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

文章作者: kolbey
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 kolbey !