python实现自定义服务srv
写在最前
此篇博客为vscode开发系列ros第9篇vscode开发ROS(9)-ROS服务通信机制(srv)的python实现版本, 请对照进行查看.
自定义服务
此处是直接采用第9篇中的, 自定义calRectArea.srv
服务, 具体过程, 请查看该篇, 此处不再赘述.
新建Server节点
1, 在scripts文件夹中, 新建pyCalRectAreaRes.py
文件.
2, 粘贴以下代码
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import rospy
from ros_test.srv import * #导入自定义服务
def calArea(req): #回调函数
#计算面积
rospy.loginfo("接受到一个请求,面积[%f]"%(req.w * req.h))#输出
return calRectAreaResponse(req.w * req.h)
def server():
rospy.init_node("rectAreaSrv") #初始化节点
s = rospy.Service("rectArea",calRectArea,calArea)#新建一个新的服务,服务类型calRectArea, 回调函数calArea
rospy.loginfo("Ready...") #准备OK
rospy.spin() #循环等待
if __name__ == '__main__':
try:
server()
except rospy.ROSInterruptException:
pass
新建Client节点
1, 在scripts文件夹中, 新建pyCalRectAreaReq.py
文件.
2, 粘贴以下代码
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import rospy
from ros_test.srv import * #导入自定义服务
def client():
rospy.wait_for_service("rectArea") #等待rectArea服务
cal = rospy.ServiceProxy("rectArea",calRectArea)#创建一个用于调用服务的句柄,可以像调用函数一样,调用句柄
try:
x = input("x:") #输入 x:
y = input("y:") #输入 y:
z = cal(float(x),float(y)) #调用服务,并获取值
print("面积为: [%f]"%z.s) #打印获取值
except rospy.ServiceException, e:
print "服务调用失败: %s"%e
if __name__ == '__main__':
try:
client()
except rospy.ROSInterruptException:
pass
3, 具体介绍请看注释, 同样比较简单.
4, 使用vscode的终端中cd命令,定位到pyCalRectAreaReq.py
,pyCalRectAreaRes.py
文件
cd src/ros_test/scripts/
5, 执行指令, 这一步是为了让pyCalRectAreaReq.py pyCalRectAreaRes.py
文件具有可执行权限, 不可缺少
chmod 0777 pyCalRectAreaReq.py pyCalRectAreaRes.py
运行Server和Client
1, 使用快捷键Ctrl + Shift + T 弹出系统终端,输入roscore
,启用整个ROS总节点。
2, 使用快捷键Ctrl + Shift + T 弹出系统终端,输入rosrun ros_test pyCalRectAreaRes.py
,启用talker节点。
3, 使用快捷键Ctrl + Shift + T 弹出系统终端,输入rosrun ros_test pyCalRectAreaReq.py
,启用listener节点,
后记
更多机器人, ROS相关,公-众-号搜索 ”机器人小站"。