Server端实现流程
1. 初始化ROS,创建节点
ros::init(argc, argv, nodeName);
ros::NodeHandle node;
2. 通过节点创建Server端
const ros::ServiceServer &server = node.advertiseService(serviceName, callback);
此处重点是serviceName
,servcieName
的格式为/xx/xx
,用网址分隔符隔开,可以有多个级别的深度。
3. 实现server端服务的业务逻辑
bool callback(roscpp_tutorials::TwoIntsRequest &request, roscpp_tutorials::TwoIntsResponse &response) {
// 运算逻辑
response.sum = request.a + request.b;
return true;
}
完整实例代码
#include "ros/ros.h"
#include <iostream>
#include "roscpp_tutorials/TwoInts.h"
using namespace std;
bool callback(roscpp_tutorials::TwoIntsRequest &request, roscpp_tutorials::TwoIntsResponse &response) {
// 运算逻辑
response.sum = request.a + request.b;
return true;
}
int main(int argc, char **argv) {
string nodeName = "cppservice";
string serviceName = "/demo_service/add_tow_int";
// 创建节点
ros::init(argc, argv, nodeName);
ros::NodeHandle node;
// 创建服务端
const ros::ServiceServer &server = node.advertiseService(serviceName, callback);
//阻塞
ros::spin();
return 0;
}
调试server端
调试server端
主要是查看server端
是否能接收到请求,并根据请求数据处理相应的业务逻辑,然后返回处理好的结果。
在这里,我们只需要模拟client端
发送请求就可以了。
ROS提供了命令行工具和图形化工具供我们调试开发。
1. rosservice命令行调试
通过rosservice list
命令可以帮助我们查询出当前运行的所有service
rosservice list
查询的结果中,我们可以得到对应的服务名称/demo_service/add_tow_int
通过查询的服务名称,来调用此服务
rosservice call /demo_service/add_tow_int "a:1 b:3"
rosservice call
负责调用service。第一个参数是要调用的service的名称,后面的参数是调用时需要传入的参数。
2.rqt_service_caller工具调试
通过命令呼出工具
rosrun rqt_service_caller rqt_service_caller