1矾瘾、首先自定義 srv 文件
與自定義 msg 文件類似,在工作目錄下創(chuàng)建 srv 目錄
在目錄下創(chuàng)建 xxx.srv 文件
例: 創(chuàng)建 addints.srv 文件
編寫代碼
其中首先編寫客戶端發(fā)送的數(shù)據(jù)類型
以 --- 作分割符牲平,區(qū)分客戶端和服務(wù)端處理的數(shù)據(jù)類型
編寫服務(wù)端處理發(fā)送的數(shù)據(jù)
#客戶端發(fā)送的數(shù)據(jù)
int32 num1
int32 num2
---
#服務(wù)端發(fā)送的數(shù)據(jù)
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 文件夾中可發(fā)現(xiàn)生成的中間文件 addints.h 頭文件等.
復(fù)制該地址唆涝,打開 c_cpp_properties.json 文件進(jìn)行添加 Path:
"/xxx/工作空間/devel/include/**"#根據(jù)自己的目錄自行填寫
服務(wù)端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("接收到的數(shù)據(jù)為%d,%d",num1,num2);
if(num1<0||num2<0) //判斷輸入數(shù)據(jù)是否合法
{
ROS_ERROR("請(qǐng)輸入兩個(gè)整數(shù)");
return false;
}
else{
int sum = num1+num2;
resp.sum = sum;
ROS_INFO("處理的結(jié)果為:%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("啟動(dòng)成功");
ros::spin(); //因?yàn)樾枰幚矶啻瓮严郏源颂幮枰猻pin返回
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("請(qǐng)輸入三個(gè)整數(shù)");
return 1;
}
ros::init(argc,argv,"client");
ros::NodeHandle nh;
ros::ServiceClient client = nh.serviceClient<server_client::addints>("addints");
ros::service::waitForService("addints"); //通過此函數(shù)可以保證服務(wù)端啟動(dòng)后再發(fā)送數(shù)據(jù)
server_client::addints ai; //組織信息傳送到服務(wù)端
ai.request.num1 = atoi(argv[1]);
ai.request.num2 = atoi(argv[2]);
bool flag = client.call(ai); //判斷數(shù)據(jù)是否已經(jīng)發(fā)送成功
if(flag)
{
ROS_INFO("數(shù)據(jù)處理成功萝究,結(jié)果為:%d",ai.response.sum);
}
else{
ROS_ERROR("數(shù)據(jù)處理失敗");
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啟動(dòng)ros核心
rosrun 功能包 服務(wù)端映射名
rosrun 功能包 客戶端映射名 num1 num2
Screenshot from 2022-06-07 18-35-59.png