Odométrie à entraînement différentiel

Un utilisateur peut utiliser les classes cinématiques d’entraînement différentiel afin d’effectuer l” Odométrie. WPILib contient une classe DifferentialDriveOdometry qui peut être utilisée pour détecter la position d’un robot avec entraînement différentiel sur le terrain.

Note

Étant donné que cette méthode utilise seulement que des encodeurs et un gyroscope, l’estimation de la position du robot sur le terrain va dévier avec le temps, surtout quand votre robot va entrer en contact avec des objets ou autres robots pendant le jeu. Cependant, l’odométrie est généralement très précise pendant la période autonome.

Création de l’objet Odometry

La classe DifferentialDriveOdometry nécessite un argument obligatoire et un argument facultatif. L’argument obligatoire est l’angle rapporté par votre gyroscope (comme un Rotation2d). L’argument optionnel est la pose de départ de votre robot sur le terrain (comme un Pose2d). Par défaut, le robot démarre à x = 0, y = 0, theta = 0.

Note

0 degrés / radians représente l’angle du robot lorsque le robot fait face directement à la station d’alliance de votre adversaire. Lorsque votre robot se tourne vers la gauche, l’angle de votre gyroscope devrait augmenter. Par défaut, les gyroscopes WPILib présentent le comportement opposé, vous devez donc compenser l’angle du gyroscope en le convertissant en une valeur négative (nouvel angle = 0 - angle gyro).

Important

Les positions de l’encodeur doivent être remises à zéro avant de construire la classe DifferentialDriveOdometry.

// Creating my odometry object. Here,
// our starting pose is 5 meters along the long end of the field and in the
// center of the field along the short end, facing forward.
DifferentialDriveOdometry m_odometry = new DifferentialDriveOdometry(
  getGyroHeading(), new Pose2d(5.0, 13.5, new Rotation2d()));

Mise à jour de Robot Pose

La méthode Update peut être utilisée pour mettre à jour la position du robot sur le terrain. Cette méthode doit être appelée périodiquement, de préférence dans la méthode periodic() du Sous-système. La méthode Update renvoie la toute dernière pose du robot. Cette méthode prend en compte l’angle gyroscopique du robot, ainsi que le compte (distance) de l’encodeur gauche et celui de l’encodeur droit.

Note

Les distances de l’encodeur en Java doivent être en mètres. En C++, la librairie d’unités peut être utilisée pour représenter la distance en utilisant n’importe quelle unité de distance linéaire. Si le robot avance en ligne droite, les deux distances (gauche et droite) doivent être positives. Faire les opérations mathématiques nécessaires pour y arriver.

@Override
public void periodic() {
  // Get my gyro angle. We are negating the value because gyros return positive
  // values as the robot turns clockwise. This is not standard convention that is
  // used by the WPILib classes.
  var gyroAngle = Rotation2d.fromDegrees(-m_gyro.getAngle());

  // Update the pose
  m_pose = m_odometry.update(gyroAngle, m_leftEncoder.getDistance(), m_rightEncoder.getDistance());
}

Réinitialisation de la pose de robot

La pose du robot peut être réinitialisée via la méthode resetPose. Cette méthode accepte deux arguments - la nouvelle pose relative au terrain de jeu et l’angle gyroscopique actuel.

Important

Si à tout moment, vous décidez de réinitialiser votre gyroscope, la méthode resetPose DOIT être appelée avec le nouvel angle gyroscopique. De plus, les encodeurs doivent également être remis à zéro lors de la réinitialisation de la pose.

Note

Un exemple complet d’un robot d’entraînement différentiel avec odométrie est disponible ici: C++ / Java.

De plus, les méthodes GetPose (C++) / getPoseMeters (Java) peuvent être utilisées pour récupérer la pose actuelle du robot sans mise à jour.