概述

使用python读取arduino串口发送的旋转编码器数据,去除换行和回车符号“\n\t",并解析bytes,转化为数组。激光雷达的数据是字典类型,我们还需要将其转换成DataFrame格式的数据,运用pandas库处理数据。

1.1 串口读取旋转编码数据的格式

python激光雷达 python读取激光雷达数据_串口数据

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 – 移除字符串头尾指定的字符序列

执行的效果图:

python激光雷达 python读取激光雷达数据_python激光雷达_02


其中" 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()

执行效果:

python激光雷达 python读取激光雷达数据_python激光雷达_03

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()

效果如下:

python激光雷达 python读取激光雷达数据_旋转编码器_04

2.激光雷达的数据从字典转化为DataFrame格式

2.1 将字典的key,value分别作为dataframe两列

数据格式如下:

python激光雷达 python读取激光雷达数据_python激光雷达_05


将字典转换成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的字典如果直接转化成数据框会报错。

执行效果如下:

python激光雷达 python读取激光雷达数据_旋转编码器_06

2.2 pandas概述

DataFrame就是excel表格
等于mysql中的table
Series是一列
DataFrame是多列
DataFrame公用同一索引

DataFrame的创建

python激光雷达 python读取激光雷达数据_python激光雷达_07

pandas操作函数的对应表:

python激光雷达 python读取激光雷达数据_python激光雷达_08

总结

后期将激光雷达的数据和旋转编码器的数据连接成一个DataFrame,进行数据的处理运算。