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添加依赖
<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>
#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<test_link::srv>("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.结果演示
|