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