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

电器工程 机器人技术 pid控制器 图像处理
2022-01-15 11:34:25

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

根据其他论坛的建议,我目前正在尝试至少在一个方向上控制迷宫的球运动。所以,我试图控制我的球在两个坐标 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 轨迹

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

2个回答

首先,由于步进器非常擅长定位(不需要位置反馈),您当然应该像您自己所说的那样限制它们的移动。我不确定电机轴现在是如何设计的,但如果它固定在电机上,让它继续旋转可能会损坏设备。

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

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

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

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

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

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

事实证明,最好一次创建一段轨迹,并在该球结束前一段时继续下一段。否则,您需要注意球不会超出所需的轨迹(这可能很难完成)

如果您有固定的相机位置和两个轴的计时器读数,那么您不需要识别框架中的绘制路径、孔和墙壁。它可以在设置期间一次性完成。在运行时,您可能只需要确定单个闪亮金属球的确切位置。

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

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

它不应该是计算密集型的,并且主要取决于几个绝对值。

通常,小CPU应该以帧率的速度来做。