编辑:
所以,我刚刚意识到您正在使用无人机,并且您的坐标系 WRT 无人机可能是 x 向前进入图像,y 位于图像左侧(图像列),z 垂直向上(图像行)。我的答案有坐标 WRT 相机 x = 列,y = 行,z = 深度(进入图像) 当你阅读我的大纲时,请记住这一点。我写的所有东西都是伪代码,没有很多修改它就不会运行
原帖:
PID 控制器是比例-积分-微分控制器。它根据您的特定错误决定一个动作顺序。
对于您的问题,假设最佳跟踪意味着矩形位于图像的中心,并且它占用了大约 30% 的像素空间。这意味着您移动您的相机/机器人,直到满足这些条件。我们将这些目标参数称为

x_ideal = image_width / 2
y_ideal = image_height / 2
area_ideal = image_width * image_height * 0.3
现在假设您的边界框有 4 个参数
(x_bounding, y_bounding, width_bounding_box, height_bounding_box)
您的错误将类似于以下内容:
x_err = x_bounding - x_ideal;
y_err = y_bounding - y_ideal;
z_err = area_ideal - (width_bounding_box * height_bounding_box)
请注意,我已将 z 距离(深度)与对象的大小联系起来。这假设被跟踪的对象是刚性的并且不会改变大小。任何大小的变化都是由于物体到相机的距离(更大的边界框意味着物体很近,一个小的意味着物体很远)。这是一种估计,但在相机或物体本身没有任何参数的情况下,我们只能做出这些一般性陈述。
在创建控制序列时,我们需要牢记符号,这就是为什么在做减法时顺序很重要。让我们从逻辑上考虑一下。x_err
确定边界框与所需位置的水平距离。在我们的例子中,这应该是正数,这意味着机器人应该向左移动,以便对象更靠近图像的中心。盒子太小,意味着物体太远等。
z_err < 0 : 表示机器人距离太近需要减速, Vz 应该减小
z_err = 0 : 保持速度指令不变, 不变
z_err > 0 : 我们需要靠得更近, Vz 应该增加
x_err < 0 : 表示 bot 向右, 需要向左转(减小 x), Vx 应该减小
x_err = 0 : 保持 X 的速度不变, Vx
不变 x_err > 0 : 表示 bot 向左并且需要右转(增加x),Vx应该增加
我们可以对每个 y 轴做同样的事情。现在我们使用这个错误来为机器人创建一个命令序列。
这种描述听起来很像 PID 控制器。观察一个状态,找出一个错误,创建一个控制序列来减少错误,然后一遍又一遍地重复这个过程。在您的情况下,速度将是您的算法输出的动作。您基本上将运行 3 个 PID
- X 的 PID
- Y 的 PID
- Z 的 PID
因为这些本质上是正交的,所以我们可以说每个系统都是独立的(理想情况下是独立的),在 x 方向上移动不应影响 Y 方向。这个例子也完全忽略了方位信息(Vr
),但它是一个思考练习,而不是一个完整的解决方案
校正的确切速度由您的 PID 系数决定,这就是事情变得有点棘手的地方。这是一个易于阅读(几乎没有数学)的概述或 PID 控制。您将不得不通过一些实验来使用您的系统(也就是“调整”您的参数)。这变得更加困难,因为相机不是完整的 3d 传感器,因此我们无法从环境中提取真实的测量值。在不了解有关您的传感器/环境的更多信息的情况下,很难将错误转换为~30 pixels
,但我希望这能让您大致了解如何进行m/s