【ROS学习6(Service)】客户端Client的编程实现

在前几次学习当中,我们了解了Topic通讯当中基本模型PublisherSubscriber的实现方式,从本次我们开始学习ROS中另一种重要的通讯方式:Service(服务)的实现。

客户端Client的编程实现:

以发布海龟生成请求为例:
在这里插入图片描述
Client(客户端):发布海龟生成请求 [类似Publisher]
Serve(服务端):海龟仿真器,接收请求 [类似于Subscriber]
Service(服务):生成海龟的具体内容,其中服务类型是turtlesim::Spawn[类似于Topic]

创建功能包:

cd catkin_ws/src
catkin_create_pkg learning_service roscpp rospy std_msgs geometry_msgs turtlesim

功能包名:learning_service + 依赖

客户端实现:

如何实现一个客户端:

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

代码实现:

/**
 * 该例程将请求/spawn服务,服务数据类型turtlesim::Spawn
 */
 
#include <ros/ros.h>
#include <turtlesim/Spawn.h>  //包含头文件

int main(int argc, char** argv)
{
    
    
    // 初始化ROS节点
    ros::init(argc, argv, "turtle_spawn");
    
    // 创建节点句柄
    ros::NodeHandle node;

    // 发现/spawn服务后,创建一个服务客户端,连接名为/spawn的service
    // 查询是否有名为spawn的服务,有则请求该服务,否则一直等待下去(阻塞型函数)
    ros::service::waitForService("/spawn");
    // 创建ServiceClient客户端,给spawn服务发送请求,<>中为请求的数据类型,()中为服务名
    ros::ServiceClient add_turtle = node.serviceClient<turtlesim::Spawn>("/spawn");

    // 初始化turtlesim::Spawn的请求数据(产生一只新的海龟)
    turtlesim::Spawn srv; //srv
    srv.request.x = 2.0;  //x坐标
    srv.request.y = 2.0;  //y坐标
    srv.request.name = "turtle2";
    
    // 请求服务调用
    ROS_INFO("Call service to spwan 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("Spwan turtle successfully [name:%s]", srv.response.name.c_str
    
    return 0;
 }

其中:
ros::service::waitForService("/spawn")add_turtle.call(srv)是阻塞型函数,没得到反馈之前不会执行下一步,就比如打开浏览器发送一个访问请求给百度,直到百度给你反馈之前都是一个等待的状态。

编译:

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

cd catkin_ws
catkin_make
source devel/setup.bash //配置了可以省略

运行:

roscore
rosrun turtlesim turtlesim_node
rosrun learning_service turtle_spawn //客户端请求

在这里插入图片描述
在这里插入图片描述
第一行是发送service请求
第二行是server产生成功的response

服务端:
在这里插入图片描述

Guess you like

Origin blog.csdn.net/SESESssss/article/details/105473929