寻找不可见目标
在一些情况下,实现寻找行为会很有用。在某些比赛中,你要投射的目 标可能不在可预测的位置,所以你不能依靠死区重构自动代码来"接近"目标。例如在2009年的比赛中,目标是附在对手的机器人上的,而对手的机器人也在四处移动。你可能想要实现寻找功能的另一个原因是,如果你的机器人底盘不够可靠/重复性不够好,无法精确地到达你想要的位置。有时候转向驱动或全向驱动可能很难精确定位(这并不是在批评转向或全向驱动系统;只是让它们达到重复性定位更具挑战性)。有些比赛甚至允许在自动模式下进行机器人之间的互动。在2006年,我们经常进行自动对决,防守机器人会试图将进攻机器人撞出得分位置。在这种情况下,你不能确定任何事情!希望这能让你思考一下,让机器人自动寻找最初看不到的目标可能会有哪些用处。
幸运的是,为机器人添加寻找逻辑非常简单。要实现寻找功能,你只需让机器人扫描目标,一旦找到目标,就开始运行瞄准代码。我们将使用Limelight报告的'tv'或'target valid'(目标有效)值来判断是否看到目标。
std::shared_ptr<NetworkTable> table = NetworkTable::GetTable("limelight");
float tv = table->GetNumber("tv");
float tx = table->GetNumber("tx");
float steering_adjust = 0.0f;
if (tv == 0.0f)
{
// 我们看不到目标,通过安全速度原地旋转来寻找目标
steering_adjust = 0.3f;
}
else
{
// 我们看到了目标,执行瞄准代码
float heading_error = tx;
steering_adjust = Kp * tx;
}
left_command+=steering_adjust;
right_command-=steering_adjust;