ros如何编译python文件_ROS-编写简单的Service和Client (Python)

这篇初学者教程详细介绍了如何使用Python在ROS中创建服务(Server)节点和客户端(Client)节点,涉及创建加法服务,包括服务定义、服务处理函数、客户端调用服务的实现,并指导如何编译和运行这些节点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

描述:本教程介绍如何用python写一个服务器(Service)和客户端(Client)节点.

教程级别:初学者

目录

写一个服务器节点

代码

代码解释

写一个客户端节点

代码

代码解释

编译节点

1.写一个服务器节点(Service Node)

我们这里创建一个service节点(”add_two_ints_server”)可以接受两个int类型数据并返回他们的和。将目录更改为之前创建的beginner_tutorials的catkin workspace中:

roscd beginner_tutorials

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

1.1代码

在beginner_tutorials包中创建scripts/add_two_ints_server.py 文件,复制粘贴下面的代码:

#!/usr/bin/env python

from beginner_tutorials.srv import AddTwoInts,AddTwoIntsResponse

import rospy

def handle_add_two_ints(req):

print "Returning [%s + %s = %s]"%(req.a, req.b, (req.a + req.b))

return AddTwoIntsResponse(req.a + req.b)

def add_two_ints_server():

rospy.init_node('add_two_ints_server')

s = rospy.Service('add_two_ints', AddTwoInts, handle_add_two_ints)

print "Ready to add two ints."

rospy.spin()

if __name__ == "__main__":

add_two_ints_server()

不要忘记让节点可执行:

chmod +x scripts/add_two_ints_server.py

1.2代码解释

现在让我们逐步来解释代码。

使用rospy编写服务需要写的内容很少。我们使用init_node() 声明我们的节点,然后声明我们的服务:

s = rospy.Service('add_two_ints', AddTwoInts, handle_add_two_ints)

这里声明了新的service名add_two_ints和AddTwoInts服务类型。所有请求会传到handle_add_two_ints函数。调用handle_add_two_ints同时实例化AddTwoIntsRequest,并返回AddTwoIntsResponsea的实例。

与订阅器示例一样,rospy.spin()可以防止代码退出,直到服务关闭。

2.写一个客户端节点(Client Node)

2.1代码

在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

2.2代码解释

下面让我们逐步解释代码。

调用服务的client代码也很简单。对于client,您不必调用 init_node(),我们首先调用:

rospy.wait_for_service('add_two_ints')

这是块的方便方法,直到名为add_two_int的服务可用。接下来,我们创建一个用于调用服务的handle:

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

我们可以像普通函数一样使用这个handle,并称之为:

resp1 = add_two_ints(x, y)

return resp1.sum

因为我们已经声明了服务的类型为AddTwoInts,所以它为你生成AddTwoIntsRequest对象的工作(你可以自由地传递自己的对象)。返回的值为一个 AddTwoIntsResponse对象。如果调用失败,则可能会引发rospy.serviceException,因此您应该设置适当的try/except块。

3.编译节点

我们使用CMake作为我们的编译系统,是的你甚至必须将它用于python节点。确保自动生成消息和服务的python代码 已经创建。

进入catkin workspace然后运行catkin_make:

# In your catkin workspace

$ cd ~/catkin_ws

$ catkin_make

现在你已经学会如何编写简单的服务器 Service 和客户端 Client,开始测试简单的Service和Client吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值