左炳辉,范志文,邱 宇
(青岛理工大学信息与控制工程学院,山东 青岛 266500)
根据卫生部统计,中国的盲人数量近一千五百万,数量位居世界之首[1],且近几年随着电子产品的普及,紫外光对人眼的损害加快了盲人数量的上升速度,如何让盲人平安出行成为困扰人们的难题。目前国内市面上流行的导盲杖大多仅仅具有障碍物提示功能,即当导盲杖触碰到障碍物时会进行报警或发出震动,这种导盲杖功能过于单一,不具备障碍物识别功能和通讯功能。且传统的导盲杖仅仅检测盲道上的障碍物,而忽视了使用者脸部高度处的障碍物,导致使用者撞到广告标牌的现象屡屡发生。为了解决视力障碍人群的出行问题,有必要研制一款集障碍物识别、障碍物检测、定位、报警提示及通讯功能于一体的智能导盲杖,该导盲杖有望为盲人患者的出行带来福音。
本文所提出的基于机器视觉的智能导盲杖,其设计思想来源于实际生活,本研究旨在更好地为盲人服务。导盲杖主体结构可分为障碍物识别、障碍物检测、GPS定位、报警提示以及应急求助五大部分。对于障碍物的识别,我们采用OpenCV 技术,并借助树莓派4B 实现与图像识别相关的基本功能。在进行识别之前,我们需要通过树莓派进行WIFI 联网,以便访问百度AI 图像识别平台,运行已经训练好的识别模型。此外,我们还通过超声波测距模块和红外光电传感器模块来检测使用者附近的障碍物,包括悬空的障碍物,使用蜂鸣器报警的方式提醒使用者。利用串口通讯的方式,使单片机与SIM800C 模块通讯,实现了使用者与家人的联系。导盲杖主体控制结构如图1所示。
图1 导盲杖主体控制结构
Raspberry Pi(树莓派)是一款基于ARM 的微型电脑主板,相比于单片机,树莓派在性能上占有绝对优势,能够满足导盲杖使用过程中图像传输及图像处理等相关需求。在安装有Linux操作系统的树莓派上运行Python开发平台,为本设计提供了良好的编程环境。本设计以树莓派4B作为主控制器,其配置有4GB大小的RAM,可实现图像的高速处理,并配备了千兆以太网以及板载无线网络和蓝牙,可十分方便地进行网络接入。树莓派4B总共有40 个GPIO,提供了I2C,SPI,UART 等功能。树莓派4B及摄像头的连接如图2所示。本设计需要用到普通GPIO 口进行开关控制,通过程序import RPi.GPIO as GPIO 导入GPIO 库,并将GPIO26 号管脚设置成下拉输入。利用边缘检测函数GPIO.wait_for_edge(26,GPIO_RISING)捕捉上升沿信号,当开关打开后,便可执行与障碍物的识别及语音播报功能相关的程序。
图2 树莓派及摄像头的连接
为了实现紧急情况下使用者与家人快速取得联系的需求,在导盲杖的设计过程中我们选用SIM800C 模块。该模块由SIMCOM公司推出,其板载的工业级四频GSM/GPRS 模块的工作频率为850/900/1800/1900MHz,可以提供语音、SMS(短信)、MMS(彩信)、蓝牙数据传输等功能[2]。在导盲杖的设计中,我们选用了SIM800C的短信发送功能,当使用者遇到紧急情况需要与家人取得联系时,按下导盲杖上相应的开关即可将求救信息发送到预先设置好的联系人手机上。
SIM800C 通过使用AT 指令建立终端设备与终端适配器的联系,AT指令必须以“AT”或“at”开头,以回车(
表1 涉及到的AT指令
在对障碍物的检测环节中,本设计采用了HC-SR04超声波测距模块和E18-D80NK 漫反射式红外光电开关传感器模块相搭配的设计方案。对于使用者两侧的障碍物,通过红外光电传感器进行粗略检测即可,当障碍物与使用者的距离小于设定的阈值时,蜂鸣器开始报警提示;对于使用者前方和侧上方的障碍物则使用了超声波测距模块进行精准测量,在程序中通过设定不同的测量值范围,来使蜂鸣器发出不同的报警声,以达到障碍物检测的目的。
盲人在使用导盲杖的过程中,难免会遇到诸如障碍物检测模块失灵或者走丢等不可控情况,为应对突发事件的发生并保障使用者的人身安全,本设计集成了GPS定位功能。当发生紧急情况时,使用者先按下相关开关,使上文提到的SIM800C 模块工作,将求救信息发送给家人。此时,家人只需将相关指令发送到盲人使用者的手机号中,便可根据手机接收到的回馈短信,通过相关APP实时显示使用者的当前位置。经测试,本导盲杖定位精度≤10米,基本满足使用者的要求。
图像识别的过程包括数据获取、图像预处理、特征提取、分类器选择与决策[4],而普通单片机的性能基本不可能达到预期效果,为此我们选用了树莓派4B作为图像识别部分的主处理器。首先,需要在树莓派中刷入树莓派镜像,并配置WIFI 功能(本设计的图像识别功能及语言播报功能均需要用到网络),在Raspi-config中开启SSH与VNC(提供远程调试环境)。最后,使用pip install x指令安装所依赖的库文件,并确保OpenCV-Python 的正确安装。安装完成后,可在命令行输入import cv2,回车后如果没有报错,即可表示OpenCV已经成功安装。
插入CSI排线将树莓派与摄像头连接起来,输入import cv2来导入OpenCV库,使用cv2.VideoCapture(0)调用摄像头录像,参数0 表示板载摄像头视频输入。img_str=cv2.imencode('.jpg',frame)[1].tostring()可将图片格式编码成流数据,并赋值到内存缓存中,用于图像数据格式的压缩,方便传输至百度服务器。
由于硬件性能的局限性,本地训练模型达不到预期标准,于是我们采用了百度AI开放平台提供的通用物体和场景识别服务,使得障碍物识别精度更高、范围更广、使用更便捷。
除图像识别外,百度AI开放平台还提供了文字识别、语音合成等技术。本设计还用到了其中的语音合成服务。通过使用百度AI 开放平台提供的API(Application Programming Interface,应用程序编程接口),实现图像识别与语音合成功能。使用前需要下载Python 版本的SDK,安装baidu-api 库。通过from aip import Aip-ImageClassify 在程序中导入百度API 库,输入对应的APP_ID,API_KEY,SECRET_KEY 参数,并通过程序client=AipImageClassify(APP_ID,API_KEY,SECRET_CRET_KEY)使其能够成功访问百度AI开放平台。图像数据上传并得到的返回结果由程序p=client.advanced-General(img_str)来实现。语音合成功能的使用流程与图像识别一致,可将得到的合成语音以MP3 格式保存在本地,当需要语音播报时,通过调用预先封装好的to_mp3_play(TEXT,a)函数即可实现语音播报功能。
考虑到导盲杖的结构与便携性,导盲杖的使用过程中需要“脱机”工作,也即需要将多余的显示器部分删除掉。我们可以依靠树莓派中的脚本实现程序的自启动,确保树莓派开机后便可以运行障碍物识别的相关程序。使用Shell 进行脚本的编写,将运行Python 文件的代码放在testboot.sh 中,运行命令sudo nano/etc/rc.local并进入rc.local,把supi-c"exec/home/pi/testboot.sh"加在exit 0之前,便会实现开机时执行脚本的效果,至此自启动脚本部分完成。
为了让超声波测距模块工作,至少需要提供给该模块10us 以上的脉冲触发信号,此时模块内部将会自动发送8个40kHz的方波,自动检测是否有信号返回[5-6]。当有信号返回时,模块的ECHO端口会发出高电平信号,此高电平信号的持续时间与所测距离成正比,距离计算公式为:
式中:L为所测距离;v为信号传输速度,取其值为声速,即v=340m/s;t为ECHO端口高电平持续时间。
考虑到导盲杖使用过程中可能存在人为因素导致的“余震”现象,故采用加权平均滤波算法,即在测距离时连续采集多组数据并求和取平均[7],以此来消除“余震”现象。
根据前两节所述办法,设计的导盲杖如图3所示。导盲杖全身长约1.2m,杖身通过3D打印机制作而成,并采用中空的方法,即减轻了总体重量,又有利于将导线布于其中。图3中I所表示的障碍物检测环节可对使用者前方及侧上方的障碍物进行检测,并可通过VI所示的蜂鸣器模块提醒使用者;II所示的控制开关可实现对导盲杖进行上电及启动各模块工作的功能,使用者可以通过控制开关决定环节I、III、IV、V 是否工作,大大降低了导盲杖的功耗,有利于增加续航时间;IV 作为导盲杖的核心,用来存放相应的程序,并实现既定功能。为了尽可能降低使用者的劳动负担,我们在导盲杖的下面加了滑轮,使导盲杖的使用过程更加便捷。
图3 导盲杖简图
本文设计了一款基于机器视觉的智能导盲杖。该导盲杖通过OpenCV 技术实现障碍物的识别,使用者可通关按键自主决定是否识别障碍物;导盲杖还具有多方向障碍物检测、GPS 定位、短信息发送等功能;发音频率不同的蜂鸣器更是向使用者提供了具体的报警信息。经在盲道上实地测试,我们发现,该导盲杖在复杂环境下仍然具有较稳定的导盲性能。因此,此导盲杖应用前景广泛,具有较强的市场价值,有望得到广泛推广。