提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
提示:学习的最好路径是通过项目不断的练习。
提示:以下是本篇文章正文内容,下面案例可供参考
一、自定义服务数据
创建srv文件夹,并且在文件夹中创建xx.srv文件(xx为自己填写名称)
示例:
bool a
---
string b
二、创建服务sever即回复Response
代码如下(示例):
#!/usr/bin/env python
# encoding: utf-8
import rospy
from std_msgs.msg import String
from hxt6832_h90.srv import htx, htxResponse
from hxt6832_h90.srv import htx, htxRequest
import serial
import struct
ser=serial.Serial("/dev/ttyUSB1",9600,timeout=0.5)
ser.isOpen()
def htx_temperature(req):
if req.a == 1:
ser.write([0x07,0x07,0xaa,0x55])
get_str = ser.readline() #读取串口数据,以换行符为结束
data = struct.unpack('%dB' % len(get_str),get_str)
temperature = (data[3] << 8 | data[2])/100.0 #将串口数据第4个左移8位并上第3个数据
example = String()
example.data = str(temperature)
#print("htx temperature is"% example)
else:
print ('failed request')
#example为字符串结构体,其中的data是字符串类型的数据。
#我们自定的消息类型是string的.
#所以我们要输出的是string类型数据,即example .data
return htxResponse(example.data)
def htx_server():
s = rospy.Service('htx_temperature', htx, htx_temperature)
rospy.init_node('temperature_server') #初始化节点
rate = rospy.Rate(20) #设置后面程序读取串口的频率
rospy.spin()
if __name__ == '__main__':
htx_server()
三、创建客户端client即请求Request
代码如下(示例):
#!/usr/bin/env python
# encoding: utf-8
import rospy
from std_msgs.msg import String
from hxt6832_h90.srv import htx, htxRequest
def htx_client():
rospy.init_node('temperature_client')
rospy.wait_for_service('htx_temperature')
try:
temperature_client = rospy.ServiceProxy('htx_temperature', htx)
response = temperature_client(1)
print(response.b)
return 0
except rospy.ServiceException, e:
print "Service call failed: %s"%e
if __name__ == '__main__':
htx_client()
总结
以下是应该改进的想法:
第一次写服务,对于串口的读取服务,应该是把计算的代码写在client而读取数据代码放在sever比较好。因为如果从client端读取的话,会一直在程序中循环。我们需要的需求是有一个从串口读取的方式,而只有当我们想要得到数据转换结果的时候它才计算。否则则会一直在sever中不断的计算。