创建Ros服务
创建一个用于节点中的srv文件。
在包文件夹中创建一个srv文件夹,并在其中创建一个chapter2_srv.srv文件,并在其中添加以下命令行:
int32 A
int32 B
int32 sum
其中A和B是来自客户端的请求数据类型,sum是来自服务器的响应数据类型。
在package.xml中找到以下命令行并取消注释
<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>
这些命令行支持在ROS构建系统中配置消息和服务。此外需要在CMakeList.txt中添加一行代码如下:
find_package(catkin REQUIRED COMPONENTS
roscpp
std_msgs
message_generation
)
寻找到以下命令并取消注释,同时添加新的服务名称
add_service_files(
FILES
chapter2_srv.srv
)
generate_messages(
DEPENDENCIES
std_msgs
)
最后编译包:
$ cd ~/catkin_ws
$ catkin_make
检查是否正常:
$ rossrv show chapter2_turtleial/chapter2_srv
在src文件夹中编写cpp文件
example_3a.cpp
#include "ros/ros.h"
#include "chapter2_turtleial/chapter2_srv.h"
bool add(chapter2_turtleial::chapter2_srv::Request &req,
chapter2_turtleial::chapter2_srv::Response &res){
res.sum = req.A + req.B;
ROS_INFO("Request:A=%d,B=%d",(int)req.A,(int)req.B);
ROS_INFO("Response:[%d]",(int)res.sum);
return true;
}
int main(int argc, char **argv){
ros::init(argc,argv,"adder_server");
ros::NodeHandle n;
ros::ServiceServer service =
n.advertiseService("chapter2_turtleial/adder",add);
ROS_INFO("adder_server has started");
ros::spin();
return 0;
}
example_3b.cpp
#include "ros/ros.h"
#include "chapter2_turtleial/chapter2_srv.h"
#include <cstdlib>
int main(int argc, char **argv){
ros::init(argc,argv,"adder_client");
if(argc != 3){
ROS_INFO("Usage:adder_client A B");
return 1;
}
ros::NodeHandle n;
ros::ServiceClient client = n.serviceClient<chapter2_turtleial::chapter2_srv("chapter2_turtleial/adder");
chapter2_turtleial::chapter2_srv srv;
srv.request.A = atoll(argv[1]);
srv.request.B = atoll(argv[2]);
if(client.call(srv)){
ROS_INFO("Sum: %ld",(long int)srv.response.sum);
}
else{
ROS_ERROR("Failed to call service adder_server");
return 1;
}
return 0;
}
编辑CMakeList.txt文件
add_executable(example3a src/example_3a.cpp)
add_executable(example3b src/example_3b.cpp)
add_dependencies(example3a chapter2_turtleial_generate_messages_cpp)
add_dependencies(example3b chapter2_turtleial_generate_messages_cpp)
target_link_libraries(example3a ${catkin_LIBRARIES})
target_link_libraries(example3b ${catkin_LIBRARIES})
编译所有节点的包:
$ cd ~/catkin_ws/
$ catkin_make --pkg chapter2_turtleial
测试:
运行节点管理器:
$roscore
在其他终端中分别运行:
$ rosrun chapter2_turtleial example3a
$ rosrun chapter2_turtleial example3b
测试效果截图: