Se mettre à portée
Les robots FRC doivent souvent être positionnés à une distance spécifique d'un objectif de marquage pour que leur mécanisme de marquage fonctionne bien. Vous pouvez utiliser une simple boucle de contrôle proportionnelle avec le réticule calibré de Limelight pour faire facilement avancer votre robot à une distance spécifique de l'objectif.
Pour cet exemple, assurez-vous que votre robot est orienté vers l'objectif. Plus tard, nous combinerons la visée et l'ajustement de la distance en une seule fonction, mais pour cet exemple, nous nous concentrons uniquement sur le code qui fait avancer le robot à la bonne distance.
Comme pour l'exemple de visée, nous montrons ici une fonction qui peut être exécutée dans la boucle de mise à jour de votre robot.
float KpDistance = -0.1f; // Constante de contrôle proportionnel pour la distance
float distance_actuelle = Estimer_Distance(); // voir l'étude de cas 'Estimation de la distance'
if (joystick->GetRawButton(9))
{
float erreur_distance = distance_souhaitee - distance_actuelle;
ajustement_conduite = KpDistance * erreur_distance;
commande_gauche += ajustement_distance;
commande_droite += ajustement_distance;
}
Avec un certain réglage du paramètre KpDistance, votre robot devrait rapidement et précisément se déplacer à la distance souhaitée. Par rapport à la visée, atteindre la bonne distance est généralement plus facile car la plupart des robots avancent et reculent plus facilement qu'ils ne tournent sur place.
Ensuite, nous décrirons une astuce simple pour faciliter encore plus l'atteinte de la bonne distance. Au lieu de calculer réellement la distance, vous pouvez utiliser le réticule de Limelight. Positionnez simplement votre robot à la distance idéale de la cible et calibrez la position y du réticule. Maintenant, votre angle y sera rapporté comme 0.0 lorsque votre robot sera à la bonne distance. En utilisant cette astuce, vous n'avez jamais besoin de calculer la distance réelle et votre code peut ressembler à ceci :
float KpDistance = -0.1f;
std::shared_ptr<NetworkTable> table = NetworkTable::GetTable("limelight");
float erreur_distance = table->GetNumber("ty");
if (joystick->GetRawButton(9))
{
ajustement_conduite = KpDistance * erreur_distance;
commande_gauche += ajustement_distance;
commande_droite += ajustement_distance;
}
Si vous devez changer la distance de tir, déplacez simplement votre robot à la nouvelle distance et recalibrez le réticule de Limelight.
Voici un exemple d'un robot utilisant l'idée ci-dessus. Notez comment il recule automatiquement à la bonne portée lorsque le pilote arrête de conduire et appuie sur le bouton "viser" :