1自定义服务数据
使用---将请求和应答分隔开,src下建立Add.srv文件
int64 a
int64 b
---
int64 sum
然后配置package.xml文件:加入:
<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>
配置Cmakelist.txt文件:
find_package(catkin REQUIRED COMPONENTS
geometry_msgs
roscpp
rospy
std_msgs
message_generation
)
add_service_files(
FILES
Add.srv
)
catkin_make编译。
2.编写server.cpp与client.cpp
#server.cpp
# include "ros/ros.h"
#include "ros_srv/Add.h"
bool add(ros_srv::Add::Request &req,ros_srv::Add::Response &res)
{
res.sum=req.a+req.b;
ROS_INFO("reauest: x=%ld,y=%ld",(long int)req.a,(long int)req.b);
ROS_INFO("response: %ld",(long int)res.sum);
return true;
}
int main(int argc, char * argv[])
{
ros::init(argc, argv, "add_server");
ros::NodeHandle n;
ros::ServiceServer service = n.advertiseService("add_two_ints", add);
ROS_INFO("ready to add");
ros::spin();
return 0;
}
# include "ros/ros.h"
#include "ros_srv/Add.h"
#include<cstdlib>
int main(int argc,char **argv)
{
ros::init(argc,argv,"client");
if (argc !=3)
{
ROS_INFO("usage: add_two_client x y");
return 1;
}
ros::NodeHandle n;
ros::ServiceClient client = n.serviceClient<ros_srv::Add>("add_two_ints");
ros_srv::Add srv;
srv.request.a=atoll(argv[1]);
srv.request.b=atoll(argv[2]);
if (client.call(srv))
{
ROS_INFO("sum:%d",(long int)srv.response.sum);
}
else{
ROS_ERROR("failed to call");
return 1;
}
return 0;
}
添加依赖
add_executable(server src/server.cpp)
add_executable(client src/client.cpp)
add_dependencies(server ${PROJECT_NAMsE}_gencpp)
add_dependencies(client ${PROJECT_NAME}_gencpp)
target_link_libraries(server ${catkin_LIBRARIES} )
target_link_libraries(client ${catkin_LIBRARIES} )
注意:最好在编译前source一下环境变量
source devel/setup.bash
编译成功。
roscore
rosrun ros_srv server
rosrun ros_srv client 3 5
即可看到结果。