Compare commits

..

45 Commits

Author SHA1 Message Date
4ecaef3d1d big stuff 2026-04-22 10:21:28 -04:00
f7e88619e9 limelight 2026-03-30 05:04:22 +02:00
5c626f33e3 test 2026-03-29 23:30:52 +02:00
samuel desharnais
673a7fcb82 vgft 2026-03-28 20:50:33 -04:00
samuel desharnais
755d79aa18 oui 2026-03-28 16:01:40 -04:00
samuel desharnais
799e3e34c3 m 2026-03-28 15:53:53 -04:00
samuel desharnais
fbd94fc33d Merge branch 'main' of https://git.demerso.net/sdesharnais/Rebuilt-2026 2026-03-28 14:42:07 -04:00
samuel desharnais
9e3bd6e7d3 bngvthf 2026-03-28 14:41:49 -04:00
Antoine PerreaultE
bd853dfc79 lanceur 2026-03-28 14:35:18 -04:00
Antoine PerreaultE
cb3104152c voltage et allaince 2026-03-28 13:51:22 -04:00
Antoine PerreaultE
85da1dcad1 Merge branch 'main' of https://git.demerso.net/sdesharnais/Rebuilt-2026 2026-03-28 13:21:35 -04:00
Antoine PerreaultE
a92a7a0ea1 pigeon 2026-03-28 13:21:30 -04:00
samuel desharnais
ba57959f4d debug samedi 2026-03-28 13:20:52 -04:00
samuel desharnais
79568a58b9 debug de jeudi 2026-03-28 09:16:33 -04:00
samuel desharnais
57fa3597e2 debug de jeudi 2026-03-28 09:16:22 -04:00
Antoine PerreaultE
5ba5cce953 Merge branch 'main' of https://git.demerso.net/sdesharnais/Rebuilt-2026 2026-03-26 17:49:01 -04:00
Antoine PerreaultE
d0c50cbd6e mode auto pls marche pls 2026-03-26 17:46:22 -04:00
samuel desharnais
0492c9a2c6 mettre en 2026 2026-03-26 17:45:25 -04:00
Antoine PerreaultE
69fe4a58d0 e 2026-03-25 18:26:48 -04:00
Antoine PerreaultE
92b876e7b0 angle 2026-03-25 18:09:31 -04:00
Antoine PerreaultE
22746ab8ca tourner a zero/180 regle 2026-03-24 20:28:03 -04:00
Antoine PerreaultE
70b796e99a Merge branch 'main' of https://git.demerso.net/sdesharnais/Rebuilt-2026 2026-03-24 20:20:05 -04:00
Antoine PerreaultE
083288d3fc oui 2026-03-24 20:20:02 -04:00
samuel desharnais
b83e689b97 enlever les deux tourner 2026-03-24 20:00:16 -04:00
samuel desharnais
33fd6ceb23 tourner selon l'équipe 2026-03-24 19:59:14 -04:00
Antoine PerreaultE
36a6bf2ab0 grimper regle par side 2026-03-24 19:39:38 -04:00
Antoine PerreaultE
9249751f2b simgui 2026-03-24 19:05:10 -04:00
Antoine PerreaultE
2c0bab873c settings pathplanner 2026-03-24 18:53:04 -04:00
Antoine PerreaultE
2e7f9a6aa9 path 2026-03-24 18:16:33 -04:00
samuel desharnais
7f0f957ad1 led selon distance 2026-03-24 18:02:23 -04:00
samuel desharnais
7d2b2ea139 mode auto 2026-03-24 17:52:09 -04:00
samuel desharnais
a7fb3108ea debug de samedi 2026-03-21 16:11:24 -04:00
samuel desharnais
e0c1e26933 Merge branch 'main' of https://git.demerso.net/sdesharnais/Rebuilt-2026 2026-03-17 18:43:09 -04:00
samuel desharnais
97387630aa lanceur 2026-03-17 18:42:24 -04:00
Antoine PerreaultE
bd79b249e9 Merge branch 'main' of https://git.demerso.net/sdesharnais/Rebuilt-2026 2026-03-17 18:27:12 -04:00
Antoine PerreaultE
e919daab88 Sysid 2026-03-17 18:26:28 -04:00
samuel desharnais
873095e865 Merge branch 'main' of https://git.demerso.net/sdesharnais/Rebuilt-2026 2026-03-10 20:39:20 -04:00
samuel desharnais
a142290bd5 balayeuse fait 2026-03-10 20:39:18 -04:00
Antoine PerreaultE
d73da286ed Merge branch 'main' of https://git.demerso.net/sdesharnais/Rebuilt-2026 2026-03-10 20:38:23 -04:00
Antoine PerreaultE
e42464b1d6 Commandes auto sauf 2 2026-03-10 20:38:21 -04:00
samuel desharnais
d04817a197 Merge branch 'main' of https://git.demerso.net/sdesharnais/Rebuilt-2026 2026-03-10 18:58:38 -04:00
samuel desharnais
a45e81349a pivot balayeuse et grimpeur fait 2026-03-10 18:58:34 -04:00
Antoine PerreaultE
d1f4e11cfb drivetrain + autoBuilder/chooser + tournerAZero/180 2026-03-10 18:52:29 -04:00
Antoine PerreaultE
c0a2c67261 Merge branch 'main' of https://git.demerso.net/sdesharnais/Rebuilt-2026 2026-03-10 18:27:49 -04:00
Antoine PerreaultE
d81ff3db3d Lanceur re/gle/ 2026-03-10 18:27:47 -04:00
58 changed files with 1735 additions and 1679 deletions

View File

@@ -56,5 +56,6 @@
"edu.wpi.first.math.proto.*", "edu.wpi.first.math.proto.*",
"edu.wpi.first.math.**.proto.*", "edu.wpi.first.math.**.proto.*",
"edu.wpi.first.math.**.struct.*", "edu.wpi.first.math.**.struct.*",
] ],
"java.dependency.enableDependencyCheckup": false
} }

View File

@@ -1,6 +1,6 @@
{ {
"enableCppIntellisense": false, "enableCppIntellisense": false,
"currentLanguage": "java", "currentLanguage": "java",
"projectYear": "2025", "projectYear": "2026",
"teamNumber": 5618 "teamNumber": 5618
} }

View File

@@ -1,4 +1,4 @@
Copyright (c) 2009-2024 FIRST and other WPILib contributors Copyright (c) 2009-2026 FIRST and other WPILib contributors
All rights reserved. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without

View File

@@ -1,6 +1,6 @@
plugins { plugins {
id "java" id "java"
id "edu.wpi.first.GradleRIO" version "2025.3.2" id "edu.wpi.first.GradleRIO" version "2026.2.1"
} }
java { java {
@@ -33,7 +33,7 @@ deploy {
frcStaticFileDeploy(getArtifactTypeClass('FileTreeArtifact')) { frcStaticFileDeploy(getArtifactTypeClass('FileTreeArtifact')) {
files = project.fileTree('src/main/deploy') files = project.fileTree('src/main/deploy')
directory = '/home/lvuser/deploy' directory = '/home/lvuser/deploy'
deleteOldFiles = false // Change to true to delete files on roboRIO that no deleteOldFiles = true // Change to true to delete files on roboRIO that no
// longer exist in deploy directory of this project // longer exist in deploy directory of this project
} }
} }
@@ -43,7 +43,8 @@ deploy {
def deployArtifact = deploy.targets.roborio.artifacts.frcJava def deployArtifact = deploy.targets.roborio.artifacts.frcJava
// Set to true to use debug for JNI. // Set to true to use debug for all targets including JNI, which will drastically impact
// performance.
wpi.java.debugJni = false wpi.java.debugJni = false
// Set this to true to enable desktop support. // Set this to true to enable desktop support.
@@ -88,7 +89,9 @@ wpi.sim.addDriverstation()
// knows where to look for our Robot Class. // knows where to look for our Robot Class.
jar { jar {
from { configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) } } from { configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) } }
from sourceSets.main.allSource from('src') { into 'backup/src' }
from('vendordeps') { into 'backup/vendordeps' }
from('build.gradle') { into 'backup' }
manifest edu.wpi.first.gradlerio.GradleRIOPlugin.javaManifest(ROBOT_MAIN_CLASS) manifest edu.wpi.first.gradlerio.GradleRIOPlugin.javaManifest(ROBOT_MAIN_CLASS)
duplicatesStrategy = DuplicatesStrategy.INCLUDE duplicatesStrategy = DuplicatesStrategy.INCLUDE
} }

View File

@@ -4,7 +4,7 @@ pluginManagement {
repositories { repositories {
mavenLocal() mavenLocal()
gradlePluginPortal() gradlePluginPortal()
String frcYear = '2025' String frcYear = '2026'
File frcHome File frcHome
if (OperatingSystem.current().isWindows()) { if (OperatingSystem.current().isWindows()) {
String publicFolder = System.getenv('PUBLIC') String publicFolder = System.getenv('PUBLIC')

View File

@@ -0,0 +1,31 @@
{
"version": "2025.0",
"command": {
"type": "sequential",
"data": {
"commands": [
{
"type": "path",
"data": {
"pathName": "TirerSimple"
}
},
{
"type": "named",
"data": {
"name": "DescendreBalayeuse"
}
},
{
"type": "named",
"data": {
"name": "Lancer"
}
}
]
}
},
"resetOdom": true,
"folder": null,
"choreoAuto": false
}

View File

@@ -4,6 +4,12 @@
"type": "sequential", "type": "sequential",
"data": { "data": {
"commands": [ "commands": [
{
"type": "named",
"data": {
"name": "DescendreBalayeuse"
}
},
{ {
"type": "deadline", "type": "deadline",
"data": { "data": {
@@ -14,12 +20,6 @@
"pathName": "Depot" "pathName": "Depot"
} }
}, },
{
"type": "named",
"data": {
"name": "DescendreBalayeuse"
}
},
{ {
"type": "named", "type": "named",
"data": { "data": {

View File

@@ -4,6 +4,12 @@
"type": "sequential", "type": "sequential",
"data": { "data": {
"commands": [ "commands": [
{
"type": "named",
"data": {
"name": "DescendreBalayeuse"
}
},
{ {
"type": "deadline", "type": "deadline",
"data": { "data": {
@@ -14,12 +20,6 @@
"pathName": "Depot" "pathName": "Depot"
} }
}, },
{
"type": "named",
"data": {
"name": "DescendreBalayeuse"
}
},
{ {
"type": "named", "type": "named",
"data": { "data": {

View File

@@ -4,6 +4,12 @@
"type": "sequential", "type": "sequential",
"data": { "data": {
"commands": [ "commands": [
{
"type": "named",
"data": {
"name": "DescendreBalayeuse"
}
},
{ {
"type": "deadline", "type": "deadline",
"data": { "data": {
@@ -14,12 +20,6 @@
"pathName": "Depot" "pathName": "Depot"
} }
}, },
{
"type": "named",
"data": {
"name": "DescendreBalayeuse"
}
},
{ {
"type": "named", "type": "named",
"data": { "data": {

View File

@@ -4,6 +4,12 @@
"type": "sequential", "type": "sequential",
"data": { "data": {
"commands": [ "commands": [
{
"type": "named",
"data": {
"name": "DescendreBalayeuse"
}
},
{ {
"type": "deadline", "type": "deadline",
"data": { "data": {
@@ -14,12 +20,6 @@
"pathName": "ChercherMilieuDroite" "pathName": "ChercherMilieuDroite"
} }
}, },
{
"type": "named",
"data": {
"name": "DescendreBalayeuse"
}
},
{ {
"type": "named", "type": "named",
"data": { "data": {

View File

@@ -4,6 +4,12 @@
"type": "sequential", "type": "sequential",
"data": { "data": {
"commands": [ "commands": [
{
"type": "named",
"data": {
"name": "DescendreBalayeuse"
}
},
{ {
"type": "deadline", "type": "deadline",
"data": { "data": {
@@ -14,12 +20,6 @@
"pathName": "ChercherMilieuDroiteProche" "pathName": "ChercherMilieuDroiteProche"
} }
}, },
{
"type": "named",
"data": {
"name": "DescendreBalayeuse"
}
},
{ {
"type": "named", "type": "named",
"data": { "data": {

View File

@@ -4,6 +4,12 @@
"type": "sequential", "type": "sequential",
"data": { "data": {
"commands": [ "commands": [
{
"type": "named",
"data": {
"name": "DescendreBalayeuse"
}
},
{ {
"type": "deadline", "type": "deadline",
"data": { "data": {
@@ -14,12 +20,6 @@
"pathName": "ChercherMilieuGauche" "pathName": "ChercherMilieuGauche"
} }
}, },
{
"type": "named",
"data": {
"name": "DescendreBalayeuse"
}
},
{ {
"type": "named", "type": "named",
"data": { "data": {

View File

@@ -4,6 +4,12 @@
"type": "sequential", "type": "sequential",
"data": { "data": {
"commands": [ "commands": [
{
"type": "named",
"data": {
"name": "DescendreBalayeuse"
}
},
{ {
"type": "deadline", "type": "deadline",
"data": { "data": {
@@ -14,12 +20,6 @@
"pathName": "ChercherMilieuGaucheProche" "pathName": "ChercherMilieuGaucheProche"
} }
}, },
{
"type": "named",
"data": {
"name": "DescendreBalayeuse"
}
},
{ {
"type": "named", "type": "named",
"data": { "data": {

View File

@@ -10,6 +10,12 @@
"pathName": "TirerSimple" "pathName": "TirerSimple"
} }
}, },
{
"type": "named",
"data": {
"name": "DescendreBalayeuse"
}
},
{ {
"type": "named", "type": "named",
"data": { "data": {

View File

@@ -3,12 +3,12 @@
"waypoints": [ "waypoints": [
{ {
"anchor": { "anchor": {
"x": 3.5732667617689007, "x": 3.6120827389443653,
"y": 5.917574893009986 "y": 5.917574893009986
}, },
"prevControl": null, "prevControl": null,
"nextControl": { "nextControl": {
"x": 2.266462196861626, "x": 2.3052781740370905,
"y": 5.904636233951498 "y": 5.904636233951498
}, },
"isLocked": false, "isLocked": false,
@@ -16,11 +16,11 @@
}, },
{ {
"anchor": { "anchor": {
"x": 1.1796148359486442, "x": 0.4938659058487873,
"y": 5.917574893009986 "y": 5.917574893009986
}, },
"prevControl": { "prevControl": {
"x": 1.7230385164051354, "x": 1.0372895863052785,
"y": 5.930513552068473 "y": 5.930513552068473
}, },
"nextControl": null, "nextControl": null,

View File

@@ -3,13 +3,13 @@
"waypoints": [ "waypoints": [
{ {
"anchor": { "anchor": {
"x": 1.1796148359486442, "x": 0.5197432239657629,
"y": 5.917574893009986 "y": 5.930513552068473
}, },
"prevControl": null, "prevControl": null,
"nextControl": { "nextControl": {
"x": 2.3570328102710407, "x": 1.6971611982881594,
"y": 5.982268188302426 "y": 5.995206847360913
}, },
"isLocked": false, "isLocked": false,
"linkedName": null "linkedName": null
@@ -30,7 +30,7 @@
], ],
"rotationTargets": [ "rotationTargets": [
{ {
"waypointRelativePos": 0.2179128348660559, "waypointRelativePos": 0.3240938166311289,
"rotationDegrees": 180.0 "rotationDegrees": 180.0
} }
], ],

View File

@@ -3,12 +3,12 @@
"waypoints": [ "waypoints": [
{ {
"anchor": { "anchor": {
"x": 3.5473894436519258, "x": 3.602,
"y": 4.015592011412268 "y": 4.015592011412268
}, },
"prevControl": null, "prevControl": null,
"nextControl": { "nextControl": {
"x": 2.494897544356074, "x": 2.549508100704148,
"y": 4.011425161481168 "y": 4.011425161481168
}, },
"isLocked": false, "isLocked": false,
@@ -16,12 +16,12 @@
}, },
{ {
"anchor": { "anchor": {
"x": 1.7359771754636228, "x": 1.643730569948188,
"y": 4.015592011412268 "y": 4.015592011412268
}, },
"prevControl": { "prevControl": {
"x": 2.627549770741877, "x": 2.5679620034542325,
"y": 4.02839075681212 "y": 4.011502590673576
}, },
"nextControl": null, "nextControl": null,
"isLocked": false, "isLocked": false,
@@ -33,7 +33,7 @@
"pointTowardsZones": [], "pointTowardsZones": [],
"eventMarkers": [], "eventMarkers": [],
"globalConstraints": { "globalConstraints": {
"maxVelocity": 3.0, "maxVelocity": 5.0,
"maxAcceleration": 3.0, "maxAcceleration": 3.0,
"maxAngularVelocity": 540.0, "maxAngularVelocity": 540.0,
"maxAngularAcceleration": 720.0, "maxAngularAcceleration": 720.0,
@@ -50,5 +50,5 @@
"velocity": 0, "velocity": 0,
"rotation": 0.0 "rotation": 0.0
}, },
"useDefaultConstraints": true "useDefaultConstraints": false
} }

View File

@@ -1,6 +1,6 @@
{ {
"robotWidth": 0.9, "robotWidth": 0.83,
"robotLength": 0.9, "robotLength": 0.87,
"holonomicMode": true, "holonomicMode": true,
"pathFolders": [ "pathFolders": [
"Milieu" "Milieu"
@@ -13,23 +13,23 @@
"defaultMaxAngVel": 540.0, "defaultMaxAngVel": 540.0,
"defaultMaxAngAccel": 720.0, "defaultMaxAngAccel": 720.0,
"defaultNominalVoltage": 12.0, "defaultNominalVoltage": 12.0,
"robotMass": 74.088, "robotMass": 51.673,
"robotMOI": 6.883, "robotMOI": 6.883,
"robotTrackwidth": 0.546, "robotTrackwidth": 0.546,
"driveWheelRadius": 0.048, "driveWheelRadius": 0.051,
"driveGearing": 5.143, "driveGearing": 6.2,
"maxDriveSpeed": 5.45, "maxDriveSpeed": 9.82,
"driveMotorType": "krakenX60", "driveMotorType": "krakenX60",
"driveCurrentLimit": 60.0, "driveCurrentLimit": 120.0,
"wheelCOF": 1.2, "wheelCOF": 1.2,
"flModuleX": 0.273, "flModuleX": 0.288925,
"flModuleY": 0.273, "flModuleY": 0.269875,
"frModuleX": 0.273, "frModuleX": 0.288925,
"frModuleY": -0.273, "frModuleY": -0.27,
"blModuleX": -0.273, "blModuleX": -0.288925,
"blModuleY": 0.273, "blModuleY": 0.269875,
"brModuleX": -0.273, "brModuleX": -0.288925,
"brModuleY": -0.273, "brModuleY": -0.27,
"bumperOffsetX": 0.0, "bumperOffsetX": 0.0,
"bumperOffsetY": 0.0, "bumperOffsetY": 0.0,
"robotFeatures": [] "robotFeatures": []

View File

@@ -0,0 +1,67 @@
package frc.robot;
import java.util.function.Supplier;
import edu.wpi.first.wpilibj2.command.Command;
import edu.wpi.first.wpilibj2.command.Commands;
import frc.robot.subsystems.Balayeuse;
import frc.robot.subsystems.CommandSwerveDrivetrain;
import frc.robot.subsystems.Demeleur;
import frc.robot.subsystems.Grimpeur;
import frc.robot.subsystems.Lanceur;
import frc.robot.subsystems.PivotBalayeuse;
public class Commandes {
private final CommandSwerveDrivetrain drivetrain;
private final Lanceur lanceur;
private final Demeleur demeleur;
private final Balayeuse balayeuse;
private final Grimpeur grimpeur;
private final PivotBalayeuse pivotBalayeuse;
public Commandes(CommandSwerveDrivetrain drivetrain,
Lanceur lanceur,
Demeleur demeleur,
Balayeuse balayeuse,
Grimpeur grimpeur,
PivotBalayeuse pivotBalayeuse) {
this.drivetrain = drivetrain;
this.lanceur = lanceur;
this.demeleur = demeleur;
this.balayeuse = balayeuse;
this.grimpeur = grimpeur;
this.pivotBalayeuse = pivotBalayeuse;
}
public double vitesseLanceur() {
return Coordinates.diffFromHub(drivetrain.getState().Pose.getTranslation()).getNorm() * 410.57 + 2250;
}
public Command viserLancer() {
return viserLancer(() -> 0.0, () -> 0.0);
}
public Command viserLancer(Supplier<Double> vitesseX, Supplier<Double> vitesseY) {
return Commands.parallel(
drivetrain.viserReservoir(vitesseX, vitesseY),
this.lancer());
}
public Command lancer() {
return lancer(this::vitesseLanceur);
}
public Command lancer(Supplier<Double> vitesse) {
return Commands.parallel(
lanceur.lancer(vitesse),
Commands.waitUntil(lanceur::setPointAtteint).andThen(demeleur.run()));
}
public Command lancerAspirer() {
return Commands.parallel(
this.lancer(),
balayeuse.aspirer());
}
}

View File

@@ -0,0 +1,41 @@
package frc.robot;
import static edu.wpi.first.units.Units.Meters;
import edu.wpi.first.math.geometry.Translation2d;
import edu.wpi.first.wpilibj.DriverStation;
import edu.wpi.first.wpilibj.DriverStation.Alliance;
public final class Coordinates {
public static final Translation2d kRedHub = new Translation2d(Meters.of(16.5 - 4.6), Meters.of(4.03));
public static final Translation2d kBlueHub = new Translation2d(Meters.of(4.6), Meters.of(4.03));
public static final Translation2d kGrimpeDepotRouge = new Translation2d(Meters.of(16.5 - 1.1), Meters.of(4.9));
public static final Translation2d kGrimpeMurRouge = new Translation2d(Meters.of(16.5 - 1.1), Meters.of(3.7));
public static final Translation2d kGrimpeDepotBleu = new Translation2d(Meters.of(1.1), Meters.of(3.1));
public static final Translation2d kGrimpeMurBleu = new Translation2d(Meters.of(1.1), Meters.of(4.4));
public static Translation2d diffFromHub(Translation2d robotTranslation) {
if (DriverStation.getAlliance().orElse(Alliance.Blue) == Alliance.Blue) {
return kBlueHub.minus(robotTranslation);
} else {
return kRedHub.minus(robotTranslation);
}
}
public static Translation2d diffFromGrimpeMur(Translation2d robotTranslation) {
if (DriverStation.getAlliance().orElse(Alliance.Blue) == Alliance.Blue) {
return kGrimpeMurBleu.minus(robotTranslation);
} else {
return kGrimpeMurRouge.minus(robotTranslation);
}
}
public static Translation2d diffFromGrimpeDepot(Translation2d robotTranslation) {
if (DriverStation.getAlliance().orElse(Alliance.Blue) == Alliance.Blue) {
return kGrimpeDepotBleu.minus(robotTranslation);
} else {
return kGrimpeDepotRouge.minus(robotTranslation);
}
}
}

View File

@@ -0,0 +1,75 @@
// Copyright (c) FIRST and other WPILib contributors.
// Open Source Software; you can modify and/or share it under the terms of
// the WPILib BSD license file in the root directory of this project.
package frc.robot;
import edu.wpi.first.net.PortForwarder;
import edu.wpi.first.networktables.NetworkTable;
import edu.wpi.first.networktables.NetworkTableEntry;
import edu.wpi.first.networktables.NetworkTableInstance;
public class LimeLight3 {
NetworkTable table = NetworkTableInstance.getDefault().getTable("limelight-balaie");
NetworkTableEntry pipeline = table.getEntry("pipeline");
/** Creates a new LimeLight3. */
public LimeLight3() {
for (int port = 5800; port <= 5807; port++) {
PortForwarder.add(port, "limelight.local", port);
}
}
public double[] getBotPoseBlue() {
NetworkTable limelightTable = NetworkTableInstance.getDefault().getTable("limelight-balaie");
NetworkTableEntry BotPoseEntry = limelightTable.getEntry("botpose_orb_wpiblue");
double[] BotPose = BotPoseEntry.getDoubleArray(new double[7]);
return BotPose;
}
public double[] getBotPoseRed() {
NetworkTable limelightTable = NetworkTableInstance.getDefault().getTable("limelight-balaie");
NetworkTableEntry BotPoseEntry = limelightTable.getEntry("botpose_orb_wpired");
double[] BotPose = BotPoseEntry.getDoubleArray(new double[7]);
return BotPose;
}
public double getTx() {
NetworkTable table = NetworkTableInstance.getDefault().getTable("limelight-balaie");
NetworkTableEntry tx = table.getEntry("tx");
return tx.getDouble(0.0);
}
public double getTId() {
NetworkTable table = NetworkTableInstance.getDefault().getTable("limelight-balaie");
NetworkTableEntry tid = table.getEntry("tid");
return tid.getDouble(0.0);
}
public double getTA() {
NetworkTable table = NetworkTableInstance.getDefault().getTable("limelight-balaie");
NetworkTableEntry ta = table.getEntry("ta");
return ta.getDouble(0.0);
}
public boolean getV() {
return LimelightHelpers.getTV("limelight-balaie");
}
public void AprilTag() {
pipeline.setNumber(0);
}
public void Forme() {
pipeline.setNumber(1);
}
public double Calcule(double x1, double x2, double y1, double y2, double angle) {
if (x1 > 4) {
return (Math.abs(Math.atan2(x2 - x1, y2 - y1)) * (180 / Math.PI) - angle) / 90;
} else {
return (Math.abs(Math.atan2(x2 - x1, y2 - y1)) * (180 / Math.PI) + angle) * -1 / 90;
}
}
}

View File

@@ -0,0 +1,74 @@
// Copyright (c) FIRST and other WPILib contributors.
// Open Source Software; you can modify and/or share it under the terms of
// the WPILib BSD license file in the root directory of this project.
package frc.robot;
import edu.wpi.first.net.PortForwarder;
import edu.wpi.first.networktables.NetworkTable;
import edu.wpi.first.networktables.NetworkTableEntry;
import edu.wpi.first.networktables.NetworkTableInstance;
public class Limelight3G {
NetworkTable table = NetworkTableInstance.getDefault().getTable("limelight-tag");
NetworkTableEntry pipeline = table.getEntry("pipeline");
/** Creates a new LimeLight3. */
public Limelight3G() {
for (int port = 5800; port <= 5807; port++) {
PortForwarder.add(port, "limelight.local", port);
}
}
public double[] getBotPoseBlue() {
NetworkTable limelightTable = NetworkTableInstance.getDefault().getTable("limelight-tag");
NetworkTableEntry BotPoseEntry = limelightTable.getEntry("botpose_wpiblue");
double[] BotPose = BotPoseEntry.getDoubleArray(new double[7]);
return BotPose;
}
public double[] getBotPoseRed() {
NetworkTable limelightTable = NetworkTableInstance.getDefault().getTable("limelight-tag");
NetworkTableEntry BotPoseEntry = limelightTable.getEntry("botpose_wpired");
double[] BotPose = BotPoseEntry.getDoubleArray(new double[7]);
return BotPose;
}
public double getTx() {
NetworkTable table = NetworkTableInstance.getDefault().getTable("limelight-tag");
NetworkTableEntry tx = table.getEntry("tx");
return tx.getDouble(0.0);
}
public double getTId() {
NetworkTable table = NetworkTableInstance.getDefault().getTable("limelight-tag");
NetworkTableEntry tid = table.getEntry("tid");
return tid.getDouble(0.0);
}
public double getTA() {
NetworkTable table = NetworkTableInstance.getDefault().getTable("limelight-tag");
NetworkTableEntry ta = table.getEntry("ta");
return ta.getDouble(0.0);
}
public boolean getV() {
return LimelightHelpers.getTV("limelight-tag");
}
public double Calcule(double x1, double x2, double y1, double y2, double angle) {
if (x1 > x2) {
if (y1 > y2) {
return Math.atan(90 - ((x2 - x1) / (y2 - y1))) * (180 / Math.PI) - angle;
} else {
return Math.atan((x2 - x1) / (y2 - y1)) * (180 / Math.PI) + 90 - angle;
}
} else {
if (y1 > y2) {
return Math.atan(90 - ((x2 - x1) / (y2 - y1))) * (180 / Math.PI) + 270 - angle;
} else {
return Math.atan((x2 - x1) / (y2 - y1)) * (180 / Math.PI) + 180 - angle;
}
}
}
}

View File

@@ -4,6 +4,8 @@
package frc.robot; package frc.robot;
import edu.wpi.first.math.VecBuilder;
import edu.wpi.first.math.util.Units;
import edu.wpi.first.wpilibj.TimedRobot; import edu.wpi.first.wpilibj.TimedRobot;
import edu.wpi.first.wpilibj2.command.Command; import edu.wpi.first.wpilibj2.command.Command;
import edu.wpi.first.wpilibj2.command.CommandScheduler; import edu.wpi.first.wpilibj2.command.CommandScheduler;
@@ -20,16 +22,34 @@ public class Robot extends TimedRobot {
@Override @Override
public void robotPeriodic() { public void robotPeriodic() {
CommandScheduler.getInstance().run(); CommandScheduler.getInstance().run();
var driveState = m_robotContainer.drivetrain.getState();
double headingDeg = driveState.Pose.getRotation().getDegrees();
double omegaRps = Units.radiansToRotations(driveState.Speeds.omegaRadiansPerSecond);
LimelightHelpers.SetRobotOrientation("limelight_tag", headingDeg, 0, 0, 0, 0, 0);
var llMeasurement = LimelightHelpers.getBotPoseEstimate_wpiBlue_MegaTag2("limelight_tag");
var stdDevs = LimelightHelpers.getLimelightDoubleArrayEntry("limelight_tag", "stddevs");
var limelightStdDevs = VecBuilder.fill(.5, .5, 9999999);
if (stdDevs.exists()) {
limelightStdDevs = VecBuilder.fill(stdDevs.get()[6], stdDevs.get()[7], stdDevs.get()[12]);
}
if (llMeasurement != null && llMeasurement.tagCount > 0 && Math.abs(omegaRps) < 2.0) {
m_robotContainer.drivetrain.addVisionMeasurement(llMeasurement.pose, llMeasurement.timestampSeconds,
limelightStdDevs);
}
} }
@Override @Override
public void disabledInit() {} public void disabledInit() {
}
@Override @Override
public void disabledPeriodic() {} public void disabledPeriodic() {
}
@Override @Override
public void disabledExit() {} public void disabledExit() {
}
@Override @Override
public void autonomousInit() { public void autonomousInit() {
@@ -41,10 +61,12 @@ public class Robot extends TimedRobot {
} }
@Override @Override
public void autonomousPeriodic() {} public void autonomousPeriodic() {
}
@Override @Override
public void autonomousExit() {} public void autonomousExit() {
}
@Override @Override
public void teleopInit() { public void teleopInit() {
@@ -54,10 +76,12 @@ public class Robot extends TimedRobot {
} }
@Override @Override
public void teleopPeriodic() {} public void teleopPeriodic() {
}
@Override @Override
public void teleopExit() {} public void teleopExit() {
}
@Override @Override
public void testInit() { public void testInit() {
@@ -65,8 +89,10 @@ public class Robot extends TimedRobot {
} }
@Override @Override
public void testPeriodic() {} public void testPeriodic() {
}
@Override @Override
public void testExit() {} public void testExit() {
}
} }

View File

@@ -4,94 +4,115 @@
package frc.robot; package frc.robot;
import static edu.wpi.first.units.Units.*; import static edu.wpi.first.units.Units.MetersPerSecond;
import static edu.wpi.first.units.Units.RadiansPerSecond;
import static edu.wpi.first.units.Units.RotationsPerSecond;
import com.ctre.phoenix6.swerve.SwerveModule.DriveRequestType; import com.ctre.phoenix6.swerve.SwerveModule.DriveRequestType;
import com.ctre.phoenix6.swerve.SwerveRequest; import com.ctre.phoenix6.swerve.SwerveRequest;
import com.pathplanner.lib.auto.AutoBuilder;
import com.pathplanner.lib.auto.NamedCommands; import com.pathplanner.lib.auto.NamedCommands;
import edu.wpi.first.cameraserver.CameraServer; import edu.wpi.first.cameraserver.CameraServer;
import edu.wpi.first.wpilibj.smartdashboard.SendableChooser;
import edu.wpi.first.wpilibj.smartdashboard.SmartDashboard;
import edu.wpi.first.wpilibj2.command.Command; import edu.wpi.first.wpilibj2.command.Command;
import edu.wpi.first.wpilibj2.command.Commands; import edu.wpi.first.wpilibj2.command.Commands;
import edu.wpi.first.wpilibj2.command.button.CommandXboxController; import edu.wpi.first.wpilibj2.command.button.CommandXboxController;
import frc.robot.commands.Aspirer;
import frc.robot.commands.DescendreBalyeuse;
import frc.robot.commands.DescendreGrimpeur;
import frc.robot.commands.Lancer;
import frc.robot.commands.LancerBaseVitesse;
import frc.robot.commands.Limelighter;
import frc.robot.commands.ModeOposer;
import frc.robot.commands.MonterBalyeuse;
import frc.robot.commands.MonterGrimpeur;
import frc.robot.commands.ModeAuto.AspirerAuto;
import frc.robot.commands.ModeAuto.GrimperMur;
import frc.robot.commands.ModeAuto.GrimperReservoir;
import frc.robot.commands.ModeAuto.LancerAuto;
import frc.robot.commands.ModeAuto.RetourMilieuDroite; import frc.robot.commands.ModeAuto.RetourMilieuDroite;
import frc.robot.commands.ModeAuto.RetourMilieuGauche; import frc.robot.commands.ModeAuto.RetourMilieuGauche;
import frc.robot.commands.ModeAuto.TournerA180; import frc.robot.commands.ModeAuto.TournerVersMur;
import frc.robot.commands.ModeAuto.TournerAZero; import frc.robot.commands.ModeAuto.TournerVersReservoir;
import frc.robot.generated.TunerConstants; import frc.robot.generated.TunerConstants;
import frc.robot.subsystems.Balayeuse; import frc.robot.subsystems.Balayeuse;
import frc.robot.subsystems.CommandSwerveDrivetrain; import frc.robot.subsystems.CommandSwerveDrivetrain;
import frc.robot.subsystems.Demeleur;
import frc.robot.subsystems.Grimpeur; import frc.robot.subsystems.Grimpeur;
import frc.robot.subsystems.Lanceur; import frc.robot.subsystems.Lanceur;
import frc.robot.subsystems.Led; import frc.robot.subsystems.Led;
import frc.robot.subsystems.LimeLight3; import frc.robot.subsystems.PivotBalayeuse;
public class RobotContainer { public class RobotContainer {
Balayeuse balayeuse = new Balayeuse(); private final SendableChooser<Command> autoChooser;
Grimpeur grimpeur = new Grimpeur(); public final CommandSwerveDrivetrain drivetrain = TunerConstants.createDrivetrain();
Lanceur lanceur = new Lanceur(); private final Balayeuse balayeuse = new Balayeuse();
LimeLight3 limeLight3 = new LimeLight3(); private final PivotBalayeuse pivotBalayeuse = new PivotBalayeuse();
Led led = new Led(); private final Demeleur demeleur = new Demeleur();
CommandXboxController manette = new CommandXboxController(0); private final Grimpeur grimpeur = new Grimpeur();
private double MaxSpeed = 1.0 * TunerConstants.kSpeedAt12Volts.in(MetersPerSecond); // kSpeedAt12Volts desired top speed private final Lanceur lanceur = new Lanceur();
private double MaxAngularRate = RotationsPerSecond.of(0.75).in(RadiansPerSecond); // 3/4 of a rotation per second max angular velocity private final Commandes commandes = new Commandes(drivetrain, lanceur, demeleur, balayeuse, grimpeur, pivotBalayeuse);
private final LimeLight3 limeLight3 = new LimeLight3();
private final Limelight3G limeLight3G = new Limelight3G();
private final Led led = new Led();
private final CommandXboxController manette = new CommandXboxController(0);
private final CommandXboxController manette1 = new CommandXboxController(1);
private double MaxSpeed = TunerConstants.kSpeedAt12Volts.in(MetersPerSecond); // kSpeedAt12Volts desired top speed
private double MaxAngularRate = RotationsPerSecond.of(0.75).in(RadiansPerSecond); // 3/4 of a rotation per second max
// angular velocity
/* Setting up bindings for necessary control of the swerve drive platform */ /* Setting up bindings for necessary control of the swerve drive platform */
private final SwerveRequest.FieldCentric drive = new SwerveRequest.FieldCentric() private final SwerveRequest.FieldCentric drive = new SwerveRequest.FieldCentric()
.withDeadband(MaxSpeed * 0.1).withRotationalDeadband(MaxAngularRate * 0.1) // Add a 10% deadband .withDeadband(MaxSpeed * 0.1).withRotationalDeadband(MaxAngularRate * 0.1) // Add a 10% deadband
.withDriveRequestType(DriveRequestType.OpenLoopVoltage); // Use open-loop control for drive motors .withDriveRequestType(DriveRequestType.OpenLoopVoltage); // Use open-loop control for drive motors
private final SwerveRequest.SwerveDriveBrake brake = new SwerveRequest.SwerveDriveBrake();
private final SwerveRequest.PointWheelsAt point = new SwerveRequest.PointWheelsAt();
private final Telemetry logger = new Telemetry(MaxSpeed);
private final CommandXboxController joystick = new CommandXboxController(0);
public final CommandSwerveDrivetrain drivetrain = TunerConstants.createDrivetrain();
private final Telemetry logger = new Telemetry(MaxSpeed);
public RobotContainer() { public RobotContainer() {
NamedCommands.registerCommand("GrimperMur", drivetrain.allerGrimpeMur());
NamedCommands.registerCommand("GrimperReservoir", drivetrain.allerGrimpeDepot());
NamedCommands.registerCommand("Lancer", commandes.lancer());
NamedCommands.registerCommand("RetourMilieuDroite", new RetourMilieuDroite(drivetrain, limeLight3G));
NamedCommands.registerCommand("RetourMilieuGauche", new RetourMilieuGauche(drivetrain, limeLight3G));
NamedCommands.registerCommand("Limelighter", commandes.viserLancer());
NamedCommands.registerCommand("DescendreBalayeuse", pivotBalayeuse.descendre());
NamedCommands.registerCommand("Aspirer", balayeuse.aspirer());
NamedCommands.registerCommand("TournerA180", new TournerVersReservoir(drivetrain));
NamedCommands.registerCommand("TournerAZero", new TournerVersMur(drivetrain));
NamedCommands.registerCommand("MonterGrimpeur", grimpeur.sortir());
NamedCommands.registerCommand("DescendreGrimpeur", grimpeur.rentrer());
autoChooser = AutoBuilder.buildAutoChooser();
SmartDashboard.putData("Auto Chooser", autoChooser);
CameraServer.startAutomaticCapture(); CameraServer.startAutomaticCapture();
configureBindings(); configureBindings();
NamedCommands.registerCommand("GrimperMur", new GrimperMur());
NamedCommands.registerCommand("GrimperReservoir", new GrimperReservoir());
NamedCommands.registerCommand("Lancer", new LancerAuto(lanceur));
NamedCommands.registerCommand("RetourMilieuDroite", new RetourMilieuDroite());
NamedCommands.registerCommand("RetourMilieuGauche", new RetourMilieuGauche());
NamedCommands.registerCommand("Limelighter", new Limelighter());
NamedCommands.registerCommand("DescendreBalayeuse", new DescendreBalyeuse(balayeuse));
NamedCommands.registerCommand("Aspirer", new AspirerAuto(balayeuse));
NamedCommands.registerCommand("TournerAZero", new TournerAZero());
NamedCommands.registerCommand("TournerA180", new TournerA180());
NamedCommands.registerCommand("MonterGrimpeur", new MonterGrimpeur(grimpeur));
NamedCommands.registerCommand("DescendreGrimpeur", new DescendreGrimpeur(grimpeur));
} }
private void configureBindings() { private void configureBindings() {
manette.a().whileTrue(new Lancer(lanceur,limeLight3,balayeuse,led));
manette.y().whileTrue(new ModeOposer(lanceur, balayeuse)); // Manette 0 (pilote)
manette.x().whileTrue(new LancerBaseVitesse(lanceur, limeLight3, balayeuse, led)); drivetrain.setDefaultCommand(
manette.rightTrigger().whileTrue(new MonterGrimpeur(grimpeur)); drivetrain.applyRequest(() -> drive
manette.leftTrigger().whileTrue(new DescendreGrimpeur(grimpeur)); .withVelocityY(-manette.getLeftX() * MaxSpeed * 0.7)
manette.rightBumper().whileTrue(new MonterBalyeuse(balayeuse)); .withVelocityX(-manette.getLeftY() * MaxSpeed * 0.7)
manette.leftBumper().whileTrue(new DescendreBalyeuse(balayeuse)); .withRotationalRate(-manette.getRightX() * MaxAngularRate)));
manette.b().whileTrue(new Aspirer(balayeuse,led)); manette.rightBumper().whileTrue(balayeuse.aspirer());
manette.povUp().whileTrue(grimpeur.sortir());
manette.povDown().whileTrue(grimpeur.rentrer());
manette.rightTrigger().whileTrue(commandes.lancer());
manette.leftTrigger().whileTrue(
commandes.viserLancer(() -> -manette.getLeftY() * MaxSpeed * 0.7, () -> -manette.getLeftX() * MaxSpeed * 0.7));
manette.leftBumper().whileTrue(pivotBalayeuse.descendre());
manette.b().whileTrue(drivetrain.allerGrimpeDepot());
manette.x().whileTrue(drivetrain.allerGrimpeMur());
// Manette 1 (co-pilote)
manette1.rightTrigger().whileTrue(balayeuse.aspirer());
manette1.rightBumper().whileTrue(pivotBalayeuse.monter());
manette1.leftTrigger().whileTrue(commandes.lancer(() -> lanceur.ntBasseVitesse()));
manette1.leftBumper().whileTrue(pivotBalayeuse.descendre());
manette1.x().whileTrue(commandes.lancerAspirer());
manette1.b().whileTrue(Commands.parallel(lanceur.inverse(), demeleur.inverse()));
manette1.a().whileTrue(demeleur.inverse());
manette1.y().whileTrue(balayeuse.ejecter());
drivetrain.registerTelemetry(logger::telemeterize);
} }
public Command getAutonomousCommand() { public Command getAutonomousCommand() {
return Commands.print("No autonomous command configured"); return autoChooser.getSelected();
// return getAutonomousCommand();
} }
} }

View File

@@ -1,74 +0,0 @@
// Copyright (c) FIRST and other WPILib contributors.
// Open Source Software; you can modify and/or share it under the terms of
// the WPILib BSD license file in the root directory of this project.
package frc.robot.commands;
import edu.wpi.first.wpilibj.Timer;
import edu.wpi.first.wpilibj2.command.Command;
import frc.robot.subsystems.Balayeuse;
import frc.robot.subsystems.Led;
/* You should consider using the more terse Command factories API instead https://docs.wpilib.org/en/stable/docs/software/commandbased/organizing-command-based.html#defining-commands */
public class Aspirer extends Command {
private Balayeuse balayeuse;
private Timer timer;
private Led led;
private double temp;
/** Creates a new Aspirer. */
public Aspirer(Balayeuse balayeuse, Led led) {
this.balayeuse = balayeuse;
this.led = led;
this.timer = new Timer();
addRequirements(balayeuse, led);
this.temp = 0;
// Use addRequirements() here to declare subsystem dependencies.
}
// Called when the command is initially scheduled.
@Override
public void initialize() {
timer.reset();
temp = balayeuse.Amp();
}
// Called every time the scheduler runs while the command is scheduled.
@Override
public void execute() {
timer.start();
int nbFois = 0;
double moyenneAmp = 0;
if(timer.get() <3){
nbFois++;
moyenneAmp += balayeuse.Amp() / nbFois;
}
else{
nbFois++;
moyenneAmp -= temp;
moyenneAmp += balayeuse.Amp() / nbFois;
temp = balayeuse.Amp();
}
if(moyenneAmp < balayeuse.AmpMax()){
timer.reset();
balayeuse.Balayer(0.5);
}
else{
balayeuse.Balayer(0);
led.Jaune2();
}
}
// Called once the command ends or is interrupted.
@Override
public void end(boolean interrupted) {
balayeuse.Balayer(0);
timer.stop();
}
// Returns true when the command should end.
@Override
public boolean isFinished() {
return false;
}
}

View File

@@ -1,43 +0,0 @@
// Copyright (c) FIRST and other WPILib contributors.
// Open Source Software; you can modify and/or share it under the terms of
// the WPILib BSD license file in the root directory of this project.
package frc.robot.commands;
import edu.wpi.first.wpilibj2.command.Command;
import frc.robot.subsystems.Balayeuse;
/* You should consider using the more terse Command factories API instead https://docs.wpilib.org/en/stable/docs/software/commandbased/organizing-command-based.html#defining-commands */
public class DescendreBalyeuse extends Command {
private Balayeuse balayeuse;
/** Creates a new Descendre. */
public DescendreBalyeuse(Balayeuse balayeuse) {
this.balayeuse = balayeuse;
addRequirements(balayeuse);
// Use addRequirements() here to declare subsystem dependencies.
}
// Called when the command is initially scheduled.
@Override
public void initialize() {}
// Called every time the scheduler runs while the command is scheduled.
@Override
public void execute() {
if(balayeuse.Distance() < balayeuse.EncodeurBalayeuse()){
balayeuse.Pivoter(-0.2);
}
}
// Called once the command ends or is interrupted.
@Override
public void end(boolean interrupted) {
balayeuse.Pivoter(0);
}
// Returns true when the command should end.
@Override
public boolean isFinished() {
return false;
}
}

View File

@@ -1,46 +0,0 @@
// Copyright (c) FIRST and other WPILib contributors.
// Open Source Software; you can modify and/or share it under the terms of
// the WPILib BSD license file in the root directory of this project.
package frc.robot.commands;
import edu.wpi.first.wpilibj2.command.Command;
import frc.robot.subsystems.Grimpeur;
/* You should consider using the more terse Command factories API instead https://docs.wpilib.org/en/stable/docs/software/commandbased/organizing-command-based.html#defining-commands */
public class DescendreGrimpeur extends Command {
private Grimpeur grimpeur;
/** Creates a new DescendreGrimpeur. */
public DescendreGrimpeur(Grimpeur grimpeur) {
this.grimpeur = grimpeur;
// Use addRequirements() here to declare subsystem dependencies.
}
// Called when the command is initially scheduled.
@Override
public void initialize() {}
// Called every time the scheduler runs while the command is scheduled.
@Override
public void execute() {
if(!grimpeur.Limit()){
grimpeur.Grimper(-0.5);
}
else{
grimpeur.Reset();
grimpeur.Grimper(0);
}
}
// Called once the command ends or is interrupted.
@Override
public void end(boolean interrupted) {
grimpeur.Grimper(0);
}
// Returns true when the command should end.
@Override
public boolean isFinished() {
return false;
}
}

View File

@@ -1,91 +0,0 @@
// Copyright (c) FIRST and other WPILib contributors.
// Open Source Software; you can modify and/or share it under the terms of
// the WPILib BSD license file in the root directory of this project.
package frc.robot.commands;
import edu.wpi.first.math.controller.PIDController;
import edu.wpi.first.wpilibj.Timer;
import edu.wpi.first.wpilibj2.command.Command;
import frc.robot.subsystems.Balayeuse;
import frc.robot.subsystems.Lanceur;
import frc.robot.subsystems.Led;
import frc.robot.subsystems.LimeLight3;
import frc.robot.subsystems.Limelight3G;
/* You should consider using the more terse Command factories API instead https://docs.wpilib.org/en/stable/docs/software/commandbased/organizing-command-based.html#defining-commands */
public class Lancer extends Command {
private Lanceur lanceur;
private PIDController pidController;
private Limelight3G limeLight3G;
private Timer timer;
private Balayeuse balayeuse;
private Led led;
private double temp;
/** Creates a new Lancer. */
public Lancer(Lanceur lanceur, LimeLight3 limeLight3, Balayeuse balayeuse,Led led) {
this.lanceur = lanceur;
this.balayeuse = balayeuse;
this.led = led;
this.timer = new Timer();
this.limeLight3G = new Limelight3G();
addRequirements(lanceur, balayeuse, led, limeLight3G);
this.temp = 0;
// Use addRequirements() here to declare subsystem dependencies.
}
// Called when the command is initially scheduled.
@Override
public void initialize() {
pidController = new PIDController(0, 0,0, 0);
timer.reset();
timer.start();
temp = lanceur.Amp();
}
// Called every time the scheduler runs while the command is scheduled.
@Override
public void execute() {
int nbFois = 0;
double moyenneAmp = 0;
if(timer.get() < 3){
nbFois++;
moyenneAmp += balayeuse.Amp() / nbFois;
}
else{
nbFois++;
moyenneAmp -= temp;
moyenneAmp += balayeuse.Amp() / nbFois;
temp = balayeuse.Amp();
}
if(moyenneAmp > lanceur.AmpBas() && nbFois > 10){
timer.reset();
balayeuse.Balayer(0.5);
led.Jaune2();
}
else{
double vitesse = (100-limeLight3G.getTA())/lanceur.Vitesse();
double output = pidController.calculate(lanceur.Vitesse(),vitesse);
lanceur.Lancer(output);
if(lanceur.Vitesse() >= vitesse){
lanceur.Demeler(0.5);
}
}
}
// Called once the command ends or is interrupted.
@Override
public void end(boolean interrupted) {
lanceur.Demeler(0);
lanceur.Lancer(0);
balayeuse.Pivoter(0);
}
// Returns true when the command should end.
@Override
public boolean isFinished() {
return false;
}
}

View File

@@ -1,91 +0,0 @@
// Copyright (c) FIRST and other WPILib contributors.
// Open Source Software; you can modify and/or share it under the terms of
// the WPILib BSD license file in the root directory of this project.
package frc.robot.commands;
import edu.wpi.first.math.controller.PIDController;
import edu.wpi.first.wpilibj.Timer;
import edu.wpi.first.wpilibj2.command.Command;
import frc.robot.subsystems.Balayeuse;
import frc.robot.subsystems.Lanceur;
import frc.robot.subsystems.Led;
import frc.robot.subsystems.LimeLight3;
import frc.robot.subsystems.Limelight3G;
/* You should consider using the more terse Command factories API instead https://docs.wpilib.org/en/stable/docs/software/commandbased/organizing-command-based.html#defining-commands */
public class LancerBaseVitesse extends Command {
private Lanceur lanceur;
private PIDController pidController;
private Limelight3G limeLight3G;
private Timer timer;
private Balayeuse balayeuse;
private Led led;
private double temp;
/** Creates a new Lancer. */
public LancerBaseVitesse(Lanceur lanceur, LimeLight3 limeLight3, Balayeuse balayeuse,Led led) {
this.lanceur = lanceur;
this.balayeuse = balayeuse;
this.led = led;
this.timer = new Timer();
this.limeLight3G = new Limelight3G();
addRequirements(lanceur, balayeuse, led, limeLight3G);
this.temp = 0;
// Use addRequirements() here to declare subsystem dependencies.
}
// Called when the command is initially scheduled.
@Override
public void initialize() {
pidController = new PIDController(0, 0,0, 0);
timer.reset();
timer.start();
temp = lanceur.Amp();
}
// Called every time the scheduler runs while the command is scheduled.
@Override
public void execute() {
int nbFois = 0;
double moyenneAmp = 0;
if(timer.get() < 3){
nbFois++;
moyenneAmp += balayeuse.Amp() / nbFois;
}
else{
nbFois++;
moyenneAmp -= temp;
moyenneAmp += balayeuse.Amp() / nbFois;
temp = balayeuse.Amp();
}
if(moyenneAmp > 30 && nbFois > 10){
timer.reset();
balayeuse.Balayer(0.5);
led.Jaune2();
}
else{
double vitesse = 0.4;
double output = pidController.calculate(lanceur.Vitesse(),vitesse);
lanceur.Lancer(output);
if(lanceur.Vitesse() >= vitesse){
lanceur.Demeler(0.5);
}
}
}
// Called once the command ends or is interrupted.
@Override
public void end(boolean interrupted) {
lanceur.Demeler(0);
lanceur.Lancer(0);
balayeuse.Pivoter(0);
}
// Returns true when the command should end.
@Override
public boolean isFinished() {
return false;
}
}

View File

@@ -1,33 +0,0 @@
// Copyright (c) FIRST and other WPILib contributors.
// Open Source Software; you can modify and/or share it under the terms of
// the WPILib BSD license file in the root directory of this project.
package frc.robot.commands;
import edu.wpi.first.wpilibj2.command.Command;
/* You should consider using the more terse Command factories API instead https://docs.wpilib.org/en/stable/docs/software/commandbased/organizing-command-based.html#defining-commands */
public class Limelighter extends Command {
/** Creates a new Limelighter. */
public Limelighter() {
// Use addRequirements() here to declare subsystem dependencies.
}
// Called when the command is initially scheduled.
@Override
public void initialize() {}
// Called every time the scheduler runs while the command is scheduled.
@Override
public void execute() {}
// Called once the command ends or is interrupted.
@Override
public void end(boolean interrupted) {}
// Returns true when the command should end.
@Override
public boolean isFinished() {
return false;
}
}

View File

@@ -1,41 +0,0 @@
// Copyright (c) FIRST and other WPILib contributors.
// Open Source Software; you can modify and/or share it under the terms of
// the WPILib BSD license file in the root directory of this project.
package frc.robot.commands.ModeAuto;
import edu.wpi.first.wpilibj2.command.Command;
import frc.robot.subsystems.Balayeuse;
/* You should consider using the more terse Command factories API instead https://docs.wpilib.org/en/stable/docs/software/commandbased/organizing-command-based.html#defining-commands */
public class AspirerAuto extends Command {
Balayeuse balayeuse;
/** Creates a new AspirerAuto. */
public AspirerAuto(Balayeuse balayeuse) {
this.balayeuse = balayeuse;
addRequirements(balayeuse);
// Use addRequirements() here to declare subsystem dependencies.
}
// Called when the command is initially scheduled.
@Override
public void initialize() {}
// Called every time the scheduler runs while the command is scheduled.
@Override
public void execute() {
balayeuse.Balayer(0.5);
}
// Called once the command ends or is interrupted.
@Override
public void end(boolean interrupted) {
balayeuse.Balayer(0);
}
// Returns true when the command should end.
@Override
public boolean isFinished() {
return false;
}
}

View File

@@ -1,33 +0,0 @@
// Copyright (c) FIRST and other WPILib contributors.
// Open Source Software; you can modify and/or share it under the terms of
// the WPILib BSD license file in the root directory of this project.
package frc.robot.commands.ModeAuto;
import edu.wpi.first.wpilibj2.command.Command;
/* You should consider using the more terse Command factories API instead https://docs.wpilib.org/en/stable/docs/software/commandbased/organizing-command-based.html#defining-commands */
public class GrimperMur extends Command {
/** Creates a new GrimperMur. */
public GrimperMur() {
// Use addRequirements() here to declare subsystem dependencies.
}
// Called when the command is initially scheduled.
@Override
public void initialize() {}
// Called every time the scheduler runs while the command is scheduled.
@Override
public void execute() {}
// Called once the command ends or is interrupted.
@Override
public void end(boolean interrupted) {}
// Returns true when the command should end.
@Override
public boolean isFinished() {
return false;
}
}

View File

@@ -1,33 +0,0 @@
// Copyright (c) FIRST and other WPILib contributors.
// Open Source Software; you can modify and/or share it under the terms of
// the WPILib BSD license file in the root directory of this project.
package frc.robot.commands.ModeAuto;
import edu.wpi.first.wpilibj2.command.Command;
/* You should consider using the more terse Command factories API instead https://docs.wpilib.org/en/stable/docs/software/commandbased/organizing-command-based.html#defining-commands */
public class GrimperReservoir extends Command {
/** Creates a new GrimperReservoir. */
public GrimperReservoir() {
// Use addRequirements() here to declare subsystem dependencies.
}
// Called when the command is initially scheduled.
@Override
public void initialize() {}
// Called every time the scheduler runs while the command is scheduled.
@Override
public void execute() {}
// Called once the command ends or is interrupted.
@Override
public void end(boolean interrupted) {}
// Returns true when the command should end.
@Override
public boolean isFinished() {
return false;
}
}

View File

@@ -1,46 +0,0 @@
// Copyright (c) FIRST and other WPILib contributors.
// Open Source Software; you can modify and/or share it under the terms of
// the WPILib BSD license file in the root directory of this project.
package frc.robot.commands.ModeAuto;
import edu.wpi.first.wpilibj.Timer;
import edu.wpi.first.wpilibj2.command.Command;
import frc.robot.subsystems.Lanceur;
/* You should consider using the more terse Command factories API instead https://docs.wpilib.org/en/stable/docs/software/commandbased/organizing-command-based.html#defining-commands */
public class LancerAuto extends Command {
Lanceur lanceur;
Timer timer;
/** Creates a new LancerAuto. */
public LancerAuto(Lanceur lanceur) {
this.lanceur = lanceur;
// Use addRequirements() here to declare subsystem dependencies.
}
// Called when the command is initially scheduled.
@Override
public void initialize() {
timer.start();
}
// Called every time the scheduler runs while the command is scheduled.
@Override
public void execute() {
lanceur.Lancer(0.5);
}
// Called once the command ends or is interrupted.
@Override
public void end(boolean interrupted) {
lanceur.Lancer(0);
timer.reset();
timer.stop();
}
// Returns true when the command should end.
@Override
public boolean isFinished() {
return timer.get() > 3;
}
}

View File

@@ -4,12 +4,41 @@
package frc.robot.commands.ModeAuto; package frc.robot.commands.ModeAuto;
import static edu.wpi.first.units.Units.*;
import java.util.Optional;
import com.ctre.phoenix6.hardware.Pigeon2;
import com.ctre.phoenix6.swerve.SwerveModule.DriveRequestType;
import com.ctre.phoenix6.swerve.SwerveRequest;
import edu.wpi.first.wpilibj.DriverStation;
import edu.wpi.first.wpilibj.DriverStation.Alliance;
import edu.wpi.first.wpilibj2.command.Command; import edu.wpi.first.wpilibj2.command.Command;
import frc.robot.Limelight3G;
import frc.robot.generated.TunerConstants;
import frc.robot.subsystems.CommandSwerveDrivetrain;
/* You should consider using the more terse Command factories API instead https://docs.wpilib.org/en/stable/docs/software/commandbased/organizing-command-based.html#defining-commands */ /* You should consider using the more terse Command factories API instead https://docs.wpilib.org/en/stable/docs/software/commandbased/organizing-command-based.html#defining-commands */
public class RetourMilieuDroite extends Command { public class RetourMilieuDroite extends Command {
CommandSwerveDrivetrain drivetrain;
Limelight3G limelight3g;
double botx;
double boty;
double x;
double y;
double angle;
private double MaxSpeed = TunerConstants.kSpeedAt12Volts.in(MetersPerSecond);
private double MaxAngularRate = RotationsPerSecond.of(0.75).in(RadiansPerSecond);
Optional<Alliance> alliance = DriverStation.getAlliance();
private final SwerveRequest.FieldCentric drive = new SwerveRequest.FieldCentric()
.withDeadband(MaxSpeed * 0.1).withRotationalDeadband(MaxAngularRate * 0.1)
.withDriveRequestType(DriveRequestType.OpenLoopVoltage);
/** Creates a new RetourMilieu. */ /** Creates a new RetourMilieu. */
public RetourMilieuDroite() { public RetourMilieuDroite(CommandSwerveDrivetrain drivetrain, Limelight3G limelight3g) {
this.drivetrain = drivetrain;
this.limelight3g = limelight3g;
addRequirements(drivetrain);
// Use addRequirements() here to declare subsystem dependencies. // Use addRequirements() here to declare subsystem dependencies.
} }
@@ -19,15 +48,63 @@ public class RetourMilieuDroite extends Command {
// Called every time the scheduler runs while the command is scheduled. // Called every time the scheduler runs while the command is scheduled.
@Override @Override
public void execute() {} public void execute() {
if(angle < 0){
angle = angle + 360;
}
if(alliance.get() == Alliance.Blue){
y = 0.639;
x = 2.305;
angle = 0;
if(limelight3g.getV()){
if(drivetrain.getPigeon2().getYaw().getValueAsDouble() >355 || drivetrain.getPigeon2().getYaw().getValueAsDouble() < 5){
if((y-boty < 0.05 && y-boty >-0.05) && (x-botx < 0.05 && x-botx > -0.05)){
drivetrain.setControl(drive.withVelocityX(0).withVelocityY(0));
}
else{
if(botx < 6){
drivetrain.setControl(drive.withVelocityX(y-boty));
}
else{
drivetrain.setControl(drive.withVelocityX(y-boty).withVelocityY(x-botx));
}
}
}
else{
if(drivetrain.getPigeon2().getYaw().getValueAsDouble() >angle && drivetrain.getPigeon2().getYaw().getValueAsDouble() <angle +180){
drivetrain.setControl(drive.withRotationalRate(0.5));
}
else if(drivetrain.getPigeon2().getYaw().getValueAsDouble() >=angle +180){
drivetrain.setControl(drive.withRotationalRate(-0.5));
}
}
}
}
else{
y = 7.380;
x = 13.963;
angle = 180;
if(limelight3g.getV()){
}
if(drivetrain.getPigeon2().getYaw().getValueAsDouble() >0 && drivetrain.getPigeon2().getYaw().getValueAsDouble() <180){
drivetrain.setControl(drive.withRotationalRate(0.5));
}
else if(drivetrain.getPigeon2().getYaw().getValueAsDouble() >180){
drivetrain.setControl(drive.withRotationalRate(-0.5));
}
}
}
// Called once the command ends or is interrupted. // Called once the command ends or is interrupted.
@Override @Override
public void end(boolean interrupted) {} public void end(boolean interrupted) {
drivetrain.setControl(drive.withVelocityX(0).withVelocityY(0));
}
// Returns true when the command should end. // Returns true when the command should end.
@Override @Override
public boolean isFinished() { public boolean isFinished() {
return false; return (y-boty < 0.05 && y-boty >-0.05) && (x-botx < 0.05 && x-botx > -0.05);
} }
} }

View File

@@ -4,12 +4,41 @@
package frc.robot.commands.ModeAuto; package frc.robot.commands.ModeAuto;
import static edu.wpi.first.units.Units.*;
import java.util.Optional;
import com.ctre.phoenix6.hardware.Pigeon2;
import com.ctre.phoenix6.swerve.SwerveModule.DriveRequestType;
import com.ctre.phoenix6.swerve.SwerveRequest;
import edu.wpi.first.wpilibj.DriverStation;
import edu.wpi.first.wpilibj.DriverStation.Alliance;
import edu.wpi.first.wpilibj2.command.Command; import edu.wpi.first.wpilibj2.command.Command;
import frc.robot.Limelight3G;
import frc.robot.generated.TunerConstants;
import frc.robot.subsystems.CommandSwerveDrivetrain;
/* You should consider using the more terse Command factories API instead https://docs.wpilib.org/en/stable/docs/software/commandbased/organizing-command-based.html#defining-commands */ /* You should consider using the more terse Command factories API instead https://docs.wpilib.org/en/stable/docs/software/commandbased/organizing-command-based.html#defining-commands */
public class RetourMilieuGauche extends Command { public class RetourMilieuGauche extends Command {
/** Creates a new RetourMilieuGauche. */ CommandSwerveDrivetrain drivetrain;
public RetourMilieuGauche() { Limelight3G limelight3g;
double botx;
double boty;
double x;
double y;
double angle;
private double MaxSpeed = TunerConstants.kSpeedAt12Volts.in(MetersPerSecond);
private double MaxAngularRate = RotationsPerSecond.of(0.75).in(RadiansPerSecond);
Optional<Alliance> alliance = DriverStation.getAlliance();
private final SwerveRequest.FieldCentric drive = new SwerveRequest.FieldCentric()
.withDeadband(MaxSpeed * 0.1).withRotationalDeadband(MaxAngularRate * 0.1)
.withDriveRequestType(DriveRequestType.OpenLoopVoltage);
/** Creates a new RetourMilieu. */
public RetourMilieuGauche(CommandSwerveDrivetrain drivetrain, Limelight3G limelight3g) {
this.drivetrain = drivetrain;
this.limelight3g = limelight3g;
addRequirements(drivetrain);
// Use addRequirements() here to declare subsystem dependencies. // Use addRequirements() here to declare subsystem dependencies.
} }
@@ -19,15 +48,85 @@ public class RetourMilieuGauche extends Command {
// Called every time the scheduler runs while the command is scheduled. // Called every time the scheduler runs while the command is scheduled.
@Override @Override
public void execute() {} public void execute() {
if(angle < 0){
angle = angle + 360;
}
double[] BotPose = new double[6];
BotPose = limelight3g.getBotPoseBlue();
botx = BotPose[0];
boty = BotPose[1];
if(alliance.get() == Alliance.Blue){
y = 7.380;
x = 2.305;
angle = 0;
if(limelight3g.getV()){
if(drivetrain.getPigeon2().getYaw().getValueAsDouble() >355 || drivetrain.getPigeon2().getYaw().getValueAsDouble() < 5){
if((y-boty < 0.05 && y-boty >-0.05) && (x-botx < 0.05 && x-botx > -0.05)){
drivetrain.setControl(drive.withVelocityX(0).withVelocityY(0));
}
else{
if(botx < 6){
drivetrain.setControl(drive.withVelocityX(y-boty));
}
else{
drivetrain.setControl(drive.withVelocityX(y-boty).withVelocityY(x-botx));
}
}
}
else{
if(drivetrain.getPigeon2().getYaw().getValueAsDouble() >angle && drivetrain.getPigeon2().getYaw().getValueAsDouble() <angle +180){
drivetrain.setControl(drive.withRotationalRate(0.5));
}
else if(drivetrain.getPigeon2().getYaw().getValueAsDouble() >=angle +180){
drivetrain.setControl(drive.withRotationalRate(-0.5));
}
}
}
}
else{
y = 0.639;
x = 13.963;
angle = 180;
if(limelight3g.getV()){
if(drivetrain.getPigeon2().getYaw().getValueAsDouble() >175 && drivetrain.getPigeon2().getYaw().getValueAsDouble() < 185){
if((y-boty < 0.05 && y-boty >-0.05) && (x-botx < 0.05 && x-botx > -0.05)){
drivetrain.setControl(drive.withVelocityX(0).withVelocityY(0));
}
else{
if(botx > 10){
drivetrain.setControl(drive.withVelocityX(y-boty));
}
else{
drivetrain.setControl(drive.withVelocityX(y-boty).withVelocityY(x-botx));
}
}
}
else{
if(drivetrain.getPigeon2().getYaw().getValueAsDouble() >0 && drivetrain.getPigeon2().getYaw().getValueAsDouble() <180){
drivetrain.setControl(drive.withRotationalRate(-0.5));
}
else if(drivetrain.getPigeon2().getYaw().getValueAsDouble() >=180){
drivetrain.setControl(drive.withRotationalRate(0.5));
}
}
}
}
}
// Called once the command ends or is interrupted. // Called once the command ends or is interrupted.
@Override @Override
public void end(boolean interrupted) {} public void end(boolean interrupted) {
drivetrain.setControl(drive.withVelocityX(0).withVelocityY(0));
}
// Returns true when the command should end. // Returns true when the command should end.
@Override @Override
public boolean isFinished() { public boolean isFinished() {
return false; return (y-boty < 0.05 && y-boty >-0.05) && (x-botx < 0.05 && x-botx > -0.05);
} }
} }

View File

@@ -1,33 +0,0 @@
// Copyright (c) FIRST and other WPILib contributors.
// Open Source Software; you can modify and/or share it under the terms of
// the WPILib BSD license file in the root directory of this project.
package frc.robot.commands.ModeAuto;
import edu.wpi.first.wpilibj2.command.Command;
/* You should consider using the more terse Command factories API instead https://docs.wpilib.org/en/stable/docs/software/commandbased/organizing-command-based.html#defining-commands */
public class TournerA180 extends Command {
/** Creates a new TournerA180. */
public TournerA180() {
// Use addRequirements() here to declare subsystem dependencies.
}
// Called when the command is initially scheduled.
@Override
public void initialize() {}
// Called every time the scheduler runs while the command is scheduled.
@Override
public void execute() {}
// Called once the command ends or is interrupted.
@Override
public void end(boolean interrupted) {}
// Returns true when the command should end.
@Override
public boolean isFinished() {
return false;
}
}

View File

@@ -1,33 +0,0 @@
// Copyright (c) FIRST and other WPILib contributors.
// Open Source Software; you can modify and/or share it under the terms of
// the WPILib BSD license file in the root directory of this project.
package frc.robot.commands.ModeAuto;
import edu.wpi.first.wpilibj2.command.Command;
/* You should consider using the more terse Command factories API instead https://docs.wpilib.org/en/stable/docs/software/commandbased/organizing-command-based.html#defining-commands */
public class TournerAZero extends Command {
/** Creates a new TournerAZero. */
public TournerAZero() {
// Use addRequirements() here to declare subsystem dependencies.
}
// Called when the command is initially scheduled.
@Override
public void initialize() {}
// Called every time the scheduler runs while the command is scheduled.
@Override
public void execute() {}
// Called once the command ends or is interrupted.
@Override
public void end(boolean interrupted) {}
// Returns true when the command should end.
@Override
public boolean isFinished() {
return false;
}
}

View File

@@ -0,0 +1,70 @@
// Copyright (c) FIRST and other WPILib contributors.
// Open Source Software; you can modify and/or share it under the terms of
// the WPILib BSD license file in the root directory of this project.
package frc.robot.commands.ModeAuto;
import com.ctre.phoenix6.swerve.SwerveModule.DriveRequestType;
import com.ctre.phoenix6.hardware.Pigeon2;
import com.ctre.phoenix6.swerve.SwerveRequest;
import edu.wpi.first.wpilibj.DriverStation;
import edu.wpi.first.wpilibj.DriverStation.Alliance;
import edu.wpi.first.wpilibj2.command.Command;
import frc.robot.generated.TunerConstants;
import frc.robot.subsystems.CommandSwerveDrivetrain;
import static edu.wpi.first.units.Units.*;
import java.util.Optional;
/* You should consider using the more terse Command factories API instead https://docs.wpilib.org/en/stable/docs/software/commandbased/organizing-command-based.html#defining-commands */
public class TournerVersMur extends Command {
CommandSwerveDrivetrain drivetrain;
Optional<Alliance> alliance = DriverStation.getAlliance();
private double MaxSpeed = TunerConstants.kSpeedAt12Volts.in(MetersPerSecond);
private double MaxAngularRate = RotationsPerSecond.of(0.75).in(RadiansPerSecond);
double force;
double angle;
private final SwerveRequest.FieldCentric drive = new SwerveRequest.FieldCentric()
.withDeadband(MaxSpeed * 0.1).withRotationalDeadband(MaxAngularRate * 0.1)
.withDriveRequestType(DriveRequestType.OpenLoopVoltage);
/** Creates a new TournerAZero. */
public TournerVersMur(CommandSwerveDrivetrain drivetrain) {
this.drivetrain = drivetrain;
addRequirements(drivetrain);
// Use addRequirements() here to declare subsystem dependencies.
}
// Called when the command is initially scheduled.
@Override
public void initialize() {}
// Called every time the scheduler runs while the command is scheduled.
@Override
public void execute() {
if(alliance.get() == Alliance.Blue){
force = 0.5;
angle = 0;
}
else{
force = -0.5;
angle = 180;
}
if(drivetrain.getPigeon2().getYaw().getValueAsDouble()>0 && drivetrain.getPigeon2().getYaw().getValueAsDouble()<180){
drivetrain.setControl(drive.withRotationalRate(force*180/Math.PI));
}
else if(drivetrain.getPigeon2().getYaw().getValueAsDouble()>180){
drivetrain.setControl(drive.withRotationalRate(-force*180/Math.PI));
}
}
// Called once the command ends or is interrupted.
@Override
public void end(boolean interrupted) {}
// Returns true when the command should end.
@Override
public boolean isFinished() {
return drivetrain.getPigeon2().getYaw().getValueAsDouble()> angle && drivetrain.getPigeon2().getYaw().getValueAsDouble()< angle + 10;
}
}

View File

@@ -0,0 +1,72 @@
// Copyright (c) FIRST and other WPILib contributors.
// Open Source Software; you can modify and/or share it under the terms of
// the WPILib BSD license file in the root directory of this project.
package frc.robot.commands.ModeAuto;
import com.ctre.phoenix6.swerve.SwerveModule.DriveRequestType;
import com.ctre.phoenix6.hardware.Pigeon2;
import com.ctre.phoenix6.swerve.SwerveRequest;
import edu.wpi.first.wpilibj.DriverStation;
import edu.wpi.first.wpilibj.DriverStation.Alliance;
import edu.wpi.first.wpilibj2.command.Command;
import frc.robot.generated.TunerConstants;
import frc.robot.subsystems.CommandSwerveDrivetrain;
import static edu.wpi.first.units.Units.*;
import java.util.Optional;
/* You should consider using the more terse Command factories API instead https://docs.wpilib.org/en/stable/docs/software/commandbased/organizing-command-based.html#defining-commands */
public class TournerVersReservoir extends Command {
CommandSwerveDrivetrain drivetrain;
Optional<Alliance> alliance = DriverStation.getAlliance();
private double MaxSpeed = TunerConstants.kSpeedAt12Volts.in(MetersPerSecond);
private double MaxAngularRate = RotationsPerSecond.of(0.75).in(RadiansPerSecond);
double force;
double angle;
private final SwerveRequest.FieldCentric drive = new SwerveRequest.FieldCentric()
.withDeadband(MaxSpeed * 0.1).withRotationalDeadband(MaxAngularRate * 0.1)
.withDriveRequestType(DriveRequestType.OpenLoopVoltage);
/** Creates a new TournerAZero. */
public TournerVersReservoir(CommandSwerveDrivetrain drivetrain) {
this.drivetrain = drivetrain;
addRequirements(drivetrain);
// Use addRequirements() here to declare subsystem dependencies.
}
// Called when the command is initially scheduled.
@Override
public void initialize() {}
// Called every time the scheduler runs while the command is scheduled.
@Override
public void execute() {
if(alliance.isPresent()){
if(alliance.get() == Alliance.Blue){
force = 0.5;
angle = 180;
}
else{
force = -0.5;
angle = 0;
}
}
if(drivetrain.getPigeon2().getYaw().getValueAsDouble() >0 && drivetrain.getPigeon2().getYaw().getValueAsDouble() <180){
drivetrain.setControl(drive.withRotationalRate(-force*180/Math.PI));
}
else if(drivetrain.getPigeon2().getYaw().getValueAsDouble() >180){
drivetrain.setControl(drive.withRotationalRate(force*180/Math.PI));
}
}
// Called once the command ends or is interrupted.
@Override
public void end(boolean interrupted) {}
// Returns true when the command should end.
@Override
public boolean isFinished() {
return drivetrain.getPigeon2().getYaw().getValueAsDouble() > angle && drivetrain.getPigeon2().getYaw().getValueAsDouble() < angle + 10;
}
}

View File

@@ -1,48 +0,0 @@
// Copyright (c) FIRST and other WPILib contributors.
// Open Source Software; you can modify and/or share it under the terms of
// the WPILib BSD license file in the root directory of this project.
package frc.robot.commands;
import edu.wpi.first.wpilibj2.command.Command;
import frc.robot.subsystems.Balayeuse;
import frc.robot.subsystems.Lanceur;
/* You should consider using the more terse Command factories API instead https://docs.wpilib.org/en/stable/docs/software/commandbased/organizing-command-based.html#defining-commands */
public class ModeOposer extends Command {
private Lanceur lanceur;
private Balayeuse balayeuse;
/** Creates a new Lancer. */
public ModeOposer(Lanceur lanceur, Balayeuse balayeuse) {
this.lanceur = lanceur;
this.balayeuse = balayeuse;
addRequirements(lanceur ,balayeuse);
// Use addRequirements() here to declare subsystem dependencies.
}
// Called when the command is initially scheduled.
@Override
public void initialize() {
}
// Called every time the scheduler runs while the command is scheduled.
@Override
public void execute() {
lanceur.Lancer(-0.2);
lanceur.Demeler(-0.2);
balayeuse.Balayer(-0.2);
}
// Called once the command ends or is interrupted.
@Override
public void end(boolean interrupted) {
lanceur.Demeler(0);
lanceur.Lancer(0);
balayeuse.Balayer(0);
}
// Returns true when the command should end.
@Override
public boolean isFinished() {
return false;
}
}

View File

@@ -1,47 +0,0 @@
// Copyright (c) FIRST and other WPILib contributors.
// Open Source Software; you can modify and/or share it under the terms of
// the WPILib BSD license file in the root directory of this project.
package frc.robot.commands;
import edu.wpi.first.wpilibj2.command.Command;
import frc.robot.subsystems.Balayeuse;
/* You should consider using the more terse Command factories API instead https://docs.wpilib.org/en/stable/docs/software/commandbased/organizing-command-based.html#defining-commands */
public class MonterBalyeuse extends Command {
private Balayeuse balayeuse;
/** Creates a new MonterBalyeuse. */
public MonterBalyeuse(Balayeuse balayeuse) {
this.balayeuse = balayeuse;
addRequirements(balayeuse);
// Use addRequirements() here to declare subsystem dependencies.
}
// Called when the command is initially scheduled.
@Override
public void initialize() {}
// Called every time the scheduler runs while the command is scheduled.
@Override
public void execute() {
if(!balayeuse.GetLimiSwtich()){
balayeuse.Pivoter(0.2);
}
else{
balayeuse.Reset();
balayeuse.Pivoter(0);
}
}
// Called once the command ends or is interrupted.
@Override
public void end(boolean interrupted) {
balayeuse.Pivoter(0);
}
// Returns true when the command should end.
@Override
public boolean isFinished() {
return false;
}
}

View File

@@ -1,42 +0,0 @@
// Copyright (c) FIRST and other WPILib contributors.
// Open Source Software; you can modify and/or share it under the terms of
// the WPILib BSD license file in the root directory of this project.
package frc.robot.commands;
import edu.wpi.first.wpilibj2.command.Command;
import frc.robot.subsystems.Grimpeur;
/* You should consider using the more terse Command factories API instead https://docs.wpilib.org/en/stable/docs/software/commandbased/organizing-command-based.html#defining-commands */
public class MonterGrimpeur extends Command {
private Grimpeur grimpeur;
/** Creates a new MonterGrimpeur. */
public MonterGrimpeur(Grimpeur grimpeur) {
this.grimpeur = grimpeur;
// Use addRequirements() here to declare subsystem dependencies.
}
// Called when the command is initially scheduled.
@Override
public void initialize() {}
// Called every time the scheduler runs while the command is scheduled.
@Override
public void execute() {
if(grimpeur.Position() < grimpeur.PositionFinal()){
grimpeur.Grimper(0.5);
}
}
// Called once the command ends or is interrupted.
@Override
public void end(boolean interrupted) {
grimpeur.Grimper(0);
}
// Returns true when the command should end.
@Override
public boolean isFinished() {
return false;
}
}

View File

@@ -82,7 +82,8 @@ public class TunerConstants {
private static final double kDriveGearRatio = 6.122448979591837; private static final double kDriveGearRatio = 6.122448979591837;
private static final double kSteerGearRatio = 21.428571428571427; private static final double kSteerGearRatio = 21.428571428571427;
private static final Distance kWheelRadius = Inches.of(3.895); // private static final Distance kWheelRadius = Inches.of(3.895);
private static final Distance kWheelRadius = Inches.of(2);
private static final boolean kInvertLeftSide = false; private static final boolean kInvertLeftSide = false;
private static final boolean kInvertRightSide = true; private static final boolean kInvertRightSide = true;

View File

@@ -5,59 +5,42 @@
package frc.robot.subsystems; package frc.robot.subsystems;
import com.revrobotics.spark.SparkFlex; import com.revrobotics.spark.SparkFlex;
import com.revrobotics.spark.SparkMax;
import com.revrobotics.spark.SparkLowLevel.MotorType; import com.revrobotics.spark.SparkLowLevel.MotorType;
import edu.wpi.first.networktables.GenericEntry;
import edu.wpi.first.wpilibj.DigitalInput;
import edu.wpi.first.wpilibj.Timer;
import edu.wpi.first.wpilibj.shuffleboard.Shuffleboard; import edu.wpi.first.wpilibj.shuffleboard.Shuffleboard;
import edu.wpi.first.wpilibj.shuffleboard.ShuffleboardTab; import edu.wpi.first.wpilibj.shuffleboard.ShuffleboardTab;
import edu.wpi.first.wpilibj2.command.Command;
import edu.wpi.first.wpilibj2.command.SubsystemBase; import edu.wpi.first.wpilibj2.command.SubsystemBase;
public class Balayeuse extends SubsystemBase { public class Balayeuse extends SubsystemBase {
ShuffleboardTab teb = Shuffleboard.getTab("teb"); ShuffleboardTab teb = Shuffleboard.getTab("teb");
SparkFlex Balaye1 = new SparkFlex(2, MotorType.kBrushless); SparkFlex moteurBas = new SparkFlex(2, MotorType.kBrushless);
SparkFlex Balaye2 = new SparkFlex(20, MotorType.kBrushless); SparkFlex moteurHaut = new SparkFlex(20, MotorType.kBrushless);
SparkMax Pivot = new SparkMax(8, MotorType.kBrushless);
DigitalInput limit = new DigitalInput(9); private final double vitesseMoteurBas = -0.5;
private GenericEntry EncodeurBalayeuse = private final double vitesseMoteurHaut = -0.2;
teb.add("Position bas balayeuse", 10).getEntry();
private GenericEntry AmpBaleyeuse = public Command balaye(double vitesseBas, double vitesseHaut) {
teb.add("Ampérage Baleyeuse", 40).getEntry(); return startEnd(
public void Balayer(double vitesse){ () -> {
Balaye1.set(vitesse); moteurBas.set(vitesseBas);
Balaye2.set(vitesse); moteurHaut.set(vitesseHaut);
}, () -> {
moteurBas.set(0);
moteurHaut.set(0);
});
} }
public void Pivoter(double vitesse){
Pivot.set(vitesse); public Command aspirer() {
return balaye(vitesseMoteurBas, vitesseMoteurHaut);
} }
public double Distance(){
return Pivot.getEncoder().getPosition(); public Command ejecter() {
} return balaye(-vitesseMoteurBas, -vitesseMoteurHaut);
public void Reset(){
Pivot.getEncoder().setPosition(0);
}
public boolean GetLimiSwtich(){
return limit.get();
}
public double Amp(){
return Balaye2.getOutputCurrent();
}
public double AmpMax(){
return AmpBaleyeuse.getDouble(40);
}
public void Temps(){
Timer timer = new Timer();
timer.start();
}
public double EncodeurBalayeuse(){
return EncodeurBalayeuse.getDouble(10);
} }
/** Creates a new Balayeuse. */ /** Creates a new Balayeuse. */
public Balayeuse() { public Balayeuse() {
teb.addBoolean("limit balayeuse", this::GetLimiSwtich);
teb.addDouble("encodeur balayeuse", this::Distance);
} }
@Override @Override

View File

@@ -1,19 +1,30 @@
package frc.robot.subsystems; package frc.robot.subsystems;
import static edu.wpi.first.units.Units.*; import static edu.wpi.first.units.Units.Degrees;
import static edu.wpi.first.units.Units.Second;
import static edu.wpi.first.units.Units.Volts;
import java.util.Optional; import java.util.Optional;
import java.util.function.Supplier; import java.util.function.Supplier;
import com.ctre.phoenix6.SignalLogger; import com.ctre.phoenix6.SignalLogger;
import com.ctre.phoenix6.Utils; import com.ctre.phoenix6.Utils;
import com.ctre.phoenix6.hardware.Pigeon2;
import com.ctre.phoenix6.swerve.SwerveDrivetrainConstants; import com.ctre.phoenix6.swerve.SwerveDrivetrainConstants;
import com.ctre.phoenix6.swerve.SwerveModule.DriveRequestType;
import com.ctre.phoenix6.swerve.SwerveModuleConstants; import com.ctre.phoenix6.swerve.SwerveModuleConstants;
import com.ctre.phoenix6.swerve.SwerveRequest; import com.ctre.phoenix6.swerve.SwerveRequest;
import com.ctre.phoenix6.swerve.SwerveRequest.FieldCentricFacingAngle;
import com.pathplanner.lib.auto.AutoBuilder;
import com.pathplanner.lib.config.PIDConstants;
import com.pathplanner.lib.config.RobotConfig;
import com.pathplanner.lib.controllers.PPHolonomicDriveController;
import edu.wpi.first.math.Matrix; import edu.wpi.first.math.Matrix;
import edu.wpi.first.math.geometry.Pose2d; import edu.wpi.first.math.geometry.Pose2d;
import edu.wpi.first.math.geometry.Rotation2d; import edu.wpi.first.math.geometry.Rotation2d;
import edu.wpi.first.math.geometry.Translation2d;
import edu.wpi.first.math.kinematics.ChassisSpeeds;
import edu.wpi.first.math.numbers.N1; import edu.wpi.first.math.numbers.N1;
import edu.wpi.first.math.numbers.N3; import edu.wpi.first.math.numbers.N3;
import edu.wpi.first.wpilibj.DriverStation; import edu.wpi.first.wpilibj.DriverStation;
@@ -23,7 +34,7 @@ import edu.wpi.first.wpilibj.RobotController;
import edu.wpi.first.wpilibj2.command.Command; import edu.wpi.first.wpilibj2.command.Command;
import edu.wpi.first.wpilibj2.command.Subsystem; import edu.wpi.first.wpilibj2.command.Subsystem;
import edu.wpi.first.wpilibj2.command.sysid.SysIdRoutine; import edu.wpi.first.wpilibj2.command.sysid.SysIdRoutine;
import frc.robot.Coordinates;
import frc.robot.generated.TunerConstants.TunerSwerveDrivetrain; import frc.robot.generated.TunerConstants.TunerSwerveDrivetrain;
/** /**
@@ -37,6 +48,7 @@ public class CommandSwerveDrivetrain extends TunerSwerveDrivetrain implements Su
private static final double kSimLoopPeriod = 0.004; // 4 ms private static final double kSimLoopPeriod = 0.004; // 4 ms
private Notifier m_simNotifier = null; private Notifier m_simNotifier = null;
private double m_lastSimTime; private double m_lastSimTime;
Pigeon2 pigeon2;
/* Blue alliance sees forward as 0 degrees (toward red alliance wall) */ /* Blue alliance sees forward as 0 degrees (toward red alliance wall) */
private static final Rotation2d kBlueAlliancePerspectiveRotation = Rotation2d.kZero; private static final Rotation2d kBlueAlliancePerspectiveRotation = Rotation2d.kZero;
@@ -44,99 +56,126 @@ public class CommandSwerveDrivetrain extends TunerSwerveDrivetrain implements Su
private static final Rotation2d kRedAlliancePerspectiveRotation = Rotation2d.k180deg; private static final Rotation2d kRedAlliancePerspectiveRotation = Rotation2d.k180deg;
/* Keep track if we've ever applied the operator perspective before or not */ /* Keep track if we've ever applied the operator perspective before or not */
private boolean m_hasAppliedOperatorPerspective = false; private boolean m_hasAppliedOperatorPerspective = false;
/* Swerve requests to apply during SysId characterization */ /* Swerve requests to apply during SysId characterization */
private final SwerveRequest.SysIdSwerveTranslation m_translationCharacterization = new SwerveRequest.SysIdSwerveTranslation(); private final SwerveRequest.SysIdSwerveTranslation m_translationCharacterization = new SwerveRequest.SysIdSwerveTranslation();
private final SwerveRequest.SysIdSwerveSteerGains m_steerCharacterization = new SwerveRequest.SysIdSwerveSteerGains(); private final SwerveRequest.SysIdSwerveSteerGains m_steerCharacterization = new SwerveRequest.SysIdSwerveSteerGains();
private final SwerveRequest.SysIdSwerveRotation m_rotationCharacterization = new SwerveRequest.SysIdSwerveRotation(); private final SwerveRequest.SysIdSwerveRotation m_rotationCharacterization = new SwerveRequest.SysIdSwerveRotation();
/* SysId routine for characterizing translation. This is used to find PID gains for the drive motors. */ /*
* SysId routine for characterizing translation. This is used to find PID gains
* for the drive motors.
*/
@SuppressWarnings("unused")
private final SysIdRoutine m_sysIdRoutineTranslation = new SysIdRoutine( private final SysIdRoutine m_sysIdRoutineTranslation = new SysIdRoutine(
new SysIdRoutine.Config( new SysIdRoutine.Config(
null, // Use default ramp rate (1 V/s) null, // Use default ramp rate (1 V/s)
Volts.of(4), // Reduce dynamic step voltage to 4 V to prevent brownout Volts.of(4), // Reduce dynamic step voltage to 4 V to prevent brownout
null, // Use default timeout (10 s) null, // Use default timeout (10 s)
// Log state with SignalLogger class // Log state with SignalLogger class
state -> SignalLogger.writeString("SysIdTranslation_State", state.toString()) state -> SignalLogger.writeString("SysIdTranslation_State", state.toString())),
), new SysIdRoutine.Mechanism(
new SysIdRoutine.Mechanism( output -> setControl(m_translationCharacterization.withVolts(output)),
output -> setControl(m_translationCharacterization.withVolts(output)), null,
null, this));
this
)
);
/* SysId routine for characterizing steer. This is used to find PID gains for the steer motors. */ /*
* SysId routine for characterizing steer. This is used to find PID gains for
* the steer motors.
*/
@SuppressWarnings("unused")
private final SysIdRoutine m_sysIdRoutineSteer = new SysIdRoutine( private final SysIdRoutine m_sysIdRoutineSteer = new SysIdRoutine(
new SysIdRoutine.Config( new SysIdRoutine.Config(
null, // Use default ramp rate (1 V/s) null, // Use default ramp rate (1 V/s)
Volts.of(7), // Use dynamic voltage of 7 V Volts.of(7), // Use dynamic voltage of 7 V
null, // Use default timeout (10 s) null, // Use default timeout (10 s)
// Log state with SignalLogger class // Log state with SignalLogger class
state -> SignalLogger.writeString("SysIdSteer_State", state.toString()) state -> SignalLogger.writeString("SysIdSteer_State", state.toString())),
), new SysIdRoutine.Mechanism(
new SysIdRoutine.Mechanism( volts -> setControl(m_steerCharacterization.withVolts(volts)),
volts -> setControl(m_steerCharacterization.withVolts(volts)), null,
null, this));
this
)
);
/* /*
* SysId routine for characterizing rotation. * SysId routine for characterizing rotation.
* This is used to find PID gains for the FieldCentricFacingAngle HeadingController. * This is used to find PID gains for the FieldCentricFacingAngle
* See the documentation of SwerveRequest.SysIdSwerveRotation for info on importing the log to SysId. * HeadingController.
* See the documentation of SwerveRequest.SysIdSwerveRotation for info on
* importing the log to SysId.
*/ */
@SuppressWarnings("unused")
private final SysIdRoutine m_sysIdRoutineRotation = new SysIdRoutine( private final SysIdRoutine m_sysIdRoutineRotation = new SysIdRoutine(
new SysIdRoutine.Config( new SysIdRoutine.Config(
/* This is in radians per second², but SysId only supports "volts per second" */ /* This is in radians per second², but SysId only supports "volts per second" */
Volts.of(Math.PI / 6).per(Second), Volts.of(Math.PI / 6).per(Second),
/* This is in radians per second, but SysId only supports "volts" */ /* This is in radians per second, but SysId only supports "volts" */
Volts.of(Math.PI), Volts.of(Math.PI),
null, // Use default timeout (10 s) null, // Use default timeout (10 s)
// Log state with SignalLogger class // Log state with SignalLogger class
state -> SignalLogger.writeString("SysIdRotation_State", state.toString()) state -> SignalLogger.writeString("SysIdRotation_State", state.toString())),
), new SysIdRoutine.Mechanism(
new SysIdRoutine.Mechanism( output -> {
output -> { /* output is actually radians per second, but SysId only supports "volts" */
/* output is actually radians per second, but SysId only supports "volts" */ setControl(m_rotationCharacterization.withRotationalRate(output.in(Volts)));
setControl(m_rotationCharacterization.withRotationalRate(output.in(Volts))); /* also log the requested output for SysId */
/* also log the requested output for SysId */ SignalLogger.writeDouble("Rotational_Rate", output.in(Volts));
SignalLogger.writeDouble("Rotational_Rate", output.in(Volts)); },
}, null,
null, this));
this
)
);
/* The SysId routine to test */ private final SwerveRequest.ApplyRobotSpeeds m_pathApplyRobotSpeeds = new SwerveRequest.ApplyRobotSpeeds();
private SysIdRoutine m_sysIdRoutineToApply = m_sysIdRoutineTranslation;
/** private void configureAutoBuilder() {
* Constructs a CTRE SwerveDrivetrain using the specified constants. try {
* <p> RobotConfig config = RobotConfig.fromGUISettings();
* This constructs the underlying hardware devices, so users should not construct AutoBuilder.configure(
* the devices themselves. If they need the devices, they can access them through () -> getState().Pose,
* getters in the classes. this::resetPose,
* () -> getState().Speeds,
* @param drivetrainConstants Drivetrain-wide constants for the swerve drive (speeds, feedforwards) -> setControl(
* @param modules Constants for each specific module m_pathApplyRobotSpeeds.withSpeeds(ChassisSpeeds.discretize(speeds, 0.020))
*/ .withWheelForceFeedforwardsX(feedforwards.robotRelativeForcesXNewtons())
public CommandSwerveDrivetrain( .withWheelForceFeedforwardsY(feedforwards.robotRelativeForcesYNewtons())),
SwerveDrivetrainConstants drivetrainConstants, new PPHolonomicDriveController(
SwerveModuleConstants<?, ?, ?>... modules new PIDConstants(10, 0, 0),
) { new PIDConstants(7, 0, 0)),
super(drivetrainConstants, modules); config,
if (Utils.isSimulation()) { () -> DriverStation.getAlliance().orElse(Alliance.Blue) == Alliance.Red,
startSimThread(); this);
} catch (Exception ex) {
DriverStation.reportError("Failed to load PathPlanner config and configure AutoBuilder",
ex.getStackTrace());
} }
} }
/** /**
* Constructs a CTRE SwerveDrivetrain using the specified constants. * Constructs a CTRE SwerveDrivetrain using the specified constants.
* <p> * <p>
* This constructs the underlying hardware devices, so users should not construct * This constructs the underlying hardware devices, so users should not
* the devices themselves. If they need the devices, they can access them through * construct
* the devices themselves. If they need the devices, they can access them
* through
* getters in the classes.
*
* @param drivetrainConstants Drivetrain-wide constants for the swerve drive
* @param modules Constants for each specific module
*/
public CommandSwerveDrivetrain(
SwerveDrivetrainConstants drivetrainConstants,
SwerveModuleConstants<?, ?, ?>... modules) {
super(drivetrainConstants, modules);
if (Utils.isSimulation()) {
startSimThread();
}
configureAutoBuilder();
}
/**
* Constructs a CTRE SwerveDrivetrain using the specified constants.
* <p>
* This constructs the underlying hardware devices, so users should not
* construct
* the devices themselves. If they need the devices, they can access them
* through
* getters in the classes. * getters in the classes.
* *
* @param drivetrainConstants Drivetrain-wide constants for the swerve drive * @param drivetrainConstants Drivetrain-wide constants for the swerve drive
@@ -146,50 +185,60 @@ public class CommandSwerveDrivetrain extends TunerSwerveDrivetrain implements Su
* @param modules Constants for each specific module * @param modules Constants for each specific module
*/ */
public CommandSwerveDrivetrain( public CommandSwerveDrivetrain(
SwerveDrivetrainConstants drivetrainConstants, SwerveDrivetrainConstants drivetrainConstants,
double odometryUpdateFrequency, double odometryUpdateFrequency,
SwerveModuleConstants<?, ?, ?>... modules SwerveModuleConstants<?, ?, ?>... modules) {
) {
super(drivetrainConstants, odometryUpdateFrequency, modules); super(drivetrainConstants, odometryUpdateFrequency, modules);
if (Utils.isSimulation()) { if (Utils.isSimulation()) {
startSimThread(); startSimThread();
} }
configureAutoBuilder();
} }
/** /**
* Constructs a CTRE SwerveDrivetrain using the specified constants. * Constructs a CTRE SwerveDrivetrain using the specified constants.
* <p> * <p>
* This constructs the underlying hardware devices, so users should not construct * This constructs the underlying hardware devices, so users should not
* the devices themselves. If they need the devices, they can access them through * construct
* the devices themselves. If they need the devices, they can access them
* through
* getters in the classes. * getters in the classes.
* *
* @param drivetrainConstants Drivetrain-wide constants for the swerve drive * @param drivetrainConstants Drivetrain-wide constants for the swerve
* drive
* @param odometryUpdateFrequency The frequency to run the odometry loop. If * @param odometryUpdateFrequency The frequency to run the odometry loop. If
* unspecified or set to 0 Hz, this is 250 Hz on * unspecified or set to 0 Hz, this is 250 Hz
* on
* CAN FD, and 100 Hz on CAN 2.0. * CAN FD, and 100 Hz on CAN 2.0.
* @param odometryStandardDeviation The standard deviation for odometry calculation * @param odometryStandardDeviation The standard deviation for odometry
* in the form [x, y, theta]ᵀ, with units in meters * calculation
* in the form [x, y, theta]ᵀ, with units in
* meters
* and radians * and radians
* @param visionStandardDeviation The standard deviation for vision calculation * @param visionStandardDeviation The standard deviation for vision
* in the form [x, y, theta]ᵀ, with units in meters * calculation
* in the form [x, y, theta]ᵀ, with units in
* meters
* and radians * and radians
* @param modules Constants for each specific module * @param modules Constants for each specific module
*/ */
public CommandSwerveDrivetrain( public CommandSwerveDrivetrain(
SwerveDrivetrainConstants drivetrainConstants, SwerveDrivetrainConstants drivetrainConstants,
double odometryUpdateFrequency, double odometryUpdateFrequency,
Matrix<N3, N1> odometryStandardDeviation, Matrix<N3, N1> odometryStandardDeviation,
Matrix<N3, N1> visionStandardDeviation, Matrix<N3, N1> visionStandardDeviation,
SwerveModuleConstants<?, ?, ?>... modules SwerveModuleConstants<?, ?, ?>... modules) {
) { super(drivetrainConstants, odometryUpdateFrequency, odometryStandardDeviation, visionStandardDeviation,
super(drivetrainConstants, odometryUpdateFrequency, odometryStandardDeviation, visionStandardDeviation, modules); modules);
if (Utils.isSimulation()) { if (Utils.isSimulation()) {
startSimThread(); startSimThread();
} }
configureAutoBuilder();
} }
/** /**
* Returns a command that applies the specified control request to this swerve drivetrain. * Returns a command that applies the specified control request to this swerve
* drivetrain.
* *
* @param request Function returning the request to apply * @param request Function returning the request to apply
* @return Command to run * @return Command to run
@@ -198,44 +247,25 @@ public class CommandSwerveDrivetrain extends TunerSwerveDrivetrain implements Su
return run(() -> this.setControl(request.get())); return run(() -> this.setControl(request.get()));
} }
/**
* Runs the SysId Quasistatic test in the given direction for the routine
* specified by {@link #m_sysIdRoutineToApply}.
*
* @param direction Direction of the SysId Quasistatic test
* @return Command to run
*/
public Command sysIdQuasistatic(SysIdRoutine.Direction direction) {
return m_sysIdRoutineToApply.quasistatic(direction);
}
/**
* Runs the SysId Dynamic test in the given direction for the routine
* specified by {@link #m_sysIdRoutineToApply}.
*
* @param direction Direction of the SysId Dynamic test
* @return Command to run
*/
public Command sysIdDynamic(SysIdRoutine.Direction direction) {
return m_sysIdRoutineToApply.dynamic(direction);
}
@Override @Override
public void periodic() { public void periodic() {
/* /*
* Periodically try to apply the operator perspective. * Periodically try to apply the operator perspective.
* If we haven't applied the operator perspective before, then we should apply it regardless of DS state. * If we haven't applied the operator perspective before, then we should apply
* This allows us to correct the perspective in case the robot code restarts mid-match. * it regardless of DS state.
* Otherwise, only check and apply the operator perspective if the DS is disabled. * This allows us to correct the perspective in case the robot code restarts
* This ensures driving behavior doesn't change until an explicit disable event occurs during testing. * mid-match.
* Otherwise, only check and apply the operator perspective if the DS is
* disabled.
* This ensures driving behavior doesn't change until an explicit disable event
* occurs during testing.
*/ */
if (!m_hasAppliedOperatorPerspective || DriverStation.isDisabled()) { if (!m_hasAppliedOperatorPerspective || DriverStation.isDisabled()) {
DriverStation.getAlliance().ifPresent(allianceColor -> { DriverStation.getAlliance().ifPresent(allianceColor -> {
setOperatorPerspectiveForward( setOperatorPerspectiveForward(
allianceColor == Alliance.Red allianceColor == Alliance.Red
? kRedAlliancePerspectiveRotation ? kRedAlliancePerspectiveRotation
: kBlueAlliancePerspectiveRotation : kBlueAlliancePerspectiveRotation);
);
m_hasAppliedOperatorPerspective = true; m_hasAppliedOperatorPerspective = true;
}); });
} }
@@ -257,11 +287,14 @@ public class CommandSwerveDrivetrain extends TunerSwerveDrivetrain implements Su
} }
/** /**
* Adds a vision measurement to the Kalman Filter. This will correct the odometry pose estimate * Adds a vision measurement to the Kalman Filter. This will correct the
* odometry pose estimate
* while still accounting for measurement noise. * while still accounting for measurement noise.
* *
* @param visionRobotPoseMeters The pose of the robot as measured by the vision camera. * @param visionRobotPoseMeters The pose of the robot as measured by the vision
* @param timestampSeconds The timestamp of the vision measurement in seconds. * camera.
* @param timestampSeconds The timestamp of the vision measurement in
* seconds.
*/ */
@Override @Override
public void addVisionMeasurement(Pose2d visionRobotPoseMeters, double timestampSeconds) { public void addVisionMeasurement(Pose2d visionRobotPoseMeters, double timestampSeconds) {
@@ -269,35 +302,74 @@ public class CommandSwerveDrivetrain extends TunerSwerveDrivetrain implements Su
} }
/** /**
* Adds a vision measurement to the Kalman Filter. This will correct the odometry pose estimate * Adds a vision measurement to the Kalman Filter. This will correct the
* odometry pose estimate
* while still accounting for measurement noise. * while still accounting for measurement noise.
* <p> * <p>
* Note that the vision measurement standard deviations passed into this method * Note that the vision measurement standard deviations passed into this method
* will continue to apply to future measurements until a subsequent call to * will continue to apply to future measurements until a subsequent call to
* {@link #setVisionMeasurementStdDevs(Matrix)} or this method. * {@link #setVisionMeasurementStdDevs(Matrix)} or this method.
* *
* @param visionRobotPoseMeters The pose of the robot as measured by the vision camera. * @param visionRobotPoseMeters The pose of the robot as measured by the
* @param timestampSeconds The timestamp of the vision measurement in seconds. * vision camera.
* @param visionMeasurementStdDevs Standard deviations of the vision pose measurement * @param timestampSeconds The timestamp of the vision measurement in
* in the form [x, y, theta]ᵀ, with units in meters and radians. * seconds.
* @param visionMeasurementStdDevs Standard deviations of the vision pose
* measurement
* in the form [x, y, theta]ᵀ, with units in
* meters and radians.
*/ */
@Override @Override
public void addVisionMeasurement( public void addVisionMeasurement(
Pose2d visionRobotPoseMeters, Pose2d visionRobotPoseMeters,
double timestampSeconds, double timestampSeconds,
Matrix<N3, N1> visionMeasurementStdDevs Matrix<N3, N1> visionMeasurementStdDevs) {
) { super.addVisionMeasurement(visionRobotPoseMeters, Utils.fpgaToCurrentTime(timestampSeconds),
super.addVisionMeasurement(visionRobotPoseMeters, Utils.fpgaToCurrentTime(timestampSeconds), visionMeasurementStdDevs); visionMeasurementStdDevs);
} }
/** /**
* Return the pose at a given timestamp, if the buffer is not empty. * Return the pose at a given timestamp, if the buffer is not empty.
* *
* @param timestampSeconds The timestamp of the pose in seconds. * @param timestampSeconds The timestamp of the pose in seconds.
* @return The pose at the given timestamp (or Optional.empty() if the buffer is empty). * @return The pose at the given timestamp (or Optional.empty() if the buffer is
* empty).
*/ */
@Override @Override
public Optional<Pose2d> samplePoseAt(double timestampSeconds) { public Optional<Pose2d> samplePoseAt(double timestampSeconds) {
return super.samplePoseAt(Utils.fpgaToCurrentTime(timestampSeconds)); return super.samplePoseAt(Utils.fpgaToCurrentTime(timestampSeconds));
} }
private SwerveRequest.FieldCentricFacingAngle fieldCentricFacingAngle = new FieldCentricFacingAngle()
.withDriveRequestType(DriveRequestType.OpenLoopVoltage).withHeadingPID(7, 0, 0);
public Command viserReservoir(Supplier<Double> velocityX, Supplier<Double> velocityY) {
return runEnd(() -> {
Translation2d diff = Coordinates.diffFromHub(getState().Pose.getTranslation());
Rotation2d angle = diff.getAngle();
setControl(fieldCentricFacingAngle
.withTargetDirection(angle)
.withVelocityX(velocityX.get())
.withVelocityY(velocityY.get()));
}, () -> setControl(fieldCentricFacingAngle.withVelocityX(0).withVelocityY(0)));
}
public Command allerGrimper(Supplier<Translation2d> diffSupplier) {
return runEnd(() -> {
Translation2d diff = diffSupplier.get();
Rotation2d angle = diff.getAngle().rotateBy(new Rotation2d(Degrees.of(-90)));
setControl(fieldCentricFacingAngle
.withTargetDirection(angle)
.withVelocityX(diff.getX())
.withVelocityY(diff.getY()));
}, () -> setControl(fieldCentricFacingAngle.withVelocityX(0).withVelocityY(0)));
}
public Command allerGrimpeMur() {
return allerGrimper(() -> Coordinates.diffFromGrimpeMur(getState().Pose.getTranslation()));
}
public Command allerGrimpeDepot() {
return allerGrimper(() -> Coordinates.diffFromGrimpeDepot(getState().Pose.getTranslation()));
}
} }

View File

@@ -0,0 +1,33 @@
// Copyright (c) FIRST and other WPILib contributors.
// Open Source Software; you can modify and/or share it under the terms of
// the WPILib BSD license file in the root directory of this project.
package frc.robot.subsystems;
import com.revrobotics.spark.SparkLowLevel.MotorType;
import com.revrobotics.spark.SparkMax;
import edu.wpi.first.wpilibj2.command.Command;
import edu.wpi.first.wpilibj2.command.SubsystemBase;
public class Demeleur extends SubsystemBase {
SparkMax moteur = new SparkMax(19, MotorType.kBrushless);
/** Creates a new Demeleur. */
public Demeleur() {
}
public Command run() {
return startEnd(() -> moteur.set(1), () -> moteur.set(0));
}
public Command inverse() {
return startEnd(() -> moteur.set(-0.2), () -> moteur.set(0));
}
@Override
public void periodic() {
// This method will be called once per scheduler run
}
}

View File

@@ -4,48 +4,76 @@
package frc.robot.subsystems; package frc.robot.subsystems;
import com.revrobotics.spark.SparkMax; import com.revrobotics.PersistMode;
import com.revrobotics.spark.config.SparkMaxConfig; import com.revrobotics.RelativeEncoder;
import com.revrobotics.ResetMode;
import com.revrobotics.spark.SparkLowLevel.MotorType; import com.revrobotics.spark.SparkLowLevel.MotorType;
import com.revrobotics.spark.SparkMax;
import com.revrobotics.spark.config.SoftLimitConfig;
import com.revrobotics.spark.config.SparkBaseConfig;
import com.revrobotics.spark.config.SparkBaseConfig.IdleMode;
import com.revrobotics.spark.config.SparkMaxConfig;
import edu.wpi.first.networktables.GenericEntry; import edu.wpi.first.networktables.GenericEntry;
import edu.wpi.first.wpilibj.DigitalInput; import edu.wpi.first.wpilibj.DigitalInput;
import edu.wpi.first.wpilibj.shuffleboard.Shuffleboard; import edu.wpi.first.wpilibj.shuffleboard.Shuffleboard;
import edu.wpi.first.wpilibj.shuffleboard.ShuffleboardTab; import edu.wpi.first.wpilibj.shuffleboard.ShuffleboardTab;
import edu.wpi.first.wpilibj2.command.Command;
import edu.wpi.first.wpilibj2.command.SubsystemBase; import edu.wpi.first.wpilibj2.command.SubsystemBase;
public class Grimpeur extends SubsystemBase { public class Grimpeur extends SubsystemBase {
ShuffleboardTab teb = Shuffleboard.getTab("teb"); ShuffleboardTab teb = Shuffleboard.getTab("teb");
SparkMax grimpeur1 = new SparkMax(3,MotorType.kBrushless); SparkMax moteur1 = new SparkMax(3, MotorType.kBrushless);
SparkMax grimpeur2 = new SparkMax(4,MotorType.kBrushless); SparkMax moteur2 = new SparkMax(12, MotorType.kBrushless);
SparkMaxConfig slaveConfig = new SparkMaxConfig(); RelativeEncoder encoder1 = moteur1.getEncoder();
RelativeEncoder encoder2 = moteur2.getEncoder();
private double vitesseSortir = 0.5;
private double vitesseEntrer = -0.4;
private GenericEntry ntEncodeurGrimpeur = teb.add("Position haut grimpeur", 101).getEntry();
private double maxEncodeur = ntEncodeurGrimpeur.getDouble(101);
DigitalInput limit = new DigitalInput(0); DigitalInput limit = new DigitalInput(0);
private GenericEntry EncodeurGrimpeur =
teb.add("Position haut grimpeur", 10).getEntry();
public void Grimper(double vitesse){
grimpeur1.set(vitesse);
grimpeur2.set(vitesse);
}
public double Position(){
return grimpeur1.getEncoder().getPosition();
}
public void Reset(){
grimpeur1.getEncoder().setPosition(0);
}
public boolean Limit(){
return limit.get();
}
public double PositionFinal(){
return EncodeurGrimpeur.getDouble(10);
}
/** Creates a new Grimpeur. */
public Grimpeur() { public Grimpeur() {
teb.addDouble("encodeur grimpeur", this::Position); teb.addDouble("encodeur grimpeur", encoder1::getPosition);
teb.addBoolean("limit grimpeur", this::Limit); teb.addBoolean("limit grimpeur", limit::get);
configMoteurs();
}
private void configMoteurs() {
SparkBaseConfig configMoteur = new SparkMaxConfig().apply(
new SoftLimitConfig().forwardSoftLimit(maxEncodeur).forwardSoftLimitEnabled(true)
.reverseSoftLimit(0).reverseSoftLimitEnabled(true))
.openLoopRampRate(0.1)
.idleMode(IdleMode.kBrake);
moteur1.configure(configMoteur, ResetMode.kNoResetSafeParameters, PersistMode.kPersistParameters);
moteur2.configure(configMoteur.follow(moteur1), ResetMode.kNoResetSafeParameters, PersistMode.kPersistParameters);
}
public Command sortir() {
return startEnd(() -> moteur1.set(vitesseSortir), () -> moteur1.set(0))
.until(() -> moteur1.getForwardSoftLimit().isReached() || moteur2.getForwardSoftLimit().isReached());
}
public Command rentrer() {
return startEnd(() -> moteur1.set(vitesseEntrer), () -> moteur1.set(0))
.until(() -> moteur1.getReverseSoftLimit().isReached() || moteur2.getReverseSoftLimit().isReached());
} }
@Override @Override
public void periodic() { public void periodic() {
// This method will be called once per scheduler run if (limit.get()) {
encoder1.setPosition(0);
encoder2.setPosition(0);
}
double newEncoderMax = ntEncodeurGrimpeur.getDouble(maxEncodeur);
if (newEncoderMax != maxEncodeur) {
maxEncodeur = newEncoderMax;
configMoteurs();
}
} }
} }

View File

@@ -4,45 +4,71 @@
package frc.robot.subsystems; package frc.robot.subsystems;
import java.util.function.Supplier;
import com.revrobotics.PersistMode;
import com.revrobotics.RelativeEncoder;
import com.revrobotics.ResetMode;
import com.revrobotics.spark.SparkBase.ControlType;
import com.revrobotics.spark.SparkFlex; import com.revrobotics.spark.SparkFlex;
import com.revrobotics.spark.SparkLowLevel.MotorType; import com.revrobotics.spark.SparkLowLevel.MotorType;
import com.revrobotics.spark.config.ClosedLoopConfig;
import com.revrobotics.spark.config.SparkBaseConfig;
import com.revrobotics.spark.config.SparkBaseConfig.IdleMode;
import com.revrobotics.spark.config.SparkMaxConfig;
import edu.wpi.first.networktables.GenericEntry; import edu.wpi.first.networktables.GenericEntry;
import edu.wpi.first.wpilibj.shuffleboard.Shuffleboard; import edu.wpi.first.wpilibj.shuffleboard.Shuffleboard;
import edu.wpi.first.wpilibj.shuffleboard.ShuffleboardTab; import edu.wpi.first.wpilibj.shuffleboard.ShuffleboardTab;
import edu.wpi.first.wpilibj2.command.Command;
import edu.wpi.first.wpilibj2.command.SubsystemBase; import edu.wpi.first.wpilibj2.command.SubsystemBase;
public class Lanceur extends SubsystemBase { public class Lanceur extends SubsystemBase {
ShuffleboardTab teb = Shuffleboard.getTab("teb"); ShuffleboardTab teb = Shuffleboard.getTab("teb");
SparkFlex moteur1 = new SparkFlex(15, MotorType.kBrushless); SparkFlex moteur1 = new SparkFlex(15, MotorType.kBrushless);
SparkFlex moteur2 = new SparkFlex(18, MotorType.kBrushless); SparkFlex moteur2 = new SparkFlex(18, MotorType.kBrushless);
SparkFlex Demeleur = new SparkFlex(19, MotorType.kBrushless);
GenericEntry vitesse = RelativeEncoder encoder = moteur1.getEncoder();
teb.add("vitesse lanceur",100).getEntry();
GenericEntry AmpLanceur = GenericEntry vitesse = teb.add("vitesse lanceur", 4000).getEntry();
teb.add("ampérage lanceur",30).getEntry(); GenericEntry AmpLanceur = teb.add("ampérage lanceur", 30).getEntry();
public void Lancer(double vitesse){
moteur1.set(vitesse);
moteur2.set(-vitesse);
}
public void Demeler(double vitesse){
Demeleur.set(vitesse);
}
public double Vitesse(){
return moteur1.getEncoder().getVelocity();
}
public double Amp(){
return moteur1.getOutputCurrent();
}
public double AmpBas(){
return AmpLanceur.getDouble(30);
}
public double vitesseDemander(){
return vitesse.getDouble(100);
}
/** Creates a new Lanceur. */ /** Creates a new Lanceur. */
public Lanceur() { public Lanceur() {
teb.addDouble("amperage lanceur", this::Amp); teb.addDouble("amperage lanceur", moteur1::getOutputCurrent);
teb.addDouble("vitesse actuelle", encoder::getVelocity);
configMoteurs();
}
private void configMoteurs() {
SparkBaseConfig configMoteur = new SparkMaxConfig().apply(
new ClosedLoopConfig().pid(0.0007, 0, 0))
.openLoopRampRate(0.1)
.idleMode(IdleMode.kCoast);
moteur1.configure(configMoteur, ResetMode.kNoResetSafeParameters, PersistMode.kPersistParameters);
moteur2.configure(configMoteur.follow(moteur1), ResetMode.kNoResetSafeParameters, PersistMode.kPersistParameters);
}
public Command lancer(Supplier<Double> vitesse) {
return runEnd(() -> moteur1.getClosedLoopController().setSetpoint(vitesse.get(), ControlType.kVelocity),
() -> moteur1.set(0));
}
public Command inverse() {
return startEnd(() -> moteur1.set(-0.2), () -> moteur1.set(0));
}
public double getVitesse() {
return encoder.getVelocity();
}
public boolean setPointAtteint() {
return getVitesse() >= moteur1.getClosedLoopController().getSetpoint() * 0.95;
}
public double ntBasseVitesse() {
return vitesse.getDouble(4000);
} }
@Override @Override
@@ -50,4 +76,3 @@ public class Lanceur extends SubsystemBase {
// This method will be called once per scheduler run // This method will be called once per scheduler run
} }
} }

View File

@@ -18,67 +18,76 @@ public class Led extends SubsystemBase {
ShuffleboardTab teb = Shuffleboard.getTab("teb"); ShuffleboardTab teb = Shuffleboard.getTab("teb");
private GenericEntry equipe = private GenericEntry equipe =
teb.add("equipe commence (bleu = ouvert, rouge = fermé)", true).withWidget(BuiltInWidgets.kToggleSwitch).getEntry(); teb.add("equipe commence (bleu = ouvert, rouge = fermé)", true).withWidget(BuiltInWidgets.kToggleSwitch).getEntry();
@SuppressWarnings("removal")
CANdle CANDle = new CANdle(17); CANdle CANDle = new CANdle(17);
@SuppressWarnings("removal")
RainbowAnimation rainbowAnim = new RainbowAnimation(); RainbowAnimation rainbowAnim = new RainbowAnimation();
@SuppressWarnings("removal")
public void bleu(){ public void bleu(){
CANDle.setLEDs(0, 0, 255,0,0,8); CANDle.setLEDs(0, 0, 255,0,0,8);
CANDle.setLEDs(0, 0, 255,0,16,8); CANDle.setLEDs(0, 0, 255,0,16,8);
CANDle.setLEDs(0, 0, 255,0,32,8); CANDle.setLEDs(0, 0, 255,0,32,8);
CANDle.setLEDs(0, 0, 255,0,56,8); // CANDle.setLEDs(0, 0, 255,0,56,8);
CANDle.setLEDs(0, 0, 255,0,72,8); // CANDle.setLEDs(0, 0, 255,0,72,8);
CANDle.setLEDs(0, 0, 255,0,88,8); // CANDle.setLEDs(0, 0, 255,0,88,8);
CANDle.setLEDs(0, 0, 255,0,104,8); // CANDle.setLEDs(0, 0, 255,0,104,8);
CANDle.setLEDs(0, 0, 255,0,120,8); // CANDle.setLEDs(0, 0, 255,0,120,8);
CANDle.setLEDs(0, 0, 255,0,136,8); // CANDle.setLEDs(0, 0, 255,0,136,8);
} }
@SuppressWarnings("removal")
public void Vert1(){ public void Vert1(){
CANDle.setLEDs(0, 255, 0,0,0,8); CANDle.setLEDs(0, 255, 0,0,0,8);
CANDle.setLEDs(0, 255, 0,0,16,8); CANDle.setLEDs(0, 255, 0,0,16,8);
CANDle.setLEDs(0, 255, 0,0,32,8); CANDle.setLEDs(0, 255, 0,0,32,8);
CANDle.setLEDs(0, 255, 0,0,56,8); // CANDle.setLEDs(0, 255, 0,0,56,8);
CANDle.setLEDs(0, 255, 0,0,72,8); // CANDle.setLEDs(0, 255, 0,0,72,8);
CANDle.setLEDs(0, 255, 0,0,88,8); // CANDle.setLEDs(0, 255, 0,0,88,8);
CANDle.setLEDs(0, 255, 0,0,104,8); // CANDle.setLEDs(0, 255, 0,0,104,8);
CANDle.setLEDs(0, 255, 0,0,120,8); // CANDle.setLEDs(0, 255, 0,0,120,8);
CANDle.setLEDs(0, 255, 0,0,136,8); // CANDle.setLEDs(0, 255, 0,0,136,8);
} }
@SuppressWarnings("removal")
public void Rouge(){ public void Rouge(){
CANDle.setLEDs(255, 0, 0,0,0,8); CANDle.setLEDs(255, 0, 0,0,0,8);
CANDle.setLEDs(255, 0, 0,0,16,8); CANDle.setLEDs(255, 0, 0,0,16,8);
CANDle.setLEDs(255, 0, 0,0,32,8); CANDle.setLEDs(255, 0, 0,0,32,8);
CANDle.setLEDs(255, 0, 0,0,48,8); // CANDle.setLEDs(255, 0, 0,0,48,8);
CANDle.setLEDs(255, 0, 0,0,64,8); // CANDle.setLEDs(255, 0, 0,0,64,8);
CANDle.setLEDs(255, 0, 0,0,80,8); // CANDle.setLEDs(255, 0, 0,0,80,8);
CANDle.setLEDs(255, 0, 0,0,96,8); // CANDle.setLEDs(255, 0, 0,0,96,8);
CANDle.setLEDs(255, 0, 0,0,112,8); // CANDle.setLEDs(255, 0, 0,0,112,8);
CANDle.setLEDs(255, 0, 0,0,128,8); // CANDle.setLEDs(255, 0, 0,0,128,8);
} }
@SuppressWarnings("removal")
public void Jaune2(){ public void Jaune2(){
CANDle.setLEDs(255, 255, 0,0,8,8); CANDle.setLEDs(255, 255, 0,0,8,8);
CANDle.setLEDs(255, 255, 0,0,24,8); CANDle.setLEDs(255, 255, 0,0,24,8);
CANDle.setLEDs(255, 255, 0,0,40,8); CANDle.setLEDs(255, 255, 0,0,40,8);
CANDle.setLEDs(255, 255, 0,0,56,8); // CANDle.setLEDs(255, 255, 0,0,56,8);
CANDle.setLEDs(255, 255, 0,0,72,8); // CANDle.setLEDs(255, 255, 0,0,72,8);
CANDle.setLEDs(255, 255, 0,0,88,8); // CANDle.setLEDs(255, 255, 0,0,88,8);
CANDle.setLEDs(255, 255, 0,0,104,8); // CANDle.setLEDs(255, 255, 0,0,104,8);
CANDle.setLEDs(255, 255, 0,0,120,8); // CANDle.setLEDs(255, 255, 0,0,120,8);
CANDle.setLEDs(255, 255, 0,0,136,8); // CANDle.setLEDs(255, 255, 0,0,136,8);
} }
public void Vert2(){ @SuppressWarnings("removal")
CANDle.setLEDs(0, 255, 0,0,8,8); public void Rouge2(){
CANDle.setLEDs(0, 255, 0,0,24,8); CANDle.setLEDs(255, 0, 0,0,8,8);
CANDle.setLEDs(0, 255, 0,0,40,8); CANDle.setLEDs(255, 0, 0,0,24,8);
CANDle.setLEDs(0, 255, 0,0,56,8); CANDle.setLEDs(255, 0, 0,0,40,8);
CANDle.setLEDs(0, 255, 0,0,72,8); // CANDle.setLEDs(255, 0, 0,0,56,8);
CANDle.setLEDs(0, 255, 0,0,88,8); // CANDle.setLEDs(255, 0, 0,0,72,8);
CANDle.setLEDs(0, 255, 0,0,104,8); // CANDle.setLEDs(255, 0, 0,0,88,8);
CANDle.setLEDs(0, 255, 0,0,120,8); // CANDle.setLEDs(255, 0, 0,0,104,8);
CANDle.setLEDs(0, 255, 0,0,136,8); // CANDle.setLEDs(255, 0, 0,0,120,8);
// CANDle.setLEDs(255, 0, 0,0,136,8);
} }
@SuppressWarnings("removal")
public void RainBow(){ public void RainBow(){
CANDle.animate(rainbowAnim); CANDle.animate(rainbowAnim);
} }
@SuppressWarnings("removal")
public void RainBowStop(){ public void RainBowStop(){
CANDle.animate(null); CANDle.animate(null);
} }
@@ -90,6 +99,7 @@ public class Led extends SubsystemBase {
@Override @Override
public void periodic() { public void periodic() {
double temps = DriverStation.getMatchTime(); double temps = DriverStation.getMatchTime();
if(temps > 20 && temps < 30){ if(temps > 20 && temps < 30){
Vert1(); Vert1();
@@ -129,5 +139,7 @@ public class Led extends SubsystemBase {
} }
} }
// This method will be called once per scheduler run // This method will be called once per scheduler run
} }
} }

View File

@@ -1,74 +0,0 @@
// Copyright (c) FIRST and other WPILib contributors.
// Open Source Software; you can modify and/or share it under the terms of
// the WPILib BSD license file in the root directory of this project.
package frc.robot.subsystems;
import edu.wpi.first.net.PortForwarder;
import edu.wpi.first.networktables.NetworkTable;
import edu.wpi.first.networktables.NetworkTableEntry;
import edu.wpi.first.networktables.NetworkTableInstance;
import edu.wpi.first.wpilibj2.command.SubsystemBase;
import frc.robot.LimelightHelpers;
public class LimeLight3 extends SubsystemBase {
NetworkTable table = NetworkTableInstance.getDefault().getTable("limelight-balon");
NetworkTableEntry pipeline = table.getEntry("pipeline");
/** Creates a new LimeLight3. */
public LimeLight3() {
for(int port = 5800; port <=5807; port++){
PortForwarder.add(port, "limelight.local", port);
}
}
public double[] getBotPoseBlue(){
NetworkTable limelightTable = NetworkTableInstance.getDefault().getTable("limelight-balon");
NetworkTableEntry BotPoseEntry = limelightTable.getEntry("botpose_orb_wpiblue");
double[] BotPose = BotPoseEntry.getDoubleArray(new double[7]);
return BotPose;
}
public double[] getBotPoseRed(){
NetworkTable limelightTable = NetworkTableInstance.getDefault().getTable("limelight-balon");
NetworkTableEntry BotPoseEntry = limelightTable.getEntry("botpose_orb_wpired");
double[] BotPose = BotPoseEntry.getDoubleArray(new double[7]);
return BotPose;
}
public double getTx(){
NetworkTable table = NetworkTableInstance.getDefault().getTable("limelight-balon");
NetworkTableEntry tx = table.getEntry("tx");
return tx.getDouble(0.0);
}
public double getTId(){
NetworkTable table = NetworkTableInstance.getDefault().getTable("limelight-balon");
NetworkTableEntry tid = table.getEntry("tid");
return tid.getDouble(0.0);
}
public double getTA(){
NetworkTable table = NetworkTableInstance.getDefault().getTable("limelight-balon");
NetworkTableEntry ta = table.getEntry("ta");
return ta.getDouble(0.0);
}
public boolean getV(){
return LimelightHelpers.getTV("limelight-balon");
}
public void AprilTag(){
pipeline.setNumber(0);
}
public void Forme(){
pipeline.setNumber(1);
}
public double Calcule(double x1, double x2, double y1, double y2, double angle)
{
if (x1 > 4)
{
return (Math.abs(Math.atan2(x2 - x1, y2 - y1)) * (180 / Math.PI) - angle)/90;
}
else
{
return (Math.abs(Math.atan2(x2 - x1, y2 - y1)) * (180 / Math.PI) + angle) * -1/90;
}
}
@Override
public void periodic() {
// This method will be called once per scheduler run
}
}

View File

@@ -1,68 +0,0 @@
// Copyright (c) FIRST and other WPILib contributors.
// Open Source Software; you can modify and/or share it under the terms of
// the WPILib BSD license file in the root directory of this project.
package frc.robot.subsystems;
import edu.wpi.first.net.PortForwarder;
import edu.wpi.first.networktables.NetworkTable;
import edu.wpi.first.networktables.NetworkTableEntry;
import edu.wpi.first.networktables.NetworkTableInstance;
import edu.wpi.first.wpilibj2.command.SubsystemBase;
import frc.robot.LimelightHelpers;
public class Limelight3G extends SubsystemBase {
NetworkTable table = NetworkTableInstance.getDefault().getTable("limelight-tag");
NetworkTableEntry pipeline = table.getEntry("pipeline");
/** Creates a new LimeLight3. */
public Limelight3G() {
for(int port = 5800; port <=5807; port++){
PortForwarder.add(port, "limelight.local", port);
}
}
public double[] getBotPoseBlue(){
NetworkTable limelightTable = NetworkTableInstance.getDefault().getTable("limelight-tag");
NetworkTableEntry BotPoseEntry = limelightTable.getEntry("botpose_orb_wpiblue");
double[] BotPose = BotPoseEntry.getDoubleArray(new double[7]);
return BotPose;
}
public double[] getBotPoseRed(){
NetworkTable limelightTable = NetworkTableInstance.getDefault().getTable("limelight-tag");
NetworkTableEntry BotPoseEntry = limelightTable.getEntry("botpose_orb_wpired");
double[] BotPose = BotPoseEntry.getDoubleArray(new double[7]);
return BotPose;
}
public double getTx(){
NetworkTable table = NetworkTableInstance.getDefault().getTable("limelight-tag");
NetworkTableEntry tx = table.getEntry("tx");
return tx.getDouble(0.0);
}
public double getTId(){
NetworkTable table = NetworkTableInstance.getDefault().getTable("limelight-tag");
NetworkTableEntry tid = table.getEntry("tid");
return tid.getDouble(0.0);
}
public double getTA(){
NetworkTable table = NetworkTableInstance.getDefault().getTable("limelight-tag");
NetworkTableEntry ta = table.getEntry("ta");
return ta.getDouble(0.0);
}
public boolean getV(){
return LimelightHelpers.getTV("limelight-tag");
}
public double Calcule(double x1, double x2, double y1, double y2, double angle)
{
if (x1 > 4)
{
return (Math.abs(Math.atan2(x2 - x1, y2 - y1)) * (180 / Math.PI) - angle)/90;
}
else
{
return (Math.abs(Math.atan2(x2 - x1, y2 - y1)) * (180 / Math.PI) + angle) * -1/90;
}
}
@Override
public void periodic() {
// This method will be called once per scheduler run
}
}

View File

@@ -0,0 +1,82 @@
// Copyright (c) FIRST and other WPILib contributors.
// Open Source Software; you can modify and/or share it under the terms of
// the WPILib BSD license file in the root directory of this project.
package frc.robot.subsystems;
import com.revrobotics.PersistMode;
import com.revrobotics.RelativeEncoder;
import com.revrobotics.ResetMode;
import com.revrobotics.spark.SparkLowLevel.MotorType;
import com.revrobotics.spark.SparkMax;
import com.revrobotics.spark.config.SoftLimitConfig;
import com.revrobotics.spark.config.SparkBaseConfig;
import com.revrobotics.spark.config.SparkBaseConfig.IdleMode;
import com.revrobotics.spark.config.SparkMaxConfig;
import edu.wpi.first.networktables.GenericEntry;
import edu.wpi.first.wpilibj.DigitalInput;
import edu.wpi.first.wpilibj.shuffleboard.Shuffleboard;
import edu.wpi.first.wpilibj.shuffleboard.ShuffleboardTab;
import edu.wpi.first.wpilibj2.command.Command;
import edu.wpi.first.wpilibj2.command.SubsystemBase;
public class PivotBalayeuse extends SubsystemBase {
ShuffleboardTab teb = Shuffleboard.getTab("teb");
SparkMax moteur = new SparkMax(8, MotorType.kBrushless);
RelativeEncoder encoder = moteur.getEncoder();
DigitalInput limit = new DigitalInput(9);
private GenericEntry ntEncodeurBalayeuse = teb.add("Position bas balayeuse", 1.8).getEntry();
private double maxEncodeur = ntEncodeurBalayeuse.getDouble(1.8);
private double vitesseMonter = 0.5;
private double vitesseDescendre = -0.5;
/** Creates a new PivotBalayeuse. */
public PivotBalayeuse() {
configMoteurs();
}
private void configMoteurs() {
SparkBaseConfig configMoteur = new SparkMaxConfig().apply(
new SoftLimitConfig().forwardSoftLimit(maxEncodeur).forwardSoftLimitEnabled(true)
.reverseSoftLimit(0.6).reverseSoftLimitEnabled(true))
.openLoopRampRate(0.1)
.idleMode(IdleMode.kBrake);
moteur.configure(configMoteur, ResetMode.kNoResetSafeParameters, PersistMode.kPersistParameters);
}
public Command monter() {
return startEnd(() -> moteur.set(vitesseMonter), () -> moteur.set(0))
.until(() -> moteur.getForwardSoftLimit().isReached());
}
public Command descendre() {
return startEnd(() -> moteur.set(vitesseDescendre), () -> moteur.set(0))
.until(() -> moteur.getReverseSoftLimit().isReached());
}
public double EncodeurBalayeuse() {
return ntEncodeurBalayeuse.getDouble(1.8);
}
@Override
public void periodic() {
teb.addBoolean("limit balayeuse", limit::get);
teb.addDouble("encodeur balayeuse", encoder::getPosition);
if (!limit.get()) {
encoder.setPosition(0.6);
}
double newEncoderMax = ntEncodeurBalayeuse.getDouble(maxEncodeur);
if (newEncoderMax != maxEncodeur) {
maxEncodeur = newEncoderMax;
configMoteurs();
}
}
}

View File

@@ -1,9 +1,9 @@
{ {
"fileName": "PathplannerLib-2025.2.7.json", "fileName": "PathplannerLib-2026.1.2.json",
"name": "PathplannerLib", "name": "PathplannerLib",
"version": "2025.2.7", "version": "2026.1.2",
"uuid": "1b42324f-17c6-4875-8e77-1c312bc8c786", "uuid": "1b42324f-17c6-4875-8e77-1c312bc8c786",
"frcYear": "2025", "frcYear": "2026",
"mavenUrls": [ "mavenUrls": [
"https://3015rangerrobotics.github.io/pathplannerlib/repo" "https://3015rangerrobotics.github.io/pathplannerlib/repo"
], ],
@@ -12,7 +12,7 @@
{ {
"groupId": "com.pathplanner.lib", "groupId": "com.pathplanner.lib",
"artifactId": "PathplannerLib-java", "artifactId": "PathplannerLib-java",
"version": "2025.2.7" "version": "2026.1.2"
} }
], ],
"jniDependencies": [], "jniDependencies": [],
@@ -20,7 +20,7 @@
{ {
"groupId": "com.pathplanner.lib", "groupId": "com.pathplanner.lib",
"artifactId": "PathplannerLib-cpp", "artifactId": "PathplannerLib-cpp",
"version": "2025.2.7", "version": "2026.1.2",
"libName": "PathplannerLib", "libName": "PathplannerLib",
"headerClassifier": "headers", "headerClassifier": "headers",
"sharedLibrary": false, "sharedLibrary": false,

View File

@@ -1,50 +1,50 @@
{ {
"fileName": "Phoenix5-5.35.1.json", "fileName": "Phoenix5-5.36.0.json",
"name": "CTRE-Phoenix (v5)", "name": "CTRE-Phoenix (v5)",
"version": "5.35.1", "version": "5.36.0",
"frcYear": "2025", "frcYear": "2026",
"uuid": "ab676553-b602-441f-a38d-f1296eff6537", "uuid": "ab676553-b602-441f-a38d-f1296eff6537",
"mavenUrls": [ "mavenUrls": [
"https://maven.ctr-electronics.com/release/" "https://maven.ctr-electronics.com/release/"
], ],
"jsonUrl": "https://maven.ctr-electronics.com/release/com/ctre/phoenix/Phoenix5-frc2025-latest.json", "jsonUrl": "https://maven.ctr-electronics.com/release/com/ctre/phoenix/Phoenix5-frc2026-latest.json",
"requires": [ "requires": [
{ {
"uuid": "e995de00-2c64-4df5-8831-c1441420ff19", "uuid": "e995de00-2c64-4df5-8831-c1441420ff19",
"errorMessage": "Phoenix 5 requires low-level libraries from Phoenix 6. Please add the Phoenix 6 vendordep before adding Phoenix 5.", "errorMessage": "Phoenix 5 requires low-level libraries from Phoenix 6. Please add the Phoenix 6 vendordep before adding Phoenix 5.",
"offlineFileName": "Phoenix6-frc2025-latest.json", "offlineFileName": "Phoenix6-frc2026-latest.json",
"onlineUrl": "https://maven.ctr-electronics.com/release/com/ctre/phoenix6/latest/Phoenix6-frc2025-latest.json" "onlineUrl": "https://maven.ctr-electronics.com/release/com/ctre/phoenix6/latest/Phoenix6-frc2026-latest.json"
} }
], ],
"conflictsWith": [ "conflictsWith": [
{ {
"uuid": "e7900d8d-826f-4dca-a1ff-182f658e98af", "uuid": "e7900d8d-826f-4dca-a1ff-182f658e98af",
"errorMessage": "Users must use the Phoenix 5 replay vendordep when using the Phoenix 6 replay vendordep.", "errorMessage": "Users must use the Phoenix 5 replay vendordep when using the Phoenix 6 replay vendordep.",
"offlineFileName": "Phoenix6-replay-frc2025-latest.json" "offlineFileName": "Phoenix6-replay-frc2026-latest.json"
}, },
{ {
"uuid": "fbc886a4-2cec-40c0-9835-71086a8cc3df", "uuid": "fbc886a4-2cec-40c0-9835-71086a8cc3df",
"errorMessage": "Users cannot have both the replay and regular Phoenix 5 vendordeps in their robot program.", "errorMessage": "Users cannot have both the replay and regular Phoenix 5 vendordeps in their robot program.",
"offlineFileName": "Phoenix5-replay-frc2025-latest.json" "offlineFileName": "Phoenix5-replay-frc2026-latest.json"
} }
], ],
"javaDependencies": [ "javaDependencies": [
{ {
"groupId": "com.ctre.phoenix", "groupId": "com.ctre.phoenix",
"artifactId": "api-java", "artifactId": "api-java",
"version": "5.35.1" "version": "5.36.0"
}, },
{ {
"groupId": "com.ctre.phoenix", "groupId": "com.ctre.phoenix",
"artifactId": "wpiapi-java", "artifactId": "wpiapi-java",
"version": "5.35.1" "version": "5.36.0"
} }
], ],
"jniDependencies": [ "jniDependencies": [
{ {
"groupId": "com.ctre.phoenix", "groupId": "com.ctre.phoenix",
"artifactId": "cci", "artifactId": "cci",
"version": "5.35.1", "version": "5.36.0",
"isJar": false, "isJar": false,
"skipInvalidPlatforms": true, "skipInvalidPlatforms": true,
"validPlatforms": [ "validPlatforms": [
@@ -58,7 +58,7 @@
{ {
"groupId": "com.ctre.phoenix.sim", "groupId": "com.ctre.phoenix.sim",
"artifactId": "cci-sim", "artifactId": "cci-sim",
"version": "5.35.1", "version": "5.36.0",
"isJar": false, "isJar": false,
"skipInvalidPlatforms": true, "skipInvalidPlatforms": true,
"validPlatforms": [ "validPlatforms": [
@@ -74,7 +74,7 @@
{ {
"groupId": "com.ctre.phoenix", "groupId": "com.ctre.phoenix",
"artifactId": "wpiapi-cpp", "artifactId": "wpiapi-cpp",
"version": "5.35.1", "version": "5.36.0",
"libName": "CTRE_Phoenix_WPI", "libName": "CTRE_Phoenix_WPI",
"headerClassifier": "headers", "headerClassifier": "headers",
"sharedLibrary": true, "sharedLibrary": true,
@@ -90,7 +90,7 @@
{ {
"groupId": "com.ctre.phoenix", "groupId": "com.ctre.phoenix",
"artifactId": "api-cpp", "artifactId": "api-cpp",
"version": "5.35.1", "version": "5.36.0",
"libName": "CTRE_Phoenix", "libName": "CTRE_Phoenix",
"headerClassifier": "headers", "headerClassifier": "headers",
"sharedLibrary": true, "sharedLibrary": true,
@@ -106,7 +106,7 @@
{ {
"groupId": "com.ctre.phoenix", "groupId": "com.ctre.phoenix",
"artifactId": "cci", "artifactId": "cci",
"version": "5.35.1", "version": "5.36.0",
"libName": "CTRE_PhoenixCCI", "libName": "CTRE_PhoenixCCI",
"headerClassifier": "headers", "headerClassifier": "headers",
"sharedLibrary": true, "sharedLibrary": true,
@@ -122,7 +122,7 @@
{ {
"groupId": "com.ctre.phoenix.sim", "groupId": "com.ctre.phoenix.sim",
"artifactId": "wpiapi-cpp-sim", "artifactId": "wpiapi-cpp-sim",
"version": "5.35.1", "version": "5.36.0",
"libName": "CTRE_Phoenix_WPISim", "libName": "CTRE_Phoenix_WPISim",
"headerClassifier": "headers", "headerClassifier": "headers",
"sharedLibrary": true, "sharedLibrary": true,
@@ -138,7 +138,7 @@
{ {
"groupId": "com.ctre.phoenix.sim", "groupId": "com.ctre.phoenix.sim",
"artifactId": "api-cpp-sim", "artifactId": "api-cpp-sim",
"version": "5.35.1", "version": "5.36.0",
"libName": "CTRE_PhoenixSim", "libName": "CTRE_PhoenixSim",
"headerClassifier": "headers", "headerClassifier": "headers",
"sharedLibrary": true, "sharedLibrary": true,
@@ -154,7 +154,7 @@
{ {
"groupId": "com.ctre.phoenix.sim", "groupId": "com.ctre.phoenix.sim",
"artifactId": "cci-sim", "artifactId": "cci-sim",
"version": "5.35.1", "version": "5.36.0",
"libName": "CTRE_PhoenixCCISim", "libName": "CTRE_PhoenixCCISim",
"headerClassifier": "headers", "headerClassifier": "headers",
"sharedLibrary": true, "sharedLibrary": true,

View File

@@ -1,32 +1,32 @@
{ {
"fileName": "Phoenix6-frc2025-latest.json", "fileName": "Phoenix6-26.1.3.json",
"name": "CTRE-Phoenix (v6)", "name": "CTRE-Phoenix (v6)",
"version": "25.4.0", "version": "26.1.3",
"frcYear": "2025", "frcYear": "2026",
"uuid": "e995de00-2c64-4df5-8831-c1441420ff19", "uuid": "e995de00-2c64-4df5-8831-c1441420ff19",
"mavenUrls": [ "mavenUrls": [
"https://maven.ctr-electronics.com/release/" "https://maven.ctr-electronics.com/release/"
], ],
"jsonUrl": "https://maven.ctr-electronics.com/release/com/ctre/phoenix6/latest/Phoenix6-frc2025-latest.json", "jsonUrl": "https://maven.ctr-electronics.com/release/com/ctre/phoenix6/latest/Phoenix6-frc2026-latest.json",
"conflictsWith": [ "conflictsWith": [
{ {
"uuid": "e7900d8d-826f-4dca-a1ff-182f658e98af", "uuid": "e7900d8d-826f-4dca-a1ff-182f658e98af",
"errorMessage": "Users can not have both the replay and regular Phoenix 6 vendordeps in their robot program.", "errorMessage": "Users can not have both the replay and regular Phoenix 6 vendordeps in their robot program.",
"offlineFileName": "Phoenix6-replay-frc2025-latest.json" "offlineFileName": "Phoenix6-replay-frc2026-latest.json"
} }
], ],
"javaDependencies": [ "javaDependencies": [
{ {
"groupId": "com.ctre.phoenix6", "groupId": "com.ctre.phoenix6",
"artifactId": "wpiapi-java", "artifactId": "wpiapi-java",
"version": "25.4.0" "version": "26.1.3"
} }
], ],
"jniDependencies": [ "jniDependencies": [
{ {
"groupId": "com.ctre.phoenix6", "groupId": "com.ctre.phoenix6",
"artifactId": "api-cpp", "artifactId": "api-cpp",
"version": "25.4.0", "version": "26.1.3",
"isJar": false, "isJar": false,
"skipInvalidPlatforms": true, "skipInvalidPlatforms": true,
"validPlatforms": [ "validPlatforms": [
@@ -40,7 +40,7 @@
{ {
"groupId": "com.ctre.phoenix6", "groupId": "com.ctre.phoenix6",
"artifactId": "tools", "artifactId": "tools",
"version": "25.4.0", "version": "26.1.3",
"isJar": false, "isJar": false,
"skipInvalidPlatforms": true, "skipInvalidPlatforms": true,
"validPlatforms": [ "validPlatforms": [
@@ -54,7 +54,7 @@
{ {
"groupId": "com.ctre.phoenix6.sim", "groupId": "com.ctre.phoenix6.sim",
"artifactId": "api-cpp-sim", "artifactId": "api-cpp-sim",
"version": "25.4.0", "version": "26.1.3",
"isJar": false, "isJar": false,
"skipInvalidPlatforms": true, "skipInvalidPlatforms": true,
"validPlatforms": [ "validPlatforms": [
@@ -68,7 +68,7 @@
{ {
"groupId": "com.ctre.phoenix6.sim", "groupId": "com.ctre.phoenix6.sim",
"artifactId": "tools-sim", "artifactId": "tools-sim",
"version": "25.4.0", "version": "26.1.3",
"isJar": false, "isJar": false,
"skipInvalidPlatforms": true, "skipInvalidPlatforms": true,
"validPlatforms": [ "validPlatforms": [
@@ -82,7 +82,7 @@
{ {
"groupId": "com.ctre.phoenix6.sim", "groupId": "com.ctre.phoenix6.sim",
"artifactId": "simTalonSRX", "artifactId": "simTalonSRX",
"version": "25.4.0", "version": "26.1.3",
"isJar": false, "isJar": false,
"skipInvalidPlatforms": true, "skipInvalidPlatforms": true,
"validPlatforms": [ "validPlatforms": [
@@ -96,7 +96,7 @@
{ {
"groupId": "com.ctre.phoenix6.sim", "groupId": "com.ctre.phoenix6.sim",
"artifactId": "simVictorSPX", "artifactId": "simVictorSPX",
"version": "25.4.0", "version": "26.1.3",
"isJar": false, "isJar": false,
"skipInvalidPlatforms": true, "skipInvalidPlatforms": true,
"validPlatforms": [ "validPlatforms": [
@@ -110,21 +110,7 @@
{ {
"groupId": "com.ctre.phoenix6.sim", "groupId": "com.ctre.phoenix6.sim",
"artifactId": "simPigeonIMU", "artifactId": "simPigeonIMU",
"version": "25.4.0", "version": "26.1.3",
"isJar": false,
"skipInvalidPlatforms": true,
"validPlatforms": [
"windowsx86-64",
"linuxx86-64",
"linuxarm64",
"osxuniversal"
],
"simMode": "swsim"
},
{
"groupId": "com.ctre.phoenix6.sim",
"artifactId": "simCANCoder",
"version": "25.4.0",
"isJar": false, "isJar": false,
"skipInvalidPlatforms": true, "skipInvalidPlatforms": true,
"validPlatforms": [ "validPlatforms": [
@@ -138,7 +124,7 @@
{ {
"groupId": "com.ctre.phoenix6.sim", "groupId": "com.ctre.phoenix6.sim",
"artifactId": "simProTalonFX", "artifactId": "simProTalonFX",
"version": "25.4.0", "version": "26.1.3",
"isJar": false, "isJar": false,
"skipInvalidPlatforms": true, "skipInvalidPlatforms": true,
"validPlatforms": [ "validPlatforms": [
@@ -152,7 +138,7 @@
{ {
"groupId": "com.ctre.phoenix6.sim", "groupId": "com.ctre.phoenix6.sim",
"artifactId": "simProTalonFXS", "artifactId": "simProTalonFXS",
"version": "25.4.0", "version": "26.1.3",
"isJar": false, "isJar": false,
"skipInvalidPlatforms": true, "skipInvalidPlatforms": true,
"validPlatforms": [ "validPlatforms": [
@@ -166,7 +152,7 @@
{ {
"groupId": "com.ctre.phoenix6.sim", "groupId": "com.ctre.phoenix6.sim",
"artifactId": "simProCANcoder", "artifactId": "simProCANcoder",
"version": "25.4.0", "version": "26.1.3",
"isJar": false, "isJar": false,
"skipInvalidPlatforms": true, "skipInvalidPlatforms": true,
"validPlatforms": [ "validPlatforms": [
@@ -180,7 +166,7 @@
{ {
"groupId": "com.ctre.phoenix6.sim", "groupId": "com.ctre.phoenix6.sim",
"artifactId": "simProPigeon2", "artifactId": "simProPigeon2",
"version": "25.4.0", "version": "26.1.3",
"isJar": false, "isJar": false,
"skipInvalidPlatforms": true, "skipInvalidPlatforms": true,
"validPlatforms": [ "validPlatforms": [
@@ -194,7 +180,7 @@
{ {
"groupId": "com.ctre.phoenix6.sim", "groupId": "com.ctre.phoenix6.sim",
"artifactId": "simProCANrange", "artifactId": "simProCANrange",
"version": "25.4.0", "version": "26.1.3",
"isJar": false, "isJar": false,
"skipInvalidPlatforms": true, "skipInvalidPlatforms": true,
"validPlatforms": [ "validPlatforms": [
@@ -208,7 +194,7 @@
{ {
"groupId": "com.ctre.phoenix6.sim", "groupId": "com.ctre.phoenix6.sim",
"artifactId": "simProCANdi", "artifactId": "simProCANdi",
"version": "25.4.0", "version": "26.1.3",
"isJar": false, "isJar": false,
"skipInvalidPlatforms": true, "skipInvalidPlatforms": true,
"validPlatforms": [ "validPlatforms": [
@@ -222,7 +208,7 @@
{ {
"groupId": "com.ctre.phoenix6.sim", "groupId": "com.ctre.phoenix6.sim",
"artifactId": "simProCANdle", "artifactId": "simProCANdle",
"version": "25.4.0", "version": "26.1.3",
"isJar": false, "isJar": false,
"skipInvalidPlatforms": true, "skipInvalidPlatforms": true,
"validPlatforms": [ "validPlatforms": [
@@ -238,7 +224,7 @@
{ {
"groupId": "com.ctre.phoenix6", "groupId": "com.ctre.phoenix6",
"artifactId": "wpiapi-cpp", "artifactId": "wpiapi-cpp",
"version": "25.4.0", "version": "26.1.3",
"libName": "CTRE_Phoenix6_WPI", "libName": "CTRE_Phoenix6_WPI",
"headerClassifier": "headers", "headerClassifier": "headers",
"sharedLibrary": true, "sharedLibrary": true,
@@ -254,7 +240,7 @@
{ {
"groupId": "com.ctre.phoenix6", "groupId": "com.ctre.phoenix6",
"artifactId": "tools", "artifactId": "tools",
"version": "25.4.0", "version": "26.1.3",
"libName": "CTRE_PhoenixTools", "libName": "CTRE_PhoenixTools",
"headerClassifier": "headers", "headerClassifier": "headers",
"sharedLibrary": true, "sharedLibrary": true,
@@ -270,7 +256,7 @@
{ {
"groupId": "com.ctre.phoenix6.sim", "groupId": "com.ctre.phoenix6.sim",
"artifactId": "wpiapi-cpp-sim", "artifactId": "wpiapi-cpp-sim",
"version": "25.4.0", "version": "26.1.3",
"libName": "CTRE_Phoenix6_WPISim", "libName": "CTRE_Phoenix6_WPISim",
"headerClassifier": "headers", "headerClassifier": "headers",
"sharedLibrary": true, "sharedLibrary": true,
@@ -286,7 +272,7 @@
{ {
"groupId": "com.ctre.phoenix6.sim", "groupId": "com.ctre.phoenix6.sim",
"artifactId": "tools-sim", "artifactId": "tools-sim",
"version": "25.4.0", "version": "26.1.3",
"libName": "CTRE_PhoenixTools_Sim", "libName": "CTRE_PhoenixTools_Sim",
"headerClassifier": "headers", "headerClassifier": "headers",
"sharedLibrary": true, "sharedLibrary": true,
@@ -302,7 +288,7 @@
{ {
"groupId": "com.ctre.phoenix6.sim", "groupId": "com.ctre.phoenix6.sim",
"artifactId": "simTalonSRX", "artifactId": "simTalonSRX",
"version": "25.4.0", "version": "26.1.3",
"libName": "CTRE_SimTalonSRX", "libName": "CTRE_SimTalonSRX",
"headerClassifier": "headers", "headerClassifier": "headers",
"sharedLibrary": true, "sharedLibrary": true,
@@ -318,7 +304,7 @@
{ {
"groupId": "com.ctre.phoenix6.sim", "groupId": "com.ctre.phoenix6.sim",
"artifactId": "simVictorSPX", "artifactId": "simVictorSPX",
"version": "25.4.0", "version": "26.1.3",
"libName": "CTRE_SimVictorSPX", "libName": "CTRE_SimVictorSPX",
"headerClassifier": "headers", "headerClassifier": "headers",
"sharedLibrary": true, "sharedLibrary": true,
@@ -334,7 +320,7 @@
{ {
"groupId": "com.ctre.phoenix6.sim", "groupId": "com.ctre.phoenix6.sim",
"artifactId": "simPigeonIMU", "artifactId": "simPigeonIMU",
"version": "25.4.0", "version": "26.1.3",
"libName": "CTRE_SimPigeonIMU", "libName": "CTRE_SimPigeonIMU",
"headerClassifier": "headers", "headerClassifier": "headers",
"sharedLibrary": true, "sharedLibrary": true,
@@ -347,26 +333,10 @@
], ],
"simMode": "swsim" "simMode": "swsim"
}, },
{
"groupId": "com.ctre.phoenix6.sim",
"artifactId": "simCANCoder",
"version": "25.4.0",
"libName": "CTRE_SimCANCoder",
"headerClassifier": "headers",
"sharedLibrary": true,
"skipInvalidPlatforms": true,
"binaryPlatforms": [
"windowsx86-64",
"linuxx86-64",
"linuxarm64",
"osxuniversal"
],
"simMode": "swsim"
},
{ {
"groupId": "com.ctre.phoenix6.sim", "groupId": "com.ctre.phoenix6.sim",
"artifactId": "simProTalonFX", "artifactId": "simProTalonFX",
"version": "25.4.0", "version": "26.1.3",
"libName": "CTRE_SimProTalonFX", "libName": "CTRE_SimProTalonFX",
"headerClassifier": "headers", "headerClassifier": "headers",
"sharedLibrary": true, "sharedLibrary": true,
@@ -382,7 +352,7 @@
{ {
"groupId": "com.ctre.phoenix6.sim", "groupId": "com.ctre.phoenix6.sim",
"artifactId": "simProTalonFXS", "artifactId": "simProTalonFXS",
"version": "25.4.0", "version": "26.1.3",
"libName": "CTRE_SimProTalonFXS", "libName": "CTRE_SimProTalonFXS",
"headerClassifier": "headers", "headerClassifier": "headers",
"sharedLibrary": true, "sharedLibrary": true,
@@ -398,7 +368,7 @@
{ {
"groupId": "com.ctre.phoenix6.sim", "groupId": "com.ctre.phoenix6.sim",
"artifactId": "simProCANcoder", "artifactId": "simProCANcoder",
"version": "25.4.0", "version": "26.1.3",
"libName": "CTRE_SimProCANcoder", "libName": "CTRE_SimProCANcoder",
"headerClassifier": "headers", "headerClassifier": "headers",
"sharedLibrary": true, "sharedLibrary": true,
@@ -414,7 +384,7 @@
{ {
"groupId": "com.ctre.phoenix6.sim", "groupId": "com.ctre.phoenix6.sim",
"artifactId": "simProPigeon2", "artifactId": "simProPigeon2",
"version": "25.4.0", "version": "26.1.3",
"libName": "CTRE_SimProPigeon2", "libName": "CTRE_SimProPigeon2",
"headerClassifier": "headers", "headerClassifier": "headers",
"sharedLibrary": true, "sharedLibrary": true,
@@ -430,7 +400,7 @@
{ {
"groupId": "com.ctre.phoenix6.sim", "groupId": "com.ctre.phoenix6.sim",
"artifactId": "simProCANrange", "artifactId": "simProCANrange",
"version": "25.4.0", "version": "26.1.3",
"libName": "CTRE_SimProCANrange", "libName": "CTRE_SimProCANrange",
"headerClassifier": "headers", "headerClassifier": "headers",
"sharedLibrary": true, "sharedLibrary": true,
@@ -446,7 +416,7 @@
{ {
"groupId": "com.ctre.phoenix6.sim", "groupId": "com.ctre.phoenix6.sim",
"artifactId": "simProCANdi", "artifactId": "simProCANdi",
"version": "25.4.0", "version": "26.1.3",
"libName": "CTRE_SimProCANdi", "libName": "CTRE_SimProCANdi",
"headerClassifier": "headers", "headerClassifier": "headers",
"sharedLibrary": true, "sharedLibrary": true,
@@ -462,7 +432,7 @@
{ {
"groupId": "com.ctre.phoenix6.sim", "groupId": "com.ctre.phoenix6.sim",
"artifactId": "simProCANdle", "artifactId": "simProCANdle",
"version": "25.4.0", "version": "26.1.3",
"libName": "CTRE_SimProCANdle", "libName": "CTRE_SimProCANdle",
"headerClassifier": "headers", "headerClassifier": "headers",
"sharedLibrary": true, "sharedLibrary": true,

View File

@@ -1,25 +1,55 @@
{ {
"fileName": "REVLib.json", "fileName": "REVLib.json",
"name": "REVLib", "name": "REVLib",
"version": "2025.0.3", "version": "2026.0.5",
"frcYear": "2025", "frcYear": "2026",
"uuid": "3f48eb8c-50fe-43a6-9cb7-44c86353c4cb", "uuid": "3f48eb8c-50fe-43a6-9cb7-44c86353c4cb",
"mavenUrls": [ "mavenUrls": [
"https://maven.revrobotics.com/" "https://maven.revrobotics.com/"
], ],
"jsonUrl": "https://software-metadata.revrobotics.com/REVLib-2025.json", "jsonUrl": "https://software-metadata.revrobotics.com/REVLib-2026.json",
"javaDependencies": [ "javaDependencies": [
{ {
"groupId": "com.revrobotics.frc", "groupId": "com.revrobotics.frc",
"artifactId": "REVLib-java", "artifactId": "REVLib-java",
"version": "2025.0.3" "version": "2026.0.5"
} }
], ],
"jniDependencies": [ "jniDependencies": [
{ {
"groupId": "com.revrobotics.frc", "groupId": "com.revrobotics.frc",
"artifactId": "REVLib-driver", "artifactId": "REVLib-driver",
"version": "2025.0.3", "version": "2026.0.5",
"skipInvalidPlatforms": true,
"isJar": false,
"validPlatforms": [
"windowsx86-64",
"linuxarm64",
"linuxx86-64",
"linuxathena",
"linuxarm32",
"osxuniversal"
]
},
{
"groupId": "com.revrobotics.frc",
"artifactId": "RevLibBackendDriver",
"version": "2026.0.5",
"skipInvalidPlatforms": true,
"isJar": false,
"validPlatforms": [
"windowsx86-64",
"linuxarm64",
"linuxx86-64",
"linuxathena",
"linuxarm32",
"osxuniversal"
]
},
{
"groupId": "com.revrobotics.frc",
"artifactId": "RevLibWpiBackendDriver",
"version": "2026.0.5",
"skipInvalidPlatforms": true, "skipInvalidPlatforms": true,
"isJar": false, "isJar": false,
"validPlatforms": [ "validPlatforms": [
@@ -36,7 +66,7 @@
{ {
"groupId": "com.revrobotics.frc", "groupId": "com.revrobotics.frc",
"artifactId": "REVLib-cpp", "artifactId": "REVLib-cpp",
"version": "2025.0.3", "version": "2026.0.5",
"libName": "REVLib", "libName": "REVLib",
"headerClassifier": "headers", "headerClassifier": "headers",
"sharedLibrary": false, "sharedLibrary": false,
@@ -53,7 +83,7 @@
{ {
"groupId": "com.revrobotics.frc", "groupId": "com.revrobotics.frc",
"artifactId": "REVLib-driver", "artifactId": "REVLib-driver",
"version": "2025.0.3", "version": "2026.0.5",
"libName": "REVLibDriver", "libName": "REVLibDriver",
"headerClassifier": "headers", "headerClassifier": "headers",
"sharedLibrary": false, "sharedLibrary": false,
@@ -66,6 +96,38 @@
"linuxarm32", "linuxarm32",
"osxuniversal" "osxuniversal"
] ]
},
{
"groupId": "com.revrobotics.frc",
"artifactId": "RevLibBackendDriver",
"version": "2026.0.5",
"libName": "BackendDriver",
"sharedLibrary": true,
"skipInvalidPlatforms": true,
"binaryPlatforms": [
"windowsx86-64",
"linuxarm64",
"linuxx86-64",
"linuxathena",
"linuxarm32",
"osxuniversal"
]
},
{
"groupId": "com.revrobotics.frc",
"artifactId": "RevLibWpiBackendDriver",
"version": "2026.0.5",
"libName": "REVLibWpi",
"sharedLibrary": true,
"skipInvalidPlatforms": true,
"binaryPlatforms": [
"windowsx86-64",
"linuxarm64",
"linuxx86-64",
"linuxathena",
"linuxarm32",
"osxuniversal"
]
} }
] ]
} }

View File

@@ -3,7 +3,7 @@
"name": "WPILib-New-Commands", "name": "WPILib-New-Commands",
"version": "1.0.0", "version": "1.0.0",
"uuid": "111e20f7-815e-48f8-9dd6-e675ce75b266", "uuid": "111e20f7-815e-48f8-9dd6-e675ce75b266",
"frcYear": "2025", "frcYear": "2026",
"mavenUrls": [], "mavenUrls": [],
"jsonUrl": "", "jsonUrl": "",
"javaDependencies": [ "javaDependencies": [
@@ -25,6 +25,7 @@
"sharedLibrary": true, "sharedLibrary": true,
"skipInvalidPlatforms": true, "skipInvalidPlatforms": true,
"binaryPlatforms": [ "binaryPlatforms": [
"linuxsystemcore",
"linuxathena", "linuxathena",
"linuxarm32", "linuxarm32",
"linuxarm64", "linuxarm64",