利用Python批量处理路试采集的CAN原始数据,并计算报警总数及误报漏报次数,实现方法如下:
# *-* coding:utf8 *-*
from matplotlib import pyplot as plt
import numpy as np
import pandas as pd
import os
# 函数作用:将16进制字符串转换为16进制整型
def DecToHex(num):
result = str(hex(eval(num)))
return result
# 函数作用:在数据路径下(us_file_path)自动生成两个txt文件,存储左右报警数据
def CreatTxtFile(us_file_path):
pass
# 函数作用:遍历并获取某一文件夹下的数据名称
def GetFileFoderName(us_file_path):
fliename = os.listdir(us_file_path) #打开这个文件夹
return fliename
# 函数作用:将ASC数据中的时间戳和报警信号原始值做筛选后,写入新的txt文件中
def SellectSignal_to_TxtFile(us_file_path, ID1, ID2):
# 导入asc数据
data = open(us_file_path, "r")
readlines = data.readlines()
for line in readlines:
if line.__contains__(ID1):
message = np.array(line)
with open("./Data/BSD_WarningL.txt", "a") as BSD_WarningL:
BSD_WarningL.write(str(message))
if line.__contains__(ID2):
message = np.array(line)
with open("./Data/BSD_WarningR.txt", "a") as BSD_WarningR:
BSD_WarningR.write(str(message))
data.close()
def ReadSignal(us_file_path):
# 导入txt文件
rawData = pd.read_csv(us_file_path, header=None)
# 拆分字符串
data = rawData[0].str.split(' ', expand=True)
# 提取指定列--时间,BSD报警帧
data = pd.DataFrame(data, columns=[3, 24])
data = data[24]
return data
us_file_path = "./Data"
# 创建文本文件BSD_WarningL.txt,BSD_WarningR.txt
# CreatTxtFile(us_file_path)
filename = GetFileFoderName(us_file_path)
num = len(filename)
# 逐行读取,筛选报警报文对应字节
for i in range(2, num):
# 将路径和数据名称拼接:os.path.join()
path = os.path.join(us_file_path, filename[i])
SellectSignal_to_TxtFile(path, 'ID = 32', 'ID = 21')
print(path)
data_L = ReadSignal(os.path.join(us_file_path, 'BSD_WarningL.txt'))
data_R = ReadSignal(os.path.join(us_file_path, 'BSD_WarningR.txt'))
last_bsd_L = 0
bsd_warning_L = 0
count_L = 0
last_bsd_R = 0
bsd_warning_R = 0
count_R = 0
error = int(input("输入路试过程中功能误报次数:"))
# 统计左侧报警次数
for j in range(len(data_L)):
data_L[j] = '0x' + data_L[j] # 将16进制字符串拼接“0x”,便于数据格式转化
# data_temp_L = DecToHex(data_L[j])
data_temp_L = int(data_L[j], 16)
if ((data_temp_L & 0x08) == 0x08): # 计算报警信号置位时对应byte,与data[j]做与操作,判断报警
if (last_bsd_L == 0):
count_L = count_L + 1
last_bsd_L = 1
else:
pass
else:
last_bsd_L = 0
print("左侧报警总数为: %d 次" % count_L)
# 统计右侧报警次数
for k in range(len(data_R)):
data_R[k] = '0x' + data_R[k]
data_temp_R = DecToHex(data_R[k])
data_temp_R = int(data_R[k], 16)
if((data_temp_R & 0x10) == 0x10):
if(last_bsd_R == 0):
count_R = count_R + 1
last_bsd_R = 1
else:
pass
else:
last_bsd_R = 0
print("右侧报警总数为: %d 次" % count_R)
num_total = count_L+count_R
error_frequent = (error/num_total)*100
print("报警总数为 %d 次,误报率为: %.2f%%" % (num_total, error_frequent))
输出结果如下: