ROS编写简单的Service和Client (Python)


写一个学习笔记方便自己以后回查


写一个服务节点

我们写一个服务节点,请求两个int, 返回这两个int的和

roscd beginner_tutorials

在此之前请确保你搞过之前那个srv文件和msg文件的教程

源码

scripts/add_two_ints_server.py 文件下粘贴上下面的源码

#!/usr/bin/env python

from __future__ import print_function

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()

#!/usr/bin/env python

from future import print_function

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 as 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:#!/usr/bin/env python

from future import print_function

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 as 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)))
print(usage())
sys.exit(1)
print(“Requesting %s+%s”%(x, y))
print("%s + %s = %s"%(x, y, add_two_ints_client(x, y)))最后别忘了改变py文件的执行权限

scripts/add_two_ints_server.py 

并且在CMakeLists.txt里增加修改代码片段如下

catkin_install_python(PROGRAMS scripts/add_two_ints_server.py
  DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)

代码的解释在下面注释

#!/usr/bin/env python

from __future__ import print_function

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')      # 初始化这个节点名字叫 add_two_ints_server
    s = rospy.Service('add_two_ints', AddTwoInts, handle_add_two_ints) # 运行一个服务
                                                # 名字叫 add_two_ints  接收参数为AddTwoInts,执行
                                                # handle_add_two_ints()
    print("Ready to add two ints.")
    rospy.spin()

if __name__ == "__main__":
    add_two_ints_server()

写一个客户端节点

源码

scripts/add_two_ints_client.py 文件下粘贴上下面的源码:

#!/usr/bin/env python
from __future__ import print_function

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 as 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)))

最后别忘了改变py文件的执行权限

scripts/add_two_ints_client.py 

并且在CMakeLists.txt里增加修改代码片段如下

catkin_install_python(PROGRAMS scripts/add_two_ints_server.py /script/add_two_ints_server.py
  DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)

测试自己写的服务端和客户端节点

  1. 先setup 工作空间
    在这里插入图片描述
  2. catkin_make编译

在这里插入图片描述

  1. rosrun beginner_tutorials add_two_ints_server.py 确认代码执行成功,启动服务节点
  2. 在这里插入图片描述
    这里要你启动rosmaster, 那么我们新终端启动核心 roscore

在这里插入图片描述
它就ready 了
在这里插入图片描述

  1. 新终端rosrun beginner_tutorials add_two_ints_client.py 确认代码执行成功,启动客户端节点
    在这里插入图片描述

  2. rosrun beginner_tutorials add_two_ints_client.py 4 5 发送请求
    在这里插入图片描述

  3. 查看客户端接受到请求

在这里插入图片描述

  1. 查看服务端表示响应了请求

在这里插入图片描述

参考文献

ROS官方教程

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,我会尽力回答你的问题。 首先,你需要安装ROS和相关的依赖库。然后,你需要创建一个ROS包并在其中创建一个Python节点,用于发布小车的多点导航指令。 以下是一个简单Python代码示例,可用于发布小车的多点导航指令: ```python #!/usr/bin/env python import rospy from move_base_msgs.msg import MoveBaseAction, MoveBaseGoal import actionlib waypoints = [ [(0.0, 0.0, 0.0), (0.0, 0.0, 0.0, 1.0)], # waypoint 1 [(1.0, 2.0, 0.0), (0.0, 0.0, 0.707, 0.707)], # waypoint 2 [(2.0, -1.0, 0.0), (0.0, 0.0, 0.0, 1.0)] # waypoint 3 ] def move_to_goal(x, y, theta): # Create a MoveBaseGoal message goal = MoveBaseGoal() goal.target_pose.header.frame_id = "map" goal.target_pose.pose.position.x = x goal.target_pose.pose.position.y = y goal.target_pose.pose.orientation.z = theta goal.target_pose.pose.orientation.w = 1.0 # Send the goal to the MoveBaseAction server client.send_goal(goal) client.wait_for_result() if __name__ == '__main__': rospy.init_node('multi_point_navigation') client = actionlib.SimpleActionClient('move_base', MoveBaseAction) client.wait_for_server() for waypoint in waypoints: x, y, theta = waypoint[0][0], waypoint[0][1], waypoint[1][2] move_to_goal(x, y, theta) rospy.spin() ``` 在此示例中,我们使用`move_base_msgs`和`actionlib`库来发布多点导航指令。首先,我们定义了一个包含我们的导航点的列表`waypoints`。然后,我们定义了一个`move_to_goal`函数,该函数将一个导航点发送到MoveBaseAction服务器。最后,我们在`main`函数中循环遍历所有的导航点,调用`move_to_goal`函数来依次导航小车。 请注意,这只是一个简单的示例代码,你需要根据你的具体应用场景进行修改和优化。 希望我的回答能够帮到你,如果你还有其他问题,请随时提出。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值