使用 视觉伺服进行瞄准
- 您只需使用 limelight 和传动系统就能让机器人准确快速地瞄准。
- 这一切都可以在不到1小时内完成。
通过使用高帧率视觉跟踪,现在可以直接将视觉管道作为 PID 控制回路中的"传感器"来引导您的机器人或炮塔。为了测试这个想法,我们在 2017 年的 FRC 机器人上添加了一个 limelight,并仅使用传动系统和 limelight 报告的网络表数据使其瞄准视觉目标。
在这个例子中,我们的测试对象是一台使用 colson 轮的 6 轮传动系统的 2017 年 FRC 机器人。这是我们为进行此测试在机器人上安装 limelight 的图片。
接下来,我们在机器人上添加了一些代码,这些代码会在驾驶员按住操纵杆上的按钮时运行。这个机器人使用"坦克"式驾驶,所以 OperatorControl 函数会生成 'left_command' 值和 'right_command' 值来控制传动系统的左右两侧。在正常控制代码之后,我们添加了这样的代码块:
float Kp = -0.1f; // 比例控制常数
std::shared_ptr<NetworkTable> table = NetworkTable::GetTable("limelight");
float tx = table->GetNumber("tx");
if (joystick->GetRawButton(9))
{
float heading_error = tx;
steering_adjust = Kp * tx;
left_command+=steering_adjust;
right_command-=steering_adjust;
}
一开始,这基本上就能工作。当您按住按钮时,机器人会自动转向目标方向。如果您移动目标,机器人会转动跟随目标。但是,通过仪表板上的实时视频反馈,我们可以看到一个大问题 :机器人并不总是能完全对准目标。在一些具有小目标的比赛中(如 2016 年和 2017 年),这是不够好的。
到目前为止,我们实现的是一个简单的比例控制回路。我们计算航向误差并将其乘以一个常数,从而产生与误差成比例的电机命令。当误差趋近于零时,我们的命令也会趋近于零。问题是当机器人试图转向时会有很大的摩擦。很小的命令根本不会使机器人转动。在小角度时,命令可能变得太小而无法实际移动机器人。您可能会发现,当您从较大的目标误差开始时,您的机器人能很好地达到目标,但如果您一开始就非常接近目标,它就完全无法瞄准。
解决这个问题有几种方法,但这里有一个非常简单的解决方案。我们使用了"最小命令"的概念。如果误差大于某个阈值,只需在电机命令中添加一个常数,该常数大致代表机器人实际移动所需的最小功率(实际上您想要使用比这略小的值)。新代码如下所示:
float Kp = -0.1f;
float min_command = 0.05f;
std::shared_ptr<NetworkTable> table = NetworkTable::GetTable("limelight");
float tx = table->GetNumber("tx");
if (joystick->GetRawButton(9))
{
float heading_error = -tx;
float steering_adjust = 0.0f;
if (Math.abs(heading_error) > 1.0)
{
if (heading_error < 0)
{
steering_adjust = Kp*heading_error + min_command;
}
else
{
steering_adjust = Kp*heading_error - min_command;
}
}
left_command += steering_adjust;
right_command -= steering_adjust;
}
注意,如果您将 Kp 或 min_command 设置得太高,您的机器人可能会变得不稳定,并在超过目标时来回振荡:
经过对 Kp 和 min_command 的一些调整后,应该能让您的机器人非常准确和快速地瞄准目标。