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

- 初始化ROS节点
- 创建一个Client实例
- 发布服务请求数据
- 等待Server处之后的应答结果
(1) Client的C++实现
创建learning_service功能包
其中roscpp, rospy, std_msgs, geometry_msgs, turtlesim为此功能包的依赖
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(

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

被折叠的 条评论
为什么被折叠?



