Contrôleur Ramsete

Le contrôleur Ramsete est un tracker de trajectoire intégré à WPILib. Ce tracker peut être utilisé pour suivre avec précision les trajectoires avec correction des perturbations mineures.

Construire l’objet contrôleur Ramsete

Le contrôleur Ramsete doit être initialisé avec deux gains, à savoir b et zeta. Des valeurs plus grandes de b rendent la convergence plus agressive comme un terme proportionnel tandis que des valeurs plus grandes de zeta fournissent plus d’amortissement dans la réponse. Ces gains de contrôleur dictent uniquement la manière dont le contrôleur produira les vitesses ajustées. Cela n’affecte PAS le suivi de la vitesse réelle du robot. Cela signifie que ces gains de contrôleur sont généralement indépendants du robot.

Note

Les gains de 2.0 et 0.7 pour b et zeta ont été testés à plusieurs reprises pour produire des résultats souhaitables lorsque toutes les unités étaient en mètres. En tant que tel, un constructeur qui ne passe aucun argument à RamseteController aura ses gains réglés par défaut à ces valeurs.

// Using the default constructor of RamseteController. Here
// the gains are initialized to 2.0 and 0.7.
RamseteController controller1 = new RamseteController();

// Using the secondary constructor of RamseteController where
// the user can choose any other gains.
RamseteController controller2 = new RamseteController(2.1, 0.8);

Obtention de vitesses ajustées

Le contrôleur Ramsete renvoie des «vitesses ajustées» de sorte que lorsque le robot respecte ces vitesses, il atteint avec précision le point cible. Le contrôleur doit être mis à jour périodiquement avec le nouvel objectif. Le point cible comprend une pose souhaitée, une vitesse linéaire souhaitée et une vitesse angulaire souhaitée. De plus, la position actuelle du robot doit également être mise à jour périodiquement. Le contrôleur utilise ces quatre arguments pour renvoyer la vitesse linéaire et angulaire ajustée. Les utilisateurs doivent commander leur robot à ces vitesses linéaires et angulaires pour obtenir un suivi de trajectoire optimal.

Note

La « pose d’objectif » (goal pose) représente la position à laquelle le robot doit se trouver à un moment particulier lors du suivi de la trajectoire. Il ne représente PAS le point final de la trajectoire.

Le contrôleur peut être actualisé à partir de la méthode Calculate (C++) / calculate (Java). Il existe deux surcharges (overloads) pour cette méthode. Ces deux surcharges acceptent la position actuelle du robot comme premier paramètre. Pour les autres paramètres, l’une de ces surcharges prend l’objectif comme trois paramètres distincts (pose, vitesse linéaire et vitesse angulaire) tandis que l’autre surcharge accepte un objet Trajectory.State, qui contient des informations sur la pose de l’objectif. Comme elle est plus facile d’utilisation, nous recommendons cette dernière méthode lors du suivi des trajectoires.

Trajectory.State goal = trajectory.sample(3.4); // sample the trajectory at 3.4 seconds from the beginning
ChassisSpeeds adjustedSpeeds = controller.calculate(currentRobotPose, goal);

Ces calculs doivent être effectués à chaque itération de boucle, avec une position et un objectif du robot mis à jour.

Utilisation des vitesses ajustées

Les vitesses ajustées sont de type ChassisSpeeds, qui contient un vx (vitesse linéaire dans la direction avant), un vy (vitesse linéaire dans la direction latérale) et un omega (vitesse angulaire autour du centre du châssis du robot). Étant donné que le contrôleur Ramsete est un contrôleur pour les robots non holonomiques (robots qui ne peuvent pas se déplacer latéralement), l’objet à vitesses ajustées a un vy de zéro.

Les vitesses ajustées renvoyées peuvent être converties en vitesses utilisables en utilisant les classes cinématiques pour votre type de transmission. Par exemple, les vitesses ajustées peuvent être converties en vitesses gauche et droite pour un entraînement différentiel à l’aide d’un objet DifferentialDriveKinematics.

ChassisSpeeds adjustedSpeeds = controller.calculate(currentRobotPose, goal);
DifferentialDriveWheelSpeeds wheelSpeeds = kinematics.toWheelSpeeds(adjustedSpeeds);
double left = wheelSpeeds.leftMetersPerSecond;
double right = wheelSpeeds.rightMetersPerSecond;

Étant donné que ces nouvelles vitesses gauche et droite sont toujours des vitesses et non des tensions, deux contrôleurs PID, un pour chaque côté, peuvent être utilisés pour suivre ces vitesses. Soit le PIDController WPILIb (C++, Java) peut être utilisé, ou alors la fonction Velocity PID sur des contrôleurs de moteurs intelligents tels que le TalonSRX et le SPARK MAX.

Ramsete dans un environnement basé sur les commandes (Command -based Framework)

Par souci de facilité pour les utilisateurs, une classe RamseteCommand est intégrée à WPILib. Pour un didacticiel complet sur la mise en œuvre d’un mode autonome qui suit une trajectoire précise à l’aide de RamseteCommand, voir Didacticiel sur la pratique des trajectoires.