diff --git a/PathWeaver/Autos/1BallHangarSide b/PathWeaver/Autos/1BallHangarSide new file mode 100644 index 0000000..dc11a68 --- /dev/null +++ b/PathWeaver/Autos/1BallHangarSide @@ -0,0 +1 @@ +HangarSideFirstBall diff --git a/PathWeaver/Paths/HangarSideFirstBall b/PathWeaver/Paths/HangarSideFirstBall new file mode 100644 index 0000000..8613fca --- /dev/null +++ b/PathWeaver/Paths/HangarSideFirstBall @@ -0,0 +1,3 @@ +X,Y,Tangent X,Tangent Y,Fixed Theta,Reversed,Name +7.296058027886137,-3.663979009231006,-0.8863404117260814,0.9927012611332127,true,false, +4.944301468772932,-1.9503875465605802,-0.5554399913483445,0.5436221191919977,true,false, diff --git a/PathWeaver/Paths/LinearTest b/PathWeaver/Paths/LinearTest new file mode 100644 index 0000000..8e06f70 --- /dev/null +++ b/PathWeaver/Paths/LinearTest @@ -0,0 +1,3 @@ +X,Y,Tangent X,Tangent Y,Fixed Theta,Reversed,Name +7.343329516511528,-3.7112504978563976,-2.4581174085203363,0.02363574431269555,true,false, +5.15,-3.7116,-1.7892934001776695,0.023985246456297737,true,false, diff --git a/PathWeaver/Paths/NonLinearTest b/PathWeaver/Paths/NonLinearTest new file mode 100644 index 0000000..c3c9d0b --- /dev/null +++ b/PathWeaver/Paths/NonLinearTest @@ -0,0 +1,3 @@ +X,Y,Tangent X,Tangent Y,Fixed Theta,Reversed,Name +7.236968667104398,-3.687614753543702,-1.914495289328337,0.7090723293808661,true,false, +3.10071341238268,-3.923972196670657,-2.0326740108918155,0.8272510509443438,true,false, diff --git a/PathWeaver/pathweaver.json b/PathWeaver/pathweaver.json new file mode 100644 index 0000000..5d37410 --- /dev/null +++ b/PathWeaver/pathweaver.json @@ -0,0 +1,9 @@ +{ + "lengthUnit": "Meter", + "exportUnit": "Always Meters", + "maxVelocity": 4.0, + "maxAcceleration": 1.0, + "trackWidth": 1.2406, + "gameName": "Rapid React", + "outputDir": "../src/main/deploy" +} \ No newline at end of file diff --git a/src/main/deploy/output/HangarSideFirstBall.wpilib.json b/src/main/deploy/output/HangarSideFirstBall.wpilib.json new file mode 100644 index 0000000..c92c9da --- /dev/null +++ b/src/main/deploy/output/HangarSideFirstBall.wpilib.json @@ -0,0 +1,557 @@ +[ +{ +"acceleration": 1.0000000000000002, +"curvature": -0.0, +"pose": { +"rotation": { +"radians": 2.2996510532475267 +}, +"translation": { +"x": 7.296058027886137, +"y": 4.565620990768993 +} +}, +"time": 0.0, +"velocity": 0.0 +}, +{ +"acceleration": 0.9999999999999999, +"curvature": 0.7046526549936946, +"pose": { +"rotation": { +"radians": 2.340071458330768 +}, +"translation": { +"x": 7.237122350294481, +"y": 4.629655803575388 +} +}, +"time": 0.41720017192887204, +"velocity": 0.41720017192887215 +}, +{ +"acceleration": 1.0, +"curvature": 0.5167714112787369, +"pose": { +"rotation": { +"radians": 2.408387003016788 +}, +"translation": { +"x": 7.159692305068378, +"y": 4.704062631315389 +} +}, +"time": 0.6235609903276057, +"velocity": 0.6235609903276058 +}, +{ +"acceleration": 1.0, +"curvature": 0.3798327946085926, +"pose": { +"rotation": { +"radians": 2.437621774262191 +}, +"translation": { +"x": 7.110188157019157, +"y": 4.747292080731512 +} +}, +"time": 0.7212997247365294, +"velocity": 0.7212997247365295 +}, +{ +"acceleration": 1.0, +"curvature": 0.27231786672071406, +"pose": { +"rotation": { +"radians": 2.461827180519893 +}, +"translation": { +"x": 7.052310222072237, +"y": 4.795177423025944 +} +}, +"time": 0.818847516710207, +"velocity": 0.8188475167102071 +}, +{ +"acceleration": 1.0, +"curvature": 0.19496235127775563, +"pose": { +"rotation": { +"radians": 2.4814294171577522 +}, +"translation": { +"x": 6.985657913541941, +"y": 4.847919970104026 +} +}, +"time": 0.9167895596364871, +"velocity": 0.9167895596364872 +}, +{ +"acceleration": 1.0, +"curvature": 0.1409791525409567, +"pose": { +"rotation": { +"radians": 2.497178545789836 +}, +"translation": { +"x": 6.910176803843516, +"y": 4.905523305953324 +} +}, +"time": 1.0150879346181663, +"velocity": 1.0150879346181663 +}, +{ +"acceleration": 1.0, +"curvature": 0.10344784821657113, +"pose": { +"rotation": { +"radians": 2.5098174403962026 +}, +"translation": { +"x": 6.82612362989756, +"y": 4.967813573365698 +} +}, +"time": 1.1133913740328822, +"velocity": 1.1133913740328822 +}, +{ +"acceleration": 0.9999999999999991, +"curvature": 0.0770914021308612, +"pose": { +"rotation": { +"radians": 2.519974120995346 +}, +"translation": { +"x": 6.734031298534453, +"y": 5.034459760659368 +} +}, +"time": 1.2111963357394289, +"velocity": 1.2111963357394289 +}, +{ +"acceleration": 1.0000000000000018, +"curvature": 0.05824813214526938, +"pose": { +"rotation": { +"radians": 2.5281456318085227 +}, +"translation": { +"x": 6.634673891898785, +"y": 5.104993988400992 +} +}, +"time": 1.3079345789097343, +"velocity": 1.3079345789097343 +}, +{ +"acceleration": 1.0, +"curvature": 0.05083925731030608, +"pose": { +"rotation": { +"radians": 2.5316099349397763 +}, +"translation": { +"x": 6.582570020447651, +"y": 5.141540472776556 +} +}, +"time": 1.3557209501478797, +"velocity": 1.3557209501478797 +}, +{ +"acceleration": 1.0, +"curvature": 0.044456822630151084, +"pose": { +"rotation": { +"radians": 2.534712911904704 +}, +"translation": { +"x": 6.529031672853788, +"y": 5.178831796127727 +} +}, +"time": 1.4030219651777522, +"velocity": 1.4030219651777522 +}, +{ +"acceleration": 1.0, +"curvature": 0.0389168945314462, +"pose": { +"rotation": { +"radians": 2.5374875852321135 +}, +"translation": { +"x": 6.474207856411549, +"y": 5.216780013401131 +} +}, +"time": 1.449766557319599, +"velocity": 1.449766557319599 +}, +{ +"acceleration": 1.0, +"curvature": 0.03406770246119906, +"pose": { +"rotation": { +"radians": 2.5399623294680955 +}, +"translation": { +"x": 6.418256090385759, +"y": 5.255292429069307 +} +}, +"time": 1.4958853834417933, +"velocity": 1.4958853834417933 +}, +{ +"acceleration": 1.0, +"curvature": 0.02978308043612628, +"pose": { +"rotation": { +"radians": 2.542161388401129 +}, +"translation": { +"x": 6.361341312430599, +"y": 5.294272231090778 +} +}, +"time": 1.5413111263606993, +"velocity": 1.5413111263606993 +}, +{ +"acceleration": 0.9999999999999969, +"curvature": 0.025957101092007828, +"pose": { +"rotation": { +"radians": 2.544105319919419 +}, +"translation": { +"x": 6.303634785008495, +"y": 5.333619124870108 +} +}, +"time": 1.585978725676304, +"velocity": 1.585978725676304 +}, +{ +"acceleration": 0.9999999999999969, +"curvature": 0.022499669282720083, +"pose": { +"rotation": { +"radians": 2.5458113709251373 +}, +"translation": { +"x": 6.245313001809008, +"y": 5.3732299672179735 +} +}, +"time": 1.629825556366533, +"velocity": 1.6298255563665327 +}, +{ +"acceleration": 0.6345170575781763, +"curvature": 0.019332867264386294, +"pose": { +"rotation": { +"radians": 2.5472937861561915 +}, +"translation": { +"x": 6.186556594167721, +"y": 5.412999400311222 +} +}, +"time": 1.6727915699838285, +"velocity": 1.672791569983828 +}, +{ +"acceleration": -0.9999999999999969, +"curvature": 0.016387870032603457, +"pose": { +"rotation": { +"radians": 2.548564055017322 +}, +"translation": { +"x": 6.127549237485125, +"y": 5.452820485652941 +} +}, +"time": 1.7150093362619303, +"velocity": 1.6995794628201324 +}, +{ +"acceleration": -1.0, +"curvature": 0.013602272471953643, +"pose": { +"rotation": { +"radians": 2.5496311000579794 +}, +"translation": { +"x": 6.068476557645514, +"y": 5.492585338032521 +} +}, +"time": 1.7574373576963098, +"velocity": 1.657151441385753 +}, +{ +"acceleration": -1.0, +"curvature": 0.010917687239448186, +"pose": { +"rotation": { +"radians": 2.550501409825501 +}, +"translation": { +"x": 6.009525037435866, +"y": 5.532185759485722 +} +}, +"time": 1.8008614233459463, +"velocity": 1.6137273757361166 +}, +{ +"acceleration": -1.0, +"curvature": 0.008277482516533353, +"pose": { +"rotation": { +"radians": 2.5511791176175995 +}, +"translation": { +"x": 5.950880922964737, +"y": 5.571513873254737 +} +}, +"time": 1.8452274050615463, +"velocity": 1.5693613940205167 +}, +{ +"acceleration": -1.0, +"curvature": 0.005624531040495701, +"pose": { +"rotation": { +"radians": 2.551666026227246 +}, +"translation": { +"x": 5.892729130081147, +"y": 5.6104627577482535 +} +}, +"time": 1.8904777400074857, +"velocity": 1.5241110590745772 +}, +{ +"acceleration": -1.0, +"curvature": 0.002898835090000706, +"pose": { +"rotation": { +"radians": 2.5519615771311823 +}, +"translation": { +"x": 5.835252150793467, +"y": 5.6489270805015215 +} +}, +"time": 1.9365514192419802, +"velocity": 1.4780373798400828 +}, +{ +"acceleration": -1.0, +"curvature": 3.487470383652936e-05, +"pose": { +"rotation": { +"radians": 2.5520627606980106 +}, +"translation": { +"x": 5.778628959688312, +"y": 5.686803732136422 +} +}, +"time": 1.9833839667003454, +"velocity": 1.4312048323817175 +}, +{ +"acceleration": -1.0, +"curvature": -0.0030415042170831874, +"pose": { +"rotation": { +"radians": 2.5519639618332066 +}, +"translation": { +"x": 5.723033920349424, +"y": 5.723992460321524 +} +}, +"time": 2.0309074115449537, +"velocity": 1.3836813875371095 +}, +{ +"acceleration": -0.9999999999999982, +"curvature": -0.0064168930401514186, +"pose": { +"rotation": { +"radians": 2.5516567329653497 +}, +"translation": { +"x": 5.668635691776565, +"y": 5.760396503732153 +} +}, +"time": 2.0790502579221286, +"velocity": 1.3355385411599343 +}, +{ +"acceleration": -1.0, +"curvature": -0.010195116519283036, +"pose": { +"rotation": { +"radians": 2.5511294833261564 +}, +"translation": { +"x": 5.6155961348044, +"y": 5.795923226010456 +} +}, +"time": 2.127737457709116, +"velocity": 1.286851341372947 +}, +{ +"acceleration": -1.0, +"curvature": -0.019500633137893245, +"pose": { +"rotation": { +"radians": 2.549350272146696 +}, +"translation": { +"x": 5.5141999266886845, +"y": 5.863998590333166 +} +}, +"time": 2.2264268763361903, +"velocity": 1.188161922745873 +}, +{ +"acceleration": -0.9999999999999984, +"curvature": -0.03242352373537361, +"pose": { +"rotation": { +"radians": 2.546452086242235 +}, +"translation": { +"x": 5.4199626632954985, +"y": 5.927584052245708 +} +}, +"time": 2.3263042730827133, +"velocity": 1.08828452599935 +}, +{ +"acceleration": -1.0, +"curvature": -0.05138202898256643, +"pose": { +"rotation": { +"radians": 2.5421698138048328 +}, +"translation": { +"x": 5.3338229520854235, +"y": 5.986151683617407 +} +}, +"time": 2.4266442374230612, +"velocity": 0.9879445616590021 +}, +{ +"acceleration": -1.0, +"curvature": -0.08052589009449668, +"pose": { +"rotation": { +"radians": 2.536109882662837 +}, +"translation": { +"x": 5.256505646090824, +"y": 6.039300415952937 +} +}, +"time": 2.526676373322581, +"velocity": 0.8879124257594825 +}, +{ +"acceleration": -1.000000000000001, +"curvature": -0.1271600889636688, +"pose": { +"rotation": { +"radians": 2.527695331058469 +}, +"translation": { +"x": 5.188486849320288, +"y": 6.086776327114388 +} +}, +"time": 2.625608007325845, +"velocity": 0.7889807917562185 +}, +{ +"acceleration": -0.9999999999999998, +"curvature": -0.20421415446353952, +"pose": { +"rotation": { +"radians": 2.5160936461654595 +}, +"translation": { +"x": 5.12995892216304, +"y": 6.128492928043334 +} +}, +"time": 2.7226756640110015, +"velocity": 0.6919131350710617 +}, +{ +"acceleration": -1.0, +"curvature": -0.5474240067782133, +"pose": { +"rotation": { +"radians": 2.478436783130011 +}, +"translation": { +"x": 5.040516432575136, +"y": 6.1952611286998565 +} +}, +"time": 2.9091054677973287, +"velocity": 0.5054833312847344 +}, +{ +"acceleration": -0.9999999999999999, +"curvature": -1.1809181090136762, +"pose": { +"rotation": { +"radians": 2.415177928221663 +}, +"translation": { +"x": 4.9827123934221556, +"y": 6.243032662483474 +} +}, +"time": 3.0897282424707315, +"velocity": 0.32486055661133184 +}, +{ +"acceleration": -0.9999999999999999, +"curvature": -8.961282879756587e-14, +"pose": { +"rotation": { +"radians": 2.3669467639834165 +}, +"translation": { +"x": 4.944301468772939, +"y": 6.279212453439419 +} +}, +"time": 3.4145887990820634, +"velocity": 0.0 +} +] \ No newline at end of file diff --git a/src/main/deploy/output/LinearTest.wpilib.json b/src/main/deploy/output/LinearTest.wpilib.json new file mode 100644 index 0000000..db34575 --- /dev/null +++ b/src/main/deploy/output/LinearTest.wpilib.json @@ -0,0 +1,422 @@ +[ +{ +"acceleration": 1.0, +"curvature": -0.0, +"pose": { +"rotation": { +"radians": 3.1319775652900907 +}, +"translation": { +"x": 7.343329516511528, +"y": 4.518349502143602 +} +}, +"time": 0.0, +"velocity": 0.0 +}, +{ +"acceleration": 1.0000000000000004, +"curvature": 0.006792988534224084, +"pose": { +"rotation": { +"radians": 3.1322473500147394 +}, +"translation": { +"x": 7.266513175402384, +"y": 4.519081097897949 +} +}, +"time": 0.39196893977576813, +"velocity": 0.39196893977576813 +}, +{ +"acceleration": 1.0000000000000004, +"curvature": 0.012251764052837165, +"pose": { +"rotation": { +"radians": 3.132987014464534 +}, +"translation": { +"x": 7.189700919427855, +"y": 4.519773225995339 +} +}, +"time": 0.554319761593559, +"velocity": 0.5543197615935591 +}, +{ +"acceleration": 1.0000000000000007, +"curvature": 0.016484396994587324, +"pose": { +"rotation": { +"radians": 3.134097860480685 +}, +"translation": { +"x": 7.112910235088217, +"y": 4.520393500148893 +} +}, +"time": 0.6788643288125953, +"velocity": 0.6788643288125955 +}, +{ +"acceleration": 1.0, +"curvature": 0.019603399516883686, +"pose": { +"rotation": { +"radians": 3.1354892959584815 +}, +"translation": { +"x": 7.036171870399583, +"y": 4.520916787914282 +} +}, +"time": 0.7837965773270686, +"velocity": 0.783796577327069 +}, +{ +"acceleration": 1.0, +"curvature": 0.02171946236983872, +"pose": { +"rotation": { +"radians": 3.1370789252840883 +}, +"translation": { +"x": 6.9595283409225335, +"y": 4.521324692272403 +} +}, +"time": 0.8761428562028188, +"velocity": 0.8761428562028192 +}, +{ +"acceleration": 1.0000000000000016, +"curvature": 0.02293711709496013, +"pose": { +"rotation": { +"radians": 3.1387923525453036 +}, +"translation": { +"x": 6.883032435790746, +"y": 4.521605033212085 +} +}, +"time": 0.9594890005227997, +"velocity": 0.9594890005228001 +}, +{ +"acceleration": 1.0000000000000016, +"curvature": 0.02335198368105572, +"pose": { +"rotation": { +"radians": 3.1405627893995374 +}, +"translation": { +"x": 6.806745723739625, +"y": 4.521751329312785 +} +}, +"time": 1.0359502144313282, +"velocity": 1.0359502144313286 +}, +{ +"acceleration": 1.0, +"curvature": 0.02304927912486566, +"pose": { +"rotation": { +"radians": -3.1408547633587385 +}, +"translation": { +"x": 6.73073705913493, +"y": 4.521762279327276 +} +}, +"time": 1.1068921255331041, +"velocity": 1.1068921255331046 +}, +{ +"acceleration": 1.0, +"curvature": 0.022103305458939092, +"pose": { +"rotation": { +"radians": -3.1391428556582324 +}, +"translation": { +"x": 6.655081088001409, +"y": 4.521641243764344 +} +}, +"time": 1.1732528770340305, +"velocity": 1.173252877034031 +}, +{ +"acceleration": 1.0, +"curvature": 0.020577692356382085, +"pose": { +"rotation": { +"radians": -3.137534007699137 +}, +"translation": { +"x": 6.579856754051422, +"y": 4.521395726471484 +} +}, +"time": 1.23570699710173, +"velocity": 1.2357069971017305 +}, +{ +"acceleration": 1.0, +"curvature": 0.018526230218381994, +"pose": { +"rotation": { +"radians": -3.1360700260974177 +}, +"translation": { +"x": 6.505145804713577, +"y": 4.521036856217594 +} +}, +"time": 1.2947568903724644, +"velocity": 1.2947568903724649 +}, +{ +"acceleration": 1.0000000000000016, +"curvature": 0.015994189414299368, +"pose": { +"rotation": { +"radians": -3.134787792265017 +}, +"translation": { +"x": 6.431031297161356, +"y": 4.5205788682756705 +} +}, +"time": 1.3507876407357542, +"velocity": 1.3507876407357546 +}, +{ +"acceleration": 1.0, +"curvature": 0.013020077398458608, +"pose": { +"rotation": { +"radians": -3.133719652988036 +}, +"translation": { +"x": 6.357596104341745, +"y": 4.5200385860055015 +} +}, +"time": 1.4041017096173773, +"velocity": 1.4041017096173778 +}, +{ +"acceleration": 0.06531293042661161, +"curvature": 0.00963783651458339, +"pose": { +"rotation": { +"radians": -3.1328936964154956 +}, +"translation": { +"x": 6.2849214210038635, +"y": 4.51943490243636 +} +}, +"time": 1.4549419205353997, +"velocity": 1.4549419205354002 +}, +{ +"acceleration": -0.9999999999999984, +"curvature": 0.005879530503789499, +"pose": { +"rotation": { +"radians": -3.132333890723757 +}, +"translation": { +"x": 6.213085269727597, +"y": 4.5187882618497035 +} +}, +"time": 1.5042632170116836, +"velocity": 1.458163238940706 +}, +{ +"acceleration": -1.0, +"curvature": 0.001778605447874432, +"pose": { +"rotation": { +"radians": -3.1320600626178665 +}, +"translation": { +"x": 6.142161006952222, +"y": 4.518120141361863 +} +}, +"time": 1.5537443725280706, +"velocity": 1.408682083424319 +}, +{ +"acceleration": -1.0, +"curvature": -0.002626162287175235, +"pose": { +"rotation": { +"radians": -3.1320876919371035 +}, +"translation": { +"x": 6.072215829005039, +"y": 4.517452532506742 +} +}, +"time": 1.6043069898318778, +"velocity": 1.3581194661205118 +}, +{ +"acceleration": -0.9999999999999983, +"curvature": -0.007285908999027022, +"pose": { +"rotation": { +"radians": -3.1324274976770723 +}, +"translation": { +"x": 6.00330927813, +"y": 4.516807422818509 +} +}, +"time": 1.6560309021252135, +"velocity": 1.306395553827176 +}, +{ +"acceleration": -1.0, +"curvature": -0.012136013907648223, +"pose": { +"rotation": { +"radians": -3.1330847907292436 +}, +"translation": { +"x": 5.93549174851634, +"y": 4.516206277414293 +} +}, +"time": 1.7090195167311424, +"velocity": 1.2534069392212472 +}, +{ +"acceleration": -0.9999999999999983, +"curvature": -0.017089476220590122, +"pose": { +"rotation": { +"radians": -3.1340585709615096 +}, +"translation": { +"x": 5.868802992327207, +"y": 4.515669520576875 +} +}, +"time": 1.7634072222481934, +"velocity": 1.1990192337041963 +}, +{ +"acceleration": -1.0, +"curvature": -0.022029429075529343, +"pose": { +"rotation": { +"radians": -3.1353403528105246 +}, +"translation": { +"x": 5.803270625728289, +"y": 4.515216017337387 +} +}, +"time": 1.8193694795699276, +"velocity": 1.143056976382462 +}, +{ +"acceleration": -1.0000000000000009, +"curvature": -0.02680110711501685, +"pose": { +"rotation": { +"radians": -3.136912716795311 +}, +"translation": { +"x": 5.738908634916444, +"y": 4.514862555058008 +} +}, +"time": 1.8771369422702715, +"velocity": 1.0852895136821181 +}, +{ +"acceleration": -1.0000000000000004, +"curvature": -0.034984922731860914, +"pose": { +"rotation": { +"radians": -3.1408044329720473 +}, +"translation": { +"x": 5.613674611769049, +"y": 4.514509403979665 +} +}, +"time": 1.9994185191447422, +"velocity": 0.9630079368076472 +}, +{ +"acceleration": -0.9999999999999993, +"curvature": -0.03939180259312632, +"pose": { +"rotation": { +"radians": 3.137838306007713 +}, +"translation": { +"x": 5.492883442171243, +"y": 4.51468311300253 +} +}, +"time": 2.1342950066346003, +"velocity": 0.8281314493177891 +}, +{ +"acceleration": -1.0000000000000002, +"curvature": -0.03698190804363222, +"pose": { +"rotation": { +"radians": 3.133291505157105 +}, +"translation": { +"x": 5.376003951740285, +"y": 4.515390306376448 +} +}, +"time": 2.290088417784008, +"velocity": 0.6723380381683811 +}, +{ +"acceleration": -1.0000000000000002, +"curvature": -0.024514843391959057, +"pose": { +"rotation": { +"radians": 3.1296790220459405 +}, +"translation": { +"x": 5.262143465340612, +"y": 4.516554597586655 +} +}, +"time": 2.4888173771651547, +"velocity": 0.4736090787872346 +}, +{ +"acceleration": -1.0000000000000002, +"curvature": -1.7512130721932426e-14, +"pose": { +"rotation": { +"radians": 3.128188585834304 +}, +"translation": { +"x": 5.149999999999993, +"y": 4.5180000000000025 +} +}, +"time": 2.9624264559523894, +"velocity": 0.0 +} +] \ No newline at end of file diff --git a/src/main/deploy/output/NonLinearTest.wpilib.json b/src/main/deploy/output/NonLinearTest.wpilib.json new file mode 100644 index 0000000..e6e50e2 --- /dev/null +++ b/src/main/deploy/output/NonLinearTest.wpilib.json @@ -0,0 +1,752 @@ +[ +{ +"acceleration": 1.0, +"curvature": -0.0, +"pose": { +"rotation": { +"radians": 2.7868870015788527 +}, +"translation": { +"x": 7.236968667104398, +"y": 4.5419852464562975 +} +}, +"time": 0.0, +"velocity": 0.0 +}, +{ +"acceleration": 1.0, +"curvature": 0.6431183760589534, +"pose": { +"rotation": { +"radians": 2.8090801026846557 +}, +"translation": { +"x": 7.176507694980693, +"y": 4.563854942153977 +} +}, +"time": 0.35859373496271835, +"velocity": 0.35859373496271835 +}, +{ +"acceleration": 1.0, +"curvature": 0.9632813874118717, +"pose": { +"rotation": { +"radians": 2.865058989164917 +}, +"translation": { +"x": 7.112487424513783, +"y": 4.584101946626071 +} +}, +"time": 0.5127189635471717, +"velocity": 0.5127189635471717 +}, +{ +"acceleration": 0.9999999999999987, +"curvature": 0.9846391624647143, +"pose": { +"rotation": { +"radians": 2.937228290128217 +}, +"translation": { +"x": 7.041984010753304, +"y": 4.601396909012926 +} +}, +"time": 0.6388021292414763, +"velocity": 0.6388021292414763 +}, +{ +"acceleration": 1.0, +"curvature": 0.8414278195016, +"pose": { +"rotation": { +"radians": 3.0111515012815344 +}, +"translation": { +"x": 6.962724643471328, +"y": 4.614710890997543 +} +}, +"time": 0.7541934886899907, +"velocity": 0.7541934886899906 +}, +{ +"acceleration": 1.0, +"curvature": 0.6539572176092259, +"pose": { +"rotation": { +"radians": 3.0783805486860056 +}, +"translation": { +"x": 6.873041141285629, +"y": 4.623293812163382 +} +}, +"time": 0.8654446002897318, +"velocity": 0.8654446002897317 +}, +{ +"acceleration": 1.0000000000000009, +"curvature": 0.4845927846268833, +"pose": { +"rotation": { +"radians": 3.1355966992513338 +}, +"translation": { +"x": 6.771823545782939, +"y": 4.626652895352158 +} +}, +"time": 0.9754696271836718, +"velocity": 0.9754696271836717 +}, +{ +"acceleration": 0.9999999999999991, +"curvature": 0.35179549035683494, +"pose": { +"rotation": { +"radians": -3.100666535108479 +}, +"translation": { +"x": 6.658473715642223, +"y": 4.624531112021641 +} +}, +"time": 1.085486235654601, +"velocity": 1.085486235654601 +}, +{ +"acceleration": 1.0000000000000016, +"curvature": 0.2538039075752756, +"pose": { +"rotation": { +"radians": -3.0629880475283797 +}, +"translation": { +"x": 6.532858920757936, +"y": 4.616885627603462 +} +}, +"time": 1.1958155652744749, +"velocity": 1.1958155652744749 +}, +{ +"acceleration": 1.0, +"curvature": 0.2155131233596031, +"pose": { +"rotation": { +"radians": -3.047173305180617 +}, +"translation": { +"x": 6.465526524061978, +"y": 4.611031375885881 +} +}, +"time": 1.2510586326385922, +"velocity": 1.2510586326385922 +}, +{ +"acceleration": 1.0000000000000016, +"curvature": 0.18300899591126926, +"pose": { +"rotation": { +"radians": -3.033139655276441 +}, +"translation": { +"x": 6.39526543636329, +"y": 4.603866246860908 +} +}, +"time": 1.306291957328082, +"velocity": 1.306291957328082 +}, +{ +"acceleration": 1.0000000000000016, +"curvature": 0.15537527096696074, +"pose": { +"rotation": { +"radians": -3.0207242497683353 +}, +"translation": { +"x": 6.322169298186051, +"y": 4.595435529711038 +} +}, +"time": 1.3614551474403225, +"velocity": 1.3614551474403225 +}, +{ +"acceleration": 1.0, +"curvature": 0.13180645445618613, +"pose": { +"rotation": { +"radians": -3.0097788902368285 +}, +"translation": { +"x": 6.2463521371535204, +"y": 4.585793859246722 +} +}, +"time": 1.416480022600105, +"velocity": 1.416480022600105 +}, +{ +"acceleration": 1.0, +"curvature": 0.11161006606833378, +"pose": { +"rotation": { +"radians": -3.0001709969858354 +}, +"translation": { +"x": 6.167946917804394, +"y": 4.575004542323795 +} +}, +"time": 1.4712932557854306, +"velocity": 1.4712932557854306 +}, +{ +"acceleration": 1.0000000000000027, +"curvature": 0.09419872886168623, +"pose": { +"rotation": { +"radians": -2.991783533531322 +}, +"translation": { +"x": 6.087104091409148, +"y": 4.563138884260908 +} +}, +"time": 1.5258184008529496, +"velocity": 1.5258184008529496 +}, +{ +"acceleration": 1.0, +"curvature": 0.07907784651353172, +"pose": { +"rotation": { +"radians": -2.9845143428798155 +}, +"translation": { +"x": 6.003990145786397, +"y": 4.550275515256961 +} +}, +"time": 1.5799774488762637, +"velocity": 1.579977448876264 +}, +{ +"acceleration": 1.0000000000000024, +"curvature": 0.06583207073549241, +"pose": { +"rotation": { +"radians": -2.97827519157477 +}, +"translation": { +"x": 5.918786155119244, +"y": 4.53649971680853 +} +}, +"time": 1.6336920229520415, +"velocity": 1.6336920229520417 +}, +{ +"acceleration": 1.0, +"curvature": 0.05411221264305731, +"pose": { +"rotation": { +"radians": -2.9729907081288602 +}, +"translation": { +"x": 5.831686329771632, +"y": 4.521902748127303 +} +}, +"time": 1.6868842958747983, +"velocity": 1.6868842958747987 +}, +{ +"acceleration": 1.0000000000000024, +"curvature": 0.04362334802636727, +"pose": { +"rotation": { +"radians": -2.9685973297553883 +}, +"translation": { +"x": 5.742896566104696, +"y": 4.50658117255751 +} +}, +"time": 1.739477695853489, +"velocity": 1.7394776958534894 +}, +{ +"acceleration": 0.9999999999999976, +"curvature": 0.034114361273183846, +"pose": { +"rotation": { +"radians": -2.9650423240787243 +}, +"translation": { +"x": 5.652632996293115, +"y": 4.490636183993351 +} +}, +"time": 1.7913974507258665, +"velocity": 1.7913974507258672 +}, +{ +"acceleration": 1.0000000000000024, +"curvature": 0.02536890538189909, +"pose": { +"rotation": { +"radians": -2.9622829225596625 +}, +"translation": { +"x": 5.561120538141468, +"y": 4.47417293329643 +} +}, +"time": 1.842571009826413, +"velocity": 1.8425710098264134 +}, +{ +"acceleration": 1.0000000000000024, +"curvature": 0.017197625277016158, +"pose": { +"rotation": { +"radians": -2.960285583950223 +}, +"translation": { +"x": 5.468591444900579, +"y": 4.45729985471319 +} +}, +"time": 1.8929283739721758, +"velocity": 1.8929283739721765 +}, +{ +"acceleration": 1.0, +"curvature": 0.00943143720793463, +"pose": { +"rotation": { +"radians": -2.9590253952308134 +}, +"translation": { +"x": 5.3752838550838735, +"y": 4.440127992292334 +} +}, +"time": 1.9424023573406726, +"velocity": 1.9424023573406735 +}, +{ +"acceleration": 0.9999999999999977, +"curvature": 0.0019156420552107058, +"pose": { +"rotation": { +"radians": -2.9584856115029057 +}, +"translation": { +"x": 5.28144034228373, +"y": 4.4227703263022695 +} +}, +"time": 1.990928799864229, +"velocity": 1.99092879986423 +}, +{ +"acceleration": -0.5907384964225079, +"curvature": -0.005495346094425059, +"pose": { +"rotation": { +"radians": -2.958657333421031 +}, +"translation": { +"x": 5.187306464987833, +"y": 4.405341099648527 +} +}, +"time": 2.0384467448037187, +"velocity": 2.0384467448037196 +}, +{ +"acceleration": -1.0, +"curvature": -0.012942864471820118, +"pose": { +"rotation": { +"radians": -2.9595393197514297 +}, +"translation": { +"x": 5.093129316395519, +"y": 4.3879551442912 +} +}, +"time": 2.085752117456783, +"velocity": 2.010501640089942 +}, +{ +"acceleration": -0.9999999999999977, +"curvature": -0.02056865689236139, +"pose": { +"rotation": { +"radians": -2.9611379327276395 +}, +"translation": { +"x": 4.999156074234137, +"y": 4.370727207662373 +} +}, +"time": 2.1338475569368542, +"velocity": 1.9624062006098706 +}, +{ +"acceleration": -1.0, +"curvature": -0.028519509234597767, +"pose": { +"rotation": { +"radians": -2.963467214454633 +}, +"translation": { +"x": 4.905632550575397, +"y": 4.353771279083553 +} +}, +"time": 2.1828949900049506, +"velocity": 1.9133587675417743 +}, +{ +"acceleration": -1.0, +"curvature": -0.03695204986439015, +"pose": { +"rotation": { +"radians": -2.9665490932308898 +}, +"translation": { +"x": 4.81280174165172, +"y": 4.3371999161831 +} +}, +"time": 2.2328307846931734, +"velocity": 1.8634229728535514 +}, +{ +"acceleration": -1.0000000000000024, +"curvature": -0.04603789770824941, +"pose": { +"rotation": { +"radians": -2.9704137188760846 +}, +"translation": { +"x": 4.720902377672591, +"y": 4.321123571313661 +} +}, +"time": 2.2835884996485083, +"velocity": 1.8126652578982168 +}, +{ +"acceleration": -0.9999999999999976, +"curvature": -0.055969338892937814, +"pose": { +"rotation": { +"radians": -2.9750999254745647 +}, +"translation": { +"x": 4.630167472640914, +"y": 4.3056499179696 +} +}, +"time": 2.3350991335193827, +"velocity": 1.7611546240273421 +}, +{ +"acceleration": -1.0, +"curvature": -0.06696570648279973, +"pose": { +"rotation": { +"radians": -2.9806558177207405 +}, +"translation": { +"x": 4.5408228741693595, +"y": 4.2908831772044245 +} +}, +"time": 2.3872914314888956, +"velocity": 1.7089623260578295 +}, +{ +"acceleration": -1.0, +"curvature": -0.07928061827859845, +"pose": { +"rotation": { +"radians": -2.987139472361781 +}, +"translation": { +"x": 4.45308581329672, +"y": 4.276923444048224 +} +}, +"time": 2.440092268850438, +"velocity": 1.656161488696287 +}, +{ +"acceleration": -0.9999999999999973, +"curvature": -0.09321018023134439, +"pose": { +"rotation": { +"radians": -2.99461973773569 +}, +"translation": { +"x": 4.3671634543042614, +"y": 4.263866013925099 +} +}, +"time": 2.493427136826554, +"velocity": 1.6028266207201707 +}, +{ +"acceleration": -0.9999999999999973, +"curvature": -0.10910216327385203, +"pose": { +"rotation": { +"radians": -3.0031771001370617 +}, +"translation": { +"x": 4.283251444532073, +"y": 4.251800709070589 +} +}, +"time": 2.5472207626561962, +"velocity": 1.5490329948905288 +}, +{ +"acceleration": -0.9999999999999972, +"curvature": -0.12736596915457302, +"pose": { +"rotation": { +"radians": -3.0129045628568396 +}, +"translation": { +"x": 4.201532464195421, +"y": 4.240811204949109 +} +}, +"time": 2.6013979047533122, +"velocity": 1.494855852793413 +}, +{ +"acceleration": -1.0, +"curvature": -0.1484828518979495, +"pose": { +"rotation": { +"radians": -3.0239084481545406 +}, +"translation": { +"x": 4.1221747762011, +"y": 4.230974356671376 +} +}, +"time": 2.6558843750382577, +"velocity": 1.4403693825084676 +}, +{ +"acceleration": -1.0, +"curvature": -0.1730152556816665, +"pose": { +"rotation": { +"radians": -3.036308978425141 +}, +"translation": { +"x": 4.045330775963787, +"y": 4.222359525411843 +} +}, +"time": 2.7106083551142848, +"velocity": 1.3856454024324405 +}, +{ +"acceleration": -1.0, +"curvature": -0.20161311696298229, +"pose": { +"rotation": { +"radians": -3.050240412715741 +}, +"translation": { +"x": 3.971135541222391, +"y": 4.21502790482613 +} +}, +"time": 2.765502091820772, +"velocity": 1.330751665725953 +}, +{ +"acceleration": -1.0, +"curvature": -0.23501334520635073, +"pose": { +"rotation": { +"radians": -3.0658503986852508 +}, +"translation": { +"x": 3.8997053818564047, +"y": 4.209031847468453 +} +}, +"time": 2.820504082262278, +"velocity": 1.275749675284447 +}, +{ +"acceleration": -1.0000000000000018, +"curvature": -0.2740261654922649, +"pose": { +"rotation": { +"radians": -3.0832980366298806 +}, +"translation": { +"x": 3.8311363897022597, +"y": 4.20441419120906 +} +}, +"time": 2.8755618907593004, +"velocity": 1.2206918667874245 +}, +{ +"acceleration": -0.9999999999999982, +"curvature": -0.3194982756810784, +"pose": { +"rotation": { +"radians": -3.1027499303529567 +}, +"translation": { +"x": 3.7655029883696747, +"y": 4.201207585651656 +} +}, +"time": 2.9306357834886034, +"velocity": 1.1656179740581212 +}, +{ +"acceleration": -1.0, +"curvature": -0.3722376471963132, +"pose": { +"rotation": { +"radians": -3.1243732142188465 +}, +"translation": { +"x": 3.702856483058013, +"y": 4.199433818550841 +} +}, +"time": 2.985703426127596, +"velocity": 1.110550331419129 +}, +{ +"acceleration": -1.0, +"curvature": -0.5016590681055971, +"pose": { +"rotation": { +"radians": 3.10845429675366 +}, +"translation": { +"x": 3.5866050881412077, +"y": 4.200213599996414 +} +}, +"time": 3.095846831197659, +"velocity": 1.0004069263490658 +}, +{ +"acceleration": -1.0, +"curvature": -0.6604348922884946, +"pose": { +"rotation": { +"radians": 3.0480641246132625 +}, +"translation": { +"x": 3.4822751713609237, +"y": 4.206685004462784 +} +}, +"time": 3.206448632783195, +"velocity": 0.8898051247635298 +}, +{ +"acceleration": -1.0, +"curvature": -0.8263119869696386, +"pose": { +"rotation": { +"radians": 2.9783973732100404 +}, +"translation": { +"x": 3.3892969928070222, +"y": 4.218562601996826 +} +}, +"time": 3.3188956503943015, +"velocity": 0.7773581071524234 +}, +{ +"acceleration": -1.0, +"curvature": -0.938420346976681, +"pose": { +"rotation": { +"radians": 2.9033011960514283 +}, +"translation": { +"x": 3.306591700373408, +"y": 4.2353225091330815 +} +}, +"time": 3.4363197596968202, +"velocity": 0.6599339978499048 +}, +{ +"acceleration": -1.0000000000000002, +"curvature": -0.8924026125215841, +"pose": { +"rotation": { +"radians": 2.831426518084741 +}, +"translation": { +"x": 3.2325249238813107, +"y": 4.256180834251557 +} +}, +"time": 3.56557742481103, +"velocity": 0.5306763327356951 +}, +{ +"acceleration": -0.9999999999999998, +"curvature": -0.5832724205082608, +"pose": { +"rotation": { +"radians": 2.7766044122760505 +}, +"translation": { +"x": 3.1648603692025192, +"y": 4.280072122935529 +} +}, +"time": 3.7246352381447707, +"velocity": 0.3716185194019546 +}, +{ +"acceleration": -0.9999999999999998, +"curvature": -5.466050154457545e-15, +"pose": { +"rotation": { +"radians": 2.755086348475869 +}, +"translation": { +"x": 3.1007134123826825, +"y": 4.305627803329346 +} +}, +"time": 4.096253757546726, +"velocity": 0.0 +} +] \ No newline at end of file diff --git a/src/main/java/frc/robot/Robot.java b/src/main/java/frc/robot/Robot.java index c72215c..ccd9fe0 100644 --- a/src/main/java/frc/robot/Robot.java +++ b/src/main/java/frc/robot/Robot.java @@ -298,6 +298,11 @@ private void createAutoChooser() { new FirePoseVision())))); autoChooser.addOption("Drive Straight Trajectory", new DriveTrajectory("StraightLine")); + autoChooser.addOption("Linear Test Trajectory", new DriveTrajectory("LinearTest")); + autoChooser.addOption("Linear Auto Test Trajectory", new PKParallelCommandGroup(new TurretVisionAlign(), + new PKSequentialCommandGroup(new PKParallelCommandGroup(new IntakeIngestTimed(5.0), + new PKSequentialCommandGroup(new WaitCommand(1.0), new DriveTrajectory("LinearTest")), + new FirePoseVision())))); SmartDashboard.putData("Auto Mode", autoChooser); } diff --git a/src/main/java/frc/robot/commands/drive/DriveTrajectory.java b/src/main/java/frc/robot/commands/drive/DriveTrajectory.java index 9e5c625..14b0d8c 100644 --- a/src/main/java/frc/robot/commands/drive/DriveTrajectory.java +++ b/src/main/java/frc/robot/commands/drive/DriveTrajectory.java @@ -46,7 +46,7 @@ public DriveTrajectory(String pathName) { Path trajectoryPath = Filesystem.getDeployDirectory().toPath().resolve(trajectoryJSON); trajectory = TrajectoryUtil.fromPathweaverJson(trajectoryPath); } catch (IOException ex) { - DriverStation.reportError("Unable to open trajectory" + trajectoryJSON, ex.getStackTrace()); + DriverStation.reportError("Unable to open trajectory " + trajectoryJSON, ex.getStackTrace()); return; } diff --git a/src/main/java/frc/robot/config/BuildVersionInfo.java b/src/main/java/frc/robot/config/BuildVersionInfo.java index 3469492..083ca78 100644 --- a/src/main/java/frc/robot/config/BuildVersionInfo.java +++ b/src/main/java/frc/robot/config/BuildVersionInfo.java @@ -19,6 +19,6 @@ **/ class BuildVersionInfo { public static final String programmer = "Caleb Hagner"; - public static final String commitSHA = "bb6a93a"; - public static final String timeStamp = "20220320-170850"; + public static final String commitSHA = "3856698"; + public static final String timeStamp = "20220320-171732"; } diff --git a/src/main/java/frc/robot/sensors/gyro/GyroSensor.java b/src/main/java/frc/robot/sensors/gyro/GyroSensor.java index daec360..6fa7ddf 100644 --- a/src/main/java/frc/robot/sensors/gyro/GyroSensor.java +++ b/src/main/java/frc/robot/sensors/gyro/GyroSensor.java @@ -13,7 +13,7 @@ /** * Provides implementation of IGyroSensor for the - * Suitcase-Bot which is based on the navX-MXP sensor. + * Real-Bot which is based on the navX-MXP sensor. */ class GyroSensor extends SuitcaseGyroSensor { diff --git a/src/main/java/frc/robot/sensors/gyro/SuitcaseGyroSensor.java b/src/main/java/frc/robot/sensors/gyro/SuitcaseGyroSensor.java index 21e4ba4..763e5e0 100644 --- a/src/main/java/frc/robot/sensors/gyro/SuitcaseGyroSensor.java +++ b/src/main/java/frc/robot/sensors/gyro/SuitcaseGyroSensor.java @@ -43,12 +43,12 @@ public double getPitch() { @Override public double getYaw() { - return mySensor.ahrs.getYaw(); + return -mySensor.ahrs.getYaw(); } @Override public double getAngle() { - return mySensor.ahrs.getAngle(); + return -mySensor.ahrs.getAngle(); } } diff --git a/src/main/java/frc/robot/sensors/vision/LimelightVision.java b/src/main/java/frc/robot/sensors/vision/LimelightVision.java index d2bcc0b..c886b8c 100644 --- a/src/main/java/frc/robot/sensors/vision/LimelightVision.java +++ b/src/main/java/frc/robot/sensors/vision/LimelightVision.java @@ -8,7 +8,6 @@ package frc.robot.sensors.vision; - import edu.wpi.first.networktables.NetworkTable; import edu.wpi.first.networktables.NetworkTableInstance; import edu.wpi.first.wpilibj.smartdashboard.SmartDashboard; @@ -16,7 +15,6 @@ import riolog.PKLogger; import riolog.RioLogger; - /** * Wrapper for the Limelight Vision Sensor to provide ease when switching from * Limelight and RPi vision. Additionally, provides access to the values sent @@ -42,7 +40,7 @@ class LimelightVision { protected boolean isLocked() { return (table.getEntry("tv").getDouble(0.0) == 1) - && (Math.abs((table.getEntry("tx").getDouble(0.15))) < 0.15); + && (Math.abs((table.getEntry("tx").getDouble(0.25))) < 0.25); } protected boolean isEnabled() { diff --git a/src/main/java/frc/robot/subsystems/drive/DriveSubsystem.java b/src/main/java/frc/robot/subsystems/drive/DriveSubsystem.java index 588be71..b427c3f 100644 --- a/src/main/java/frc/robot/subsystems/drive/DriveSubsystem.java +++ b/src/main/java/frc/robot/subsystems/drive/DriveSubsystem.java @@ -50,15 +50,18 @@ class DriveSubsystem extends BaseDriveSubsystem { // private static final double v = 2.1836; // VoltSeconds Per Meter // private static final double a = 0.44028; // VoltSecondsSquared Per Meter // private static final double p = 2.3834; // Drive Velocity - private static final double s = 6; // Volts // 0.1 // 0.224 // 0.324 // 0.524 // 0.75 - private static final double v = 5; // VoltSeconds Per Meter // 0.01 // 0.99 // 1.25 // 2.5 // 2.75 - private static final double a = 0.1; // VoltSecondsSquared Per Meter // 0.2 // 0.5 - private static final double p = 0.01; // Drive Velocity // 0.03 // 0.00025 // 0.0003 // 0.0005 // 0.00075 // 0.001 - // // 0.005 - // // 0.003 - private static final double trackWidth = 0.56411; // Meters // 0.6731 * 1.7 - private static final double ramseteB = 3; // Proportional constant that makes larger values give more aggressive - // convergence (b > 0) + private static final double s = 0.20814; // Volts // 0.1 // 0.224 // 0.324 // 0.524 // 0.75 // 0.20814 // 0.5 + private static final double v = 1.25; // VoltSeconds Per Meter // 0.01 // 0.99 // 1.25 // 2.5 // 2.75 + private static final double a = 0.21697; // VoltSecondsSquared Per Meter // 0.2 // 0.5 + private static final double p = 0.004; // Drive Velocity // 0.03 // 0.00025 // 0.0003 // 0.0005 // 0.00075 // + // 0.001 + // // 0.005 + // // 0.003 + // 0.01 + // 0.0048044 // 0.008 + private static final double trackWidth = 1.2406; // Meters // 0.6731 * 1.7 + private static final double ramseteB = 1.5; // Proportional constant that makes larger values give more aggressive + // convergence (b > 0) private static final double ramseteZeta = 0.7; // Larger values provide more damping (0 < zeta < 1) private static final double maxSpeed = 5; // Meters Per Second private static final double maxAcceleration = 0.1; // Meters Per Second Squared @@ -140,7 +143,7 @@ class DriveSubsystem extends BaseDriveSubsystem { leftEncoder = leftFrontMotor.getEncoder(); checkError(leftEncoder.setPositionConversionFactor(Math.PI * wheelDiameter / gearRatio), "L Encoder setting position conversion factor"); - checkError(leftEncoder.setVelocityConversionFactor(Math.PI * wheelDiameter / gearRatio / 81 / 60), + checkError(leftEncoder.setVelocityConversionFactor(Math.PI * wheelDiameter / gearRatio / 60), "L Encoder setting velocity conversion factor"); rightEncoder = rightFrontMotor.getEncoder(); checkError(rightEncoder.setPositionConversionFactor(Math.PI * wheelDiameter / gearRatio), @@ -164,7 +167,7 @@ class DriveSubsystem extends BaseDriveSubsystem { driveOdometry = new DifferentialDriveOdometry(Rotation2d.fromDegrees(nav.getAngle())); autoVoltageConstraint = new DifferentialDriveVoltageConstraint(new SimpleMotorFeedforward(s, v, a), - driveKinematics, 4); + driveKinematics, 8); trajectoryConfig = new TrajectoryConfig(maxSpeed, maxAcceleration).setKinematics(driveKinematics) .addConstraint(autoVoltageConstraint); @@ -294,7 +297,9 @@ public RamseteCommand followTrajectory(Trajectory trajectory) { */ private void tankDriveVolts(final double leftVolts, final double rightVolts) { leftFrontMotor.setVoltage(leftVolts * (leftReversed ? -1 : 1)); // 1 // 0.4 // 0.6 + SmartDashboard.putNumber("Trajectory Left Voltage", leftVolts); rightFrontMotor.setVoltage(rightVolts * (rightReversed ? -1 : 1)); // 1 // 0.4 // 0.6 + SmartDashboard.putNumber("Trajectory Right Voltage", rightVolts); } /**