古月居ROS入门21讲——13-15.Server和Client的编程实现 & 服务数据的定义与使用

ROS中的service通信是一种双向、同步的方式,用于节点间的一次性请求-应答交互。本文详细介绍了如何创建ROS服务的客户端(Client)和服务器端(Server),以实例展示了C++和Python两种实现方式。同时,讲解了如何自定义服务类型,包括定义srv文件、修改package.xml和CMakeLists.txt,以及服务类型的使用。

1.服务(service)

当一些节点只是临时而非周期性的需要某些数据,如果用topic通信方式时就会消耗大量不必要的系统资源,这时,就需要使用ROS通信中的另一种通信方式——service(服务)。

service通信是双向的,它不仅可以发送消息,同时还会有反馈。所以service包括两部分,一部分是请求方(Clinet),另一部分是应答方/服务提供方(Server)。这时请求方(Client)就会发送一个request,要等待Server处理,反馈回一个reply,这样通过类似请求-应答的机制完成整个服务通信。

service是同步通信方式,所谓同步就是说,node1发布请求后会在原地等待reply,直到node2处理完了请求并且完成了reply,node1才会继续执行。node1等待过程中,是处于阻塞状态的成通信。这样的通信模型没有频繁的消息传递,没有冲突与高系统资源的占用,只有接受请求才执行服务,简单而且高效。

2.如何实现一个客户端(Client)

以请求生成第二只小海龟为例,写一个客户端程序,服务名为/spawn,服务数据类型为turtlesim::Spawn
在这里插入图片描述

  1. 初始化ROS节点
  2. 创建一个Client实例
  3. 发布服务请求数据
  4. 等待Server处之后的应答结果

(1) Client的C++实现

创建learning_service功能包

其中roscpprospystd_msgsgeometry_msgsturtlesim为此功能包的依赖

cd ~/my_ws/src
catkin_create_pkg learning_service roscpp rospy std_msgs geometry_msgs turtlesim

接下来在/my_ws/src/learning_service/src路径下创建turtle_spawn.cpp文件,C++代码如下:

#include <ros/ros.h>
#include <turtlesim/Spawn.h>

int main(int argc, char** argv)
{
   
   
    ros::init(argc, argv, "turtle_spawn");

    ros::NodeHandle n;

    ros::service::waitForService("/spawn");  //等待发现/spawn服务
    ros::ServiceClient add_turtle = n.serviceClient<turtlesim::Spawn>("/spawn");  //创建一个服务客户端

    //初始化服务请求数据
    turtlesim::Spawn srv;
    srv.request.x = 2.0;
    srv.request.y = 2.0;
    srv.request.name = "turtle2";

    //请求服务调用
    ROS_INFO("Call service to spawn turtle[x:%0.6f  y:%0.6f  name:%s]",
             srv.request.x, srv.request.y, srv.request.name.c_str());

    add_turtle.call(srv);

    //显示服务调用结果
    ROS_INFO("Spawn turtle successfully [name:%s]", srv.response.name.c_str());

    return 0;
}

/my_ws/src/learning_service路径下CMakeLists.txt中配置发布者代码的编译规则

add_executable(turtle_spawn src/turtle_spawn.cpp)
target_link_libraries(turtle_spawn ${catkin_LIBRARIES})

编译运行

cd ~/my_ws
catkin_make
source ~/my_ws/devel/setup.bash
roscore
rosrun turtlesim turtlesim_node
rosrun learning_service turtle_spawn

在这里插入图片描述
在这里插入图片描述

(2) Client的Python实现

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys
import rospy
from turtlesim.srv import Spawn

def turtle_spawn():
    rospy.init_node('turtle_spawn')

    rospy.wait_for_service(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值