返回

ROS 服务通讯之 Server 与 Client 的 C++ 实现

后端

  1. ROS 服务简介

ROS 服务是 ROS 中一种重要的通信机制,它允许节点之间通过请求-响应的方式进行通信。服务端节点提供服务,客户端节点可以向服务端节点发送请求,并等待服务端节点的响应。服务端节点通常会提供一个或多个服务,每个服务都有一个唯一的名称和一个消息类型,用于定义请求和响应消息的格式。

2. Server 端节点的 C++ 实现

2.1 创建服务端节点

#include <ros/ros.h>
#include <std_srvs/Empty.h>

int main(int argc, char **argv)
{
  // 初始化 ROS 节点
  ros::init(argc, argv, "service_server");

  // 创建 ROS 节点句柄
  ros::NodeHandle nh;

  // 创建服务
  ros::ServiceServer service = nh.advertiseService("my_service", &callback);

  // 循环等待客户端请求
  ros::spin();

  return 0;
}

在上面的代码中,我们首先初始化 ROS 节点,然后创建 ROS 节点句柄。接下来,我们使用 ros::ServiceServer 类创建服务,并指定服务名称和回调函数。最后,我们使用 ros::spin() 函数循环等待客户端请求。

2.2 回调函数

bool callback(std_srvs::Empty::Request &req, std_srvs::Empty::Response &res)
{
  // 处理请求
  ROS_INFO("Received a request");

  // 发送响应
  return true;
}

在上面的代码中,我们定义了服务处理函数 callback()。当客户端发送请求时,该函数会被调用。在函数中,我们可以处理请求并发送响应。

3. Client 端节点的 C++ 实现

3.1 创建客户端节点

#include <ros/ros.h>
#include <std_srvs/Empty.h>

int main(int argc, char **argv)
{
  // 初始化 ROS 节点
  ros::init(argc, argv, "service_client");

  // 创建 ROS 节点句柄
  ros::NodeHandle nh;

  // 创建服务客户端
  ros::ServiceClient client = nh.serviceClient<std_srvs::Empty>("my_service");

  // 发送请求
  std_srvs::Empty req;
  if (client.call(req))
  {
    ROS_INFO("Received a response");
  }
  else
  {
    ROS_ERROR("Failed to call service");
  }

  return 0;
}

在上面的代码中,我们首先初始化 ROS 节点,然后创建 ROS 节点句柄。接下来,我们使用 ros::ServiceClient 类创建服务客户端,并指定服务名称。最后,我们使用 ros::ServiceClient::call() 函数发送请求并等待响应。

4. 运行服务端和客户端节点

要运行服务端和客户端节点,我们可以使用以下命令:

rosrun package_name service_server
rosrun package_name service_client

其中,package_name 是包含服务端和客户端节点的 ROS 包的名称。

5. 总结

本文详细介绍了 ROS 服务通讯的 Server 与 Client 的 C++ 实现,包括创建服务端节点、客户端节点、编写服务请求和响应消息、编写服务处理函数以及运行服务端和客户端节点等内容。通过本文,读者可以掌握 ROS 服务通讯的具体实现方法,并将其应用到自己的项目中。