Compare commits

..

8 Commits

66 changed files with 311 additions and 3568 deletions

View File

@ -4,8 +4,8 @@
"holonomicMode": true,
"pathFolders": [],
"autoFolders": [],
"defaultMaxVel": 4.0,
"defaultMaxAccel": 4.0,
"defaultMaxVel": 3.0,
"defaultMaxAccel": 3.0,
"defaultMaxAngVel": 540.0,
"defaultMaxAngAccel": 720.0,
"maxModuleSpeed": 4.03

1
networktables.json Normal file
View File

@ -0,0 +1 @@
[]

97
simgui-ds.json Normal file
View File

@ -0,0 +1,97 @@
{
"keyboardJoysticks": [
{
"axisConfig": [
{
"decKey": 65,
"incKey": 68
},
{
"decKey": 87,
"incKey": 83
},
{
"decKey": 69,
"decayRate": 0.0,
"incKey": 82,
"keyRate": 0.009999999776482582
}
],
"axisCount": 3,
"buttonCount": 4,
"buttonKeys": [
90,
88,
67,
86
],
"povConfig": [
{
"key0": 328,
"key135": 323,
"key180": 322,
"key225": 321,
"key270": 324,
"key315": 327,
"key45": 329,
"key90": 326
}
],
"povCount": 1
},
{
"axisConfig": [
{
"decKey": 74,
"incKey": 76
},
{
"decKey": 73,
"incKey": 75
}
],
"axisCount": 2,
"buttonCount": 4,
"buttonKeys": [
77,
44,
46,
47
],
"povCount": 0
},
{
"axisConfig": [
{
"decKey": 263,
"incKey": 262
},
{
"decKey": 265,
"incKey": 264
}
],
"axisCount": 2,
"buttonCount": 6,
"buttonKeys": [
260,
268,
266,
261,
269,
267
],
"povCount": 0
},
{
"axisCount": 0,
"buttonCount": 0,
"povCount": 0
}
],
"robotJoysticks": [
{
"guid": "Keyboard0"
}
]
}

17
simgui.json Normal file
View File

@ -0,0 +1,17 @@
{
"NTProvider": {
"types": {
"/FMSInfo": "FMSInfo"
}
},
"NetworkTables": {
"transitory": {
"Shuffleboard": {
"open": true
}
}
},
"NetworkTables Info": {
"visible": true
}
}

View File

@ -1,3 +0,0 @@
Files placed in this directory will be deployed to the RoboRIO into the
'deploy' directory in the home folder. Use the 'Filesystem.getDeployDirectory' wpilib function
to get a proper path relative to the deploy directory.

View File

@ -1,118 +0,0 @@
{
"version": 1.0,
"startingPose": {
"position": {
"x": 1.3216735004898588,
"y": 5.55593454044051
},
"rotation": 180.0
},
"command": {
"type": "sequential",
"data": {
"commands": [
{
"type": "named",
"data": {
"name": "Speaker Note Shot"
}
},
{
"type": "parallel",
"data": {
"commands": [
{
"type": "path",
"data": {
"pathName": "Center Sub to Note 1"
}
},
{
"type": "named",
"data": {
"name": "Auto Intake"
}
}
]
}
},
{
"type": "path",
"data": {
"pathName": "Note 1 to Center Sub"
}
},
{
"type": "named",
"data": {
"name": "Speaker Note Shot"
}
},
{
"type": "parallel",
"data": {
"commands": [
{
"type": "path",
"data": {
"pathName": "Center Sub to Note 2"
}
},
{
"type": "named",
"data": {
"name": "Auto Intake"
}
}
]
}
},
{
"type": "path",
"data": {
"pathName": "Note 2 to Center Sub"
}
},
{
"type": "named",
"data": {
"name": "Speaker Note Shot"
}
},
{
"type": "parallel",
"data": {
"commands": [
{
"type": "path",
"data": {
"pathName": "Left Sub to Note 3"
}
},
{
"type": "named",
"data": {
"name": "Auto Intake"
}
}
]
}
},
{
"type": "path",
"data": {
"pathName": "Left Note 3 to Sub"
}
},
{
"type": "named",
"data": {
"name": "Speaker Note Shot"
}
}
]
}
},
"folder": null,
"choreoAuto": false
}

View File

@ -1,37 +0,0 @@
{
"version": 1.0,
"startingPose": {
"position": {
"x": 1.335622956146197,
"y": 5.5196408968316515
},
"rotation": 179.37978729180955
},
"command": {
"type": "sequential",
"data": {
"commands": [
{
"type": "named",
"data": {
"name": "Charge Shooter"
}
},
{
"type": "named",
"data": {
"name": "Speaker Note Shot"
}
},
{
"type": "path",
"data": {
"pathName": "Center Subwoofer to Center"
}
}
]
}
},
"folder": null,
"choreoAuto": false
}

View File

@ -0,0 +1,25 @@
{
"version": 1.0,
"startingPose": {
"position": {
"x": 0.7046435911053639,
"y": 4.3751818412727745
},
"rotation": 120.0
},
"command": {
"type": "sequential",
"data": {
"commands": [
{
"type": "path",
"data": {
"pathName": "From Subwoofer Far Edge to Amp"
}
}
]
}
},
"folder": null,
"choreoAuto": false
}

View File

@ -2,8 +2,8 @@
"version": 1.0,
"startingPose": {
"position": {
"x": 0.9847983228729987,
"y": 1.9646179463299098
"x": 1.29,
"y": 5.58
},
"rotation": 0
},
@ -14,7 +14,7 @@
{
"type": "path",
"data": {
"pathName": "Just Backup"
"pathName": "From Subwoofer Front to Amp"
}
}
]

View File

@ -1,37 +0,0 @@
{
"version": 1.0,
"startingPose": {
"position": {
"x": 0.4585613729632017,
"y": 4.0695657459691
},
"rotation": 180.0
},
"command": {
"type": "sequential",
"data": {
"commands": [
{
"type": "path",
"data": {
"pathName": "Gremlin Start"
}
},
{
"type": "named",
"data": {
"name": "Speaker Note Shot"
}
},
{
"type": "path",
"data": {
"pathName": "Gremlin Path"
}
}
]
}
},
"folder": null,
"choreoAuto": false
}

View File

@ -1,111 +0,0 @@
{
"version": 1.0,
"startingPose": {
"position": {
"x": 0.4936438362905214,
"y": 6.981410202136645
},
"rotation": 180.0
},
"command": {
"type": "sequential",
"data": {
"commands": [
{
"type": "path",
"data": {
"pathName": "Left Subwoofer"
}
},
{
"type": "named",
"data": {
"name": "Charge Shooter"
}
},
{
"type": "named",
"data": {
"name": "Speaker Note Shot"
}
},
{
"type": "parallel",
"data": {
"commands": [
{
"type": "path",
"data": {
"pathName": "L Sub to Note 1"
}
},
{
"type": "named",
"data": {
"name": "Auto Intake"
}
}
]
}
},
{
"type": "path",
"data": {
"pathName": "Note 1 to Speaker"
}
},
{
"type": "named",
"data": {
"name": "Charge Shooter"
}
},
{
"type": "named",
"data": {
"name": "Speaker Note Shot"
}
},
{
"type": "parallel",
"data": {
"commands": [
{
"type": "path",
"data": {
"pathName": "L Sub to Note 2"
}
},
{
"type": "named",
"data": {
"name": "Auto Intake"
}
}
]
}
},
{
"type": "path",
"data": {
"pathName": "Note 2 to L Sub"
}
},
{
"type": "named",
"data": {
"name": "Charge Shooter"
}
},
{
"type": "named",
"data": {
"name": "Speaker Note Shot"
}
}
]
}
},
"folder": null,
"choreoAuto": false
}

View File

@ -1,148 +0,0 @@
{
"version": 1.0,
"startingPose": {
"position": {
"x": 0.5740411480822968,
"y": 7.021880329474945
},
"rotation": 180.0
},
"command": {
"type": "sequential",
"data": {
"commands": [
{
"type": "path",
"data": {
"pathName": "Left Subwoofer"
}
},
{
"type": "named",
"data": {
"name": "Charge Shooter"
}
},
{
"type": "named",
"data": {
"name": "Speaker Note Shot"
}
},
{
"type": "parallel",
"data": {
"commands": [
{
"type": "path",
"data": {
"pathName": "L Sub to Note 1"
}
},
{
"type": "named",
"data": {
"name": "Auto Intake"
}
}
]
}
},
{
"type": "path",
"data": {
"pathName": "Note 1 to Speaker"
}
},
{
"type": "named",
"data": {
"name": "Charge Shooter"
}
},
{
"type": "named",
"data": {
"name": "Speaker Note Shot"
}
},
{
"type": "parallel",
"data": {
"commands": [
{
"type": "path",
"data": {
"pathName": "L Sub to Note 2"
}
},
{
"type": "named",
"data": {
"name": "Auto Intake"
}
}
]
}
},
{
"type": "path",
"data": {
"pathName": "Note 2 to L Sub (4S)"
}
},
{
"type": "named",
"data": {
"name": "Charge Shooter"
}
},
{
"type": "named",
"data": {
"name": "Speaker Note Shot"
}
},
{
"type": "parallel",
"data": {
"commands": [
{
"type": "path",
"data": {
"pathName": "Left Sub to Note 3"
}
},
{
"type": "named",
"data": {
"name": "Auto Intake"
}
}
]
}
},
{
"type": "path",
"data": {
"pathName": "Left Note 3 to Sub"
}
},
{
"type": "named",
"data": {
"name": "Charge Shooter"
}
},
{
"type": "named",
"data": {
"name": "Speaker Note Shot"
}
}
]
}
},
"folder": null,
"choreoAuto": false
}

View File

@ -1,62 +0,0 @@
{
"version": 1.0,
"startingPose": {
"position": {
"x": 0.4936438362905214,
"y": 6.981410202136645
},
"rotation": 180.0
},
"command": {
"type": "sequential",
"data": {
"commands": [
{
"type": "path",
"data": {
"pathName": "Left Subwoofer"
}
},
{
"type": "named",
"data": {
"name": "Charge Shooter"
}
},
{
"type": "named",
"data": {
"name": "Speaker Note Shot"
}
},
{
"type": "parallel",
"data": {
"commands": [
{
"type": "path",
"data": {
"pathName": "L Sub to Note 1"
}
},
{
"type": "named",
"data": {
"name": "Auto Intake"
}
}
]
}
},
{
"type": "path",
"data": {
"pathName": "Note 1 to Speaker"
}
}
]
}
},
"folder": null,
"choreoAuto": false
}

View File

@ -1,62 +0,0 @@
{
"version": 1.0,
"startingPose": {
"position": {
"x": 0.52,
"y": 4.034483282641779
},
"rotation": 180.0
},
"command": {
"type": "sequential",
"data": {
"commands": [
{
"type": "parallel",
"data": {
"commands": [
{
"type": "path",
"data": {
"pathName": "Right Sub"
}
},
{
"type": "named",
"data": {
"name": "Charge Shooter"
}
}
]
}
},
{
"type": "named",
"data": {
"name": "Speaker Note Shot"
}
},
{
"type": "path",
"data": {
"pathName": "Right Sub to Right Center Note"
}
},
{
"type": "path",
"data": {
"pathName": "Right Sub from Center"
}
},
{
"type": "named",
"data": {
"name": "Speaker Note Shot"
}
}
]
}
},
"folder": null,
"choreoAuto": false
}

View File

@ -1,74 +0,0 @@
{
"version": 1.0,
"startingPose": {
"position": {
"x": 0.4936438362905214,
"y": 4.092954054853979
},
"rotation": 180.0
},
"command": {
"type": "sequential",
"data": {
"commands": [
{
"type": "path",
"data": {
"pathName": "Right Wall to Sub"
}
},
{
"type": "named",
"data": {
"name": "Charge Shooter"
}
},
{
"type": "named",
"data": {
"name": "Speaker Note Shot"
}
},
{
"type": "parallel",
"data": {
"commands": [
{
"type": "named",
"data": {
"name": "Auto Intake"
}
},
{
"type": "path",
"data": {
"pathName": "Right Sub Note 3"
}
}
]
}
},
{
"type": "path",
"data": {
"pathName": "Note 3 to Sub"
}
},
{
"type": "named",
"data": {
"name": "Charge Shooter"
}
},
{
"type": "named",
"data": {
"name": "Speaker Note Shot"
}
}
]
}
},
"folder": null,
"choreoAuto": false
}

View File

@ -1,43 +0,0 @@
{
"version": 1.0,
"startingPose": {
"position": {
"x": 1.0578032584636603,
"y": 4.485794114445372
},
"rotation": 141.84277341263092
},
"command": {
"type": "sequential",
"data": {
"commands": [
{
"type": "named",
"data": {
"name": "Charge Shooter"
}
},
{
"type": "wait",
"data": {
"waitTime": 2.0
}
},
{
"type": "named",
"data": {
"name": "Speaker Note Shot"
}
},
{
"type": "path",
"data": {
"pathName": "Right Subwoofer to Center"
}
}
]
}
},
"folder": null,
"choreoAuto": false
}

View File

@ -1,52 +0,0 @@
{
"version": 1.0,
"waypoints": [
{
"anchor": {
"x": 1.3216735004898588,
"y": 5.541275082550166
},
"prevControl": null,
"nextControl": {
"x": 1.7449183616315946,
"y": 5.55472336015897
},
"isLocked": false,
"linkedName": null
},
{
"anchor": {
"x": 2.294543620426272,
"y": 5.541275082550166
},
"prevControl": {
"x": 1.2945436204262721,
"y": 5.541275082550166
},
"nextControl": null,
"isLocked": false,
"linkedName": null
}
],
"rotationTargets": [],
"constraintZones": [],
"eventMarkers": [],
"globalConstraints": {
"maxVelocity": 4.0,
"maxAcceleration": 4.0,
"maxAngularVelocity": 540.0,
"maxAngularAcceleration": 720.0
},
"goalEndState": {
"velocity": 0,
"rotation": 180.0,
"rotateFast": false
},
"reversed": false,
"folder": null,
"previewStartingState": {
"rotation": 180.0,
"velocity": 0
},
"useDefaultConstraints": true
}

View File

@ -1,74 +0,0 @@
{
"version": 1.0,
"waypoints": [
{
"anchor": {
"x": 1.335622956146197,
"y": 5.5196408968316515
},
"prevControl": null,
"nextControl": {
"x": 2.3356229561461985,
"y": 5.5196408968316515
},
"isLocked": false,
"linkedName": null
},
{
"anchor": {
"x": 4.072055095677142,
"y": 5.028486410249174
},
"prevControl": {
"x": 3.364392809755599,
"y": 5.618204981850461
},
"nextControl": {
"x": 4.843869288878178,
"y": 4.385307915914977
},
"isLocked": false,
"linkedName": null
},
{
"anchor": {
"x": 7.299641721790566,
"y": 0.877061583182996
},
"prevControl": {
"x": 6.773404771880769,
"y": 4.046177437084219
},
"nextControl": null,
"isLocked": false,
"linkedName": null
}
],
"rotationTargets": [
{
"waypointRelativePos": 0.9,
"rotationDegrees": 90.25335933192582,
"rotateFast": false
}
],
"constraintZones": [],
"eventMarkers": [],
"globalConstraints": {
"maxVelocity": 4.0,
"maxAcceleration": 4.0,
"maxAngularVelocity": 540.0,
"maxAngularAcceleration": 720.0
},
"goalEndState": {
"velocity": 0,
"rotation": 0,
"rotateFast": false
},
"reversed": false,
"folder": null,
"previewStartingState": {
"rotation": 179.04515874612784,
"velocity": 0
},
"useDefaultConstraints": true
}

View File

@ -3,25 +3,25 @@
"waypoints": [
{
"anchor": {
"x": 1.3216735004898588,
"y": 5.55593454044051
"x": 0.7046435911053639,
"y": 4.3751818412727745
},
"prevControl": null,
"nextControl": {
"x": 1.8054356108712222,
"y": 6.010377735041184
"x": 2.4368920788482864,
"y": 3.1622483921028106
},
"isLocked": false,
"linkedName": null
},
{
"anchor": {
"x": 2.5050384003901907,
"y": 6.829386194384925
"x": 1.82409310273166,
"y": 7.565612949407717
},
"prevControl": {
"x": 2.241168158363992,
"y": 6.433580831345627
"x": 1.8176568333482528,
"y": 6.336387277909188
},
"nextControl": null,
"isLocked": false,
@ -32,20 +32,20 @@
"constraintZones": [],
"eventMarkers": [],
"globalConstraints": {
"maxVelocity": 4.0,
"maxAcceleration": 4.0,
"maxVelocity": 3.0,
"maxAcceleration": 3.0,
"maxAngularVelocity": 540.0,
"maxAngularAcceleration": 720.0
},
"goalEndState": {
"velocity": 0,
"rotation": -151.8214098900407,
"rotation": 89.21368742867472,
"rotateFast": false
},
"reversed": false,
"folder": null,
"previewStartingState": {
"rotation": 180.0,
"rotation": 122.73522627210761,
"velocity": 0
},
"useDefaultConstraints": true

View File

@ -3,25 +3,25 @@
"waypoints": [
{
"anchor": {
"x": 1.1134340217398382,
"y": 6.525338178881486
"x": 1.2945574370576298,
"y": 5.580559282764361
},
"prevControl": null,
"nextControl": {
"x": 1.148516485067158,
"y": 7.191904982100564
"x": 2.2786077412442953,
"y": 5.580559282764361
},
"isLocked": false,
"linkedName": null
},
{
"anchor": {
"x": 2.3179319293111518,
"y": 6.981410202136645
"x": 1.8232420006879377,
"y": 7.533755031731888
},
"prevControl": {
"x": 1.8033891338437944,
"y": 6.981410202136645
"x": 1.8232420006879377,
"y": 6.694612522270728
},
"nextControl": null,
"isLocked": false,
@ -32,20 +32,20 @@
"constraintZones": [],
"eventMarkers": [],
"globalConstraints": {
"maxVelocity": 4.0,
"maxAcceleration": 4.0,
"maxVelocity": 3.0,
"maxAcceleration": 3.0,
"maxAngularVelocity": 540.0,
"maxAngularAcceleration": 720.0
},
"goalEndState": {
"velocity": 0,
"rotation": 0,
"rotation": 90.0,
"rotateFast": false
},
"reversed": false,
"folder": null,
"previewStartingState": {
"rotation": 40.97173633351488,
"rotation": 0,
"velocity": 0
},
"useDefaultConstraints": true

View File

@ -1,123 +0,0 @@
{
"version": 1.0,
"waypoints": [
{
"anchor": {
"x": 0.8912450873334795,
"y": 4.4671669970120575
},
"prevControl": null,
"nextControl": {
"x": 1.8912450873334783,
"y": 4.4671669970120575
},
"isLocked": false,
"linkedName": null
},
{
"anchor": {
"x": 4.013584323464943,
"y": 1.9763121007723505
},
"prevControl": {
"x": 1.9257282443058341,
"y": 3.278151773659794
},
"nextControl": {
"x": 5.007587451072338,
"y": 1.3565219153230341
},
"isLocked": false,
"linkedName": null
},
{
"anchor": {
"x": 8.56261040157408,
"y": 1.2278862164561943
},
"prevControl": {
"x": 8.317033158282841,
"y": 0.09355323553951994
},
"nextControl": {
"x": 8.686725702060071,
"y": 1.801180699653394
},
"isLocked": false,
"linkedName": null
},
{
"anchor": {
"x": 8.761411027095559,
"y": 6.478561561111727
},
"prevControl": {
"x": 8.843270108192637,
"y": 4.794603321400375
},
"nextControl": {
"x": 8.68370806922782,
"y": 8.077022408676678
},
"isLocked": false,
"linkedName": null
},
{
"anchor": {
"x": 6.30563859418317,
"y": 7.203599136543003
},
"prevControl": {
"x": 7.451665729542288,
"y": 7.051575128791285
},
"nextControl": null,
"isLocked": false,
"linkedName": null
}
],
"rotationTargets": [
{
"waypointRelativePos": 1.7,
"rotationDegrees": -178.9636039256695,
"rotateFast": true
},
{
"waypointRelativePos": 2.15,
"rotationDegrees": 151.60505283278198,
"rotateFast": true
}
],
"constraintZones": [
{
"name": "New Constraints Zone",
"minWaypointRelativePos": 1.7,
"maxWaypointRelativePos": 2.4,
"constraints": {
"maxVelocity": 3.0,
"maxAcceleration": 4.0,
"maxAngularVelocity": 540.0,
"maxAngularAcceleration": 720.0
}
}
],
"eventMarkers": [],
"globalConstraints": {
"maxVelocity": 4.0,
"maxAcceleration": 4.0,
"maxAngularVelocity": 540.0,
"maxAngularAcceleration": 720.0
},
"goalEndState": {
"velocity": 0,
"rotation": 64.23067237566114,
"rotateFast": false
},
"reversed": false,
"folder": null,
"previewStartingState": {
"rotation": 132.61405596961126,
"velocity": 0
},
"useDefaultConstraints": true
}

View File

@ -1,52 +0,0 @@
{
"version": 1.0,
"waypoints": [
{
"anchor": {
"x": 0.66,
"y": 4.38
},
"prevControl": null,
"nextControl": {
"x": 0.8945513262455097,
"y": 3.688073587575746
},
"isLocked": false,
"linkedName": null
},
{
"anchor": {
"x": 0.9539344375942316,
"y": 4.503791885637482
},
"prevControl": {
"x": 1.3164532253098697,
"y": 4.117884789036965
},
"nextControl": null,
"isLocked": false,
"linkedName": null
}
],
"rotationTargets": [],
"constraintZones": [],
"eventMarkers": [],
"globalConstraints": {
"maxVelocity": 4.0,
"maxAcceleration": 4.0,
"maxAngularVelocity": 540.0,
"maxAngularAcceleration": 720.0
},
"goalEndState": {
"velocity": 0,
"rotation": 133.4021151464655,
"rotateFast": false
},
"reversed": false,
"folder": null,
"previewStartingState": {
"rotation": 119.88721357012417,
"velocity": 0
},
"useDefaultConstraints": true
}

View File

@ -1,52 +0,0 @@
{
"version": 1.0,
"waypoints": [
{
"anchor": {
"x": 0.9847983228729987,
"y": 1.9646179463299098
},
"prevControl": null,
"nextControl": {
"x": 1.9847983228729973,
"y": 1.9646179463299098
},
"isLocked": false,
"linkedName": null
},
{
"anchor": {
"x": 2.6453682536994707,
"y": 1.9646179463299098
},
"prevControl": {
"x": 1.6453682536994707,
"y": 1.9646179463299098
},
"nextControl": null,
"isLocked": false,
"linkedName": null
}
],
"rotationTargets": [],
"constraintZones": [],
"eventMarkers": [],
"globalConstraints": {
"maxVelocity": 4.0,
"maxAcceleration": 4.0,
"maxAngularVelocity": 540.0,
"maxAngularAcceleration": 720.0
},
"goalEndState": {
"velocity": 0,
"rotation": 0,
"rotateFast": false
},
"reversed": false,
"folder": null,
"previewStartingState": {
"rotation": 1.3971810272964678,
"velocity": 0
},
"useDefaultConstraints": true
}

View File

@ -1,69 +0,0 @@
{
"version": 1.0,
"waypoints": [
{
"anchor": {
"x": 1.4408703461281565,
"y": 6.583808951093687
},
"prevControl": null,
"nextControl": {
"x": 1.8852482149408742,
"y": 7.121740055445923
},
"isLocked": false,
"linkedName": null
},
{
"anchor": {
"x": 2.7272273347965497,
"y": 6.876162812154685
},
"prevControl": {
"x": 2.259461157098952,
"y": 6.864468657712245
},
"nextControl": null,
"isLocked": false,
"linkedName": null
}
],
"rotationTargets": [
{
"waypointRelativePos": 0.45,
"rotationDegrees": 179.22679798216734,
"rotateFast": true
}
],
"constraintZones": [],
"eventMarkers": [
{
"name": "New Event Marker",
"waypointRelativePos": 0.1,
"command": {
"type": "parallel",
"data": {
"commands": []
}
}
}
],
"globalConstraints": {
"maxVelocity": 4.0,
"maxAcceleration": 4.0,
"maxAngularVelocity": 540.0,
"maxAngularAcceleration": 720.0
},
"goalEndState": {
"velocity": 0,
"rotation": 180.0,
"rotateFast": false
},
"reversed": false,
"folder": null,
"previewStartingState": {
"rotation": -145.66978280449663,
"velocity": 0
},
"useDefaultConstraints": true
}

View File

@ -1,58 +0,0 @@
{
"version": 1.0,
"waypoints": [
{
"anchor": {
"x": 1.5578118905525558,
"y": 6.4083966344570875
},
"prevControl": null,
"nextControl": {
"x": 1.9671072960379536,
"y": 6.349925862244889
},
"isLocked": false,
"linkedName": null
},
{
"anchor": {
"x": 2.6687565625843503,
"y": 5.613194132371171
},
"prevControl": {
"x": 2.306237774868712,
"y": 5.999101228971689
},
"nextControl": null,
"isLocked": false,
"linkedName": null
}
],
"rotationTargets": [
{
"waypointRelativePos": 0.7,
"rotationDegrees": 136.8500052941468,
"rotateFast": true
}
],
"constraintZones": [],
"eventMarkers": [],
"globalConstraints": {
"maxVelocity": 4.0,
"maxAcceleration": 4.0,
"maxAngularVelocity": 540.0,
"maxAngularAcceleration": 720.0
},
"goalEndState": {
"velocity": 0,
"rotation": 139.08561677997477,
"rotateFast": false
},
"reversed": false,
"folder": null,
"previewStartingState": {
"rotation": -148.523160650416,
"velocity": 0
},
"useDefaultConstraints": true
}

View File

@ -1,52 +0,0 @@
{
"version": 1.0,
"waypoints": [
{
"anchor": {
"x": 2.2594611570989525,
"y": 4.560720232551577
},
"prevControl": null,
"nextControl": {
"x": 2.130825458232113,
"y": 4.946627329152095
},
"isLocked": false,
"linkedName": null
},
{
"anchor": {
"x": 1.3707054194735169,
"y": 5.5196408968316515
},
"prevControl": {
"x": 1.8267774427286747,
"y": 5.285757807982852
},
"nextControl": null,
"isLocked": false,
"linkedName": null
}
],
"rotationTargets": [],
"constraintZones": [],
"eventMarkers": [],
"globalConstraints": {
"maxVelocity": 4.0,
"maxAcceleration": 4.0,
"maxAngularVelocity": 540.0,
"maxAngularAcceleration": 720.0
},
"goalEndState": {
"velocity": 0,
"rotation": 180.0,
"rotateFast": false
},
"reversed": false,
"folder": null,
"previewStartingState": {
"rotation": 144.46232220802574,
"velocity": 0
},
"useDefaultConstraints": true
}

View File

@ -1,52 +0,0 @@
{
"version": 1.0,
"waypoints": [
{
"anchor": {
"x": 1.5812001994374358,
"y": 6.221290163378048
},
"prevControl": null,
"nextControl": {
"x": 1.932024832710634,
"y": 5.70674736791069
},
"isLocked": false,
"linkedName": null
},
{
"anchor": {
"x": 2.2243786937716323,
"y": 4.151424827066179
},
"prevControl": {
"x": 0.7041386162544403,
"y": 4.350225452587658
},
"nextControl": null,
"isLocked": false,
"linkedName": null
}
],
"rotationTargets": [],
"constraintZones": [],
"eventMarkers": [],
"globalConstraints": {
"maxVelocity": 4.0,
"maxAcceleration": 4.0,
"maxAngularVelocity": 540.0,
"maxAngularAcceleration": 720.0
},
"goalEndState": {
"velocity": 0,
"rotation": 171.86989764584402,
"rotateFast": false
},
"reversed": false,
"folder": null,
"previewStartingState": {
"rotation": -160.6410058243053,
"velocity": 0
},
"useDefaultConstraints": true
}

View File

@ -1,52 +0,0 @@
{
"version": 1.0,
"waypoints": [
{
"anchor": {
"x": 0.4936438362905214,
"y": 6.981410202136645
},
"prevControl": null,
"nextControl": {
"x": 1.3941696612245824,
"y": 6.981410202136645
},
"isLocked": false,
"linkedName": null
},
{
"anchor": {
"x": 1.382399573915957,
"y": 5.964018765644369
},
"prevControl": {
"x": 1.8150832882862347,
"y": 6.268066781147808
},
"nextControl": null,
"isLocked": false,
"linkedName": null
}
],
"rotationTargets": [],
"constraintZones": [],
"eventMarkers": [],
"globalConstraints": {
"maxVelocity": 4.0,
"maxAcceleration": 4.0,
"maxAngularVelocity": 540.0,
"maxAngularAcceleration": 720.0
},
"goalEndState": {
"velocity": 0,
"rotation": -164.4071890607336,
"rotateFast": false
},
"reversed": false,
"folder": null,
"previewStartingState": {
"rotation": -178.6677801461302,
"velocity": 0
},
"useDefaultConstraints": true
}

View File

@ -1,102 +0,0 @@
{
"version": 1.0,
"waypoints": [
{
"anchor": {
"x": 3.347017520241028,
"y": 6.993104356575341
},
"prevControl": null,
"nextControl": {
"x": 4.446268037830382,
"y": 7.110045900999739
},
"isLocked": false,
"linkedName": null
},
{
"anchor": {
"x": 6.071755505338439,
"y": 7.297152372084174
},
"prevControl": {
"x": 5.077752377722138,
"y": 7.262069908751458
},
"nextControl": {
"x": 6.725659674531382,
"y": 7.320231342764915
},
"isLocked": false,
"linkedName": null
},
{
"anchor": {
"x": 7.63877220062539,
"y": 7.425788070951012
},
"prevControl": {
"x": 6.621380764133118,
"y": 7.460870534278332
},
"nextControl": {
"x": 8.656163637117663,
"y": 7.390705607623692
},
"isLocked": false,
"linkedName": null
},
{
"anchor": {
"x": 3.545818145767345,
"y": 6.642279723305886
},
"prevControl": {
"x": 6.323179825848877,
"y": 7.12758713266797
},
"nextControl": null,
"isLocked": false,
"linkedName": null
}
],
"rotationTargets": [
{
"waypointRelativePos": 1,
"rotationDegrees": 172.50414236027015,
"rotateFast": false
}
],
"constraintZones": [
{
"name": "New Constraints Zone",
"minWaypointRelativePos": 0.85,
"maxWaypointRelativePos": 1.35,
"constraints": {
"maxVelocity": 1.5,
"maxAcceleration": 3.0,
"maxAngularVelocity": 540.0,
"maxAngularAcceleration": 720.0
}
}
],
"eventMarkers": [],
"globalConstraints": {
"maxVelocity": 4.0,
"maxAcceleration": 4.0,
"maxAngularVelocity": 540.0,
"maxAngularAcceleration": 720.0
},
"goalEndState": {
"velocity": 1.5,
"rotation": -179.23610153906992,
"rotateFast": false
},
"reversed": false,
"folder": null,
"previewStartingState": {
"rotation": 0,
"velocity": 0
},
"useDefaultConstraints": true
}

View File

@ -1,52 +0,0 @@
{
"version": 1.0,
"waypoints": [
{
"anchor": {
"x": 2.230559889691208,
"y": 6.640734424325992
},
"prevControl": null,
"nextControl": {
"x": 1.8200950687615667,
"y": 5.863783156137741
},
"isLocked": false,
"linkedName": null
},
{
"anchor": {
"x": 1.3070140425995143,
"y": 5.570593998330854
},
"prevControl": {
"x": 1.8494139845422553,
"y": 5.629231829892232
},
"nextControl": null,
"isLocked": false,
"linkedName": null
}
],
"rotationTargets": [],
"constraintZones": [],
"eventMarkers": [],
"globalConstraints": {
"maxVelocity": 4.0,
"maxAcceleration": 4.0,
"maxAngularVelocity": 540.0,
"maxAngularAcceleration": 720.0
},
"goalEndState": {
"velocity": 0,
"rotation": 180.0,
"rotateFast": false
},
"reversed": false,
"folder": null,
"previewStartingState": {
"rotation": 180.0,
"velocity": 0
},
"useDefaultConstraints": true
}

View File

@ -1,52 +0,0 @@
{
"version": 1.0,
"waypoints": [
{
"anchor": {
"x": 2.0,
"y": 7.0
},
"prevControl": null,
"nextControl": {
"x": 3.0,
"y": 7.0
},
"isLocked": false,
"linkedName": null
},
{
"anchor": {
"x": 1.3707054194735169,
"y": 5.940630456759489
},
"prevControl": {
"x": 1.8150832882862349,
"y": 6.1745135456082885
},
"nextControl": null,
"isLocked": false,
"linkedName": null
}
],
"rotationTargets": [],
"constraintZones": [],
"eventMarkers": [],
"globalConstraints": {
"maxVelocity": 4.0,
"maxAcceleration": 4.0,
"maxAngularVelocity": 540.0,
"maxAngularAcceleration": 720.0
},
"goalEndState": {
"velocity": 0,
"rotation": -165.25643716352937,
"rotateFast": false
},
"reversed": false,
"folder": null,
"previewStartingState": {
"rotation": 179.55484341368705,
"velocity": 0
},
"useDefaultConstraints": true
}

View File

@ -1,52 +0,0 @@
{
"version": 1.0,
"waypoints": [
{
"anchor": {
"x": 2.503225806451614,
"y": 5.535411299394028
},
"prevControl": null,
"nextControl": {
"x": 2.016531804492181,
"y": 5.541275082550166
},
"isLocked": false,
"linkedName": null
},
{
"anchor": {
"x": 1.3480605246924788,
"y": 5.535411299394028
},
"prevControl": {
"x": 1.6881599477484674,
"y": 5.55300264886244
},
"nextControl": null,
"isLocked": false,
"linkedName": null
}
],
"rotationTargets": [],
"constraintZones": [],
"eventMarkers": [],
"globalConstraints": {
"maxVelocity": 4.0,
"maxAcceleration": 4.0,
"maxAngularVelocity": 540.0,
"maxAngularAcceleration": 720.0
},
"goalEndState": {
"velocity": 0,
"rotation": -178.53119928561404,
"rotateFast": false
},
"reversed": false,
"folder": null,
"previewStartingState": {
"rotation": 180.0,
"velocity": 0
},
"useDefaultConstraints": true
}

View File

@ -1,58 +0,0 @@
{
"version": 1.0,
"waypoints": [
{
"anchor": {
"x": 2.1776020760018726,
"y": 5.964018765644369
},
"prevControl": null,
"nextControl": {
"x": 1.8267774427286747,
"y": 5.928936302317049
},
"isLocked": false,
"linkedName": null
},
{
"anchor": {
"x": 1.3005404928188775,
"y": 5.5430292057165325
},
"prevControl": {
"x": 1.674753434976956,
"y": 5.683359059025812
},
"nextControl": null,
"isLocked": false,
"linkedName": null
}
],
"rotationTargets": [
{
"waypointRelativePos": 0.5,
"rotationDegrees": -164.3011806576524,
"rotateFast": false
}
],
"constraintZones": [],
"eventMarkers": [],
"globalConstraints": {
"maxVelocity": 4.0,
"maxAcceleration": 4.0,
"maxAngularVelocity": 540.0,
"maxAngularAcceleration": 720.0
},
"goalEndState": {
"velocity": 0,
"rotation": 180.0,
"rotateFast": false
},
"reversed": false,
"folder": null,
"previewStartingState": {
"rotation": 150.25511870305772,
"velocity": 0
},
"useDefaultConstraints": true
}

View File

@ -1,58 +0,0 @@
{
"version": 1.0,
"waypoints": [
{
"anchor": {
"x": 2.1776020760018726,
"y": 5.964018765644369
},
"prevControl": null,
"nextControl": {
"x": 1.9671072960379539,
"y": 6.209596008935608
},
"isLocked": false,
"linkedName": null
},
{
"anchor": {
"x": 1.2537638750491173,
"y": 6.385008325572207
},
"prevControl": {
"x": 1.6279768172071958,
"y": 6.525338178881487
},
"nextControl": null,
"isLocked": false,
"linkedName": null
}
],
"rotationTargets": [
{
"waypointRelativePos": 0.5,
"rotationDegrees": -164.3011806576524,
"rotateFast": false
}
],
"constraintZones": [],
"eventMarkers": [],
"globalConstraints": {
"maxVelocity": 4.0,
"maxAcceleration": 4.0,
"maxAngularVelocity": 540.0,
"maxAngularAcceleration": 720.0
},
"goalEndState": {
"velocity": 0,
"rotation": -152.10272896905224,
"rotateFast": false
},
"reversed": false,
"folder": null,
"previewStartingState": {
"rotation": 150.25511870305772,
"velocity": 0
},
"useDefaultConstraints": true
}

View File

@ -1,52 +0,0 @@
{
"version": 1.0,
"waypoints": [
{
"anchor": {
"x": 2.142519612674553,
"y": 4.163118981508619
},
"prevControl": null,
"nextControl": {
"x": 1.756612516074035,
"y": 3.964318355987141
},
"isLocked": false,
"linkedName": null
},
{
"anchor": {
"x": 1.171904793952038,
"y": 4.701050085860856
},
"prevControl": {
"x": 1.8501657516135543,
"y": 3.9643183559871393
},
"nextControl": null,
"isLocked": false,
"linkedName": null
}
],
"rotationTargets": [],
"constraintZones": [],
"eventMarkers": [],
"globalConstraints": {
"maxVelocity": 4.0,
"maxAcceleration": 4.0,
"maxAngularVelocity": 540.0,
"maxAngularAcceleration": 720.0
},
"goalEndState": {
"velocity": 0,
"rotation": 140.0131137550358,
"rotateFast": false
},
"reversed": false,
"folder": null,
"previewStartingState": {
"rotation": 178.40885972880548,
"velocity": 0
},
"useDefaultConstraints": true
}

View File

@ -1,58 +0,0 @@
{
"version": 1.0,
"waypoints": [
{
"anchor": {
"x": 1.3005404928188775,
"y": 4.397002070357417
},
"prevControl": null,
"nextControl": {
"x": 1.7683066705164747,
"y": 4.361919607030098
},
"isLocked": false,
"linkedName": null
},
{
"anchor": {
"x": 2.3647085470809115,
"y": 4.081259900411539
},
"prevControl": {
"x": 1.8029020887081402,
"y": 4.081259900411539
},
"nextControl": null,
"isLocked": false,
"linkedName": null
}
],
"rotationTargets": [
{
"waypointRelativePos": 1.0,
"rotationDegrees": 180.0,
"rotateFast": true
}
],
"constraintZones": [],
"eventMarkers": [],
"globalConstraints": {
"maxVelocity": 4.0,
"maxAcceleration": 4.0,
"maxAngularVelocity": 540.0,
"maxAngularAcceleration": 720.0
},
"goalEndState": {
"velocity": 0,
"rotation": 180.0,
"rotateFast": false
},
"reversed": false,
"folder": null,
"previewStartingState": {
"rotation": 131.18592516570968,
"velocity": 0
},
"useDefaultConstraints": true
}

View File

@ -1,52 +0,0 @@
{
"version": 1.0,
"waypoints": [
{
"anchor": {
"x": 5.335023775460655,
"y": 1.1577212898015548
},
"prevControl": null,
"nextControl": {
"x": 3.803089543501023,
"y": 0.9472265098376356
},
"isLocked": false,
"linkedName": null
},
{
"anchor": {
"x": 1.0432690950851984,
"y": 4.478861151454497
},
"prevControl": {
"x": 2.013883913807713,
"y": 1.5436283864020721
},
"nextControl": null,
"isLocked": false,
"linkedName": null
}
],
"rotationTargets": [],
"constraintZones": [],
"eventMarkers": [],
"globalConstraints": {
"maxVelocity": 4.0,
"maxAcceleration": 4.0,
"maxAngularVelocity": 540.0,
"maxAngularAcceleration": 720.0
},
"goalEndState": {
"velocity": 0,
"rotation": 143.130102354156,
"rotateFast": false
},
"reversed": false,
"folder": null,
"previewStartingState": {
"rotation": 180.0,
"velocity": 0
},
"useDefaultConstraints": true
}

View File

@ -1,76 +0,0 @@
{
"version": 1.0,
"waypoints": [
{
"anchor": {
"x": 1.335622956146197,
"y": 4.315142989260338
},
"prevControl": null,
"nextControl": {
"x": 1.8735540604984342,
"y": 1.4149926875352343
},
"isLocked": false,
"linkedName": null
},
{
"anchor": {
"x": 7.603689737294005,
"y": 0.8068966565283563
},
"prevControl": {
"x": 6.603689737294005,
"y": 0.8068966565283563
},
"nextControl": null,
"isLocked": false,
"linkedName": null
}
],
"rotationTargets": [
{
"waypointRelativePos": 0.6,
"rotationDegrees": 180.0,
"rotateFast": false
}
],
"constraintZones": [],
"eventMarkers": [
{
"name": "Note Pickup",
"waypointRelativePos": 0.6,
"command": {
"type": "parallel",
"data": {
"commands": [
{
"type": "named",
"data": {
"name": "Note Pickup"
}
}
]
}
}
}
],
"globalConstraints": {
"maxVelocity": 4.0,
"maxAcceleration": 4.0,
"maxAngularVelocity": 540.0,
"maxAngularAcceleration": 720.0
},
"goalEndState": {
"velocity": 0,
"rotation": 180.0,
"rotateFast": false
},
"reversed": false,
"folder": null,
"previewStartingState": {
"rotation": 139.21417852273407,
"velocity": 0
},
"useDefaultConstraints": true
}

View File

@ -1,52 +0,0 @@
{
"version": 1.0,
"waypoints": [
{
"anchor": {
"x": 0.52,
"y": 4.034483282641779
},
"prevControl": null,
"nextControl": {
"x": 1.0783515584179242,
"y": 3.5199404871715854
},
"isLocked": false,
"linkedName": null
},
{
"anchor": {
"x": 1.2186814117217974,
"y": 4.677661776975976
},
"prevControl": {
"x": 1.9904956049228333,
"y": 4.174813135951059
},
"nextControl": null,
"isLocked": false,
"linkedName": null
}
],
"rotationTargets": [],
"constraintZones": [],
"eventMarkers": [],
"globalConstraints": {
"maxVelocity": 4.0,
"maxAcceleration": 4.0,
"maxAngularVelocity": 540.0,
"maxAngularAcceleration": 720.0
},
"goalEndState": {
"velocity": 0,
"rotation": 143.9726266148963,
"rotateFast": false
},
"reversed": false,
"folder": null,
"previewStartingState": {
"rotation": -178.76146677965983,
"velocity": 0
},
"useDefaultConstraints": true
}

View File

@ -1,52 +0,0 @@
{
"version": 1.0,
"waypoints": [
{
"anchor": {
"x": 1.0578032584636603,
"y": 4.485794114445372
},
"prevControl": null,
"nextControl": {
"x": 1.5708842846257125,
"y": 2.6240429623716395
},
"isLocked": false,
"linkedName": null
},
{
"anchor": {
"x": 7.639899851228273,
"y": 0.7769512681882514
},
"prevControl": {
"x": 6.639899851228273,
"y": 0.7769512681882514
},
"nextControl": null,
"isLocked": false,
"linkedName": null
}
],
"rotationTargets": [],
"constraintZones": [],
"eventMarkers": [],
"globalConstraints": {
"maxVelocity": 4.0,
"maxAcceleration": 4.0,
"maxAngularVelocity": 540.0,
"maxAngularAcceleration": 720.0
},
"goalEndState": {
"velocity": 0,
"rotation": 180.0,
"rotateFast": false
},
"reversed": false,
"folder": null,
"previewStartingState": {
"rotation": 144.68878656036674,
"velocity": 0
},
"useDefaultConstraints": true
}

View File

@ -1,52 +0,0 @@
{
"version": 1.0,
"waypoints": [
{
"anchor": {
"x": 0.4936438362905214,
"y": 4.092954054853979
},
"prevControl": null,
"nextControl": {
"x": 1.359011265031077,
"y": 4.034483282641779
},
"isLocked": false,
"linkedName": null
},
{
"anchor": {
"x": 1.2186814117217974,
"y": 4.736132549188175
},
"prevControl": {
"x": 1.2303755661642373,
"y": 4.350225452587658
},
"nextControl": null,
"isLocked": false,
"linkedName": null
}
],
"rotationTargets": [],
"constraintZones": [],
"eventMarkers": [],
"globalConstraints": {
"maxVelocity": 4.0,
"maxAcceleration": 4.0,
"maxAngularVelocity": 540.0,
"maxAngularAcceleration": 720.0
},
"goalEndState": {
"velocity": 0,
"rotation": 141.76617482255304,
"rotateFast": false
},
"reversed": false,
"folder": null,
"previewStartingState": {
"rotation": 180.0,
"velocity": 0
},
"useDefaultConstraints": true
}

View File

@ -1,13 +0,0 @@
package frc.robot.Commands;
import edu.wpi.first.wpilibj2.command.ParallelCommandGroup;
import frc.robot.subsystems.Indexer;
import frc.robot.subsystems.Shooter;
public class AmpHandoff extends ParallelCommandGroup{
AmpHandoff(Indexer indexer, Shooter shooter){
//addCommands(indexer.shootNote(() -> 1), shooter.ampHandoff());
}
}

View File

@ -1,13 +0,0 @@
package frc.robot.Commands;
import edu.wpi.first.wpilibj2.command.ParallelCommandGroup;
import frc.robot.constants.ShooterConstants;
import frc.robot.subsystems.Indexer;
import frc.robot.subsystems.Shooter;
public class SpeakerShot extends ParallelCommandGroup{
SpeakerShot(Indexer indexer, Shooter shooter){
//addCommands(shooter.angleSpeedsSetpoints(ShooterConstants.kShooterLoadAngle, 0, 0), indexer.shootNote(() -> 1.0));
}
}

View File

@ -1,32 +0,0 @@
package frc.robot.Commands;
import java.util.function.BooleanSupplier;
import edu.wpi.first.wpilibj2.command.Command;
import frc.robot.constants.IntakeConstants;
import frc.robot.subsystems.Intake;
public class autoIntaking extends Command{
private Intake m_intake;
private BooleanSupplier m_beamBreak;
public autoIntaking(Intake intake, BooleanSupplier beamBreak){
m_intake = intake;
m_beamBreak = beamBreak;
addRequirements(intake);
}
@Override
public void execute(){
m_intake.intakeControl(() -> IntakeConstants.kDownAngle, () -> 1.0);
}
@Override
public boolean isFinished(){
if(!m_beamBreak.getAsBoolean()){
return true;
}else {return false;}
}
}

View File

@ -4,455 +4,82 @@
package frc.robot;
import java.io.IOException;
import java.util.Optional;
import com.pathplanner.lib.auto.AutoBuilder;
import com.pathplanner.lib.auto.NamedCommands;
import com.pathplanner.lib.util.PPLibTelemetry;
import com.pathplanner.lib.util.PathPlannerLogging;
import edu.wpi.first.math.MathUtil;
import edu.wpi.first.math.geometry.Pose2d;
import edu.wpi.first.math.geometry.Transform3d;
import edu.wpi.first.math.util.Units;
import edu.wpi.first.wpilibj.DriverStation;
import edu.wpi.first.wpilibj.RobotBase;
import edu.wpi.first.wpilibj.GenericHID.RumbleType;
import edu.wpi.first.wpilibj.shuffleboard.BuiltInWidgets;
import edu.wpi.first.wpilibj.shuffleboard.Shuffleboard;
import edu.wpi.first.wpilibj.shuffleboard.ShuffleboardTab;
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.Commands;
import edu.wpi.first.wpilibj2.command.InstantCommand;
import edu.wpi.first.wpilibj2.command.PrintCommand;
import edu.wpi.first.wpilibj2.command.RunCommand;
import edu.wpi.first.wpilibj2.command.WaitCommand;
import edu.wpi.first.wpilibj2.command.button.CommandXboxController;
import edu.wpi.first.wpilibj2.command.button.Trigger;
import frc.robot.Commands.autoIntaking;
import frc.robot.constants.IntakeConstants;
import frc.robot.constants.OIConstants;
import frc.robot.constants.PhotonConstants;
import frc.robot.constants.ShooterConstants;
import frc.robot.subsystems.Climber;
import frc.robot.subsystems.Drivetrain;
import frc.robot.subsystems.Indexer;
import frc.robot.utilities.PhotonVision;
import frc.robot.subsystems.Intake;
import frc.robot.subsystems.Shooter;
import frc.robot.utilities.PoseSendable;
public class RobotContainer {
private static final String kAutoTabName = "Autonomous";
private static final String kTeleopTabName = "Teloperated";
//private PhotonVision photonvision;
private Drivetrain drivetrain;
private Intake intake;
private Shooter shooter;
private Climber climber;
private Indexer indexer;
private CommandXboxController driver;
private CommandXboxController operator;
private Trigger isTeleopTrigger;
private Trigger isEnabledTrigger;
private Trigger indexerBeamBreakWatcher;
private PoseSendable poseSendable;
private SendableChooser<Command> autoChooser;
private int ampTagID;
// TODO There's more than one source tag, how do we want to handle this?
private int sourceTagID;
// TODO There's more than one speaker tag, how do we want to handle this?
private int speakerTag;
private boolean setAmpAngle;
private boolean intakeDown;
private boolean invertXYDrive;
public RobotContainer() {
/*try {
photonvision = new PhotonVision(
PhotonConstants.kCameraName,
PhotonConstants.kCameraTransform,
PhotonConstants.kCameraHeightMeters,
PhotonConstants.kCameraPitchRadians
);
} catch (IOException e) {
photonvision = null;
}*/
// TODO Need to provide a real initial pose
// TODO Need to provide a real IAprilTagProvider, null means we're not using one at all
// TODO Need to provide a real VisualPoseProvider, null means we're not using one at all
drivetrain = new Drivetrain(new Pose2d(), null, null);
intake = new Intake();
indexer = new Indexer();
shooter = new Shooter(indexer::getBeamBreak);
climber = new Climber(shooter::getShooterAngle);
NamedCommands.registerCommand(
"Charge Shooter 2 Sec",
shooter.angleSpeedsSetpoints(
() -> ShooterConstants.kShooterLoadAngle,
1.0,
1.0
).withTimeout(2.0)
);
/*
NamedCommands.registerCommand(
"Speaker Note Shot",
Commands.parallel(
shooter.angleSpeedsSetpoints(
() -> ShooterConstants.kShooterLoadAngle,
1.0,
1.0
),
indexer.shootNote(() -> 1.0)
).withTimeout(1.0)
);
*/
NamedCommands.registerCommand(
"Speaker Note Shot",
shooter.angleSpeedsSetpoints(
() -> ShooterConstants.kShooterLoadAngle,
1.0,
1.0
).raceWith(
new WaitCommand(1.0)
).andThen(
shooter.angleSpeedsSetpoints(
() -> ShooterConstants.kShooterLoadAngle,
1.0,
1.0
).alongWith(indexer.shootNote(() -> 1.0))
.withTimeout(0.75)
)
);
/*
NamedCommands.registerCommand(
"Auto Intake",
Commands.parallel(
intake.intakeControl(
() -> IntakeConstants.kDownAngle,
() -> 1.0
),
indexer.advanceNote()
).until(() -> !indexer.getBeamBreak())
.withTimeout(1.0)
);*/
NamedCommands.registerCommand(
"Auto Intake",
intake.intakeControl(
() -> IntakeConstants.kDownAngle,
() -> 1.0
).alongWith(
indexer.advanceNote()
).until(() -> !indexer.getBeamBreak())
.andThen(
intake.stopAll()
)
.withTimeout(2.5)
);
//NamedCommands.registerCommand("Auto Intake", new PrintCommand("Intake Note"));
// An example Named Command, doesn't need to remain once we start actually adding real things
// ALL Named Commands need to be defined AFTER subsystem initialization and BEFORE auto/controller configuration
NamedCommands.registerCommand("Set Drivetrain X", drivetrain.setXCommand());
// TODO Specify a default auto string once we have one
autoChooser = AutoBuilder.buildAutoChooser();
drivetrain = new Drivetrain(new Pose2d());
driver = new CommandXboxController(OIConstants.kPrimaryXboxUSB);
operator = new CommandXboxController(OIConstants.kSecondaryXboxUSB);
isTeleopTrigger = new Trigger(DriverStation::isTeleopEnabled);
isEnabledTrigger = new Trigger(DriverStation::isEnabled);
indexerBeamBreakWatcher = new Trigger(indexer::getBeamBreak);
poseSendable = new PoseSendable();
setAmpAngle = false;
intakeDown = false;
autoChooser = AutoBuilder.buildAutoChooser();
configureBindings();
shuffleboardSetup();
shuffleboardConfig();
}
// The objective should be to have the subsystems expose methods that return commands
// that can be bound to the triggers provided by the CommandXboxController class.
// This mindset should help keep RobotContainer a little cleaner this year.
// This is not to say you can't trigger or command chain here (see driveCardnial drivetrain example),
// but generally reduce/avoid any situation where the keyword "new" is involved if you're working
// with a subsystem
private void configureBindings() {
isTeleopTrigger.onTrue(new InstantCommand(() -> Shuffleboard.selectTab(kTeleopTabName)));
isEnabledTrigger.onTrue(
new InstantCommand(
() -> {
Optional<DriverStation.Alliance> alliance = DriverStation.getAlliance();
if (alliance.isEmpty() || alliance.get() == DriverStation.Alliance.Red) {
ampTagID = 5;
sourceTagID = 9;
speakerTag = 4;
invertXYDrive = true;
} else {
ampTagID = 6;
sourceTagID = 1;
speakerTag = 8;
invertXYDrive = false;
}
}
)
);
drivetrain.setDefaultCommand(
drivetrain.teleopCommand(
() -> { return driver.getLeftY(); /*(invertXYDrive ? -1 : 1);*/ },
() -> { return driver.getLeftX(); /*(invertXYDrive ? -1 : 1);*/ },
() -> { return driver.getRightX(); /*(invertXYDrive ? -1 : 1);*/ },
driver::getLeftY,
driver::getLeftX,
() -> { return -driver.getRightX(); },
OIConstants.kTeleopDriveDeadband
)
);
intake.setDefaultCommand(
intake.intakeControl(
() -> {
if (intakeDown && indexer.getBeamBreak()) {
return IntakeConstants.kDownAngle;
} else {
return IntakeConstants.kUpAngle;
}
},
() -> {
if(intakeDown && indexer.getBeamBreak()){
return 1.0;
}else if(operator.leftBumper().getAsBoolean()){
return -1.0;
}else{
return 0.0;
}
}
)
);
driver.a().onTrue(drivetrain.zeroHeadingCommand());
driver.leftTrigger().whileFalse(
new InstantCommand(
() -> {
intakeDown = false;
}
)
);
driver.leftTrigger().whileTrue(Commands.parallel(
new InstantCommand(
() -> {
intakeDown = true;
}
), indexer.advanceNote()
));
shooter.setDefaultCommand(
shooter.angleSpeedsSetpoints(
() -> {
if (setAmpAngle) {
return ShooterConstants.kShooterAmpAngle;
} else {
return ShooterConstants.kShooterLoadAngle;
}
},
() -> {
if(driver.getRightTriggerAxis() > 0.25){
return 1.0;
} else if(operator.getRightTriggerAxis() > 0.25){
return -1.0;
}else{
return 0.0;
}
}
)
);
driver.leftBumper().onTrue(
shooter.angleSpeedsSetpoints(
() -> ShooterConstants.kShooterLoadAngle,
() -> 1.0
).withTimeout(.5).andThen(
shooter.angleSpeedsSetpoints(
() -> ShooterConstants.kShooterLoadAngle,
() -> 1.0
).alongWith(
indexer.shootNote(() -> 1.0)
).withTimeout(2)
)
);
climber.setDefaultCommand(climber.stop());
indexer.setDefaultCommand(indexer.shootNote(
() -> {
if (driver.getRightTriggerAxis() > .25) {
return 1.0;
}else {
return 0.0;
}
}
));
indexerBeamBreakWatcher.onFalse(
new RunCommand(() -> {
driver.getHID().setRumble(RumbleType.kBothRumble, 1);
}).withTimeout(.5).andThen(
new InstantCommand(() -> {
driver.getHID().setRumble(RumbleType.kBothRumble, 0);
})
)
);
/*
driver.povCenter().onFalse(
drivetrain.driveCardinal(
driver::getLeftY,
driver::getLeftX,
driver.getHID()::getPOV,
OIConstants.kTeleopDriveDeadband).until(
() -> MathUtil.applyDeadband(driver.getRightX(), OIConstants.kTeleopDriveDeadband) != 0
)
);
// Lock on to the appropriate Amp AprilTag while still being able to strafe and drive forward and back
driver.leftBumper().onTrue(
drivetrain.driveAprilTagLock(
driver::getLeftY,
driver::getLeftX,
OIConstants.kTeleopDriveDeadband,
ampTagID
).until(
() -> MathUtil.applyDeadband(driver.getRightX(), OIConstants.kTeleopDriveDeadband) != 0
)
);
// Lock on to the appropriate Source AprilTag while still being able to strafe and drive forward and back
driver.b().onTrue(
drivetrain.driveAprilTagLock(
driver::getLeftY,
driver::getLeftX,
OIConstants.kTeleopDriveDeadband,
sourceTagID
).until(
() -> MathUtil.applyDeadband(driver.getRightX(), OIConstants.kTeleopDriveDeadband) != 0
)
);
// Lock on to the appropriate Speaker AprilTag while still being able to strafe and drive forward and back
driver.x().onTrue(
drivetrain.driveAprilTagLock(
driver::getLeftY,
driver::getLeftX,
OIConstants.kTeleopDriveDeadband,
speakerTag
).until(
() -> MathUtil.applyDeadband(driver.getRightX(), OIConstants.kTeleopDriveDeadband) != 0
)
); */
// This was originally a run while held, not sure that's really necessary, change it if need be
driver.y().onTrue(drivetrain.zeroHeadingCommand());
// This was originally a run while held, not sure that's really necessary, change it if need be
driver.rightBumper().onTrue(drivetrain.setXCommand());
operator.rightTrigger().whileTrue(indexer.shootNote(() -> -1.0));
/*
* This has been added because interest has been expressed in trying field relative vs
* robot relative control. This should <i>default</i> to field relative, but give the option
* for the person practicing driving to push start on the driver's controller to quickly switch to
* the other style.
*
* If it becomes something that we need to switch <i>prior</i> to the start of the match, a different
* mechanism will need to be devised, this will work for now.
*/
driver.start().onTrue(drivetrain.toggleFieldRelativeControl());
operator.b().whileTrue(Commands.parallel(indexer.shootNote(() -> 1.0), shooter.ampHandoff(() -> driver.getRightTriggerAxis(), () -> {
if(operator.getRightTriggerAxis()>0.25){
return true;
}else{
return false;
new InstantCommand(() -> {
System.out.println("X: " + poseSendable.getX());
System.out.println("Y: " + poseSendable.getY());
System.out.println("Rotation: " + poseSendable.getRotation());
drivetrain.resetOdometry(poseSendable.getPose());
}
})));
//driver.leftBumper().toggleOnTrue(intake.intakeDownCommand());
operator.a().onTrue(new InstantCommand(() -> { setAmpAngle = true; }));
operator.a().onFalse(new InstantCommand(() -> { setAmpAngle = false; }));
//operator.a().whileTrue(shooter.angleSpeedsSetpoints(ShooterConstants.kShooterAmpAngle, 0, 0));
operator.y().toggleOnTrue(Commands.parallel(climber.setSpeedWithSupplier(operator::getRightTriggerAxis), shooter.climbState(), intake.climbingStateCommand()));
driver.a().whileTrue(indexer.shootNote(() -> 1.0));
operator.back().toggleOnTrue(shooter.manualPivot(
() -> MathUtil.clamp(-operator.getLeftY(), -0.25, 0.25),
() -> MathUtil.clamp(driver.getRightTriggerAxis(), -1, 1)
));
}
driver.povDown().whileTrue(indexer.shootNote(() -> -1.0));
private void shuffleboardConfig() {
ShuffleboardTab tab = Shuffleboard.getTab("Testing");
tab.add("Drivetrain Pose", poseSendable)
.withPosition(0, 0)
.withSize(2, 3);
operator.leftTrigger().whileTrue(Commands.parallel( indexer.shootNote(() -> -1), intake.intakeControl(() -> IntakeConstants.kDownAngle, () -> -1.0)));
tab.add("Auto Selector", autoChooser)
.withPosition(2, 0)
.withSize(2, 1);
operator.start().toggleOnTrue(intake.manualPivot(() -> -operator.getRightY()*0.2, () -> driver.getLeftTriggerAxis()));
tab.addDouble("Current Pose Rotation", () -> { return drivetrain.getPose().getRotation().getDegrees(); })
.withPosition(2, 1)
.withSize(2, 1)
.withWidget(BuiltInWidgets.kTextView);
}
}
public Command getAutonomousCommand() {
return drivetrain.zeroHeadingCommand().andThen(autoChooser.getSelected());
private void shuffleboardSetup() {
ShuffleboardTab autoTab = Shuffleboard.getTab(kAutoTabName);
autoTab.add("Autonomous Selector", autoChooser)
.withPosition(0, 0)
.withSize(2, 1)
.withWidget(BuiltInWidgets.kComboBoxChooser);
//Always select the auto tab on startup
Shuffleboard.selectTab(kAutoTabName);
ShuffleboardTab teleopTab = Shuffleboard.getTab(kTeleopTabName);
teleopTab.addBoolean("Field Relative Controls Enabled?", drivetrain::isFieldRelativeControl)
.withPosition(0, 0)
.withSize(2, 1)
.withWidget(BuiltInWidgets.kBooleanBox);
teleopTab.addBoolean("indexer beam break", indexer::getBeamBreak);
teleopTab.addBoolean("shooter beam break", shooter::getBeamBreak);
teleopTab.addDouble("shooter angle", shooter::getShooterAngle);
teleopTab.addDouble("intake angle", intake::getIntakeDegrees);
//teleopTab.addDouble("intake pid", intake::getIntakePID);
teleopTab.addDouble("heading swerve", drivetrain::getHeading);
teleopTab.addDouble("steering encoder", drivetrain::getEncoderSteering);
}
public Command getAutonomousCommand() {
return autoChooser.getSelected();
}
}
}

View File

@ -8,14 +8,14 @@ import edu.wpi.first.math.trajectory.TrapezoidProfile;
import edu.wpi.first.math.util.Units;
public final class AutoConstants {
public static final double kMaxSpeedMetersPerSecond = 4; // max capable = 4.6
public static final double kMaxAccelerationMetersPerSecondSquared = 4; // max capable = 7.4
public static final double kMaxSpeedMetersPerSecond = 3.895; // max capable = 4.6
public static final double kMaxAccelerationMetersPerSecondSquared = 3; // max capable = 7.4
public static final double kMaxAngularSpeedRadiansPerSecond = Math.PI;
public static final double kMaxAngularSpeedRadiansPerSecondSquared = Math.PI;
public static final double kPXController = 5.5;//5;
public static final double kPYController = 5.5;//5;
public static final double kPThetaController = 5;//0.5; // needs to be separate from heading control
public static final double kPXController = 1.05;
public static final double kPYController = 1.05;
public static final double kPThetaController = 0.95; // needs to be separate from heading control
public static final double kPHeadingController = 0.02; // for heading control NOT PATHING
public static final double kDHeadingController = 0.0025;
@ -24,7 +24,7 @@ public final class AutoConstants {
new PIDConstants(kPXController),
new PIDConstants(kPThetaController),
kMaxSpeedMetersPerSecond,
Units.inchesToMeters(Math.sqrt(Math.pow(14-1.75, 2)+ Math.pow(14-1.75, 2))),
Units.inchesToMeters(Math.sqrt(Math.pow(14-1.75, 2) + Math.pow(14-1.75, 2))),
new ReplanningConfig()
);

View File

@ -1,6 +0,0 @@
package frc.robot.constants;
public class ClimberConstants {
public static final int kClimberMotor1CANID = 14;
public static final int kClimberMotor2CANID = 15;
}

View File

@ -7,7 +7,7 @@ import edu.wpi.first.math.util.Units;
public final class DrivetrainConstants {
// Driving Parameters - Note that these are not the maximum capable speeds of
// the robot, rather the allowed maximum speeds
public static final double kMaxSpeedMetersPerSecond = 5.2;
public static final double kMaxSpeedMetersPerSecond = 4.1;
public static final double kMaxAngularSpeed = 2 * Math.PI; // radians per second
public static final double kDirectionSlewRate = 4.8; // radians per second
@ -26,29 +26,21 @@ public final class DrivetrainConstants {
new Translation2d(-kWheelBase / 2, -kTrackWidth / 2));
// Angular offsets of the modules relative to the chassis in radians
public static final double kFrontLeftChassisAngularOffset = 0.0;// Math.PI
public static final double kFrontRightChassisAngularOffset = Math.PI / 2;//-Math.PI / 2;
public static final double kBackLeftChassisAngularOffset = -Math.PI/2;//Math.PI / 2;
public static final double kBackRightChassisAngularOffset = Math.PI; //0;
/*
public static final double kFrontLeftChassisAngularOffset = -2*Math.PI;
public static final double kFrontRightChassisAngularOffset = -2*Math.PI;
public static final double kBackLeftChassisAngularOffset = -2*Math.PI;
public static final double kBackRightChassisAngularOffset = -2*Math.PI-(4/180.0);
*/
public static final double kFrontLeftChassisAngularOffset = Math.PI;
public static final double kFrontRightChassisAngularOffset = -Math.PI / 2;
public static final double kBackLeftChassisAngularOffset = Math.PI / 2;
public static final double kBackRightChassisAngularOffset = 0;
// SPARK MAX CAN IDs
public static final int kFrontLeftDrivingCanId = 1;//8
public static final int kRearLeftDrivingCanId = 6;//3
public static final int kFrontRightDrivingCanId = 3;//6
public static final int kRearRightDrivingCanId = 8;//1
public static final int kFrontLeftDrivingCanId = 8;
public static final int kRearLeftDrivingCanId = 3;
public static final int kFrontRightDrivingCanId = 6;
public static final int kRearRightDrivingCanId = 1;
public static final int kFrontLeftTurningCanId = 5;//4
public static final int kRearLeftTurningCanId = 2;//7
public static final int kFrontRightTurningCanId = 7;//2
public static final int kRearRightTurningCanId = 4;//5
public static final int kFrontLeftTurningCanId = 4;
public static final int kRearLeftTurningCanId = 7;
public static final int kFrontRightTurningCanId = 2;
public static final int kRearRightTurningCanId = 5;
public static final double kTurnToleranceDeg = 0;
public static final double kTurnRateToleranceDegPerS = 0;

View File

@ -1,7 +0,0 @@
package frc.robot.constants;
public class IndexerConstants {
public static final int kIndexerID = 13;
public static final int kIndexerBeamBreakChannel = 2;
}

View File

@ -1,23 +0,0 @@
package frc.robot.constants;
public class IntakeConstants {
public static final int kIntakePivotID = 10;
public static final int kIntakeRollerID = 12;
public static final double kIntakePivotConversionFactor = (20.0*(28.0/15.0));
public static final int kPivotCurrentLimit = 40;
public static final double kPIntake = 3;//4; //2.5;
public static final double kIIntake = 0;
public static final double kDIntake = 0.01;
public static final double kSFeedForward = 0;
public static final double kGFeedForward = 1;//1.11;
public static final double kVFeedForward = .5;//0.73;
public static final double kStartingAngle = Math.toRadians(95.0);
public static final double kUpAngle = Math.toRadians(90.0);
public static final double kDownAngle = Math.toRadians(-34.0);
}

View File

@ -1,17 +0,0 @@
package frc.robot.constants;
import edu.wpi.first.math.geometry.Transform3d;
import edu.wpi.first.math.util.Units;
public class PhotonConstants {
public static final String kCameraName = "Camera_Module_v1";
// TODO Set this to something real if visual pose estimation is used
public static final Transform3d kCameraTransform = new Transform3d();
// TODO The camera will be moved, this is an old value that needs to update
public static final double kCameraHeightMeters = .517525;
// TODO The camera will be moved, this is an old value that needs to update
public static final double kCameraPitchRadians = Units.degreesToRadians(15);
}

View File

@ -1,34 +0,0 @@
package frc.robot.constants;
public class ShooterConstants {
public static final int kTopShooterID = 9;
public static final int kBottomShooterID = 11;
public static final int kShooterPivotID = 16;
public static final double kShooterP = 0.0;
public static final double kShooterI = 0.0;
public static final double kShooterD = 0.0;
public static final double kShooterFF = 0.0;
public static final double kShooterPivotP = 3.0;
public static final double kShooterPivotI = 0.0;
public static final double kShooterPivotD = 0.0;
public static final double kShooterLoadAngle = Math.toRadians(-20.0);
public static final double kShooterAmpAngle = Math.toRadians(105.0);
public static final double kPivotConversion = 1/(40.0*(28.0/15.0));
public static final double kSShooterPivotFF = 0.0;
public static final double kGShooterPivotFF = 0.33;
public static final double kVShooterPivotFF = 1.44;
public static final double kMaxPivotSpeed = 0.0;
public static final double kMaxPivotAcceleration = 0.0;
public static final int kShooterEncoderChannelA = 0;
public static final int kShooterEncoderChannelB = 1;
public static final int kShooterBeamBreakChannel = 3;
}

View File

@ -16,8 +16,8 @@ public class SwerveModuleConstants {
public static final double kDrivingMotorFreeSpeedRps = NeoMotorConstants.kFreeSpeedRpm / 60;
public static final double kWheelDiameterMeters = 0.0762;
public static final double kWheelCircumferenceMeters = kWheelDiameterMeters * Math.PI;
// 45 teeth on the wheel's bevel gear, 20 teeth on the first-stage spur gear, 15 teeth on the bevel pinion
public static final double kDrivingMotorReduction = (45.0 * 20) / (kDrivingMotorPinionTeeth * 15);
// 45 teeth on the wheel's bevel gear, 22 teeth on the first-stage spur gear, 15 teeth on the bevel pinion
public static final double kDrivingMotorReduction = (45.0 * 22) / (kDrivingMotorPinionTeeth * 15);
public static final double kDriveWheelFreeSpeedRps = (kDrivingMotorFreeSpeedRps * kWheelCircumferenceMeters)
/ kDrivingMotorReduction;
@ -49,6 +49,6 @@ public class SwerveModuleConstants {
public static final IdleMode kDrivingMotorIdleMode = IdleMode.kBrake;
public static final IdleMode kTurningMotorIdleMode = IdleMode.kBrake;
public static final int kDrivingMotorCurrentLimit = 70; // amps
public static final int kDrivingMotorCurrentLimit = 65; // amps
public static final int kTurningMotorCurrentLimit = 30; // amps
}

View File

@ -1,34 +0,0 @@
package frc.robot.interfaces;
import java.util.OptionalDouble;
/**
* An interface which ensures a class can provide common AprilTag oriented
* information from various sources in a consistent way.
*/
public interface IAprilTagProvider {
/**
* A method to get the distance from <i>the camera</i> to the AprilTag specified
*
* @param id The ID of the AprilTag to give a distance to
* @param targetHeightMeters The height of the AprilTag off the ground, in meters
* @return The distance, in meters, to the target, or OptionalDouble.empty() if the tag is not present in the camera's view
*/
public OptionalDouble getTagDistanceFromCameraByID(int id, double targetHeightMeters);
/**
* A method to get the pitch from the center of the image of a particular AprilTag
*
* @param id The ID of the AprilTag to get the pitch of
* @return The pitch, in degrees, of the target, or OptionalDouble.empty() if the tag is not present in the camera's view
*/
public OptionalDouble getTagPitchByID(int id);
/**
* A method to get the yaw from the center of the image of a particular AprilTag
*
* @param id The ID of the AprilTag to get the yaw of
* @return The yaw, in degrees, of the target, or OptionalDouble.empty() if the tag is not present in the camera's view
*/
public OptionalDouble getTagYawByID(int id);
}

View File

@ -1,27 +0,0 @@
package frc.robot.interfaces;
import java.util.Optional;
import edu.wpi.first.math.geometry.Pose2d;
/**
* An interface which ensures a class' ability to provide visual pose information
* in a consistent way
*/
public interface IVisualPoseProvider {
/**
* A record that can contain the two elements necessary for a WPILIB
* pose estimator to use the information from a vision system as part of a full
* robot pose estimation
*/
public record VisualPose(Pose2d visualPose, double timestamp) {}
/**
* Return a VisualPose or null if an empty Optional if none is available.
* Implementation should provide an empty response if it's unable to provide
* a reliable pose, or any pose at all.
*
* @return An Optional containing a VisualPose, or empty if no VisualPose can reliably be provided
*/
public Optional<VisualPose> getVisualPose();
}

View File

@ -1,51 +0,0 @@
package frc.robot.subsystems;
import java.util.function.DoubleSupplier;
import com.ctre.phoenix.motorcontrol.VictorSPXControlMode;
import com.ctre.phoenix.motorcontrol.can.VictorSPX;
import edu.wpi.first.wpilibj2.command.Command;
import edu.wpi.first.wpilibj2.command.SubsystemBase;
import frc.robot.constants.ClimberConstants;
import frc.robot.constants.ShooterConstants;
public class Climber extends SubsystemBase {
private VictorSPX motor1;
private VictorSPX motor2;
private DoubleSupplier shooterAngle;
public Climber(DoubleSupplier shooterAngle) {
motor1 = new VictorSPX(ClimberConstants.kClimberMotor1CANID);
motor2 = new VictorSPX(ClimberConstants.kClimberMotor2CANID);
motor2.follow(motor1);
motor1.setInverted(true);
motor2.setInverted(true);
this.shooterAngle = shooterAngle;
}
public Command setSpeedWithSupplier(DoubleSupplier speed) {
return run(() -> {
if(shooterAngle.getAsDouble() > ShooterConstants.kShooterLoadAngle){
motor1.set(VictorSPXControlMode.PercentOutput, speed.getAsDouble());
}else{
motor1.set(VictorSPXControlMode.PercentOutput, 0.0);
}
});
}
public Command setSpeed(double speed) {
return run(() -> {
motor1.set(VictorSPXControlMode.PercentOutput, speed);
});
}
public Command stop() {
return setSpeed(0);
}
}

View File

@ -1,7 +1,6 @@
package frc.robot.subsystems;
import edu.wpi.first.math.MathUtil;
import edu.wpi.first.math.controller.PIDController;
import edu.wpi.first.math.estimator.SwerveDrivePoseEstimator;
import edu.wpi.first.math.filter.SlewRateLimiter;
import edu.wpi.first.math.geometry.Pose2d;
@ -13,27 +12,18 @@ import edu.wpi.first.math.kinematics.SwerveModuleState;
import edu.wpi.first.util.WPIUtilJNI;
import java.util.Optional;
import java.util.OptionalDouble;
import java.util.function.BooleanSupplier;
import java.util.function.DoubleSupplier;
import com.kauailabs.navx.frc.AHRS;
import com.pathplanner.lib.auto.AutoBuilder;
import edu.wpi.first.wpilibj.ADXRS450_Gyro;
import edu.wpi.first.wpilibj.DriverStation;
import edu.wpi.first.wpilibj.SPI;
import edu.wpi.first.wpilibj.interfaces.Gyro;
import frc.robot.constants.AutoConstants;
import frc.robot.constants.DrivetrainConstants;
import frc.robot.utilities.MAXSwerveModule;
import frc.robot.utilities.SwerveUtils;
import frc.robot.interfaces.IAprilTagProvider;
import frc.robot.interfaces.IVisualPoseProvider;
import frc.robot.interfaces.IVisualPoseProvider.VisualPose;
import edu.wpi.first.wpilibj2.command.Command;
import edu.wpi.first.wpilibj2.command.PIDCommand;
import edu.wpi.first.wpilibj2.command.PrintCommand;
import edu.wpi.first.wpilibj2.command.SubsystemBase;
public class Drivetrain extends SubsystemBase {
@ -45,20 +35,13 @@ public class Drivetrain extends SubsystemBase {
// The gyro sensor
private final AHRS m_gyro;
//private final ADXRS450_Gyro m_gyro;
private final SlewRateLimiter m_magLimiter;
private final SlewRateLimiter m_rotLimiter;
private final IAprilTagProvider m_aprilTagProvider;
private final IVisualPoseProvider m_visualPoseProvider;
// Odometry class for tracking robot pose
private final SwerveDrivePoseEstimator m_poseEstimator;
private boolean fieldRelativeControl;
// Slew rate filter variables for controlling lateral acceleration
private double m_currentRotation;
private double m_currentTranslationDir;
@ -66,10 +49,8 @@ public class Drivetrain extends SubsystemBase {
private double m_prevTime;
private double gyroOffset;
/** Creates a new DriveSubsystem. */
public Drivetrain(Pose2d initialPose, IAprilTagProvider aprilTagProvider, IVisualPoseProvider visualPoseProvider) {
public Drivetrain(Pose2d initialPose) {
m_frontLeft = new MAXSwerveModule(
DrivetrainConstants.kFrontLeftDrivingCanId,
DrivetrainConstants.kFrontLeftTurningCanId,
@ -95,8 +76,6 @@ public class Drivetrain extends SubsystemBase {
// TODO The NavX is not centered in the robot, it's output probably needs to be translated
m_gyro = new AHRS(SPI.Port.kMXP);
// m_gyro = new ADXRS450_Gyro();
//m_gyro.calibrate();
m_magLimiter = new SlewRateLimiter(DrivetrainConstants.kMagnitudeSlewRate);
m_rotLimiter = new SlewRateLimiter(DrivetrainConstants.kRotationalSlewRate);
@ -113,12 +92,6 @@ public class Drivetrain extends SubsystemBase {
initialPose
);
m_aprilTagProvider = aprilTagProvider;
m_visualPoseProvider = visualPoseProvider;
fieldRelativeControl = true;
m_currentRotation = 0.0;
m_currentTranslationDir = 0.0;
m_currentTranslationMag = 0.0;
@ -140,8 +113,6 @@ public class Drivetrain extends SubsystemBase {
this
);
gyroOffset = DrivetrainConstants.kRobotStartOffset;
}
@Override
@ -156,32 +127,6 @@ public class Drivetrain extends SubsystemBase {
m_rearRight.getPosition()
}
);
if (m_visualPoseProvider != null) {
Optional<VisualPose> vPose = m_visualPoseProvider.getVisualPose();
if (vPose.isPresent()) {
m_poseEstimator.addVisionMeasurement(vPose.get().visualPose(), vPose.get().timestamp());
}
}
}
public double getRobotStartOffset() {
return gyroOffset;
}
public void setRobotStartOffset(double offset) {
gyroOffset = offset;
}
public boolean isFieldRelativeControl() {
return fieldRelativeControl;
}
public Command toggleFieldRelativeControl() {
return runOnce(() -> {
fieldRelativeControl = !fieldRelativeControl;
});
}
/**
@ -193,22 +138,12 @@ public class Drivetrain extends SubsystemBase {
return m_poseEstimator.getEstimatedPosition();
}
public double getPoseX(){
return m_poseEstimator.getEstimatedPosition().getX();
}
public double getPoseY(){
return m_poseEstimator.getEstimatedPosition().getY();
}
/**
* Resets the odometry to the specified pose.
*
* @param pose The pose to which to set the odometry.
*/
public void resetOdometry(Pose2d pose) {
m_gyro.setAngleAdjustment(pose.getRotation().getDegrees());
m_poseEstimator.resetPosition(
Rotation2d.fromDegrees(getGyroAngle()),
new SwerveModulePosition[] {
@ -240,7 +175,7 @@ public class Drivetrain extends SubsystemBase {
* field.
* @param rateLimit Whether to enable rate limiting for smoother control.
*/
public void drive(double xSpeed, double ySpeed, double rot, BooleanSupplier fieldRelative, boolean rateLimit) {
public void drive(double xSpeed, double ySpeed, double rot, boolean fieldRelative, boolean rateLimit) {
double xSpeedCommanded;
double ySpeedCommanded;
@ -294,7 +229,7 @@ public class Drivetrain extends SubsystemBase {
double rotDelivered = m_currentRotation * DrivetrainConstants.kMaxAngularSpeed;
var swerveModuleStates = DrivetrainConstants.kDriveKinematics.toSwerveModuleStates(
fieldRelative.getAsBoolean()
fieldRelative
? ChassisSpeeds.fromFieldRelativeSpeeds(xSpeedDelivered, ySpeedDelivered, rotDelivered, m_poseEstimator.getEstimatedPosition().getRotation())
: new ChassisSpeeds(xSpeedDelivered, ySpeedDelivered, rotDelivered));
SwerveDriveKinematics.desaturateWheelSpeeds(
@ -306,21 +241,12 @@ public class Drivetrain extends SubsystemBase {
}
public void driveWithChassisSpeeds(ChassisSpeeds speeds) {
//speeds.omegaRadiansPerSecond = -speeds.omegaRadiansPerSecond;
ChassisSpeeds discreteSpeeds = ChassisSpeeds.discretize(speeds, 0.2);
SwerveModuleState[] newStates = DrivetrainConstants.kDriveKinematics.toSwerveModuleStates(discreteSpeeds);
SwerveDriveKinematics.desaturateWheelSpeeds(newStates, DrivetrainConstants.kMaxSpeedMetersPerSecond);
setModuleStates(newStates);
/*
//speeds.omegaRadiansPerSecond = -speeds.omegaRadiansPerSecond;
SwerveModuleState[] states = DrivetrainConstants.kDriveKinematics.toSwerveModuleStates(speeds);
m_frontLeft.setDesiredState(states[0]);
m_frontRight.setDesiredState(states[1]);
m_rearLeft.setDesiredState(states[2]);
m_rearRight.setDesiredState(states[3]);
*/
}
public Command teleopCommand(DoubleSupplier xSpeed, DoubleSupplier ySpeed, DoubleSupplier rotation, double deadband) {
@ -329,88 +255,12 @@ public class Drivetrain extends SubsystemBase {
-MathUtil.applyDeadband(xSpeed.getAsDouble(), deadband),
-MathUtil.applyDeadband(ySpeed.getAsDouble(), deadband),
-MathUtil.applyDeadband(rotation.getAsDouble(), deadband),
() -> fieldRelativeControl,
true,
true
);
});
}
public Command driveCardinal(DoubleSupplier xSpeed, DoubleSupplier ySpeed, DoubleSupplier pov, double deadband) {
PIDController controller = new PIDController(
AutoConstants.kPHeadingController,
0,
AutoConstants.kDHeadingController
);
controller.enableContinuousInput(-180, 180);
return new PIDCommand(
controller,
this::getHeading,
pov::getAsDouble,
(output) -> {
this.drive(
-MathUtil.applyDeadband(xSpeed.getAsDouble(), deadband),
-MathUtil.applyDeadband(ySpeed.getAsDouble(), deadband),
output,
() -> fieldRelativeControl,
true
);
},
this);
}
public Command driveAprilTagLock(DoubleSupplier xSpeed, DoubleSupplier ySpeed, double deadband, int tagID) {
if (m_aprilTagProvider == null) {
return new PrintCommand("No AprilTag Provider Available");
}
// TODO The process variable is different here than what these constants are used for, may need to use something different
PIDController controller = new PIDController(
AutoConstants.kPHeadingController,
0,
AutoConstants.kDHeadingController
);
return new PIDCommand(
controller,
() -> {
OptionalDouble tagYaw = m_aprilTagProvider.getTagYawByID(tagID);
if (tagYaw.isEmpty()) {
return 0;
}
return tagYaw.getAsDouble();
},
() -> { return 0; },
(output) -> {
// TODO Field relative or no? What makes sense here, since the intent is to orient to the tag, not the field, it shouldn't be affected by the drivers mode choice I don't think.
this.drive(
-MathUtil.applyDeadband(xSpeed.getAsDouble(), deadband),
-MathUtil.applyDeadband(ySpeed.getAsDouble(), deadband),
output,
() -> fieldRelativeControl,
true
);
},
this
);
}
/**
* Sets the wheels into an X formation to prevent movement.
*/
public void setX() {
m_frontLeft.setDesiredState(new SwerveModuleState(0, Rotation2d.fromDegrees(45)));
m_frontRight.setDesiredState(new SwerveModuleState(0, Rotation2d.fromDegrees(-45)));
m_rearLeft.setDesiredState(new SwerveModuleState(0, Rotation2d.fromDegrees(-45)));
m_rearRight.setDesiredState(new SwerveModuleState(0, Rotation2d.fromDegrees(45)));
}
public Command setXCommand() {
return runOnce(this::setX);
}
/**
* Sets the swerve ModuleStates.
*
@ -435,27 +285,13 @@ public class Drivetrain extends SubsystemBase {
/** Zeroes the heading of the robot. */
public void zeroHeading() {
Pose2d tempPose = m_poseEstimator.getEstimatedPosition();
Rotation2d tempRotation = Rotation2d.fromDegrees(0);
resetOdometry(
new Pose2d(
tempPose.getX(),
tempPose.getY(),
tempRotation
)
);
m_gyro.reset();
}
public Command zeroHeadingCommand() {
return runOnce(this::zeroHeading);
}
public void offsetZero(Pose2d angle){
resetOdometry(angle);
}
/**
* Returns the heading of the robot.
*
@ -477,8 +313,4 @@ public class Drivetrain extends SubsystemBase {
public double getTurnRate() {
return m_gyro.getRate() * (DrivetrainConstants.kGyroReversed ? -1.0 : 1.0);
}
public double getEncoderSteering(){
return m_frontLeft.steeringEncoder();
}
}

View File

@ -1,60 +0,0 @@
package frc.robot.subsystems;
import com.revrobotics.CANSparkMax;
import java.util.function.DoubleSupplier;
import com.revrobotics.CANSparkBase.IdleMode;
import com.revrobotics.CANSparkLowLevel.MotorType;
import edu.wpi.first.wpilibj.DigitalInput;
import edu.wpi.first.wpilibj2.command.Command;
import edu.wpi.first.wpilibj2.command.SubsystemBase;
import frc.robot.constants.IndexerConstants;
public class Indexer extends SubsystemBase{
private CANSparkMax indexerMotor;
private DigitalInput indexerBeamBreak;
public Indexer(){
indexerMotor = new CANSparkMax(IndexerConstants.kIndexerID, MotorType.kBrushed);
indexerMotor.setSmartCurrentLimit(40);
indexerMotor.setIdleMode(IdleMode.kBrake);
indexerMotor.burnFlash();
indexerBeamBreak = new DigitalInput(IndexerConstants.kIndexerBeamBreakChannel);
}
public Command autoIndexing(){
return run(() -> {
if(!indexerBeamBreak.get()){
indexerMotor.set(0.75);
}else if(indexerBeamBreak.get()){
indexerMotor.set(0.0);
}
});
}
public Command advanceNote(){
return run(() -> {
if(indexerBeamBreak.get()){
indexerMotor.set(1);
}else{
indexerMotor.set(0.0);
}
});
}
public Command shootNote(DoubleSupplier indexerSpeed){
return run(() -> {
indexerMotor.set(indexerSpeed.getAsDouble());
});
}
public boolean getBeamBreak(){
return indexerBeamBreak.get();
}
}

View File

@ -1,184 +0,0 @@
package frc.robot.subsystems;
import java.util.function.DoubleSupplier;
import com.revrobotics.CANSparkMax;
import com.revrobotics.RelativeEncoder;
import com.revrobotics.CANSparkBase.IdleMode;
import com.revrobotics.CANSparkLowLevel.MotorType;
import edu.wpi.first.math.controller.ArmFeedforward;
import edu.wpi.first.math.controller.PIDController;
import edu.wpi.first.math.util.Units;
import edu.wpi.first.util.function.BooleanConsumer;
import edu.wpi.first.wpilibj2.command.Command;
import edu.wpi.first.wpilibj2.command.SubsystemBase;
import frc.robot.constants.IntakeConstants;
public class Intake extends SubsystemBase{
private PIDController intakeAnglePID;
private CANSparkMax intakeRoller;
private CANSparkMax intakePivot;
private RelativeEncoder intakeEncoder;
private ArmFeedforward intakeFeedForward;
private double armOffset;
public Intake(){
armOffset = 0;
intakeRoller = new CANSparkMax(IntakeConstants.kIntakeRollerID, MotorType.kBrushless);
intakeRoller.setSmartCurrentLimit(60);
intakeRoller.setIdleMode(IdleMode.kBrake);
intakeRoller.burnFlash();
intakePivot = new CANSparkMax(IntakeConstants.kIntakePivotID, MotorType.kBrushless);
intakePivot.setIdleMode(IdleMode.kBrake);
intakePivot.setSmartCurrentLimit(IntakeConstants.kPivotCurrentLimit);
intakePivot.setInverted(true);
intakePivot.burnFlash();
intakeFeedForward = new ArmFeedforward(
IntakeConstants.kSFeedForward,
IntakeConstants.kGFeedForward,
IntakeConstants.kVFeedForward
);
intakeEncoder = intakePivot.getEncoder();
intakeEncoder.setPosition(Units.radiansToRotations( IntakeConstants.kStartingAngle));
// intakeEncoder.setPositionConversionFactor(IntakeConstants.kIntakePivotConversionFactor);
intakeAnglePID = new PIDController(
IntakeConstants.kPIntake,
IntakeConstants.kIIntake,
IntakeConstants.kDIntake
);
armOffset = getIntakeAngle()-IntakeConstants.kStartingAngle;
}
/*
public Command autoIntaking(BooleanSupplier beamBreak){
return run(() -> {
intakeRoller.set(1.0);
intakePivot.setVoltage(
intakeAnglePID.calculate(
getIntakeAngle(),
IntakeConstants.kDownAngle
) + intakeFeedForward.calculate(
IntakeConstants.kDownAngle,
0.0
)
);
return isFinished(() -> {
if(!beamBreak.getAsBoolean()){
return true
}
});
});
}
*/
public Command intakeControl(DoubleSupplier pivotAngle, DoubleSupplier intakeSpeed) {
return run(() -> {
intakeRoller.set(intakeSpeed.getAsDouble());
intakePivot.setVoltage(
intakeAnglePID.calculate(
getIntakeAngle(),
pivotAngle.getAsDouble()
) + intakeFeedForward.calculate(
pivotAngle.getAsDouble(),
0.0
)
);
});
}
public Command intakeDownCommand() {
return run(() -> {
intakeRoller.set(0.0);
intakePivot.setVoltage(
intakeAnglePID.calculate(
getIntakeAngle(),
IntakeConstants.kDownAngle
) + intakeFeedForward.calculate(
IntakeConstants.kDownAngle,
0.0
)
);
});
}
public Command manualPivot(DoubleSupplier pivotPower, DoubleSupplier rollerSpinny){
return run(() ->{
intakePivot.set(pivotPower.getAsDouble());
intakeRoller.set(rollerSpinny.getAsDouble());
});
}
public Command climbingStateCommand() {
return run(() -> {
intakeRoller.set(0.0);
intakePivot.setVoltage(
intakeAnglePID.calculate(
getIntakeAngle(),
IntakeConstants.kDownAngle
) + intakeFeedForward.calculate(
IntakeConstants.kDownAngle,
0.0
)
);
});
}
public Command intakeUpCommand() {
return run(() -> {
intakeRoller.set(0.0);
intakePivot.setVoltage(
intakeAnglePID.calculate(
getIntakeAngle(),
IntakeConstants.kUpAngle
) + intakeFeedForward.calculate(
IntakeConstants.kUpAngle,
0.0
)
);
});
}
public Command stopAll() {
return runOnce(() -> {
intakeRoller.set(0);
intakePivot.setVoltage(0);
});
}
public double getIntakeAngle(){
return Units.rotationsToRadians(intakeEncoder.getPosition()/IntakeConstants.kIntakePivotConversionFactor)-armOffset;
}
public double getIntakePID(){
return intakeAnglePID.calculate(
getIntakeAngle(),
IntakeConstants.kDownAngle
) + intakeFeedForward.calculate(
IntakeConstants.kDownAngle,
0.0
);
}
public double getIntakeDegrees(){
return Math.toDegrees(getIntakeAngle());
}
}

View File

@ -1,163 +0,0 @@
package frc.robot.subsystems;
import java.util.function.BooleanSupplier;
import java.util.function.DoubleSupplier;
import com.revrobotics.CANSparkMax;
import com.revrobotics.CANSparkBase.IdleMode;
import com.revrobotics.CANSparkLowLevel.MotorType;
import edu.wpi.first.math.MathUtil;
import edu.wpi.first.math.controller.ArmFeedforward;
import edu.wpi.first.math.controller.PIDController;
import edu.wpi.first.wpilibj.DigitalInput;
import edu.wpi.first.wpilibj.Encoder;
import edu.wpi.first.wpilibj2.command.Command;
import edu.wpi.first.wpilibj2.command.SubsystemBase;
import frc.robot.constants.ShooterConstants;
public class Shooter extends SubsystemBase{
private CANSparkMax topShooter;
private CANSparkMax bottomShooter;
private CANSparkMax shooterPivot;
private Encoder pivotEncoder;
private PIDController shooterPivotPID;
private ArmFeedforward shooterPivotFF;
private DigitalInput shooterBeamBreak;
private boolean indexerBeamBreak;
public Shooter(BooleanSupplier indexerBeamBreak){
topShooter = new CANSparkMax(ShooterConstants.kTopShooterID, MotorType.kBrushless);
topShooter.setInverted(true);
bottomShooter = new CANSparkMax(ShooterConstants.kBottomShooterID, MotorType.kBrushless);
bottomShooter.setInverted(true);
shooterPivot = new CANSparkMax(ShooterConstants.kShooterPivotID, MotorType.kBrushless);
shooterPivot.setInverted(true);
/*
topPID = topShooter.getPIDController();
topPID.setFeedbackDevice(topEncoder);
bottomPID = bottomShooter.getPIDController();
bottomPID.setFeedbackDevice(bottomEncoder);
*/
shooterPivot.setSmartCurrentLimit(50);
topShooter.setSmartCurrentLimit(40);
bottomShooter.setSmartCurrentLimit(40);
pivotEncoder = new Encoder(0, 1);
pivotEncoder.setDistancePerPulse(ShooterConstants.kPivotConversion);
shooterBeamBreak = new DigitalInput(ShooterConstants.kShooterBeamBreakChannel);
topShooter.setIdleMode(IdleMode.kCoast);
bottomShooter.setIdleMode(IdleMode.kCoast);
bottomShooter.burnFlash();
shooterPivot.burnFlash();
topShooter.burnFlash();
shooterPivotPID = new PIDController(
ShooterConstants.kShooterPivotP,
ShooterConstants.kShooterPivotI,
ShooterConstants.kShooterPivotD
);
shooterPivotFF = new ArmFeedforward(ShooterConstants.kSShooterPivotFF, ShooterConstants.kGShooterPivotFF, ShooterConstants.kVShooterPivotFF);
}
/*
public Command angleSpeedsSetpoints(double setpointAngle, double topRPM, double bottomRPM){
return run(()-> {
angleAndSpeedControl(setpointAngle, topRPM, bottomRPM);
});
}*/
public Command angleSpeedsSetpoints(DoubleSupplier setpointAngle, DoubleSupplier speed){
return run(()-> {
angleAndSpeedControl(setpointAngle.getAsDouble(), speed.getAsDouble(), speed.getAsDouble());
});
}
public Command angleSpeedsSetpoints(DoubleSupplier setpointAngle, double topRPM, double bottomRPM){
return run(()-> {
angleAndSpeedControl(setpointAngle.getAsDouble(), topRPM, bottomRPM);
});
}
private void angleAndSpeedControl(double setpointAngle, double topRPM, double bottomRPM){
shooterPivot.setIdleMode(IdleMode.kBrake);
shooterPivot.setVoltage(
shooterPivotPID.calculate(getShooterAngle(), setpointAngle) +
shooterPivotFF.calculate(setpointAngle, 0.0));
//topPID.setReference(topRPM, CANSparkMax.ControlType.kVelocity);
//bottomPID.setReference(bottomRPM, CANSparkMax.ControlType.kVelocity);
topShooter.set(topRPM);
bottomShooter.set(bottomRPM);
}
public Command ampHandoff(DoubleSupplier shootNoteSpeed, BooleanSupplier ampAngleOrNah){
return run(() -> {
shooterPivot.setIdleMode(IdleMode.kBrake);
shooterPivot.setVoltage(
shooterPivotPID.calculate(getShooterAngle(), ShooterConstants.kShooterLoadAngle) +
shooterPivotFF.calculate(ShooterConstants.kShooterLoadAngle, 0.0));
if(shooterBeamBreak.get() || indexerBeamBreak){
angleAndSpeedControl(ShooterConstants.kShooterLoadAngle, 0.25, 0.25);
}else{
angleAndSpeedControl(ShooterConstants.kShooterLoadAngle, shootNoteSpeed.getAsDouble(), shootNoteSpeed.getAsDouble());
}
});
}
public Command climbState(){
return run(() -> {
shooterPivot.setIdleMode(IdleMode.kCoast);
shooterPivot.set(0.0);
});
}
public double getShooterAngle(){
return pivotEncoder.getDistance() + ShooterConstants.kShooterLoadAngle;
}
public Command zeroEncoder(){
return run(() -> {
pivotEncoder.reset();
});
}
public Boolean getBeamBreak(){
return shooterBeamBreak.get();
}
public Command manualPivot(DoubleSupplier pivotPower, DoubleSupplier spinny){
return run(() ->{
shooterPivot.setIdleMode(IdleMode.kBrake);
if(getShooterAngle() >= ShooterConstants.kShooterLoadAngle && getShooterAngle() <= ShooterConstants.kShooterAmpAngle){
shooterPivot.set(pivotPower.getAsDouble());
}else if(getShooterAngle() > ShooterConstants.kShooterAmpAngle){
shooterPivot.set(MathUtil.clamp(pivotPower.getAsDouble(), -1.0, 0.0));
}else if(getShooterAngle() < ShooterConstants.kShooterLoadAngle){
shooterPivot.set(MathUtil.clamp(pivotPower.getAsDouble(), 0.0, 1.0));
}
topShooter.set(spinny.getAsDouble());
bottomShooter.set(spinny.getAsDouble());
});
}
}

View File

@ -6,7 +6,6 @@ import edu.wpi.first.math.kinematics.SwerveModuleState;
import com.revrobotics.CANSparkMax;
import com.revrobotics.CANSparkLowLevel.MotorType;
import com.revrobotics.CANSparkLowLevel.PeriodicFrame;
import com.revrobotics.SparkAbsoluteEncoder.Type;
import com.revrobotics.SparkPIDController;
import com.revrobotics.AbsoluteEncoder;
@ -37,13 +36,6 @@ public class MAXSwerveModule {
m_drivingSparkMax = new CANSparkMax(drivingCANId, MotorType.kBrushless);
m_turningSparkMax = new CANSparkMax(turningCANId, MotorType.kBrushless);
// The periodic frame update rate for the absolute encoders for position is available to be changed at Status 5
// The update rate for absolute encoder velocity is on Status 6.
// The default update rate for the absolute encoder on both of those status frames is only 200ms which might be causing the swerve jitter
// TODO: test if these changes break the swerve drive or fix the jitter.
m_turningSparkMax.setPeriodicFramePeriod(PeriodicFrame.kStatus5, 20);
m_turningSparkMax.setPeriodicFramePeriod(PeriodicFrame.kStatus6, 20);
// Factory reset, so we get the SPARKS MAX to a known state before configuring
// them. This is useful in case a SPARK MAX is swapped out.
m_drivingSparkMax.restoreFactoryDefaults();
@ -165,8 +157,4 @@ public class MAXSwerveModule {
public void resetEncoders() {
m_drivingEncoder.setPosition(0);
}
public double steeringEncoder(){
return m_turningEncoder.getPosition();
}
}

View File

@ -1,135 +0,0 @@
package frc.robot.utilities;
import java.io.IOException;
import java.util.List;
import java.util.Optional;
import java.util.OptionalDouble;
import org.photonvision.EstimatedRobotPose;
import org.photonvision.PhotonCamera;
import org.photonvision.PhotonPoseEstimator;
import org.photonvision.PhotonUtils;
import org.photonvision.PhotonPoseEstimator.PoseStrategy;
import org.photonvision.targeting.PhotonPipelineResult;
import org.photonvision.targeting.PhotonTrackedTarget;
import edu.wpi.first.apriltag.AprilTagFieldLayout;
import edu.wpi.first.apriltag.AprilTagFields;
import edu.wpi.first.math.geometry.Transform3d;
import edu.wpi.first.math.util.Units;
import frc.robot.interfaces.IAprilTagProvider;
import frc.robot.interfaces.IVisualPoseProvider;
public class PhotonVision implements IAprilTagProvider,IVisualPoseProvider {
private final PhotonCamera camera;
private final PhotonPoseEstimator photonPoseEstimator;
private final double cameraHeightMeters;
private final double cameraPitchRadians;
public PhotonVision(String cameraName, Transform3d robotToCam, double cameraHeightMeters, double cameraPitchRadians) throws IOException {
camera = new PhotonCamera(cameraName);
photonPoseEstimator = new PhotonPoseEstimator(
AprilTagFieldLayout.loadFromResource(
AprilTagFields.k2024Crescendo.m_resourceFile
),
PoseStrategy.MULTI_TAG_PNP_ON_COPROCESSOR,
camera,
robotToCam
);
this.cameraHeightMeters = cameraHeightMeters;
this.cameraPitchRadians = cameraPitchRadians;
}
@Override
public Optional<VisualPose> getVisualPose() {
Optional<EstimatedRobotPose> pose = photonPoseEstimator.update();
if (pose.isEmpty()) {
return Optional.empty();
}
return Optional.of(
new VisualPose(
pose.get().estimatedPose.toPose2d(),
pose.get().timestampSeconds
)
);
}
@Override
public OptionalDouble getTagDistanceFromCameraByID(int id, double targetHeightMeters) {
PhotonPipelineResult result = camera.getLatestResult();
if (!result.hasTargets()) {
return OptionalDouble.empty();
}
Optional<PhotonTrackedTarget> desiredTarget = getTargetFromList(result.getTargets(), id);
if (desiredTarget.isEmpty()) {
return OptionalDouble.empty();
}
return OptionalDouble.of(
PhotonUtils.calculateDistanceToTargetMeters(
cameraHeightMeters,
targetHeightMeters,
cameraPitchRadians,
Units.degreesToRadians(desiredTarget.get().getPitch()))
);
}
@Override
public OptionalDouble getTagPitchByID(int id) {
PhotonPipelineResult result = camera.getLatestResult();
if (!result.hasTargets()) {
return OptionalDouble.empty();
}
Optional<PhotonTrackedTarget> desiredTarget = getTargetFromList(result.getTargets(), id);
if (desiredTarget.isEmpty()) {
return OptionalDouble.empty();
}
return OptionalDouble.of(
desiredTarget.get().getPitch()
);
}
@Override
public OptionalDouble getTagYawByID(int id) {
PhotonPipelineResult result = camera.getLatestResult();
if (!result.hasTargets()) {
return OptionalDouble.empty();
}
Optional<PhotonTrackedTarget> desiredTarget = getTargetFromList(result.getTargets(), id);
if (desiredTarget.isEmpty()) {
return OptionalDouble.empty();
}
return OptionalDouble.of(
desiredTarget.get().getYaw()
);
}
private Optional<PhotonTrackedTarget> getTargetFromList(List<PhotonTrackedTarget> targets, int id) {
for (PhotonTrackedTarget target : targets) {
if (target.getFiducialId() == id) {
return Optional.of(target);
}
}
return Optional.empty();
}
}

View File

@ -0,0 +1,62 @@
package frc.robot.utilities;
import edu.wpi.first.math.geometry.Pose2d;
import edu.wpi.first.math.geometry.Rotation2d;
import edu.wpi.first.util.sendable.Sendable;
import edu.wpi.first.util.sendable.SendableBuilder;
public class PoseSendable implements Sendable {
private double x;
private double y;
private double rot;
public PoseSendable() {
this(0, 0, 0);
}
public PoseSendable(double x, double y, double rot) {
this.x = x;
this.y = y;
this.rot = rot;
}
public double getX() {
return x;
}
public double getY() {
return y;
}
public double getRotation() {
return rot;
}
public Rotation2d getRotation2d() {
return Rotation2d.fromDegrees(rot);
}
public Pose2d getPose() {
return new Pose2d(x, y, getRotation2d());
}
public void setX(double x) {
this.x = x;
}
public void setY(double y) {
this.y = y;
}
public void setRotation(double rot) {
this.rot = rot;
}
@Override
public void initSendable(SendableBuilder builder) {
builder.addDoubleProperty("X", this::getX, this::setX);
builder.addDoubleProperty("Y", this::getY, this::setY);
builder.addDoubleProperty("Rotation", this::getRotation, this::setRotation);
}
}

View File

@ -1,7 +1,7 @@
{
"fileName": "PathplannerLib.json",
"name": "PathplannerLib",
"version": "2024.2.7",
"version": "2024.2.4",
"uuid": "1b42324f-17c6-4875-8e77-1c312bc8c786",
"frcYear": "2024",
"mavenUrls": [
@ -12,7 +12,7 @@
{
"groupId": "com.pathplanner.lib",
"artifactId": "PathplannerLib-java",
"version": "2024.2.7"
"version": "2024.2.4"
}
],
"jniDependencies": [],
@ -20,7 +20,7 @@
{
"groupId": "com.pathplanner.lib",
"artifactId": "PathplannerLib-cpp",
"version": "2024.2.7",
"version": "2024.2.4",
"libName": "PathplannerLib",
"headerClassifier": "headers",
"sharedLibrary": false,

View File

@ -1,7 +1,7 @@
{
"fileName": "Phoenix5.json",
"name": "CTRE-Phoenix (v5)",
"version": "5.33.1",
"version": "5.33.0",
"frcYear": 2024,
"uuid": "ab676553-b602-441f-a38d-f1296eff6537",
"mavenUrls": [
@ -20,19 +20,19 @@
{
"groupId": "com.ctre.phoenix",
"artifactId": "api-java",
"version": "5.33.1"
"version": "5.33.0"
},
{
"groupId": "com.ctre.phoenix",
"artifactId": "wpiapi-java",
"version": "5.33.1"
"version": "5.33.0"
}
],
"jniDependencies": [
{
"groupId": "com.ctre.phoenix",
"artifactId": "cci",
"version": "5.33.1",
"version": "5.33.0",
"isJar": false,
"skipInvalidPlatforms": true,
"validPlatforms": [
@ -45,7 +45,7 @@
{
"groupId": "com.ctre.phoenix.sim",
"artifactId": "cci-sim",
"version": "5.33.1",
"version": "5.33.0",
"isJar": false,
"skipInvalidPlatforms": true,
"validPlatforms": [
@ -60,7 +60,7 @@
{
"groupId": "com.ctre.phoenix",
"artifactId": "wpiapi-cpp",
"version": "5.33.1",
"version": "5.33.0",
"libName": "CTRE_Phoenix_WPI",
"headerClassifier": "headers",
"sharedLibrary": true,
@ -75,7 +75,7 @@
{
"groupId": "com.ctre.phoenix",
"artifactId": "api-cpp",
"version": "5.33.1",
"version": "5.33.0",
"libName": "CTRE_Phoenix",
"headerClassifier": "headers",
"sharedLibrary": true,
@ -90,7 +90,7 @@
{
"groupId": "com.ctre.phoenix",
"artifactId": "cci",
"version": "5.33.1",
"version": "5.33.0",
"libName": "CTRE_PhoenixCCI",
"headerClassifier": "headers",
"sharedLibrary": true,
@ -105,7 +105,7 @@
{
"groupId": "com.ctre.phoenix.sim",
"artifactId": "wpiapi-cpp-sim",
"version": "5.33.1",
"version": "5.33.0",
"libName": "CTRE_Phoenix_WPISim",
"headerClassifier": "headers",
"sharedLibrary": true,
@ -120,7 +120,7 @@
{
"groupId": "com.ctre.phoenix.sim",
"artifactId": "api-cpp-sim",
"version": "5.33.1",
"version": "5.33.0",
"libName": "CTRE_PhoenixSim",
"headerClassifier": "headers",
"sharedLibrary": true,
@ -135,7 +135,7 @@
{
"groupId": "com.ctre.phoenix.sim",
"artifactId": "cci-sim",
"version": "5.33.1",
"version": "5.33.0",
"libName": "CTRE_PhoenixCCISim",
"headerClassifier": "headers",
"sharedLibrary": true,

View File

@ -1,7 +1,7 @@
{
"fileName": "REVLib.json",
"name": "REVLib",
"version": "2024.2.4",
"version": "2024.2.2",
"frcYear": "2024",
"uuid": "3f48eb8c-50fe-43a6-9cb7-44c86353c4cb",
"mavenUrls": [
@ -12,14 +12,14 @@
{
"groupId": "com.revrobotics.frc",
"artifactId": "REVLib-java",
"version": "2024.2.4"
"version": "2024.2.2"
}
],
"jniDependencies": [
{
"groupId": "com.revrobotics.frc",
"artifactId": "REVLib-driver",
"version": "2024.2.4",
"version": "2024.2.2",
"skipInvalidPlatforms": true,
"isJar": false,
"validPlatforms": [
@ -37,7 +37,7 @@
{
"groupId": "com.revrobotics.frc",
"artifactId": "REVLib-cpp",
"version": "2024.2.4",
"version": "2024.2.2",
"libName": "REVLib",
"headerClassifier": "headers",
"sharedLibrary": false,
@ -55,7 +55,7 @@
{
"groupId": "com.revrobotics.frc",
"artifactId": "REVLib-driver",
"version": "2024.2.4",
"version": "2024.2.2",
"libName": "REVLibDriver",
"headerClassifier": "headers",
"sharedLibrary": false,