ROS踩坑笔记2-基于海曼红外测温仪的消息发布与订阅

系列文章目录

提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
例如:第一章 Python 机器学习入门之pandas的使用


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


前言

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


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

1.红外测温仪通信参数获取

1.1串口查询16位指令格式

在这里插入图片描述

1.2安装cutecom

apt-get install cutecom

1.3使用cutecom步骤

step 1.输入命令行打开cutecom

cutecom

在这里插入图片描述
step 2.通过USB口连接红外测温仪
step 3.点击左上角的Device:右侧选项,选择USB口。此处为/dev/ttyUSB1。
step 4.勾选左下角的Hex output
step 5.点击右上角的Settings ,在Baudrate处设置波特率为9600(测温仪要求设置固定参数),其他为默认。
step 6.点击Open,在Input处输入0707aa55。则会显示9组16进制数。
到此准备工作结束

2.编写消息的发布与订阅

2.1编写发布者publisher

代码如下(示例):

#!/usr/bin/env python 
# encoding: utf-8
import rospy
from std_msgs.msg import String
import serial
#引入struct模块,主要是用unpack函数解码
import struct

#设置串口默认参数
ser=serial.Serial("/dev/ttyUSB1",9600,timeout=0.5)
#打开串口
ser.isOpen() 

#代码主要内容,主要是发送串口读取命令,接受串口输出,通过一些操作将其转换成10进制数。

#定义函数
def htx_pub():
    #初始化节点,节点名为htx_temperature,消息类型为String,queue_size是订阅者接受消息不够快的时候保留的消息的量
    pub = rospy.Publisher('htx_temperature', String, queue_size=10)
    #rospy.init_node(NAME, ...)把节点名告诉rospy,只有rospy掌握了这一信息后,才会开始与ROS主节点进行通信。  节点名为temperature。anonymous = True会让名称末尾添加随机数,来确保节点具有唯一的名称。
    rospy.init_node('temperature', anonymous=True)  
    #设置后面程序读取串口的频率    
    rate = rospy.Rate(20) 
    
    #主要处理数据部分
    #用于读取串口发来的数据
    
    #当rospy没有停止时
    while not rospy.is_shutdown():  
        #写入串口读取数据命令,4组16进制
        ser.write([0x07,0x07,0xaa,0x55])
        #读取串口数据,以换行符为结束
        get_str = ser.readline()  
        #解包数据、变成10进制数,固定用法
        data = struct.unpack('%dB' % len(get_str),get_str)
        #更据输出参数表。第3组数左移8位并上第2组数/100为温度
        temperature = (data[3] << 8 | data[2])/100.0
        #打印温度
        rospy.loginfo(temperature)
        #实例化字符串结构体
        data  = String()
        #赋值给实体数据
        data.data = str(temperature)
        #发布数据
        pub.publish(data)
        #rate.sleep()为rate类的休眠函数,可以使程序休眠;它在循环中可以用刚刚好的睡眠时间维持期望的速率
        rate.sleep()

if  __name__ == '__main__':
    htx_pub()
    try:
        pass
    except rospy.ROSInterruptException:
        pass   

在这里插入图片描述

2.2编写订阅者

代码如下(示例):

#!/usr/bin/env python
# encoding: utf-8
import rospy
from std_msgs.msg import String
def callback(data):
    rospy.loginfo( data.data)
def htx_sub():
    #初始化节点
    rospy.init_node('subscriber', anonymous=True)
    #定义订阅者
    rospy.Subscriber('htx_temperature', String, callback)
    #循环等待回调函数,rospy.spin()只是不让你的节点退出,直到节点被明确关闭。rospy.spin()不影响订阅者回调函数,因为它们有自己的线程。
    rospy.spin()
if __name__ == '__main__':
    htx_sub()

在这里插入图片描述


总结

1.python对格式要求较高,每4个空格为一个缩进。
2.串口获得的是字符串格式的数据流,我们需要解包得到10进制数
3.学习ros要多实践。
下节将是基于海曼红外测温仪的服务请求与发布。后续将会带来gmapping源码、amcl源码的详解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值