机器人制作开源方案 | 货物输送小车

作者:周展鹏 黄万森 彭军铭 吕会权 聂文俊

单位:柳州工学院

指导老师:蔡洪炜 王一波

1. 场景调研

      目前货物输送已成为人们生活中必不可少的部分,加之国内近年来有因快递配送导致疫情迅速传播的事件常有发生,因此在疫情期间,如何高效便捷的完成快递的收派工作,是当前快递行业亟需解决的问题。目前在国内的市场上正式投入使用的此类小车并不是很多,这些快递小车的造价过于昂贵,并不适用于例如学校送餐和送快递、居民生活派送物品等,为了降低病毒传播风险,减少人与人之间的接触,本项目设计了一款货物输送小车。

      该小车是一种基于探索者平台设计并制作的小车,可以在减少人与人接触、降低人口聚集的情况下完成输送工作,降低病毒传播风险,并且具有路径规划、自动循迹、红绿灯检测、货物输送、超声波测距等功能。系统以Basra控制板为控制核心,感知系统主要以触须模块为主,配合循迹模块、电机驱动模块、超声波测距模块、颜色识别等模块形成完整的感知系统,小车底盘结构主体部分采用刚性柔性组合方式轮式驱动和辅助部分采用轮腿式驱动相结合的方式,在山路或者陡坡中,该小车可表现出强大的适应力和优越的抓地力。

2. 结构设计

2.1 作品结构简图及装配图

机器人制作开源方案 | 货物输送小车_第1张图片

机器人制作开源方案 | 货物输送小车_第2张图片

 2.2机器结构说明图示

机器人制作开源方案 | 货物输送小车_第3张图片

2.3小车实物图 

机器人制作开源方案 | 货物输送小车_第4张图片

机器人制作开源方案 | 货物输送小车_第5张图片

机器人制作开源方案 | 货物输送小车_第6张图片

3. 控制设计

3.1 控制系统设计思路

      该小车的系统框图如下所示,本次设计以Brsra主控芯片为控制核心,另外由电源模块、电机驱动模块、超声波测距模块、避障模块、颜色识别模块共同完成该系统设计。

机器人制作开源方案 | 货物输送小车_第7张图片​ 系统方案框图

      首先由电源模块给整个系统供电,然后通过主控板控制电机驱动小车运行;避障模块通过相关的传感器感知周围环境自动驾驶,在遇到障碍物时将遇障信号传递给主芯片,主芯片通过CPU发出信号使电机改变不同的状态和速度,从而实现智能小车的避障以及跨越不同的障碍;通过路径规划,超声波测距模块及电机驱动模块,通过颜色识别模块识别红绿灯,当红灯时小车停下来,当绿灯时小车继续行驶。

3.2各模块设计及关键代码说明

① 获取循迹传感器输出函数

//获取循迹传感器输出函数

int GetTraceDate()

{

  int Data_Out;//定义数据输出变量

  int Left_AD,Right_AD,Mid_AD;//定义左右中传感器AD值变量

 

  Left_AD=analogRead(A0);

  Mid_AD=analogRead(A2);

  Right_AD=analogRead(A3);

  Data_Out=(Left_AD-Right_AD+D_AD_VALUE);

  Serial.print(Data_Out);

  Serial.print("   ");

  if(Left_AD > _H && Mid_AD > _H && Right_AD > _H)

    stop = 1;

  else

    stop = 0;

  if(Mid_AD>200)

  {

    flag = 0;

  }

  if((Mid_AD <= LEFT_THERSH) && (Data_Out < -20))

  { //left

    Data_Out= (1.5*LEFT_MAX-Data_Out);

    flag--;

  }

  else if((Mid_AD <= RIGHT_THERSH) && (Data_Out > -10))

  { //right

    Data_Out= (2*RIGHT_MAX+Data_Out);

    flag++;

  }

  if(Left_AD < _L && Mid_AD < _L && Right_AD < _L)

  {

       Serial.print("---");

       if(flag<0)

       {//left

          Data_Out = LEFT_MAX*2;

       }

       else

       {//right

          Data_Out = RIGHT_MAX*2;

       }

  }

  return Data_Out;

}

② 自动跟随函数

void   followDrive()//自动跟随

{  

    getDistance_on();   // 获取当前的距离

    if ((inches >= followDist - followBalance) && (inches <= followDist + followBalance))

    {

      if (inches > followDist) // 当两者间的距离大于设定值时,小车前进

      {  

        step_forword();   // 小车前进

       

      }

      else if (inches < followDist) // 当两者间的距离大于设定值时,小车后退

      {  

        noline_back();   // 小车后退

       

      }

      else

      {

        _stop();   // 小车停止

      }

    }

    else

    {

      _stop();

    }

}

 ③ 颜色识别和存储函数

void card_color_detection()

{

  uint16_t clear, red, green, blue; //分别定义用于存储红、绿、蓝三色值变量

  tcs.getRGBC(&red, &green, &blue, &clear); //将原始R/G/B值转换为色温(以度为单位)

  tcs.lock();   //禁用中断(可省略)

  uint32_t sum = clear;           //===========

  float r, g, b;                  // 计算红

  r = red; r /= sum;              // 绿、蓝

  g = green; g /= sum;            // 三色数

  b = blue; b /= sum;             // 值

  r *= 256; g *= 256; b *= 256;   //===========

   if((r>g)&&(r>b))

   {

    delay(40);

    if((r>g)&&(r>b))

      {

        color_detection_card=1;

        color_detection_card_last=color_detection_card;

        color_flag=5;

      }

   }

     if((g>r)&&(g>b))

     {

        delay(40);

        if((g>r)&&(g>b))

         {

          color_detection_card=2;

          color_detection_card_last=color_detection_card;

          color_flag=5;

         }

      }

    // if(color_detection_card=2)

    // {

    //   motor_control();

    // }

    // else

    // _stop();

  Serial.print("\t card = ");

  Serial.print(color_detection_card); // 色卡值

  Serial.println();//

}


④ 小车运动函数

void _stop()//小车停止

{

  Near_Infrared();

  analogWrite(leftA_PIN, 0);

  analogWrite(leftB_PIN, 0);

  analogWrite(righA_PIN, 0);

  analogWrite(righB_PIN, 0);

}

void step_forword()//小车前进

{

    analogWrite(5, step_right_speed);

    analogWrite(6, 0);

    analogWrite(9, 0);

    analogWrite(10, step_left_speed);   

}

void noline_back()//小车后退

{

analogWrite(5, 0);

analogWrite(6, step_right_speed);

analogWrite(9, step_left_speed);

analogWrite(10, 0);

}

void setup() {

  Serial.begin(9600);//9600

  motor_pinint();

  //超声波端口

  pinMode(trigPin, OUTPUT);   //连接11引脚输出电压

  pinMode(echoPin, INPUT);   //连接12引脚输入电压

}

4. 作品难点及解决方法

4.1作品难点

      刚开始报名比赛时我们还是高兴的,可没想到从拼装到写程序调试,再到跑赛道都是磨难重重,但是每一个模块和障碍都充满着挑战。当我们拿回小车材料后,对于小车的结构还一窍不通,从网上参考了很多设计方案和方法,但是我们参考设计的方案都不能很顺利的自动循迹。我们不断的尝试,程序没有问题,但小车无视黑线,完全没有循线;即使循线时传感器检测到黑线,但小车发生“蛇行”;或紧接着识别黑线不灵,循迹转弯时直流电机卡顿等现象。

4.2解决方法

现象1:程序没有问题,但小车无视黑线,完全没有循线。可能原因是:

      ① 传感器坏了。

      ② 传感器安装位置不合适,导致传感器没有触发。

      ③ 程序中,直行时delay时间太长导致没能及时检测到传感器状态。

解决办法:

      ① 我们可以先单独测试一下传感器是否损坏,用串口测值或点亮LED的方法进行测试,如果确认传感器坏了,更换新传感器。

      ② 如果传感器是好的,那么可能是传感器的安装位置不合适,先不要将传感器固定在小车身上,而用手持的方法,利用用串口测值或点亮LED的方法进行测试,找到合适的安装位置,再进行安装。

      ③ 缩短delay()时长,提高检测频率。

现象2:循线时传感器检测到黑线,但小车发生“蛇行”;或紧接着识别黑线不灵。可能原因是:

      ① 可能是小车两侧轮子差速过大,导致转弯半径太小,从而“蛇行”。

      ② 可能是转弯动作delay时间过长,导致下次识别不灵。

      ③ 可能是小车速度太快,外加程序执行效率不高,导致未能识别到黑线。

解决办法:

      ① 转弯时减小电机转动差速,或用转向机构替代差速转向。

      ② 缩短delay时间,或不使用delay。

      ③ 更换转速慢的电机或提高程序执行效率。

现象3:循迹转弯时直流电机卡顿。

     主要原因是用数字量控制直流电机时,直接接的VIN电压,也就是电池实时电压,基本是当时的最大电压;而用模拟量控制时,电压值只是在255时才能达到最大,其余的电压值都比较小。

解决办法:

     用数字量,加大电压,要么改结构,想办法转弯时缩短轴距,或者减小转弯阻力。

5. 创新设计

5.1项目创新点

     ① 小车中采用Basra开发板为核心,各模块相互配合,形成了一个包括人机界面的半闭环系统,从而使小车能有效的完成各项任务。

     ② 小车自动行驶及避障,采用超声波避障模块等对环境数据进行采集,通过路径规划实时了解小车姿态并做出调整,实现其自动行驶及自动避障功能。

     ③ 小车底盘主要结构采用刚性与非刚性相结合,小车底盘结构主体部分采用刚性软性组合方式轮式驱动和辅助部分采用轮腿式驱动相结合。这种选择组合式的底盘,使它能够保持更加平稳的运动状态,而且承载能力较强。

     ④ 采用物体检测模块检测是否有人,然后利用超声波模块与人保持一定的距离,这样就可以减少接触,到达指定地点后取货物。

     ⑤ 采用颜色识别模块,识别红绿灯,这样就可以遵守交通规则。

     ⑥ 操作简便,便于维护,由于该小车采用结构化设计方法,它的每一个功能设计都是实用化、智能化。逐步细化的操作模式,使得操作简洁明了、易于使用。

5.2 创新点在实际中的应用

     ① 这种组合底盘小车在山路或者陡坡中,表现出强大的适应能力,而且成本低,效率高;从结构上看,两侧的刚性软性组合方式都有不少的齿,所以表现出更加优越的抓地能力,打滑的情况也不容易发生;和其它类型的小车相比,履带式小车的结构更加的复朵,并且体积较大,重量使得其惯性较大,所以更加的稳定,这种小车非常适用于灾难救援之中,它可以很高效的完成求援任务。

     ② 小车路径规划在实际应用中非常的广泛和实用,实际生活中非常多的小车都运用到了路径规划,例如在现在的智能快递派送之中,小车通过路径规划能非常高效的实现自动驾驶,所以路径规划能使小车更加有效的完成任务和功能。

     ③ 拥有了红绿灯检测功能,小车就能适用于社会上有红绿灯的场景了。

程序源代码及样机3D文件等资料下载详见 货物输送小车

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