自定义频率的调度功能

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)