机器人制作开源方案 | 智能消防机器人

作者:黄飞扬 郝萌研 夏雅雯 周富城

单位:江汉大学

指导老师:侍中楼 秦工

一、作品简介

1. 概述

1.1作品简介

       智能消防机器人基于全向移动底盘、多连杆机构、视觉识别、液压传动等方式,可实现自动巡检,自动识别火源,自动灭火等功能。通过对2022年国际青年人工智能大赛探索者创新设计项目主题:智能制造场景中的其他装置的思考,并结合场景调研与考察,我们发现目前市面上的消防设备不能很好的满足智能制造工厂的需求,因此我们设计了这款智能消防车,用以提高智能制造工厂的消防安全。

      本作品主要由识别单元,运动单元,灭火单元组成,由探索者套件为主体拼装而成。结合实际情况设计出这款智能消防机器人,后续可根据需求继续改善。本作品源于智能制造工厂需求,围绕大赛机器人的场景和应用进行设计,符合实际、有效可行、市场适应性强。

机器人制作开源方案 | 智能消防机器人_第1张图片

1.2 设计背景

      火灾是一种非常严重的社会灾害,严重危害人们的财产和生命安全。如果一些特殊的企业,如化工,纺织等企业发生火灾,造成的损失更大,扑灭难度更高。如果火灾被及时发现和扑灭,就能大大降低损失。我们希望设计一款智能消防机器人,能应用于日常的消防安全巡查中,昼夜不停的进行巡查,能及时的发现火情并扑灭,降低火灾造成的损失。

1.3 设计方案

1.3.1 设计思路

      本产品利用多传感器信息融合技术识别火灾的发生并定位着火点;智能消防车基于AGV导引方式设计实现自动行进,并基于优化算法快速到达着火点;到达后,智能消防车立即发出警报声,同时小车配备多种灭火器和多种传感器,可利用多传感器信息融合技术识别周围环境并结合火灾传感器的位置判断火灾类别,进而选择相应的灭火器,实现快速灭火;小车可通过多传感器信息融合技术识别火灾是否被扑灭,灭火完成后,小车将继续巡检,同时留下工作记录,待相关工作人员到达后,为小车补充相应的灭火介质并处理火灾发生后造成的损失及相关影响。

机器人制作开源方案 | 智能消防机器人_第2张图片 小车工作流程

1.3.2 作品结构

      本产品主要由运动系统、液压系统、机械臂系统、识别系统、控制系统组成。电控部分以Arduino作为主控,控制相对应的系统。

机器人制作开源方案 | 智能消防机器人_第3张图片 小车系统结构图

2. 场景调研

2.1 市场分析

2.1.1 相关政策支持

      根据政府相关文件指示,要推进“智慧消防”的建设,“智能化”和信息化的引入,可以帮助加速现代科技与消防工作的深度融合,更好的适应火灾防控新形式,新挑战。

机器人制作开源方案 | 智能消防机器人_第4张图片 政府相关指示文件

2.1.2 巨大市场潜力

      随着国民经济的稳步增长,工业得到了迅速的发展,智能车间的数量不断增加,但是各类生产车间场所的火灾以及由火灾引发的事故也随之不断发生。我国近年来频繁发生火灾等安全事故,截至2021年我国共接报火灾数量74.8万起,同比增长 196.83%,造成直接经济损失67.5亿元,同比增长68.33%。

机器人制作开源方案 | 智能消防机器人_第5张图片 火灾现场

      自2014年以来,中国消防机器人市场规模持续增长,到2018年增长至11亿元,同比增长54%;初步估计到2023年,我国消防机器人市场行业规模达到37亿元,消防小车有着巨大的市场潜力。中国消防机器人数量较少,应用较为有限,而且具有较强的区域性,在经济发达地区的配备情况较好,但是数量也是十分有限,一般在2~5 台,而且当前配备的机器人多以进口为主。而随着中国加重对消防机器人的研发,预计未来国产消防机器人将逐步替代进口,中国目前主要消防机器人生产企业有山东硅兔智能装备有限公司、天长市安康消防设备有限公司等。

机器人制作开源方案 | 智能消防机器人_第6张图片 消防机器人销售额预测

2.2 市场调研

机器人制作开源方案 | 智能消防机器人_第7张图片 TAF35战斧多功能消防机器人

     经调查,市面上常见的智能消防设备具有以下几大特点:体积巨大、造价昂贵、技术欠缺、灭火介质单一等问题,因此若有一款体积小巧、可无人化灭火、配备多种消防介质、同时可并联到消防系统的机器人会具有良好的市场前景。

3. 作品创新点及应用

3.1 创新点

1. 本产品利用多传感器信息融合技术识别火灾的发生并定位着火点,以达到更精确,更及时的识别。

2. 相比市面上传统灭火器材,本装置更智能、更有效。

3. 顺应国家机器人工程的发展趋势,能为现有相关文献及市场方面产品进行补足,提供新的借鉴和参考。

3.2 应用前景

      本作品设计体积小巧、结构紧凑,具有无人化灭火、配备多种消防介质等优点,可满足当前智能制造工厂对火灾防护的需求,极大的提高了人们的生命财产安全。同时机器人还可并联到消防系统,及时将现场情况反馈至控制中心,极大的提高消防安全系数。

二、技术说明

1. 运动系统

1.1运动系统结构

       运动系统是机器人工作的基础,根据使用环境的需求,对机器人的运动提出以下要求,平稳可靠,移动灵活,有一定的负重能力。对比市面上的移动机器人底盘,我们选择了四轮驱动的麦克纳姆轮。由于麦克纳姆轮的特殊结构,控制四个轮子的相对转动方向,就可实现其全向移动。

       其具体结构如下图所示:

机器人制作开源方案 | 智能消防机器人_第8张图片 运动系统结构示意图

1.2 运动系统模型建立

      首先将底盘的运动用三个独立的变量进行描述:

      底盘的运动可以分解为平动速度vt和旋转速度w,其中平动速度可以分解为X轴平动、Y轴平动,因此可以用三个运动变量表示,且这三个变量之间相互独立,如下图所示:图中Vtx表示底盘沿X轴运动的速度,正方向为右;Vty表示底盘沿Y轴运动的速度,即前后方向,正方向为前;w表示底盘绕yaw轴自转的角速度,正方向为逆时针方向。以上三个量一般都视为四个轮子的几何中心(矩形的对角线交点)的速度。

机器人制作开源方案 | 智能消防机器人_第9张图片 底盘运动分解量

      用上述分解的三个变量表示出每个轮子在轴心位置处的速度;则由下图,主轮的速度方向为蓝色箭头V,vr 为中心连线的切线方向。

机器人制作开源方案 | 智能消防机器人_第10张图片 轮子轴心位置运动分解图

      可知,主轮的总速度 v 等于底盘的速度矢量与切线方向的速度矢量之和,即

      分别计算 X、Y 轴的分量为:

机器人制作开源方案 | 智能消防机器人_第11张图片

      式中 a 为沿水平方向分量 Rx,b 为沿竖直方向的分量 Ry,其他三个轮子轴心的速度同理可以计算得出。

机器人制作开源方案 | 智能消防机器人_第12张图片 其它轮子速度分解图

      由轴心速度计算单个轮子与地面接触的辊子的速度;根据轮子轴心的速度v,可以分解出沿辊子方向 vt 和垂直于辊子方向的速度 vn,如下图所示:

机器人制作开源方案 | 智能消防机器人_第13张图片 速度分解图

      其中 vn 用于让辊子空转,可以忽略,则沿轴线的速度 vt 可得:

      由辊子速度计算出单个轮子的真实转速,从而给定电机的转速。由上述辊子的速度,如下图所示:

机器人制作开源方案 | 智能消防机器人_第14张图片 速度分解示意图

      可计算出轮子转速为:

机器人制作开源方案 | 智能消防机器人_第15张图片 标题

      综上,当给定底盘的移动状态时,可通过下式分别计算得出各个轮子的转速: 

机器人制作开源方案 | 智能消防机器人_第16张图片

2. 液压系统

      空气压缩机工作将空气压缩到气瓶,气瓶中有灭火介质。电磁阀初态时气路关闭,待合适位置后,电磁阀工作,气路导通,高压气瓶中压缩空气带着灭火介质输出,以此达到灭火功能。

机器人制作开源方案 | 智能消防机器人_第17张图片 液压原理图

3. 机械臂系统

      为应对着火点出现的随机性,灭火终端需根据着火点的位置实时改变自身在空间中的位置。此外,在单位时间内因输出高压力,高流量的灭火介质。因此,对装置的反作用力较大。根据实际情况,我们对复合连杆机构进行设计,使得终端角ẞ的运动范围为- 90°-120°。驱动角α与终端角ẞ之间的角度变换关系近似为3:1。保证们采用复合连杆结构来实行需求。该结构承载大、不易磨损、传动效率高。此装置可以充分满足我们的需求。

机器人制作开源方案 | 智能消防机器人_第18张图片 复合连杆机构简图

      根据相关运动学软件,绘制系统机构简图,构建其运动学模型进行相关分析,如下图所示。得出输出结果,若系统输入稳定,则输出的速度与力稳定。如若收到扰动,系统稳定性较好。

机器人制作开源方案 | 智能消防机器人_第19张图片 运动学分析

4. 识别系统

     识别模块主要由安装在室内的MQ-2烟雾气敏传感器和搭载于作品机身上的openmv 机器视觉模块组成:烟雾气敏传感器实时检测室内的烟雾浓度是否超过阈值,实现粗定位,即确定火灾所处的房间;机器视觉模块检测当前画面中是否存在火焰,实现精准定位,即确定火焰的具体位置。

4.1 烟雾检测装置

机器人制作开源方案 | 智能消防机器人_第20张图片 MQ-2 烟雾气敏传感器
机器人制作开源方案 | 智能消防机器人_第21张图片 openmv 机器视觉模块

      MQ-2型烟雾传感器属于二氧化锡半导体气敏材料,属于表面离子式N型半导体。处于200~300摄氏度时,二氧化锡吸附空气中的氧,形成氧的负离子吸附,使半导体中的电子密度减少,从而使其电阻值增加。当与烟雾接触时,如果晶粒间界处的势垒收到烟雾的调至而变化,就会引起表面导电率的变化。利用这一点就可以获得这种烟雾存在的信息,烟雾的浓度越大,导电率越大,输出电阻越低,则输出的模拟信号就越大。

      在发生火情时,MQ-2中气敏材料的电阻随烟雾气体浓度的增大而减小,MQ-2模块输出的模拟信号也会随之变大。本设计选择了AD信号采集方法,即主控芯片通过内置的模数转换器将电压信号转化为数字信号,进而转化为精确的烟雾浓度值。MQ-2传感器内部电路如下图所示:

机器人制作开源方案 | 智能消防机器人_第22张图片 MQ-2 传感器内部电路

4.2 视觉识别系统

      视觉识别系统由Open MV和舵机云台构成:舵机云台用来左右、上下旋转使Open MV得以识别室内是否存在火焰,Open MV则识别当前环境下是否存在火焰。

    (1)基于功能需求,设置了二自由度云台机械结构(如下图所示),具有Yaw(回旋)和 Pitch(俯仰)2 个方向的自由度。云台整个系统的构架由探索者套件设计,它是负责Open MV的转动装置,可以实现摄像头在水平方向上160°、垂直方向上 90°高度旋转和精确定位的依托。选用两个M01标准伺服舵机对于云台的控制,分别负责水平旋转和垂直旋转。

机器人制作开源方案 | 智能消防机器人_第23张图片 舵机云台示意图

    (2)Open MV 摄像头是一款开源、小巧、低功耗、低成本、功能强大的机器视觉模块,Open MV4 H7 PLUS以STM32H743处理器为核心,集成了OV5640感光元件,摄像头本身内置了一些图像处理算法,支持RGB565以及灰度等多种图像格式,其中引出了UART、I2C、SPI、PWM、ADC、DAC 以及 GPIO等接口方便扩展外围功能。全速USB接口(12 Mbps)用于连接电脑上的集成开发环境 Open MV IDE,协助完成编程、调试和更新固件等工作,通过Micro Python语言,可以很轻松地完成机器视觉(machine vision)应用。TF卡槽支持大容量的TF卡,拥有100 Mbps 读写速度,可以用于存放程序和保存照片。

      火焰识别功能采用卷积神经网络对需要识别的物体进行模型训练,再将训练模型导入Open MV。训练时首先使用Open MV IDE构建一个数据集,将该数据集上传到云中的 Edge Impulse,利用Tensor Flow深度学习算法进行神经网络训练,生成一个Tensor Flow Lite卷积神经网络(CNN),该网络将在Open MV Cam上运行。这个数据集包括各种火焰图片,当火焰图片显示在图像中时,摄像头调用内部神经网络库进行识别,并生成相应的信任程度,因此当置信度大于80%时,通过串口发给控制板,从而达到火焰识别的要求(如下图所示)。

机器人制作开源方案 | 智能消防机器人_第24张图片 openmv 识别界面

5. 控制系统

5.1 控制系统的选择

      基于本作品需要大量IO接口,故控制器选择使用Arduino Mega 2560。Arduino  

      Mega 2560是采用USB接口的核心电路板,其最大的特点就是具有多达54路数字输入输出。Mega2560的处理器核心是ATmega2560,同时具有54路数字输入/输出口,16路模拟输入,4路UART接口,一个16MHz晶体振荡器,1个USB口,一个电源插座,一个ICSP header和一个复位按钮。

5.2 控制整体介绍

本作品以Arduino Mega 2560为控制核心,选择舵机和电机作为动力源,通过舵机和机械结构的配合完成。系统结构如下图所示:

机器人制作开源方案 | 智能消防机器人_第25张图片 系统结构图

6. 难点及解决方案

6.1 机器人机械臂稳定运动

      最初,采用多个舵机连接叠加的方法设计机械臂,但是在最终实物上出现执行末端因受到外界扰动而发生剧烈抖动的情况。

      为解决此问题,查询相关资料,对比分析后设计出多连杆机构,使机器人输出末端可稳定运动,以此保证灭火的精确性。如下图所示:

机器人制作开源方案 | 智能消防机器人_第26张图片 多连杆机械臂

6.2 微型空气压缩机的工作环境

      因功能需要,机器人配备了一台微型空气压缩机,但是在实际工作过程中发现压缩机工作过程中震动剧烈,极大影响了机器人的正常运座。

      为解决此问题,可在微型空气压缩机安装位置安装缓震垫,以此来抵消压缩机工作时产生的剧烈震动。如下图所示:

机器人制作开源方案 | 智能消防机器人_第27张图片 微型空气压缩机缓冲垫

三、程序代码

1. 示例程序

① 智能消防机器人运动程序(main.ino):

#include  //蓝牙

SoftwareSerial BT(10, 11);

//Pin10为RX,接HC05的TX针脚

//Pin11为TX,接HC05的RX针脚


char val;

int input1 = 30; // 定义uno的pin 5 向 input1 输出

int input2 = 31; // 定义uno的pin 6 向 input2 输出

int enA = 2; // 定义uno的pin 3 向 输出A使能端输出

int input3 = 32;

int input4 = 33;

int enB = 3;

int input5 = 34;

int input6 = 35;

int enC = 4;

int input7 = 36;

int input8 = 37;

int enD = 5;

int diancifa = 6;




/****************************主卧*****************************/

void bedroom1()

{

digitalWrite(input1,LOW);   //直行

  digitalWrite(input2,HIGH);

  digitalWrite(input3,LOW);

  digitalWrite(input4,HIGH);

  digitalWrite(input5,HIGH);

  digitalWrite(input6,LOW);

  digitalWrite(input7,HIGH);

  digitalWrite(input8,LOW);

  analogWrite(enA,195);

  analogWrite(enB,185);

  analogWrite(enC,210);

  analogWrite(enD,185);

  delay(1400);


//   digitalWrite(input1,LOW);   //矫正

//   digitalWrite(input2,HIGH);

//   digitalWrite(input3,LOW);

//   digitalWrite(input4,HIGH);

//   digitalWrite(input5,HIGH);

//   digitalWrite(input6,LOW);

//   digitalWrite(input7,LOW);

//   digitalWrite(input8,LOW);

//   analogWrite(enA,195);

//   analogWrite(enB,185);

//   analogWrite(enC,210);

//   delay(450);

//

//   digitalWrite(input1,LOW);   //直行

//   digitalWrite(input2,HIGH);

//   digitalWrite(input3,LOW);

//   digitalWrite(input4,HIGH);

//   digitalWrite(input5,HIGH);

//   digitalWrite(input6,LOW);

//   digitalWrite(input7,HIGH);

//   digitalWrite(input8,LOW);

//   analogWrite(enA,195);

//   analogWrite(enB,185);

//   analogWrite(enC,210);

//   analogWrite(enD,185);

//   delay(1000);

//

//   digitalWrite(input1,LOW);   //停止

//   digitalWrite(input2,LOW);

//   digitalWrite(input3,LOW);

//   digitalWrite(input4,LOW);

//   digitalWrite(input5,LOW);

//   digitalWrite(input6,LOW);

//   digitalWrite(input7,LOW);

//   digitalWrite(input8,LOW);

//   delay(5000);

//

//   digitalWrite(input1,LOW);   //直行

//   digitalWrite(input2,HIGH);

//   digitalWrite(input3,LOW);

//   digitalWrite(input4,HIGH);

//   digitalWrite(input5,HIGH);

//   digitalWrite(input6,LOW);

//   digitalWrite(input7,HIGH);

//   digitalWrite(input8,LOW);

//   analogWrite(enA,195);

//   analogWrite(enB,185);

//   analogWrite(enC,210);

//   analogWrite(enD,185);

//   delay(4200);

//

  digitalWrite(input1,LOW);   //向左转

  digitalWrite(input2,HIGH);

  digitalWrite(input3,LOW);

  digitalWrite(input4,HIGH);

  digitalWrite(input5,LOW);

  digitalWrite(input6,HIGH);

  digitalWrite(input7,HIGH);

  digitalWrite(input8,LOW);

  analogWrite(enA,200);

  analogWrite(enB,200);

  analogWrite(enC,200);

  analogWrite(enD,200);

  delay(2800);

//

//   digitalWrite(input1,LOW);   //直行

//   digitalWrite(input2,HIGH);

//   digitalWrite(input3,LOW);

//   digitalWrite(input4,HIGH);

//   digitalWrite(input5,HIGH);

//   digitalWrite(input6,LOW);

//   digitalWrite(input7,HIGH);

//   digitalWrite(input8,LOW);

//   analogWrite(enA,195);

//   analogWrite(enB,185);

//   analogWrite(enC,210);

//   analogWrite(enD,185);

//   delay(1200);

digitalWrite(input1,LOW);   //停止

  digitalWrite(input2,LOW);

  digitalWrite(input3,LOW);

  digitalWrite(input4,LOW);

  digitalWrite(input5,LOW);

  digitalWrite(input6,LOW);

  digitalWrite(input7,LOW);

  digitalWrite(input8,LOW);


//delay(5000);

//   digitalWrite(diancifa,LOW);

//   delay(3000);

//   digitalWrite(diancifa,HIGH);

  //delay(3000);


  }



/****************************主卧————>阳台*****************************/

void balcony()

{

  digitalWrite(input1,HIGH);   //后退

  digitalWrite(input2,LOW);

  digitalWrite(input3,HIGH);

  digitalWrite(input4,LOW);

  digitalWrite(input5,LOW);

  digitalWrite(input6,HIGH);

  digitalWrite(input7,LOW);

  digitalWrite(input8,HIGH);

  analogWrite(enA,195);

  analogWrite(enB,185);

  analogWrite(enC,210);

  analogWrite(enD,185);

  delay(1500);


  digitalWrite(input1,HIGH);   //向右转

  digitalWrite(input2,LOW);

  digitalWrite(input3,HIGH);

  digitalWrite(input4,LOW);

  digitalWrite(input5,HIGH);

  digitalWrite(input6,LOW);

  digitalWrite(input7,LOW);

  digitalWrite(input8,HIGH);

  analogWrite(enA,200);

  analogWrite(enB,200);

  analogWrite(enC,200);

  analogWrite(enD,200);

  delay(2900);


  digitalWrite(input1,HIGH);   //后退

  digitalWrite(input2,LOW);

  digitalWrite(input3,HIGH);

  digitalWrite(input4,LOW);

  digitalWrite(input5,LOW);

  digitalWrite(input6,HIGH);

  digitalWrite(input7,LOW);

  digitalWrite(input8,HIGH);

  analogWrite(enA,195);

  analogWrite(enB,185);

  analogWrite(enC,210);

  analogWrite(enD,185);

  delay(3000);


  digitalWrite(input1,HIGH);   //矫正

  digitalWrite(input2,LOW);

  digitalWrite(input3,HIGH);

  digitalWrite(input4,LOW);

  digitalWrite(input5,LOW);

  digitalWrite(input6,HIGH);

  digitalWrite(input7,LOW);

  digitalWrite(input8,LOW);

  analogWrite(enA,195);

  analogWrite(enB,185);

  analogWrite(enC,210);

  delay(300);


  digitalWrite(input1,HIGH);   //后退

  digitalWrite(input2,LOW);

  digitalWrite(input3,HIGH);

  digitalWrite(input4,LOW);

  digitalWrite(input5,LOW);

  digitalWrite(input6,HIGH);

  digitalWrite(input7,LOW);

  digitalWrite(input8,HIGH);

  analogWrite(enA,195);

  analogWrite(enB,185);

  analogWrite(enC,210);

  analogWrite(enD,185);

  delay(3000);

  digitalWrite(input1,LOW);   //向左转

digitalWrite(input2,HIGH);

  digitalWrite(input3,LOW);

  digitalWrite(input4,HIGH);

  digitalWrite(input5,LOW);

  digitalWrite(input6,HIGH);

  digitalWrite(input7,HIGH);

  digitalWrite(input8,LOW);

  analogWrite(enA,200);

  analogWrite(enB,200);

  analogWrite(enC,200);

  analogWrite(enD,200);

  delay(3350);


  digitalWrite(input1,LOW);   //直行

  digitalWrite(input2,HIGH);

  digitalWrite(input3,LOW);

  digitalWrite(input4,HIGH);

  digitalWrite(input5,HIGH);

  digitalWrite(input6,LOW);

  digitalWrite(input7,HIGH);

  digitalWrite(input8,LOW);

  analogWrite(enA,195);

  analogWrite(enB,185);

  analogWrite(enC,210);

  analogWrite(enD,185);

  delay(3000);


  digitalWrite(input1,LOW);   //矫正

  digitalWrite(input2,HIGH);

  digitalWrite(input3,LOW);

  digitalWrite(input4,HIGH);

  digitalWrite(input5,HIGH);

  digitalWrite(input6,LOW);

  digitalWrite(input7,LOW);

  digitalWrite(input8,LOW);

  analogWrite(enA,195);

  analogWrite(enB,185);

  analogWrite(enC,210);

  delay(300);


  digitalWrite(input1,LOW);   //直行

digitalWrite(input2,HIGH);

  digitalWrite(input3,LOW);

  digitalWrite(input4,HIGH);

  digitalWrite(input5,HIGH);

  digitalWrite(input6,LOW);

  digitalWrite(input7,HIGH);

  digitalWrite(input8,LOW);

  analogWrite(enA,195);

  analogWrite(enB,185);

  analogWrite(enC,210);

  analogWrite(enD,185);

  delay(2500);


  digitalWrite(input1,LOW);   //矫正

  digitalWrite(input2,HIGH);

  digitalWrite(input3,LOW);

  digitalWrite(input4,HIGH);

  digitalWrite(input5,HIGH);

  digitalWrite(input6,LOW);

  digitalWrite(input7,LOW);

  digitalWrite(input8,LOW);

  analogWrite(enA,195);

  analogWrite(enB,185);

  analogWrite(enC,210);

  delay(300);


  digitalWrite(input1,LOW);   //停止

  digitalWrite(input2,LOW);

  digitalWrite(input3,LOW);

  digitalWrite(input4,LOW);

  digitalWrite(input5,LOW);

  digitalWrite(input6,LOW);

  digitalWrite(input7,LOW);

  digitalWrite(input8,LOW);

  }




/****************************厨房*****************************/

void kitchen()

{

  digitalWrite(input1,LOW);   //直行

  digitalWrite(input2,HIGH);

  digitalWrite(input3,LOW);

  digitalWrite(input4,HIGH);

  digitalWrite(input5,HIGH);

  digitalWrite(input6,LOW);

  digitalWrite(input7,HIGH);

  digitalWrite(input8,LOW);

  analogWrite(enA,185);

  analogWrite(enB,185);

  analogWrite(enC,202);

  analogWrite(enD,185);

  delay(600);

  digitalWrite(input1,LOW);   //向左转

  digitalWrite(input2,HIGH);

  digitalWrite(input3,LOW);

  digitalWrite(input4,HIGH);

  digitalWrite(input5,LOW);

  digitalWrite(input6,HIGH);

  digitalWrite(input7,HIGH);

  digitalWrite(input8,LOW);

  analogWrite(enA,200);

  analogWrite(enB,200);

  analogWrite(enC,200);

  analogWrite(enD,200);

  delay(3300);


  digitalWrite(input1,LOW);   //直行

digitalWrite(input2,HIGH);

  digitalWrite(input3,LOW);

  digitalWrite(input4,HIGH);

  digitalWrite(input5,HIGH);

  digitalWrite(input6,LOW);

  digitalWrite(input7,HIGH);

  digitalWrite(input8,LOW);

  analogWrite(enA,185);

  analogWrite(enB,185);

  analogWrite(enC,210);

  analogWrite(enD,150);

  delay(5000);

//   digitalWrite(input1,LOW);   //直行

//   digitalWrite(input2,HIGH);

//   digitalWrite(input3,LOW);

//   digitalWrite(input4,HIGH);

//   digitalWrite(input5,HIGH);

//   digitalWrite(input6,LOW);

//   digitalWrite(input7,LOW);

//   digitalWrite(input8,LOW);

//   analogWrite(enA,195);

//   analogWrite(enB,185);

//   analogWrite(enC,220);

//   delay(400);

  digitalWrite(input1,LOW);   //直行

  digitalWrite(input2,HIGH);

  digitalWrite(input3,LOW);

  digitalWrite(input4,HIGH);

  digitalWrite(input5,HIGH);

  digitalWrite(input6,LOW);

  digitalWrite(input7,HIGH);

  digitalWrite(input8,LOW);

  analogWrite(enA,185);

  analogWrite(enB,185);

  analogWrite(enC,210);

  analogWrite(enD,165);

  delay(3400);


  digitalWrite(input1,LOW);   //停止

  digitalWrite(input2,LOW);

  digitalWrite(input3,LOW);

  digitalWrite(input4,LOW);

  digitalWrite(input5,LOW);

  digitalWrite(input6,LOW);

  digitalWrite(input7,LOW);

  digitalWrite(input8,LOW);


  delay(3000);


  digitalWrite(input1,HIGH);   //返回

  digitalWrite(input2,LOW);

  digitalWrite(input3,HIGH);

  digitalWrite(input4,LOW);

  digitalWrite(input5,LOW);

  digitalWrite(input6,HIGH);

  digitalWrite(input7,LOW);

  digitalWrite(input8,HIGH);

  analogWrite(enA,185);

  analogWrite(enB,185);

  analogWrite(enC,210);

  analogWrite(enD,185);

  delay(3500);

//   digitalWrite(input1,LOW);

//   digitalWrite(input2,HIGH);

//   digitalWrite(input3,LOW);

//   digitalWrite(input4,HIGH);

//   digitalWrite(input5,LOW);

//   digitalWrite(input6,HIGH);

//   digitalWrite(input7,LOW);

//   digitalWrite(input8,LOW);

//   analogWrite(enA,195);

//   analogWrite(enB,185);

//   analogWrite(enC,210);

//   delay(400);

  digitalWrite(input1,HIGH);

  digitalWrite(input2,LOW);

  digitalWrite(input3,HIGH);

  digitalWrite(input4,LOW);

  digitalWrite(input5,LOW);

  digitalWrite(input6,HIGH);

  digitalWrite(input7,LOW);

  digitalWrite(input8,HIGH);

  analogWrite(enA,185);

  analogWrite(enB,185);

  analogWrite(enC,210);

  analogWrite(enD,185);

  delay(5400);
digitalWrite(input1,HIGH);   //转弯

  digitalWrite(input2,LOW);

  digitalWrite(input3,HIGH);

  digitalWrite(input4,LOW);

  digitalWrite(input5,HIGH);

  digitalWrite(input6,LOW);

  digitalWrite(input7,LOW);

  digitalWrite(input8,HIGH);

  analogWrite(enA,200);

  analogWrite(enB,200);

  analogWrite(enC,200);

  analogWrite(enD,200);

  delay(1700);

 

  digitalWrite(input1,LOW);   //停止

  digitalWrite(input2,LOW);

  digitalWrite(input3,LOW);

  digitalWrite(input4,LOW);

  digitalWrite(input5,LOW);

  digitalWrite(input6,LOW);

  digitalWrite(input7,LOW);

  digitalWrite(input8,LOW);

  }


void go()

{

      //测试

digitalWrite(18,LOW);

      delay(3000);

      digitalWrite(18,HIGH);

      delay(6000);

      digitalWrite(18,LOW);

      delay(3000);

      digitalWrite(18,HIGH);

      delay(6000);

      digitalWrite(18,LOW);

      delay(3000);

      digitalWrite(18,HIGH);

      delay(6000);

}



void goo()

{

      //测试

      digitalWrite(18,HIGH);

      delay(3000);

      digitalWrite(18,LOW);

      delay(30000);

}




void setup()

{

      //蓝牙

      Serial.begin(9600);

      Serial.println("Buletooth is ready!");

      BT.begin(9600);

      pinMode(input1,OUTPUT);

      pinMode(input2,OUTPUT);

      pinMode(enA,OUTPUT);

      pinMode(input3,OUTPUT);

      pinMode(input4,OUTPUT);

      pinMode(enB,OUTPUT);

      pinMode(input6,OUTPUT);

      pinMode(enC,OUTPUT);

      pinMode(input7,OUTPUT);

      pinMode(input5,OUTPUT);

      pinMode(input8,OUTPUT);

      pinMode(enD,OUTPUT);

      pinMode(diancifa,OUTPUT);

      pinMode(18,OUTPUT);//电磁阀

     

}


void loop() {

  if (Serial.available()) {

    val = Serial.read();

    BT.print(val);

  }

  if (BT.available()) {

    val = BT.read();

    Serial.print(val);

    switch(val){

      case '1': bedroom1();break;

      case '2': balcony();break;

      case '3':kitchen();break;

//      case '4':kitchen();break;

      case '5':test();break;

      case '6':go();break;

      case '7':goo();break;

    }

  }

}




//void test()

//{

//   digitalWrite(input1,LOW);   //直行

//   digitalWrite(input2,HIGH);

//   digitalWrite(input3,LOW);

//   digitalWrite(input4,HIGH);

//   digitalWrite(input5,HIGH);

//   digitalWrite(input6,LOW);

//   digitalWrite(input7,HIGH);

//   digitalWrite(input8,LOW);

//   analogWrite(enA,165);

//   analogWrite(enB,240);

//   analogWrite(enC,210);

//   analogWrite(enD,185);


//   }


void test()

{

  digitalWrite(input1,LOW);   //直行

  digitalWrite(input2,HIGH);

  digitalWrite(input3,LOW);

  digitalWrite(input4,HIGH);

  digitalWrite(input5,HIGH);

  digitalWrite(input6,LOW);

  digitalWrite(input7,HIGH);

  digitalWrite(input8,LOW);

  analogWrite(enA,195);

  analogWrite(enB,185);

  analogWrite(enC,210);

  analogWrite(enD,185);

  delay(6000);

  digitalWrite(input1,LOW);   //停止

  digitalWrite(input2,LOW);

  digitalWrite(input3,LOW);

  digitalWrite(input4,LOW);

  digitalWrite(input5,LOW);

  digitalWrite(input6,LOW);

  digitalWrite(input7,LOW);

  digitalWrite(input8,LOW);

  }

② 控制摄像头运动程序(Untitled.m.ino):

//#include 

 Pin10为RX,接HC05的TXD

 Pin11为TX,接HC05的RXD

//SoftwareSerial BT(10, 11);

//

//char val;

//void setup() {

//   Serial.begin(9600);

//   Serial.println("BT is ready!");

//   BT.begin(9600);

//}

//void loop() {

//   if (Serial.available()) {

//    val = Serial.read();

//    BT.print(val);

//  

//   if (BT.available()) {

//    val = BT.read();

//    Serial.print(val);

//   }

//}


#include


Servo servo_pin_3;//云台竖直           未调整

Servo servo_pin_4;//云台平

Servo servo_pin_7;//竖

Servo servo_pin_8;//平


void setup()

{

  Serial.begin(9600);

  servo_pin_3.attach(3);

  servo_pin_4.attach(4);

  servo_pin_7.attach(7);

  servo_pin_8.attach(8);

  servo_pin_3.write(90);

  servo_pin_4.write(90);

  servo_pin_7.write(135);

  servo_pin_8.write(90);

}


void loop()

{

    delay(3000);//延时

    servo_pin_4.write(90);

    servo_pin_3.write(90);

    servo_pin_7.write(135);

    servo_pin_8.write(90);

    delay(2000);

    move3();//左右摆动

    move1();//固定

    delay(200000);

}

void move1(){

  servo_pin_3.write(80);

  servo_pin_4.write(80);

  servo_pin_7.write(175);

  servo_pin_8.write(95);//偏右

}


void move3(){

  for(int i=0;i<10;i++)//摄像头左右摆动

  {

    servo_pin_4.write(110);

    servo_pin_3.write(110);

    delay(200);

    servo_pin_4.write(70);

    servo_pin_3.write(70);

    }

}

//void move2(){

//   servo_pin_3.write(80);

//   servo_pin_4.write(90);

//   servo_pin_7.write(180);

//   servo_pin_8.write(80);

//   delay(1000000);

//}

#include



Servo servo_pin_3;



#define ECHOPIN 14

#define TRIGPIN 15

void setup()

{

   Serial.begin(9600);

   pinMode(ECHOPIN, INPUT);

   pinMode(TRIGPIN, OUTPUT);

   servo_pin_3.attach(3);

}



void loop()

{

   float distance;

   for(int i=0;i<300;i++)

   {

    servo_pin_3.write(10);

    digitalWrite(TRIGPIN, LOW);

    delay(2);

    digitalWrite(TRIGPIN, HIGH);

    delay(10);

    digitalWrite(TRIGPIN, LOW);

    distance = pulseIn(ECHOPIN, HIGH);

    distance= distance/58;

    Serial.println(distance);

   }

   if(distance<=70)

   {

    move1();

    Serial.println("已执行");

   }

   else

    Serial.println("未检测到");

}

void move1()

{

        for(int i=0;i<170;i++){

          servo_pin_3.write( 10+i );

          delay(5);

        }

   delay(15000000);

}





//

//

//

#include

Servo servo_pin_3;

#define hongwai 15

void setup()

{

   Serial.begin(9600);

   pinMode(hongwai, INPUT);

   servo_pin_3.attach(3);

}

void loop()

{

   delay(5000);

   servo_pin_3.write(10);



   if(digitalRead(hongwai)){

    Serial.println("未检测到");

     }

   else

    {

      move1();

    Serial.println("已执行");

   }

}

void move1()

{

   for(int i=1;i<=160;i++)

   {

        servo_pin_3.write( 10+i );

        delay( 10 );

   }

   delay(5000);

}

程序源代码及样机stp图资料内容详见 智能消防机器人

四、参考文献

[1]许博玮,马志勇,李悦.多传感器信息融合技术在环境感知中的研究进展及应用[J].计算机测量与控制,2022,30(09):1-7+21.

[2]赵玲.多传感器信息融合技术及其应用[J].红外,2021,42(01):21-26.

[3]王伟.基于智能机器人的多传感器信息融合技术[J].电子测试,2022,(01):81-83.

[4]王强,沈涛,郭超.多传感器信息融合技术在机器人系统中的应用研究[J].科技风,2019,(24):8.

[5]魏宏飞,赵慧.多传感器信息融合技术在火灾报警系统的应用[J].现代电子技术,2013,36(06):139-140+144.

[6]孙超,杨前明,王飞,王文林.基于协同模糊控制的四轮驱动 AGV 稳定性研究[J].机床与液压,2020,48(17):162-169.

[7]严陈凯,杜玉,伍智泓.基于麦克纳姆轮的全方向移动消防侦查机器人概念设计[J].工业设计,2022,(06):158-160.

[8]刘卓沄,卢桂萍,彭岗举.基于向量分析法对麦克纳姆轮全向移动平台的研究[J].机电工程技术,2022,51(05):147-149+241.

[9]杨朋帅,王琪,王维西,周靖喻,高进可.基于麦克纳姆轮的智能车寻迹控制策略研究[J].工业控制计算机,2022,35(02):112-115.

[10]刘威伯,于稼锐,金一丹,叶红玲.麦克纳姆轮的动力学分析[A].北京力学会.北京力学会第二十八届学术年会论文集(上)[C].北京力学会:北京力学会,2022:431-432

[11]杨俊驹,林睿,王振华,孙立宁.轮式移动机器人运动控制系统研究与设计[J].现代电子技术,2016,39(02):22-27.

[12]陈子豪.消防机器人运动控制系统的开发与实现[D].导师:董辉.浙江工业大学,2020.

[13]谢永超,杨利,严俊.基于 MQ-2 型传感器的烟雾探测报警器的设计[J].计算机测量与控制,2021,29(08):255-259.

[14]姜斌.基于多传感器的火灾自动报警器的设计[J].自动化应用,2014,(07):89-90.

[15]李思熠,王少坤.基于 OpenMV 和 Arduino 的智能巡线机器人[J].科技与创新,2020,(22):50-53.

[16]李成勇,谭寒钟,王莎,胡晶晶.基于 OpenMV 的智能“寻的”小车控制系统[J].液晶与显示,2020,35(08):870-876.

你可能感兴趣的:(机器人)