1

我试图让机器人识别地面上的一条线并跟随它。
我在互联网上搜索过,发现了许多线路跟踪机器人的例子,但它们都使用专门的传感器来检测线路。
为此,我想使用机器人上的摄像头。

我是计算机视觉领域的新手,所以我想就如何解决这个问题提出一些建议。具体来说,如何检测与机器人相关的线及其角度/方向?如何检测转弯?

更新以下 nikies 评论:
这条线的外观取决于我,我想在地上放一些鲜艳的胶带,但我可以使用最简单
的方法……相机可以拍摄彩色和黑白图像。
照明和位置可能会有所不同,但我稍后会担心,我只是想知道要寻找什么才能开始。有没有“通用”的方法来做到这一点?

4

4 回答 4

6

这是一种适合细化的方法。

通过缩放、像素化过滤器和阈值处理的组合,将相机输入减少为 3 x 3 的白色或黑色方块网格。通过适当的调整,缩小应该能够放大线条,使其恰好占据缩小的像素中的三个。然后,机器人的逻辑包括沿八个方向之一移动以保持中心像素为黑色。

缩小后的图像:

☐ ■ ☐
☐ ■ ☐ ↑ move forward one unit
☐ ■ ☐

左转的样子:

☐ ☐ ☐
■ ■ ☐ ← turn 90 degrees left
☐ ■ ☐

这是一个非常简单的方案,将视频输入转换为干净的 3 x 3 网格并不是一项简单的任务,但它应该足以让您朝着正确的方向前进。

于 2011-12-13T20:29:56.213 回答
1

一种选择是使用 OpenCV 或类似的图像处理/视觉库以及向前和向下的相机来执行以下操作:

  1. 放置一个已知的、不寻常的、明亮颜色的胶带,例如黄色或橙色。如果您愿意在机器人上安装光源,您甚至可以使用反光带。
  2. 使用 OpenCV 将彩色视频图像分解为三个 HSV 平面 - 色调(颜色)、饱和度和值(强度)。
  3. 使用描边宽度变换来识别线条。以下 StackOverflow 帖子包含指向有关 SWT 的视频的链接: Stroke Width Transform (SWT) implementation (Java, C#...)
  4. 应用细化算法(Stentiford 或 Zhang-Suen)将分段胶带线减少到单个像素宽度。
  5. 将单个像素视为曲线拟合的输入点。或者,更简单地说,计算直线中每组 N 个连续点的端点到端点的角度。
  6. 应用一点 3D 几何图形以及有关机器人当前方向和速度的信息来计算它必须转动的时间,以及为了跟随线而转动的速度。

如果您的机器人移动缓慢,那么向下看的摄像机可能更合适。计算更容易,但机器人无法向前看。

于 2011-12-30T16:50:59.303 回答
0

您的机器人需要多快移动?有 AI(人工智能)选项(这将比其他答案中描述的简单决策要慢。

在人工智能领域,你可以调查:

自组织地图 (SOM) 尝试在黑线上进行推理。你可以教它识别形状(我以前用它来识别字母)。我认为这可以在现代计算机上相当快地计算出来,但取决于你的机器人硬件(不能完全记住)。

人工智能技术需要相当长的时间来训练和学习。如果您想要一种固定的代码方式,另一个答案也是一个不错的选择。

于 2011-12-18T21:43:22.977 回答
0

好吧,你可以做很多事情。如果您不了解它们,我会先阅读有关union-find 算法的内容。根据您的环境,您可能能够摆脱 1) 对图像进行对比度归一化或执行直方图均衡化,然后 2) 将所有大致符合线条颜色的像素添加到联合查找数据结构中。对于鲁棒性(如果你有彩色相机),我会选择显示非常强烈的东西,比如亮橙色,而不是黑色,黑色不包含色调信息,并且会在任何地方被检测到。

从那里,您需要一些方法来根据处理后的数据做出决策。您可以想象编写一个简单(虽然肯定不完美)的算法来猜测哪些图像段是线,计算它的方向,并计算控制器的转动方向。也许您扫描图像中的几条水平线并将一条线拟合到过滤器的最大响应。这可能会得到你想要的大部分。也许你可以根据你的硬件想出一些更聪明的东西,或者,例如,强制这条线总是从图像的底部延伸到某个高度。

如果您真的有野心并且精通数学,则应该阅读(相机)镜头校准。本质上,通过将数学模型拟合到您的相机镜头并假设图像中的所有内容都在机器人下方的地面上,您实际上可以确定线在 3D 中相对于您的机器人在哪里运行。不过,这最后一步需要大量的知识,所以不要指望它很容易!

于 2011-12-19T06:18:23.317 回答