Odométrie avec l’entraînement de type Mécanum

Un utilisateur peut utiliser les classes de cinématique d’entraînement de Mecanum afin d’effectuer l” Odométrie. WPILib contient une classe MecanumDriveOdometry qui peut être utilisée pour suivre la position d’un robot avec entraînement Mécanum sur le terrain de jeu.

Note

Étant donné que cette méthode n’utilise que des encodeurs et un gyroscope, l’estimation de la position du robot sur le terrain de jeu dérivera avec le temps, d’autant plus que votre robot va entrer en contact avec des objets ou d’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 odométrie

La classe MecanumDriveOdometry nécessite deux arguments obligatoires et un argument facultatif. Les arguments obligatoires sont l’objet cinématique qui représente votre entraînement de mécanisme (sous la forme d’une classe MecanumDriveKinematics) et l’angle rapporté par votre gyroscope (en tant que Rotation2d). Le troisième 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)..

// Locations of the wheels relative to the robot center.
Translation2d m_frontLeftLocation = new Translation2d(0.381, 0.381);
Translation2d m_frontRightLocation = new Translation2d(0.381, -0.381);
Translation2d m_backLeftLocation = new Translation2d(-0.381, 0.381);
Translation2d m_backRightLocation = new Translation2d(-0.381, -0.381);

// Creating my kinematics object using the wheel locations.
MecanumDriveKinematics m_kinematics = new MecanumDriveKinematics(
  m_frontLeftLocation, m_frontRightLocation, m_backLeftLocation, m_backRightLocation
);

// Creating my odometry object from the kinematics 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.
MecanumDriveOdometry m_odometry = new MecanumDriveOdometry(m_kinematics,
  getGyroHeading(), new Pose2d(5.0, 13.5, new Rotation2d()));

Mise à jour de la pose du robot

La méthode update de la classe d’odométrie met à jour la position du robot sur le terrain. La méthode de mise à jour prend en compte l’angle gyroscopique du robot, ainsi qu’un objet MecanumDriveWheelSpeeds représentant la vitesse de chacune des 4 roues du robot. Cette méthode update 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 nouvelle pose mise à jour du robot.

Note

La classe MecanumDriveWheelSpeeds en Java doit être construite avec chaque vitesse de roue en mètres par seconde. En C++, la librairie d’unités doit être utilisée pour représenter la vitesse de vos roues.

@Override
public void periodic() {
  // Get my wheel speeds
  var wheelSpeeds = new MecanumDriveWheelSpeeds(
      m_frontLeftEncoder.getRate(), m_frontRightEncoder.getRate(),
      m_backLeftEncoder.getRate(), m_backRightEncoder.getRate());

  // 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, wheelSpeeds);
}

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 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.

Note

Un exemple complet d’un robot à entraînement mécanique 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.