Étape 4: Mise à jour de l’odométrie et visualisation de la position du robot

Maintenant que les positions, les vitesses et les angles du gyroscope simulés sont régulièrement mis à jour avec des informations précises, ces données peuvent être utilisées pour mettre à jour la pose du robot dans une boucle périodique (telle que la méthode periodic() dans un Subsystem). En simulation, la boucle périodique utilisera des lectures simulées d’encodeur et de gyroscope pour mettre à jour l’odométrie alors que sur le robot réel, le même code utilisera des lectures réelles provenant du matériel physique.

Note

Pour plus d’informations sur l’utilisation de l’odométrie, voir ce document.

Visualisation de la pose du robot

La pose du robot peut être visualisée sur l’interface graphique du simulateur (pendant la simulation) ou sur un tableau de bord tel que Glass (sur un vrai robot) en envoyant la pose d’odométrie sur un objet Field2d . Un Field2d peut être construit de manière triviale sans aucun argument de constructeur:

private Field2d m_field = new Field2d();
#include <frc/smartdashboard/Field2d.h>

..

frc::Field2d m_field;

Cette instance Field2d doit ensuite être envoyée via les NetworkTables. Le meilleur endroit pour faire cela est dans le constructeur de votre sous-système.

public Drivetrain() {
  ...
  SmartDashboard.putData("Field", m_field);
}
#include <frc/smartdashboard/SmartDashboard.h>

Drivetrain() {
  ...
  frc::SmartDashboard::PutData("Field", &m_field);
}

Note

L’instance Field2d peut également être envoyée en utilisant une API NetworkTables de niveau inférieur ou en utilisant l’API Shuffleboard.

Enfin, la pose de votre odométrie doit être mise à jour périodiquement dans l’objet Field2d. Rappelez-vous que cela devrait être une méthode générale periodic(), c’est-à-dire une méthode qui s’exécute à la fois pendant la simulation et pendant le fonctionnement réel du robot.

public void periodic() {
  ...
  // This will get the simulated sensor readings that we set
  // in the previous article while in simulation, but will use
  // real values on the robot itself.
  m_odometry.update(m_gyro.getRotation2d(),
                    m_leftEncoder.getDistance(),
                    m_rightEncoder.getDistance());
  m_field.setRobotPose(m_odometry.getPoseMeters());
}
void Periodic() {
  ...
  // This will get the simulated sensor readings that we set
  // in the previous article while in simulation, but will use
  // real values on the robot itself.
  m_odometry.Update(m_gyro.GetRotation2d(),
                    units::meter_t(m_leftEncoder.GetDistance()),
                    units::meter_t(m_rightEncoder.GetDistance()));
  m_field.SetRobotPose(m_odometry.GetPose());
}

Important

Il est important que ce code soit placé dans une méthode régulière periodic() - une méthode qui est appelée périodiquement quel que soit le mode de fonctionnement. Si vous utilisez la librairie basée sur les commandes, cette méthode existe déjà. Sinon, vous êtes responsable d’appeler cette méthode périodiquement à partir de la classe principale Robot.

Note

At this point we have covered all of the code changes required to run your code. You should head to the Simulation User Interface page for more info on how to run the simulation and the Field2d Widget page to add the field that your simulated robot will run on to the GUI.