Paso 4: Actualización de la odometría y visualización de la posición del robot

Ahora que las posiciones simuladas del codificador, las velocidades y los ángulos del giroscopio se actualizan con información precisa periódicamente, estos datos pueden utilizarse para actualizar la posición del robot en un bucle periódico (como el método periodic() en un Subsistema). En la simulación, el bucle periódico utilizará lecturas simuladas del codificador y del giroscopio para actualizar la odometría, mientras que en el robot real, el mismo código utilizará lecturas reales del hardware físico.

Nota

Para más información sobre el uso de la odometría, ver este documento.

Visualización de la postura del robot

La pose del robot puede ser visualizada en el GUI del simulador (durante la simulación) o en un dashboard como Glass (en un robot real) enviando la pose de odometría sobre un objeto «Field2d». Un Campo2d puede ser construido trivialmente sin ningún argumento constructivo:

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

Esta instancia de Field2d debe enviarse a través de NetworkTables. El mejor lugar para hacer esto es en el constructor de su subsistema.

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

Nota

The Field2d instance can also be sent using a lower-level NetworkTables API or using the Shuffleboard API.

Finalmente, la posición de su odometría debe actualizarse periódicamente en el objeto Field2d. Recuerde que esto debe ser en un método general periodic(), es decir, uno que se ejecute tanto durante la simulación como durante la operación real del 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());
}

Importante

Es importante que este código se coloque en un método periodic() regular - uno que se llame periódicamente independientemente del modo de operación. Si está usando la biblioteca basada en comandos, este método ya existe. Si no, eres responsable de llamar a este método periódicamente desde la clase principal Robot.

Nota

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.