机器谱

【S002】基于机器视觉的移动消防机器人

图文展示3264(1)

图文展示3264(1)

副标题

简介
功能设计
详细设计
软件设计
实验验证
程序代码
参考文献

作者:牟义达、黄瑞翔、李涛

单位:北方民族大学机电工程学院

指导老师:田国禾、张春涛

简介

      随着社会的发展,我们的生活不断走向智能化,机器人技术也日益成熟并朝着智能机器和智能系统的方向进行发展。

      机器人技术主要是对生活和工作环境进行优化设计。特别是智能化作业,对人们的生活带来了大的改变,它让我们的生活和工作更加便捷。智能化作业主要是设计算法,算法也即控制方法。这些算法能够大大降低我们作业的复杂性,然后利用一些传感器和机械结构来实现我们设计的算法,进而实现我们所需的功能。

      随着如今建筑结构的复杂性与高危性,灾难发生的不可预知性,一旦发生大型火灾就特别危险,因为可能伴随着大量有毒气体等毒性物质,每年有很多消防战士牺牲于消防作业之中,这时消防机器人就应运而生了。随着机器人技术的日益成熟,智能消防机器人也非常常见,相对于早期的非智能消防机器人,它能够更好地为人们去危区作业,大大地降低了人员伤亡,缓解损失。因此有非常不错的发展前景。

      本课题所设计的消防机器人是以探索者组件进行搭建的,以Arduino为平台进行控制设计,模拟真实消防机器人进行消防作业。

      这个消防机器人设计核心是检测功能,它能够在一块区域内基本无死角检测火源,检测到之后能够精确定位到火源处,再开启灭火装置进行消防操作。

1.功能分析

      智能消防机器人应拥有自主抵达作业现场、对火源进行检测以及及时作出消防动作的能力。自主抵达作业现场功能的实现则需要消防机器人能够自主行走,对火源进行检测功能的实现则需要机器人有相应的范围内检测及传感功能,灭火功能的实现则需要机器人要有合适的灭火装置。因此消防机器人应具备的能力有:自主行走、火源检测、灭火等功能。


2.系统总体方案设计

      如上图所示,消防机器人的作业系统主要由机器人本体与被检测物(火源)组成。消防机器人本体主要由控制模块、驱动模块和检测模块组成;驱动模块包含驱动机器人自主行走和驱动灭火装置两部分。作业关系流程如下:消防机器人通过检测模块在一定范围内检测火源;若火源被检测模块检测到,则将该信息反馈于消防机器人的控制板模块,控制板模块则命令驱动模块驱动灭火模块,直到灭火模块完成灭火操作;灭火操作完成后则控制模块驱动机器人行走模块进入下一个消防作业区。


3.消防机器人控制模块

      消防机器人的控制模块是机器人的大脑,机器人的执行由该模块控制。控制模块的设计主要就是软件设计,也即编程设计。编程设计主要是将各个功能模块有机结合起来,使得机器人各个功能相互协调,共同合作有效完成相应功能。


4.消防机器人驱动模块

      消防机器人的驱动模块是完成机器人进行消防作业功能的主要执行模块。驱动模块受控制模块的控制,安照控制模块给出的指令完成相应的操作。驱动模块主要完成的操作有“驱动机器人行走模块”和“驱动灭火装置”。

      驱动行走模块是为了对消防机器人进行作业区转移,待当前的消防作业完成之后其进入下一个消防作业区进行作业。行走模块主要是基于探索者组件设计的,探索者里有功能各异的零部件,根据机器人的功能对零件进行分析选取,之后设计出自己所需要的机械结构完成行走行走功能。要实现驱动有很多方案,如轮式的、履带式的、足式的等,可以根据探索者组件进行分析筛选,选择出最合适的方案。

      驱动灭火装置是待机器人检测到火源之后需要完成的动作,灭火装置具备扑灭火源的能力并且受命于控制模块。灭火装置也是基于探索者组件进行设计的,对探索者零部件进行分析筛选,最后根据功能需求选择最佳方案。


5.消防机器人检测模块

      消防机器人的检测模块主要是检测作业区有无火源,若有火源则将该信息反馈于控制模块,若无火源也要将该信息反馈于控制模块,控制模块才能根据反馈的信息对驱动模块作出相应指令。检测模块具备在作业范围内检测火源的能力,基于探索者组件进行设计,其主要设计的零部件是相应的传感器以及能够使传感器在范围内检测的机械结构,可以分析筛选探索者组件,选择最佳设计方案。

功能设计
详细设计

1.消防机器人的本体设计

      根据消防机器人的功能特点,对探索者的零件加以分析,选择与功能向匹配的零部件进行构建机器人机械体。

      首先是机器人的自主行走的能力。实现机器人自主行走这个功能可以有很多方案。有轮式的、足式的、履带式的机器人可以完成这项功能。根据探索者组件里的零部件进行筛选,我发现有轮式的现成的驱动轮,并且轮式的可靠性要比足式的和履带式的要高,而且结构相对要简单,因此综合考虑我选择轮式作为机器人的驱动方式。

      其次是机器人的检测火源的能力。检测火源应该是逐个范围内进行检测,所以机械结构应该是需要有两个及以上的自由度。根据探索者组建里的零部件,可以实现两个自由度的机械组合也比较多,比较常见的就是两转动轴互相垂直的组合。转动轴的转动靠的是电机,电机有直流电机、圆周舵机和180度转动舵机。考虑到消防机器人检测需要有一定的检测精度,也即需要一定的位置精度,考虑到直流电机和圆周舵机是无法控制精度的,所以选择180度转动舵机,并且舵机的扭矩比较大,也很完美地契合消防机器人的功能。所以两个180度圆周舵机是我所选的转动轴。之后根据所选舵机来选择舵机所需支架和所需输出头。

      最后是灭火装置的设计。灭火的方式主要就是喷阻燃剂,阻燃剂不光式水,其他能够降低燃料的可燃性或者延迟燃烧的物质都能称之为阻燃剂。考虑的实验的局限性,可以选择的方案不多,可以选择喷水式,还可以选择鼓吹强风(蜡烛模拟火源)。由于设计的过程需要不断地进行实验,所以用水比较麻烦,影响设计效率,所以选择鼓吹强风作为我的灭火方式。

      通过探索者组件已经可以选择出能完成功能的零部件了,现在就要考虑如何将这些功能模块结合于一体。由于是轮式结构机器人,所以我将机器人设计成小车模型。从底板开始,探索者组件里有很多平板类结构,有5×7孔平板、7×11孔平板和11×25孔平板。考虑到机器人模块比较多,所以我选择了最大的11×25孔平板作为机器人底板。接下来是将检测装置合并到机器人中,用4块7×11孔平板组合形成一个带有大空隙顶板。空袭可以避免与舵机发生干涉。

2. 控制模块设计

(1)控制板的选择

      控制板选择Basra控制板,由于Basra板上输出口无法直接与电机和传感器等元件进行匹配,所以需要一块用于连接功能元件和主控板的扩展板。因为探索者组件里只有一块与Basra控制板结合的扩展板,所以扩展板因主控板的确定而确定了。与Basra主控板匹配的扩展板是Bigfish扩展板,扩展板可以使得主控板的电路连接稳定可靠,上面还扩展了伺服电机接口、8*8Led点阵、直流电机驱动以及一个通用扩展接口,可以说是Arduino控制板的必备配件。

需要注意的是D11\D12舵机端口与LED点阵复用,注意避免同时使用。背面两侧的跳线分别作用于两侧的红色接口(通常采用5v,接传感器)或白色接口(通常采用6v,接舵机),使用需检查背面跳线设置是否与器件电压相符。  

(2)传感器的选择

      探索者组件里有大量功能各异的传感器,需要选择能够检测火源来完善火源检测模块的那些。参考这些传感器的功能,有些是可以检测火源的,比较合适的还是火焰传感器。只要在照度30LUX以下的环境中,火焰传感器还是能够有效检测出火源的。因此火源检测模块选用的传感器就为火焰传感器。

      火焰传感器也称光强传感器,因为可以检测范围内的光线强度,所以可以用来检测火源,火焰传感器可以在30LUX照度以下触发,当照度大于30LUX时传感器不触发。特别要注意的是,火焰传感器不要和闪动传感器混淆,闪动传感器和它相似,闪动传感器的触发方式为:30LUX照度以下时变亮触发,30LUX照度以上时变暗触发。

(3)电动机的选择

      前面已经确定选用轮式驱动,轮子已经确定,现在需要选择合适的电机来与轮子配合。探索者组件里的电机有双轴直流电机、12V直流电机、无刷电机和圆周舵机满足驱动要求。考虑到只是为了完成自主行走功能,实验也无需越障爬坡,所以选择简单廉价的双轴直流电机作为与轮子配合的驱动电机即可。

      双轴直流电机外接于BigFish扩展板的5、6引脚或9、10引脚,5、6引脚与9、10引脚是由VIN引入外部电源的,其电压基本与外接电源电压大小一致,电压范围为5.9V。设计计划在机器人上安装4个直流电机,前后各两个,四驱使得机器人小车的动力足够,行动迅捷。由于有四个直流电机,而BigFish上只有两个插线引脚(5、6和9、10),所以需将同侧的两个电机引线合并到一起并将其插入扩展板的同一引脚上,将另一侧的两个电机引线合并到一起插入扩展板的另一引脚上面。

      除了驱动机器人需要引用电机,检测功能也需要电机。由于舵机的可控性强,可以在工作范围内精确控制电机的转动角度。而消防机器人的主要工作就是“检测火源、精确定位、作出处理”,所以舵机能够为消防机器人的工作提供极大的便利。两个舵机使得机器人有了两个自由度,工作范围由线性转变为面性,大大提高了消防机器人的工作效率。


      探索者组件里有M01标准伺服舵机和M04大标准伺服舵机,由于两个舵机都需要承受一定的负载,所以我选用的都是M04大标准伺服舵机。以下是舵机的原理介绍:

      舵机称之为伺服电机,它是一种角度伺服的驱动器      。主要是由直流电机、控制电路、电位器和减速器等组成,封装于一个单元盒里便于安装于控制。接受外部的控制信号并将其输入信号调制芯片,从而得到一个偏置电压。舵机内部有一个基准电路,电路会产生宽度为1.5ms、周期为20ms的基准信号,使所获得的直流偏置电压与电位器的电压相比较,得到一个电压差输出         。而电压差的正负来控制电机的正反转(电压差输出到电机驱动芯片)。当电机转速达到一定值时,电位器被联级减速齿轮所带动,电位器相当于一个滑动变阻器,当电位器达到一定状态时会使得电压差为0,从而使得电机停止转动         。这样的直流电机控制方式叫作闭环控制,所以舵机也可称作伺服马达,英文为“servo”    。

3. 机器人小车的装配

(1)轮子的安装

①支架安装:常见装法完成后的效果如下图所示,使用螺丝:F325。

②输出头安装:完成效果图2.26,安装于粉色端,中心需安装F2510H。

③在联轴器里放置一个15mm的螺柱,如图2.27。

④将联轴器与直流电机输出头锁死,使用螺丝F310,如图2.28。

⑤锁上轮胎,如下图所示。

(2)大标准舵机的安装

①支架安装

②安装舵机输出头

③机器人车身设计

    底板选的是11×25的,再用四个弯板安装在底板的四个角上,用以支撑4块7×11的板,4块小板组合成一块顶板,中间留有间隙用以安装舵机。底板下面四个边角安装四个驱动轮。

④灭火装置的安装

灭火装置是由小马达和自剪风扇叶组合而成,安装于设计的长杆上面,长杆受舵机控制可以在一定角度范围内进行摆动。

⑤机器人小车完整版

驱动轮、舵机控制的灭火装置以及车身构架完成后,安装控制板及完成接线后,整个小车就完成设计了,如下图所示。

注释:

       张国元. 某型舵机改进设计及其仿真分析[D].哈尔滨工业大学,2016.

         郑州 姜笃庆. 微型伺服电机(舵机)原理简介[N]. 电子报,2004.10.17(013).

         蔡睿妍.Arduino的原理及应用[J].电子设计工程,2012,20(16):155.157.

         蔡睿妍.基于Arduino的舵机控制系统设计[J].电脑知识与技术,2012,8(15):3719.3721.

软件设计

1. 总系统软件流程图

      为了实现消防功能,对软件进行系统设计。根据机器人要实现的功能进行逐一设计,设计完之后再将其整合到一起,整合之后的就是总的设计,下面就是总设计的流程图。总流程图如下:

      小车的整个功能流程如上图所示。小车先前行一段距离,之后停下来检测火源,若检测到火源,则记下火源的位置,然后命令灭火装置抵达火源处进行消防作业。火灭之后小车再度前行,之后再循环前面操作。


2. 各个功能的流程图

(1)机器人自主行走的流程

      自主行走功能的实现主要是驱动电机的转动,电机附于控制板。当控制板控制电机的两个引脚电压不同且电压差达到电机的工作电压时,电机就朝一个方向转动,从而达到驱动机器人小车的目的。控制控制板对应电机的引脚电压的流程图如上,即开始时让引脚有个电压差,0.5秒后让引脚电压持平(电机停止转动),这时看检测模块的状态,若火已被检测到,则引脚电压继续持平,若火已灭则引脚会有电压差。

(2)检测功能的流程

      检测的流程为:舵机1先定于水平位置,驱动轮驱动小车前行,小车停下时舵机1、2开始范围内摆动。因为传感器安装于舵机1、2控制的杆上,所以当舵机1、2范围内摆动时传感器可以在该范围内进行火源检测。若在该范围内检测到火时,则舵机1、2摆动完成之后会定位到火源的位置,此时灭火装置开启;灭火装置工作一段时间后再进行检测,若还能检测到火源,则舵机1、2还是保持原位并开启灭火装置提供的灭火功能。若未检测到火源,则舵机循环开始的行程。    

(3)灭火功能流程

      消防机器人小车的灭火流程不是很复杂,灭火装置就是由小马达和风扇叶组合而成的,当马达转动时风扇开启,所以只需控制马达的转动就能控制灭火装置的灭火功能。当检测到火时控制马达转动,当检测不到火时控制马达停止,这也就能达到控制灭火功能的要求。

实验验证

1. 自主行走功能验证

实验目的:让机器人小车行驶500ms后停500ms,循环重复。

实验器材:计算机、消防机器人小车。

实验步骤:设计自主行走功能检验程序;将双轴驱动直流电机连接于控制板上9、10引脚上;编译、烧录控制程序;锂电池插再控制板上给其供电;

                打开控制板电源开关;观察小车驱动轮的状态。

实验结果:小车驱动轮在控制板电源开启时转动,转动500ms后停下,之后往复循环。

实验结论:小车能按照指定功能执行操作,具备自主行走能力。

2. 火源检测功能验证

实验目的:让机器人小车检测火源并使机器人灭火装置定位至火源处。

实验器材:计算机、消防机器人小车、打火机、蜡烛一根。

实验步骤:设计火源检测功能检验程序;将舵机1、2分别连接于控制板的3、8引脚上;编译、烧录验证程序;控制板连接锂电池;在光照度不强的

                场地点燃蜡烛并将蜡烛固定摆放;将消防机器人小车与距蜡烛保持合适距离(因光照强度的不同传感器的有效触发距离不同),可以不

                断改变蜡烛的摆放位置;打开控制板开关;观察小车检测装置的运行状态。

实验结论:小车的检测装置在一定范围内检测,范围内检测完成之后若中途检测到火源则会定位到火源处。消防机器人小车具备检测火源的功能。

3. 灭火功能验证

实验目的:使灭火装置对准火源,开启灭火装置,检验是否能完成灭火工作。

实验器材:计算机、消防机器人小车、蜡烛一根、打火机。

实验步骤:设计灭火功能检验程序;将灭火装置连接于控制板上;编译、烧录检验程序;连接锂电池于控制板上;点燃蜡烛并固定摆放;使灭火装

                置对准火源并保持合适距离;打开控制板电源;观察蜡烛是否被吹灭。

实验结论:灭火装置开启时蜡烛很快被吹灭,消防小车灭火装置具备灭火功能。

4. 消防机器人小车功能整体验证

实验目的:检测消防小车能否按照所设计的消防程序进行消防作业。

实验器材:计算机、消防机器人小车、蜡烛一根、打火机一个。

实验步骤:将设计好的总程序编译、烧录至控制板;将驱动直流电机、两个舵机、灭火装置分别接线于控制板;点燃蜡烛并固定摆放于合适位置;

                将消防机器人小车放置距离蜡烛1m处,开启控制板电源;观察消防机器人的运行状态。

实验结论:消防机器人小车能完成消防作业,程序设计合理。

程序代码

1.消防机器人控制程序

#include <Servo.h>

  Servo myservo1;                          //定义两个舵机

  Servo myservo2;

  int pos1 = 0;                              //舵机初始角度

  int pos2 = 0;

  const int buttonPin = A2;                    // 传感器端口设为A2

  int buttonState = 0;                         //设一个转换库


  void setup()

  {

    Serial.begin(9600);                       //初始化串口

    myservo1.attach(3);                      //舵机接线端口设为3和8

    myservo2.attach(8);

    pinMode(5,OUTPUT);                    //定义5、6、9、10、11为输出端口

    pinMode(6,OUTPUT);

    pinMode(9,OUTPUT);

    pinMode(10,OUTPUT);

   

  }


void loop()

{

  buttonState = digitalRead(buttonPin);          //读取A0的电平并存于转换库里面

  myservo1.write(150);                       //舵机1定在150度

  Serial.println(" 舵机1定在150度")

  delay(3000);

  digitalWrite(5,1);                           //车四个轮子驱动前进

  digitalWrite(6,0);

  digitalWrite(9,HIGH);

  digitalWrite(10,HIGH);


  delay(500);                                //0.5秒延迟

  digitalWrite(5,1);                           //车停下来

  digitalWrite(6,1);

  digitalWrite(9,HIGH);

  digitalWrite(10,HIGH);

  Serial.println(" 舵机2开始正摆动");

  for(pos1 = 120; pos1 < 170; pos1 += 10)         // 舵机1开始正摆动

    {

     myservo1.write(pos1);

     for(pos2 = 20; pos2 < 160; pos2 += 1)        // 舵机2开始正摆动

        {                                 

         myservo2.write(pos2);

         if(digitalRead(buttonPin))             //如果火焰传感器触发(A0被至1),将pos2此时的值记下并保存于buttonState中

            {

             buttonState=pos2;

             duoji1jiaodu=pos1;

             }

         Serial.println(buttonState);            //串口监视器返回buttonState值

         delay(60);                         

        }

     }

     

   if(buttonState)                              //非零即为真

     {

      Serial.println(" 舵机转至火焰处");

      myservo1.write(duoji1jiaodu);

      myservo2.write(buttonState);

      delay(3000);

      while(digitalRead(buttonPin))              //检测到火时一直开启风扇

          {

            Serial.println(" 风扇一直开");

            digitalWrite(9,HIGH);

            digitalWrite(10,LOW);

            delay(3000);

           }

       Serial.println(" 火灭了,风扇关了,小车前进");

       delay(500);                           //停0.5秒

       digitalWrite(5,1);                      //车停下来

       digitalWrite(6,1);

       digitalWrite(9,HIGH);

       digitalWrite(10,HIGH);

     

      }

       

   else

     {

       digitalWrite(5,1);                      //车四个轮子驱动前进

       digitalWrite(6,0);

       delay(500);                           //停3秒

       digitalWrite(5,1);                      //车停下来

       digitalWrite(6,1);

       Serial.println(" 舵机1 2开始负摆动");

       for(pos1 = 170; pos1>120; pos2 .= 10)      //舵机1开始负摆动

         {

          for(pos2 = 160; pos2>20; pos2 .= 1)     //舵机2开始负摆动  

             {                                 

              myservo2.write(pos2);

              if(digitalRead(buttonPin))          //如果火焰传感器触发

(A0被至1),将pos2此时的值记下并保存于buttonState中

                 {

                  buttonState=pos2;

                  duoji1jiaodu=pos1;

                             

                 }

              Serial.println(buttonState);

              delay(60);                       

              }

          if(buttonState)                          //非零即为真

            {

             myservo1.write(duoji1jiaodu);

             myservo2.write(buttonState);

             delay(3000);

             while(digitalRead(buttonPin))         //检测到火时一直开启风扇

                  {

                   digitalWrite(9,HIGH);

                   digitalWrite(10,LOW);

                   delay(3000);

                  }

             Serial.println(" 火灭了,风扇关了,小车前进");     

             delay(500);                          //停3秒

             digitalWrite(5,1);                     //车停下来

             digitalWrite(6,1);

             digitalWrite(9,HIGH);

             digitalWrite(10,HIGH);

           

             }

         }

     }

}

2. 小车自主行走功能验证程序代码

void setup()

{

  pinMode(9,OUTPUT);            //定义9、10引脚为输出引脚

  pinMode(10,OUTPUT);

}


void loop()

{

  digitalWrite(9,HIGH);            //9引脚输出高电平

  digitalWrite(10,LOW);           //10引脚输出低电平

  delay(500);                    //延迟0.5秒

  digitalWrite(9,HIGH);           //9、10引脚输出高电平

  digitalWrite(10,HIGH);


}


检测功能验证程序代码

#include <Servo.h>

  Servo myservo1;               //定义两个舵机

  Servo myservo2;

  int pos1 = 0;                  //舵机初始角度

  int pos2 = 0;

  const int buttonPin = A0;     // 传感器端口设为A0

  int buttonState = 0;          //设一个转换库

  void setup()

  {

    myservo1.attach(3);        //舵机接线端口设为3和8

    myservo2.attach(8);

   

  }


void loop()

{

  buttonState = digitalRead(buttonPin);   //读取A0的电平并存于转换库里面

  myservo1.write(150);               //舵机1定在150度

  for(pos2 = 20; pos2 < 160; pos2 += 1)   // 舵机2开始正摆动

     {                                 

      myservo2.write(pos2);

      if(digitalRead(buttonPin))     //如果火焰传感器触发(A0被至1),将pos2此时的值记下并保存于buttonState中

         {

          buttonState=pos2;

          }

      delay(60);                         

     }

     

  if(buttonState)                     //非零即为真

      {

       myservo2.write(buttonState);

      }

     

  else

     {

      for(pos2 = 160; pos2>20; pos2 .= 1) //舵机2开始负摆动  

         {                                 

          myservo2.write(pos2);

          if(digitalRead(buttonPin))      //如果火焰传感器触发(A0被至1),将pos2此时的值记下并保存于buttonState中

          buttonState=pos2;           

          delay(60);                       

          }

      if(buttonState)                     //非零即为真

        {

         myservo2.write(buttonState);

         

         }

     }

}

3. 灭火功能验证程序代码

void setup()

  {   

    pinMode(5,OUTPUT);          //定义5、6为输出端口

    pinMode(6,OUTPUT);   

  }

void loop()

  {

    digitalWrite(5,1);              //5引脚输出高电平

    digitalWrite(6,0);              //6引脚输出低电平

  }


参考文献

[1] 孙姜旭. 小型消防机器人分析与设计[D].西安电子科技大学,2012.

[2] 宫红锁,杨慧红,靳云玲.中国消防机器人的展望[J].中国公共安全(学术版),2012(01):128.130

[3] 刘军,程继国,尹志,沈耀宗.消防机器人灭火救援应用技术分析[J].消防技术与产品信息,2010(11):15.18.

[4] 付强. 消防机器人相关技术研究[D].沈阳理工大学,2017.

[5] 党海昌.消防机器人在我国灭火救援中的应用现状和前景分析[J].消防技术与产品信息,2016(03):69.71.

[6] 张国元. 某型舵机改进设计及其仿真分析[D].哈尔滨工业大学,2016.

[7] 郑州 姜笃庆. 微型伺服电机(舵机)原理简介[N]. 电子报,2004.10.17(013).

[8] 蔡睿妍.Arduino的原理及应用[J].电子设计工程,2012,20(16):155.157.

[8] 蔡睿妍.基于Arduino的舵机控制系统设计[J].电脑知识与技术,2012,8(15):3719.3721.

[10] 程晨. Arduino开发实战指南:AVR篇[M].机械工业出版社,2012.2.

© 2022 机器时代(北京)科技有限公司  版权所有
机器谱——机器人共享方案网站
学习  开发  设计  应用