极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1658|回复: 0

机器人制作开源方案 | 智能搬运机器人

[复制链接]
发表于 2023-12-6 09:25:03 | 显示全部楼层 |阅读模式
本帖最后由 机器谱 于 2023-12-6 09:25 编辑

作者:郑志豪、苏有涛、吴嘉雨、杨畅、苏茹
单位:北京理工大学
指导老师:朱杰、左镇

1. 场景调研与功能设计1.1 产业现状
      在物流产业高速发展的今天,机器人技术的应用程度已经成为决定企业间相互竞争和未来发展的重要衡量因素。目前,机器人技术在物流中的应用主要集中在包装码垛、装卸搬运两个作业环节,随着新型机器人技术的不断涌现,其他物流领域也出现了机器人的应用案例。
      企业为了提高自动化程度和保证产品质量,通常需要高速物流线贯穿整个生产和包装过程。机器人技术在包装领域中应用广泛,特别是在食品、烟草和医药等行业的大多数生产线已实现了高度自动化,其包装和生产终端的码垛作业基本都实现了机器人化作业。机器人作业精度高、柔性好、效率高,克服了传统的机械式包装占地面积大、程序更改复杂、耗电量大的缺点,同时避免了采用人工包装造成的劳动量大、工时多、无法保证包装质量等问题。
1.2 难题挑战
      当前主流的物流机器人在发展过程中主要存在以下几方面难题:
      第一,物流机器人主要应用于无人仓库、生产线、室外封闭或半封闭区域道路等环境,其应用场景比较单一,比如无人配送机器人目前只能在封闭状态下的园区、学校、大楼内执行任务(如下图所示)。但人类居住的环境复杂,有狭窄街道、有坑洼的土路、还有半山的房子,这些复杂多样的地貌条件增加了工作的不确定性,从而大大提高了机器人工作的难度。
      第二,人类居住的环境有各种交通车辆、行人以及移动障碍,这对于配送机器人的避障能力和判断水准提出了非常高的要求,准确判断情境、合理预测事件可以充分提高机器人的安全性。
      第三,多个机器人的协作问题亟待解决,物流只不是一台机器人的工作,需要的是多台机器的紧密 配合。从分配、装箱,到出库、搬运,再到抵达、卸货,都需要多台设备信息的实时共享完美的协作体系可以有效提升机器人的工作效率。
厂区内的物流机器人
1.3 发展前景      总体来看,近年来在电子商务、新零售等新兴商业模式创新发展需求的拉动下,在智能制造、智慧物流等发展理念的引领下,在人工智能、物联网、大数据、云计算等新技术的驱动下,物流机器人行业一路高歌猛进,行业内呈现如火如荼景象。而网购产业的蓬勃发展也大力推动了物流运输机器人产业站在了世界前列。旺盛的市场需求,不断涌现的发展机遇,日益提升的技术手段,共同造就了物流机器人行业的蓬勃发展,产品技术持续提升,市场大门逐渐敞开,应用领域不断扩大,前景可期。
      从未来角度看,智能物流成为技术发展的必然方向,未来物流机器人将更加智能化和柔性化,环境感知能力将会进一步增强,机器人系统、运动控制系统、调度系统将与人工智能深度融合,赋予机器人“看”和“认知”的功能,让机器人自行完成对外部世界的探测,实现对自身及周边环境状态的感知,适应复杂的开放性动态环境,进而做出决策判断并采取行动,实现复杂层面的指挥决策和自主行动。从无人仓库到最后一公里配送,贯穿于物流作业的始末,助力物流行业加速进化,形成全新的物流生态系统。
未来的物流机器人工作情境
1.4 功能设计
      充分考虑到高速发展的产业现状、迫切紧张的市场需求和广阔的发展前景,我们设计了这样一款可通过灰度传感器实现自动定轨寻迹,依靠灰度传感器和超声波传感器判断进行抓取和放置的可根据要求顺着既定路线将需要运输物品摆放到指定位置的针对智能制造场景的物流运输机器人。而小型化和轻量化的设计让项目机器人具备了作业精度高、柔性好、效率高的优势,同时还克服了传统的运输机器占地面积大、程序更改复杂、耗电量大、成本高、维修困难的缺点。

2. 机器人功能实现逻辑
      实现物流运输主要有三个核心环节,抓取、运输和放置,而要实现在智能制造场景中运用则需要与传感器相配合,提高其自动化和智能化水平。
      运输层面,如下图所示,机器人采用了四轮驱动,为每个轮子安装一个360°舵机,通过程序控制 360°舵机的旋转带动车轮旋转。并且可以通过控制车轮的转速改变下车行驶速度,改变车轮旋转的相对关系让小车实现各种运动方式:当左右侧车轮正向同速时,小车直线行驶,转速直接影响直线行驶的车速;当左右车轮反向同速是,小车倒车行驶,此时转速则影响小车倒车的车速;当左右车轮差速时,小车实现转弯,左车轮正向速度大于右车轮则右转,反之则左转,其中此时车速不仅影响到小车转弯的速度还将影响到其转弯半径;当小车左右车轮反向同速时,小车速度瞬心与其中心重合,将进行原位转向,即原地旋转,此时车速影响的是小车旋转的速度。

机器人底盘
      抓取和放置层面,如下图所示,采用两个具有双自由度的机械臂:主臂部分由 270°舵机控制,可进行半径固定的圆周运动,舵机角度即对应主臂部分旋转角度;手臂部分则通过曲柄滑块机构将 270°舵机的旋转运动转化为平动运动,改变左右手臂部分距离,进而改变其与运输物品的相对关系,但二者相接触通过舵机与机械结构施加压力,产生摩擦力进而将货物抓取,而放置过程原理与抓取过程基本相似仅需将抓取过程反向重来即可。
机器人机械臂
      总体配合上,为适应智能制造场景,我们通过传感器和机械结构的配合实现自动寻迹运输,通过灰度传感器识别预定轨迹让机器实现自动定轨运行,再利用超声波传感器识别需要运输的货物进而给予机器抓取和放下的命令。并可根据需要改变预定轨迹路线,进而改变智能运输车的运行路线,以适应多种应用场景。
灰度传感器
超声波传感器
3. 机器人本体技术路线3.1 硬件策略
3.1.1 运输部分
      为使物流运输机器人能够适应复杂的工作环境且拥有较强的运力,我们组选择了四轮驱动小车,使用四个 360°舵机控制车轮进行 360°旋转,保证了其运动的平稳性、较高的自由度和充足的动力。
      如下图所示,在机器人的前部部,我们搭建了一个大约 25cm 的双层机械臂底座。这是一个比较高的高度,选择这个高度,主要是出于对货物大小的考虑: 我们希望我们的机器人能够广泛地适应一定范围内任意货物的搬运,而这个高度可以实现机械臂在半米多范围的上下移动,从而实现搬运各种货物的功能而选择双层支架,则是充分考虑到运输过程中货物对机器人运动平稳性的影响。

机器人侧视图
      若将机械臂底座和机械臂的连接轴看成转动轴,根据力矩平衡公式:
M1= M2
L1×F1 = L2×F2
      可知当小机器人重心越向后,L 越大,即重量大部分分布在机器人尾部,其越不容易向前倾倒,机器人的综合运行越稳定。
      由机器人侧视图可见,在机器人的尾部和中部,我们安装了中部旋转机构和后机械臂,为原计划中机械机构的重要部分,但由于疫情原因没有足够时间进行相关功能的实现。但还是发挥了机器人末端的重量的作用,使得机器人的重心后移,加强了其身体的稳定性,防止其前倾。

3.1.2 抓取部分
      机械臂是实现智能搬运机器人的基础功能--搬运的最核心部件。该部件由上下移动的手臂和向内向外移动的双手这两个部分组成。此结构具有两个自由度,臂部可以做半径固定的圆周运动,手部做平动运动,通过货物与手部的摩擦力将货物夹起。
      手臂是由双层多根连接固件依次连接而成。多层的结构确保了其强度,多根连接固件确保其长度,拓宽了其运动范围。它通过两个舵机来控制两条机械臂的上下移动,它的运动是定轴转动。由于舵机也是转动的,所以不需要改变运动形式,这部分较为简单。
      而双手的结构设计较难,因为它要将舵机的转动变成机械手的平动。它也是由两个舵机来提供运动的动力。经过不断的探索,我们最终选择了类似于曲柄-连杆-滑块机构的结构,只不过我们的滑块与我们的夹板固连了起来,而滑块沿其中嵌着的两根细杆运动,从而实现了运动形式的转变。
机器人曲柄滑块机械结构
对心曲柄滑块机构
3.1.3 传感识别部分
     传感识别部分我们使用了超声波传感器和灰度传感器两种传感器。灰度传感器共使用了两个,识别对象为预先用黑胶带设定好的路线(如下图所示),用以自动寻迹。若左右两个灰度传感器均为识别到黑线,进行直行;若左灰度传感器识别到黑线、右灰度传感器未识别,进行左转;若右灰度传感器识别到黑线、左灰度传感器未识别,进行右转;最后若两个传感器同时识别到黑线,则停车一段时间,此时超声波传感器发挥作用识别到车前有货物即进行抓取命令,如果未识别就进行放下命令。
黑胶带设定好的行进路线
3.2 软件策略
      为实现机器人对于多种工作场景的适应,我们采用模块化的设计框架来实现机器人的程序控制。我们将整个机器人划分为运动机构和作业机构,运动机构对机器人的底盘进行控制,作业机构对机器人的抓取结构进行控制,在不同机构间设计统一化的通讯接口,实现初级的模块间通讯,为未来的模块化设计和扩展提供便利。
3.2.1 机器人的行走部分
      机器人的行走主要通过控制四个轮子上的 360°舵机来控制四个轮子的转速,进而实现机器人的前进、转向、掉头。我们在底盘前部设置了两个灰度传感器来实现循迹功能和特定作业地点标记的识别,并在底盘靠前位置增加了一个可以通过舵机主动调整方向的超声波测距模块来实现障碍物的探测。
      考虑到Arduino语言开发的便捷性,我们选择探索者Basra开发板作为机器人的主控模块,使用四个探索者M07型号360度舵机作为动力输出。底盘功能和程序实现如下。
      直线运动&停止:使四个舵机的转速相同,两侧车轮以不同的方向转动,即可使机器人沿直线行驶。在舵机控制上,使信号线输出的PWM占空比等于一半时即可使舵机停转,更改占空比与一半的差值即可调整舵机的转速。底盘左侧车轮逆时针旋转、右侧车轮顺时针旋转时,在两侧车轮旋转速度近似相等的情况下就可以实现机器人匀速直线向前行驶,反之可实现机器人的后退行驶,向四个舵机输出一半的占空比即可实现舵机停转。程序实现如下图所示:
直线运动&停止程序
      转向:转向分为左转和右转,为简化底盘结构,在这个机器人上我们使用差速转向法。通过调节机器人左右两侧轮的转速差可以改变机器人的转弯角度,用Delay来控制机器人转弯的时间,进而控制机器人的转弯角度,实现了程序的可调控性。
      差速转向法的核心可以总结为以下内容。根据理论力学速度瞬心法可知,将机器人的左轮视为运动参考系,机器人的右轮视为动点,假设机器人左右轮之间的距离为 l,Delay 的时间为 t,则机器人转弯角度为:
      机器人的转弯半径为:
      利用以上两个计算公式得出:可以通过调节左右两轮的转速差进而使机器人的转弯半径和转弯角度为合适的值。左转和右转分别如下图所示:
左右转程序
      循迹:机器人的循迹利用两个灰度传感器进行探测,若左边读到黑,此时机器人向右偏航,则向左微调;右边读到黑时,机器人向左偏航,则向右微调,两边读到黑则代表碰到特殊标志线,此时执行预设行为,如控制机械臂进行夹取作业等。
自动寻迹程序
3.2.2 机器臂的抓取与放置
      机械臂的抓取与放置主要通过控制机械臂结构上的 270°电机的角度来控制机械臂的抓取与放置。通过引入常数 cat 来判断机械臂应该抓取还是放置,每次识别到黑线时 cat 便取反,cat 为 0,机械臂去抓取货物,cat 为 1 时,机械臂将托盘里的货物拿出来放到预定位置。
       夹取和放置作业是在机器人运动到预定地点后所要执行的任务。在底盘识别到特殊标志线时,控制器会使机器人停下,利用超声波传感器调整机器人与目标物的相对位置,发出信号使机械臂将货物夹取到位于机器人前面的抓取机构中。由于机器人停下的动作是相同的,就需要一个变量来帮助判断此时机械臂是要进行夹取动作还是放置动作。同时,为了保证每次启动机器人时其机械臂位置一致,所以我们设置了一组初值,在其启动时自动将臂部与手部调至开始调好的位置,以便于后续工作的展开。
       我们用灰度传感器识别到黑线的次数作为 cat 取反的标志,cat 从 0 开始,灰度传感器每识别到黑线一次 cat 就取反一次,这样当 cat 为 0 时,就说明是夹取,cat 为 1 时,就说明是放置。
       夹取时,控制两个机械臂在竖直方向运动的舵机先让两个机械臂达到预定的角度,再由另外两个舵机控制夹取壁向内运动,将货物夹紧。到达放置的预定位置后,控制器发出信号使机械臂执行放置动作,旋转控制竖直方向运动的舵机,将货物放置在放置区上方,再逐渐打开夹紧的机械臂,货物就被放置在了放置区上。
抓取与放置程序
4. 示例程序
4.1 底盘控制代码
  1. /*

  2. * void SetMotor()        --使四个轮子按照PWM数组的值转动

  3. * void Stop();           --停止

  4. * void GoForward1(int t)   --低速前进t毫秒

  5. * void GoForward2(int t)   --高速前进t毫秒

  6. * void GoBack(int t)     --后退t

  7. * void TurnLeft(int t)   --左转t

  8. * void TurnRight(int t)   --右转t

  9. * void InitCarPinSet()   --初始化

  10. * -从模块- void SetArm(int Ang)   --机臂上下转动,范围(50,130) (低,高)

  11. * -从模块- void SetHand(int Ang)   --抓取机构,90-开,130-合

  12. * int GrayRead()         --1-左边读到黑,2-两边都不黑,3-右边读到黑,4-两边读到黑

  13. * float GetDistence()   //   Echo = A3,Trig = D2

  14. */

  15. #include <Servo.h>

  16. Servo LF;

  17. Servo RF;

  18. Servo LB;

  19. Servo RB;

  20. Servo SServo;

  21. int GrayL;

  22. int GrayR;

  23. int PWM[4]; //LF,LB,RF,RB

  24. int Mov;

  25. int ValG;   //灰度传感器情况

  26. int cat;   //机械臂是否夹取物品

  27. float Distence;

  28. void setup() {

  29.   // put your setup code here, to run once:

  30.   InitCarPinSet();

  31.   Mov = 1;

  32.   ValG = 2;

  33.   cat = 0;

  34.   Distence = 100;

  35.   pinMode(A0,INPUT);

  36.   pinMode(A2,INPUT);

  37.   pinMode(A3,INPUT);

  38.   pinMode(2,OUTPUT);

  39.   pinMode(4,OUTPUT);

  40. }

  41. void InitCarPinSet()

  42. {

  43.   LF.attach(7);

  44.   LB.attach(11);

  45.   RF.attach(8);

  46.   RB.attach(12);

  47.   SServo.attach(3);

  48.   /*SL -> A2

  49.    *SR -> A0

  50.    *声纳:

  51.    *Echo = A3

  52.    *Trig = D2

  53.    *

  54.    */



  55.   Stop();

  56.   SServo.write(92); //声纳舵机置中位

  57.   GrayL = 200;

  58.   GrayR = 200;

  59. }

  60. void loop() {

  61.   // put your main code here, to run repeatedly:

  62.   while(Mov)

  63.   {

  64.     ValG = GrayRead();

  65.     switch (ValG)

  66.     {

  67.       case 2: //两边都没碰到黑线,直走

  68.       GoForward1(50);

  69.       break;

  70.       case 1: //左边碰到黑线,向左转一点点

  71.       TurnLeft(50);

  72.       break;

  73.       case 3: //右边边碰到黑线,向右转一点点

  74.       TurnRight(50);

  75.       break;

  76.       case 4: //两边碰到黑线,判断是否有夹取物

  77.               // 有 -> 调整距离到 <8    无 -> 设置Mov = 0,小车停止任务

  78.       {

  79.       Stop();

  80.       Distence = GetDistence();

  81.       if(cat == 1)   //目前夹取了物品,则放下它

  82.       {

  83.         Stop();

  84.         digitalWrite(4,HIGH);

  85.         delay(100);

  86.         digitalWrite(4,LOW);

  87.         cat = 0;

  88.         delay(5000);

  89.         Mov = 0;

  90.       }

  91.       else if(cat == 0)   //没有夹取物品

  92.       {

  93.         if(Distence > 800) //也没有物品需要去夹,结束工作

  94.         {

  95.           Mov = 0;

  96.           Stop();

  97.           SetArm(130);

  98.         }

  99.         else   //调整距离并夹取

  100.         {

  101.           while(Distence > 6){   //调整距离

  102.             GoForward1(50);

  103.             //delay(10);

  104.             Distence = GetDistence();

  105.           }

  106.           Stop();

  107.           digitalWrite(4,HIGH);   //夹取

  108.           delay(100);

  109.           digitalWrite(4,LOW);   

  110.           cat = 1;

  111.           delay(5000);

  112.          

  113.           ValG = GrayRead();

  114.           while(ValG != 4)    //回到原位置

  115.           {

  116.             GoBack(50);

  117.             ValG = GrayRead();

  118.           }

  119.           Stop();

  120.           delay(100);

  121.           GoForward1(300);   //越过停止线,进入正常循环

  122.           delay(150);

  123.           ValG = 2;

  124.         }

  125.       }

  126.       break;

  127.     }

  128.     }

  129.     delay(50);

  130.   }





  131. }

  132. void TestProcess()

  133. {



  134. }

  135. void SetMotor()

  136. {

  137.   LF.write(PWM[0]);

  138.   LB.write(PWM[1]);  

  139.   RF.write(PWM[2]);

  140.   RB.write(PWM[3]);

  141. }

  142. void Stop()

  143. {  

  144.   PWM[0] = 91;

  145.   PWM[1] = 95;

  146.   PWM[2] = 90;

  147.   PWM[3] = 90;

  148.   SetMotor();

  149. }

  150. void GoForward1(int t)   //低速前进t毫秒

  151. {

  152.   PWM[0] = 60;

  153.   PWM[1] = 60;

  154.   PWM[2] = 130;

  155.   PWM[3] = 125;

  156.   SetMotor();

  157.   delay(t);

  158.   //Stop();

  159. }

  160. void GoForward2(int t)   //高速前进t毫秒

  161. {

  162.   PWM[0] = 30;

  163.   PWM[1] = 30;

  164.   PWM[2] = 160;

  165.   PWM[3] = 155;

  166.   SetMotor();

  167.   delay(t);

  168.   //Stop();

  169. }

  170. void GoBack(int t)

  171. {

  172.   PWM[0] = 150;

  173.   PWM[1] = 150;

  174.   PWM[2] = 20;

  175.   PWM[3] = 25;

  176.   SetMotor();

  177.   delay(t);

  178.   //Stop();

  179. }

  180. void TurnLeft(int t)   //t = 1780时,左转直角弯

  181. {

  182.   PWM[0] = 130;

  183.   PWM[1] = 130;

  184.   PWM[2] = 130;

  185.   PWM[3] = 130;

  186.   SetMotor();

  187.   delay(t);

  188.   //Stop();

  189. }

  190. void TurnRight(int t)   //t = 1780时,右转直角弯

  191. {

  192.   PWM[0] = 70;

  193.   PWM[1] = 70;

  194.   PWM[2] = 50;

  195.   PWM[3] = 50;

  196.   SetMotor();

  197.   delay(t);

  198.   //Stop();

  199. }

  200. /* 在从模块中

  201. *   控制机械臂的方法为向从模块发送脉冲

  202. void SetArm(int Ang)

  203. {

  204.   ArmR.write(Ang);

  205.   ArmL.write(180-Ang);

  206. }

  207. void SetHand(int Ang)

  208. {

  209.   HandR.write(Ang);

  210.   HandL.write(180-Ang);

  211. }

  212. void Catch()

  213. {

  214.   SetHand(130);

  215.   SetHand(90);   //高举,打开

  216.   delay(200);



  217.   SetArm(50);

  218.   delay(100);

  219.   SetHand(130); //放低,抓取

  220.   delay(100);

  221.   SetArm (130); //举起

  222.   delay(100);



  223. }

  224. void unCatch()

  225. {

  226.   SetArm(50);

  227.   delay(100);

  228.   SetHand(90); //放低,释放

  229.   delay(100);

  230.   SetArm(130); //举起

  231. }

  232. */

  233. int GrayRead() //1-左边读到黑,2-两边都不黑,3-右边读到黑,4-两边读到黑

  234. { //灰度值<150 ->   碰到黑线

  235.   GrayL = analogRead(A2);

  236.   GrayR = analogRead(A0);

  237.   if(GrayL < 150)

  238.   {

  239.     if(GrayR <150)

  240.     {

  241.       return 4;

  242.     }

  243.     else

  244.     {

  245.       return 1;

  246.     }

  247.   }

  248.   else

  249.   {

  250.     if(GrayR <150)

  251.     {

  252.       return 3;

  253.     }

  254.     else

  255.     {

  256.       return 2;

  257.     }

  258.   }

  259. }

  260. float GetDistence()   //   Echo = A3,Trig = D2

  261. {

  262.   float Dis = 0;

  263.   digitalWrite(2,LOW);delayMicroseconds(2);

  264.   digitalWrite(2,HIGH);delayMicroseconds(10);

  265.   digitalWrite(2,LOW);

  266.   Dis = (pulseIn(A3,HIGH)/2)*340/10000;



  267.   return Dis;

  268. }
复制代码
4.2机械臂控制代码
  1. //使用一个独立的arduino作为从模块控制抓取机构。pin D2接收来自主机的消息,每一次高电位进行一次抓取/释放

  2. /* void Catch()   //夹取物品

  3. * void unCatch() //释放物品

  4. *

  5. */

  6. #include <Servo.h>

  7. Servo ArmR;

  8. Servo ArmL;

  9. Servo HandR;

  10. Servo HandL;

  11. int val;

  12. int cat;

  13. void setup() {

  14.   // put your setup code here, to run once:

  15.   CarInit();

  16. }

  17. void CarInit()

  18. {

  19.   Serial.begin(115200);

  20.   ArmL.attach(8);

  21.   ArmR.attach(7);

  22.   HandR.attach(11);

  23.   HandL.attach(12);

  24.   pinMode(2,INPUT);

  25.   SetArm(120);

  26.   SetHand(90);

  27.   delay(500);

  28.   val = 0;

  29.   cat = 0;

  30. }

  31. void loop() {

  32.   // put your main code here, to run repeatedly:



  33.   val = digitalRead(2);

  34.   if(val == 1)

  35.   {

  36.     Serial.print("Start");

  37.     if(cat == 0)

  38.     {

  39.       Catch();

  40.       cat = 1;

  41.       delay(5000);

  42.     }

  43.     else if(cat == 1)

  44.     {

  45.       unCatch();

  46.       cat = 0;

  47.       delay(4000);

  48.     }

  49.     val = 0;

  50.   }

  51.   Serial.print(val);

  52.   Serial.print(" ");

  53.   Serial.println(cat);

  54.   delay(50);

  55. }

  56. void SetArm(int Ang)   //60 - 120 (低-高)

  57. {

  58.   ArmR.write(Ang-5);

  59.   ArmL.write(180-Ang);

  60. }

  61. void SetHand(int Ang)   //90- 130(开-合)

  62. {

  63.   HandR.write(Ang);

  64.   HandL.write(180-Ang);

  65. }

  66. void Catch()

  67. {

  68.   SetArm(120);

  69.   SetHand(90);   //高举,打开

  70.   delay(1500);



  71.   SetArm(60);

  72.   delay(1000);

  73.   SetHand(130); //放低,抓取

  74.   delay(1000);

  75.   SetArm (120); //举起

  76.   delay(1000);

  77. }

  78. void unCatch()

  79. {

  80.   SetArm(60);

  81.   delay(1000);

  82.   SetHand(90); //放低,释放

  83.   delay(1000);

  84.   SetArm(120); //举起

  85.   delay(1000);

  86. }
复制代码

5. 作品创新点
      ① 曲柄滑块机构:通过对心曲柄滑块机构变 270°舵机的转动为我们所需的平动夹取,增大与物体接触面积,使夹取更加牢固,减小物体掉落风险。
② 传感器配合识别货物:通过灰度传感器和超声波传感器配合识别货物,若两个传感器同时识别到黑线,则停车一段时间,此时超声波传感器发挥作用识别到车前有货物即进行抓取命令,如果未识别就进行放下命令。避免仅用但传感器难以区分障碍物和货物的难处。
③ 差速实现小车各类运动:参考坦克差速转向功能的实现(如下图所示),结合《理论力学》所学速度瞬心知识点,通过控制车轮的转速改变小车行驶速度,改变车轮旋转的相对关系让小车实现直线行驶、转向、原地旋转、倒车等各种运动方式。

坦克转向运动的实现
6. 作品难点及解决/改进方案
6.1 作品难点及解决方案
      ① 最早设计机械臂两个自由度均为旋转角度,如此抓取位置的接触面加较小,难以平稳抓取。为增大其接触面积,进而增大摩擦力,提高抓取的平稳性,我们运用《机械原理》所学相关知识,采用对心曲柄滑块机构变转动为平动,使夹取更加牢固,减小物体掉落风险。
      ② 使用黑色电工胶在地上粘贴规划路线,但在实机演示检验小车是否可以通过灰度传感器控制自动定轨沿迹运行,结果发现小车偶尔会脱离轨道运行。仔细检查程序没有错误之后,我们分析是由于黑色胶带上的3M标记在灯光作用下发生反射,导致灰度传感器识别为白色,导致小车脱离轨道运行。为解决这一问题,我们耐心地用黑胶带没有标记的部分去贴第二层(如下图所示),遮盖黑色胶带上的3M标记,最终小车能够稳定的定轨运行。
维修黑胶带规划路线
      ③ 最初采用超声波传感器自动避障,在货物前贴黑胶带利用灰度传感器识别控制小车暂停进行抓取和放置操作。但实际运行发现在如此开环的程序控制之下,机器人在启动时必须保持与路线平行,如果初始时并未将机器人的位置放置准确,机器人将会偏离路线,同时在搬运路线足够长时,机器人由于初始位置所产生的偏差会越来越大。为此我们重新设计传感器控制方式,灰度传感器结合预先用黑胶带设定好的路线用以自动寻迹,再由货物前的黑线影响灰度传感器控制小车停下,此时超声波传感器发挥作用识别到车前有货物即进行抓取命令,如果未识别就进行放下命令,通过如此闭环程序最终使小车能够稳定准确按照预定轨迹实现运输货物的功能。
6.2 未来改进方向
      总体设计上,通过颜色传感器、湿度传感器等传感器获取待运输物品的各类信息进而识别出不同物体,并根据不同物体的形状特点选取合理的装夹方式,并根据要求运输到指定区域且在过程中能够自主避障。同时全向底盘实现运动灵活性,超声波传感器、灰度传感器和蓝牙模块的结合使用,让机器人在不同运输模式诗都可在避障的同时自由实现抓取和摆放,另外多自由度、多形式的机械臂可实现抓取安放稳定性。
      硬件设计上采用不同的装夹方式,即机器可通过机械结构的创新设计,采用不同形式,不同大小机械手臂实现,同时针对不同的应用环境,也可以为机器人安装不同数量的机械臂,实现成本降低和结构优化的双赢。例如在仓库进行运输由于大部分需要运输的物品都由外壳纸箱包装可仅采用 1-2 种机械臂,针对不同大小的纸箱包装,而在超市中进行运用时,则需要考虑运输物品的形状,需要采用更多种类的机械运输手臂。
      软件设计上采用不同运输策略,主要是指机器人不同的行走运输方式,可分为离线控制运输、自动寻迹运输和遥控运输三种模式。离线控制运输是指为机器导入固定的程序,让机器按照预先设定的轨迹,运行到固定位置、将物品夹取以 及将物品运输到制定位置放下。自动寻迹运输,是给机器导入闭环程序、可根据传感器感应到的外界情况进行反应,其中可利用红外传感器或超声波传感器进行自动避障,通过灰度传感器让机器实现自动定轨运行。遥控运输是指为机器连接蓝牙模块,由人为进行遥控控制机器的行走、避障和夹取等操作,最终实现运输的目的。

* 更多详情请见:【S031】智能搬运机器人【https://www.robotway.com/h-col-294.html】
回复

使用道具 举报

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

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

Archiver|联系我们|极客工坊

GMT+8, 2024-4-30 20:03 , Processed in 0.046032 second(s), 17 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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