项目概述:
此项目基于毫米波雷达搭建一套完备的睡眠监测系统,将设备放在床垫下即可实时地监测人体睡眠体动、呼吸、心跳等生命体征数据,并将其上传至阿里云服务器的数据库,通过一整晚的数据便可分析出用户的睡眠状况,最后形成报告并推送至APP供用户查阅。
PS:此项目跟碧桂园养老院合作,目前做出几套样机给那边测试了。人体在离床检测精度达98%,睡眠呼吸率的检测精度达95%,心率精度达91%,在项申请的专利一项。
- 正面测量场景
这是正面50cm左右测量的场景,右上角绿色和红色分别是雷达测出来的呼吸率和心率。右中是用血氧脉搏仪同步作心率参考的,脉搏仪左边是血氧,右边是心率。左边最上面是雷达的能量幅值分布图,横坐标是距离。左边第二幅是雷达测出来的位移曲线,橙色是胸腔混合信号,绿色是分离出的呼吸信号,红色是分离出的心跳信号。下面四幅图分别是呼吸和心跳以及对应的信号频谱图。
正面测量呼吸心跳演示视频
正面测量呼吸心跳演示视频
- 睡眠场景(雷达在床垫下方压着)
这个是放在床垫下方测量的睡眠场景。右上方绿色红色也分别是雷达算出来的呼吸率和心率,黑色是用贴片式心电导联测出来的参考呼吸率和心率。左边第一幅图是同步测出来的心电信号,第二幅图是同步测出来的呼吸阻抗信号。左边第三幅图是雷达测出来的位移曲线,橙色是胸腔混合信号,绿色是分离出的呼吸信号,红色是分离出的心跳信号。下面四幅图分别是呼吸和心跳以及对应的信号频谱图。
接触式ECG与非接触式Radar睡眠监测演示视频
接触式ECG与非接触式Radar睡眠监测演示视频
- 用户APP
睡眠监测仪APP展示
本人主要工作内容:
此项目是在我研究生入学时实验室新开设的项目,我从零开始慢慢摸索,看官方文档怎么驱动它,学习它的原理,接着将呼吸心跳检测的算法移植成C语言,改用更加便宜的STM32单片机驱动它,然后再配合硬件的同学开发驱动自己画的板子,再到后来加入ESP32 wifi模块和服务器端、APP端的同学制定体征数据的传输和设备控制的通讯协议,直到现在一套完备的睡眠监测系统和样机终于落地成型。在这个过程中主要工作内容总结如下:
- 查阅雷达芯片使用手册,移植官方API库,通过STM32的SPI驱动雷达芯片,采集并处理雷达数据。
- 转译Matlab/Python中常用的信号处理算法成c语言,实现单片机端算得呼吸率心率等体征。
- 基于ESP32单片机和FreeRTOS实时操作系统,接收、储存并转发体征数据到服务器(做到不丢包)。
- 负责上位机实时显示波形的Qt程序开发,用Python编写并部署服务器端的睡眠分析算法。
- 通过OTA和IAP技术、Ymodem协议,修改Bootloder程序实现了ESP32和STM32的远程固件升级。
遇到的难点以及解决方法:
- 上传到服务器的体征数据丢包问题。
问题描述:尽管采用可靠的TCP协议上传体征数据,但在实测中发现,在网络不好的情况下,仍会存在数据帧丢失的情况,这对后续的睡眠分析算法造成很大的影响。
原因追溯:大量实验发现,丢失的数据都是在网络不好socket断开的时候才丢失的,这是因为调用send函数没返回错误码就直接清空了文件系统存储的数据,但是实际上send函数只是把数据copy到TCP的发送缓冲区而已,而由于网络不好socket断开时,这部分数据没来得及发送到服务器那端,从而导致了数据丢包。
解决方法:服务器端:在数据库设备状态表增加一列最后入表时间戳,以记录每个设备最后一个收到的数据包对应的时间戳。ESP32端:增加一个16KB的回收站缓冲区,以滑动窗口的方式保存send函数“发送成功”的数据;在每次socket断开重连时,都先向服务器申请查询最后入表的时间戳,然后去查找回收站缓冲区,发现存在没有发送成功的数据就重新发送。
最终效果:对五个设备放在不同网络环境进行50+小时的测试,接收到的数据均没有出现连续时间戳丢失的现象,直到现在也一直没有再出现数据丢包的问题,这个方案完美解决丢包问题!
- 跨平台移植问题
问题描述:
ESP32也有SPI,若能用ESP32驱动雷达,则不需要STM32了,能节约很大一部分成本。但是,之前官方只给出STM32对应的驱动库,并且对应的驱动库封装成了静态的.a文件,只给出了驱动函数的API接口,不知道具体的SPI通讯协议。这就牵扯到一个跨平台移植的难题。
解决方案:
①尝试直接移植,但是加密的静态库中有用到STM32的SPI外设以及对应结构体变量,在ESP32这边编译会直接报错,失败。
②采用逻辑分析仪破解其通讯协议。理论上若SPI发送内容是一样的,同样能驱动雷达,采用控制变量的方法即可破解其协议。但是这个方法较为繁琐、死板,若是以后雷达芯片升级,对应的SPI通讯协议改变则需要再破解。
③跟官方联系,问他们能不能提供相关支持。涉及到的雷达芯片是国外的公司的,发邮件跟他们说明需求后,没想到他们说最近正准备推出ESP32的固件支持库!终于在今年大概3月份的时候在官网上传了支持ESP32开发的驱动库!不过在我下载库用来驱动雷达时又出现了一个从来没遇到过的问题:能驱动雷达,并且收到雷达返回的数据,但是接收到的雷达信号质量很差!排查了很久都不知道是哪里出现了问题,后来把问题以邮件形式反馈至官方,经过两个星期左右的邮件交流和实验排查,最终确认问题出在我们自己的硬件设计上:之前采用的是DC-DC的电源芯片,其电路电容设计的不够大,导致雷达部分的电路供电很不稳定,从而使SPI的信号误码率很高,表现为收到的数据噪声很大,后来和他们硬件工程师、我们老师沟通后,将原来的供电芯片换成了LDO的芯片,并在电源输入输出引脚端加大了电容,这样设计后就没有问题了,现在是能做到使用SPI驱动雷达了,有望降低三分之一的成本!
后续:
ESP32的算力和性能不够STM32的好,原来的算法要求雷达的采样率必须在20Hz以上,目前还在优化算法,并且考虑用主频更高的ESP32型号。