Mobot#

文章作者:Cosku Acay、Edwin Cho、Kenneth Li 和 Nishant Pol。PDF

项目描述#

在卡内基梅隆大学的 Mobot 比赛中,机器人必须通过一系列 14 个门,这些门位于户外人行道上一条 255 英尺长的弯曲白线上。赛道包括两个陡坡和一个决策点区域,机器人必须在该区域选择正确的路线,以便按顺序依次通过 14 个门。由于这条线在户外并处于匹兹堡的天气之下,机器人必须在各种条件下运行。今年比赛当天下着雨,刮着风。更多信息可在 http://www.cs.cmu.edu/mobot/mobot.html 找到

Mobot Mobot

Mobot (full size)Mobot (full size)

使用 CMUcam4 的解决方案#

我们选择使用 CMUcam4 来处理循线任务,因为它所需的硬件极少,并且具有非常适合跟踪线的接口。

Mobot hardware Mobot hardware (full size)

CMUcam4 以每秒 30 帧的速度捕获线的图像,并通过三条串行线之一将颜色跟踪图像馈送到 Arduino Mega。然后 Arduino Mega 处理此图像(请参阅下面的软件说明),并通过另一条串行线将电机速度和转向命令传送给 PID 控制器。PID 控制器反过来为 Arduino Mega 提供左右轮的编码器计数,这使我们能够跟踪相对于门 0 的位置和航向。

PID 控制器 (MD-25) 由英国的 Robot-Electronics 制造。它驱动两个带电机轴磁编码器的齿轮直流有刷电机。LCD 屏幕用于调试目的。我们有两条电源轨,12V 用于电机,5V 用于逻辑,共用同一个地,并且都由一块 12V 可充电电池供电。

我们最初计划用木质底座制作一个原型,以便快速进入编程阶段,然后再研究更快、更可靠的底座,例如 RC 车。然而,我们发现原型非常可靠且易于使用,因此我们保留它用于最终设计。车身的防水由一层玻璃纸包裹加一层包装胶带构成。然而,雨水会渗过包装胶带,但幸运的是没有渗过玻璃纸包裹。相机由从 Ziploc 袋子上剪下的一块方形塑料覆盖,因为我们发现这个"滤镜"提高了相机忽略线上小块区域的能力,那些小块区域在相机看来就像背景混凝土。

算法说明#

背景#

我们在启用 YUV 模式的颜色跟踪模式下使用 CMUcam4,这为我们提供了线的二值图像表示。相机软件会过滤掉任何非白色(即背景)的内容,并在有线的地方(即白色处)放置一个"开"像素。我们使用 YUV 模式,以便颜色跟踪对光照强度不敏感,从而使我们的机器人能够在包括室内和室外在内的各种条件下工作。

循线#

CMUcam4 为我们的 Arduino 芯片提供一幅 80 x 60 的二值图像。我们从图像中采样 10 行等间距的像素,并计算"开"像素的质心(参见此处:https://en.wikipedia.org/wiki/Centroid#Of_a_finite_set_of_points)。然后我们假设线位于质心上。通过对图像中的 10 个不同行执行此操作,我们通过连接这些点得到线的良好近似。然后,我们可以通过找出线上每个点距离位于图像中心的垂直线有多远,来使用这些数据得到一个表示线弯曲程度的值。这可以看作类似于求切线和曲线之间的面积,并使用该面积来确定我们需要转多少弯。符号决定转向是左还是右,而幅度决定我们需要转多少弯才能跟随该线。正如您所料,如果我们测得的面积为零,那么线正好在机器人的正前方,是一条直线。如果面积的幅度很大,那么机器人需要转弯以尝试将此面积的幅度最小化。

决策点#

为了确定机器人是否处于决策点,我们采用相机从循线中收集的数据,并检查有多少个平均中心点出现在黑色空间中。这基于这样的假设:两条线之间的平均点不应位于任一条线上,除非这两条线是同一条线。如果机器人在黑色空间中检测到多个平均点,它可以断定这里一定有两条线。然后它选择适当的转向,并将其转向偏向该方向,直到它只看到一条线。

请访问 https://github.com/cacay/Mobot 查看我们代码的简化版本,或访问 此处 获取本地副本。