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