返回
ROS 服务通讯之 Server 与 Client 的 C++ 实现
后端
2023-12-17 07:56:16
- 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 服务通讯的具体实现方法,并将其应用到自己的项目中。