系列文章目录
提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
例如:第一章 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源码的详解。