C++实现Server端

Server端实现流程

1. 初始化ROS,创建节点

1
2
ros::init(argc, argv, nodeName);
ros::NodeHandle node;

2. 通过节点创建Server端

Tip

此处重点是serviceNameservcieName的格式为/xx/xx,用网址分隔符隔开,可以有多个级别的深度。

3. 实现server端服务的业务逻辑

Tip

回调的返回结果为bool类型,如果结果为true,说明对于客户端的请求处理正常的执行了,并且返回了有效的结果. 如果为false说明对于客户端的请求没有正常执行,通常原因是客户端的数据不合理。

完整实例代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>
#include "ros/ros.h"

#include "roscpp_tutorials/TwoInts.h"

using namespace std;

bool callback(roscpp_tutorials::TwoInts::Request &request, roscpp_tutorials::TwoInts::Response &response) {
  //获取请求数据
  long a = request.a;
  long b = request.b;

  //设置响应数据
  response.sum = a + b;

  return true;
}

int main(int argc, char **argv) {
  //初始化节点
  string nodeName = "cpp_server_node";
  ros::init(argc, argv, nodeName);
  //创建节点
  ros::NodeHandle node;

  //创建Service Server
  string serviceName = "my_service";
  const ros::ServiceServer &server = node.advertiseService(serviceName, callback);

  //阻塞
  ros::spin();
  return 0;
}

调试server端

调试server端主要是查看server端是否能接收到请求,并根据请求数据处理相应的业务逻辑,然后返回处理好的结果。

在这里,我们只需要模拟client端发送请求就可以了。

ROS提供了命令行工具和图形化工具供我们调试开发。

1. rosservice命令行调试

通过rosservice list命令可以帮助我们查询出当前运行的所有service

1
rosservice list

查询的结果中,我们可以得到对应的服务名称/demo_service/add_tow_int

通过查询的服务名称,来调用此服务

1
rosservice call /demo_service/add_tow_int "a:1 b:3"

Tip

rosservice call负责调用service。第一个参数是要调用的service的名称,后面的参数是调用时需要传入的参数。

2.rqt_service_caller工具调试

通过命令呼出工具

1
rosrun rqt_service_caller rqt_service_caller