去年大半年的时间借着参加各种工科竞赛的功夫做了一辆巡检机器人,通过搭建这款巡检机器人,边学边做有了一定的Python和C语言的编程基础,可以绘制一些初级的PCB电路板,从前端到后端、Linux系统的使用、服务器的搭建都有了一定的了解。接下来就主要介绍这辆巡检机器人的主要功能及实现过程。
功能
做这款机器人的起始时间正值新冠疫情刚开始,因此将这辆巡检机器人的应用背景定为防疫相关。智能防疫机器人可通过摄像头识别人脸是否正确佩戴口罩。机器人还搭载有消毒模块,可开启消毒模式实现定点喷杀消毒,同时搭的温湿度传感器、可燃气体传感器、空气质量传感器等,可将传感器数据上传至云端并在Web界面实时显示分析,若检测到异常数值可在钉钉群里通过钉钉机器人推送告警信息。
实现原理
系统硬件设计
本文设计的智能防疫机器人的控制计算单元使用了‘’大脑‘’+‘’小脑‘’的设计方案,底层的STM32控制板为低算力、低时延、运行实时操作系统的‘’小脑‘’,用于控制底层电机,采集传感器数据等;上层的树莓派为高算力、高时延、运行Liunx操作系统的大脑,用于感知、思考和决策。其硬件设计框图如图所示。
系统软件设计
软件设计分为四部分,一是树莓派端程序设计,二是底层STM32单片机程序设计,三是手机APP程序设计,四是云端服务器程序设计。
树莓派端程序设计
树莓派端程序主要包括巡检过程中的口罩识别代码、QT编写的UI界面部分、与服务器交互的部分。
巡检过程中的口罩识别由于要兼顾巡检、人脸识别与语音播报,程序运行负载较大,因此为了提升整体程序运行的流畅度尽量用上所有CPU的资源,因此采用多进程来实现这一功能,在不降低精度的情况下大大提升了运行速度,达到了实时性的要求,部分实现代码如下:
#定义传递图像队列和传递图像处理结果队列
q_frame = Queue()
q_respond = Queue()
q_car= Queue()
#采集摄像头进程:
get_camera_frame=Process(target=camera_frame_func, args=("获取摄像头图像", q_frame, mydict,q_car))
#处理图片进程:
proc_frame=Process(target=proc_frame_func, args=("处理图像", q_frame, q_respond, mydict))
#播报语音信息:
read_rst=Process(target=read_rst_func, args=("播报语音信息", q_respond,q_car))
机器人巡检进程:
carrun=Process(target=carrun_fun,args=("小车巡检", q_car))
# 启动任务
get_camera_frame.start()
proc_frame.start()
read_rst.start()
carrun.start()
第一个进程获取摄像头图像,并利用OpenCV中的训练好的人脸Haar特征分类级联器判断画面中是否存在人脸,若存在人脸则将人脸照片传至消息队列中。第二个进程通过消息队列取出人脸照片并上传至百度智能云平台,百度智能云平台可根据云端数据库中的信息匹配出人脸身份信息,并判断人脸是否正确佩戴口罩将判断结果返回,若没有正确佩戴口罩则进程三启动播出提示语音,并停止巡检进程,向底层运动控制系统发出停止指令。正确佩戴口罩后恢复巡检进程。
机器人上层有一五寸可触摸电容屏,界面如图所示。该多媒体屏幕可进行一定的人机交互与多媒体宣传功能。该界面采用QT编写(代码已申请软著),天气查询通过调用API接口实现,词条查询通过爬取百度百科实现。当按下开启消毒模式时,树莓派通过串口向底层单片机发送开启指令。
控制模块总按钮位于上位机软件主界面的左下方的“手动控制”,点击后即可进入手动控制界面
当点击“播放音乐”按钮后,会弹出音乐播放器界面,可点击曲库中的音乐进行播放,左下角可切换“单曲循环”、“顺序播放”、“随机播放”模式。若想要播放曲库中没有的音乐,可对防疫机器人说出像要播放的曲名,机器人会联网下载歌曲后进行播放。
树莓派通过串口接收到底层单片机采集到的各种数据通过MQTT协议将其传至阿里云服务器,也可接收服务器下发的指令来远程控制机器人。部分代码如下:
def Alink(params):
AlinkJson = {}
AlinkJson["id"] = random.randint(0,999999)
AlinkJson["version"] = "1.0"
AlinkJson["params"] = params
AlinkJson["method"]="thing.event.property.post"
return json.dumps(AlinkJson)
# 消息回调(云端下发消息的回调函数)
def on_message(client, userdata, msg):
print(msg.payload)
if(SET==msg.topic):
Msg = json.loads(msg.payload)
switch = Msg['params']['PowerLed']
rpi.powerLed(switch)
print(msg.payload) # 开关值
#连接回调(与阿里云建立链接后的回调函数)
def on_connect(client, userdata, flags, rc):
pass
# 构建与云端模型一致的消息结构
updateMsn = {
'natural_gas':natural_gas,
'fired_gas':fired_gas,
'Harmful_gas':harmful_gas
}
JsonUpdataMsn = aliLink.Alink(updateMsn)
mqtt.push(POST,JsonUpdataMsn) # 定时向阿里云IOT推送我们构建好的Alink协议数据
底层单片机程序设计
底层STM32单片机程序分为主初始化程序、主程序、通讯中断子程序、功能模块子程序、PID电机控制子程序等。通讯中断子程序主要利用串口与树莓派进行通信,功能模块子程序为消毒喷洒装置控制函数、测温函数、LCD屏幕显示函数等。电机子程序内容为根据编码电机上的编码器返回的电机速度利用PID算法实时通过输出PWM波来控制电机的速度,从而保证机器人行进的稳定。
手机APP程序设计
手机APP程序采用Android studio软件开发和编译,分为主控界面、数据显示界面、模式选择界面等。进入控制界面后,可在此界面控制机器人的前进、后退、左转、右转、旋转以及摄像头云台的俯仰与旋转。还可控制防疫机器人进入巡检模式、消毒模式、以及选择人员进行精确测温等。同时可在此界面查看机器人传回的实时画面。数据显示界面可查看机器人检测到的各类传感器数据的数值、拍摄到的未正确佩戴口罩人脸的照片、体温检测异常的人的身份等。
APP端对机器人的控制可选择不需要联网、时延低、控制距离有限的蓝牙控制,也可选择需要联网、时延相对较高、控制距离理论上无限的远程控制。当选择蓝牙控制模式时,手机蓝牙与防疫机器人身上的蓝牙相连来下发控制指令。当选择远程控制模式时,安卓APP通过MQTT协议与服务器建立连接,通过安卓APP将控制指令先发送给云端服务器,然后服务器再将数据发送给树莓派,从而达到对机器人远程控制的目的。
很强
皮毛皮毛😊
叔叔真棒😍😍
别闹妹妹