在ROS中,服务-客户机制通常涉及两个节点:一个是服务节点(服务提供方),另一个是客户端节点(服务请求方)。下面是一个简单的例子,其中服务用于将两个整数相加,并返回结果。
1. 定义服务类型(.srv
文件)
首先,我们需要定义服务的类型。假设我们有一个名为AddTwoInts.srv
的文件,内容如下:
int64 a
int64 b
……
int64 sum
这表示服务接收两个int64
类型的整数a
和b
作为输入,并返回一个int64
类型的整数sum
作为输出。
2. 创建服务节点(服务端)
在Python中,服务节点可能如下所示:
#!/usr/bin/env python
import rospy
from your_package.srv import AddTwoInts, AddTwoIntsResponse
def add_two_ints_server(req):
print("Returning [%s + %s = %s]"%(req.a, req.b, (req.a + req.b)))
return AddTwoIntsResponse(req.a + req.b)
def server():
rospy.init_node('add_two_ints_server')
s = rospy.Service('add_two_ints', AddTwoInts, add_two_ints_server)
print("Ready to add two ints.")
rospy.spin()
if __name__ == "__main__":
server()
3. 创建客户端节点(客户端)
同样,在Python中,客户端节点可能如下所示:
#!/usr/bin/env python
import rospy
from your_package.srv import AddTwoInts, AddTwoIntsResponse
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 as e:
print("Service call failed: %s"%e)
def client():
rospy.init_node('add_two_ints_client')
num1 = 124
num2 = 45
print("Requesting %s+%s"%(num1, num2))
print("Got %s"%add_two_ints_client(num1, num2))
if __name__ == "__main__":
client()
4. 使用示例
# 启动ROS核心(如果还没有运行):
roscore
# 运行服务节点(确保你的工作空间已经构建):
rosrun your_package add_two_ints_server.py
# 运行客户端节点(在另一个终端窗口中):
rosrun your_package add_two_ints_client.py
你应该能在客户端节点的输出中看到类似Requesting 124+45
和Got 169
这样的信息,这表示服务已经成功执行并返回了结果。
请注意,你需要将your_package
替换为你的ROS包的实际名称,并确保.srv
文件已经被正确地放置在包的srv
目录中,并且你的工作空间已经被构建(通过catkin_make
或colcon build
)。