Se positionner à la bonne distance
Les robots FRC doivent souvent être positionnés à une distance spécifique d'un objectif de score pour que leur mécanisme de marquage fonctionne correctement. Vous pouvez utiliser une simple boucle de contrôle proportionnel combinée avec le réticule calibré du limelight pour faire conduire très facilement votre robot à une distance spécifique de l'objectif.
Pour cet exemple, vous devez vous assurer que votre robot est orienté vers l'objectif. Plus tard, nous combinerons le visage et l'ajustement de distance en une seule fonction, mais pour cet exemple, nous nous concentrons uniquement sur le code qui conduit le robot à la bonne distance.
Similaire à 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 current_distance = Estimate_Distance(); // voir 'Étude de cas : Estimation de la distance'
if (joystick->GetRawButton(9))
{
float distance_error = desired_distance - current_distance;
driving_adjust = KpDistance * distance_error;
left_command += distance_adjust;
right_command += distance_adjust;
}
Avec quelques ajustements du paramètre KpDistance, votre robot devrait très rapidement et précisément se déplacer à la distance souhaitée. Comparé à la visée, se déplacer à la bonne distance est généralement plus facile car la plupart des robots avancent et reculent beaucoup plus facilement qu'ils ne tournent sur place.
Ensuite, nous décrirons une astuce simple pour rendre le déplacement à la bonne distance encore plus facile. Au lieu de calculer réellement la distance, vous pouvez utiliser le réticule du limelight. Positionnez simplement votre robot à votre distance idéale de la cible et calibrez la position y du réticule. Maintenant, votre angle y indiquera 0.0 lorsque votre robot est à la bonne distance. En utilisant cette astuce, vous n'avez jamais besoin de calculer réellement la distance et votre code peut ressembler à ceci :
float KpDistance = -0.1f;
std::shared_ptr<NetworkTable> table = NetworkTable::GetTable("limelight");
float distance_error = table->GetNumber("ty");
if (joystick->GetRawButton(9))
{
driving_adjust = KpDistance * distance_error;
left_command += distance_adjust;
right_command += distance_adjust;
}
Si vous devez changer la distance de tir, déplacez simplement votre robot à la nouvelle distance et recalibrez le réticule du limelight.
![]()
Voici un exemple d'un robot utilisant l'idée ci-dessus. Notez comment il recule automatiquement à la bonne distance lorsque le pilote arrête de conduire et appuie sur le bouton "viser" :
