在汽車開發作業程序中,需要經常對總線報文進行決議,并生成曲線做資料分析,定位以及對比,本文以車速報文為例,在不依托vector及其他CAN分析上位機的條件下,基于python工具對CAN報文進行決議,最侄訓制信號折線圖,
代碼如下:
# *-* coding:utf8 *-*
from matplotlib import pyplot as plt
import numpy as np
import pandas as pd
# 函式作用:將ASC資料中的時間戳和車速信號原始值做篩選后,寫入新的txt檔案中
def SellectSignal_to_TxtFile(us_file_path, ID):
# 匯入asc資料
data = open(us_file_path, "r")
readlines = data.readlines()
for line in readlines:
if line.__contains__(ID):
message = np.array(line)
with open("./Speed.txt", "a") as speed:
speed.write(str(message))
data.close()
# 函式作用:將新的txt檔案中資料進行處理,拼接,保留時間戳和車速hex值
def ReadSignal(us_file_path):
# 匯入txt檔案
rawData = pd.read_csv(us_file_path, header=None)
# 拆分字串
data = rawData[0].str.split(' ', expand=True)
# 提取指定列--時間,車速
data = pd.DataFrame(data, columns=[0, 10, 11])
# 修改列名--時間,速度低位,速度高位
data.columns =['time', 'speed_l', 'speed_h']
# 將兩列速度串列拼接為speed原始值
data['speed'] = data['speed_h'] + data['speed_l']
# 保留時間和速度資訊
data = pd.DataFrame(data, columns=['time', 'speed'])
# 將速度字串資料轉化為10進制資料
data['speed'] = data['speed'].apply(lambda x: int(x, 16))
# 將時間串列資料型別由object --> float64
data['time'] = pd.to_numeric(data['time'], errors='coerce')
return data
# 函式作用:根據offset和factor,計算車速物理值
def CalculatePhyValue(data, offset, factor):
# 求速度物理值
data['speed'] = (data['speed'] * factor) - offset
# 保留兩位小數
# data['speed'] = data['speed'].apply(lambda x: format(x, '.2'))
# data['time'] = data['time'].apply(lambda x: format(x, '.2'))
pd.set_option('display.float_format', lambda x: '%.2f' % x)
return data
# 根據采樣周期設定采樣率,適當的步進長度顯示報文的實際值與時間關系折線圖
def plotFigure(data, CycleTimer):
# 設定中文字體
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 根據報文周期取步長
step = int((1/CycleTimer) * 1000)
# 設定x和y,并取步長
x = data['time'][::step]
y = data['speed'][::step]
# 設定圖形大小
plt.figure(figsize=(12, 6), dpi=80)
# 繪圖
plt.plot(x, y, color='red') # 注意:需要添加圖例才能顯示label
# 設定x軸刻度
_xtick_labels = range(int(len(x)))[::3]
plt.xticks(x[::3], _xtick_labels, rotation=45)
# 添加描述資訊
plt.xlabel("時間 單位(s)", fontsize=12)
plt.ylabel("車速 單位(km/h)", fontsize=12)
plt.title("車速與時間關系折線圖", fontsize=20)
# 繪制網格
plt.grid(alpha=0.4, linestyle='-.') # 設定網格的透明度
# # 添加圖例
# plt.legend(loc="upper left") # 通過查看legend方法原始碼修改圖例位置
# 保存圖片
plt.savefig("./Speed.png")
# 展示影像
plt.show()
# 主函式
if __name__ == '__main__':
# 原始資料路徑/資料名,需要篩選的報文ID
SellectSignal_to_TxtFile("./left_can_alarm.asc", '11a')
# 篩選后的資料寫入txt檔案
speed = ReadSignal("./Speed.txt")
# 輸入報文offset, factor
CalculatePhyValue(speed, 0, 0.001625) # 設定CAN資料的offset, factor資訊
# 輸入報文周期(ms)
plotFigure(speed, 5) # 報文周期5ms
資料篩選后效果

繪圖效果:
以上資料和作圖僅供參考,可在評論區交流!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/394132.html
標籤:AI
上一篇:帶你玩轉云服務器
