ROS踩坑笔记3-基于海曼红外测温仪的服务请求与回复

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

提示:学习的最好路径是通过项目不断的练习。


提示:以下是本篇文章正文内容,下面案例可供参考

一、自定义服务数据

创建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中不断的计算。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值