# 15.2 编写Client节点

## 15.2.1 The Code

在beginner\_tutorials包中创建scripts / add\_two\_ints\_client.py文件，并在其中粘贴以下内容：

```
#!/usr/bin/env python

import sys
import rospy
from beginner_tutorials.srv import *

def add_two_ints_client(x, y):
    rospy.wait_for_service('add_two_ints')
    try:
        add_two_ints = rospy.ServiceProxy('add_two_ints', AddTwoInts)
        resp1 = add_two_ints(x, y)
        return resp1.sum
    except rospy.ServiceException, e:
        print "Service call failed: %s"%e

def usage():
    return "%s [x y]"%sys.argv[0]

if __name__ == "__main__":
    if len(sys.argv) == 3:
        x = int(sys.argv[1])
        y = int(sys.argv[2])
    else:
        print usage()
        sys.exit(1)
    print "Requesting %s+%s"%(x, y)
    print "%s + %s = %s"%(x, y, add_two_ints_client(x, y))
```

不要忘记增加其可执行权限

```
$ chmod +x scripts/add_two_ints_client.py
```

## 15.2.2 The Code Explained

现在，让我们分解代码。调用服务的客户端代码也很简单。对于客户端，您不必调用init\_node（）。我们首先呼吁：

```
rospy.wait_for_service('add_two_ints')
```

这是一种方便的方法，可以阻止直到名为add\_two\_ints的服务可用。接下来我们创建一个调用服务的句柄：

```
add_two_ints = rospy.ServiceProxy('add_two_ints', AddTwoInts)
```

我们可以像使用普通函数一样使用这个句柄，并称之为：

```
resp1 = add_two_ints(x, y)
return resp1.sum
```

因为我们已经将服务的类型声明为AddTwoInts，所以它为您生成AddTwoIntsRequest对象（您可以自由传入）。返回值是一个AddTwoIntsResponse对象。如果调用失败，可能会抛出rospy.ServiceException，因此应该设置适当的try / except块。
