使用Python处理ADC激光测距数据并绘制为图片(二)

news2024/10/6 4:08:13

使用Python处理ADC激光测距数据并绘制为图片

  • 说明
  • 一、定义全局变量变
  • 二、保存和清空原始数据
  • 三、拆分原始数据为键值对
  • 四、获取标题、FigText、更新统计信息文件
  • 五、生成图片
  • 六、处理原始数据文件
  • 七、主函数入口
  • 八、测试结果

说明

1. 主要是将ADC激光测距叠加后的1024Byte数据绘制为图片,便于直观的分析与观察

一、定义全局变量变


import os
import shutil

import matplotlib.pyplot as plt

# 原始数据
OrgDataDir = 'DataHandlerDir' #原始数据目录
OrgDataName = 'COM3-115200-2023-08-03-14-22-49-650m' #原始文件名称
OrgDataExtension = '.log' #原始文件拓展名
OrgDataFullDirNameExt = OrgDataDir + '/' + OrgDataName + OrgDataExtension #全路径
OrgDataFilesGroup = list()

# 处理后数据
CreatDataFatherDir = 'ImageCreatDir' #目录
CreatDataDir = OrgDataName
CreatDataName = OrgDataName
CreatDataExtension = '.txt' #统计文件扩展名
CreatDataNameExtension = CreatDataName + CreatDataExtension
CreatDataImageFullDir = CreatDataFatherDir + '/' + CreatDataDir
CreatDataStaFullDirNameExt = CreatDataFatherDir + '/' + CreatDataDir + '/' + CreatDataName + CreatDataExtension

# FigText序号范围
FigTextStartIndex = 1024
FigTextEndIndex = 1030

# 峰值及索引
OrgDataPeakValue = 0  # 峰值
OrgDataPeakIndex = 0  # 峰值索引
OrgDataPeakValue50 = 0  # 峰值50%
OrgDataPeakValue60 = 0  # 峰值60%
OrgDataPeakIndexGap = 50  # 峰值索引间隔
OrgDataPeakIndexLeft = 0  # 峰值索引左值
OrgDataPeakIndexRigth = 0  # 峰值索引右值

AtcDataHeaderStr = '[0000]'  # 有效数据头
OrgDataValSize = 1024  # ADC数据项大小
OrgDataMemory = {}  # 原始数据缓存
UpdateImageCount = 0  # 图片计数
AxisX = list()  # 横坐标
AxisY = list()  # 纵坐标

二、保存和清空原始数据


# 保存原始数据
def Store_OrgData_KeyVal(key, val):
    global OrgDataMemory
    OrgDataMemory[key] = val


# 清空原始数据缓存
def Clear_OrgData_Memory():
    global OrgDataMemory
    global AxisX
    global AxisY
    global OrgDataPeakValue
    global OrgDataPeakIndex
    global OrgDataPeakValue60
    global OrgDataPeakValue50
    global OrgDataPeakIndexLeft
    global OrgDataPeakIndexRigth
    global UpdateImageCount

    OrgDataMemory.clear()
    AxisX.clear()
    AxisY.clear()
    OrgDataPeakValue = 0
    OrgDataPeakIndex = 0
    OrgDataPeakValue60 = 0
    OrgDataPeakValue50 = 0
    OrgDataPeakIndexLeft = 0
    OrgDataPeakIndexRigth = 0
    

三、拆分原始数据为键值对


# 拆分键值对
def Split_OrgData_KeyVal():
    global OrgDataMemory
    global OrgDataPeakValue
    global OrgDataPeakIndex
    global OrgDataPeakValue50
    global OrgDataPeakValue60
    global OrgDataPeakIndexGap
    global OrgDataPeakIndexLeft
    global OrgDataPeakIndexRigth
    global AxisX
    global AxisY

    i = 0
    peakVal = 0
    for xKey, yVal in OrgDataMemory.items():
        AxisX.append(int(xKey))
        AxisY.append(int(yVal))

        # 寻找峰值及索引
        peakVal = int(yVal)
        if peakVal > OrgDataPeakValue:
            OrgDataPeakValue = peakVal
            OrgDataPeakIndex = int(xKey)

        i += 1
        if i >= OrgDataValSize:
            OrgDataPeakValue60 = OrgDataPeakValue * 0.6  # 峰值50%
            OrgDataPeakValue50 = OrgDataPeakValue * 0.5  # 峰值60%

            # 峰值左间隔
            OrgDataPeakIndexLeft = OrgDataPeakIndex - OrgDataPeakIndexGap
            if OrgDataPeakIndexLeft < 0:
                OrgDataPeakIndexLeft = 0

            # 峰值右间隔
            OrgDataPeakIndexRigth = OrgDataPeakIndex + OrgDataPeakIndexGap
            if OrgDataPeakIndexRigth > OrgDataValSize - 1:
                OrgDataPeakIndexRigth = OrgDataValSize - 1
            return
            

四、获取标题、FigText、更新统计信息文件


# 获取FigText
def GetFigText():
    global OrgDataMemory
    global FigTextStartIndex
    global FigTextEndIndex

    resStr = ''
    for i in range(FigTextStartIndex, FigTextEndIndex + 1):
        txt = OrgDataMemory[str(i)]
        resStr += txt + '\n'

    # print("GetFigText:", resStr)
    return resStr


# 获取标题
def GetTitleText():
    global OrgDataPeakIndex
    global OrgDataPeakIndexLeft
    global OrgDataPeakIndexRigth
    global OrgDataPeakValue

    resStr = "xCenter:%s  xLeft:%s  xRight:%s  Peak:%s" % ( \
        str(OrgDataPeakIndex), \
        str(OrgDataPeakIndexLeft), \
        str(OrgDataPeakIndexRigth), \
        str(OrgDataPeakValue))
    # print("TitleText:", resStr)
    return resStr


# 获取图片名称
def Get_Image_Name():
    global OrgDataMemory
    global FigTextEndIndex

    txtStr = str(OrgDataMemory[str(FigTextEndIndex)])
    index = txtStr.find('Gears:')
    if index != -1:
        name = txtStr[index:].strip().replace(':', '').replace(' ', '-')
    else:
        name = 'Gears0-Superpos0-Dist0dm'
    picName = str(OrgDataMemory[str(FigTextEndIndex + 1)]) + '-' + name
    return picName


# 更新统计信息
def Update_StaInfo(staFileFullName, txt):
    global OrgDataPeakValue

    with open(staFileFullName, 'a+', encoding='utf-8') as file:
        # strTxt = '[{}]  '.format(int(UpdateImageCount)) + txt
        strTxt = '[%04u] ' % UpdateImageCount + txt
        resTxt = strTxt + " ==> Peak:" + str(OrgDataPeakValue) + "\n"
        file.write(resTxt)
        print(resTxt, end='')
        

五、生成图片

# 生成图片
def OrgData_CreateImage(staFileDir, staFileFullName):
    global AxisX
    global AxisY
    global OrgDataPeakIndex
    global OrgDataPeakIndexLeft
    global OrgDataPeakIndexRigth
    global OrgDataPeakValue
    global OrgDataPeakValue50
    global OrgDataPeakValue60
    global CreatDataImageFullDir
    global UpdateImageCount

    Split_OrgData_KeyVal()

    plt.figure(figsize=(12, 8))
    plt.title(GetTitleText())
    plt.xlabel("Sampling Point")
    plt.ylabel("Superposition Data")
    plt.plot(AxisX, AxisY, 'ro', linewidth=2)

    plt.axvline(OrgDataPeakIndex)
    plt.axvline(OrgDataPeakIndexLeft, color="green", linestyle="--")
    plt.axvline(OrgDataPeakIndexRigth, color="green", linestyle="--")

    plt.axhline(OrgDataPeakValue, color="red")
    plt.axhline(int(OrgDataPeakValue50), color="blue")
    plt.axhline(int(OrgDataPeakValue60), color="blue")

    plt.text(600, int(OrgDataPeakValue), 'Peak={}'.format(int(OrgDataPeakValue)), fontsize=16, fontweight='bold', color="black", ha='left', va='center')
    plt.text(300, int(OrgDataPeakValue50), '50%Peak={}'.format(int(OrgDataPeakValue50)), fontsize=16, fontweight='bold', color="black", ha='left', va='center')
    plt.text(600, int(OrgDataPeakValue60), '60%Peak={}'.format(int(OrgDataPeakValue60)), fontsize=16, fontweight='bold', color="black", ha='left', va='center')
    plt.figtext(0.15, 0.7, GetFigText(), color='blue', fontsize=12, ha="left", va="center")

    UpdateImageCount += 1
    picName = Get_Image_Name()
    serial = '[%04u]' % UpdateImageCount
    picDirName = staFileDir + '/' + serial + picName + ".png"
    plt.savefig(picDirName, dpi=300, bbox_inches="tight")
    Update_StaInfo(staFileFullName, picName)

    plt.close()
    Clear_OrgData_Memory()
    

六、处理原始数据文件

# 处理原始数据文件
def File_OrgData_Handler(orgDatFullName, staFileDir, staFileFullName):
    global AtcDataHeaderStr
    global FigTextEndIndex

    with open(orgDatFullName, 'r', encoding='utf-8') as fileHander:  # 打开文件
        actDataHeaderFlg = 0  # 有效数据头
        indexCount = 0  # 索引计数

        for lineTxet in fileHander:  # 读取一行数据
            if actDataHeaderFlg == 0:  # 数据头无效
                if AtcDataHeaderStr in lineTxet:  # 包含数据头
                    startIndex = lineTxet.find(AtcDataHeaderStr)  # 数据头位置
                    if startIndex != -1:  # 位置有效
                        endIndex = lineTxet.find(']', startIndex)
                        if endIndex != -1:
                            key = lineTxet[startIndex + 1: endIndex].strip()  # 截取数据
                            val = lineTxet[endIndex + 1:].strip()
                            if key.isdigit() == True and val.isdigit() == True:  # 都为数字
                                Clear_OrgData_Memory()  # 清空缓存
                                Store_OrgData_KeyVal(key, val)  # 保存数据
                                actDataHeaderFlg = 1  # 数据头有效
                                indexCount = 0

            else:
                indexCount = indexCount + 1  # 计数加1
                indexHeader = '[%04u]' % indexCount

                if indexCount <= (OrgDataValSize - 1):  # ADC数据0~1023
                    if indexHeader in lineTxet:  # 包含ADC数据索引
                        start = lineTxet.find(indexHeader)  # 索引有效
                        end = lineTxet.find(']', start)
                        if start != -1 and end != -1:
                            key = lineTxet[start + 1: end].strip()  # 截取数据去掉前后空格
                            val = lineTxet[end + 2:].strip()
                            if key.isdigit() == True and val.isdigit() == True:  # 都为数字
                                Store_OrgData_KeyVal(key, val)  # 保存数据
                                continue

                    Clear_OrgData_Memory()
                    actDataHeaderFlg = 0
                    indexCount = 0
                else:  # 其他数据1024以后
                    start = lineTxet.find(']')
                    if start != -1:  # 索引有效
                        val = lineTxet[start + 1:].strip()
                        if len(val) != 0 and val != '':  # 有内容
                            Store_OrgData_KeyVal(str(indexCount), val)  # 保存数据
                            if val.find('ADC Meas Complete ==> Gears:') != -1:  # 结束标准
                                timesTick = lineTxet[1: start].strip().replace(' ', '-').replace(':', '-')  # 截取数据
                                Store_OrgData_KeyVal(str(indexCount + 1), timesTick)  # 保存数据
                                FigTextEndIndex = indexCount
                                actDataHeaderFlg = 0
                                indexCount = 0
                                # name = os.path.splitext(os.path.basename(dirName))[0]
                                # dir  = os.path.join(CreatDataFatherDir, name)
                                if os.path.exists(staFileDir):
                                    OrgData_CreateImage(staFileDir, staFileFullName)

                        else:
                            indexCount = indexCount - 1
                    else:
                        Clear_OrgData_Memory()
                        actDataHeaderFlg = 0
                        indexCount = 0

七、主函数入口

# 删除目录内容
def Delete_Directory_Content(dir):
    if os.path.exists(dir) == True:  # 目录存在
        for item in os.listdir(dir):  # 目录中内容
            name = os.path.join(dir, item)  # 拼接完整路径
            if os.path.isfile(name):
                os.remove(name)  # 删除目录
            elif os.path.isdir(name):
                shutil.rmtree(name)  # 删除文件


# 判断基本目录
def Judg_BasicDir_Info(datDir, creatDir):
    res = 0
    if not os.path.exists(datDir):  # 目录不存在
        print(datDir, "Directory No Exists, ", end='')
        os.mkdir(datDir)  # 创建目录
        print("Create Successful......")
        res = 1

    if not os.path.exists(creatDir):  # 目录不存在
        print(creatDir, "Directory No Exists, ", end='')
        os.mkdir(creatDir)  # 创建目录
        print("Create Successful......")
        res = 2

    return res


# 创建图片目录和统计文件
def Create_DataImage_DirFile(dir, name):
    if not os.path.exists(dir):  # 图片目录不存在
        os.mkdir(dir)
    else:
        Delete_Directory_Content(dir)

    dirName = os.path.join(dir, name)
    open(dirName, 'a').close()  # 创建统计文件
    print('dirName:', dirName)


# 获取所有原始数据文件
def Get_OrgData_FilesGroup(dir, extName):
    res = 1
    fileGroup = list()

    fileList = os.listdir(dir)  # 获取目录中内容
    for file in fileList:
        if file.endswith(extName) == True:  # 指定后缀名
            fullName = os.path.join(dir, file)  # 拼接名称
            fileGroup.append(fullName)  # 保存名称
            res = 0

    count = 0
    for file in fileGroup:
        if os.path.exists(file):
            count += 1
            print('[%04u] %s' % (count, file))
    return res, fileGroup


#只处理 OrgDataFullDirNameExt原始文件数据
def Function_Option_Handler1():
    global OrgDataFullDirNameExt
    global CreatDataImageFullDir
    global CreatDataNameExtension

    if os.path.isfile(OrgDataFullDirNameExt) == True:  # 原始数据文件存在
        Create_DataImage_DirFile(CreatDataImageFullDir, CreatDataNameExtension)  # 创建图片目录和统计文件成功
        File_OrgData_Handler(OrgDataFullDirNameExt, CreatDataImageFullDir, CreatDataStaFullDirNameExt)
    else:
        print(OrgDataFullDirNameExt, "OrgDat File No Exists......")




#处理OrgDataDir目录下所有原始文件数据
def Function_Option_Handler2():
    global OrgDataFilesGroup
    global CreatDataExtension
    global OrgDataDir
    global OrgDataExtension

    res, OrgDataFilesGroup = Get_OrgData_FilesGroup(OrgDataDir, OrgDataExtension)
    if res == 0 and len(OrgDataFilesGroup) > 0:
        for orgFile in OrgDataFilesGroup:
            name = os.path.splitext(os.path.basename(orgFile))[0]  # 名称
            dir = os.path.join(CreatDataFatherDir, name)  # 拼接目录
            Create_DataImage_DirFile(dir, name + CreatDataExtension)
            File_OrgData_Handler(orgFile, dir, os.path.join(dir, name + CreatDataExtension))




# 主函数入口
def main():
    global CreatDataFatherDir
    global OrgDataDir
    if Judg_BasicDir_Info(OrgDataDir, CreatDataFatherDir) == 0:  # 基本目录存在否
        Function_Option_Handler1()
        # Function_Option_Handler2()
    else:
        print("Basic Directory Creat Successful......")
    print("OrgData Handler Complete......")



if __name__ == "__main__":
    main()

八、测试结果

原始数据
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1234645.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue-admin-template改变接口地址

修改登录接口 1.f12查看请求接口 模仿返回数据写接口 修改方式1 1.在env.devolopment修改 修改方式2 vue.config.js 改成本地接口地址 配置转发 后端创建相应接口&#xff0c;使用map返回相同的数据 修改前端请求路径 修改前端返回状态码 utils里面的request.js

Joern安装与使用

环境准备 Joern需要在Linux环境中运行&#xff0c;所以在Windows系统中需要借助WSL或虚拟机安装。 JDK安装 Joern的运行需要JAVA环境的支持&#xff0c;本次采用的是JDK17&#xff0c;其他版本建议看一下Joern官方文档。 apt install openjdk-17-jre-headless 配置JAVA环境变…

集成仿真软件 PLEXOS 9.0 授权永久完美

PLEXOS是由能源示例发布的能源市场集成仿真软件。能源市场是一个充满活力和活力的市场&#xff0c;在这个大市场中有各种各样的数据和信息模型。观看每日市场发展和大量数据可能会使您感到困惑&#xff0c;并难以进行未来的投资和分析。使用集成和全面的方法是应对这一挑战的唯…

【深度学习实验】注意力机制(四):点积注意力与缩放点积注意力之比较

文章目录 一、实验介绍二、实验环境1. 配置虚拟环境2. 库版本介绍 三、实验内容0. 理论介绍a. 认知神经学中的注意力b. 注意力机制 1. 注意力权重矩阵可视化&#xff08;矩阵热图&#xff09;2. 掩码Softmax 操作3. 打分函数——加性注意力模型3. 打分函数——点积注意力与缩放…

ky10 server aarch64 离线安装openssl3.1.4

离线程序 https://gitcode.net/zengliguang/ky10_aarch64_openssl_install.git 输入下面命令执行离线安装脚本 source openssl_offline_install.sh 安装完成

仪表盘:pyecharts绘制

一、仪表盘 在数据分析中&#xff0c;仪表盘图&#xff08;dashboard&#xff09;的作用是以一种简洁、图表化的方式呈现数据的关键指标和核心信息&#xff0c;以帮助用户快速理解数据的情况&#xff0c;并从中提取关键见解。 仪表盘图通常由多个图表、指标和指示器组成&…

南京--ChatGPT/GPT4 科研实践应用

2023年随着OpenAI开发者大会的召开&#xff0c;最重磅更新当属GPTs&#xff0c;多模态API&#xff0c;未来自定义专属的GPT。微软创始人比尔盖茨称ChatGPT的出现有着重大历史意义&#xff0c;不亚于互联网和个人电脑的问世。360创始人周鸿祎认为未来各行各业如果不能搭上这班车…

杨氏矩阵解法

每日一言 「 人生如逆旅&#xff0c;我亦是行人。 」--临江仙送钱穆父-苏轼题目 杨氏矩阵 有一个数字矩阵&#xff0c;矩阵的每行从左到右是递增的&#xff0c;矩阵从上到下是递增的&#xff0c;请编写程序在这样的矩阵中查找某个数字是否存在。 解法思路 法一&#xff1a;…

Vue3 provide 和 inject 实现祖组件和后代组件通信

provide 和 inject 能够实现祖组件和其任意的后代组件之间通信&#xff1a; 一、provide 提供数据 我们在祖组件中使用provide 将数据提供出去。 使用provide 之前需要先进行引入&#xff1a; import { provide } from "vue"; 语法格式如下&#xff1a; provide(&q…

米哈游大数据云原生实践

云布道师 近年来&#xff0c;容器、微服务、Kubernetes 等各项云原生技术的日渐成熟&#xff0c;越来越多的公司开始选择拥抱云原生&#xff0c;并将企业应用部署运行在云原生之上。随着米哈游业务的高速发展&#xff0c;大数据离线数据存储量和计算任务量增长迅速&#xff0c…

SqlServer_idea连接问题

问题描述&#xff1a; sqlServer安装之后可以使用navicat进行连接idea使用账户密码进行登录连接失败 问题解决&#xff1a; 先使用sqlServer管理工具进行登录 使用window认证连接修改账户密码 启用该登录名 这时idea还是无法连接&#xff0c;还需要如下配置 打开sqlserve…

论文阅读:“基于特征检测与深度特征描述的点云粗对齐算法”

文章目录 摘要简介相关工作粗对齐传统的粗对齐算法基于深度学习的粗对齐算法 特征检测及描述符构建 本文算法ISS 特征检测RANSAC 算法3DMatch 算法 实验结果参考文献 摘要 点云对齐是点云数据处理的重要步骤之一&#xff0c;粗对齐则是其中的难点。近年来&#xff0c;基于深度…

java项目之社区互助平台(ssm+vue)

项目简介 社区互助平台实现了以下功能&#xff1a; 1、一般用户的功能及权限 所谓一般用户就是指还没有注册的过客,他们可以浏览主页面上的信息。但如果有中意的社区互助信息时&#xff0c;要登录注册&#xff0c;只有注册成功才有的权限。2、管理员的功能及权限 用户信息的添…

第十一章 目标检测中的NMS

精度提升 众所周知&#xff0c;非极大值抑制NMS是目标检测常用的后处理算法&#xff0c;用于剔除冗余检测框&#xff0c;本文将对可以提升精度的各种NMS方法及其变体进行阶段性总结。 总体概要&#xff1a; 对NMS进行分类&#xff0c;大致可分为以下六种&#xff0c;这里是依…

为什么 Django 后台管理系统那么“丑”?

哈喽大家好&#xff0c;我是咸鱼 相信使用过 Django 的小伙伴都知道 Django 有一个默认的后台管理系统——Django Admin 它的 UI 很多年都没有发生过变化&#xff0c;现在看来显得有些“过时且简陋” 那为什么 Django 的维护者却不去优化一下呢&#xff1f;原文作者去询问了多…

股票指标信息(六)

6-指标信息 文章目录 6-指标信息一. 展示股票的K线图数据,用于数据统计二. 展示股票指标数据,使用Java处理,集合形式展示三. 展示股票目前的最新的指标数据信息四. 展示股票指标数据,某一个属性使用Java处理五. 展示股票的指标数据,用于 Echarts 页面数据统计六. 展示股票指标数…

做好性能测试计划的4个步骤!全都是精华!【建议收藏】

如何做好一次性能测试计划呢&#xff1f;对于性能测试新手来说&#xff0c;也许你非常熟悉Jmeter的使用&#xff0c;也许你清楚的了解每一个系统参数代表的意义&#xff0c;但是想要完成好一次性能测试任务&#xff0c;并不仅仅是简单的写脚本&#xff0c;加压力&#xff0c;再…

RedisConnectionFactory is required已解决!!!!

1.起因&#x1f936;&#x1f936;&#x1f936;&#x1f936; redis搭建完成后&#xff0c;准备启动主程序&#xff0c;异常兴奋&#xff0c;结果报错了&#xff01;&#xff01;&#xff01;&#xff01; 2.究竟是何原因 &#x1f62d;&#x1f62d;&#x1f62d;&#x1f…

【OpenCV实现图像:在Python中使用OpenCV进行直线检测】

文章目录 概要霍夫变换举个栗子执行边缘检测进行霍夫变换小结 概要 图像处理作为计算机视觉领域的重要分支&#xff0c;广泛应用于图像识别、模式识别以及计算机视觉任务中。在图像处理的众多算法中&#xff0c;直线检测是一项关键而常见的任务。该任务的核心目标是从图像中提…

动态神经网络时间序列预测

大家好&#xff0c;我是带我去滑雪&#xff01; 神经网络投照是否存在反锁与记忆可以分为静态神经网络与动态神经网络。动态神经网络是指神经网络带有反做与记忆功能&#xff0c;无论是局部反馈还是全局反锁。通过反馈与记忆&#xff0c;神经网络能将前一时刻的数据保留&#x…