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

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

八、测试结果

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

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【码神之路】【Golang】博客网站的搭建【学习笔记整理 持续更新...】

介绍 一个用原生GO开发的博客网站&#xff0c;涉及Golang Web开发、Web服务器搭建和HTTP请求处理、模板与静态资源处理等 技术栈 后端&#xff1a;Go、Go并发机制前端&#xff1a;HTML模版链接直达 Golang搭建博客网站的学习视频 注&#xff1a;这里我只记录我实质✅学习到…

PyCharm玩转ESP32

想必玩ESP32的童鞋都知道Thonny&#xff0c;当然学Python的童鞋用的更多的可能是PyCharm和VsCode Thonny和PyCharm的对比 对于PyCharm和VsCode今天不做比较&#xff0c;今天重点说一下用PyCharm玩转ESP32&#xff0c;在这之前我们先对比下Thonny和PyCharm的优缺点 1、使用Tho…

引迈-JNPF低代码项目技术栈介绍

从 2014 开始研发低代码前端渲染&#xff0c;到 2018 年开始研发后端低代码数据模型&#xff0c;发布了JNPF开发平台。 谨以此文针对 JNPF-JAVA-Cloud微服务 进行相关技术栈展示&#xff1a; 1. 项目前后端分离 前端采用Vue.js&#xff0c;这是一种流行的前端JavaScript框架&a…

webpack 配置

1、基础配置 // node js核心模塊 const path require(path) // 插件是需要引入使用的 const ESLintPlugin require(eslint-webpack-plugin) // 自动生成index.html const HtmlWebpackPlugin require(html-webpack-plugin); // 将css文件单独打包&#xff0c;在index.html中…

【开源】基于Vue.js的教学过程管理系统

项目编号&#xff1a; S 054 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S054&#xff0c;文末获取源码。} 项目编号&#xff1a;S054&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 教师端2.2 学生端2.3 微信小程序端2…

iOS越狱检测总结

文章目录 前言检测越狱文件私有目录检测检测越狱软件检测系统目录是否变为链接动态库检测环境变量检测系统调用检测指令集调用检测其他方式检测 前言 在之前的文章中&#xff0c;已经带大家一起制作了一个屏蔽越狱检测的Tweak。本文就和大家一起学习整理一下iOS系统中有哪些越…

scala的schema函数(算子)

在翻阅一些代码的时候&#xff0c;schema算子好像没碰到过&#xff0c;比较好奇structField这个类型&#xff0c;为什么可以直接用name参数&#xff0c;就翻阅了下资料&#xff1a; 在 Apache Spark 中&#xff0c;DataFrame 是一种分布式的数据集&#xff0c;它是以类似于关系…

电脑便签功能在哪里找?电脑桌面便签怎么添加?

很多上班族在使用电脑办公的时候&#xff0c;都需要随手记录工作事项&#xff0c;例如记录共同工作时的想法、会议笔记、常用工作资料、每天待办的工作任务等事项&#xff0c;这时候使用纸质的笔记本来记录工作&#xff0c;不仅不方便随时查看和使用&#xff0c;而且在修改、删…

基于SSM的校内互助交易平台设计

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

ppt录屏制作微课,轻松打造精品课程

微课作为一种新型的教学方式逐渐受到广大师生的欢迎。微课具有方便快捷、内容丰富、互动性强等特点&#xff0c;可以有效地帮助教师传达知识&#xff0c;提高学生的学习效果。其中&#xff0c;ppt录屏制作微课就是一种常见的方式。本文将介绍ppt录屏的使用方法&#xff0c;帮助…

Double 4 VR智能互动系统在轨道交通实训教学中的应用

Double 4 VR智能互动系统是一种集成了虚拟现实技术、人工智能和物联网技术的教学系统。计算机通过模拟真实的轨道交通环境&#xff0c;为学生提供了一个高度仿真的学习环境&#xff0c;帮助他们更好地理解和掌握轨道交通的相关知识和技能。 首先&#xff0c;Double 4 VR智能互动…

注解案例:山寨Junit与山寨JPA

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 上篇讲了什么是注解&am…

注册中心CAP架构剖析

Nacos 支持 AP 或 CP AP Nacos 通过临时节点实现 AP 架构&#xff0c;将服务列表放在内存中&#xff1b; CP Nacos 通过持久化节点实现 CP 架构&#xff0c;将服务列表放在文件中&#xff0c;并同步到内存&#xff0c;通过 Raft 协议算法实现&#xff1b; 通过配置 epheme…

集中签约 深算院YashanDB关键行业商用提速

11月17日&#xff0c;深圳计算科学研究院在2023深圳企业创新发展大会主论坛上&#xff0c;与金融、能源和交通等关键行业的7家标杆企业签约&#xff0c;签约总金额近亿元&#xff0c;标志着YashanDB在重点行业的商用落地迈入全面提速阶段。 会上&#xff0c;深圳计算科学研究院…

人工智能的时代---AI的影响

人工智能&#xff08;AI&#xff09;是当前科技领域的一个热门话题&#xff0c;它正在以前所未有的速度改变着我们的生活方式和工作方式。从智能家居到自动驾驶&#xff0c;从智能医疗到智能金融&#xff0c;人工智能正在渗透到我们生活的方方面面。在这篇文章中&#xff0c;我…

C语言基础---函数、数组

目录 一、函数 二、数组​ 一、函数 交换两个数&#xff1a; 发现这样并没有交换a和b的值&#xff0c;只是交换了x和y的值&#xff0c;这是因为&#xff1a; //当实参传递给形参的时候&#xff0c;形参是实参的一份临时拷贝 //对形参的修改不能改变实参 实参与形参是…

禁止linux shell 终端显示完整工作路径,如何让linux bash终端不显示当前工作路径

在操作linux时&#xff0c;默认安装的linux终端会显示当前完整的工作目录&#xff0c;如果目录比较短还是可以接收&#xff0c;如果目录比较长&#xff0c;就显得比较别扭&#xff0c;操作起来不方便&#xff0c;因此需要关闭这种功能。 要关闭这个功能&#xff0c;请按如下步骤…

Vue 3实战:打造交互丰富的任务管理应用

Vue 3实战&#xff1a;打造交互丰富的任务管理应用 前言搭建Vue 3项目步骤 1: 安装Vue CLI 3步骤 2: 创建Vue 3项目步骤 3: 进入项目目录步骤 4: 启动项目步骤 5: 查看项目结构 组件设计与复用1. **组件的职责单一化:**2. **Props传递:**3. **插槽&#xff08;Slots&#xff09…

【C++进阶之路】第七篇:异常

文章目录 一、C语言传统的处理错误的方式二、 C异常概念三、异常的使用1.异常的抛出和捕获2.异常的重新抛出3.异常安全4.异常规范 四、自定义异常体系五、C标准库的异常体系&#xff08;了解&#xff09;六、异常的优缺点 一、C语言传统的处理错误的方式 传统的错误处理机制&am…

【docker下安装jenkins】(一)

目的&#xff1a;在Linux操作系统&#xff08;x86_64)下&#xff0c;使用docker部署jenkins&#xff0c;python使用压缩包安装 安装jenkins的步骤 &#xff11;、编排jenkins的docker-compose.yml文件 说明&#xff1a;这里遇到部署jenkins后&#xff0c;占用内存8G,所以重新…