如何构建避障机器人

在本教程中,您将学习如何使用Arduino和三个HC-SR04超声波传感器构建障碍物检测和躲避机器人。该机器人是具有两个驱动轮和一个后脚轮的低成本移动平台。它包括三个传感器,可感知环境中的障碍。

机器人在不知道周围详细地图的情况下导航。如果在其路径中检测到障碍物,则机器人会调整其速度以避免碰撞。如果周围环境没有障碍物,则机器人只会向前移动,直到在传感器范围内检测到障碍物为止。

主要组件清单:

  • 1个2WD机器人机箱套件[ Amazon ]
  • 1 X L298N电动机驱动程序[ Amazon ]
  • 1个Arduino UNO [ Amazon ]
  • 3 X HC-SR04超声波传感器[亚马逊]
  • 1 X 5V电池组[亚马逊]
  • 1个用于4个AA电池的电池座[ Amazon ]

首先,我们需要定义输入以了解机器人将从何处将信息带入其系统。该检测和避免机器人将具有两种类型的输入。

1。 最直接的输入是将用于打开和关闭电动机驱动器的开关按钮,以及用于电池组为Arduino板和传感器供电的电源开/关按钮。

2。机器人通过传感器看到世界,这是将信息带入控制系统的方式。传感器是机器人的第二个输入。传感器使机器人能够检测并响应周围的环境。传感器使机器人能够安全地操作,自动检测障碍物并动态改变其路线。

机器人使用传感器来测量机器人和障碍物之间的距离。如您所知,房屋内部是大小不同的不同物体,它们是由多种材料制成的。机器人可以检测来自不同材料的物体,例如木椅或沙发床。

一旦机器人检测到障碍物,该算法就会根据传感器的最新输出来计算替代路径。如果物体位于平台的左侧,则机器人会动态地将其方向向右移动,直到传感器不再检测到障碍物为止。当传感器检测到右侧的障碍物时,行为相同。

如果传感器在机器人路径的中间检测到障碍物,则该算法将其方向随机更改为左或右,直到传感器不再检测到障碍物为止。

我们已经完成了对自主机器人的输入类型的定义。输入是必不可少的,输出也是必不可少的。

障碍物检测和躲避机器人具有一种输出。

3。移动机器人使用两个直流电动机,平台的每一侧各一个。每个电动机都经过单独编程,可以使机器人沿任何方向移动以进行旋转和枢转。

为了完全控制直流电动机,我们必须控制速度和旋转方向。这可以通过组合用于控制速度的PWM方法和用于控制方向旋转的H桥电子电路来实现。

一旦完成输入和输出的定义,我们便会进一步将障碍检测和躲避机器人分解为简单的部分,并一步一步地对其进行处理。

警告:您需要有关电路的知识,例如电气工程概念,原理图,数据表,伏特,以及连接电源的一些经验。对于您的个人财产的任何损失或损坏,我概不负责。

对于此机器人,我使用了灵活的体系结构,这意味着允许用户执行以下操作:

  • 添加多个传感器和组件。
  • 可以用其他传感器替换实际的传感器。
  • 轻松编写自己的软件。

第1部分:检测系统

这一部分是关于将传感器输出的原始数据转换为导航中使用的精确测量值。

第2部分:导航

在这一部分中,我们将构建算法来计算转向,以便在移动机器人的周围环境中找到无碰撞的路径。

第三部分:驱动系统

在这一部分中,我们将使用导航中的数据来引导机器人。

一旦知道了必须要做的事情,我们就会进一步使事情变得简单易懂。我们将从解释如何做,构建电路和编写程序开始。

第1部分:检测系统

在这一步,我们必须赋予机器人感应功能。我们必须创建一个能够查看周围环境的检测系统。超声波传感器是在这两个内部和外部世界感知周围的环境非常有效。

我们没有使用单个超声波传感器来解决传感问题,而是使用三个传感器在复杂的环境中引导机器人。我们将在近距离观察任务中使用所有传感器。这是因为机器人将在内部工作,并且操纵空间有限。例如,HC-SR04提供2 cm至400 cm的非接触式测量功能。利用传感器的最大范围,机器人将始终在房间内的路径中检测到物体,并且完全不会移动。

1.1设置Arduino和HC-SR04超声波传感器

根据规格,HC-SR04的工作电压为5V。Arduino具有提供5V输出的接口引脚。

一个超声传感器的工作电流为15mA。三个传感器将消耗45mA的电流,即使将Arduino连接到5V电池组的USB端口也可以支持。Arduino UNO的5V输出引脚适用于USB上的〜400 mA,与外部电源适配器一起使用时,其两倍以上(〜900 mA)。

对于传感器和Arduino之间的连接,我使用跳线。

用一个5V引脚为传感器供电是一个挑战,需要切割和焊接导线。解决方法是,可以使用试验板将Arduino的5V和接地引脚连接到传感器的5V和接地引脚。

这是我为传感器供电的最终设置。红色/橙色线为5V,黑色/蓝色线为接地。


连接电源线后,我们走得更远,使用母对公跳线连接触发和回波引脚。

传感器左侧:
回声-> PIN 2 Arduino
Trig-> PIN 3 Arduino
传感器中心:
回声-> PIN 4 Arduino
Trig-> PIN 5 Arduino
传感器右侧:
回声-> PIN 6 Arduino
Trig-> PIN 7 Arduino

传感器和Arduino的最终设置:

微信截图_20210104135549.png


void sensorCycle() {
  for (uint8_t i = 0; i < SONAR_NUM; i++) {
    if (millis() >= pingTimer[i]) {
      pingTimer[i] += PING_INTERVAL * SONAR_NUM;
      if (i == 0 && currentSensor == SONAR_NUM - 1) oneSensorCycle();
      sonar[currentSensor].timer_stop();
      currentSensor = i;
      cm[currentSensor] = 0;
      sonar[currentSensor].ping_timer(echoCheck);
    }
  }
}

// If ping received, set the sensor distance to array.
void echoCheck() {
  if (sonar[currentSensor].check_timer())
    cm[currentSensor] = sonar[currentSensor].ping_result / US_ROUNDTRIP_CM;
}

:我们使用的是NewPing库循环遍历每个传感器,并在传感器ping周期完成后返回读数;
:如果收到ping,则将测得的距离加到数组中;

1.2应用过滤器以消除嘈杂,跳动或不稳定的读数

我们对传感器输出进行滤波的任务包括几个步骤。我们应用了过滤器,以删除一些不需要的读数,并获得更平滑的结果。然后使用卡尔曼滤波器消除传感器的跳变或不稳定的读数。

int returnLastValidRead(uint8_t sensorArray, uint8_t cm) {
  if (cm != 0) {
    return oldSensorReading[sensorArray] = cm;
  } else {
    return oldSensorReading[sensorArray];
  }
}

//Apply Kalman Filter to sensor reading.
void applyKF() {
  isObstacleLeft = obstacleDetection(KF_Left.updateEstimate(leftSensor));
  isObstacleCenter = obstacleDetection(KF_Center.updateEstimate(centerSensor));
  isObstacleRight = obstacleDetection(KF_Right.updateEstimate(rightSensor));
}

sitemap