Funciones de Programación en Frecuencias Personalizadas

El método TimedRobot de addPeriodic() permite ejecutar métodos personalizados a una velocidad mayor que la actualización predeterminada TimedRobot (20 ms). Previamente, los equipos tenían que hacer un Notifier para ejecutar los controles de retroalimentación más seguido que con el periodo de bucle TimedRobot de 20 ms (Ejecutar TimedRobot más seguido no se recomienda). Ahora, los usuarios pueden ejecutar controladores de retroalimentación más a menudo que el bucle principal del robot, pero sincronizado con las funciones periódicas TimedRobot eliminando posibles problemas de seguridad.

El método addPeriodic() (Java) / AddPeriodic() (C++) toma una lambda (la función a ejecutar), junto con el periodo solicitado y un desplazamiento opcional de la hora común de inicio. El tercer argumento opcional es útil para programar una función en una timeslot diferente en relación con los otros métodos periódicos TimedRobot.

Nota

Las unidades para el período y el desplazamiento son segundos en Java. En C ++, la biblioteca de unidades se puede usar para especificar un período y un desplazamiento en cualquier unidad de tiempo.

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);
    }
  }
}

El método teleopPeriodic() en este ejemplo se ejecuta cada 20 ms, y la actualización del controlador se ejecuta cada 10 ms con un desfase de 5 ms desde que se ejecuta teleopPeriodic() para que sus franjas horarias no entren en conflicto (por ejemplo, teleopPeriodic() se ejecuta a 0 ms, 20 ms, 40 ms, etc.; el controlador se ejecuta a 5 ms, 15 ms, 25 ms, etc.).