Compare commits
20 Commits
tuning
...
80c2a4dd95
| Author | SHA1 | Date | |
|---|---|---|---|
| 80c2a4dd95 | |||
| d9c16bb05c | |||
| db4bab6e16 | |||
| cb1c7ba0e3 | |||
| b8c376499b | |||
| 7e02ec1ccc | |||
|
|
235f43fd2e | ||
| d29acde2df | |||
| 048c7158ee | |||
| a8833aaf5b | |||
| 47606ade0f | |||
| a6dca0925f | |||
|
|
72a07b3d7a | ||
| 5e1eadf887 | |||
| 21c0421a88 | |||
| 81d6c36436 | |||
| f1f523de73 | |||
| 10fb8d4aa5 | |||
| 77f2c54a90 | |||
|
|
4171da889f |
37
src/main/deploy/pathplanner/autos/Center Back up.auto
Normal file
37
src/main/deploy/pathplanner/autos/Center Back up.auto
Normal file
@@ -0,0 +1,37 @@
|
||||
{
|
||||
"version": "2025.0",
|
||||
"command": {
|
||||
"type": "sequential",
|
||||
"data": {
|
||||
"commands": [
|
||||
{
|
||||
"type": "named",
|
||||
"data": {
|
||||
"name": "intake down"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "named",
|
||||
"data": {
|
||||
"name": "spinup"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "path",
|
||||
"data": {
|
||||
"pathName": "Center to Shoot"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "named",
|
||||
"data": {
|
||||
"name": "shoot close"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"resetOdom": true,
|
||||
"folder": null,
|
||||
"choreoAuto": false
|
||||
}
|
||||
67
src/main/deploy/pathplanner/autos/Left Shoot Outpost.auto
Normal file
67
src/main/deploy/pathplanner/autos/Left Shoot Outpost.auto
Normal file
@@ -0,0 +1,67 @@
|
||||
{
|
||||
"version": "2025.0",
|
||||
"command": {
|
||||
"type": "sequential",
|
||||
"data": {
|
||||
"commands": [
|
||||
{
|
||||
"type": "named",
|
||||
"data": {
|
||||
"name": "intake down"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "named",
|
||||
"data": {
|
||||
"name": "spinup"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "path",
|
||||
"data": {
|
||||
"pathName": "start to score left"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "named",
|
||||
"data": {
|
||||
"name": "shoot close"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "path",
|
||||
"data": {
|
||||
"pathName": "Left to Outpost"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "named",
|
||||
"data": {
|
||||
"name": "stop spindexer"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "path",
|
||||
"data": {
|
||||
"pathName": "trough to shot"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "named",
|
||||
"data": {
|
||||
"name": "spinup"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "named",
|
||||
"data": {
|
||||
"name": "shoot N jimmy"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"resetOdom": true,
|
||||
"folder": null,
|
||||
"choreoAuto": false
|
||||
}
|
||||
@@ -0,0 +1,69 @@
|
||||
{
|
||||
"version": "2025.0",
|
||||
"command": {
|
||||
"type": "sequential",
|
||||
"data": {
|
||||
"commands": [
|
||||
{
|
||||
"type": "named",
|
||||
"data": {
|
||||
"name": "intake down"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "path",
|
||||
"data": {
|
||||
"pathName": "left start to center"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "parallel",
|
||||
"data": {
|
||||
"commands": [
|
||||
{
|
||||
"type": "path",
|
||||
"data": {
|
||||
"pathName": "over bump to pile move"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "named",
|
||||
"data": {
|
||||
"name": "spinup"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "parallel",
|
||||
"data": {
|
||||
"commands": [
|
||||
{
|
||||
"type": "path",
|
||||
"data": {
|
||||
"pathName": "back from center"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "named",
|
||||
"data": {
|
||||
"name": "spinup"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "named",
|
||||
"data": {
|
||||
"name": "auto shoot"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"resetOdom": true,
|
||||
"folder": null,
|
||||
"choreoAuto": false
|
||||
}
|
||||
69
src/main/deploy/pathplanner/autos/left to center.auto
Normal file
69
src/main/deploy/pathplanner/autos/left to center.auto
Normal file
@@ -0,0 +1,69 @@
|
||||
{
|
||||
"version": "2025.0",
|
||||
"command": {
|
||||
"type": "sequential",
|
||||
"data": {
|
||||
"commands": [
|
||||
{
|
||||
"type": "named",
|
||||
"data": {
|
||||
"name": "intake down"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "path",
|
||||
"data": {
|
||||
"pathName": "left start to center"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "parallel",
|
||||
"data": {
|
||||
"commands": [
|
||||
{
|
||||
"type": "path",
|
||||
"data": {
|
||||
"pathName": "over bump to pile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "named",
|
||||
"data": {
|
||||
"name": "spinup"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "parallel",
|
||||
"data": {
|
||||
"commands": [
|
||||
{
|
||||
"type": "path",
|
||||
"data": {
|
||||
"pathName": "back from center"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "named",
|
||||
"data": {
|
||||
"name": "spinup"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "named",
|
||||
"data": {
|
||||
"name": "auto shoot"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"resetOdom": true,
|
||||
"folder": null,
|
||||
"choreoAuto": false
|
||||
}
|
||||
54
src/main/deploy/pathplanner/paths/Center to Shoot.path
Normal file
54
src/main/deploy/pathplanner/paths/Center to Shoot.path
Normal file
@@ -0,0 +1,54 @@
|
||||
{
|
||||
"version": "2025.0",
|
||||
"waypoints": [
|
||||
{
|
||||
"anchor": {
|
||||
"x": 3.622028469750891,
|
||||
"y": 4.008102016607354
|
||||
},
|
||||
"prevControl": null,
|
||||
"nextControl": {
|
||||
"x": 3.266975088967973,
|
||||
"y": 4.0403795966785285
|
||||
},
|
||||
"isLocked": false,
|
||||
"linkedName": null
|
||||
},
|
||||
{
|
||||
"anchor": {
|
||||
"x": 3.1271055753262162,
|
||||
"y": 4.008102016607354
|
||||
},
|
||||
"prevControl": {
|
||||
"x": 4.0416370106761565,
|
||||
"y": 4.0403795966785285
|
||||
},
|
||||
"nextControl": null,
|
||||
"isLocked": false,
|
||||
"linkedName": null
|
||||
}
|
||||
],
|
||||
"rotationTargets": [],
|
||||
"constraintZones": [],
|
||||
"pointTowardsZones": [],
|
||||
"eventMarkers": [],
|
||||
"globalConstraints": {
|
||||
"maxVelocity": 2.0,
|
||||
"maxAcceleration": 1.5,
|
||||
"maxAngularVelocity": 540.0,
|
||||
"maxAngularAcceleration": 720.0,
|
||||
"nominalVoltage": 12.0,
|
||||
"unlimited": false
|
||||
},
|
||||
"goalEndState": {
|
||||
"velocity": 0,
|
||||
"rotation": 0.0
|
||||
},
|
||||
"reversed": false,
|
||||
"folder": null,
|
||||
"idealStartingState": {
|
||||
"velocity": 0,
|
||||
"rotation": 0.0
|
||||
},
|
||||
"useDefaultConstraints": true
|
||||
}
|
||||
@@ -33,8 +33,8 @@
|
||||
"pointTowardsZones": [],
|
||||
"eventMarkers": [],
|
||||
"globalConstraints": {
|
||||
"maxVelocity": 3.0,
|
||||
"maxAcceleration": 3.0,
|
||||
"maxVelocity": 2.0,
|
||||
"maxAcceleration": 1.5,
|
||||
"maxAngularVelocity": 540.0,
|
||||
"maxAngularAcceleration": 720.0,
|
||||
"nominalVoltage": 12.0,
|
||||
|
||||
80
src/main/deploy/pathplanner/paths/Left to Outpost.path
Normal file
80
src/main/deploy/pathplanner/paths/Left to Outpost.path
Normal file
@@ -0,0 +1,80 @@
|
||||
{
|
||||
"version": "2025.0",
|
||||
"waypoints": [
|
||||
{
|
||||
"anchor": {
|
||||
"x": 3.2515736040609142,
|
||||
"y": 4.914375634517767
|
||||
},
|
||||
"prevControl": null,
|
||||
"nextControl": {
|
||||
"x": 2.4338749089244973,
|
||||
"y": 5.333984175443034
|
||||
},
|
||||
"isLocked": false,
|
||||
"linkedName": "left close"
|
||||
},
|
||||
{
|
||||
"anchor": {
|
||||
"x": 0.77458883248731,
|
||||
"y": 5.927269035532995
|
||||
},
|
||||
"prevControl": {
|
||||
"x": 2.3777086426889733,
|
||||
"y": 6.110175322602984
|
||||
},
|
||||
"nextControl": null,
|
||||
"isLocked": false,
|
||||
"linkedName": "trough"
|
||||
}
|
||||
],
|
||||
"rotationTargets": [
|
||||
{
|
||||
"waypointRelativePos": 0.5,
|
||||
"rotationDegrees": 180.0
|
||||
}
|
||||
],
|
||||
"constraintZones": [
|
||||
{
|
||||
"name": "Constraints Zone",
|
||||
"minWaypointRelativePos": 0.3963599595551063,
|
||||
"maxWaypointRelativePos": 1.0,
|
||||
"constraints": {
|
||||
"maxVelocity": 3.0,
|
||||
"maxAcceleration": 4.0,
|
||||
"maxAngularVelocity": 540.0,
|
||||
"maxAngularAcceleration": 720.0,
|
||||
"nominalVoltage": 12.0,
|
||||
"unlimited": false
|
||||
}
|
||||
}
|
||||
],
|
||||
"pointTowardsZones": [],
|
||||
"eventMarkers": [
|
||||
{
|
||||
"name": "Intake Start",
|
||||
"waypointRelativePos": 0.09706774519716882,
|
||||
"endWaypointRelativePos": null,
|
||||
"command": null
|
||||
}
|
||||
],
|
||||
"globalConstraints": {
|
||||
"maxVelocity": 2.0,
|
||||
"maxAcceleration": 1.5,
|
||||
"maxAngularVelocity": 540.0,
|
||||
"maxAngularAcceleration": 720.0,
|
||||
"nominalVoltage": 12.0,
|
||||
"unlimited": false
|
||||
},
|
||||
"goalEndState": {
|
||||
"velocity": 0,
|
||||
"rotation": 178.80651057601818
|
||||
},
|
||||
"reversed": false,
|
||||
"folder": null,
|
||||
"idealStartingState": {
|
||||
"velocity": 0,
|
||||
"rotation": -31.15930450834445
|
||||
},
|
||||
"useDefaultConstraints": true
|
||||
}
|
||||
@@ -69,7 +69,7 @@
|
||||
},
|
||||
"prevControl": {
|
||||
"x": 8.08578683847011,
|
||||
"y": 0.49077040160283747
|
||||
"y": 0.4907704016028374
|
||||
},
|
||||
"nextControl": {
|
||||
"x": 8.318287488908608,
|
||||
@@ -130,8 +130,8 @@
|
||||
"pointTowardsZones": [],
|
||||
"eventMarkers": [],
|
||||
"globalConstraints": {
|
||||
"maxVelocity": 3.0,
|
||||
"maxAcceleration": 3.0,
|
||||
"maxVelocity": 2.0,
|
||||
"maxAcceleration": 1.5,
|
||||
"maxAngularVelocity": 540.0,
|
||||
"maxAngularAcceleration": 720.0,
|
||||
"nominalVoltage": 12.0,
|
||||
|
||||
@@ -33,8 +33,8 @@
|
||||
"pointTowardsZones": [],
|
||||
"eventMarkers": [],
|
||||
"globalConstraints": {
|
||||
"maxVelocity": 3.0,
|
||||
"maxAcceleration": 3.0,
|
||||
"maxVelocity": 2.0,
|
||||
"maxAcceleration": 1.5,
|
||||
"maxAngularVelocity": 540.0,
|
||||
"maxAngularAcceleration": 720.0,
|
||||
"nominalVoltage": 12.0,
|
||||
@@ -42,7 +42,7 @@
|
||||
},
|
||||
"goalEndState": {
|
||||
"velocity": 0,
|
||||
"rotation": 24.304549265936604
|
||||
"rotation": 24.304549265936608
|
||||
},
|
||||
"reversed": false,
|
||||
"folder": "Right Outpost",
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
"y": 0.668228980317108
|
||||
},
|
||||
"prevControl": {
|
||||
"x": 1.6987119856944102,
|
||||
"x": 1.6987119856944104,
|
||||
"y": 1.0414132379199703
|
||||
},
|
||||
"nextControl": null,
|
||||
@@ -45,8 +45,8 @@
|
||||
}
|
||||
],
|
||||
"globalConstraints": {
|
||||
"maxVelocity": 3.0,
|
||||
"maxAcceleration": 3.0,
|
||||
"maxVelocity": 2.0,
|
||||
"maxAcceleration": 1.5,
|
||||
"maxAngularVelocity": 540.0,
|
||||
"maxAngularAcceleration": 720.0,
|
||||
"nominalVoltage": 12.0,
|
||||
|
||||
63
src/main/deploy/pathplanner/paths/back from center.path
Normal file
63
src/main/deploy/pathplanner/paths/back from center.path
Normal file
@@ -0,0 +1,63 @@
|
||||
{
|
||||
"version": "2025.0",
|
||||
"waypoints": [
|
||||
{
|
||||
"anchor": {
|
||||
"x": 6.428375634517765,
|
||||
"y": 5.715482233502538
|
||||
},
|
||||
"prevControl": null,
|
||||
"nextControl": {
|
||||
"x": 5.507563451776648,
|
||||
"y": 5.7523147208121825
|
||||
},
|
||||
"isLocked": false,
|
||||
"linkedName": "over bump"
|
||||
},
|
||||
{
|
||||
"anchor": {
|
||||
"x": 3.002954314720812,
|
||||
"y": 5.310324873096447
|
||||
},
|
||||
"prevControl": {
|
||||
"x": 4.052680203045686,
|
||||
"y": 5.9825177664974625
|
||||
},
|
||||
"nextControl": null,
|
||||
"isLocked": false,
|
||||
"linkedName": null
|
||||
}
|
||||
],
|
||||
"rotationTargets": [
|
||||
{
|
||||
"waypointRelativePos": 0.10454545454545605,
|
||||
"rotationDegrees": -115.0
|
||||
},
|
||||
{
|
||||
"waypointRelativePos": 0.7931818181818296,
|
||||
"rotationDegrees": -115.0
|
||||
}
|
||||
],
|
||||
"constraintZones": [],
|
||||
"pointTowardsZones": [],
|
||||
"eventMarkers": [],
|
||||
"globalConstraints": {
|
||||
"maxVelocity": 4.0,
|
||||
"maxAcceleration": 2.0,
|
||||
"maxAngularVelocity": 540.0,
|
||||
"maxAngularAcceleration": 720.0,
|
||||
"nominalVoltage": 12.0,
|
||||
"unlimited": false
|
||||
},
|
||||
"goalEndState": {
|
||||
"velocity": 0,
|
||||
"rotation": -36.158185439808385
|
||||
},
|
||||
"reversed": false,
|
||||
"folder": null,
|
||||
"idealStartingState": {
|
||||
"velocity": 0,
|
||||
"rotation": -129.95754893082906
|
||||
},
|
||||
"useDefaultConstraints": false
|
||||
}
|
||||
91
src/main/deploy/pathplanner/paths/left start to center.path
Normal file
91
src/main/deploy/pathplanner/paths/left start to center.path
Normal file
@@ -0,0 +1,91 @@
|
||||
{
|
||||
"version": "2025.0",
|
||||
"waypoints": [
|
||||
{
|
||||
"anchor": {
|
||||
"x": 3.573857868020305,
|
||||
"y": 6.3692588832487305
|
||||
},
|
||||
"prevControl": null,
|
||||
"nextControl": {
|
||||
"x": 2.9108730964467004,
|
||||
"y": 6.498172588832488
|
||||
},
|
||||
"isLocked": false,
|
||||
"linkedName": "start left"
|
||||
},
|
||||
{
|
||||
"anchor": {
|
||||
"x": 2.5885888324873094,
|
||||
"y": 5.936477157360406
|
||||
},
|
||||
"prevControl": {
|
||||
"x": 2.3675939086294413,
|
||||
"y": 6.28638578680203
|
||||
},
|
||||
"nextControl": {
|
||||
"x": 2.8493791599284664,
|
||||
"y": 5.523559138911907
|
||||
},
|
||||
"isLocked": false,
|
||||
"linkedName": null
|
||||
},
|
||||
{
|
||||
"anchor": {
|
||||
"x": 4.577543147208122,
|
||||
"y": 5.715482233502538
|
||||
},
|
||||
"prevControl": {
|
||||
"x": 3.565840773084476,
|
||||
"y": 5.768729726877464
|
||||
},
|
||||
"nextControl": {
|
||||
"x": 5.102406091370558,
|
||||
"y": 5.687857868020306
|
||||
},
|
||||
"isLocked": false,
|
||||
"linkedName": null
|
||||
},
|
||||
{
|
||||
"anchor": {
|
||||
"x": 6.428375634517765,
|
||||
"y": 5.715482233502538
|
||||
},
|
||||
"prevControl": {
|
||||
"x": 5.903512690355329,
|
||||
"y": 5.807563451776649
|
||||
},
|
||||
"nextControl": null,
|
||||
"isLocked": false,
|
||||
"linkedName": "over bump"
|
||||
}
|
||||
],
|
||||
"rotationTargets": [
|
||||
{
|
||||
"waypointRelativePos": 1.62272727272727,
|
||||
"rotationDegrees": -135.0
|
||||
}
|
||||
],
|
||||
"constraintZones": [],
|
||||
"pointTowardsZones": [],
|
||||
"eventMarkers": [],
|
||||
"globalConstraints": {
|
||||
"maxVelocity": 3.0,
|
||||
"maxAcceleration": 2.0,
|
||||
"maxAngularVelocity": 540.0,
|
||||
"maxAngularAcceleration": 720.0,
|
||||
"nominalVoltage": 12.0,
|
||||
"unlimited": false
|
||||
},
|
||||
"goalEndState": {
|
||||
"velocity": 1.0,
|
||||
"rotation": -129.95754893082906
|
||||
},
|
||||
"reversed": false,
|
||||
"folder": null,
|
||||
"idealStartingState": {
|
||||
"velocity": 0,
|
||||
"rotation": -90.0
|
||||
},
|
||||
"useDefaultConstraints": false
|
||||
}
|
||||
116
src/main/deploy/pathplanner/paths/over bump to pile move.path
Normal file
116
src/main/deploy/pathplanner/paths/over bump to pile move.path
Normal file
@@ -0,0 +1,116 @@
|
||||
{
|
||||
"version": "2025.0",
|
||||
"waypoints": [
|
||||
{
|
||||
"anchor": {
|
||||
"x": 6.428375634517765,
|
||||
"y": 5.715482233502538
|
||||
},
|
||||
"prevControl": null,
|
||||
"nextControl": {
|
||||
"x": 6.897989847715735,
|
||||
"y": 6.406091370558377
|
||||
},
|
||||
"isLocked": false,
|
||||
"linkedName": "over bump"
|
||||
},
|
||||
{
|
||||
"anchor": {
|
||||
"x": 7.2386903553299495,
|
||||
"y": 7.326903553299493
|
||||
},
|
||||
"prevControl": {
|
||||
"x": 6.2386903553299495,
|
||||
"y": 7.326903553299493
|
||||
},
|
||||
"nextControl": {
|
||||
"x": 8.238690355329947,
|
||||
"y": 7.326903553299493
|
||||
},
|
||||
"isLocked": false,
|
||||
"linkedName": null
|
||||
},
|
||||
{
|
||||
"anchor": {
|
||||
"x": 8.417329949238578,
|
||||
"y": 4.831502538071066
|
||||
},
|
||||
"prevControl": {
|
||||
"x": 8.475340101522843,
|
||||
"y": 6.042370558375635
|
||||
},
|
||||
"nextControl": {
|
||||
"x": 8.359319796954313,
|
||||
"y": 3.620634517766498
|
||||
},
|
||||
"isLocked": false,
|
||||
"linkedName": null
|
||||
},
|
||||
{
|
||||
"anchor": {
|
||||
"x": 6.428375634517765,
|
||||
"y": 5.715482233502538
|
||||
},
|
||||
"prevControl": {
|
||||
"x": 7.375431472081217,
|
||||
"y": 5.183713197969544
|
||||
},
|
||||
"nextControl": null,
|
||||
"isLocked": false,
|
||||
"linkedName": "over bump"
|
||||
}
|
||||
],
|
||||
"rotationTargets": [
|
||||
{
|
||||
"waypointRelativePos": 1.0045454545454569,
|
||||
"rotationDegrees": -115.0
|
||||
},
|
||||
{
|
||||
"waypointRelativePos": 2.348863636363685,
|
||||
"rotationDegrees": -115.0
|
||||
}
|
||||
],
|
||||
"constraintZones": [
|
||||
{
|
||||
"name": "Constraints Zone",
|
||||
"minWaypointRelativePos": 1.1243680485338854,
|
||||
"maxWaypointRelativePos": 2.0,
|
||||
"constraints": {
|
||||
"maxVelocity": 1.0,
|
||||
"maxAcceleration": 1.5,
|
||||
"maxAngularVelocity": 540.0,
|
||||
"maxAngularAcceleration": 720.0,
|
||||
"nominalVoltage": 12.0,
|
||||
"unlimited": false
|
||||
}
|
||||
}
|
||||
],
|
||||
"pointTowardsZones": [],
|
||||
"eventMarkers": [
|
||||
{
|
||||
"name": "Intake Start",
|
||||
"waypointRelativePos": 0.7886754297269942,
|
||||
"endWaypointRelativePos": null,
|
||||
"command": null
|
||||
}
|
||||
],
|
||||
"globalConstraints": {
|
||||
"maxVelocity": 2.0,
|
||||
"maxAcceleration": 1.5,
|
||||
"maxAngularVelocity": 540.0,
|
||||
"maxAngularAcceleration": 720.0,
|
||||
"nominalVoltage": 12.0,
|
||||
"unlimited": false
|
||||
},
|
||||
"goalEndState": {
|
||||
"velocity": 2.0,
|
||||
"rotation": -129.95754893082906
|
||||
},
|
||||
"reversed": false,
|
||||
"folder": null,
|
||||
"idealStartingState": {
|
||||
"velocity": 0,
|
||||
"rotation": -129.95754893082906
|
||||
},
|
||||
"useDefaultConstraints": true
|
||||
}
|
||||
116
src/main/deploy/pathplanner/paths/over bump to pile.path
Normal file
116
src/main/deploy/pathplanner/paths/over bump to pile.path
Normal file
@@ -0,0 +1,116 @@
|
||||
{
|
||||
"version": "2025.0",
|
||||
"waypoints": [
|
||||
{
|
||||
"anchor": {
|
||||
"x": 6.428375634517765,
|
||||
"y": 5.715482233502538
|
||||
},
|
||||
"prevControl": null,
|
||||
"nextControl": {
|
||||
"x": 6.897989847715735,
|
||||
"y": 6.406091370558377
|
||||
},
|
||||
"isLocked": false,
|
||||
"linkedName": "over bump"
|
||||
},
|
||||
{
|
||||
"anchor": {
|
||||
"x": 7.017695431472081,
|
||||
"y": 7.216406091370559
|
||||
},
|
||||
"prevControl": {
|
||||
"x": 6.017695431472081,
|
||||
"y": 7.216406091370559
|
||||
},
|
||||
"nextControl": {
|
||||
"x": 8.017695431472081,
|
||||
"y": 7.216406091370559
|
||||
},
|
||||
"isLocked": false,
|
||||
"linkedName": null
|
||||
},
|
||||
{
|
||||
"anchor": {
|
||||
"x": 7.883258883248731,
|
||||
"y": 4.831502538071066
|
||||
},
|
||||
"prevControl": {
|
||||
"x": 7.941269035532995,
|
||||
"y": 6.042370558375635
|
||||
},
|
||||
"nextControl": {
|
||||
"x": 7.825248730964466,
|
||||
"y": 3.620634517766498
|
||||
},
|
||||
"isLocked": false,
|
||||
"linkedName": null
|
||||
},
|
||||
{
|
||||
"anchor": {
|
||||
"x": 6.428375634517765,
|
||||
"y": 5.715482233502538
|
||||
},
|
||||
"prevControl": {
|
||||
"x": 7.375431472081217,
|
||||
"y": 5.183713197969544
|
||||
},
|
||||
"nextControl": null,
|
||||
"isLocked": false,
|
||||
"linkedName": "over bump"
|
||||
}
|
||||
],
|
||||
"rotationTargets": [
|
||||
{
|
||||
"waypointRelativePos": 1.0045454545454569,
|
||||
"rotationDegrees": -115.0
|
||||
},
|
||||
{
|
||||
"waypointRelativePos": 2.348863636363685,
|
||||
"rotationDegrees": -115.0
|
||||
}
|
||||
],
|
||||
"constraintZones": [
|
||||
{
|
||||
"name": "Constraints Zone",
|
||||
"minWaypointRelativePos": 1.1243680485338854,
|
||||
"maxWaypointRelativePos": 2.0,
|
||||
"constraints": {
|
||||
"maxVelocity": 1.0,
|
||||
"maxAcceleration": 1.5,
|
||||
"maxAngularVelocity": 540.0,
|
||||
"maxAngularAcceleration": 720.0,
|
||||
"nominalVoltage": 12.0,
|
||||
"unlimited": false
|
||||
}
|
||||
}
|
||||
],
|
||||
"pointTowardsZones": [],
|
||||
"eventMarkers": [
|
||||
{
|
||||
"name": "Intake Start",
|
||||
"waypointRelativePos": 0.7886754297269942,
|
||||
"endWaypointRelativePos": null,
|
||||
"command": null
|
||||
}
|
||||
],
|
||||
"globalConstraints": {
|
||||
"maxVelocity": 2.0,
|
||||
"maxAcceleration": 1.5,
|
||||
"maxAngularVelocity": 540.0,
|
||||
"maxAngularAcceleration": 720.0,
|
||||
"nominalVoltage": 12.0,
|
||||
"unlimited": false
|
||||
},
|
||||
"goalEndState": {
|
||||
"velocity": 0,
|
||||
"rotation": -129.95754893082906
|
||||
},
|
||||
"reversed": false,
|
||||
"folder": null,
|
||||
"idealStartingState": {
|
||||
"velocity": 0,
|
||||
"rotation": -129.95754893082906
|
||||
},
|
||||
"useDefaultConstraints": true
|
||||
}
|
||||
54
src/main/deploy/pathplanner/paths/start to score left.path
Normal file
54
src/main/deploy/pathplanner/paths/start to score left.path
Normal file
@@ -0,0 +1,54 @@
|
||||
{
|
||||
"version": "2025.0",
|
||||
"waypoints": [
|
||||
{
|
||||
"anchor": {
|
||||
"x": 3.573857868020305,
|
||||
"y": 6.3692588832487305
|
||||
},
|
||||
"prevControl": null,
|
||||
"nextControl": {
|
||||
"x": 2.7991959463121194,
|
||||
"y": 6.260219737341258
|
||||
},
|
||||
"isLocked": false,
|
||||
"linkedName": "start left"
|
||||
},
|
||||
{
|
||||
"anchor": {
|
||||
"x": 3.2515736040609142,
|
||||
"y": 4.914375634517767
|
||||
},
|
||||
"prevControl": {
|
||||
"x": 3.44523908448796,
|
||||
"y": 5.430816915656558
|
||||
},
|
||||
"nextControl": null,
|
||||
"isLocked": false,
|
||||
"linkedName": "left close"
|
||||
}
|
||||
],
|
||||
"rotationTargets": [],
|
||||
"constraintZones": [],
|
||||
"pointTowardsZones": [],
|
||||
"eventMarkers": [],
|
||||
"globalConstraints": {
|
||||
"maxVelocity": 2.0,
|
||||
"maxAcceleration": 1.5,
|
||||
"maxAngularVelocity": 540.0,
|
||||
"maxAngularAcceleration": 720.0,
|
||||
"nominalVoltage": 12.0,
|
||||
"unlimited": false
|
||||
},
|
||||
"goalEndState": {
|
||||
"velocity": 0,
|
||||
"rotation": -31.15930450834445
|
||||
},
|
||||
"reversed": false,
|
||||
"folder": null,
|
||||
"idealStartingState": {
|
||||
"velocity": 0,
|
||||
"rotation": -90.0
|
||||
},
|
||||
"useDefaultConstraints": true
|
||||
}
|
||||
54
src/main/deploy/pathplanner/paths/trough to shot.path
Normal file
54
src/main/deploy/pathplanner/paths/trough to shot.path
Normal file
@@ -0,0 +1,54 @@
|
||||
{
|
||||
"version": "2025.0",
|
||||
"waypoints": [
|
||||
{
|
||||
"anchor": {
|
||||
"x": 0.77458883248731,
|
||||
"y": 5.927269035532995
|
||||
},
|
||||
"prevControl": null,
|
||||
"nextControl": {
|
||||
"x": 1.7745888324873098,
|
||||
"y": 5.927269035532995
|
||||
},
|
||||
"isLocked": false,
|
||||
"linkedName": "trough"
|
||||
},
|
||||
{
|
||||
"anchor": {
|
||||
"x": 3.2515736040609142,
|
||||
"y": 4.914375634517767
|
||||
},
|
||||
"prevControl": {
|
||||
"x": 2.6254213197969554,
|
||||
"y": 5.420822335025381
|
||||
},
|
||||
"nextControl": null,
|
||||
"isLocked": false,
|
||||
"linkedName": "left close"
|
||||
}
|
||||
],
|
||||
"rotationTargets": [],
|
||||
"constraintZones": [],
|
||||
"pointTowardsZones": [],
|
||||
"eventMarkers": [],
|
||||
"globalConstraints": {
|
||||
"maxVelocity": 2.0,
|
||||
"maxAcceleration": 1.5,
|
||||
"maxAngularVelocity": 540.0,
|
||||
"maxAngularAcceleration": 720.0,
|
||||
"nominalVoltage": 12.0,
|
||||
"unlimited": false
|
||||
},
|
||||
"goalEndState": {
|
||||
"velocity": 0,
|
||||
"rotation": -31.15930450834445
|
||||
},
|
||||
"reversed": false,
|
||||
"folder": null,
|
||||
"idealStartingState": {
|
||||
"velocity": 0,
|
||||
"rotation": 178.80651057601818
|
||||
},
|
||||
"useDefaultConstraints": true
|
||||
}
|
||||
@@ -6,8 +6,8 @@
|
||||
"Right Outpost"
|
||||
],
|
||||
"autoFolders": [],
|
||||
"defaultMaxVel": 3.0,
|
||||
"defaultMaxAccel": 3.0,
|
||||
"defaultMaxVel": 2.0,
|
||||
"defaultMaxAccel": 1.5,
|
||||
"defaultMaxAngVel": 540.0,
|
||||
"defaultMaxAngAccel": 720.0,
|
||||
"defaultNominalVoltage": 12.0,
|
||||
|
||||
@@ -5,19 +5,31 @@
|
||||
package frc.robot;
|
||||
|
||||
import edu.wpi.first.wpilibj.DriverStation.Alliance;
|
||||
import edu.wpi.first.wpilibj.GenericHID.RumbleType;
|
||||
|
||||
import java.util.Optional;
|
||||
import java.util.OptionalDouble;
|
||||
|
||||
import org.littletonrobotics.junction.Logger;
|
||||
|
||||
import com.pathplanner.lib.auto.AutoBuilder;
|
||||
import com.pathplanner.lib.auto.NamedCommands;
|
||||
import com.pathplanner.lib.commands.PathPlannerAuto;
|
||||
import com.pathplanner.lib.events.EventTrigger;
|
||||
import com.pathplanner.lib.path.EventMarker;
|
||||
|
||||
import edu.wpi.first.math.MathUtil;
|
||||
import edu.wpi.first.math.geometry.Pose2d;
|
||||
import edu.wpi.first.math.interpolation.InterpolatingDoubleTreeMap;
|
||||
import edu.wpi.first.math.util.Units;
|
||||
import edu.wpi.first.util.sendable.Sendable;
|
||||
import edu.wpi.first.util.sendable.SendableBuilder;
|
||||
import edu.wpi.first.wpilibj.Timer;
|
||||
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.FunctionalCommand;
|
||||
import edu.wpi.first.wpilibj2.command.InstantCommand;
|
||||
import edu.wpi.first.wpilibj2.command.PrintCommand;
|
||||
import edu.wpi.first.wpilibj2.command.button.CommandXboxController;
|
||||
@@ -58,6 +70,8 @@ public class RobotContainer {
|
||||
|
||||
private Timer shiftTimer;
|
||||
|
||||
private boolean resetOdometryToVisualPose;
|
||||
|
||||
public RobotContainer() {
|
||||
vision = new PhotonVision();
|
||||
drivetrain = new Drivetrain(null);
|
||||
@@ -67,7 +81,9 @@ public class RobotContainer {
|
||||
intakeRoller = new IntakeRoller();
|
||||
spindexer = new Spindexer();
|
||||
//climber = new Climber();
|
||||
configureNamedCommands();
|
||||
|
||||
resetOdometryToVisualPose = false;
|
||||
|
||||
vision.addPoseEstimateConsumer(drivetrain::consumeVisualPose);
|
||||
vision.addPoseEstimateConsumer((vp) -> {
|
||||
@@ -77,19 +93,37 @@ public class RobotContainer {
|
||||
);
|
||||
});
|
||||
|
||||
vision.addPoseEstimateConsumer((vp) -> {
|
||||
if(resetOdometryToVisualPose) {
|
||||
drivetrain.resetOdometry(vp.visualPose());
|
||||
resetOdometryToVisualPose = false;
|
||||
}
|
||||
});
|
||||
|
||||
driver = new CommandXboxController(OIConstants.kDriverControllerPort);
|
||||
secondary = new CommandXboxController(OIConstants.kOperatorControllerPort);
|
||||
|
||||
shiftTimer = new Timer();
|
||||
shiftTimer.reset();
|
||||
|
||||
//configureBindings();
|
||||
testConfigureBindings();
|
||||
configureBindings();
|
||||
configureShiftDisplay();
|
||||
//testConfigureBindings();
|
||||
|
||||
|
||||
if(AutoConstants.kAutoConfigOk) {
|
||||
autoChooser = AutoBuilder.buildAutoChooser();
|
||||
configureNamedCommands();
|
||||
SmartDashboard.putData("Auto Chooser", autoChooser);
|
||||
|
||||
autoChooser.addOption(
|
||||
"MOVE B____ right to center",
|
||||
new PathPlannerAuto("MOVE B____ left to center", true)
|
||||
);
|
||||
|
||||
autoChooser.addOption(
|
||||
"right to center",
|
||||
new PathPlannerAuto("left to center", true)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -220,7 +254,7 @@ public class RobotContainer {
|
||||
|
||||
// Useful for testing PID and FF responses of the shooter
|
||||
// You need to have graphs up of the logged data to make sure the response is correct
|
||||
secondary.a().whileTrue(shooter.maintainSpeed(ShooterSpeeds.kHubSpeed));
|
||||
//secondary.a().whileTrue(shooter.maintainSpeed(ShooterSpeeds.kHubSpeed));
|
||||
secondary.b().whileTrue(shooter.maintainSpeed(ShooterSpeeds.kFeedSpeed));
|
||||
|
||||
// Useful for testing PID and FF responses of the intake pivot
|
||||
@@ -245,8 +279,17 @@ public class RobotContainer {
|
||||
() -> true
|
||||
)
|
||||
);
|
||||
shooter.setDefaultCommand(shooter.stop());
|
||||
intakeRoller.setDefaultCommand(intakeRoller.stop());
|
||||
spindexer.setDefaultCommand(spindexer.stop());
|
||||
|
||||
driver.a().whileTrue(
|
||||
intakePivot.setDefaultCommand(intakePivot.manualSpeed(() -> secondary.getLeftY()));
|
||||
|
||||
driver.a().onTrue(new InstantCommand(() -> resetOdometryToVisualPose = true));
|
||||
driver.y().whileTrue(drivetrain.zeroHeading());
|
||||
driver.x().whileTrue(drivetrain.setX());
|
||||
|
||||
driver.leftTrigger().whileTrue(
|
||||
drivetrain.lockRotationToHub(
|
||||
driver::getLeftY,
|
||||
driver::getLeftX,
|
||||
@@ -254,8 +297,22 @@ public class RobotContainer {
|
||||
)
|
||||
);
|
||||
|
||||
/*
|
||||
driver.b().whileTrue(
|
||||
driver.leftBumper().whileTrue(intakeRoller.runOut());
|
||||
driver.rightBumper().whileTrue(intakeRoller.runIn());
|
||||
|
||||
driver.rightTrigger().whileTrue(
|
||||
spindexer.spinToShooter().alongWith(
|
||||
intakeRoller.runIn(),
|
||||
intakePivot.jimmy(.5)
|
||||
)
|
||||
);
|
||||
|
||||
driver.rightTrigger().onFalse(
|
||||
intakePivot.manualSpeed(() -> 0.75).withTimeout(0.5)
|
||||
);
|
||||
|
||||
driver.b().whileTrue(spindexer.spinToIntake());
|
||||
/* driver.b().whileTrue(
|
||||
drivetrain.lockToYaw(
|
||||
() -> {
|
||||
OptionalDouble maybeYaw = vision.getBestYawForTag(Utilities.getHubCenterAprilTagID());
|
||||
@@ -267,32 +324,60 @@ public class RobotContainer {
|
||||
)
|
||||
);*/
|
||||
|
||||
shooter.setDefaultCommand(
|
||||
shooter.maintainSpeed(ShooterSpeeds.kHubSpeed)
|
||||
);
|
||||
secondary.a().toggleOnTrue(shooter.maintainSpeed(ShooterSpeeds.kHubSpeed));
|
||||
secondary.x().toggleOnTrue(shooter.maintainSpeed(ShooterSpeeds.kFeedSpeed));
|
||||
|
||||
hood.setDefaultCommand(hood.trackToAngle(() -> {
|
||||
//hood.setDefaultCommand(hood.trackToAngle(() -> Units.degreesToRadians(MathUtil.clamp(hoodAngle, 0, 40))));
|
||||
//secondary.y().onTrue(hood.trackToAngle(() -> Units.degreesToRadians(40)));
|
||||
//40 good for feeding
|
||||
//secondary.b().onTrue(hood.trackToAngle(() -> Units.degreesToRadians(30)));
|
||||
//30 degrees good for shooter far near outpost
|
||||
secondary.rightBumper().whileTrue(hood.trackToAngle(() -> Units.degreesToRadians(10)));
|
||||
//10 degrees good for shooting ~33in away from hub
|
||||
|
||||
hood.setDefaultCommand(hood.trackToAnglePoseBased(drivetrain, shooter));
|
||||
|
||||
/*hood.setDefaultCommand(hood.trackToAngle(() -> {
|
||||
Pose2d drivetrainPose = drivetrain.getPose();
|
||||
Pose2d hubPose = Utilities.getHubPose();
|
||||
|
||||
double distance = drivetrainPose.getTranslation()
|
||||
.plus(CompetitionConstants.kRobotToShooter.getTranslation().toTranslation2d())
|
||||
.getDistance(hubPose.getTranslation());
|
||||
|
||||
if(HoodConstants.kUseInterpolatorForAngle) {
|
||||
return HoodConstants.kDistanceToAngle.get(distance);
|
||||
Logger.recordOutput("Hood/DistanceToHub", distance);
|
||||
|
||||
Optional<ShooterSpeeds> currentSpeeds = shooter.getTargetSpeeds();
|
||||
|
||||
if(currentSpeeds.isPresent()) {
|
||||
InterpolatingDoubleTreeMap map = HoodConstants.kHoodInterpolators.get(currentSpeeds.get());
|
||||
|
||||
if(map != null) {
|
||||
return MathUtil.clamp(map.get(distance), 0, 40);
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
} else {
|
||||
// TODO The average actual speeds isn't <i>really</i> the exit velocity of the ball
|
||||
// on a hooded shooter, based on documentation, it's more like 30-50% depending on
|
||||
// hood material, surface friction, etc.
|
||||
return Utilities.shotAngle(
|
||||
shooter.getAverageActualSpeeds(),
|
||||
distance,
|
||||
CompetitionConstants.kHubGoalHeightMeters - ShooterConstants.kShooterHeightMeters,
|
||||
false
|
||||
);
|
||||
return 0;
|
||||
}
|
||||
}));
|
||||
}));*/
|
||||
|
||||
new Trigger(() -> MathUtil.isNear(
|
||||
shooter.getTargetSpeeds().isEmpty() ? 0 : shooter.getTargetSpeeds().get().getSpeedRPM(),
|
||||
shooter.getAverageActualSpeeds(),
|
||||
150)).onTrue(
|
||||
new FunctionalCommand(
|
||||
() -> {},
|
||||
() -> {
|
||||
driver.setRumble(RumbleType.kBothRumble, .75);
|
||||
secondary.setRumble(RumbleType.kBothRumble, .75);
|
||||
},
|
||||
(b) -> {
|
||||
driver.setRumble(RumbleType.kBothRumble, 0);
|
||||
secondary.setRumble(RumbleType.kBothRumble, 0);
|
||||
},
|
||||
() -> false
|
||||
).withTimeout(1)
|
||||
);
|
||||
}
|
||||
|
||||
private void configureNamedCommands() {
|
||||
@@ -308,14 +393,54 @@ public class RobotContainer {
|
||||
false // TODO Should this be true by default?
|
||||
)
|
||||
);
|
||||
|
||||
NamedCommands.registerCommand(
|
||||
"intake down",
|
||||
intakePivot.manualSpeed(()->0.75)
|
||||
.withTimeout(1)
|
||||
);
|
||||
|
||||
NamedCommands.registerCommand("spinup",
|
||||
shooter.maintainSpeed(ShooterSpeeds.kHubSpeed)
|
||||
.withTimeout(2));
|
||||
|
||||
NamedCommands.registerCommand("shoot close",
|
||||
spindexer.spinToShooter()
|
||||
.alongWith(shooter.maintainSpeed(ShooterSpeeds.kHubSpeed))
|
||||
.alongWith(hood.trackToAngle(() -> Units.degreesToRadians(10)))
|
||||
.withTimeout(3).andThen(spindexer.instantaneousStop()));
|
||||
|
||||
// NamedCommands.registerCommand("Intake Start", intakeRoller.runIn());
|
||||
|
||||
new EventTrigger("Intake Start")
|
||||
.onTrue(
|
||||
intakeRoller.runIn());
|
||||
|
||||
new EventTrigger("windup trigger")
|
||||
.onTrue(
|
||||
shooter.maintainSpeed(ShooterSpeeds.kHubSpeed));
|
||||
|
||||
NamedCommands.registerCommand("stop spindexer", spindexer.instantaneousStop());
|
||||
|
||||
NamedCommands.registerCommand("jimmy",
|
||||
intakePivot.jimmy(0.2)
|
||||
);
|
||||
|
||||
NamedCommands.registerCommand("shoot N jimmy",
|
||||
Commands.parallel(
|
||||
intakePivot.jimmy(0.5),
|
||||
spindexer.spinToShooter()
|
||||
.alongWith(shooter.maintainSpeed(ShooterSpeeds.kHubSpeed),
|
||||
hood.trackToAngle(() -> Units.degreesToRadians(10)))
|
||||
|
||||
).withTimeout(3).andThen(spindexer.instantaneousStop()));
|
||||
|
||||
NamedCommands.registerCommand("auto shoot", hood.trackToAnglePoseBased(drivetrain, shooter)
|
||||
.alongWith(shooter.maintainSpeed(ShooterSpeeds.kHubSpeed), spindexer.spinToShooter(), intakePivot.jimmy(0.5)));
|
||||
}
|
||||
|
||||
public Command getAutonomousCommand() {
|
||||
if(AutoConstants.kAutoConfigOk) {
|
||||
return autoChooser.getSelected();
|
||||
} else {
|
||||
return new PrintCommand("Robot Config loading failed, autonomous disabled");
|
||||
}
|
||||
return autoChooser.getSelected();
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -24,8 +24,6 @@ public class AutoConstants {
|
||||
public static final double kPXYController = 3.5;
|
||||
public static final double kPThetaController = 5;
|
||||
|
||||
public static final double kYawPIDTolerance = Units.degreesToRadians(2);
|
||||
|
||||
public static final double kAlignPXYController = 2;
|
||||
public static final double kAlignPThetaController = 5;
|
||||
|
||||
|
||||
@@ -38,14 +38,15 @@ public class DrivetrainConstants {
|
||||
public static final boolean kGyroReversed = true;
|
||||
|
||||
// TODO Hold over from 2025, adjust?
|
||||
public static final double kHeadingP = .1;
|
||||
public static final double kHeadingP = .65;
|
||||
public static final double kXTranslationP = .5;
|
||||
public static final double kYTranslationP = .5;
|
||||
public static final double kYawPIDTolerance = Units.degreesToRadians(1);
|
||||
|
||||
// TODO How much do we trust gyro and encoders vs vision estimates.
|
||||
// NOTE: Bigger values indicate LESS trust. Generally all three values for a given matrix should be the same
|
||||
public static final Matrix<N3, N1> kSensorFusionOdometryStdDevs = VecBuilder.fill(0.1, 0.1, 0.1);
|
||||
public static final Matrix<N3, N1> kVisionOdometryStdDevs = VecBuilder.fill(0.9, 0.9, 0.9);
|
||||
public static final Matrix<N3, N1> kVisionOdometryStdDevs = VecBuilder.fill(0.3, 0.3, 0.3);
|
||||
|
||||
// YOU SHOULDN'T NEED TO CHANGE ANYTHING BELOW THIS LINE UNLESS YOU'RE ADDING A NEW CONFIGURATION ITEM
|
||||
public static final SwerveDriveKinematics kDriveKinematics = new SwerveDriveKinematics(
|
||||
|
||||
@@ -5,6 +5,7 @@ import java.io.File;
|
||||
import java.io.FileReader;
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Path;
|
||||
import java.util.Map;
|
||||
|
||||
import com.revrobotics.spark.ClosedLoopSlot;
|
||||
import com.revrobotics.spark.FeedbackSensor;
|
||||
@@ -12,7 +13,9 @@ import com.revrobotics.spark.config.SparkMaxConfig;
|
||||
import com.revrobotics.spark.config.SparkBaseConfig.IdleMode;
|
||||
|
||||
import edu.wpi.first.math.interpolation.InterpolatingDoubleTreeMap;
|
||||
import edu.wpi.first.math.util.Units;
|
||||
import edu.wpi.first.wpilibj.Filesystem;
|
||||
import frc.robot.constants.ShooterConstants.ShooterSpeeds;
|
||||
|
||||
public class HoodConstants {
|
||||
// TODO Real Values
|
||||
@@ -43,9 +46,9 @@ public class HoodConstants {
|
||||
|
||||
public static final IdleMode kIdleMode = IdleMode.kBrake;
|
||||
|
||||
// TODO This needs to be filled in from some source
|
||||
public static final InterpolatingDoubleTreeMap kDistanceToAngle = new InterpolatingDoubleTreeMap();
|
||||
|
||||
public static final Map<ShooterSpeeds, InterpolatingDoubleTreeMap> kHoodInterpolators = Map.of(
|
||||
ShooterSpeeds.kHubSpeed, new InterpolatingDoubleTreeMap()
|
||||
);
|
||||
// YOU SHOULDN'T NEED TO CHANGE ANYTHING BELOW THIS LINE UNLESS YOU'RE ADDING A CONFIGURATION ITEM
|
||||
|
||||
public static final SparkMaxConfig kConfig = new SparkMaxConfig();
|
||||
@@ -66,27 +69,24 @@ public class HoodConstants {
|
||||
.feedForward
|
||||
.sva(kS, kV, kA);
|
||||
|
||||
kHoodInterpolators.get(ShooterSpeeds.kHubSpeed).put(
|
||||
Double.valueOf(Units.inchesToMeters(22.2 + 40)),
|
||||
Double.valueOf(Units.degreesToRadians(9.5)));
|
||||
|
||||
File interpolatorFile = Path.of(
|
||||
Filesystem.getDeployDirectory().getAbsolutePath().toString(),
|
||||
"interpolatorData.csv"
|
||||
).toFile();
|
||||
kHoodInterpolators.get(ShooterSpeeds.kHubSpeed).put(
|
||||
Double.valueOf(Units.inchesToMeters(22.2 + 60)),
|
||||
Double.valueOf(Units.degreesToRadians(12.5)));
|
||||
|
||||
if(interpolatorFile.exists()) {
|
||||
try (BufferedReader reader = new BufferedReader(new FileReader(interpolatorFile))) {
|
||||
reader.lines().forEach((s) -> {
|
||||
if(s.trim() != "") { //Empty or whitespace line protection
|
||||
String[] lineSplit = s.split(",");
|
||||
kHoodInterpolators.get(ShooterSpeeds.kHubSpeed).put(
|
||||
Double.valueOf(Units.inchesToMeters(22.2 + 80)),
|
||||
Double.valueOf(Units.degreesToRadians(16.25)));
|
||||
|
||||
kDistanceToAngle.put(
|
||||
Double.valueOf(lineSplit[0].replace("\"", "")),
|
||||
Double.valueOf(lineSplit[1].replace("\"", ""))
|
||||
);
|
||||
}
|
||||
});
|
||||
} catch (IOException e) {
|
||||
// This condition is never reached because of the if exists line above
|
||||
}
|
||||
}
|
||||
kHoodInterpolators.get(ShooterSpeeds.kHubSpeed).put(
|
||||
Double.valueOf(Units.inchesToMeters(22.2 + 100)),
|
||||
Double.valueOf(Units.degreesToRadians(20.5)));
|
||||
|
||||
kHoodInterpolators.get(ShooterSpeeds.kHubSpeed).put(
|
||||
Double.valueOf(Units.inchesToMeters(22.2 + 120)),
|
||||
Double.valueOf(Units.degreesToRadians(23.5)));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -51,7 +51,7 @@ public class IntakePivotConstants {
|
||||
KLeftMotorConfig
|
||||
.idleMode(kIdleMode)
|
||||
.smartCurrentLimit(kCurrentLimit)
|
||||
.inverted(kInvertMotors);
|
||||
.inverted(false);
|
||||
KLeftMotorConfig.encoder
|
||||
.positionConversionFactor(kConversionFactor)
|
||||
.velocityConversionFactor(kConversionFactor / 60);
|
||||
@@ -67,7 +67,7 @@ public class IntakePivotConstants {
|
||||
kRightMotorConfig
|
||||
.idleMode(kIdleMode)
|
||||
.smartCurrentLimit(kCurrentLimit)
|
||||
.inverted(kInvertMotors)
|
||||
.follow(kLeftMotorCANID);
|
||||
.inverted(true)
|
||||
;//.follow(kLeftMotorCANID);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,24 +5,32 @@ import com.revrobotics.spark.config.SparkBaseConfig.IdleMode;
|
||||
|
||||
public class IntakeRollerConstants {
|
||||
// TODO Real values
|
||||
public static final int kMotorCANID = 20;
|
||||
public static final int kRightMotorCANID = 20;
|
||||
public static final int kLeftMotorCANID = 1;
|
||||
|
||||
public static final int kCurrentLimit = 40;
|
||||
public static final int kCurrentLimit = 65;
|
||||
|
||||
public static final boolean kInvertMotors = true;
|
||||
public static final boolean kInvertLeftMotor = false;
|
||||
public static final boolean kInvertRightMotor = true;
|
||||
|
||||
public static final double kSpeed = .6;
|
||||
public static final double kSpeed = 1;
|
||||
|
||||
public static final IdleMode kIdleMode = IdleMode.kCoast;
|
||||
|
||||
// YOU SHOULDN'T NEED TO CHANGE ANYTHING BELOW THIS LINE UNLESS YOU'RE ADDING A CONFIGURATION ITEM
|
||||
|
||||
public static final SparkMaxConfig leftMotorConfig = new SparkMaxConfig();
|
||||
public static final SparkMaxConfig rightMotorConfig = new SparkMaxConfig();
|
||||
|
||||
static {
|
||||
leftMotorConfig
|
||||
.idleMode(kIdleMode)
|
||||
.smartCurrentLimit(kCurrentLimit)
|
||||
.inverted(kInvertMotors);
|
||||
.inverted(kInvertLeftMotor);
|
||||
rightMotorConfig
|
||||
.idleMode(kIdleMode)
|
||||
.smartCurrentLimit(kCurrentLimit)
|
||||
.inverted(kInvertRightMotor)
|
||||
;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package frc.robot.constants;
|
||||
|
||||
import com.ctre.phoenix6.configs.AudioConfigs;
|
||||
import com.ctre.phoenix6.configs.ClosedLoopRampsConfigs;
|
||||
import com.ctre.phoenix6.configs.CurrentLimitsConfigs;
|
||||
import com.ctre.phoenix6.configs.FeedbackConfigs;
|
||||
import com.ctre.phoenix6.configs.MotorOutputConfigs;
|
||||
@@ -34,7 +35,7 @@ public class ModuleConstants {
|
||||
}
|
||||
|
||||
// DRIVING MOTOR CONFIG (Kraken)
|
||||
public static final double kDrivingMotorReduction = (14.0 * 28.0 * 15.0) / (50 * 16 * 45);
|
||||
public static final double kDrivingMotorReduction = (50 * 16 * 45)/(14.0 * 28.0 * 15.0);
|
||||
|
||||
public static final double kDrivingMotorFeedSpeedRPS = KrakenMotorConstants.kFreeSpeedRPM / 60;
|
||||
public static final double kWheelDiameterMeters = Units.inchesToMeters(4);
|
||||
@@ -45,16 +46,17 @@ public class ModuleConstants {
|
||||
public static final double kDrivingVelocityFeedForward = 1 / kDriveWheelFreeSpeedRPS;
|
||||
|
||||
// TODO Hold over from 2025, adjust?
|
||||
public static final double kDriveP = .04;
|
||||
public static final double kDriveP = .06;
|
||||
public static final double kDriveI = 0;
|
||||
public static final double kDriveD = 0;
|
||||
public static final double kDriveS = 0;
|
||||
public static final double kDriveV = kDrivingVelocityFeedForward;
|
||||
public static final double kDriveA = 0;
|
||||
public static final double kClosedLoopRampRate = .01;
|
||||
|
||||
// TODO Hold over from 2025, adjust?
|
||||
public static final int kDriveMotorStatorCurrentLimit = 100;
|
||||
public static final int kDriveMotorSupplyCurrentLimit = 65;
|
||||
public static final int kDriveMotorStatorCurrentLimit = 90;
|
||||
public static final int kDriveMotorSupplyCurrentLimit = 55;
|
||||
|
||||
// TODO Hold over from 2025, adjust?
|
||||
public static final InvertedValue kDriveInversionState = InvertedValue.Clockwise_Positive;
|
||||
@@ -88,6 +90,7 @@ public class ModuleConstants {
|
||||
public static final MotorOutputConfigs kDriveMotorConfig = new MotorOutputConfigs();
|
||||
public static final AudioConfigs kAudioConfig = new AudioConfigs();
|
||||
public static final Slot0Configs kDriveSlot0Config = new Slot0Configs();
|
||||
public static final ClosedLoopRampsConfigs kDriveClosedLoopRampConfig = new ClosedLoopRampsConfigs();
|
||||
|
||||
static {
|
||||
kDriveFeedConfig.SensorToMechanismRatio = kDrivingMotorReduction;
|
||||
@@ -109,6 +112,8 @@ public class ModuleConstants {
|
||||
kDriveSlot0Config.kV = kDriveV;
|
||||
kDriveSlot0Config.kA = kDriveA;
|
||||
|
||||
kDriveClosedLoopRampConfig.withVoltageClosedLoopRampPeriod(kClosedLoopRampRate);
|
||||
|
||||
turningConfig
|
||||
.idleMode(kTurnIdleMode)
|
||||
.smartCurrentLimit(kTurnMotorCurrentLimit)
|
||||
|
||||
@@ -8,19 +8,28 @@ import edu.wpi.first.math.util.Units;
|
||||
import frc.robot.utilities.PhotonVisionConfig;
|
||||
|
||||
public class PhotonConstants {
|
||||
public static final String kCamera1Name = "pv1";
|
||||
public static final String kCamera2Name = "pv2";
|
||||
public static final String kCamera1Name = "CameraPV1";
|
||||
public static final String kCamera2Name = "CameraPV2";
|
||||
|
||||
// TODO Need actual values for all of this
|
||||
public static final Transform3d kCamera1RobotToCam = new Transform3d();
|
||||
public static final Transform3d kCamera1RobotToCam = new Transform3d(
|
||||
Units.inchesToMeters(1.5),
|
||||
Units.inchesToMeters(-8.5),
|
||||
Units.inchesToMeters(28.5),
|
||||
new Rotation3d(
|
||||
Units.degreesToRadians(0),
|
||||
Units.degreesToRadians(-24.0),
|
||||
Units.degreesToRadians(30.0)
|
||||
)
|
||||
);
|
||||
public static final Transform3d kCamera2RobotToCam = new Transform3d(
|
||||
Units.inchesToMeters(1.5),
|
||||
Units.inchesToMeters(-10.5),
|
||||
Units.inchesToMeters(28.5),
|
||||
new Rotation3d(
|
||||
Units.degreesToRadians(0),
|
||||
Units.degreesToRadians(24),
|
||||
Units.degreesToRadians(-10)
|
||||
Units.degreesToRadians(0.0),
|
||||
Units.degreesToRadians(-24.0),
|
||||
Units.degreesToRadians(-10.0)
|
||||
)
|
||||
);
|
||||
|
||||
@@ -32,7 +41,7 @@ public class PhotonConstants {
|
||||
// YOU SHOULDN'T NEED TO CHANGE ANYTHING BELOW THIS LINE UNLESS YOU'RE ADDING A CONFIGURATION ITEM
|
||||
|
||||
public static final List<PhotonVisionConfig> configs = List.of(
|
||||
//new PhotonVisionConfig(kCamera1Name, kCamera1RobotToCam, kCamera1HeightMeters, kCamera1PitchRadians),
|
||||
new PhotonVisionConfig(kCamera1Name, kCamera1RobotToCam, kCamera1HeightMeters, kCamera1PitchRadians),
|
||||
new PhotonVisionConfig(kCamera2Name, kCamera2RobotToCam, kCamera2HeightMeters, kCamera2PitchRadians)
|
||||
);
|
||||
}
|
||||
@@ -1,15 +1,19 @@
|
||||
package frc.robot.constants;
|
||||
|
||||
import com.revrobotics.spark.ClosedLoopSlot;
|
||||
import com.revrobotics.spark.FeedbackSensor;
|
||||
import com.revrobotics.spark.config.SparkMaxConfig;
|
||||
import com.revrobotics.spark.config.SparkBaseConfig.IdleMode;
|
||||
|
||||
import edu.wpi.first.math.controller.SimpleMotorFeedforward;
|
||||
import edu.wpi.first.math.util.Units;
|
||||
|
||||
|
||||
public class ShooterConstants {
|
||||
public enum ShooterSpeeds {
|
||||
kHubSpeed(3000.0),
|
||||
kFeedSpeed(5000.0);
|
||||
kFeedSpeed(5000.0),
|
||||
kIdleSpeed(750.0);
|
||||
|
||||
private double speedMPS;
|
||||
private double speedRPM;
|
||||
@@ -39,18 +43,18 @@ public class ShooterConstants {
|
||||
public static final boolean kLeftShooterMotorInverted = true;
|
||||
public static final boolean kRightShooterMotorInverted = false;
|
||||
|
||||
public static final double kLeftP = 0.001;
|
||||
public static final double kLeftP = 0.75;//0.01;//0.001;
|
||||
public static final double kLeftI = 0;
|
||||
public static final double kLeftD = 0;
|
||||
public static final double kLeftD = 0;//0.1;//1.8;
|
||||
public static final double kLeftS = 0;
|
||||
public static final double kLeftV = 0.0013;
|
||||
public static final double kLeftV = 0.00129;
|
||||
public static final double kLeftA = 0;
|
||||
|
||||
public static final double kRightP = 0.001;
|
||||
public static final double kRightP = 0.75;//0.001;//0.001;
|
||||
public static final double kRightI = 0;
|
||||
public static final double kRightD = 0.000;
|
||||
public static final double kRightD = 0;//0.1;
|
||||
public static final double kRightS = 0;
|
||||
public static final double kRightV = 0.00121;
|
||||
public static final double kRightV = 0.00125;
|
||||
public static final double kRightA = 0;
|
||||
|
||||
public static final double kMaxManualSpeedMultiplier = 1;
|
||||
@@ -75,13 +79,15 @@ public class ShooterConstants {
|
||||
.inverted(kLeftShooterMotorInverted);
|
||||
kLeftMotorConfig.absoluteEncoder
|
||||
.positionConversionFactor(1)
|
||||
.velocityConversionFactor(60);
|
||||
.velocityConversionFactor(60)
|
||||
.averageDepth(8); // VERY IMPORTANT FOR RESPONSE OF FLYWHEEL DEFAULTS ARE DOGWATER
|
||||
kLeftMotorConfig.closedLoop
|
||||
.feedbackSensor(FeedbackSensor.kAbsoluteEncoder)
|
||||
.pid(kLeftP, kLeftI, kLeftD)
|
||||
.pid(kLeftP, kLeftI, kLeftD, ClosedLoopSlot.kSlot0)
|
||||
.outputRange(-1, 1)
|
||||
.allowedClosedLoopError(25.0, ClosedLoopSlot.kSlot0)
|
||||
.feedForward
|
||||
.sva(kLeftS, kLeftV, kLeftA);
|
||||
.sva(kLeftS, kLeftV, kLeftA, ClosedLoopSlot.kSlot0);
|
||||
|
||||
kRightMotorConfig
|
||||
.idleMode(kShooterIdleMode)
|
||||
@@ -90,12 +96,14 @@ public class ShooterConstants {
|
||||
kRightMotorConfig.absoluteEncoder
|
||||
.positionConversionFactor(1)
|
||||
.velocityConversionFactor(60)
|
||||
.averageDepth(8)// VERY IMPORTANT FOR RESPONSE OF FLYWHEEL DEFAULTS ARE DOGWATER
|
||||
.inverted(true);
|
||||
kRightMotorConfig.closedLoop
|
||||
.feedbackSensor(FeedbackSensor.kAbsoluteEncoder)
|
||||
.pid(kRightP, kRightI, kRightD)
|
||||
.outputRange(-1, 1)
|
||||
.allowedClosedLoopError(25.0, ClosedLoopSlot.kSlot0)
|
||||
.feedForward
|
||||
.sva(kRightS, kRightV, kRightA);
|
||||
.sva(kRightS, kRightV, kRightA, ClosedLoopSlot.kSlot0);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -12,14 +12,14 @@ public class SpindexerConstants {
|
||||
public static final int kSpindexerMotorCANID = 0;
|
||||
public static final int kFeederMotorCANID = 4;
|
||||
|
||||
public static final int kSpindexerStatorCurrentLimit = 110;
|
||||
public static final int kSpindexerSupplyCurrentLimit = 60;
|
||||
public static final int kFeederCurrentLimit = 40;
|
||||
public static final int kSpindexerStatorCurrentLimit = 95;
|
||||
public static final int kSpindexerSupplyCurrentLimit = 50;
|
||||
public static final int kFeederCurrentLimit = 30;
|
||||
|
||||
public static final double kSpindexerSpeed = 1;
|
||||
public static final double kFeederSpeed = 1;
|
||||
|
||||
public static final boolean kFeederMotorInverted = true;
|
||||
public static final boolean kFeederMotorInverted = false;
|
||||
|
||||
public static final InvertedValue kSpindexerInversionState = InvertedValue.Clockwise_Positive;
|
||||
public static final NeutralModeValue kSpindexerIdleMode = NeutralModeValue.Coast;
|
||||
|
||||
@@ -82,12 +82,12 @@ public class Drivetrain extends SubsystemBase {
|
||||
gyro = new AHRS(NavXComType.kMXP_SPI);
|
||||
|
||||
yawRotationController = new PIDController(
|
||||
AutoConstants.kPThetaController,
|
||||
DrivetrainConstants.kHeadingP,
|
||||
0,
|
||||
0
|
||||
);
|
||||
yawRotationController.enableContinuousInput(-Math.PI, Math.PI);
|
||||
yawRotationController.setTolerance(AutoConstants.kYawPIDTolerance);
|
||||
yawRotationController.setTolerance(DrivetrainConstants.kYawPIDTolerance);
|
||||
|
||||
// TODO 2025 used non-standard deviations for encoder/gyro inputs and vision, will need to be tuned for 2026 in the future
|
||||
estimator = new SwerveDrivePoseEstimator(
|
||||
@@ -144,6 +144,7 @@ public class Drivetrain extends SubsystemBase {
|
||||
Logger.recordOutput("Drivetrain/Pose", getPose());
|
||||
Logger.recordOutput("Drivetrain/Gyro Angle", getGyroValue());
|
||||
Logger.recordOutput("Drivetrain/Heading", getHeadingDegrees());
|
||||
Logger.recordOutput("Drivetrain/Velocity", getCurrentChassisSpeeds());
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -261,10 +262,17 @@ public class Drivetrain extends SubsystemBase {
|
||||
targetRotation = targetRotation.rotateBy(Rotation2d.k180deg);
|
||||
}
|
||||
|
||||
return yawRotationController.calculate(
|
||||
Logger.recordOutput("/HubAutoAlign/CurrentHeader", getHeading().getRadians());
|
||||
Logger.recordOutput("/HubAutoAlign/Setpoint", targetRotation.getRadians());
|
||||
|
||||
double outputPower = -yawRotationController.calculate(
|
||||
getHeading().getRadians(),
|
||||
targetRotation.getRadians()
|
||||
);
|
||||
|
||||
Logger.recordOutput("/HubAutoAlign/OutputPower", outputPower);
|
||||
|
||||
return outputPower;
|
||||
},
|
||||
() -> true
|
||||
)
|
||||
@@ -331,6 +339,10 @@ public class Drivetrain extends SubsystemBase {
|
||||
}
|
||||
|
||||
public void consumeVisualPose(VisualPose pose) {
|
||||
if(Math.abs(pose.visualPose().minus(getPose()).getTranslation().getNorm()) > 1) {
|
||||
return;
|
||||
}
|
||||
|
||||
estimator.addVisionMeasurement(
|
||||
pose.visualPose(),
|
||||
pose.timestamp()
|
||||
@@ -375,7 +387,8 @@ public class Drivetrain extends SubsystemBase {
|
||||
SwerveModuleState[] swerveModuleStates = DrivetrainConstants.kDriveKinematics.toSwerveModuleStates(
|
||||
fieldRelative ?
|
||||
ChassisSpeeds.fromFieldRelativeSpeeds(xSpeedDelivered, ySpeedDelivered, rotationDelivered,
|
||||
estimator.getEstimatedPosition().getRotation()) :
|
||||
//estimator.getEstimatedPosition().getRotation()) :
|
||||
Rotation2d.fromDegrees(getGyroValue())) :
|
||||
new ChassisSpeeds(xSpeedDelivered, ySpeedDelivered, rotationDelivered)
|
||||
);
|
||||
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package frc.robot.subsystems;
|
||||
|
||||
import java.util.Optional;
|
||||
import java.util.function.DoubleSupplier;
|
||||
|
||||
import org.littletonrobotics.junction.Logger;
|
||||
@@ -12,12 +13,18 @@ import com.revrobotics.spark.SparkMax;
|
||||
import com.revrobotics.spark.SparkBase.ControlType;
|
||||
import com.revrobotics.spark.SparkLowLevel.MotorType;
|
||||
|
||||
import edu.wpi.first.math.MathUtil;
|
||||
import edu.wpi.first.math.geometry.Pose2d;
|
||||
import edu.wpi.first.math.interpolation.InterpolatingDoubleTreeMap;
|
||||
import edu.wpi.first.wpilibj.Timer;
|
||||
import edu.wpi.first.wpilibj.smartdashboard.SmartDashboard;
|
||||
import edu.wpi.first.wpilibj2.command.Command;
|
||||
import edu.wpi.first.wpilibj2.command.InstantCommand;
|
||||
import edu.wpi.first.wpilibj2.command.SubsystemBase;
|
||||
import edu.wpi.first.wpilibj2.command.button.Trigger;
|
||||
import frc.robot.constants.HoodConstants;
|
||||
import frc.robot.constants.ShooterConstants.ShooterSpeeds;
|
||||
import frc.robot.utilities.Utilities;
|
||||
|
||||
public class Hood extends SubsystemBase {
|
||||
private SparkMax motor;
|
||||
@@ -26,10 +33,10 @@ public class Hood extends SubsystemBase {
|
||||
|
||||
private SparkClosedLoopController controller;
|
||||
|
||||
private Trigger resetTrigger;
|
||||
private Trigger timerTrigger;
|
||||
//private Trigger resetTrigger;
|
||||
//private Trigger timerTrigger;
|
||||
|
||||
private Timer resetTimer;
|
||||
//private Timer resetTimer;
|
||||
|
||||
private double currentTargetDegrees;
|
||||
|
||||
@@ -47,7 +54,7 @@ public class Hood extends SubsystemBase {
|
||||
|
||||
controller = motor.getClosedLoopController();
|
||||
|
||||
resetTimer = new Timer();
|
||||
/*resetTimer = new Timer();
|
||||
resetTimer.reset();
|
||||
|
||||
resetTrigger = new Trigger(() -> (motor.getOutputCurrent() > HoodConstants.kAmpsToTriggerPositionReset));
|
||||
@@ -61,13 +68,28 @@ public class Hood extends SubsystemBase {
|
||||
timerTrigger.onTrue(new InstantCommand(() -> {
|
||||
encoder.setPosition(0);
|
||||
resetTimer.reset();
|
||||
}));
|
||||
}));*/
|
||||
|
||||
currentTargetDegrees = HoodConstants.kStartupAngle;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void periodic() {
|
||||
SmartDashboard.putNumber(
|
||||
"HoodTargetDegrees",
|
||||
Math.toDegrees(currentTargetDegrees)
|
||||
);
|
||||
|
||||
SmartDashboard.putNumber(
|
||||
"HoodCurrentAngle",
|
||||
Math.toDegrees(encoder.getPosition())
|
||||
);
|
||||
|
||||
SmartDashboard.putBoolean(
|
||||
"HoodAtSetpoint",
|
||||
controller.isAtSetpoint()
|
||||
);
|
||||
|
||||
Logger.recordOutput("Hood/OutputCurrent", motor.getOutputCurrent());
|
||||
Logger.recordOutput("Hood/CurrentTarget", Math.toDegrees(currentTargetDegrees));
|
||||
Logger.recordOutput("Hood/CurrentAngle", Math.toDegrees(encoder.getPosition()));
|
||||
@@ -75,6 +97,32 @@ public class Hood extends SubsystemBase {
|
||||
Logger.recordOutput("Hood/VoltageOut", motor.getAppliedOutput()*motor.getBusVoltage());
|
||||
}
|
||||
|
||||
public Command trackToAnglePoseBased(Drivetrain drivetrain, Shooter shooter) {
|
||||
return trackToAngle(() -> {
|
||||
Pose2d drivetrainPose = drivetrain.getPose();
|
||||
Pose2d hubPose = Utilities.getHubPose();
|
||||
|
||||
double distance = drivetrainPose.getTranslation()
|
||||
.getDistance(hubPose.getTranslation());
|
||||
|
||||
Logger.recordOutput("Hood/DistanceToHub", distance);
|
||||
|
||||
Optional<ShooterSpeeds> currentSpeeds = shooter.getTargetSpeeds();
|
||||
|
||||
if(currentSpeeds.isPresent()) {
|
||||
InterpolatingDoubleTreeMap map = HoodConstants.kHoodInterpolators.get(currentSpeeds.get());
|
||||
|
||||
if(map != null) {
|
||||
return MathUtil.clamp(map.get(distance), 0, 40);
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public Command trackToAngle(DoubleSupplier degreeAngleSupplier) {
|
||||
return run(() -> {
|
||||
currentTargetDegrees = degreeAngleSupplier.getAsDouble();
|
||||
@@ -96,7 +144,7 @@ public class Hood extends SubsystemBase {
|
||||
*
|
||||
* @return A complete Command structure that performs the specified action
|
||||
*/
|
||||
public Command automatedRezero() {
|
||||
/*public Command automatedRezero() {
|
||||
return manualSpeed(() -> -1)
|
||||
.until(timerTrigger)
|
||||
.andThen(
|
||||
@@ -112,11 +160,11 @@ public class Hood extends SubsystemBase {
|
||||
*
|
||||
* @return A complete Command structure that performs the specified action
|
||||
*/
|
||||
public Command automatedRezeroNoTimer() {
|
||||
/*public Command automatedRezeroNoTimer() {
|
||||
return manualSpeed(() -> -1)
|
||||
.until(() -> motor.getOutputCurrent() >= HoodConstants.kAmpsToTriggerPositionReset)
|
||||
.andThen(new InstantCommand(() -> encoder.setPosition(0)));
|
||||
}
|
||||
}*/
|
||||
|
||||
public Command manualSpeed(DoubleSupplier speed) {
|
||||
currentTargetDegrees = 0;
|
||||
|
||||
@@ -14,6 +14,7 @@ import com.revrobotics.spark.SparkBase.ControlType;
|
||||
import com.revrobotics.spark.SparkLowLevel.MotorType;
|
||||
|
||||
import edu.wpi.first.wpilibj2.command.Command;
|
||||
import edu.wpi.first.wpilibj2.command.Commands;
|
||||
import edu.wpi.first.wpilibj2.command.SubsystemBase;
|
||||
import frc.robot.constants.IntakePivotConstants;
|
||||
import frc.robot.constants.IntakePivotConstants.IntakePivotPosition;
|
||||
@@ -76,9 +77,36 @@ public class IntakePivot extends SubsystemBase {
|
||||
currentTargetPosition = null;
|
||||
|
||||
leftMotor.set(speed.getAsDouble() * IntakePivotConstants.kMaxManualSpeedMultiplier);
|
||||
rightMotor.set(speed.getAsDouble() * IntakePivotConstants.kMaxManualSpeedMultiplier);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Repeatedly moves the intake up and down. AKA "Jimmying" the intake
|
||||
*
|
||||
* @param time How long the intake will go both ways for (seconds)
|
||||
* @return Command that repeatedly Jimmys the intake
|
||||
*/
|
||||
public Command jimmy(double time){
|
||||
return Commands.repeatingSequence(
|
||||
manualSpeed(() -> -0.75).withTimeout(time),
|
||||
manualSpeed(() -> 0.75).withTimeout(time)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Repeatedly moves the intake up and down. AKA "Jimmying" the intake
|
||||
*
|
||||
* @param time How long the intake will go both ways for (seconds)
|
||||
* @return Command that repeatedly Jimmys the intake
|
||||
*/
|
||||
public Command jimmy(DoubleSupplier time) {
|
||||
return Commands.repeatingSequence(
|
||||
manualSpeed(() -> -0.75).withTimeout(time.getAsDouble()),
|
||||
manualSpeed(() -> 0.75).withTimeout(time.getAsDouble())
|
||||
);
|
||||
}
|
||||
|
||||
public Command stop() {
|
||||
return manualSpeed(() -> 0);
|
||||
}
|
||||
|
||||
@@ -10,33 +10,44 @@ import edu.wpi.first.wpilibj2.command.SubsystemBase;
|
||||
import frc.robot.constants.IntakeRollerConstants;
|
||||
|
||||
public class IntakeRoller extends SubsystemBase {
|
||||
private SparkMax motor;
|
||||
private SparkMax leftMotor;
|
||||
private SparkMax rightMotor;
|
||||
|
||||
public IntakeRoller() {
|
||||
motor = new SparkMax(IntakeRollerConstants.kMotorCANID, MotorType.kBrushless);
|
||||
leftMotor = new SparkMax(IntakeRollerConstants.kLeftMotorCANID, MotorType.kBrushless);
|
||||
rightMotor = new SparkMax(IntakeRollerConstants.kRightMotorCANID, MotorType.kBrushless);
|
||||
|
||||
motor.configure(
|
||||
leftMotor.configure(
|
||||
IntakeRollerConstants.leftMotorConfig,
|
||||
ResetMode.kResetSafeParameters,
|
||||
PersistMode.kPersistParameters
|
||||
);
|
||||
|
||||
rightMotor.configure(
|
||||
IntakeRollerConstants.rightMotorConfig,
|
||||
ResetMode.kResetSafeParameters,
|
||||
PersistMode.kPersistParameters
|
||||
);
|
||||
}
|
||||
|
||||
public Command runIn() {
|
||||
return run(() -> {
|
||||
motor.set(IntakeRollerConstants.kSpeed);
|
||||
leftMotor.set(IntakeRollerConstants.kSpeed*0.8);
|
||||
rightMotor.set(IntakeRollerConstants.kSpeed*0.8);
|
||||
});
|
||||
}
|
||||
|
||||
public Command runOut() {
|
||||
return run(() -> {
|
||||
motor.set(-IntakeRollerConstants.kSpeed);
|
||||
leftMotor.set(-IntakeRollerConstants.kSpeed);
|
||||
rightMotor.set(-IntakeRollerConstants.kSpeed);
|
||||
});
|
||||
}
|
||||
|
||||
public Command stop() {
|
||||
return run(() -> {
|
||||
motor.set(0);
|
||||
leftMotor.set(0);
|
||||
rightMotor.set(0);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -13,6 +13,7 @@ import org.photonvision.PhotonPoseEstimator.PoseStrategy;
|
||||
import org.photonvision.targeting.PhotonPipelineResult;
|
||||
import org.photonvision.targeting.PhotonTrackedTarget;
|
||||
|
||||
import edu.wpi.first.math.geometry.Pose2d;
|
||||
import edu.wpi.first.math.geometry.Pose3d;
|
||||
import edu.wpi.first.math.geometry.Transform3d;
|
||||
import edu.wpi.first.wpilibj2.command.SubsystemBase;
|
||||
|
||||
@@ -9,11 +9,14 @@ import com.revrobotics.AbsoluteEncoder;
|
||||
import com.revrobotics.PersistMode;
|
||||
import com.revrobotics.RelativeEncoder;
|
||||
import com.revrobotics.ResetMode;
|
||||
import com.revrobotics.spark.ClosedLoopSlot;
|
||||
import com.revrobotics.spark.SparkClosedLoopController;
|
||||
import com.revrobotics.spark.SparkMax;
|
||||
import com.revrobotics.spark.SparkBase.ControlType;
|
||||
import com.revrobotics.spark.SparkLowLevel.MotorType;
|
||||
|
||||
import edu.wpi.first.math.controller.SimpleMotorFeedforward;
|
||||
import edu.wpi.first.wpilibj.smartdashboard.SmartDashboard;
|
||||
import edu.wpi.first.wpilibj2.command.Command;
|
||||
import edu.wpi.first.wpilibj2.command.SubsystemBase;
|
||||
import frc.robot.constants.ShooterConstants;
|
||||
@@ -32,6 +35,8 @@ public class Shooter extends SubsystemBase {
|
||||
private SparkClosedLoopController rightClosedLoopController;
|
||||
|
||||
private ShooterSpeeds targetSpeeds;
|
||||
private SimpleMotorFeedforward shooterFFLeft;
|
||||
private SimpleMotorFeedforward shooterFFRight;
|
||||
|
||||
public Shooter() {
|
||||
leftMotor = new SparkMax(ShooterConstants.kLeftShooterMotorCANID, MotorType.kBrushless);
|
||||
@@ -59,10 +64,37 @@ public class Shooter extends SubsystemBase {
|
||||
targetSpeeds = null;
|
||||
|
||||
rightRelative = rightMotor.getEncoder();
|
||||
|
||||
shooterFFLeft = new SimpleMotorFeedforward(ShooterConstants.kLeftS, ShooterConstants.kLeftV, ShooterConstants.kLeftA);
|
||||
shooterFFRight = new SimpleMotorFeedforward(ShooterConstants.kRightS, ShooterConstants.kRightV, ShooterConstants.kRightA);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void periodic() {
|
||||
SmartDashboard.putNumber(
|
||||
"ShooterTargetRPM",
|
||||
targetSpeeds == null ? 0 : targetSpeeds.getSpeedRPM());
|
||||
|
||||
SmartDashboard.putNumber(
|
||||
"ShooterLeftSideRPM",
|
||||
leftEncoder.getVelocity()
|
||||
);
|
||||
|
||||
SmartDashboard.putNumber(
|
||||
"ShooterRightSideRPM",
|
||||
rightEncoder.getVelocity()
|
||||
);
|
||||
|
||||
SmartDashboard.putBoolean(
|
||||
"ShooterLeftSideAtSetpoint",
|
||||
leftClosedLoopController.isAtSetpoint()
|
||||
);
|
||||
|
||||
SmartDashboard.putBoolean(
|
||||
"ShooterRightSideAtSetpoint",
|
||||
rightClosedLoopController.isAtSetpoint()
|
||||
);
|
||||
|
||||
Logger.recordOutput(
|
||||
"Shooter/TargetRPM",
|
||||
targetSpeeds == null ? 0 : targetSpeeds.getSpeedRPM()
|
||||
@@ -73,6 +105,8 @@ public class Shooter extends SubsystemBase {
|
||||
|
||||
Logger.recordOutput("Shooter/RightRollers/rightmotor", rightRelative.getVelocity());
|
||||
|
||||
Logger.recordOutput("Shooter/LeftRollers/OutputVoltage", leftMotor.getAppliedOutput() * leftMotor.getBusVoltage());
|
||||
Logger.recordOutput("Shooter/RightRollers/OutputVoltage", rightMotor.getAppliedOutput() * rightMotor.getBusVoltage());
|
||||
|
||||
// TODO How does the SparkMAX controller determine "at setpoint"? Is there any tolerance?
|
||||
Logger.recordOutput("Shooter/LeftRollers/AtSetpoint", leftClosedLoopController.isAtSetpoint());
|
||||
@@ -89,12 +123,16 @@ public class Shooter extends SubsystemBase {
|
||||
} else {
|
||||
leftClosedLoopController.setSetpoint(
|
||||
targetSpeeds.getSpeedRPM(),
|
||||
ControlType.kVelocity
|
||||
ControlType.kVelocity,
|
||||
ClosedLoopSlot.kSlot0,
|
||||
shooterFFLeft.calculate(targetSpeeds.getSpeedRPM())
|
||||
);
|
||||
|
||||
rightClosedLoopController.setSetpoint(
|
||||
targetSpeeds.getSpeedRPM(),
|
||||
ControlType.kVelocity
|
||||
ControlType.kVelocity,
|
||||
ClosedLoopSlot.kSlot0,
|
||||
shooterFFRight.calculate(targetSpeeds.getSpeedRPM())
|
||||
);
|
||||
}
|
||||
});
|
||||
|
||||
@@ -60,4 +60,11 @@ public class Spindexer extends SubsystemBase {
|
||||
});
|
||||
}
|
||||
|
||||
public Command instantaneousStop() {
|
||||
return runOnce(() -> {
|
||||
spindexerMotor.setControl(spindexerMotorOutput.withOutput(0));
|
||||
feederMotor.set(0);
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -109,6 +109,7 @@ public class SwerveModule {
|
||||
drive.getConfigurator().apply(ModuleConstants.kDriveMotorConfig);
|
||||
drive.getConfigurator().apply(ModuleConstants.kAudioConfig);
|
||||
drive.getConfigurator().apply(ModuleConstants.kDriveSlot0Config);
|
||||
drive.getConfigurator().apply(ModuleConstants.kDriveClosedLoopRampConfig);
|
||||
|
||||
turning.configure(
|
||||
ModuleConstants.turningConfig,
|
||||
|
||||
Reference in New Issue
Block a user