自定义频率的调度功能
TimedRobot的addPeriodic()方法允许用户以比默认TimedRobot定期更新速率(20毫秒)更快的速度运行自定义方法。 以前,团队必须制作一个通告程序,以比20毫秒的TimedRobot循环周期(不建议这样做更频繁地运行TimedRobot)更频繁地运行反馈控制器。 现在,用户可以比主机器人循环更频繁地运行反馈控制器,但可以与TimedRobot周期性功能同步运行,从而消除了潜在的线程安全问题。
addPeriodic() (Java)/ AddPeriodic()(C ++)方法采用lambda(运行功能),要求时间段以及对一个一般开始时间的可选偏移量。相对于其他TimedRobot周期性方法,可选的第三个参数对于在不同的时隙中调度函数很有用。
备注
在Java中,时间段和偏移量的单位是秒。 在C ++中,单位库可用于指定任何时间单位的时间段和偏移量。
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); } } }
在这个例子中,teleopPeriodic() 方法每20ms运行一次, 控制器每10ms运行一次。当teleopPeriodic() 运行时有5ms的偏移量以避免它们的时隙冲突。(比如teleopPeriodic()每0 ms,20 ms,40 ms运行一次;控制器每5ms,15ms,25ms)