# 14.1 编写Service节点

这里，我们将创建一个简单的service节点("add\_two\_ints\_server")，该节点将接收到两个整形数字，并返回它们的和。

进入先前你在`catkin workspace`教程中所创建的`beginner_tutorials`包所在的目录：

```
cd ~/catkin_ws/src/beginner_tutorials
```

请确保已经按照creating the AddTwoInts.srv教程的步骤创建了本教程所需要的srv（确保选择了对应的编译系统“catkin”和“rosbuild”）。

## 14.1.1 代码

在beginner\_tutorials包中创建src/add\_two\_ints\_server.cpp文件，并复制粘贴下面的代码：

```
#include "ros/ros.h"
#include "beginner_tutorials/AddTwoInts.h"

bool add(beginner_tutorials::AddTwoInts::Request  &req,
         beginner_tutorials::AddTwoInts::Response &res)
{
  res.sum = req.a + req.b;
  ROS_INFO("request: x=%ld, y=%ld", (long int)req.a, (long int)req.b);
  ROS_INFO("sending back response: [%ld]", (long int)res.sum);
  return true;
}

int main(int argc, char **argv)
{
  ros::init(argc, argv, "add_two_ints_server");
  ros::NodeHandle n;

  ros::ServiceServer service = n.advertiseService("add_two_ints", add);
  ROS_INFO("Ready to add two ints.");
  ros::spin();

  return 0;
}
```

## 14.1.2 代码解释

现在，让我们来逐步分析代码。

```
#include "ros/ros.h"
#include "beginner_tutorials/AddTwoInts.h"
```

`beginner_tutorials/AddTwoInts.h`是由编译系统自动根据我们先前创建的srv文件生成的对应该srv文件的头文件。

```
bool add(beginner_tutorials::AddTwoInts::Request  &req,
         beginner_tutorials::AddTwoInts::Response &res)
```

这个函数提供两个int值求和的服务，int值从request里面获取，而返回数据装入response内，这些数据类型都定义在srv文件内部，函数返回一个boolean值。

```
{
  res.sum = req.a + req.b;
  ROS_INFO("request: x=%ld, y=%ld", (long int)req.a, (long int)req.b);
  ROS_INFO("sending back response: [%ld]", (long int)res.sum);
  return true;
}
```

现在，两个int值已经相加，并存入了response。然后一些关于request和response的信息被记录下来。最后，service完成计算后返回true值。

```
ros::ServiceServer service = n.advertiseService("add_two_ints", add);
```

这里，service已经建立起来，并在ROS内发布出来。
