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

news2024/11/15 8:32:14

作者:李强、李振宁、毛维雷、李文文、张奥

单位:山西能源学院

指导老师:姚志广、程晟

      在这个科技飞速发展的时代,在工业智造、人工智能的飞速发展中,出现了越来越多的智能化机械装置,也有许多创新类的比赛,本作品基于探索者创新套件设计平台设计出一款全地形小车,通过自主构思和一系列调试设计出了一款以前履带后柔性结构为主的多功能越障移动装置。系统整体设计符合大赛规则,并具备一定的实用性和美观。

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. 示例程序

#include <SoftwareSerial.h>

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

#include <Arduino.h>

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

#include <MultiLCD.h>

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

LCD_SSD1306 lcd;

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

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

int echo=12;

int trig=3;

Servo myservo;

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

  char i;

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

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

 

  unsigned char b = 0xC8;

  unsigned char c = 0x00;

  unsigned char a[Numbers_of_Voece] = {0x00,

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

 

  void setup()

  {

    lcd.begin();             

    Serial.begin(9600);

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

    myservo.attach(11);

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

   

    pinMode( 5 , OUTPUT);               

    pinMode( 6 , OUTPUT);                   

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

    pinMode( 10 , OUTPUT);

    pinMode(trig,OUTPUT);                     

    pinMode(echo,INPUT);

  }

 

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

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

    unsigned char _YuYin[3];

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

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

      Serial.write(_YuYin,3);

      delay(Voice_Time);

    }

  }

 

  void loop() {

   

            i=0;  

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

          {         

           i= mySerial.read();  

            switch(i)

            {

              case '1':

              Forward();

              break;

             

              case '2':

              Back();

              break;

             

              case '3':

              Left();

              break;

             

              case '4':

               Right();

              break;

             

              case '5':

              Stop();

              break;

              case '6':

               Leftpiao();

              break;

             

              case '7':

              Rightpiao();

              break;

            }

          }

   

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

    {  

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

      switch (value)

     {

      case 0: Forward();

              delay(3000);

              Stop();

              delay(5000);

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

      case 1: Back();

              delay(3000);

              Stop();

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

      case 2: Left();

              delay(100);

              Stop();

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

      case 3: Right();

              delay(1000);

              Stop();

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

      case 4: Stop();

              delay(3000);

              Stop();

              delay(5000);break;

             

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

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

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

              break;

      default:   break;

      }  

    }  

 

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

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

       lcd.clear();

       lcd.setCursor(0, 2);

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

       lcd.setCursor(0, 4);

       lcd.print(a);

       lcd.setCursor(0, 5);

       lcd.print("cm");

       delay(500);

   

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

  }

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

  {

    digitalWrite(trig,LOW);

    delayMicroseconds(2);//缓冲

    digitalWrite(trig,HIGH);

    delayMicroseconds(10);

    digitalWrite(trig,LOW);

    int distance=pulseIn(echo,HIGH);

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

    if(distance>=100)

    return 100;

    else

    return distance;

  }

  void motor(int cmd)  

  {

  switch(cmd){

    case 1:

      Forward();

      break;

     case 2:

      Back();

      break;

     case 3:

      Left();

      break;

     case 4:

     Right();

      break;

     case 0:

      Stop();

      break;

  }

}

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

{

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

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

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

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

  {

    motor(0);

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

    {

      myservo.write(pos);

      delay(15);

      }

     

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

   

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

      {

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

        delay(15);

        if(pos==90)

        {

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

          }

        }

       

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

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

        {

          myservo.write(pos);

          delay(15);

          }

       

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

        {

          motor(3);

          delay(5);

          }

          else

          {

            motor(4);

            delay(50);

            }

               

  }

  }

  void Forward () //前进

  {

     analogWrite(5,196);

     analogWrite(6,0);

     analogWrite(9,245);

     analogWrite(10,0);

     

  }

 

  void Back()    //后退

  {

     analogWrite(5,0);

     analogWrite(6,1960);

     analogWrite(9,0);

     analogWrite(10,245);

   

  }

  void Left()   //左转

  {

     analogWrite(5,0);

     analogWrite(6,120);

     analogWrite(9,120);

     analogWrite(10,0);

   

  }

 

  void Right()   //右转

  {

     analogWrite(5,220);

     analogWrite(6,0);

     analogWrite(9,0);

     analogWrite(10,220);

     

  }

 

  void Stop()   //停止

  {

      analogWrite(5,0);

      analogWrite(6,0);

      analogWrite(9,0);

      analogWrite(10,0);

     

  }

void Leftpiao() //左前

  {

     analogWrite(5,50);

     analogWrite(6,0);

     analogWrite(9,120);

     analogWrite(10,0);

     

  }

 

   void Rightpiao() //右前

  {

     analogWrite(5,240);

     analogWrite(6,0);

     analogWrite(9,40);

     analogWrite(10,0);

 

  }

 

    void caochang()   //操场

    {

      Forward();

      delay(19000);

      Stop();

      delay(10000);

      }

  void serialEvent()

  {

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

  }

8. 自我评价、教师指导评价

8.1 自我评价

      此次的全地形小车大赛,参赛的不只是技能,更是一次各方面潜力的展现。让我们在工作中互相帮助,磨练了我们吃苦耐劳的品质。使我们认识到结果并不是最重要的,重要的是在大赛中学到的东西。这次比赛我们最大的收获不是输赢,而是在相互切磋的过程中,学习到对手的优点,发现自身的不足,从中获得新的知识和经验。体会了出现问题的失落和解决问题的幸喜,使我们以后无惧困难与问题。这对我们以后走向社会也有很大的帮忙,我们相信在以后的生活和学习中,会因为此次的大赛而变得不一样。

8.2 教师指导评价

      学生所构想和设计制造的这辆车,仍然有很多不少不足的地方,如果再给他们更多的时间,他们也可能会做的更好。学生们在小车结构上一看就是认真对赛道上可能出现的问题分析后得出的六驱前履带后柔性的结构。对于这次的程序编写,他们已经在能力范围之内将程序编写的尽量完美,相信他们在学习了更多之后可以将这个程序编写的更加完美。

      此次学生们所作出来的这种全地形小车有不少的创新点,在结合实际生活和部分想象之后,做出来了这种小车,在并不长的时间里,自主设计并制造出来,这在一定程度上给学生带来大量的思考与交流,非常有助于学生的思想发展。

更多详情请见:【S058】AI校园服务机器人

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1391241.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STM32F103标准外设库—— 新建工程与库函数(四)

个人名片&#xff1a; &#x1f981;作者简介&#xff1a;一名喜欢分享和记录学习的在校大学生 &#x1f42f;个人主页&#xff1a;妄北y &#x1f427;个人QQ&#xff1a;2061314755 &#x1f43b;个人邮箱&#xff1a;2061314755qq.com &#x1f989;个人WeChat&#xff1a;V…

力扣刷MySQL-第二弹(详细解析)

&#x1f389;欢迎您来到我的MySQL基础复习专栏 ☆* o(≧▽≦)o *☆哈喽~我是小小恶斯法克&#x1f379; ✨博客主页&#xff1a;小小恶斯法克的博客 &#x1f388;该系列文章专栏&#xff1a;力扣刷题讲解-MySQL &#x1f379;文章作者技术和水平很有限&#xff0c;如果文中出…

基于Yolov5+Deepsort+SlowFast算法实现视频目标识别、追踪与行为实时检测

前言 前段时间打算做一个目标行为检测的项目&#xff0c;翻阅了大量资料&#xff0c;也借鉴了不少项目&#xff0c;最终感觉Yolov5DeepsortSlowfast实现实时动作检测这个项目不错&#xff0c;因此进行了实现。 一、核心功能设计 总的来说&#xff0c;我们需要能够实现实时检测视…

SAP PI之Rest adapter

一&#xff0c;简介 REST风格接口是以http为传输协议&#xff0c;以xml或json或text为有效负载。下图展示了REST到XI再返回的一个过程&#xff0c;一个REST接口包含的信息有&#xff1a;服务URL、URL中带的参数、http方法(post/get/put等)、http头部、body部分的有效载荷。而X…

debian12部署Gitea服务之二——部署git-lfs

Debian安装gitlfs: 先更新下软件包版本 sudo apt update 安装 sudo apt install git-lfs 验证是否安装成功 git lfs version cd到Gitea仓库目录下 cd /mnt/HuHDD/Git/Gitea/Repo/hu/testrepo.git 执行lfs的初始化命令 git lfs install客户机Windows端在官网下载并安装Git-Lfs 再…

编译原理1.3习题 程序设计语言的发展历程

图源&#xff1a;文心一言 编译原理习题整理~&#x1f95d;&#x1f95d; 作为初学者的我&#xff0c;这些习题主要用于自我巩固。由于是自学&#xff0c;答案难免有误&#xff0c;非常欢迎各位小伙伴指正与讨论&#xff01;&#x1f44f;&#x1f4a1; 第1版&#xff1a;自…

内存操作函数

一、memcpy函数 memcpy(void * destination, const void * source, num)表示将source中的前num个字符复制到destination中&#xff0c;不允许source和destination的内存区域重叠memcpy(a, bn1, n2)表示从b中第n11个字符开始复制&#xff0c;复制n2个字符到a中为了防止溢出&…

框架基础-Maven+SpringBoot入门

框架基础 Maven基础 Maven概述 Maven是为Java项目提供项目构建和依赖管理的工具 Maven三大功能 - 项目构建构建&#xff1a;是一个将代码从开发阶段到生产阶段的一个过程&#xff1a;清理&#xff0c;编译&#xff0c;测试&#xff0c;打包&#xff0c;安装&#xff0c;部署…

给WordPress网站增加一个带时间的led广告牌

WordPress 后台》外观》小工具》自定义html》添加到合适位置 其他系统可自行添加合适位置 <style type"text/css">.studytextgzbox {background: #F9F9F9; border: 1px solid #999999;margin: 1px;text-align:center; float: left;line-height: 28px;hei…

Spring IOC 之加载 BeanDefinition

1、前言 前面的文章我们已经对IOC之Spring统一资源加载策略有了一定的了解&#xff0c;本文我们将探讨Spring IOC 加载 BeanDefinition的整个过程。 我们先先看一段熟悉的代码&#xff1a; ClassPathResource resource new ClassPathResource("bean.xml"); // &l…

Java NIO (二)NIO Buffer类的重要方法(备份)

1 allocate()方法 在使用Buffer实例前&#xff0c;我们需要先获取Buffer子类的实例对象&#xff0c;并且分配内存空间。需要获取一个Buffer实例对象时&#xff0c;并不是使用子类的构造器来创建&#xff0c;而是调用子类的allocate()方法。 public class AllocateTest {static…

Flutter GetX 之 国际化

今天给大家介绍一下 GetX 的国际化功能,在日常开发过程中,我们经常会使用到国际化功能,需要们的应用支持 国际化,例如我们需要支持 简体、繁体、英文等等。 上几篇文章介绍了GetX的 路由管理 和 状态管理,看到大家的点赞和收藏,还是很开心的,说明这两篇文章给大家起到了…

CAN 节点状态转换

CAN节点 按照错误严重程度可分为三种不同的状态 主动错误状态&#xff08;Error Active&#xff09; 被动错误状态&#xff08;Error Passive&#xff09; 总线关闭状态&#xff08;Bus Off&#xff09; 存在两种错误计数器 发送错误计数值 TEC : Transmit Error Counter …

Python - 深夜数据结构与算法之 Sort

目录 一.引言 二.排序简介 1.排序类型 2.时间复杂度 3.初级排序 4.高级排序 A.快速排序 B.归并排序 C.堆排序 5.特殊排序 三.经典算法实战 1.Quick-Sort 2.Merge-Sort 3.Heap-Sort 4.Relative-Sort-Array [1122] 5.Valid-anagram [242] 6.Merge-Intervals […

Go新项目-配置文件的选取及区别和写法(1)

先说结论&#xff1a;我们选型TOML yaml&#xff0c;toml&#xff0c;json&#xff0c;ini 实际业务都有用 实际栗子是&#xff1a;我们想要把Go的切片作为配置文件&#xff0c;YAML写起来比较吃力&#xff0c;TOML就很容易了。 配置文件是用于配置计算机程序的参数、初始化设…

linux创建文件

创建文件夹&#xff1a; mkdir folder_name其中&#xff0c;folder_name是想要创建的文件夹的名称。 例如&#xff0c;如果想在当前目录下创建一个名为 "my_folder" 的文件夹&#xff0c;可以运行以下命令&#xff1a; mkdir my_folder如果想在特定路径下创建文件…

计算机导论10-软件与软件工程

文章目录 软件软件的概念软件的定义软件的特征 软件的保护与授权软件的法律保护软件许可 软件工程软件危机软件危机的概念产生软件危机的原因 软件工程的概念软件工程的定义软件工程基本原理软件工程框架软件工程三要素 软件工程方法学软件工程方法软件工程工具软件工程过程 软…

详细讲解Python中的aioschedule定时任务操作

目录 前言1. 基本概念2. 基本API3. Demo 前言 如果下面的函数库无法执行&#xff0c;出现类似&#xff1a;&#xff08;前提是python3.7以上&#xff09; AttributeError: module ‘asyncio‘ has no attribute ‘run‘请检查run是否可跳转&#xff0c;如果无法跳转&#xff…

【RPC】网络通信:哪种网络IO模型最适合RPC框架?

一、背景 RPC是解决进程间通信的一种方式。一次RPC调用&#xff0c;本质就是服务消费者与服务提供者间的一次网络信息交换的过程。服务调用者通过网络IO发送一条请求消息&#xff0c;服务提供者接收并解析&#xff0c;处理完相关的业务逻辑之后&#xff0c;再发送一条响应消息…