“兆易创新杯”第十八届中国研究生电子设计竞赛有感

news2024/11/17 8:26:47

今年的电赛给我的感觉是时间真的紧张,可能是因为去年有疫情原因影响所以能准备的时间到七月份,今年不到月底就要全部出成品。我们团队一直在自研一款增强现实眼镜,从硬件设计到软件实现全部由我和另外两个小伙伴一起完成,所以就把我们做出来的原型机的一部分拿出来改了改参赛了。

在面对如地震、飓风、洪水、火灾等突发自然灾害和事故时,光波导显示技术可以提供实时的信息和增强的感知,帮助救援人员更有效地响应紧急情况。基于增强现实的应急救援多功能头盔是一项具有挑战性的创新项目。它融合了头盔结构设计、应急救援功能的设计与实现,以及增强显示功能的设计和制作,我们的项目是《基于AR光波导显示的应急救援多功能头盔》。
在这里插入图片描述

一、作品原理及创新点

本项目的难点在于头盔结构设计创新和加工、 应急救援功能的设计与实现、增强显示功能的设计和制作。项目的创新之处在于用场景、硬件结构和软件系统方面。应用场景创新首次将增强现实头盔应用于应急救援,并根据实际需求进行优化。硬件结构创新采用多模态融合设计,将多种传感器集成到头盔中,实现气体检测、红外显示等功能,提供了位姿精度更高、环境适应性更强、动态性能更稳定,成本更低的多模态硬件解决方案。软件系统创新涉及双目相机和IMU多模态融合SLAM技术、三维重建、增强现实显示、视频录制和手势识别等功能的设计与实现。
在这里插入图片描述

二、结构介绍

1、双目相机和imu实现多模态融合

我们采用两个全局快门相机和一块IMU,IMU型号:ICM-20602进行多模态融合,通过ISP 桥接芯片进行时间同步和数据传输,输出到USB,以此整合为一个双目视觉惯性模组。

2、气体检测模块

SHT35传感器低功耗、长期稳定,无需频繁校准。SHT35传感器在应急救援中可提供快速、准确、可靠温湿度测量结果
SGP30气体传感器检测有害气体

SGP30气体传感器是一款单一芯片上具有多个传感元件的金属氧化物室内气体传感器,能够快速响应时间,能够在短时间内提供准确的测量结果。
MQ-9气体传感器所使用的气敏材料是在清洁空气中电导率较低的二氧化锡(SnO2)。
MPU6050姿态传感器是一种用于测量物体姿态的传感器,它可以检测物体的加速度和角速度,并计算出物体的方向和角度。

3、单目摄像头

DF100-720P型号的单目摄像头。该摄像头具有1/4英寸的CMOS传感器,像素尺寸为3um*3um,支持高清100万像素的工业级图像采集。

4、测温热像模组

Xmodule 系列T5-612-68非制冷测温热像模组,该模组是基于陶瓷封装非制冷氧化钒红外探测器开发的一款高性能红外热成像产品,该产品采用并行数字接口输出,控制接口丰富,可适配接入各种智能处理平台,具备高性能、低功耗、体积小、易于开发集成的特点,能够满足各类红外测温应用的二次开发需求。

三、功能演示

1、UI界面

首先进入系统,这是我们设计的UI界面,光波导会显示应急救援系统,提供用户信息,通过光学系统将虚拟信息叠加在现实世界中。

2、毒气检测

可以检测一氧化碳、二氧化碳、甲醛、甲烷和天然气气体浓度,当传感器所处环境中存在可燃气体时,传感器的电导率随空气中可燃气体浓度的增加而增大,从而会在系统中报警,保证用户安全。

3、感知定位功能

检测加速度和减速度。通过模拟不同的运动场景,如匀速、加速和减速等,生成相应的加速度和角 速度数据,并
输入到检测系统中进行实时监测和分析。可以包括不同方向上的加速度和角速度变化,以验证系统对于不同运动状态的检测能力。
在这里插入图片描述

4、红外显示功能

能够提供更远的探测范围,有助于救援人员在夜间或缺乏光源的场景下检测生命体迹,为救援行动提供更好的支持。

手势识别功能能够帮助佩戴者通过手势操作执行特定的程序,解放了佩戴者的双手,使其能够在需要保持双手自由的情况下进行操作,提高了操作的便利性和灵活性。

4、视频录制功能

能够帮助救援人员在救援过程中记录自己的行动过程。这样,一旦离开灾难现场,他们可以重新观察录制的视频,
以便回顾并注意到之前可能未注意到的细节。这对于总结经验教训、提高救援效率以及进行后续分析和讨论非常有帮助。通过录制整个过程,救援人员可以更好地评估自己的行动和决策,并进行必要的改进。

5、深度解算功能

可输出点云图和深度图,并保存点云信息,帮助用户进行场景重建。

6、增强现实功能

所有功能通过光波导材料叠加到现实场景,检测场景中的最佳平面与渲染虚拟模型,给用户带来身临其境的视觉体验。

import cv2
import numpy as np
import serial
import queue
import threading
import mediapipe as mp
import time
#0是单目相机,1是计算机自带相机,2是imu相机,3是红外相机
def videocapture():
    cap = cv2.VideoCapture(1)  # 生成读取摄像头对象
    width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))  # 获取视频的宽度
    height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))  # 获取视频的高度
    fps = cap.get(cv2.CAP_PROP_FPS)  # 获取视频的帧率
    fourcc = int(cap.get(cv2.CAP_PROP_FOURCC))  # 视频的编码
    # 定义视频对象输出
    writer = cv2.VideoWriter("video_result.mp4", fourcc, fps, (width, height))
    while cap.isOpened():
        ret, frame = cap.read()  # 读取摄像头画面
        # frame = cv2.flip(frame, 1)  # 画面反转
        cv2.imshow('video', frame)  # 显示画面
        key = cv2.waitKey(24)
        writer.write(frame)  # 视频保存
        # 按Q退出
        if key == 27:
            break
    cap.release()  # 释放摄像头


def show_image():
    path='hollo_world.png'
    cv2.namedWindow('camera', cv2.WND_PROP_FULLSCREEN)  # 窗口全屏
    cv2.setWindowProperty('camera', cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN)  # 窗口全屏
    image=cv2.imread(path, cv2.IMREAD_COLOR)
    # image = np.zeros((1920, 1080, 3))
    while True:
        cv2.imshow('camera', image)
        key = cv2.waitKey(24)
        if key == 27:
            break


def show_gas():
    Q = queue.Queue(-1)
    ser = serial.Serial()


    def get_gastxt():
        global flag
        flag = True
        ser.port = 'COM3'
        ser.baudrate = 115200
        ser.open()
        while True:
            if flag==False:
                break
            data_all = ''  # 增加气体显示
            for i in range(7):
                data = ser.readline().decode('utf-8')
                data_all = data_all + data
            print(data_all)
            Q.put(data_all)


    def show_gastxt():
        global data_all
        global flag
        data_all = ''
        cv2.namedWindow('camera', cv2.WND_PROP_FULLSCREEN)  # 窗口全屏
        cv2.setWindowProperty('camera', cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN)  # 窗口全屏
        while True:
            image = np.zeros((1920, 1080, 3))
            try:
                _data_all = Q.get_nowait()
            except:
                pass
            else:
                data_all = _data_all
            if data_all:
                y0, dy = 90, 90
                for i, txt in enumerate(data_all.split('\n')):
                    y = y0 + i * dy
                    cv2.putText(image, txt, (20, y), cv2.FONT_HERSHEY_SIMPLEX, fontScale=1.2, color=(0, 255, 0),
                                thickness=3)

            # 显示帧
            cv2.imshow('camera', image)
            key = cv2.waitKey(24)
            if key == 27:
                flag=False
                break

    t1 = threading.Thread(target=get_gastxt)
    t2 = threading.Thread(target=show_gastxt)

    t1.start()
    t2.start()

    t1.join()
    t2.join()

def show_infared():
    cap0 = cv2.VideoCapture(0)  # 0为电脑内置摄像头

    # cap0.set(cv2.CAP_PROP_FRAME_WIDTH, 1920)  # 设置摄像头图像宽度
    # cap0.set(cv2.CAP_PROP_FRAME_HEIGHT, 1080)  # 设置摄像头图像高度
    cap0.set(cv2.CAP_PROP_BUFFERSIZE, 1)
    while (True):
        ret, frame0 = cap0.read()  # 摄像头读取,ret为是否成功打开摄像头,true,false。 frame为视频的每一帧图像
        # frame0 = cv2.flip(frame0, 1)#画面反转

        # #将绿色蓝色通道设置为0
        # frame0[:, :, 0] = 0
        # frame0[:, :, 1] = 0
        # frame0[frame0 < 80] = 0
        #
        cv2.namedWindow('camera', cv2.WND_PROP_FULLSCREEN)  # 窗口全屏
        cv2.setWindowProperty('camera', cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN)  # 窗口全屏

        cv2.imshow("camera", frame0)

        c = cv2.waitKey(10)
        if c == 27:
            break
    cap0.release()  # 释放摄像头
#1是双目0是电脑2是单目,3是红外
def mphands():
    cap = cv2.VideoCapture(1)  # OpenCV摄像头调用:0=内置摄像头(笔记本)   1=USB摄像头-1  2=USB摄像头-2
    cap.set(cv2.CAP_PROP_BUFFERSIZE, 1)

    # 定义并引用mediapipe中的hands模块
    mpHands = mp.solutions.hands
    hands = mpHands.Hands()
    mpDraw = mp.solutions.drawing_utils

    # 帧率时间计算
    pTime = 0
    cTime = 0

    while True:
        success, img = cap.read()
        # img = cv2.flip(img, 1)  # 画面反转
        imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)  # cv2图像初始化
        results = hands.process(imgRGB)
        # print(results.multi_hand_landmarks)
        image0 = np.zeros((1920, 1080, 3))
        if results.multi_hand_landmarks:
            for handLms in results.multi_hand_landmarks:
                # 绘制手部特征点:
                mpDraw.draw_landmarks(image0, handLms, mpHands.HAND_CONNECTIONS)
        '''''
        视频FPS计算
           '''
        cTime = time.time()
        fps = 1 / (cTime - pTime)
        pTime = cTime

        cv2.putText(image0, 'F P S : '+str(int(fps)), (10, 70), cv2.FONT_HERSHEY_PLAIN, 3,
                    (255, 0, 255), 3)  # FPS的字号,颜色等设置

        cv2.namedWindow('HandsImage', cv2.WND_PROP_FULLSCREEN)  # 窗口全屏
        cv2.setWindowProperty('HandsImage', cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN)  # 窗口全屏

        cv2.imshow("HandsImage",image0)  # CV2窗体
        c = cv2.waitKey(10)
        if c == 27:
            break
    cap.release()  # 释放摄像头


if __name__ == '__main__':
    # videocapture()
    # show_image()
    # show_gas()
   #  show_infared()
    #mphands()

四、总结

这次从硬件到软件都是我们自己设计的,硬件的元器件虽然有一些现成的,不过根据我们需要的功能又做以改进,从整个原型机的创作周期来讲真的是遇到了很多很多困难,不管对外形还是功能都在不断的改稿,一直改进我们的功能,最后的原型机其实也非常简陋,实现的功能也没有完全达到我们预期的全部,不过这个过程我们收获的更多,下一步对标Vison Pro,期待我们的新作品!加油!
在这里插入图片描述

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

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

相关文章

matlab实现声音录制与左右声道分离

基础知识 1.MATLAB识别的常用语音信号类型&#xff1a; WAV格式 TXT格式 2.读取wav格式语音用函数&#xff1a;wavread 常用格式&#xff1a; ywavread(‘语音文件名’) [y,fs]wavread (‘语音文件名’) 用于读取语音,采样值放在向量y中,fs表示采样频率。 3.读取wav格式语音用…

动态代理与Spring Aop

动态代理 JDK 动态代理 使用JAVA反射包中的类和接口实现动态代理的功能&#xff0c;JAVA.lang.reflect包&#xff1b;主要是三个类&#xff1a; InvocationHandler,Method,Proxy; CGLIB动态代理&#xff0c;第三方工具类库&#xff0c;创建代理对象&#xff0c;cglib的原理是继…

城市内涝监测需要什么设备

近年来&#xff0c;随着城市化进程的加快&#xff0c;城市内涝问题愈发突出。强降雨、缺乏排水设施和过度的人类活动等因素&#xff0c;导致城市内涝灾害频发。内涝不仅给居民生活和财产安全带来威胁&#xff0c;还对城市基础设施和经济发展造成严重影响。 为了应对城市内涝灾…

spring中事务失效的情况(常见的5种)

1.多线程调用 从上面的例子中&#xff0c;我们可以看到事务方法add中&#xff0c;调用了事务方法doOtherThing&#xff0c;但是事务方法doOtherThing是在另外一个线程中调用的。 这样会导致两个方法不在同一个线程中&#xff0c;获取到的数据库连接不一样&#xff0c;从而是两…

centos7宝塔项目配置步骤

0、 1、 2、前面两个空格去掉勾 3、window 配置虚拟机 对应的域名

Django高级扩展之celery使用

Celery是一个简单、灵活、可靠的分布式系统&#xff0c;用于处理大量消息&#xff0c;同时为操作提供维护此类系统所需的工具。是一个专注于实时处理的任务队列&#xff0c;同时还支持任务调度。 目录 应用场景 问题 解决 celery架构图 安装 配置celery Settings.py配置…

CVE-2022-25099

文章目录 CVE-2022-25099一、漏洞介绍二、渗透步骤1、打开网站2、登录后台3、文件上传4、查看flag值 CVE-2022-25099 一、漏洞介绍 WBCE CMS v1.5.2 RCE。 WBCE CMS v1.5.2 /language/install.php 文件存在漏洞&#xff0c;攻击者可精心构造文件上传造成RCE。 二、渗透步骤 1…

宝塔面板实用教程(1):10分钟部署在线客服系统

客服系统发布以来&#xff0c;一直有朋友询问如何在宝塔面板中安装部署&#xff0c;开始我一直认为参考 Linux 版的安装教程就可以了&#xff0c;一直没有专门写宝塔环境的教程。这段时间来咨询的朋友越来越多&#xff0c;经过了解&#xff0c;我才知道宝塔面板的普及率有多高&…

SSM流浪动物救助网站-计算机毕设 附源码82131

SSM流浪动物救助网站 摘 要 随着生活水平的持续提高和家庭规模的缩小&#xff0c;宠物已经成为越来越多都市人生活的一部分&#xff0c;随着宠物的增多&#xff0c;流浪的动物的日益增多&#xff0c;中国的流浪动物领养和救助也随之形成规模&#xff0c;同时展现巨大潜力。本次…

XML文件

xml文件 类似于html那种标签语言 但是用途却大不一样&#xff0c;xml一般用于小型数据传输&#xff08;存储数据&#xff09; xml文件作用 xml语法规则 一个简单的xml文件案例 xml解析 解析思想 所谓的xml解析 也就是从xml文件提取数据 解析思想&#xff1a;前端的文档对…

【C++实现】RPC框架的简单实现介绍

文章目录 介绍为什么使用protobufprotobuf的service rpc 框架发布方的上层使用逻辑框架的提供方逻辑Rpc调用方框架实现客户端上层框架使用重新梳理简单聊一下RpcController 引入缓冲区队列zookeeper总结 介绍 以下博客覆盖内容&#xff1a; 集群和分布式概念原理&#xff1b; …

安科瑞智能照明系统在绿色建筑中的应用与产品选型

【摘要】&#xff1a;智能照明系统应用在智能建筑中不仅能营造出舒适的生活、工作环境以及现代化的管理方式而且要具有一定的节能效果。给出了智能照明和传统照明系统的比较并分析了智能照明系统的节能。 【关键字】&#xff1a;智能建筑&#xff1b;智能照明&#xff1b;节能…

什么样的口译是好的?交传和同传的评估标准是什么?

众所周知&#xff0c;交传和同传是口译的两种高级形式&#xff0c;难度比较大&#xff0c;一般应用于国际会议、商务洽谈、重大新闻发布会等领域。那么&#xff0c;如何做好交传和同传翻译&#xff0c;什么样的口译是好的&#xff0c;交传和同传的评估标准是什么&#xff0c;北…

密码学obe软件思路

匿名通信与暗网研究综述 匿名通信系统是一种建立在Internet之上综合利用数据转发、内容加密、流量混淆等多种技术隐藏通信实体关系和内容的覆盖网络.由于匿名通信主体难以被追踪定位,匿名通信网络中各类匿名滥用问题层出不穷,而其中隐藏服务机制更是被用于构建充斥着各种非法…

Integer移位算法

常用移位算法 给定值最高位1的权重给定值最低位1的权重给定值高位连续零的个数给定值低位连续零个数 给定值最高位1的权重 也就是给定值左侧。返回给定值左侧最大的2的次幂 //获取i最高位1代表的2次幂&#xff0c;最高位1代表的权值public static int highestOneBit(int i) …

轻量化技术 | 大面积模型秒加载、TB级数据处理能力、多平台便捷展示应用...

实景三维技术的发展日新月异&#xff0c;但在应用上却一直无法深入&#xff0c;尤其是在大场景三维模型展示与应用过程中&#xff0c;不可避免地会遇到占内存、渲染慢、加载卡顿、模型塌陷等情况&#xff0c;这是由于数据格式类型多、内存占比大、模型体量大。 对此&#xff0…

C++ STL关联式容器和无序容器(哈希容器)

文章目录 5.2 C STL关联式容器5.2.1 C STL map容器5.2.2 C STL multimap容器5.2.3 C STL set容器5.2.2 C STL multiset容器 5.3 C STL无序容器&#xff08;哈希容器&#xff09; 参考 5.2 C STL关联式容器 关联式容器在存储元素值的同时&#xff0c;会为各元素额外再配备一个值…

让你不再疑惑PDF转Excel怎么操作

你是否曾经遇到过需要编辑PDF表格的情况&#xff0c;但却不知道如何进行转换&#xff1f;不用担心&#xff0c;现在有一些简单的方法可以将PDF表格转换为Excel&#xff0c;让你轻松地编辑和修改表格。如果你还不知道PDF表格转Excel怎么转的话&#xff0c;那么接下来三种实用的小…

摆脱传统模式,快速构建系统只需要7步~

摆脱传统模式&#xff0c;快速构建系统只需要7步~ 首先我们来说说用“低代码开发平台”来进行开发是一种怎样的感受&#xff1f;它可以帮助您更快、更可靠地提供价值。通过在可视化设计器中&#xff0c;以拖拽的方式快速构建应用程序&#xff0c;您可以跳过基础架构以及可能会让…

聚观早报 | TikTok首席运营官离职;AMDR7 7840HS轻薄本开始上市

今日要闻&#xff1a;TikTok首席运营官离职&#xff1b;AMDR7 7840HS轻薄本开始上市&#xff1b;美国5月AI招聘岗位增加约20%&#xff1b;荷兰传最收紧ASML对华出口限制&#xff1b;力斯SERES5完成欧洲首批交付 TikTok首席运营官离职 当地时间 6 月 22 日&#xff0c;TikTok 首…