Stack technique :
- WPILib (Java, command-based)
- DogLog + AdvantageScope : logs + télémétrie
- PathPlanner : autos
- PhotonVision / AprilTags (multi-caméras) → WPILib PoseEstimator (fusion de pose)
Objectif : robot prêt pour le shoot-on-the-move (balistique + latency), avec une séparation claire entre :
frc.lib/: librairie interne (logique avancée, testable, réutilisable d'années en années)frc.robot/: code robot (subsystems/commands simple, lisible, débuggable et tunable)
src/main/java/frc
├─ lib/ # librairie interne (black boxes réutilisables et wrappers)
│ ├─ logging/ # logging DogLog + helpers
│ │ └─ ExtendedLogger.java
│ ├─ logic/ # balistique, dynamique, visée (pur/testable)
│ │ ├─ BallisticSolver.java
│ │ ├─ ShooterAim.java
│ │ ├─ ShooterLogic.java
│ │ └─ ShooterTuning.java
│ ├─ robot/
│ │ ├─ Records.java
│ │ ├─ Config.java
│ │ └─ Tunables.java
│ └─ utils/ # filtres, maths, helpers
│ ├─ Filters.java
│ └─ MathUtils.java
└─ robot/ # code robot
├─ subsystems/ # moteurs/capteurs/PID + contrôle mécanismes
├─ commands/ # driver controls, séquences, automation
├─ RobotContainer.java
└─ Constants.java # paramètres par défaut des sous-systèmes
- WPILib installé pour la saison (outils Java)
- Cloner le repo
- Ouvrir avec WPILib VS Code
./gradlew build./gradlew javadoc
xdg-open build/docs/javadoc/index.htmlOn utilise DogLog comme API de logging (et ça s’affiche dans AdvantageScope et autres dashboards connectés aux Network Tables).
ExtendedLogger wrap DogLog et permet l’auto-logging via annotation.
Pattern :
- Tu mets
@ExtendedLogger.LoggableField(path="...")sur des fields - Tu appelles
ExtendedLogger.registerInstance(this)une fois (dans le constructeur) - Tu appelles
ExtendedLogger.run()une fois par loop (robotPeriodic)
Exemple minimal :
public final class ClimberSubsystem extends SubsystemBase {
@ExtendedLogger.LoggableField(path="Climber/cmdVolts")
private double cmdVolts = 0.0;
public ClimberSubsystem() {
ExtendedLogger.registerInstance(this);
}
@Override
public void periodic() {
// update ta variable...
}
}Dans Robot.robotPeriodic() :
@Override
public void robotPeriodic() {
Tunables.run(); // update des valeurs tunables (NetworkTables)
frc.lib.logging.ExtendedLogger.run(); // log DogLog (auto-logging)
CommandScheduler.getInstance().run();
}Dans AdvantageScope, tu verras tes clés comme :
Climber/cmdVoltsDriveState/PoseShooter/solver_msetc.
On a une couche simple pour tuner des valeurs en live via NetworkTables.
Toutes les valeurs tunables vont sous :
/Tuning/<key>
Ex: /Tuning/Drive/maxSpeed
Ex: /Tuning/Shooter/slipFactor
Ex: /Tuning/Climber/maxVolts
Tu mets l’annotation directement sur un field, et Tunables.run() s’occupe de le mettre à jour.
@Tunables.TunableNum(key="Climber/maxVolts", def=8.0, hz=5, clamp=true, min=0, max=12)
private double maxVolts = 8.0;
public ClimberSubsystem() {
Tunables.registerInstance(this);
}Dans n’importe quel dashboard qui voit NetworkTables :
- Shuffleboard
- AdvantageScope (onglet NetworkTables)
- Detections AprilTag via caméras (PhotonVision)
- Mesures compensées en latence
- Fusion dans un pose estimator WPILib
- Le shooter consomme ensuite une pose standardisée (pose + timestamp + confiance)
(Les détails d’implémentation viendront dans frc.lib.vision ou bien dans frc.robot.vision.)
ShooterAim.Loop aim = new ShooterAim.Loop(Constants.Shooter.defaultParams());
ShooterAim.AimResult out = aim.update(robotNow, actNow, targetXYZ, turretYawNowRad);
// out.cmd() -> setpoints turret/rpm/hood
// out.ok() -> autoriser feeder/indexerSi tu log un record, ExtendedLogger le “split” en sous-champs :
ShooterState/rpmShooterState/hoodDeg- etc.
- Aucun push direct sur
main - Travailler sur une branche, faire une PR, obtenir 1 approbation
Flow typique :
git checkout -b mon-changement
git add -p
git commit -m "description simple du changement"
git push -u origin mon-changementEnsuite : ouvrir une Pull Request sur GitHub.
src/main/java/frc/lib/**: review d'un mentor obligatoiresrc/main/java/frc/robot/**+src/main/deploy/**: mentor OU lead-programmerdocs/**: programmer (ou lead-programmer/mentor)
- Unités dans les noms :
Deg,Mps,Volts,Sec, etc. - Commentaires en français et code en anglais : Mieux pour la cohérence entre les librairies anglophones
- Records pour le data : utiliser
frc.lib.robot.Recordspour standardiser les échanges
Exemples :
hoodDegturretYawRelRadvxMps,omegaRadpstimestampSecbatteryVolts