1、首先自定义 srv 文件
与自定义 msg 文件类似,在工作目录下创建 srv 目录
在目录下创建 xxx.srv 文件
例: 创建 addints.srv 文件
编写代码
其中首先编写客户端发送的数据类型
以 --- 作分割符,区分客户端和服务端处理的数据类型
编写服务端处理发送的数据
#客户端发送的数据
int32 num1
int32 num2
---
#服务端发送的数据
int32 sum
修改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
)
# Generate services in the 'srv' folder
add_service_files(
FILES
addints.srv
)
# Generate added messages and services with any dependencies listed here
generate_messages(
DEPENDENCIES
std_msgs
)
ctrl+shift+B编译,在工作空间下 devel 文件夹中可发现生成的中间文件 addints.h 头文件等.
复制该地址,打开 c_cpp_properties.json 文件进行添加 Path:
"/xxx/工作空间/devel/include/**"#根据自己的目录自行填写
服务端C++文件编写
#include "ros/ros.h"
#include "server_client/addints.h"
bool doADD(server_client::addintsRequest& req,server_client::addintsResponse& resp)
{
int num1 = req.num1;
int num2 = req.num2;
ROS_INFO("接收到的数据为%d,%d",num1,num2);
if(num1<0||num2<0) //判断输入数据是否合法
{
ROS_ERROR("请输入两个整数");
return false;
}
else{
int sum = num1+num2;
resp.sum = sum;
ROS_INFO("处理的结果为:%d",sum);
return true;
}
}
int main(int argc, char *argv[])
{
setlocale(LC_ALL,"");
ros::init(argc ,argv,"server");
ros::NodeHandle nh;
ros::ServiceServer server = nh.advertiseService("addints",doADD);
ROS_INFO("启动成功");
ros::spin(); //因为需要处理多次,所以此处需要spin返回
return 0;
}
客户端C++文件编写
#include "ros/ros.h"
#include "server_client/addints.h"
int main(int argc, char *argv[])
{
setlocale(LC_ALL,"");
if(argc != 3)
{
ROS_ERROR("请输入三个整数");
return 1;
}
ros::init(argc,argv,"client");
ros::NodeHandle nh;
ros::ServiceClient client = nh.serviceClient<server_client::addints>("addints");
ros::service::waitForService("addints"); //通过此函数可以保证服务端启动后再发送数据
server_client::addints ai; //组织信息传送到服务端
ai.request.num1 = atoi(argv[1]);
ai.request.num2 = atoi(argv[2]);
bool flag = client.call(ai); //判断数据是否已经发送成功
if(flag)
{
ROS_INFO("数据处理成功,结果为:%d",ai.response.sum);
}
else{
ROS_ERROR("数据处理失败");
return 1;
}
return 0;
}
编辑CMakeLists.txt文件
add_executable(server_c src/server.cpp)
add_executable(client_c src/client.cpp)
## Add cmake target dependencies of the executable
## same as for the library above
add_dependencies(server_c ${PROJECT_NAME}_gencpp)
add_dependencies(client_c ${PROJECT_NAME}_gencpp)
# Specify libraries to link a library or executable target against
target_link_libraries(server_c
${catkin_LIBRARIES}
)
target_link_libraries(client_c
${catkin_LIBRARIES}
)
Ctrl+Shift+B编译通过后在工作空间打开终端
roscore启动ros核心
rosrun 功能包 服务端映射名
rosrun 功能包 客户端映射名 num1 num2

Screenshot from 2022-06-07 18-35-59.png