自定义频率的调度功能
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};
frc2::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)