极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1238|回复: 0

机器人制作开源方案 | AI校园服务机器人

[复制链接]
发表于 2024-1-16 08:39:41 | 显示全部楼层 |阅读模式
本帖最后由 机器谱 于 2024-1-16 08:39 编辑

作者:李强、李振宁、毛维雷、李文文、张奥
单位:山西能源学院
指导老师:姚志广、程晟
      在这个科技飞速发展的时代,在工业智造、人工智能的飞速发展中,出现了越来越多的智能化机械装置,也有许多创新类的比赛,本作品基于探索者创新套件设计平台设计出一款全地形小车,通过自主构思和一系列调试设计出了一款以前履带后柔性结构为主的多功能越障移动装置。系统整体设计符合大赛规则,并具备一定的实用性和美观。

1. 作品简介
       作品名为AI校园服务机器人,之所以叫它AI校园服务机器人,是因为它主要针对新生进行迎新引导或对校园进行巡查。作品为六驱形小车,拥有速度快、结构稳的特点,同时在前驱动与中驱上安装了履带结构,后驱上安装了一对加大轮子,解决了重心不稳的问题。同时这个结构使得它在台阶障碍面前更是得天独厚,再也不用为后轮因摩擦力太小而上不去的问题而担忧。不仅如此,前履带后轮胎的结构可以互相弥补各自的不足,使得它既有稳定的结构,有不失速度的体验。此结构独特且实用,为本作品的点睛之笔。


2. 场景调研
      小车名为AI校园机器人,故将其使用场景设定为在校园内。在校园中新生入学时多对校园环境并不熟悉,并且为了校园安全学校便会派人经常对学校进行巡查,这些情况在以往都需要大量人力来解决。其中校园中的教学楼、餐厅以及操场等地点又坐落地点相距较远,而小车具有能多地形行进、能够通过语音回答引导类相关问题以及显示屏显示基本校园介绍等功能,可以有效的解决上述情况。并且小车速度快、结构稳,可以与同学手机互连,在要去一些地点却不知道具体位置时便可以通过手机定位到小车来进行路线引导,操作便捷,实用性强。


3. 机器人本体技术路线说明
      ① 机械结构设计方面:采用大轮加1:10模型轮胎的柔性底盘,以履带为前置驱动,提高越障能力,后轮采用履带模型大轮,提高抓地力,并且采取抬高底盘的设计,增强障碍的通过性。
       ② 本体控制与驱动方面:使用的是 Basra主控板【https://www.robotway.com/h-col-135.html】 和 BigFish扩展板【https://www.robotway.com/h-col-136.html】 组合而成的单片机模块,使用六电机全驱动,电机为TT直流电机。
       ③ 传感部分:选用 超声测距传感器【https://www.robotway.com/h-col-137.html】 ,并经过若干次距离与位置调试,将传感器安装在底盘中较为合适的位置;图像传输传感器安装在小车前侧,以便完成物体的检测以及定位。

4. 结构方案说明
4.1 设计思路
       ① 机械结构设计方面:采用大轮加1:10模型轮胎的柔性底盘,以履带为前置驱动,提高越障能力,后轮采用履带模型大轮,提高抓地力,并且采取抬高底盘的设计,增强障碍的通过性,整个机械移动底盘设计为结合各方面资料自主创新的。
       ② 硬件设计方面:使用的是六电机全驱动,电机为TT直流电机,为整车提供强大动力。
       ③ 软件设计方面:使用Arduino1.5.2进行程序的设计与调试。
       ④ 系统开发与调试方面:基于通过所有障碍、设计全地形越障移动底盘的目的对机械结构底盘和模块化的程序不断进行调试和优化,以期达到更好设计方案。
       ⑤ 调试问题与过程方面:针对具有一定高度的台阶,为了越过此类障碍,经过无数次调试,发现其上不去是因为前驱动轮特别容易打滑,因此经过分析将前驱动改为履带驱动,后由于下台阶颠簸过强,将后置改为柔性轮,并对底盘进行一定程度的优化。
4.2 机械结构设计
       小车以履带为前置驱动,后轮为履带模型大轮的结构,既能提高小车的越障能力,还能保证小车对地面的抓力,减少由轮胎上带来的行进和通过障碍物时产生的误差,保证小车的流畅性和稳定性。前置约30°角的履带驱动,同时使整车设计轻巧便捷,能够更好更稳定的通过台阶,设计时多次抬高底盘,以便小车可以平稳通过。并且根据所给出的机械零件的大小和尺寸,经过不断的调整更换来更加合理地安排整车布局,使之能够顺利通过所有障碍,完成日常生活上的所有要求。
4.3 硬件设计
       各零部件均为统一的探索者创新设计套件。
       ① 主体方面:采用了三块5x7的孔平板和两块7x11的孔平板及两块大舵机支架搭成底盘的主体部分,然后用履带、双足支杆等零件组成移动底盘的机械结构。
       ② 控制器方面:使用的是Basra主控板和BigFish扩展板组合而成的单片机模块。
       ③ 电机方面:采用六个直流电机作为所有轮驱动。电源为统一提供的电源,额定电压为7.4V。
       ④ 传感器方面:选用两个超声测距传感器。
       ⑤ 功能模块方面:选用语音识别模块、WIFI无线路由器、OLED显示模块、摄像头 00:12 、模拟舵机,共同结合组成机器人的人工交互系统。
4.4 装配图

5. 作品创新点
      ① 本车针对台阶、斜坡等不易机器人行进的地形设置前置约30°角的履带驱动,增大了小车前置驱动轮的摩擦力,既能提高小车的越障能力,还能保证小车对地面的抓力,减少由轮胎上带来的行进和通过障碍物时产生的误差,保证小车的流畅性和稳定性,使整车设计轻巧便捷,能够更好更稳定的通过台阶,设计时多次抬高底盘,更好的适应了地形,有效的解决了小车无法越过台阶障碍等问题,有利于多地形行走。但四驱的动力仍然不足,经常在上台阶时卡死,所以经过对此问题的分析,加入了中驱辅助越过台阶障碍,同时也成为整车最为独特的创新点。
      ② 在小车的顶部我们加入了摄像头、显示屏以及路由器,并且还给小车加入了语音模块,使得新生连接WiFi后它可以回答新生提出的一些问题并进行对应的引导,在不迎新时对校园进行巡检,减少了相关的人力浪费。并且,多台小车放置在一起时,可互相联接构成局域网,同学们可以在手机上获取其所在位置。
      ③ 后置驱动轮采用柔性结构,有效的减轻了上下台阶的颠簸问题,起到了一个减震的作用。该设计使小车无论在什么养的地形上行进时车身都可以保持一个相对平稳的状态,从而既不失速度,又具有很强的稳定性。这个创新点不仅解决了本车自身的问题,更为以后的创新提供了一条新的思路。

6. 作品难点及解决方案
      在软件和硬件上,能够通过典型障碍,这些障碍能够代表生活中绝大部分的障碍,事实上在实际场景中,还要考虑电机功率、传感器灵敏度、外观设备等绝大部分的因素,来设计适应不同场合的移动装置。
      最初的设计方案中运用到了大小轮结合的设想,目的在于多场地可应用于多场地的切换,但是由于场地的复杂多变,使用一组大小轮反而不利于小车的爬坡故而更改了设计方案,后经过多方调整最终发现运用柔性与履带及大小轮相结合是最稳定的方案。
在制作中面对电气元器件之间走线杂乱无序,电池等器件暴露在外部空气中,容易造成短路等安全问题。因此增大驱动动力,提高越障能力,设计模块的安装部位,加强模块之间的管理,方便模块之间的拆装,提高电子元器件的安全性显得尤为重要,最终才设计为当前最佳方案。

7. 示例程序
  1. #include <SoftwareSerial.h>

  2. #include <Servo.h>                  // 舵机库函数

  3. #include <Arduino.h>

  4. #include <Wire.h>                      //OLED库函数

  5. #include <MultiLCD.h>

  6. #include "HBR640.h" //使用hbr640模块需要的函数库;

  7. LCD_SSD1306 lcd;

  8. //定义管脚2/3分别为RX,TX.  

  9. SoftwareSerial mySerial(2, 3);                   //开软串口

  10. int echo=12;

  11. int trig=3;

  12. Servo myservo;

  13.   HBR640 hbr640;      //实例化一个语音识别模块;

  14.   char i;

  15.   #define Numbers_of_Voece 80 //定义的语音库数量(根据实际情况更改);

  16.   #define Voice_Time 4500 //语音命令延时时间;



  17.   unsigned char b = 0xC8;

  18.   unsigned char c = 0x00;

  19.   unsigned char a[Numbers_of_Voece] = {0x00,

  20.   0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x10,0x11,0x12,0x13,0x14,0x15}; //定义的语音库相关词条序号



  21.   void setup()

  22.   {

  23.     lcd.begin();            

  24.     Serial.begin(9600);

  25.     mySerial.begin(9600);            //设置串口波特率

  26.     myservo.attach(11);

  27.     hbr640.open(); //开始进行语音识别

  28.    

  29.     pinMode( 5 , OUTPUT);               

  30.     pinMode( 6 , OUTPUT);                  

  31.     pinMode( 9 , OUTPUT);                       //为驱动部分开口

  32.     pinMode( 10 , OUTPUT);

  33.     pinMode(trig,OUTPUT);                     

  34.     pinMode(echo,INPUT);

  35.   }



  36.   void Get_Mode(byte character[] ,unsigned char s,unsigned char d,int Num)

  37.   { //将烧写好的语音命令发送给hbr640模块

  38.     unsigned char _YuYin[3];

  39.     _YuYin[0] =   s; _YuYin[1] = character[0]; _YuYin[2] =d;

  40.     for(int i=0;i<Num;i++){

  41.       Serial.write(_YuYin,3);

  42.       delay(Voice_Time);

  43.     }

  44.   }



  45.   void loop() {

  46.    

  47.             i=0;  

  48.           if( mySerial.available()>0 )                 //执行软串口的信号指令

  49.           {         

  50.            i= mySerial.read();  

  51.             switch(i)

  52.             {

  53.               case '1':

  54.               Forward();

  55.               break;

  56.             

  57.               case '2':

  58.               Back();

  59.               break;

  60.             

  61.               case '3':

  62.               Left();

  63.               break;

  64.             

  65.               case '4':

  66.                Right();

  67.               break;

  68.             

  69.               case '5':

  70.               Stop();

  71.               break;

  72.               case '6':

  73.                Leftpiao();

  74.               break;

  75.             

  76.               case '7':

  77.               Rightpiao();

  78.               break;

  79.             }

  80.           }

  81.    

  82.     if(hbr640.isHeard()) //如果监测到识别语句

  83.     {  

  84.       int value = hbr640.getSentence(); //获得识别语句的序号

  85.       switch (value)

  86.      {

  87.       case 0: Forward();

  88.               delay(3000);

  89.               Stop();

  90.               delay(5000);

  91.               break;//如果接收到命令为“前进”,小车前进1秒后停止;

  92.       case 1: Back();

  93.               delay(3000);

  94.               Stop();

  95.               delay(5000);break;//如果接收到命令为“后退”,小车后退1秒后停止;

  96.       case 2: Left();

  97.               delay(100);

  98.               Stop();

  99.               delay(5000);break;//如果接收到命令为“左转”,小车左转1秒后停止;

  100.       case 3: Right();

  101.               delay(1000);

  102.               Stop();

  103.               delay(5000);break;//如果接收到命令为“右转”,小车右转1秒后停止;

  104.       case 4: Stop();

  105.               delay(3000);

  106.               Stop();

  107.               delay(5000);break;

  108.             

  109.       case 5: Get_Mode( a+1, b , c ,1); hbr640.open(); break;                   //识别声音进行相应回答

  110.       case 6: Get_Mode( a+0, b , c ,1); hbr640.open(); break;

  111.       case 7: caochang();                          //识别声音走到相应位置

  112.               break;

  113.       default:   break;

  114.       }  

  115.     }  



  116.       lcd.clear();                   //清空OLED屏内容

  117.        int a=getdis();               //将测得距离显示在OLED中

  118.        lcd.clear();

  119.        lcd.setCursor(0, 2);

  120.        lcd.print("The distance is:");

  121.        lcd.setCursor(0, 4);

  122.        lcd.print(a);

  123.        lcd.setCursor(0, 5);

  124.        lcd.print("cm");

  125.        delay(500);

  126.    

  127.        avoid();       //执行相应指令

  128.   }

  129.   int getdis()       //将超声波结果计算为标准距离

  130.   {

  131.     digitalWrite(trig,LOW);

  132.     delayMicroseconds(2);//缓冲

  133.     digitalWrite(trig,HIGH);

  134.     delayMicroseconds(10);

  135.     digitalWrite(trig,LOW);

  136.     int distance=pulseIn(echo,HIGH);

  137.     distance=distance/58;//换算成厘米

  138.     if(distance>=100)

  139.     return 100;

  140.     else

  141.     return distance;

  142.   }

  143.   void motor(int cmd)  

  144.   {

  145.   switch(cmd){

  146.     case 1:

  147.       Forward();

  148.       break;

  149.      case 2:

  150.       Back();

  151.       break;

  152.      case 3:

  153.       Left();

  154.       break;

  155.      case 4:

  156.      Right();

  157.       break;

  158.      case 0:

  159.       Stop();

  160.       break;

  161.   }

  162. }

  163. void avoid()     //超声波避障逻辑

  164. {

  165.   int dis[3];      //定义存放检测情况的数组

  166.   int pos;            //控制伺服电机转动

  167.   dis[1]=getdis();     //前方距障碍距离

  168.   if(dis[1]>3&&dis[1]<13)   //消除极端误差的影响

  169.   {

  170.     motor(0);

  171.     for(pos=90;pos<=140;pos += 1)     //向左转

  172.     {

  173.       myservo.write(pos);

  174.       delay(15);

  175.       }

  176.      

  177.       dis[2]=getdis();        //左边数据存放

  178.    

  179.       for(pos=150;pos>=40;pos -= 1)

  180.       {

  181.         myservo.write(pos);          //向左转

  182.         delay(15);

  183.         if(pos==90)

  184.         {

  185.           dis[1]=getdis();        //中间数据存放

  186.           }

  187.         }

  188.       

  189.         dis[0]=getdis();         //左边数据存放

  190.        for(pos=40;pos<=90;pos += 1)        //归位

  191.         {

  192.           myservo.write(pos);

  193.           delay(15);

  194.           }

  195.       

  196.         if(dis[0]<dis[2])        //根据判断结果执行避障

  197.         {

  198.           motor(3);

  199.           delay(5);

  200.           }

  201.           else

  202.           {

  203.             motor(4);

  204.             delay(50);

  205.             }

  206.                

  207.   }

  208.   }

  209.   void Forward () //前进

  210.   {

  211.      analogWrite(5,196);

  212.      analogWrite(6,0);

  213.      analogWrite(9,245);

  214.      analogWrite(10,0);

  215.      

  216.   }



  217.   void Back()    //后退

  218.   {

  219.      analogWrite(5,0);

  220.      analogWrite(6,1960);

  221.      analogWrite(9,0);

  222.      analogWrite(10,245);

  223.    

  224.   }

  225.   void Left()   //左转

  226.   {

  227.      analogWrite(5,0);

  228.      analogWrite(6,120);

  229.      analogWrite(9,120);

  230.      analogWrite(10,0);

  231.    

  232.   }



  233.   void Right()   //右转

  234.   {

  235.      analogWrite(5,220);

  236.      analogWrite(6,0);

  237.      analogWrite(9,0);

  238.      analogWrite(10,220);

  239.      

  240.   }



  241.   void Stop()   //停止

  242.   {

  243.       analogWrite(5,0);

  244.       analogWrite(6,0);

  245.       analogWrite(9,0);

  246.       analogWrite(10,0);

  247.      

  248.   }

  249. void Leftpiao() //左前

  250.   {

  251.      analogWrite(5,50);

  252.      analogWrite(6,0);

  253.      analogWrite(9,120);

  254.      analogWrite(10,0);

  255.      

  256.   }



  257.    void Rightpiao() //右前

  258.   {

  259.      analogWrite(5,240);

  260.      analogWrite(6,0);

  261.      analogWrite(9,40);

  262.      analogWrite(10,0);



  263.   }



  264.     void caochang()   //操场

  265.     {

  266.       Forward();

  267.       delay(19000);

  268.       Stop();

  269.       delay(10000);

  270.       }

  271.   void serialEvent()

  272.   {

  273.     hbr640.lisen(); //在串口接收事件中调用语音识别的监听指令

  274.   }
复制代码

更多详情请见:【S058】AI校园服务机器人 https://www.robotway.com/h-col-324.html


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-28 10:30 , Processed in 0.039746 second(s), 17 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表