离线命令词识别与单片机_jlink 四线下载 stm32识别不到单片机 - CSDN
  • 这是我们计算机视听觉的第三个实验,也是本学期语音部分的最后一个实验,大概花了两天才写完。上个实验做的是语音编码问题,这个实验是语音识别的事,感觉处理语音还是比较有意思的。

    介绍

    这是我们计算机视听觉的第三个实验,也是本学期语音部分的最后一个实验,大概花了两天才写完。上个实验做的是语音编码问题,这个实验是语音识别的事,感觉处理语音还是比较有意思的。

    附上实验代码地址:实验三

    注意:运行的时候,需要更改我代码中的地址路径,虽然没几个路径,但有些是绝对路径,不更改是运行不了的。

    实验要求

    1. 设计命令词识别任务

      • 设想一个任务,如智能家居、或车辆控制等
      • 确定词表,要求词表中不少于10个词
      • 录制语料。采集特定人(自己)语料,每个词不少于五遍。取其中一遍为模板,其它四遍用来测试。可以用采集工具(如cooledit)或编程实现语音采集。
      • 检查语料。通过听辩检查保证语料质量。
      • 去除静音。可以用端点检测算法实现,也可以手工实现
    2. 特征提取

      • 每帧提取39维MFCC特征,帧长25ms,帧移10ms
      • 可以采用HTK工具包中的hcopy命令实现(要求语料是WAV格式)
        hcopy -A -D -T 1 -C tr_wav.cfg -S .\data\list.scp
    3. 识别测试

      • N个模板,M个待测命令词语料,进行NM次DTW计算,得到NM个DTW距离
        • 分别载入模板和待测语料的MFCC特征矢量序列
        • 计算两个特征序列的 DTW 距离
    4. 计算测试结果

      • 每个测试语料都有一个类别标签 lil_i
      • 每个测试语料都有一个识别结果 rir_i
      • ri=maxDijr_i = maxD_{ij} 其中, DijD_{ij} 为第 i 个测试语料和第 j 个模板间的DTW距离(规整后)
      • ri=lir_i = l_i 表示识别结果正确
      • 计算正确率=识别结果正确的语料数/总测试语料数
    5. 扩展尝试

      • 开集扩展:采集一批集外命令词,重新计算正确率?
      • 实用扩展:将经过实验验证的算法,转化为能实时采集,在线检测的命令词识别系统?(这里我做的就是这个扩展)
      • 算法扩展:尝试基于HMM的识别算法?

    提取 MFCC 特征

    对于 39 维的 MFCC 特征,这里直接使用老师给的 HTK 中的 Hcopy 工具进行提取。即使是对实时录取的语音,也是在代码中动态对其进行特征提取。对于特征的提取这里就不详细描述了。

    DTW 算法

    一共录制十组特定人的命令词,每组 5 个,一共 50 个。每组的第一个取出,作为模板。剩余的 40 个语音命令作为测试样例,测试 DTW 算法。

    算法简介

    由于即使同一个人不同时间发出同一个声音,也不可能具有相同的长度,因此就需要用到动态时间归正(DTW)算法。把时间归正和距离测度计算结合起来的一种非线性归正技术。

    DTW 本质上是一个简单的动态规划算法,是用来计算两个维数不同的向量之间的相似度的问题,即计算向量 M1 和 M2 的最短距离。是一种非常常用的语音匹配算法,算法如下。

    算法思想

    对两个不同维数的语音向量 m1 和 m2进行匹配(m1 和 m2 的每一维也是一个向量,是语音每一帧的特征值,这里利用的是 MFCC 特征)。设两个向量的长度为 M1 和 M2,则距离可以表示为:

    D(X1,X2)=i=1Md(x1i,x2i)D(X_1, X_2) = \sum_{i = 1}^Md(x_{1i}, x_{2i})

    那么,就可以这样进行匹配:

    DTW

    1. 每一条从(1,1)倒(M1,M2)路径都有一个累计距离称为路径的代价.
    2. 每一条路径都代表一种对齐情况
    3. 代价最小的路径就是所求的对准路径。

    这样就可以将对准问题,或者说将求两个语音段的相似度问题,转化成了搜索代价最小的最优路径问题。

    在搜索过程中,往往要进行路径的限制:

    limit

    在此限制条件下,可以将全局最优化问题转化为许多局部最优化问题一步一步地来求解,这就动态规划(Dynamic Programming,简称DP )的思想。

    算法步骤

    1. 初始化:
      初始化i,j

    初始化 cost

    其中约束区域Reg可以假定是这样一个平行四边形,它有两个顶点位于(1,1)和(M1,M2),相邻两条边的斜率分别为2和1/2。

    1. 递推求累计距离 并记录回溯信息:

    回溯

    一般取距离加权值为:
    加权

    1. 计算出的值就是 m1 和 m2 之间的距离。(有时还需要进行归正,不过这里并没有写)

    代码——Python 实现

    # DTW 算法...
    def dtw(M1, M2) :
        # 初始化数组 大小为 M1 * M2
        M1_len = len(M1)
        M2_len = len(M2)
        cost = [[0 for i in range(M2_len)] for i in range(M1_len)]
        
        # 初始化 dis 数组
        dis = []
        for i in range(M1_len) :
            dis_row = []
            for j in range(M2_len) :
                dis_row.append(distance(M1[i], M2[j]))
            dis.append(dis_row)
        
        # 初始化 cost 的第 0 行和第 0 列
        cost[0][0] = dis[0][0]
        for i in range(1, M1_len) :
            cost[i][0] = cost[i - 1][0] + dis[i][0]
        for j in range(1, M2_len) :
            cost[0][j] = cost[0][j - 1] + dis[0][j]
        
        # 开始动态规划
        for i in range(1, M1_len) :
            for j in range(1, M2_len) :
                cost[i][j] = min(cost[i - 1][j] + dis[i][j] * 1, \
                                cost[i- 1][j - 1] + dis[i][j] * 2, \
                                cost[i][j - 1] + dis[i][j] * 1)
        return cost[M1_len - 1][M2_len - 1]
    
    # 两个维数相等的向量之间的距离
    def distance(x1, x2) :
        sum = 0
        for i in range(len(x1)) :
            sum = sum + abs(x1[i] - x2[i])
        return sum
    
    

    语音实时录取

    这里调用的是 Python 的库,还是比较简单的,不详细介绍这个库了,直接附上代码:

    # 将语音文件存储成 wav 格式
    def save_wave_file(filename, data):
        '''save the date to the wavfile'''
        wf = wave.open(filename,'wb')
        wf.setnchannels(channels)   # 声道
        wf.setsampwidth(sampwidth)  # 采样字节 1 or 2
        wf.setframerate(framerate)  # 采样频率 8000 or 16000
        wf.writeframes(b"".join(data))
        wf.close()
    
    # 录音
    pa = pyaudio.PyAudio()
    stream = pa.open(format = pyaudio.paInt16, channels = 1, \
                       rate = framerate ,    input = True, \
                       frames_per_buffer = CHUNK)
    print("开始录音,请说话......")
    
    frames = []
    
    for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
        data = stream.read(CHUNK)
        frames.append(data)
        
    print("录音结束,请停止说话!!!")
    
    # 存储刚录制的语音文件
    save_wave_file("./RecordedVoice-RealTime/recordedVoice_before.wav", frames)
    
    

    端点检测

    这里需要对识别的语音进行端点检测,否则正确率会很低。我就直接使用了实验一的代码了,只不过将它改成了一个类,在该代码中导入了该类,并且修改了存储文件的格式,效果都是一样的,算是一个进化版吧。具体代码请看我的链接,此处就不粘贴了。

    动态提取 MFCC 特征

    # 利用 HCopy 工具对录取的语音进行 MFCC 特征提取
    os.chdir("C:\\Users\\13144\\Desktop\\Computer-VisionandAudio-Lab\\lab3\HTK-RealTimeRecordedVoice")
    os.system("hcopy -A -D -T 1 -C tr_wav.cfg -S .\list.scp")
    os.chdir("C:\\Users\\13144\\Desktop\\Computer-VisionandAudio-Lab\\lab3")
    

    进行匹配

    # 对录好的语音进行匹配
    MFCC_recorded = getMFCCRecorded()
    
    # 进行匹配
    flag = 0
    min_dis = dtw(MFCC_recorded, MFCC_models[0])
    for j in range(1, len(MFCC_models)) :
        dis = dtw(MFCC_recorded, MFCC_models[j])
        if dis < min_dis :
            min_dis = dis
            flag = j
    print( "\t" + str(flag + 1) + "\n")
    

    总结

    本次实验的重点在于 DTW 算法的书写,其他部分都比较简单。这里粘贴的代码并不完全,只是挑最主要的粘贴了一部分,完整的代码在我的代码仓库里,再粘贴一下链接:实验三。写得比较基础,欢迎各位给出改进意见。

    展开全文
  • 包含,行业领先的语音识别算法;优秀的单麦本地语音解决方案 ,具体有语音降噪算法,语音活性检测算法,声学回声消除算法等。 Tengine-Lite 简介 Tengine-Lite是专为MCU场景设计的超轻量级AI推理框架,提供有...

    AID.Speech是以Tengine-Lite为平台的嵌入式前端语音唤醒/打断算法,它可以在Arm Cortex-M4上流畅运行,适用于各种语音交互的IoT场景;包含,行业领先的语音识别算法;优秀的单麦本地语音解决方案 ,具体有语音降噪算法,语音活性检测算法,声学回声消除算法等。

     

    Tengine-Lite 简介

    Tengine-Lite是专为MCU场景设计的超轻量级AI推理框架,提供有史以来最佳的MCU AI应用开发体验。

    Tengine-Lite向上兼容Arm中国周易Tengine应用接口,支持Caffe/MXNet/TensorFlow模型,采用程序与模型分离的开发流程,支持常见RTOS操作系统和Bare-metal运行环境,支持Keil/IAR等主流开发环境,大幅度提高MCU AI应用开发效率。

    同时为了满足超低成本的部署需求,Tengine-Lite采用纯C语言开发,最小程序体积20K。此外Tengine-Lite针对Arm Cortex-M CPU提供HCL-M计算库,支持FP32/INT8计算精度,兼容CMSIS-NN,同时支持调用DSP和AI硬件加速器进行异构计算,赋能MCU+AI加速器芯片。

     

    同时AID.Speech提供友好、简洁、通用的API,可以快速部署到目标硬件平台,加速语音识别终端快速产品化落地;默认支持FreeRTOS/Zephyr操作系统,经过简单修改就适配其他操作系统;提供唤醒词的定制以及在特定产品上的效果调优服务。

    语音识别算法流程

    语音识别需要经过声学回声消除、语音降噪、自动增益控制、声学特征提取、语音识别等多个步骤,通过使用Tengine-Lite/HCL-M大大提升了现有嵌入式SoC的算力,使得语音识别系统可部署在各类种嵌入式设备上,并提供超预期的识别用户体验。

    AID.Speech产品特性

    使用Tengine Lite,极快的识别速度;

    针对于不同CPU指令集、微架构级别优化,以及DSP/NPU的异构计算支持;

    3 识别本地化,支持完全离线工作模式;

    4 基于深度学习算法,超小模型,对内存容量要求低;

    抗噪声能力强;

    支持FreeRTOS/Zephyr等多种RTOS系统;

    AID.Speech产品性能

    AID.Speech采用多种语音前处理算法,在极大地抑制噪声的同时,适当地增强语音信号;采用回声消除算法,从输入语音中消除设备自身播放的影响,赋予设备全双工的能力。语音识别模型大小可以根据需要在50~350KB内自由选择,在保证误唤醒率<3次/天的条件下,识别率高达95%。

    Cortex-M4上的性能数据

    典型应用场景

    AID.Speech不同环境下唤醒打断及命令词demo

    视频地址:https://v.qq.com/x/page/e0872xztwzt.html

     

    OPEN AI LAB 于2016年12月成立,由Arm中国联合产业伙伴发起,致力于推动芯片、算力、算法、应用和数据等产业链各层次的深度协作,加速人工智能产业化应用部署和应用场景边界拓展,为最终实现万物智能贡献力量。更多:http://www.openailab.com/?csdn0521

    展开全文
  • 大家好,我是『芯知识学堂』的SingleYork,前面给大家简单介绍了『开源项目』基于STM32的...当然咯,我们今天的主角不是这款『OWL Micro F1开发板』,今天笔者要给大家介绍的是这个项目中比较重要的一个模块—语音识别

    大家好,我是『芯知识学堂』的SingleYork,前面给大家简单介绍了『开源项目』基于STM32的智能垃圾桶之成员简介,相信有很多小伙伴都已经忍不住跃跃欲试了,别着急,从这一篇开始,笔者将会带领大家一步一步来完成这个DIY项目。

    这款套件的主控板采用的是我们『芯知识学堂』自主设计的OWL Micro F1开发板,如果有一直关注我们的小伙伴,相信大家对这款开发板不会再感到陌生了:

    在这里插入图片描述

    当然咯,我们今天的主角不是这款『OWL Micro F1开发板』,今天笔者要给大家介绍的是这个项目中比较重要的一个模块—语音识别模块:ASR-08B。

    在这里插入图片描述

    这个模块的语音识别部分采用的是LD3320这个芯片,然后集成了一颗STC11L16XE的单片机做了一些指令、数据处理,相比于网上其他的LD3320的模块,操作更加简单,用户不用折腾代码,直接串口发送指令设置关键词即可识别,而且,厂家还提供了专门的设置工具,操作非常简单(enmm,妈妈再也不用担心我不会写代码了……):

    在这里插入图片描述

    接下来,笔者将结合我们的这款智能垃圾桶的DIY项目,来给大家介绍一下这个ASR-08B语音模块的使用,首先,我们将ASR-08B模块与USB转TTL模块连接来,并将USB转TTL模块插到电脑上:

    在这里插入图片描述

    USB转串口模块与语音识别模块接线说明:
    语音模块TXD --> USB模块RXD
    语音模块RXD --> USB模块TXD
    语音模块GND --> USB模块GND
    语音模块VCC --> USB模块5V

    这里需要注意的是,如果是使用厂家配套的USB转TTL模块的话,就不要使用USB转TTL模块的3V3电压给语音模块供电了,因为厂家提供的这个USB转TTL模块本身没有3.3V输出,语音模块的3.3V引脚直接悬空即可。

    硬件连接好后,如果是之前有用过CH340设备的电脑,在设备管理器中直接会显示一个“USB-SERILA CH340”开头的COM端口,如果是未使用过CH340设备的电脑,则可能需要自己手动安装一下这个驱动,关于这个驱动的安装比较简单,笔者就不在这啰嗦了。

    在这里插入图片描述

    ASR-08B模块是支持三种识别检测模式的,即:循环检测模块、口令检测模式和按钮检测模式,在我们这个智能垃圾桶项目中,笔者使用的是“口令检测模式”,所谓的“口令检测模式”,就意味着,我们先要对上口令,才能够进行下一步操作。说到这里,是不是有小伙伴马上就想起了电影《智取威虎山》里面的经典台词:

    土匪:天王盖地虎!(你好大的胆!敢来气你的祖宗?)
    杨子荣:宝塔镇河妖!(要是那样,叫我从山上摔死,掉河里淹死。)
    土匪:野鸡闷头钻,哪能上天王山!(你不是正牌的。)
    杨子荣:地上有的是米,喂呀,有根底!(老子是正牌的,老牌的。)
    土匪:拜见过阿妈啦?(你从小拜谁为师?)
    杨子荣:他房上没瓦,非否非,否非否!(不到正堂不能说。)
    土匪:嘛哈嘛哈?(以前独干吗?)
    杨子荣:正晌午说话,谁还没有家?(许大马棒山上。)
    土匪:好叭哒!(内行,是把老手)
    杨子荣:天下大耷拉!(不吹牛,闯过大队头。)

    当然咯,笔者今天要给大家介绍的所谓的口令,没有这么复杂,我们只需要给语音识别模块设置一个名为“猫头鹰”的唤醒口令即可。

    接下来,我们需要根据垃圾分类的标准,将常见的一些垃圾,分为:可回收垃圾、厨余垃圾、有害垃圾和其他垃圾这四大类:

    (1)可回收垃圾:旧报纸、塑料瓶、废铁、图书、坏手机、玻璃瓶、旧水管、洗衣机、电视机、电饭煲

    (2)厨余垃圾:剩菜、剩饭、菜叶、果皮、隔夜饭、骨头、鸡蛋壳、茶叶渣、菜根、苹果核

    (3)有害垃圾:灯泡、电池、药品、灯管、油漆桶、化妆品、老鼠药、指甲油、杀虫剂、农药

    (4)其他垃圾:果壳、泥土、瓜子壳、废水、陶瓷、一次性筷子、卫生纸、烟头、餐巾纸、牙签

    为了防止语音识别模块出厂可能自带的一些指令跟我们需要增加的指令有冲突,我们先将语音识别模块里面的所有指令一次性全部擦除(即:擦除所有关键词),操作步骤如下:

    在这里插入图片描述

    简单来说,我们只需要在串口正确打开后,点一下“擦除所有关键词”按钮,然后再点一下“发送”按钮即可完成操作。

    接下里,我们来开始添加关键词,我们先点击一下“添加关键词”按钮,这个时候,在“数据发送区”就会出现一条示例指令“00,kai deng,001,$”,然后如果我们勾选了“是否显示命令解析”选项的话,在“数据接收区”会出现有关这条指令的详细解析,如下:

    在这里插入图片描述

    这里需要注意几个地方:

    1、“关键词所在的行”如果只有一位数时(0-9),前面十位一定要0补齐;

    2、“需要识别的词语或句子”两个拼音之间需要用空格隔开,并且,有且仅有一个空格,其他部分也不允许有多余的空格;

    3、“逗号”分隔符一定要是英文状态下的“逗号”,不能使用中文状态下的“逗号”;

    4、“254”被规定为口令模式中的口令,比如本例中的口令“猫头鹰”,不能用作普通关键词的返回值;

    5、“255”被规定为屏蔽词,如本例中的“可回收垃圾”、“厨余垃圾”、“有害垃圾”、“其他垃圾”,这样就可以避免语音播报模块在播报这几条语音的时候,被语音识别模块识别到。

    我们在添加关键词的时候,一定要严格按照上述要求进行操作,否则,可能会出现异常情况。

    弄清楚了“添加关键词”的指令格式后,我们就可以来开始添加本例所需要的关键词了。我们以“猫头鹰”这个口令为例,我们只需要在“数据发送区”输入“00,mao tou ying,254,$”,然后点击“发送”按钮,当“数据接收区”出现“写入成功!”后,我们的关键词就设置成功了:

    在这里插入图片描述

    接下来,我们来测试一下这个“猫头鹰”的关键词,这里,我们需要选择“十六进制显示”,然后,我们直接对着语音识别模块说一声“猫头鹰”,就可以在ASR M08-B设置软件的“数据接收区”里看到有显示“FE”,即:254,说明我们的这个“猫头鹰”关键词设置成功了。

    在这里插入图片描述

    至于其他的关键词,我们只需要按照同样的方式设置即可。当然咯,一个一个设置关键词,还是会比较麻烦的,语音识别模块的厂家也为大家考虑到了这一点,所以在“ASR M08-B设置软件”里面做了一个批处理的按钮,即:一键设置。这个时候我们只需要新建一个记事本,命名为“垃圾名字关键词”,然后直接在这个文件里面输入以下内容:

    @01,jiu bao zhi,001,$
    @02,su liao ping,001,$
    @03,fei tie,001,$
    @04,tu shu,001,$
    @05,huai shou ji,001,$
    @06,bo li ping,001,$
    @07,jiu shui guan,001,$
    @08,xi yi ji,001,$
    @09,dian shi ji,001,$
    @10,dian fan bao,001,$
    
    @11,sheng cai,002,$
    @12,sheng fan,002,$
    @13,cai ye,002,$
    @14,guo pi,002,$
    @15,ge ye fan,002,$
    @16,gu tou,002,$
    @17,ji dan ke,002,$
    @18,cha ye zha,002,$
    @19,cai gen,002,$
    @20,ping guo he,002,$
    
    @21,deng pao,003,$
    @22,dian chi,003,$
    @23,yao ping,003,$
    @24,deng guan,003,$
    @25,you qi tong,003,$
    @26,hua zhuang pin,003,$
    @27,lao shu yao,003,$
    @28,zhi jia you,003,$
    @29,sha chong ji,003,$
    @30,nong yao,003,$
    
    @31,guo ke,004,$
    @32,ni tu,004,$
    @33,gua zi ke,004,$
    @34,fei shui,004,$
    @35,tao ci,004,$
    @36,yi ci xing kuai zi,004,$
    @37,wei sheng zhi,004,$
    @38,yan tou,004,$
    @39,can jing zhi,004,$
    @40,ya qian,004,$
    
    @41,ke hui shou la ji,255,$
    @42,chu yu la ji,255,$
    @43,you hai la ji,255,$
    @44,qi ta la ji,255,$
    
    @49,mao tou ying,254,$
    

    其中:

    返回值001(行号01-10)属于“可回收垃圾”;
    返回值002(行号11-20)属于“厨余垃圾”;
    返回值003(行号21-30)属于“有害垃圾”;
    返回值004(行号31-40)属于“其他垃圾”;
    行号41-44属于屏蔽词(可回收垃圾、厨余垃圾、有害垃圾、其他垃圾);
    行号49属于唤醒口令。

    接下来,我们就可以来一键设置关键词了,我们先将数据接收区的显示模式改成“文本格式显示”,然后点击“一键设置”,选择文件“垃圾名字关键词.txt”,然后点击“打开”按钮:

    在这里插入图片描述

    因为我们设置的速度是1000ms,也就是说,每1000ms下发一条设置指令,所以,我们在“ASR M08-B设置软件”的“数据接收区”会每隔1000ms收到一条“写入成功!”的信息,直到出现“发送完成”的提示,意味着所有的关键词设置成功。

    在这里插入图片描述

    接下来,我们就可以来测试一下这些关键词了,测试关键词是否写入成功有两个方法,一个是点击软件上的“查询关键词”按钮,然后再点击“发送按钮”即可查询我们刚才写入的所有的关键词;另外一个就是可以直接通过判断语音识别模块的返回值来最终检验我们写入的关键词是否成功,具体操作请看视频:

    语音识别演示视频

    视频中有提到如何将模块设置成“口令模式”,其实,这条指令也同样可以在“一键设置”的时候,跟随其他关键词一起写入到语音识别模块中,相信看到这里,大家都应该知道要怎么操作了,笔者就不再赘述了。

    ASR-08B模块这款语音模块,相比与之前笔者使用过的庆科的VBS7100语音套件有优点也有缺点,ASR-08B模块有几个比较突出的优点:

    1、 离线识别:采用了LD3320离线式语音识别芯片,无需联网能够实现离线识别;

    2、 设置简单:厂家提供了专用的设置软件,使得用户无需编程基础,全程傻瓜式操作,就能快速设置所有指令;

    当然咯,其缺点也是比较明显的:

    1、 识别率不高:由于LD3320芯片的局限性,导致了识别率只能在90%左右(虽然在离线式语音识别芯片中算高了,但是跟在线式语音识别芯片还是有一定差距);

    2、 关键词数量有限:ASR-08B模块能够设定的关键词数量有限(最多50条),导致了我们能够写入的关键词数量不能太多,有一定的局限性;

    有关ASR-08B模块和VBS7100语音套件的更多差异以及详细的使用教程,请大家自行翻阅相关资料,在实际应用中,我们可以根据自己的应用场景,选择离线式语音识别方案还是在线式语音识别方案。

    关于我们这个DIY智能垃圾桶项目的语音识别部分,就给大家介绍到这里了,如还有疑问可以咨询我们,下一篇,笔者将要跟大家继续分享我们这个DIY项目中语音播报部分的实现,敬请关注!

    如果你喜欢我们的这个DIY项目,欢迎分享、转载,在项目内容全部介绍完成后,笔者将会给大家免费分享所有设计资料,感谢大家的支持!

    在这里插入图片描述

    展开全文
  • 感知层均通过无线传输层工厂总控主机相连,同时主机实时将工厂运行的状态数据发送至云端服务器进行存储记录,外部监管人员可云端服务器进行数据交互,以便对工厂运行状态实时获知以及控制,从而实现离线式监管。...

    1 项目简介 

           本项目融合了工业物联网技术,FPGA图像处理等技术,针对工业流水线上的多物料分拣,提出了一种自下而上全自动化式,工厂监管离线式的解决方案。工厂内部所有的控制层,感知层均通过无线传输层与工厂总控主机相连,同时主机实时将工厂运行的状态数据发送至云端服务器进行存储记录,外部监管人员可与云端服务器进行数据交互,以便对工厂运行状态实时获知以及控制,从而实现离线式监管。

           工厂总电源启动后,总控主机可对流水线上的每一台机械臂发送单独的控制指令,实现单流水线多流程工作,同时机械臂工作后会 每隔一段时间向主机发送数据报告自身状态;机械臂根据FPGA图像处理后的结果对传送带上的物料实现精准抓取和分拣;由于FPGA图像处理的过程对光亮度有明确的要求,因此总控主机可根据环境亮度调整照明亮度;如果工厂出现意外情况,例如机械臂损坏,或火焰危险,总控主机会立即发出警报,并将工厂状态信息上传服务器,服务器获取到紧急情况后立即主动发送信息给监管人员,实现离线式监管。
                                            

    2 技术报告

          首先通过摄像头采集需要监控的区域图像信息,在接收上位机发出的开始工作的指令后,图像的RGB数据经FPGA缓冲存储后进行并行处理生成二值化图像,为消除噪声,使目标物体突显,分别进行图像的腐蚀和膨胀处理,处理后的RGB图像和二值图像保存在SRAM后可通过VGA接口在显示屏中分别以两个窗口显示。

      图像缓存见本人另一博客:https://mp.csdn.net/postedit/82829375
    (1)二值化
           FPGA在采集并缓存视频数据后,进行二值化处理从而凸显目标的轮廓,简化后续数据的处理。从BRAM中读取出一帧图像后,将每个像素的RGB值转化为灰度值,然后再做阈值判断。彩色图转化为灰度图常用的公式是:

                                          Gray=5/16*R+9/16*G+2/16*B
    threshold为阈值。设定背景为黑,目标为白色,二值化的公式如下:
                                 
            如果直接采用浮点运算,会消耗大量的FPGA资源,可以发现在灰度转化公式中G分量的比重最高,因此,直接采用G分量作为阈值运算,可减少占用资源。
    (2)腐蚀膨胀
           腐蚀与膨胀是形态学滤波的两个基本运算,腐蚀是一种消除连通域的边界点,是边界点内向收缩的处理,可将小颗粒的噪声去除,膨胀处理可以将断开的目标进行合并,使目标检测更精确。处理完后即当没有目标物体运动时,处理完的图像就是全黑的,残留背景全部消除。因此,腐蚀膨胀的过程就是求局部最大值和最小值的过程,从数学角度来看就是将图像f和核(结构元)b进行卷积的一个过程。
            当b的原点位于(x,y)处时,若用一个平坦的结构元b在(x,y)处对图像f的膨胀,则定义为图像f中与b重合区域的最大值,即:
                                                         g(x,y)=max⁡{ f(x-s,y-t)}
            若用该结构元b在(x,y)处对图像f的腐蚀,则定义为图像f中与b重合区域的最小值,即:
                                                         g(x,y)=min⁡{ f(x-s,y-t)}
            (x,y)表示当前输入图像的行列坐标;
           f(x,y)表示坐标点(x,y)处的图像像素值;
           g(x,y)表示坐标点(x,y)处的滤波结果;
           (s,t)表示作用域。
    (3)算质心

            生成的二值化图像可看作是分布在一个矩形窗口内像素坐标系,左上角设为起始点坐标(0,0),右下角设为终点坐标(m,n),则:
                                   

     

            上式中(X,Y)为目标图像的质心坐标计算值,m、n 分别为目标图像的行数和列数(m、n 均为大于等于2的整数)。
            同时记录目标物体的起始和终点像素坐标,以求得其横截长度。通过像素坐标和实际坐标的映射可得其实际坐标和实际横截长度。
       (4)机械臂动态规划算法
                                                 
              获取的坐标点和横截长度进入MicroBlaze后经过动态规划算法获得相对应的六自由度机械臂舵机角度,数学建模后根据目标式子编写C语言:
                                                    
                                                            
       (5)基于STM32的监控功能
            工厂的监测与控制系统采用两块STM32F103RCT6作为主控芯片。以 STM32 单片机为控制核心,应用无线通信技术,将温度控制单元 , 亮度控制单元和报警单元等,连接成为一个互通的监控系统,并对系统内的模块实现自动化检测与控制。各种传感器将采集信息传入单片机发送给上位机,上位机对数据经行云存储并判断是否发出报警信息。STM32 单片机是本系统的核心,负责处理各传感器采集的数据,报警和调节工作。
               
           当系统上电后,首先进行初始化工作,包括对正常温度、环境亮度度的预设值的设定,之后各传感器进行采集数据,然后把采集的数据传输给STM32单片机进行处理计算并显示在PC端控制软件界面上。与此同时,各数值和预先设定的值比较,若没有超出预设值则不用通知用户,反则通过云端服务器发邮件通知用户。接下来如果用户不做出命令,则系统继续采集数据重复执行;如果用户发送命令短信后,系统进入中断,从而实现人机交互。
        (6)上位机
           在广泛的调研后,我们研制了自己的实时监测与控制软件。在Visual Studio 2017环境下,进行程序的设计与调试。采用C#语言进行编程,用到C#的委托、事件、多线程、socket、串口编程和各类控件等高级应用,同时采用模块化编程思想,“高内聚、低耦合”,便于程序的移植与修改,可读性高。

           控制软件主要完成的功能如下:①实现机械臂抓取系统、工厂的监测和控制系统之间的无线的通讯;②对流水线上的每一台机械臂发送单独的控制指令以及对机械臂工作状态的实时监测;③实时显示工厂的亮度和温度等环境参数;④根据情况对工厂环境参数进行调整。同时将工厂状态信息上传服务器,便于远程监控。
            
    (7)云端服务器
           输送分拣设备智能化,主要体现在输送分拣技术与信息监控、物联网技术的结合。在本分拣系统的设计中,增设云端功能。云端服务器在python3的开发环境下进行程序的设计与调试,使用docker容器实现云服务器的快速部署。极大拓展了物流装备的服务范围和提升了服务能力。输送分拣装备除了传统功能(执行操作),强调实时监控,数据上传功能。便于工厂生产状况的远程管理。
             

     

     

    展开全文
  • 本系列博客学习由非官方人员 半颗心脏 潜心所力所写,仅仅做个人技术交流分享,不做任何商业用途。如有不对之处,请留言,本人及时更改。 1、 爬坑学习新旅程,虚拟机搭建esp32开发环境,打印 “Hellow World”。...
  • 排第二的就是云台控制了,云台控制的含义就是对带云台的摄像机进行上下左右的移动,一般云台摄像机都是带有一个小电机,一旦收到485或者网络来的正确的指令以后就触发单片机程序,然后单片机程序驱动电机进行转动,...
  • 实时步态识别

    2019-04-22 17:41:22
    实验目标:通过蓝牙将惯性传感器数据发回电脑端进行实时步态识别 需要准备的东西:1、蓝牙惯性传感器;2、蓝牙模块+USB转TTL模块;3、python或MATLAB 实验内容: 1、蓝牙串口通信 2、python获取蓝牙数据 3、...
  • GPIO口一直是单片机的主要功能,今天小徐带来的是正是GPIO使用;本博文使用的是安信可的`esp32s`模组; 本篇主要学习了怎么使用esp32的GPIO口,包括高低电平输入、高低电平输出和`GPIO`的中断使用;
  • 首先 芯片手册的I2C地址是写地址,是8位的,真正的地址是7位地址,应该是0x40,最低位是读写位,读置1,为0x81,写置0,为0x80. 如果是模拟I2C倒无所谓,最坑的是我用的是寄存器,所以必须要用7位地址才可以,这个...
  • 下载地址 最后更新共计113个分类5177套源码29.2 GB。 卷 新加卷 的文件夹 PATH 列表 卷序列号为 00000200 5E7A:7F30 F:. ├─前台界面 │ ├─3D标签云卡片热门 │ │ Android TagCloudView云标签的灵活运用.rar ...
  • 1.2 查看Hiwave命令窗口所支持的命令 1.3 了解命令用途和具体使用方法 1.4 save命令详解 2. 通过CALL命令调用cmd脚本实现NVM读取 2.1 CMD命令脚本和CALL命令详解 2.2 读取S12G128的片上NVM数...
  • 物联网

    2019-07-04 17:31:27
    1)感知识别层:你应该听说过什么“通过感知识别技术,让物品‘开口说话、发布信息’,是融合物理世界和信息世界的重要一环,是物联网区别于其他网络的最独特的部分。。。”blabla。这些吹得有多响,要实现起来,...
  • 世上最遥远的距离,是我在if里你在else里,似乎一直相伴又永远分离;世界上最痴心的等待,是我当case你是switch,或许永远都选不上自己;世界上最真情的相依,是你在try我在catch。无论你发神马脾气,我都默默接受,...
  • 若该文为原创文章,未经允许不得转载 原博主博客地址:... 红模仿的博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、单片机、软硬结合等等)持续更新中... ...
  • 字符串
  • 通信词典

    2006-07-28 17:27:00
    通信类常用的英语词汇 (表记录的)插入修改添加删除 InsertModify, updateAddDelete (拨号后)拨号音不断 Non-stop Dial Tone (程序,进程)调度 Dispatch (程序安装的)序列号 Serial Number SN (单板)不在位...
  • cut_sentence.py import string import jieba import jieba.posseg as psg import logging #关闭jieba日制 jieba.setLogLevel(logging.INFO) jieba.load_userdict("./corpus/keywords.txt") ...stopwords_path = "......
  • 平台:NanoPi fire3 系统:Ubuntu core+Qt5.10(linux kernel 4.4) 语音模块:SYN6288A 模块链接:...id=575307622242&_u=51pfiddhc204 使用引脚信息 ...串口3对应设备...
1 2 3 4 5
收藏数 84
精华内容 33
关键字:

离线命令词识别与单片机