如何让机器人使用其摄像机跟踪线路

时间:2011-12-11 11:12:49

标签: navigation computer-vision robot

我正试图让一个机器人识别地面上的一条线并遵循它 我搜索了互联网,发现了许多线跟踪机器人的例子,但所有这些都是使用专门的传感器检测线路。
为此,我想在机器人上使用相机。

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

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

4 个答案:

答案 0 :(得分:6)

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

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

还原后的图像:

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

左转是什么样的:

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

这是一个非常简单的方案,将视频输入转换为干净的3×3网格并不是一件容易的事,但它应该足以让你朝着正确的方向前进。

答案 1 :(得分:1)

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

  1. 放置一种已知的,不寻常的,明亮的颜色的胶带,如黄色或橙色。如果您愿意在机器人上安装光源,您甚至可以使用逆向反射带。
  2. 使用OpenCV将彩色视频图像分成三个HSV平面 - 色调(颜色),饱和度和值(强度)。
  3. 使用笔划宽度变换来标识线条。以下StackOverflow帖子有一个指向SWT视频的链接: Stroke Width Transform (SWT) implementation (Java, C#...)
  4. 应用细化算法(Stentiford或Zhang-Suen)将分割的磁带线减少到单个像素宽度。
  5. 将单个像素视为曲线拟合的输入点。或者,更简单地说,计算线中每组N个连续点的终点到终点的角度。
  6. 应用一个小的3D几何图形以及有关机器人当前方向和速度的信息,以计算它必须转动的时间,以及跟随线条的锐度。
  7. 如果您的机器人移动缓慢,那么向下看的相机可能更合适。计算更容易,但机器人无法向前看。

答案 2 :(得分:0)

您的机器人需要移动多快?有人工智能(人工智能)选项(比其他答案中描述的更容易做出决策。

在AI字段中,您可以调查:

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

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

答案 3 :(得分:0)

嗯,你可以做很多事情。如果您不了解union-find algorithms,我会先阅读histogram equalization。根据您的环境,您可以通过1)对比度标准化或在图像上执行hue,然后2)将大致符合您的线条颜色的所有像素添加到联合查找数据结构中。为了获得稳健性(如果你有彩色摄像头),我会选择一些非常强烈的东西,比如亮橙色,而不是黑色,它不包含(camera) lens calibration信息,并且随处可见。

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

如果你真的雄心勃勃并且熟练掌握数学知识,那么你应该阅读{{3}}。基本上,通过将数学模型拟合到您的相机镜头并假设图像中的所有内容都位于机器人下方的地面上,您实际上可以确定线相对于机器人的3D运行位置。但是,最后一步需要大量的知识,所以不要指望它很容易!