ROS机器人005-ROS通信编程(服务编程)
原创
©著作权归作者所有:来自51CTO博客作者蒋程扬的部落格的原创作品,请联系作者获取转载授权,否则将追究法律责任
一,基本步骤
和话题通讯的步骤基本一样:

二,服务端环境构造
这路我们实现客户端给服务端发送两个数字,服务端相加得结果发给客户端
1,定义srv文件
在功能包目录下创建srv目录

在目录下创建srv文件:

写文件内容:
其中三个横杠---
前面的代表客户端请求的数据,后面的代表服务端要发送给客户端的应答数据
int64 a
int64 b
---
int64 sum

2,在package.xml中添加功能依赖
<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>
3,在CmakeList中添加编译选项
• find_package( …… message_generation)
• catkin_package(CATKIN_DEPENDS geometry_msgs roscpp rospy std_msgs message_runtime)
• add_service_files(FILES AddTwoInts.srv)
4,编译,生成相关头文件
在工作空间根目录下编译:

三,实现服务端的代码实现
**1,初始化ROS结点 **
ros::init(argc,argv,"add_two_ints_server");
2,创建结点句柄
//创建结点字柄
ros::NodeHandle n;
3,创建Server实例
//创建一个名为add_two_ints的server,注册回调函数add()
ros::ServiceServer service = n.advertiseService("add_two_ints",add);
4,在回调函数中处理信息
bool add(learing_communication::AddTwoints::Request &req,
learing_communication::AddTwoints::Response &res
)
{
//获取客户端的请求参数并相加
res.sum=req.a+req.b;
ROS_INFO("request:x=%d,y=%d",(long int)req.a,(long int)req.b);
ROS_INFO("sum:%d",(long int)res.sum);
}
5,完整代码
#include "ros/ros.h"
//添加服务端文件 头文件
#include "learing_communication/AddTwoints"
bool add(learing_communication::AddTwoints::Request &req,
learing_communication::AddTwoints::Response &res
)
{
//获取客户端的请求参数并相加
res.sum=req.a+req.b;
ROS_INFO("request:x=%d,y=%d",(long int)req.a,(long int)req.b);
ROS_INFO("sum:%d",(long int)res.sum);
}
int main(int argc,char **argv)
{
//初始化ros结点
ros::init(argc,argv,"add_two_ints_server");
//创建结点字柄
ros::NodeHandle n;
//创建一个名为add_two_ints的server,注册回调函数add()
ros::ServiceServer service = n.advertiseService("add_two_ints",add);
//打印日志信息
ROS_INFO("Read_two_ints:");
//循环等待回调函数
ros::spin();
return 0;
}
四,实现一个客户端
1,初始化Ros结点
ros::init(argc,argv,"client");
2,创建ROS结点句柄
3,创建client
//创建一个client,用于发生信息
//server支持的消息类型是learning_communication::AddTwoints
ros::ServiceClient client = n.serviceClient<learing_communication::AddTwoints
4,创建learing_communicationL::AddTwoints类型的数据
learing_communication::AddTwoints data;
data.request.a = atoll(argc[1]);
data.request.b = atoll(argc[1]);
5,发布数据,并等待应答结果
if (client.call(data)){
ROS_INFO("sum is:%d",(long int)srv.response.sum);
}
6,完整代码
#include "ros/ros.h"
//添加服务端文件 头文件
#include "learing_communication/AddTwoints.h"
bool add(learing_communication::AddTwoints::Request &req,
learing_communication::AddTwoints::Response &res
)
{
//获取客户端的请求参数并相加
res.sum=req.a+req.b;
ROS_INFO("request:x=%d,y=%d",(long int)req.a,(long int)req.b);
ROS_INFO("sum:%d",(long int)res.sum);
}
int main(int argc,char **argv)
{
//初始化ros结点
ros::init(argc,argv,"add_two_ints_server");
//创建结点字柄
ros::NodeHandle n;
//创建一个名为add_two_ints的server,注册回调函数add()
ros::ServiceServer service = n.advertiseService("add_two_ints",add);
//打印日志信息
ROS_INFO("Read_two_ints:");
//循环等待回调函数
ros::spin();
return 0;
}
五,编译工作空间

add_executable(server src/server.cpp)
target_link_libraries(server ${catkin_LIBRARIES})
add_dependencies(server ${PROJECT_NAME}_gencpp)
add_executable(client src/client.cpp)
target_link_libraries(client ${catkin_LIBRARIES})
add_dependencies(client ${PROJECT_NAME}_gencpp)

回到根目录开始编译:

六,测试
启动服务端
rosrun learing_communication server

启动客户端:
rosrun learing_communication client 1 3
结果:
发现发给服务端的两个数被相加后返回
