概述
使用python读取arduino串口发送的旋转编码器数据,去除换行和回车符号“\n\t",并解析bytes,转化为数组。激光雷达的数据是字典类型,我们还需要将其转换成DataFrame格式的数据,运用pandas库处理数据。
1.1 串口读取旋转编码数据的格式
1. 2.原来代码如下
# E:\Anaconda3\python.exe
# -*- coding: utf-8 -*-
import serial
serialPort = "COM7" # 串口
baudRate = 115200 # 波特率
ser = serial.Serial(serialPort, baudRate, timeout=0.5)
print("参数设置:串口=%s ,波特率=%d" % (serialPort, baudRate))
while 1:
line = ser.readline()
print(line)
ser.close()
1.3 去除换行符号和回车符号
代码如下:
# E:\Anaconda3\python.exe
# -*- coding: utf-8 -*-
import serial
serialPort = "COM7" # 串口
baudRate = 115200 # 波特率
ser = serial.Serial(serialPort, baudRate, timeout=0.5)
print("参数设置:串口=%s ,波特率=%d" % (serialPort, baudRate))
while 1:
line = ser.readline()
line = line.strip()
print(line)
ser.close()
主要在其中加了:line = line.strip()
拓展:Python strip() 方法用于移除字符串头尾指定的字符(默认为空格)或字符序列。
注意:该方法只能删除开头或是结尾的字符,不能删除中间部分的字符。
strip()方法语法:str.strip([chars])
参数:chars – 移除字符串头尾指定的字符序列
执行的效果图:
其中" b‘ ’"在python中表示这数据是<class ‘bytes’>
1.4 将bytes转化为int型
我一开始找bytes直接转化为int的方法试了好多种都没成功,由于自己初学,经验不足,后期再试试,然后再补充。那么这次试验是先将bytes转化为str,然后运用int(str)转化为int型数据。
代码如下:
# -*- coding: utf-8 -*-
import serial
import numpy as np
import string
serialPort = "COM7" # 串口
baudRate = 115200 # 波特率
ser = serial.Serial(serialPort, baudRate, timeout=0.5)
print("参数设置:串口=%s ,波特率=%d" % (serialPort, baudRate))
while 1:
line = ser.readline()
line = line.strip()
str_line = line.decode('utf-8')
print(str_line)
print(type(str_line))
ser.close()
执行效果:
1.5 串口读取的旋转编码器的数据要转换为数组
因为自己实验的需求,需要将旋转编码器的数据转化成648行1列的数组。为了后期与激光雷达的数据合并一起进行处理分析。
代码如下:
# E:\Anaconda3\python.exe
# -*- coding: utf-8 -*-
import serial
import numpy as np
serialPort = "COM7" # 串口可以根据自己情况改动
baudRate = 115200 # 波特率可以根据自己情况改动
ser = serial.Serial(serialPort, baudRate, timeout=0.5)
print("参数设置:串口=%s ,波特率=%d" % (serialPort, baudRate))
array_one = np.ones([648, 1])
while 1:
line = ser.readline()
line = line.strip()
str_line = line.decode('utf-8')
num_line = int(str_line)
print(str_line)
array_serial = array_one*num_line
print(array_serial)
print(type(str_line))
ser.close()
效果如下:
2.激光雷达的数据从字典转化为DataFrame格式
2.1 将字典的key,value分别作为dataframe两列
数据格式如下:
将字典转换成Series,将Series转换成dataframe,并将dataframe的索引设为id列。
代码如下:
import serial
import hokuyo
import serial_port
import pandas as pd
uart_port = 'COM14'
uart_speed = 115200
if __name__ == '__main__':
laser_serial = serial.Serial(port=uart_port, baudrate=uart_speed, timeout=0.5)
port = serial_port.SerialPort(laser_serial)
laser = hokuyo.Hokuyo(port)
print('laser_on(): ')
print(laser.laser_on())
print(laser.get_single_scan())
dict1 = laser.get_single_scan()
dict2 = pd.DataFrame(pd.Series(dict1), columns=['distance'])
dict2 = dict2.reset_index().rename(columns={'index': 'angle'})
print(dict2.head(648))
注意:一个key只有一个value的字典如果直接转化成数据框会报错。
执行效果如下:
2.2 pandas概述
DataFrame就是excel表格
等于mysql中的table
Series是一列
DataFrame是多列
DataFrame公用同一索引
DataFrame的创建
pandas操作函数的对应表:
总结
后期将激光雷达的数据和旋转编码器的数据连接成一个DataFrame,进行数据的处理运算。