使用计算机视觉实现PID算法


10

我正在构建一个自动迷宫迷宫求解器,并使用网络摄像头来控制迷宫。

根据其他论坛的建议,我现在试图至少在一个方向上控制迷宫的球运动。因此,我试图控制球在两个坐标466,288和466,152之间的运动。步进电机控制板的输入是时间,每个轴(x和y)的旋转步数没有。

我使用的步进电机控制板是Egg bot步进电机控制板:http : //www.sparkfun.com/products/10025

因此,为了在两个点之间移动,我是否应该在两个点之间创建多个航路点,即288和152(例如260 240 230 ... 150)并纠正我的球的运动?

我的图像处理算法跟踪球的速度不够快,以至于球只会旋转并掉入一个洞中。

一些人建议我使用以下视频中所示的标准模板,并更正我的球的运动以解决路径偏差:

http://www.youtube.com/watch?v=Prq78ctJ2Rk&feature=player_embedded

我还遇到了一种图像处理工具,他们使用球的运动点解决了相同的问题。看到太多解决同一问题的方法,我完全困惑于解决问题。我知道我应该实现PID控制器。但是我应该如何逐步解决问题呢?我被困在寻找解决该问题的先机而感到沮丧。

我的设置如下所示:

设置图片

...这是我的软件的屏幕截图:

屏幕截图

修订2:我现在还面临一个新问题:早些时候,我通过Arduino串行端口Java小程序控制步进电机。我可以使用小程序来驱动步进器。

每次尝试通过串行端口通信时,都必须重置板。同样,当没有命令发送给步进电机时,步进电机会以较小的间隔通电。当步进电机进入此模式时,如果不重置电路板,将无法控制我的电路板。任何援助将不胜感激。

修订版3:

在实施PID算法方面取得了一些进展。请在下面找到视频:http : //www.youtube.com/watch?v=MEfp7RqPmqY

现在,我对PID算法的执行速度有疑问。实际上,我的图像处理在200毫秒内完成一个周期,识别出一个球并将命令发送到步进电机控制器板上。即使向我的串行端口发送了切换方向的命令,我的步进器仍沿相同方向旋转。您可以在上面的视频中找到奇怪的行为。

我的想法是,我应该将PID值限制为一个上限,如果计算出的PID值大于100,我应该只发送100。我很希望听到您对此的看法。

我实现PID控制器的方式是,我使用模板匹配算法确定了模板的起点,并使用了另一个模板匹配算法确定了球。现在,我使球移至起点模板的质心。如何使用PID算法使其遵循直线?

修订4:

孤立的Blob轨迹

我已经隔离了轨迹,但是无法找到正确的功能来从起点打印正确的像素坐标。有什么想法吗?


1
关于PS:然后只需发布指向图像的链接,我确定有人会出现并用图像本身替换它……
Majenko 2011年

@Matt-固定!但是,我希望用户提供的文字与图像一起显示,而不仅仅是图像的链接。我不确定@Sai在哪里想要它们,我只是将它们放在底部。
Kevin Vermeer

哇....那些步进器有足够的扭矩来以任意速度移动电路板吗?我希望那里可以减少一些齿轮。
康纳·沃尔夫,

@Fake-步进器应该没有问题。木板重量不大,重量也很均衡。我有一个挂钟,长40厘米,它的指针与其他任何钟表一样,都是由相同的小机械装置控制的。(与直径为80cm的时钟相比,5cmx5cm的机构看起来小得可笑)
stevenvh 2011年

@假:史蒂夫是对的。步进电机没有问题。这是所有的PID算法

Answers:


2

首先,由于步进器很擅长定位(不需要位置反馈),因此您一定要像自己说的那样限制其运动。我不确定电机轴现在是如何设计的,但是如果将其固定在电机上,使其继续旋转将有损坏设备的风险。

接下来,传感器中200ms的传输延迟可能会太慢,否则您将需要放慢速度以减慢球本身的速度。类似于Rocket Surgeon所说的那样,您应该简化图像处理算法以计算一次路径,然后快速仅计算每个帧中球的位置。如果要快速跳过此步骤,请找到一个红色的球而不是这个球,然后仅检查RGB图片中的红色分量,直到找到更好的算法为止。

对于PID控制,首先需要实际使用两个单独的PID控制器,一个用于东西向电动机,另一个用于南北电动机。如果有两个精确的电动机,则它们的参数必须相等。

为了使PID控制器起作用,它需要知道以下误差:期望位置与球的实际位置之间的差。该偏移量的 X和Y分量将作为两个PID控制器的输入(每个电动机一个)。要获取错误,您首先需要在路径上具有所需的位置:轨迹

要获取轨迹,您需要处理图像并获取path以及其起点和终点。我不确定您的算法现在是否能够将路径与其他电路板区分开,但是如果不能,请注意,这是继续处理之前要处理的算法。同样,如果您希望快速看到一些结果,则可以通过手动输入连接点来跳过此部分。在任何情况下,您都应该能够定义设定点速度,并使软件从起点到终点在路径上移动所需的坐标位置。显然,您将以较低的期望速度开始。

因此,在开始控制之前,您应该首先检查以下清单:

  • 简化图像处理算法以获得更快的响应
  • 创建一个算法,该算法使用预定义的速度在路径上创建轨迹
  • 在每个框架中:
    • 计算轨迹和球位置之间的差异
    • 将delta-X分量传递给东西方PID,将delta-Y传递给南北PID

可能会发现最好一次创建一个轨迹,然后在该球结束前一个轨迹继续下一个轨迹。否则,您将需要注意球不会超出期望的轨迹(这可能很难实现)


1

如果您在两个轴上都有固定的摄像机和机械读数位置,则无需识别框架中的绘制路径,孔和墙。可以在设置时间内一次性完成。在运行时,您可能只需要发现单个发光金属球的确切位置即可。

要发现球,您可以在相机上使用1个固定点红外LED和窄带滤镜。该算法必须计算最亮的像素并将X,Y转换为实数X,Y,并考虑以下步骤:

  • 找到最亮的像素
  • 使用两个轴的角度(从伺服读取)以恢复与相机的距离
  • 使用时间戳读取轴位置
  • 如果需要,可通过时间进行插值以读取位置
  • 使用已知的镜头变形
  • 将像素的世界X,Y转换为来自完美球体的反射角,以找到世界X,Y中球的真实中心
  • 恢复真实帧时间的增量时间
  • 根据需要在板平面X,Y中的时间插补
  • 将结果X,Y(t)发送到PID算法
  • 从轨迹生成器/序列发送第二个进给目标X,Y(t)
  • 让PID决定输出
  • 执行输出(最后步骤可以并行完成)

它不应该占用大量计算资源,并且主要取决于几个绝对值。

通常,小型CPU应该以帧速率的步伐来执行此操作。


我不确定我是否了解您的解决方案。我发现您的解决方案很有趣。如何确保我的球遵循正确的路径?我是否应该确保要遵循一系列路标?

是。运动控制软件必须始终具有“轨迹生成器”,该例程对于任何给定的时间步长都会生成理想的X,Y(t)有限序列。该序列被馈送到控制回路的第一输入,控制回路的第二输入是实际位置的序列。控制程序必须计算位置/速度/加速度误差,并根据PID放大/求和所有误差,并产生校正信号。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.