ROS学习(二)——服务通信的C++实现

ROS学习(二)——服务通信的C++实现.

引言:本文分为三个部分,分别为服务通信的理论模型、自定义srv文件的导入以及服务端和响应端对应的C++实现。

一、服务通信理论模型

服务通信的理论模型与单片机的中断模式类似,我们先将服务端程序挂起,然后只有当客户端发出请求的时候,服务端才会响应,调用对应的回调函数。在这里我们也举一个比较简单的例子:服务端进行加和运算,把客户端发来的两个数字求和并输出。

二、自定义srv文件的导入

在本例子中,我们需要3个变量:即客户端要输入的2个数字num1,num2,以及服务端响应的求和结果sum,他们都是整形变量,步骤如下:

1.创建srv文件

在功能包下新建srv文件夹,在其中创建后缀为srv的文件,这里设置为srv.srv,并在其中写入需要用到的变量,上为客户端请求变量,下为服务端响应变量,中间用—分割。

int32 num1
int32 num2
---
int32 sum

2.编辑配置文件(package.xml与CMakeLists.txt)

  #package.xml添加依赖
  message_generation
  message_runtime
#CMakeLists.txt添加依赖
find_package(catkin REQUIRED COMPONENTS
  roscpp
  rospy
  std_msgs
  message_generation
)
add_service_files(
  FILES
  srv.srv
)
generate_messages(
  DEPENDENCIES
  std_msgs
)

3.编译

catkin_make

4.导入头文件路径

编译之后我们就可以在devel/include/test_link和devel/lib/python3/dist-packages/test_link/srv下看到供我们引用的srv.h和srv.py文件。

我们在.vscode/c_cpp_properties.json文件中导入头文件路径"/home/hqs/ros_demo/devel/include/**"完成C++头文件的导入。

#include "test_link/srv.h"

我们在.vscode/settings.json文件中导入头文件路经 "/opt/ros/noetic/lib/python3/dist-packages"完成Python文件的导入。

from test_link.srv import srv

三、C++服务通信实现

1.服务端实现:

(1)导入头文件

#include "ros/ros.h"
#include "test_link/srv.h"

(2)初始化节点,并创建节点句柄

 ros::init(argc,argv,"node_name_server");
 ros::NodeHandle nh;

(3)创建服务端对象

//nh.advertiseService("节点名称",回调函数名称);
ros::ServiceServer srv = nh.advertiseService("topic_name_server",callback);
spin()  					//官方建议

(4)回调函数编写

bool callback(test_link::srv::Request &request,
              test_link::srv::Response &response)
{
    int num1 = request.num1;
    int num2 = request.num2;
    ROS_INFO("受到的请求数据为:%d与%d",num1,num2);
    int sum = num1 + num2;
    response.sum = sum;
    return true;
}

(5)CMakeLists.txt配置

add_executable(demo_server src/demo_server.cpp)

target_link_libraries(demo_server
${catkin_LIBRARIES}
)

2.客户端实现

(1)导入头文件略

(2)初始化节点略,创建句柄略

(3)创建客户端对象

ros::ServiceClient client = nh.serviceClient("topic_name_server");

(4)创建响应对象并指定main函数输入

test_link::srv srv;
srv.request.num1 = atoi(argv[1]); 
srv.request.num2 = atoi(argv[2]);
上传数据,等待响应
client.call(srv)

(5)CMakeLists.txt配置略

(6)编译

3.结果演示

ROS学习(二)——服务通信的C++实现_第1张图片

你可能感兴趣的:(ROS学习,学习,c++,开发语言)