Étape 3: Mise à jour du modèle de transmission

Maintenant que le modèle de transmission a été créé, il doit être mis à jour périodiquement avec les dernières commandes de tension du moteur. Il est recommandé de faire cette étape dans une méthode séparée simulationPeriodic() / SimulationPeriodic() dans votre sous-système et d’appeler cette méthode uniquement en simulation.

Note

Si vous utilisez le framework basé sur les commandes, chaque sous-système qui étend SubsystemBase possède un simulationPeriodic() / SimulationPeriodic() qui peut être remplacé. Cette méthode est exécutée automatiquement uniquement pendant la simulation. Si vous n’utilisez pas la librairie basée sur les commandes, assurez-vous d’appeler votre méthode de simulation dans la classe remplacée simulationPeriodic() / SimulationPeriodic() de la classe principale Robot. Ces méthodes périodiques sont également appelées automatiquement uniquement lors de la simulation.

La mise à jour du modèle comporte trois étapes principales:

  1. Définissez l’ entrée du modèle de transmission. Ce sont les tensions du moteur des deux côtés de la transmission.

  2. Avancez le modèle dans le temps du pas de temps périodique nominal (généralement 20 ms). Cela met à jour tous les états de la transmission (c’est-à-dire la pose, les positions de l’encodeur et les vitesses) comme si 20 ms s’étaient écoulés.

  3. Mettez à jour les capteurs simulés avec de nouvelles positions, vitesses et angles.

private PWMSparkMax m_leftMotor = new PWMSparkMax(0);
private PWMSparkMax m_rightMotor = new PWMSparkMax(1);

public Drivetrain() {
  ...
  m_leftEncoder.setDistancePerPulse(2 * Math.PI * kWheelRadius / kEncoderResolution);
  m_rightEncoder.setDistancePerPulse(2 * Math.PI * kWheelRadius / kEncoderResolution);
}

public void simulationPeriodic() {
  // Set the inputs to the system. Note that we need to convert
  // the [-1, 1] PWM signal to voltage by multiplying it by the
  // robot controller voltage.
  m_driveSim.setInputs(m_leftMotor.get() * RobotController.getInputVoltage(),
                       m_rightMotor.get() * RobotController.getInputVoltage());

  // Advance the model by 20 ms. Note that if you are running this
  // subsystem in a separate thread or have changed the nominal timestep
  // of TimedRobot, this value needs to match it.
  m_driveSim.update(0.02);

  // Update all of our sensors.
  m_leftEncoderSim.setDistance(m_driveSim.getLeftPositionMeters());
  m_leftEncoderSim.setRate(m_driveSim.getLeftVelocityMetersPerSecond());
  m_rightEncoderSim.setDistance(m_driveSim.getRightPositionMeters());
  m_rightEncoderSim.setRate(m_driveSim.getRightVelocityMetersPerSecond());
  m_gyroSim.setAngle(-m_driveSim.getHeading().getDegrees());
}

Important

Si le côté droit de votre transmission est inversé, vous DEVEZ inverser le signe de la tension dans l’appel SetInputs() pour vous assurer que les tensions positives correspondent au mouvement vers l’avant.

Important

Étant donné que le modèle de simulateur de transmission renvoie respectivement les positions et les vitesses en mètres et en m / s, celles-ci doivent être converties en ticks d’encodeur lors de l’appel de SetDistance() et SetRate(). Alternativement, vous pouvez configurer SetDistancePerPulse sur les encodeurs pour que l’objet Encoder s’en charge automatiquement - c’est l’approche qui est adoptée dans l’exemple ci-dessus.

Maintenant que les positions, les vitesses et les angles du gyroscope simulés ont été définis, vous pouvez appeler m_leftEncoder.GetDistance(), etc. dans le code de votre robot comme d’habitude et il se comportera exactement comme il le ferait sur un vrai robot. Cela implique d’effectuer des calculs d’odométrie, des boucles de rétroaction PID de vitesse pour le suivi de trajectoire, etc.