見えないターゲットの探索
探索動作の実装は、いくつかの状況で役立ちます。一部のゲームでは、スコアを決めるゴールが予測可能な場所にないため、「おおよその位置」まで到達するためのデッドレコニング自律走行コードに頼ることができません。例えば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;