Robo Sumo:智能机器人大战


c

每年,来自日本全国各地的约一千支队伍在机器人比赛中进行激烈的战斗。在本次比赛中,您将不会看到链锯,火炬和电火花-简而言之,当您听到“机器人之战”一词时,没有任何想到。

这不仅仅是战斗,它还是一种机器人相扑,以其独特的品质而受重视:优雅,简单和具有在战略中展现智慧的能力。比赛是在直径仅为1.5 m的圆形金属环上进行的,沿该金属环的周长画一条5厘米宽的白线,机器人越过该边界被认为是失败者。在这种明显的简单之中,蕴藏着机遇的深渊。

我们将告诉您“机器人之战”如何成为程序员的智力竞赛,并提供组装机器人专家的详细说明。

边界和敌人搜索传感器



c

机器人眼睛是红外传感器。IR反射的程度通过光敏元件来测量。边框的白色不是偶然选择的-它比戒指的黑色表面反射更多的光线。

该机器人配备了多个红外传感器,用于“搜索”边界。通常,前传感器有助于控制运动速度-战斗机不应因过度热情而离开战场。后传感器“跟随”接近环的边界:机器人收到后传感器的响应后,改变了方向。

通过测量反射光线所需的时间,您可以了解敌人的位置。给定此参数,许多机器人(但不是全部)会改变方向。

战斗规则



除了上面列出的优点之外,IR传感器还具有一个缺点-视野仍然狭窄,因此会出现许多盲点,在攻击中的使用是高度机动的机器人的主要策略。

但是,这仅适用于自主机器人。当独立的机器人相扑手与无线电控制的对手碰撞时,他不能使用盲区攻击策略,因为操作员的视野比机器人还多。

Autobot不会攻击盲点,而是从角落使用攻击策略。通常,摔跤手没有很多可用的动作:转弯,推动,制动和停止。

但是,为了迷惑敌人,一些战斗机在船体的一侧或两侧都悬挂了白旗。他们将敌人引向旗帜,攻击其脆弱的一面并将其推出环。

当然,出现了防御这种攻击的方法。左右标志的出现表示机器人主体位于中央。如果机器人将标志扔到一侧,则其主体位于相反的位置。

有些机器人不仅可以引诱敌人,而且还可以躲避传感器。为此,将它们涂成黑色或添加反射涂层。

军备



Sumoist机器人之战不仅仅是一场对决。他们中的许多人都配备了锋利的推土铲。它可以让您举起对手并将其移出球场,甚至造成严重伤害。的确,这种武器会降低战斗机的机动性。

在人类相扑中,战斗机的主要武器是他令人印象深刻的质量。奇怪的是,在机器人中,质量也起着“重要的作用”。

尽管根据规则,机器人的长度(在任一侧)不超过20厘米,并且重量不应超过3千克,但机器人专家可以“称量”几十千克。该“重量”是通过磁体实现的。是的,有时该技术实际上可以“粘”在地板上,因为戒指是基于金属表面的。

机器思维


创建机器人时,其主要策略是高机动性,因此使用的磁铁更少。在这种情况下,主要重点放在强劲的电机上。但是,战斗中的胜利很少仅依靠铁。

相扑机器人的主要内容是以代码形式编写的策略。铁的选择也取决于它。机器人经常运动得如此之快,以至于很难跟踪其运动。但是,超级可操纵的行为基于严格的程序逻辑。考虑创建它的原理。

相扑机器人创作



让我们来谈谈hackster.io站点上的专家经验,他们为创建典型的机器人专家创建了详尽的指南。

项目中使用了以下组件:

  • CytronTechnologies ×1 控制器 ;
  • 红外传感器(3-80厘米)×5;
  • 硅胶轮组JSumo(52 x 30毫米)×2;
  • 红外跟踪模块×2;
  • 直流减速电机(12 V,380 rpm)×4;
  • 锂电池(11.1 V,1300 mAh)×1。


1.控制器


您可以使用Arduino Uno,Mega或Nano。您还需要一块板来连接所有传感器。当然,您可以创建自己的扩展卡并将所有触点连接到Arduino,或购买现成的卡并连接所有电子组件。


2.引擎


这是机器人性能所依赖的最重要的部分之一。理想情况下,您需要具有高转速和高扭矩的发动机,但是在这种情况下,其尺寸会很大。您应该确保所有引擎和车轮都安装在20 x 20厘米的盒子中

,您可以在项目中使用多种类型的引擎。

具有圆柱齿轮行星齿轮的发动机,其中输出轴与发动机平行。


蜗轮蜗杆 马达输出轴在此垂直。此选项可能是更可取的,因为机器人中将有更多空间用于其他组件。


两轮与四轮


四轮驱动肯定会提供更多推动对手机器人的机会。但是,它的机动性低于两轮车。尽管如此,在此演示项目中仍使用了全轮驱动。

3.车轮



对于市场上的相扑机器人而言,优质橡胶的选择并不多。工程师选择了Jsumo制造的硅胶轮。但是,您可以使用玩具车上的轮子。

注意安装-确保选择的车轮与发动机输出轴对应的孔尺寸匹配。该项目分别使用6毫米轴,车轮上有6毫米孔。

4.传感器



要检测物体,可以同时使用红外传感器和超声波。

专家建议在与敌人的距离不超过60厘米的情况下发起攻击,因此可以放置灵敏度范围高达1 m的传感器。


对于该机器人,安装了三个红外传感器-每侧一个。


红外传感器也应安装在机器人的底部,这将有助于检测环边缘的白线。您可以根据自己的驾驶策略在前后安装多套边缘传感器。

5.电池



通常使用锂聚合物电池,因为它比相同尺寸的其他类型的电池提供更多的功率。

6.机器人的底盘


您可以使用Cytron提供现成基座,该基座适合机器人允许的尺寸(20 x 20 cm),也可以从头开始制作。


由于3D打印更经济,因此潜水员可以共享用于家庭打印的文件


7.组装


下表和表格概述了Sumo机器人的有线连接。



首先,您需要将两根导线(建议的尺寸为16-18 AWG)焊接到电动机端子,然后将其连接到控制器。


此外,所有电动机和传感器都需要用电线焊接。


现在我们来看一下盒子内部的装配。使用M3x10螺栓将电动机安装在下部壳体上。


在左右两侧安装红外传感器。


用M4螺丝固定轮辋,然后戴上硅胶带。

紧定螺钉必须固定在圆形电机轴的平坦部分上。


然后,使用自攻螺钉将边缘传感器安装在刀片底部。


在下部外壳的前部,您将看到两个用于铺放边缘传感器导线的孔。


使用M6x20螺栓和螺母将刀片与下壳体组装在一起。


在将红外线传感器安装到下壳体之前,请在其上安装红外线传感器。


安装完所有传感器和电机后,我们建议对每条电线进行标记,以方便将来进行故障排除。


固定电路板的支撑架。


在连接到板上之前,请检查电池和传感器的极性,然后记住在继续将其他组件连接到板上之前先取出电池。


由于这是全轮驱动机器人,因此必须在一侧连接两个引擎以同时控制它们。


在使用现成的代码示例时,最好将所有引擎和传感器连接到相同的端口,如图所示。


最后,连接电池。


相扑机器人准备好了!

8.传感器校准


重要的一步是在编程之前进行校准。不幸的是,大多数新手在设置机器人时并未对此给予应有的注意。

确保传感器在要求的灵敏度范围内运行。

敌方搜索传感器的最大灵敏度范围是80厘米,在此项目中,机器人不应对60-80厘米距离内的物体做出反应,因此灵敏度范围降低了20厘米。


为此,请将机器人“脸部”放在平坦的白色表面上,并保持60厘米的距离,并调整传感器,直到LED指示灯熄灭。该过程在视频中有更详细的显示。


使用螺丝刀通过刀片上的孔调节边缘传感器。

使用软件,您可以在LED D0和D1上显示两个边缘传感器的信号。


这是必要的,以确保传感器在感测到白色表面时发出高输出信号,而在黑色表面上发出低信号(请注意上面视频中D0和D1上的LED)。

9.编程


由于URC10机器人控制器与Arduino UNO兼容,因此可以使用Arduino IDE进行编程。您可以一个现成的代码示例

该项目中使用的唯一库是CytronMotorDrivers

如果您不知道如何启用该库或下载示例代码,请参阅URC10手册。

相扑机器人程序基本上可以分为四个部分:

  • 开始表演;
  • 搜索;
  • 攻击;
  • 撤退。

void loop() {
  //   .
  if (!digitalRead(EDGE_L)) {
    //     .
    backoff(RIGHT);
 
    //   .
    searchDir ^= 1;
  }
 
  //   .
  else if (!digitalRead(EDGE_R)) {
    //     .
    backoff(LEFT);
 
    //   .
    searchDir ^= 1;
  }
 
  //   .
  else {
    //  ,    .
    if ( digitalRead(OPPONENT_FC) &&
         digitalRead(OPPONENT_FL) &&
         digitalRead(OPPONENT_FR) &&
         digitalRead(OPPONENT_L) &&
         digitalRead(OPPONENT_R) ) {
      search();
    }
 
    // ,      .
    else {
      attack();
    }
  }
 
 
  //     .
  if (!digitalRead(BUTTON)) {
    //  .
    motorL.setSpeed(0);
    motorR.setSpeed(0);
 
    // .
    while (1);
  }
}

演出开始


启动策略取决于比赛规则。机器人只能在5秒钟后(有时是1秒钟)开始移动。

碰巧这些规则允许您将机器人放置在环中的任何位置。在其他情况下,机器人必须位于某个“起始区域”。

在此示例中,机器人被编程为一旦游戏开始就四处移动并从侧面攻击对手。

void startRoutine() {
  // .
  delay(1000);
 
  //    45 .
  motorL.setSpeed(255);
  motorR.setSpeed(0);
  delay(180);
 
  //  .
  motorL.setSpeed(255);
  motorR.setSpeed(255);
  delay(450);
 
  //  ,     .
  motorL.setSpeed(-0);
  motorR.setSpeed(255);
  uint32_t startTimestamp = millis();
  while (digitalRead(OPPONENT_FC)) {
    // ,        .
    if (millis() - startTimestamp > 400) {
      break;
    }
  }
 
}


搜索


如果刚开始后无法攻击敌人,机器人将绕圈绕圈寻找对手。一旦检测到,搜索模式将停止,机器人将继续攻击。

void search() {
  //   .
  if (searchDir == LEFT) {
    motorL.setSpeed(100);
    motorR.setSpeed(255);
  } else {
    motorL.setSpeed(255);
    motorR.setSpeed(100);
  }
}


攻击


当通过五个传感器之一检测到敌人时,机器人将转向他的方向并全速进攻。

攻击的准确性取决于您的机器人在全速前进时可以清楚地跟踪敌人的位置。如果敌人设法逃脱,程序将以搜索模式恢复工作。

void attack() {
  uint32_t attackTimestamp = millis();
  //    .
  //     .
  if (!digitalRead(OPPONENT_FC)) {
    motorL.setSpeed(255);
    motorR.setSpeed(255);
  }
 
  //   .
  //  .
  else if (!digitalRead(OPPONENT_FL)) {
    motorL.setSpeed(0);
    motorR.setSpeed(255);
  }
 
  //   .
  //  .
  else if (!digitalRead(OPPONENT_FR)) {
    motorL.setSpeed(255);
    motorR.setSpeed(0);
  }
 
  //   .
  //     ,     .
  else if (!digitalRead(OPPONENT_L)) {
    motorL.setSpeed(-150);
    motorR.setSpeed(150);
    while (digitalRead(OPPONENT_FC)) {
      // ,    .
      if (millis() - attackTimestamp > 400) {
        break;
      }
    }
  }
 
  //   .
  //     ,     .
  else if (digitalRead(OPPONENT_R) == 0) {
    motorL.setSpeed(150);
    motorR.setSpeed(-150);
    while (digitalRead(OPPONENT_FC)) {
      // ,    .
      if (millis() - attackTimestamp > 400) {
        break;
      }
    }
  }
}


撤退


当边缘传感器之一检测到白线时,机器人需要后退并转身。在旋转过程中,机器人将继续寻找敌人。如果看到它,它将受到攻击。

void backoff(uint8_t dir) {
  //  .
  motorL.setSpeed(0);
  motorR.setSpeed(0);
  delay(100);
 
  // .
  motorL.setSpeed(-255);
  motorR.setSpeed(-255);
  delay(200);
 
  //  .
  motorL.setSpeed(0);
  motorR.setSpeed(0);
  delay(100);
 
  // .
  if (dir == LEFT) {
    motorL.setSpeed(-150);
    motorR.setSpeed(150);
  } else {
    motorL.setSpeed(150);
    motorR.setSpeed(-150);
  }
  delay(100);
 
  //   
  //  -   .
  uint32_t uTurnTimestamp = millis();
  while (millis() - uTurnTimestamp < 300) {
    //   ,     .
    if ( !digitalRead(OPPONENT_FC) ||
         !digitalRead(OPPONENT_FL) ||
         !digitalRead(OPPONENT_FR) ||
         !digitalRead(OPPONENT_L) ||
         !digitalRead(OPPONENT_R) ) {
      //  .
      motorL.setSpeed(0);
      motorR.setSpeed(0);
      delay(100);
 
      //    .
      return;
    }
  }
 
  //    ,         .
  motorL.setSpeed(255);
  motorR.setSpeed(255);
  delay(200);
}


就这样。现在,您可以观看视频,该视频演示了机器人如何从本课程中学习。


您是否已有建造类似比赛机器人的经验?在评论中分享获胜策略。

资料来源


DIY机器人组装:https

: //www.hackster.io/cytron-technologies/building-a-sumo-robot-45d703全日本全国相扑机器人比赛:http : //www.fsi.co.jp/sumo/en /index.html

图解规则集http : //www.robotroom.com/SumoRules.html

All Articles