Planification des Fonctions à des Fréquences Personnalisées

La méthode addPeriodic() de TimedRobot nous permettons d’exécuter des méthodes personnalisées à un rythme plus rapide que le taux de mise à jour périodique par défault de TimedRobot (20 ms). Précédemment, les équipes auraient dû créer un Notifier pour exécuter les contrôleurs de rétroaction plus souvent que la période de boucle de TimedRobot de 20 ms (Exécuter TimedRobot plus souvent que ça n’est pas conseillé). Maintenant, les utilisateurs peuvent exécuter les contrôleurs de rétroaction plus souvent que la boucle principale du robot, mais de manière synchrone avec les fonctions périodiques de TimedRobot, ce qui élimine les problèmes potentiels de sécurité des threads.

La méthode addPeriodic() (Java) / AddPeriodic() (C++) prend un lambda (la fonction à exécuter), ainsi que la période demandée et un offset optionnel à partir de l’heure de départ commune. La troisième argument optionnel est utile pour la planification d’une fonction dans un créneau horaire différent par rapport aux autre méthodes périodiques de TimedRobot.

Note

Les unités pour la période et le décalage sont les secondes en Java. En C++, la bibliothèque d’unités peut être utilisée pour spécifier une période et un décalage dans n’importe quelle unité de temps.

public class Robot extends TimedRobot {
    private Joystick m_joystick = new Joystick(0);
    private Encoder m_encoder = new Encoder(1, 2);
    private Spark m_motor = new Spark(1);
    private PIDController m_controller = new PIDController(1.0, 0.0, 0.5, 0.01);

    public Robot() {
        addPeriodic(() -> {
            m_motor.set(m_controller.calculate(m_encoder.getRate()));
        }, 0.01, 0.005);
    }

    @Override
    public teleopPeriodic() {
        if (m_joystick.getRawButtonPressed(1)) {
            if (m_controller.getSetpoint() == 0.0) {
                m_controller.setSetpoint(30.0);
            } else {
                m_controller.setSetpoint(0.0);
            }
        }
    }
  }
class Robot : public frc::TimedRobot {
 private:
  frc::Joystick m_joystick{0};
  frc::Encoder m_encoder{1, 2};
  frc::Spark m_motor{1};
  frc::PIDController m_controller{1.0, 0.0, 0.5, 10_ms};

  Robot();

  void TeleopPeriodic() override;
};
void Robot::Robot() {
  AddPeriodic([&] {
    m_motor.Set(m_controller.Calculate(m_encoder.GetRate()));
  }, 10_ms, 5_ms);
}

void Robot::TeleopPeriodic() {
  if (m_joystick.GetRawButtonPressed(1)) {
    if (m_controller.GetSetpoint() == 0.0) {
      m_controller.SetSetpoint(30.0);
    } else {
      m_controller.SetSetpoint(0.0);
    }
  }
}

La méthode teleopPeriodic() dans cet exemple s’exécute toutes les 20 ms, et la mise à jour du contrôleur est exécutée toutes les 10 ms avec un décalage de 5 ms à partir du moment où teleopPeriodic() s’exécute de sorte que leurs tranches de temps ne sont pas en conflit (par exemple, teleopPeriodic() fonctionne à 0 ms, 20 ms, 40 ms, etc.; le contrôleur fonctionne à 5 ms, 15 ms, 25 ms, etc.).