From 08e792542e66ace270e851754957cd0a84fa7baa Mon Sep 17 00:00:00 2001 From: GearBoxFox <98189655+GearBoxFox@users.noreply.github.com> Date: Fri, 19 Jan 2024 18:18:53 -0800 Subject: [PATCH 1/4] TFW you realize you need to modify GosLib a bit more --- .../drive/module/ModuleIOTalonFX.java | 23 ++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/src/main/java/frc/robot/subsystems/drive/module/ModuleIOTalonFX.java b/src/main/java/frc/robot/subsystems/drive/module/ModuleIOTalonFX.java index 45cd6f50..fe14dd60 100644 --- a/src/main/java/frc/robot/subsystems/drive/module/ModuleIOTalonFX.java +++ b/src/main/java/frc/robot/subsystems/drive/module/ModuleIOTalonFX.java @@ -25,6 +25,8 @@ import com.ctre.phoenix6.signals.InvertedValue; import com.ctre.phoenix6.signals.NeutralModeValue; import com.ctre.phoenix6.signals.SensorDirectionValue; +import com.gos.lib.phoenix6.properties.pid.Phoenix6TalonPidPropertyBuilder; +import com.gos.lib.properties.pid.PidProperty; import edu.wpi.first.math.geometry.Rotation2d; import edu.wpi.first.math.util.Units; import java.util.Queue; @@ -45,6 +47,10 @@ public class ModuleIOTalonFX implements ModuleIO { private final TalonFX m_driveTalon; private final TalonFX m_turnTalon; private final CANcoder m_cancoder; + + private final PidProperty m_drivePid; + private final PidProperty m_turnPid; + private final ModuleConstants m_moduleConstants; private final StatusSignal m_drivePosition; @@ -86,7 +92,12 @@ public ModuleIOTalonFX(ModuleConstants moduleConstants) { setDriveBrakeMode(true); // setup pid gains for drive motor - + m_drivePid = new Phoenix6TalonPidPropertyBuilder( + "Drive/Module" + m_moduleConstants.MODULE_INDEX + "/Drive Pid Property", + false, + m_driveTalon, + 0 + ).addP(m_moduleConstants.DRIVE_KP).build(); // run configs on turning motor var turnConfig = new TalonFXConfiguration(); @@ -98,6 +109,16 @@ public ModuleIOTalonFX(ModuleConstants moduleConstants) { m_turnTalon.getConfigurator().apply(turnConfig); setTurnBrakeMode(true); + m_turnPid = new Phoenix6TalonPidPropertyBuilder( + "Drive/Module" + m_moduleConstants.MODULE_INDEX + "/Turn Pid Property", + false, + m_turnTalon, + 0) + .addP(m_moduleConstants.TURN_KP) + .addI(m_moduleConstants.TURN_KI) + .addD(m_moduleConstants.TURN_KD) + .build(); + // run factory default on cancoder var encoderConfig = new CANcoderConfiguration(); encoderConfig.MagnetSensor.SensorDirection = From bbf92530ac30cff9626f849ce894cd6d5478b333 Mon Sep 17 00:00:00 2001 From: GearBoxFox <98189655+GearBoxFox@users.noreply.github.com> Date: Fri, 19 Jan 2024 18:46:46 -0800 Subject: [PATCH 2/4] fix sim gui --- build.gradle | 7 +- ctre_sim/CANCoder vers. H - 011 - 0 - ext.dat | Bin 0 -> 2048 bytes ctre_sim/CANCoder vers. H - 02 - 0 - ext.dat | Bin 0 -> 2048 bytes ctre_sim/CANCoder vers. H - 05 - 0 - ext.dat | Bin 0 -> 2048 bytes ctre_sim/CANCoder vers. H - 08 - 0 - ext.dat | Bin 0 -> 2048 bytes ctre_sim/Talon FX vers. C - 00 - 0 - ext.dat | Bin 0 -> 2048 bytes ctre_sim/Talon FX vers. C - 01 - 0 - ext.dat | Bin 0 -> 2048 bytes ctre_sim/Talon FX vers. C - 010 - 0 - ext.dat | Bin 0 -> 2048 bytes ctre_sim/Talon FX vers. C - 03 - 0 - ext.dat | Bin 0 -> 2048 bytes ctre_sim/Talon FX vers. C - 04 - 0 - ext.dat | Bin 0 -> 2048 bytes ctre_sim/Talon FX vers. C - 06 - 0 - ext.dat | Bin 0 -> 2048 bytes ctre_sim/Talon FX vers. C - 07 - 0 - ext.dat | Bin 0 -> 2048 bytes ctre_sim/Talon FX vers. C - 09 - 0 - ext.dat | Bin 0 -> 2048 bytes logs/Log_24-01-19_18-35-38.wpilog | Bin 0 -> 338221 bytes networktables.json | 131 +++++++++++++++++- networktables.json.bck | 98 +++++++++++++ src/main/java/frc/robot/Constants.java | 2 +- src/main/java/frc/robot/RobotContainer.java | 8 +- .../drive/module/ModuleConstants.java | 8 +- .../subsystems/drive/module/ModuleIOSim.java | 38 +++-- vendordeps/SnobotSim.json | 43 ++++++ 21 files changed, 312 insertions(+), 23 deletions(-) create mode 100644 ctre_sim/CANCoder vers. H - 011 - 0 - ext.dat create mode 100644 ctre_sim/CANCoder vers. H - 02 - 0 - ext.dat create mode 100644 ctre_sim/CANCoder vers. H - 05 - 0 - ext.dat create mode 100644 ctre_sim/CANCoder vers. H - 08 - 0 - ext.dat create mode 100644 ctre_sim/Talon FX vers. C - 00 - 0 - ext.dat create mode 100644 ctre_sim/Talon FX vers. C - 01 - 0 - ext.dat create mode 100644 ctre_sim/Talon FX vers. C - 010 - 0 - ext.dat create mode 100644 ctre_sim/Talon FX vers. C - 03 - 0 - ext.dat create mode 100644 ctre_sim/Talon FX vers. C - 04 - 0 - ext.dat create mode 100644 ctre_sim/Talon FX vers. C - 06 - 0 - ext.dat create mode 100644 ctre_sim/Talon FX vers. C - 07 - 0 - ext.dat create mode 100644 ctre_sim/Talon FX vers. C - 09 - 0 - ext.dat create mode 100644 logs/Log_24-01-19_18-35-38.wpilog create mode 100644 networktables.json.bck create mode 100644 vendordeps/SnobotSim.json diff --git a/build.gradle b/build.gradle index 1114ba98..48935bc8 100644 --- a/build.gradle +++ b/build.gradle @@ -111,7 +111,12 @@ sonar { } // Simulation configuration (e.g. environment variables). -wpi.sim.addGui() +// +// The sim GUI is *disabled* by default to support running +// AdvantageKit log replay from the command line. Set the +// value to "true" to enable the sim GUI by default (this +// is the standard WPILib behavior). +wpi.sim.addGui().defaultEnabled = true wpi.sim.addDriverstation() // Setting up my Jar File. In this case, adding all libraries into the main jar ('fat jar') diff --git a/ctre_sim/CANCoder vers. H - 011 - 0 - ext.dat b/ctre_sim/CANCoder vers. H - 011 - 0 - ext.dat new file mode 100644 index 0000000000000000000000000000000000000000..845e4a3a6b08a994b45db7bf27100ff586a8e926 GIT binary patch literal 2048 zcmdT^O-NKx6h7Ki))e0@3tp&G<`i)d8lzt;7)9R1N@;B-X-@s2lRlRDe zlFUt^eBf17El5oWC)4G7qrDCM$~hTc>Z|#gC=Yln3EZ#L{XVM`p1=c+zT$oqejab< zzO1pt*Q3@i^ug`3FXS_gWB5t#>XvimI)OIPAtwH3K(FnK-naHxMAGA5HBQZ`FW@g@ zk(De5+&BEn^`4yEXR9^+S@Xf)JgE4i$vZiwq#hm-zn<~IOIh6+^Ybr#_)c4WqW!P9 zKJroT=8MajzD6Q%O8xlPPUM*fee7o&G#|cKn6I??;h6i)es8z{I(Q!NIqh#8b@+~P z-QL87Mc;vN>}U!1BlH9Mm>u+~*i7}z;W6ZU^6iV){rJHC;(0x<@Odbkh<$qQ2Yt-w z*Qs&sm!n9XS<{QU4IY!VT4(o`g!EB&gMaW)2Qd}Y*ZaA{Q^R*Bys`6|51eQAj~M*k z!CN9ew6$CASB>e!w(EI4vC?vB-5Td`?40UPZ>wzJcdBDw<`?(B!uV&p6rb5qw&*;H hGKdB`l;7g`>s5~i^d6a9>7B##UHz!~e*no;YHa`j literal 0 HcmV?d00001 diff --git a/ctre_sim/CANCoder vers. H - 02 - 0 - ext.dat b/ctre_sim/CANCoder vers. H - 02 - 0 - ext.dat new file mode 100644 index 0000000000000000000000000000000000000000..400651b3d19c9c1f7b187b0ac2b34937fb54e9d6 GIT binary patch literal 2048 zcmdT^O-K`P6o1o^%VpMKQM76U=}-g{L!?74E09VXWFL5GBq5dM$S#4@pg=n{6auNk zpzP3XXppVh3aRK&K^}Gr%RX0!BGV0x^?zUcYTdl_V0-`fe(&S=-v7TvV1EYwBZ&%E zcOK_oL!H%!YoG^RHULYR(dJXOa1o#mR#W5~`UddqJeYW9z{wLq8{*5wpSC~>?N#6) z&pYu4nmFD*_PY}CN?1b3Tfr?5loP8JE-^)qz>bX7xD2mFkx|&5K?aLe51=`M`$#1l zX)igF?Vsk&ybx#Y%mIA*S{QE;ys9`(?2!6hdf>hw_Jx@R+OPlqIpWcEYo6@gF^=~R zue9U-QJ!BNx)HAcvJG{TTG6Nw@4m_T>h4NJ$MKxwcbw){yw=Y5TT{-wbl#;B;1xYl zrg@?rtd+OEuT%H9-d12{Es{TV{t(Tlc%6AsD0>A*h4%qc7w?&O%YCx_1=qdCmlfey zC{Hx5UwpbZz5g7abrjJmamp9XwE1X0+Ik=Pd=cl`g?vKwXJ~Hap?rhl$9nmqaoVq# z@0Ho3dytRb&(jg!Hvsp=TF6WD(Z=`O7HLi5IehyF@v)gR*7o*VsYUoBzw7TGScm7h z59Z{H)(vIxT~DyS<~K|JKBtxbP<&F?m*RSTgWXB`eVL-j^YeS|r||=A{Jz(Z{mmD7 zXq@&_zNPA8yz=!*e}F>18?G^*iiekC{aXNB)66Hat)2Fy^|Ss>oUgp&j&HAV4o`{s zu)ojAcqx8^yOgcAa^9P>AZt2WZU>OGICJ|lT~ z>JS~?9H97)rWnnG?-3<%n*00LoF$yS02va1few!M8UXix@(bGoM(9g z`$2rDE?ItmX>IqK(~C~@ijVF$tCFA1C_gl^x0Z2Uvrk{X&Q_D;u-v53IvyL=dTe*+ zCa3t@^LIne4ZNxLujn1FR9`snE+d32PFJAL;y#V=-FT)${NEhcekbUVRGzo`L`u&G z{5Yu+-Ux8AzBR5+XA4~-xhKQd=Sqru{!|cnwodUu^HCna1CF`keH53kwG~|v=J9Dv z&qt=q{n!`kk;6~ov+A19@;+hH(Th}`c2 literal 0 HcmV?d00001 diff --git a/ctre_sim/CANCoder vers. H - 08 - 0 - ext.dat b/ctre_sim/CANCoder vers. H - 08 - 0 - ext.dat new file mode 100644 index 0000000000000000000000000000000000000000..2bbef49a5f8f46d714f0848e063216890424a798 GIT binary patch literal 2048 zcmdT^O-NK>6usG$mPNK`rQoYYQ6c0;+Bt+W;=-n%MMRJx;UdcxK^v{WMYfvhhawUh zC<|JR8WhFYTi6dRDrnIxBP(NS(ZX^Djn{X7j&J5ct=#y*yzkw6&b{Zn`@J_~v^St- zw8p7xS^1ryM6h}Z=Q~cFL2L>85p|5csv;^DTJyYz>+sC{c^CP*H-v!ReXr!NFnoQK zXK@;N4>zhy7N474Si9i#x}Tg8AANV{C2r3tKR&v#mT_LMQ#VKaYLXb1n-yBb`|oHy z(tY`-lYAfgJ1)-+yt(#|=+Uk>?Io9leiPLTC1u2PR{arK{U+Vv8~BOG+HVVOkjnj$ zdf*;43UV-lll84}d7W+OSI)`s#krcFsj862ErI*%G(T)Q(G5J{m@D3o(yybPJeM_A z_;SMLg*mu9`$9d_IEJ5e%PBcm)(LwP?PKD97W#F3(f6$_5tH)dSB*1s>I?YuL~Iqe z1MVAs@oIlT-e=SL_F3z}Z@jK}*Mn4nDVckR#II+3@G_?R)BOCaKYV9RpQ!Bx>!Tie zH=YgUhMS1IY4sDoe5}Yk^hZ9wL+jytrTNO5AC7t6?Dv`r&0K9`l_(BVAm#(M`V z{s*G5qkW<}BFqE*u{-=@&`R65AFtcKCwsEt$9wjdEb4hh&qGM=!ahCslm2Bom{;$l z&dX6mXV&`FxCF0v^{TUbbGOVw)vm{t<)kS!>J} zb4l#f^Lk`B>cA_n<8P{GPwqF*AH35iRX;Oxq2fFOSwvTQlplAs?CZ!` Sw7y3UmgOk2@O+m(DE}`EA6@|f literal 0 HcmV?d00001 diff --git a/ctre_sim/Talon FX vers. C - 00 - 0 - ext.dat b/ctre_sim/Talon FX vers. C - 00 - 0 - ext.dat new file mode 100644 index 0000000000000000000000000000000000000000..12476bd63ae749232c2716d21fb43555cef73e73 GIT binary patch literal 2048 zcmdT@T}YE*6h7)o&AJHOUDW3&jKFXp6@_e2p@fCd58+MS1VQ3fc@s$uy3pvNksyUZ zLMeC?NHY@wN4UM()p7U(`)<#_gy|A74yw7>gdCqy?Z;l3n zZ)08U^iNmFN5nr_b=VZya22_V+=|;cUH-52M`?F|YJ4LaHh~k4}Dw ztXyTMbLw?9Q99*Iuq~{f&jz=}ZYlt>`|6BG-VLR3>W6V|VIy@({VR*B>sE7mPCw~4 zI(i?h82{k3#QVoLHZacX&CNS^?OHNEBzpzQMHz`YGWO}(u( zq6_`jYk*(vY&Cdl-D07;b^mdr|J-BAx05`Ed0zR+OD7z7iz>QMf|KUuZ$)N{xrVe3Kh#15J&1>%fw)soooYc`sh)EA znSwd^wLZ~-m#i23EhD18_W8AG)?>{}e~tTk%pA}!&J#O?58bx=+Z?}x)-wIEX5>LX ztO@fPt|3DG!HCr7d*PV4=6hcsFgpBNXHV0!CFUlYpxd!YaT literal 0 HcmV?d00001 diff --git a/ctre_sim/Talon FX vers. C - 01 - 0 - ext.dat b/ctre_sim/Talon FX vers. C - 01 - 0 - ext.dat new file mode 100644 index 0000000000000000000000000000000000000000..9d792a2c04f894db4f7581f843d0f0362407dd3d GIT binary patch literal 2048 zcmdT^O-NKx6h7*dQyLK{%_3@yK#CDY=#PP#7Zpk?Gy0)TZh|0D3pcf>ffl-JK#;Km|C=`R5Yf0?m3_H=9Sbc=)#+O&;8E%&UenecP1$m zBXS-3ry~(3;!nmZEIf0hf&w0M+2s_i|F8AuXjgINveo?=7^hhAuNt)sRfX>7?!3(` zTxO$n^hG7nTp^z4xin6Guy|JH4JANUpUVBgyT?fed+7s>P4fc<8iOm z(Rq8p+6U9(?+mZ2VVuXytJiO2tI67s+$_)%-hE5rvE7+}lHqkp-)UPn@aCEyHs6*i z(S>?(R~>bns6?F3^)f?ubpKJS|Lh~-i_lsdd0gY&3&+avCRKD^ah~isC~wf%(p$;1 zlwWc5HCyY$J$$@`U%&37Z#e%q-%cHxHyG-D{y_8-X`KdR9Pvzp^YH3rT)4~iBzJb% zx}k&Pc_egStkN(1kgxTf+_!x#0ZZTZUhLGY=JDJ=wak@9YPD?B};h zJakv7uKTFdrx!e^hyC$>2aEw6d7w9(llR4UigozyYSoK=fFH97bIoT*Tc{38%GQ6L z6mRqD6T};2TxGpup6z^_=Zf=&tnZ_3V-9;h~A}$i|H2 F`w2*2Z}R{E literal 0 HcmV?d00001 diff --git a/ctre_sim/Talon FX vers. C - 010 - 0 - ext.dat b/ctre_sim/Talon FX vers. C - 010 - 0 - ext.dat new file mode 100644 index 0000000000000000000000000000000000000000..3ea2106ae969626d44ea9ff06748e102a1c706c2 GIT binary patch literal 2048 zcmdT@O-NKx6h7LNrbWLKhEcBw0!dJa3L$0|$w+MsTZ9`U2!cdgxUGa1y2?ilQYbi3 z3hhQ(7?tBArJ|x1x|nuD+7D9;7nO>}bk9BKo0&H{)GFx0d*`0}opZkLo_p^!?QS4S zh3TJ;?hp}wGRiT@vxiG4kmnYi&QR5Vt$&h^Wi}Mu-JgMH)R6hBMinVlqU)0nJ|vc} zv(q&CvXp2s9ZIszjn>Z=_r&hW0W$mQk4N3jg>mY;Sa&cHUQ++s_mzqjqv!nNE~}&c z{<8HO$0a^IyseUP9N@&{^MC)N?G*2Oqv9_fYCo_~v(7m3ISl8Kua|MD?bqWT?Xc$x z9h}eOjF?q_#DTBrqujShBw))oe-b~oAi8^Qcc$e&OaH#i`QvY$mHU!z9ZWM>Y~-BP z6IN!_jcMI^0_){X$lf{f#1-N1?!Ut>4ISvP z_xIA0^v^DuUsxv@qm73{j`?T1hAyM>n7;ejbo=UY BX7>O9 literal 0 HcmV?d00001 diff --git a/ctre_sim/Talon FX vers. C - 03 - 0 - ext.dat b/ctre_sim/Talon FX vers. C - 03 - 0 - ext.dat new file mode 100644 index 0000000000000000000000000000000000000000..674afba48e0b90c1849e36d9c2a2a423adccf7cb GIT binary patch literal 2048 zcmdT^OK4M35S_Ns##R?DvJs(C1Vt@08x^4@P^Cd!bfXkEx)B6R5~Z73X`gh_;Km1q zpePvd1MUrA#~=0^ z9ep>Jjej5`@sXSBTN&r|;^O72xn?pxB!>j5;PLB{kK?}lc$W87eJ4!cz(cJ+Oua2l zq6_`5(SV5B$BoES8xRZK9bJcw{!NR@&S`u+-<^8Pne#g%#&}D0VqWw>~KJwdAqUZkPNG91%6r2}5(cVE*7yLNSZjb>$Ds57U0iN&*KZV|1sXVb(t+_#(GX}z+z4)O}h18|{V z@)6IL^}~0?7s_GUiaaZI$!xD}j+yu7Uy^=-du`A;c+%}#HFHJkjlYR+<8Q1pA-n|CsRy*y8r+H literal 0 HcmV?d00001 diff --git a/ctre_sim/Talon FX vers. C - 04 - 0 - ext.dat b/ctre_sim/Talon FX vers. C - 04 - 0 - ext.dat new file mode 100644 index 0000000000000000000000000000000000000000..57fed237a7fd6a01704bc9082aa40c7b5e13b0d7 GIT binary patch literal 2048 zcmdT^O-NKx6h4k)TGk@am>_VHpa=yes1RxfGL#^YAc!`(5rRZhT#43$3f=WUkfNZ0 zN+?v{Ka%NSs#*H1uEeEmn9#^z23bP?~D3+Y~R3JYk$~!n<_;Y z`o&v~Yv98W^3>Lgh3=L;2d(~NcZ6>nHQLPmn(t0af54kn(V*gN>^&%Njqzo+Qm0T~ zam+QnI)MB5c#F7kJ;&T||F6Ct*|%sg^!wzN=qJ)X4aPX~nFjaa*UPwYm+Eo1_u08X z2j}y0^jy5+H{wvQ^R2wM_KvWn?|LVG;=AY`o9NHUdzSfqm@kcY56JtPof^z>mBiE` zt0%4{!JAOt&sy(y{G0+^uGS}Nf6Vof-!Lh9ZqJ-bjyDrU--sTkZsr@ufgk7IR>_C% zO4T)uJ_CBegMK(3zuyVt07spI-kwq0H`B8YH{e&RUd#jhuqG|bxxBg}b+R$v>H1G| zT)$=E*Za_*%z&9Z>x`QZ^K*UF!Mw&&GA|R7H6MDZeBF@|xi77=bK`wGM~?9?{5PTw z^0LZ<*!dyJM?72B58oG`&Btgn@|?+Yc6+I@&%U>sMd=rK&_>O{qmFRZ>;FW>&mhZ`jTOd^ePjs$@Qedk@Jyd#C06SwqV5{RD!@ Bc#r@9 literal 0 HcmV?d00001 diff --git a/ctre_sim/Talon FX vers. C - 06 - 0 - ext.dat b/ctre_sim/Talon FX vers. C - 06 - 0 - ext.dat new file mode 100644 index 0000000000000000000000000000000000000000..c91e9d7f71a10d6da700764b085a908f0681c7dc GIT binary patch literal 2048 zcmdT^Pe{{Y7=E>_EbGugh>BWWDnXhM6@hGrOoM5%EXIYAif+vVwe`u^<2lIFGR@2s2~czyLx(WBs- z#(8HG`gOEPQo1ZLIjH`KtiDEP_y&Idk@D4&b|zj@4}2$W6eMamPjU~&Tjj*cpgP&g zVqNq#v$h2H@bMCPowkp@;r`!!KYf_bjo;?W2i6aq)4>==J=5rYm>(x*-;9HsWB5(( zZIydvAHba@9pkUx4Cpm~(DxQ@@=5v8j~b_D)py7BXkOp5l6{(1{7{?b1K*v!mgkIA z|4H#vW!lI~8ShuqE5{FCNz*4f_=5FOzqMQaJbZR_xU-HZFr|JrMA}6c{MgUcYCU|L zEgCdGz}YYN6+Ac(=gYfs<{K+q96HXHjFuCZMV|xqTN=mCD2{%BA9IjsfQPcV-u5^Rqs5(65fP_6s@_#+M-NTiA5=Z+rT~d*9&q{L!f`dDC&N zM?TN&AF(HYvJj#jsO!xHu)MD?3E}cHXOA}d{CtmUZYLNky$Ll_X7w3PJWeWJ;$ZsOXZ1f}r6%>{vPoQiyO+NU^{{ zDbz{nP*kpwqa>mZ8LZn#%UBT|Diw|Od;dKCw&AK%&@aX4rb`#I)ckwHrM^y-&sY=)0yg&*B*N{cx0*EbjWYuxi28)BYeLIzqSR zC2kqjd}nZN4dc9?_g%k{sv?OYxly4-JbY8@u^q}hOtSCkJ1yr1-dOWf_$ctQWzO9M ze*T1qmC@M()A-^0%TLlqX$T%!|3E zR+r!f{n$lbukB-Qxc|4`PafoRuQdGGU7H8a>FzU*dQQ{(FgS7XukX!i^-1}m4;m+CRCmvna8BQ|Hv2fG_5EiYkfR$aR-01yGIu1QKa|P%#q2#c-lX-DJk>%1)-s4ZvX%Q literal 0 HcmV?d00001 diff --git a/ctre_sim/Talon FX vers. C - 09 - 0 - ext.dat b/ctre_sim/Talon FX vers. C - 09 - 0 - ext.dat new file mode 100644 index 0000000000000000000000000000000000000000..71119452f6be9ec415c25c6c7581199b6382ca30 GIT binary patch literal 2048 zcmdT^O-Phc6uo1UO{t3(R#e#3rjVo&!Xk(nMAM?c2qG%TMM2QuxNuczLJNf!4ir*Z zG*BbtN-0XJnFgJH2>U}9(++40bNaI=YzK-H_yaD?7Oj0T{3ao*SRHgmY>FZ zE#kv}V^-qYi01pkON$ui@vQ68mDnPZ7?vv)n#TjzwI194#Qi9*ZGXq)+`ub~euy4< zUewN5o6xVIRg%(W5`+EfkI2-Q>I~n&PYfzwIcaBFa_WI^pp}9I49=6>gW+{qu`;Mm zydYZ_eT^08;2C_pL|&)aN8fP&Z@wMb#plLv^T{pK51iA&7)L$R=zSPJR?NN`2RFy? z8?0)Qdu1QMttIW{&u<3w>fh^o^VK<}yy1h!p(*v1s)uWm0B-#(+Wb?t-infG1oh)Rt2%X+MX zx}@RZ-_l_hf3^PV+i?7HwZ41&f3ZNSsZzdT4y-XgxLovin)mcbxAT4{H)_4x${4D1 zF5L54b)cIxeC^#Ah2z?~CV9WdXS9DHZn&emg{_gS^N#eW|3iHx<$UJN1M~ezroFVj UOnxOqFQ@iRgnQ!d-ZJ&`6Gm#sG~B; zkj5o~K}A79BnYhmb#QNYRNQeJbzH{zspB$?8#-?P_ndRbt9I(6#QdQTj6x(D>(4^D|-|a;_;UF?~JXS zoJiM}Pp;k^sB%i}{sVS|=iGQYRaY}H5kDxdM~+XA6-K`OvIiW93JPKcW69eM-rwNA zGrXqqtVGS2+Va}U)D-8a)U9?ba`c!GcHv{oTOK)NYzcKO4!-ey)F6e zhr|kwqvVMLyKb2Lu%X8uR+n~8sI9E3Jcs$0Zx)-kWkH-eg0i5vr5k2(_^2a>j!V>} zQ8#&3LJvy%-7Sz1{<%pL;-vkRT~=N@anjgn)rmZl-opRZ$I@FzkaQIPH!4S?jvJSz z{8>)_Fy7AkNCDD}6&yn;{{oSAp_KI+?SEGP&Q$3y=*^S-Z%b4uw*YENyHomprl=M$ z&>1?lGA;5?@1LwnmDm2%`)?`l&z#u`ku01U=yZrPTWKkieqdo7l{!07GrTfgTT?lq zj@$1TYP{19FR!br&9~L|B;H(p!#31{ATTEo@3)3`PyF}s-WB(;HRV&%lPhaS)YPPE zhNbGJ)aEHZTl>X_h5nbwq=YgWohYv=OVpNEl-HI!M^x4xhFm62qBcRLn{v8cZhpA~ z-uj3{dClReslCU5DQ6`{Cz9n8Yg09`f)P}rZIIHhC?j2(hNUJ?PE4sy=bOzoQVC_0 zU=b3tRBs>W*z(D&a`JiqBCU3}wI|%aV{)^tq&%8lxfm(Oi3h~&!2f#Nu7Rr zqQ)6hepX^sqNXxcQ8}?}3^61hRas0``tk9rem&!(t4jW3o&9dZ+O%2E||Rf#^*U}K{yD`KN+Qq_r?+G+bup1j|g)v<|_%BP&3 zsE8$NQj=qS_Ukh+R-5AAt+(7*T4U>Kru<}52kh5}Qo>J16RK?YPVOspG@*))Ce*hJ z+0@tRA~tO-p$@ZYV+nPbP5ru%P5ruxO&d$7!))4ELLFvP|1M-x|E^-w#uDlLov zM%ffA;4YrjoTU#K=$temHIa2{?xPbE6BrP5xO3mZkPmh2dr&^@`kRW;sR^lC=kU6!s$tV6 zRweT9aY`tk`{(cEym@X8Jq}j`nYNZ{=-aU#vsCNksRq~v_1lOeCMRl6PfVFOZA@*d zI`8`3(XHPxRKGhRW$ugpDf_KYvd!~1o_Eq-oQ6Ucmh|h8b+WT0d^o)~af1yu-HsZY zD4%?6-Q)?0nmkRxUHsBAj#8%AWt($j(gI7R;}%Mka@sz7#5?C~znzkoU)!0}r(@0b z*Lt%hv%DR9sM*SJI&WFo)lHPgwlO5yZfv`Mr^dFiHpZ8N9V3bHyP4kku$t7_QxX-h z67zoN-Sl@R*={#_8&RFYfD^M9Wt9_aQuz*0;`Gk%HXWEgaT`*P%n};7Q4^AG$(z17 zyll+S+S>AolM)qqzxM8W{gJxb=tvnap08oNM;o7MP{mE2RIa7T_u&C&$C~_aq-C-e zq_$&e^8Gs|)qA>JIf^7?FC@*}Za?7c;M~eye!h&N)O#Uyl0jcr=Zg2Rx|$k{&^k1r z?d8vdM{B=T%xPbOv8mefDt?@A<^I;60T*I#Qz6{>r_K~&Z+{*2Z$Pu_ zRYL!_RS&l|fZ4w}BmOYOFZx`az!PzWV#z`glRX-_pBt`osP*KQ*R-Uz7jD3b;x10bs4MUm6N|a=GKOe>55#O;+`* zpouJbC=~W8>C+Ru5jMuoqIqd|BCjt}VRP2pEc$h3in*^}d|AQvLq62M`}CBW6r0Mn zYzJn;`uTI<2Hqd3TU0m(z4)(gz}GmcWfGoDN9ffy5LtcIaQMfH{5;yeuK4NWJ-3OtYPlm{{A98O?*XM&kYY z^cyg&CXt?)m{O676|k@zj2tX7KA=Owa#FtOcltmn)25q`FCtsZVl{;=}e+CPRGJ=uwB(VeLFMIaSB1Ag|fKk#4dl zQpa~Bl4Z+s1Jg;CwqzZImbeogv!ITQB5~J(N>?Wm6$iK3Vlgb8RKcWT=|2kj(=4I0 zLH=SncP!JRdLvU_G^}#XzE~|SAqvvppvE-}-D$m}@d7ke)ET!;Su(8E%X=w2vJ?RjDU1fT$`a-2x|&1<*-h@Kww-GJsiFRfLnyDG`Oh5!pM+#AGC8m_ zoH@zQ8E#v@M?MyvGoT|@(eM4~bN7ET(r;(fx!r#Uo9@YN$@d!KPT2eb$y-d)zMU|- z{va)i2T!LUc{T=gOL`18Rg_mrd!p*j$BaKk5*U3fU!*6}2#6^Oz0tPB4J!|x6WY=xHzQg&^g1iTjg)30MzLqZdzBvR&z z)pb6bZSGq23F!oOyH#{xsX9poc;c-4=btl;ma4fDPDeKFj1zYb@wjBNBirdt_w$GK z^CUZe26jY0Px7bFhG8YrkKup&75y6L__{=0qJo$6^Ih4i^k=~%*E75#l&2?6NR`)A z965zIs?nG#Hf&O=a$+Ly4SQ!u4RgY0dI=kMJooL;koZhVn70;IAz|KH*iMULfR?Wk zttx@A(0p0%K7D)lJuudJCl^O>xx^kBd@Bc4Olrs@hJi?x*Pec{j+SZPCQIOQ^Q9N!jNeVNB(*3E5bB0-3<+U{CNTkt*(+Ymh!mm99@mk2!`d(7Y!rYV;~dTdKg_pxN=EX_|O* z+P|KQzy8h37@BfZt3^gUa`*RQL#wJPv8y*hMaX|cd##`OT*r0Dz|s`d>4lEeah)NX zv+UU@v$`YMoaN7kwf5P_rd`jhy3P)^xwEOl3*GK=DiY>;Xm2}Gub-$Xuf-^aR8&5_ z{#5^~b1RsJxRzERle`^l1=F-{`5dHgupX7plR+>|#pb_F>KsX)`?GVAJWq5C-=MQO zylUFnlM;!l7;Mx;MZO$5*W*xiGt?0egwI13yd%ihI~-P5SyeH-1O3B!?fZxR0}tvq zK0H4OFE@mKBZy|?P|yQ$C_AGDpegz;naRj-4xe8o{5sg@ZV>rxJLjxQpw{`=IrZ7RNqvIFoBnO$fQRtJT)#@FCPjBOGTImaedAl-UhFZ6+UgW;7fc^lU0XT1@|>TyEBopK zR)2$h$3OTcpUEz2m9yD+tM;9$qhBZ& z0fl(8LhJ>mGGB+B+x1p5tmt$TxXzck^!3*xpLTt{Y%L&HAj&Kt~oR3;a19PL*{7a^mfD+I9i#d7FY`%^f(7 za)Vy~HzLV)^)D~qX(rw1d-cNzd3sos(n93gPTpP3+bMZp=*v<>dy%PVVqSK-Xp8*$ zoKCfJ6Y^ov*7uH>wfoOGYIBn)b)J4$j4aztKSO~HI_P| zc9;9J;CYcOvM^X0T{o?q-K2e$IBojf#DR@)z#Vbkir{uS#clANQopzQntYPbi)9mv zPC5{qZ6*=&l-e2HfsRd0Nw_oIx0znW9sG7e_uS@tkrW}mIW_w@Y+2Sst;n#QCTcSP zfBp<@>n2UK5$W6XcoPQ{2V!Yzo3A~ye#}2_x)yDdEw&X1ZD+B$w$9IA6IwwzdbXB~ zI9DP^gC^|k0^3TT`YDV|K58Z$mpN8{lJY7Zbm4ETVO@Z!cj1e6X;QIb;_zttc*pS{ z433o$8a(jSyN}Ei4T&`d%I^&2wUt|%*sMVFic(%ZyX{lI!)u=ojx`0ESDf-X3UsQF8@)M5ms&a&M|a&c*Es`*fW1DqvvY*VA6;JF7Tt)%ygl~GBh4lhAFFqSlHd^($gyZC64SkeXWtYbG(}Jwmf~`f*qCQZH$?ty) zy|5Y82asYK>H}!f6`!0pc;NlS>lp_(!U?a73CWkW-XX35ebtMOV4%%K3H@~_UApi- zaSdqns~*>Yg5p}$f;-Ct<(kVHv<8#{0yC?5%0+|0L$AEQB+UxMYUBNT2Ez~rV&R(A zOgvmMqY+Mc*bq}*#d5XQz< zef3%QzeTbRB&`DdXrncs4AE}pCK#J#rHvBpF$Yk)`3(Jyl{QYaw^zG0-E5_Ga-a=L z4r>4Li;7U>pv79otTi-A+`=FNBZ(hLhJfT-oBu#BV~v?6+S_WVwjUq~+bo`eb0w@u zc{PE7tl%l%__N2mBr8CC_ssd-$QCih$PkTYi(n#x>_1};r09{$yecUg5uONHFluo)W zFScEy)fqU+qc{RD;=jQzrc7vp+sJstS$#R=`W+~XloP(0lJ(KjcB#6y(A8=)tugg9IS zbDnK6px^Sz;CqROK-$=0>dCX<6c6DQyXp<%A<$Fc{O8{n5D$SckqHTAIRqN9-s2%q zP&^zmz^ZuH&B#`hIi`a#cg-d3^DXzgQ)4bezfj-=m4ma&YTmyP~ z4gF)u1Nzg5oYH_mL2<3%AAQaYiEAi@)_Q@YrInBd1QK4{O_B%X>BGXvi(k!xQ#^!M z#!j!2-1HW@;(TnPi7Z89LKHGFHm(Hb*DF*W<$mP?dq zr3b`pb(1ySIMF`#j$4z>R$3D`LzBciK0sN~o!S|Y z%+R2nwOV7QiPl?`DvW&9bSa!GK}E`|2@fO(Ph~96`i)}nEC*ZjrWhHDp;_}Lnkdom zw92WF$0lRWaiV#|c~H$Pn$mG{cp8*stnK^Al#nC?rSP<9i;){y!(_cG15e%&Bh%4&ZTf70mTt`(c!P1`XO8MK%#rt5(Q#2;uOpPz>0e3(vtJtx^Z$q zLDj+=y}wF@R0}ADW&r@nniO*uNUWjT*@}9{RZLdvOVpPE?d-g{ zM~^=<4}tK35PT(sc?eXv#^WJSP&^#@=RN-v5)V-dPm+^V`ZP}z;gDjAkgQ7ljd%#8 zS)$XXUk0am2rtb>&uV5l1X_U4N$=5v=lg)9w|txA5a_6#9#S?HP+&Y9eo{?HJVYsE zmFjYuSp}lu`E~zc9s^%Bu+vBnMBmxp*LvRkY1U zV~h;N(Ch(Is!^g5Nx^zalQEq*=X|%45F?F~Lpni8#;ATz)P^D%Eyl8CjZc%r73>H> zSH*P?dn#u#aeK_5NX$yrWX2>1dB@KtXYB?TlT{4uxxFR6@;e0%C(_4$C8uj63fq9s+4Ic-^~S0jGEf zuQrnmBr_*GlMEzQF8BFBFD&qQ2ow|#r@l}&H6$LQ6e3;NW0Q;k@nq(8uo_c@q)pyO zJoG5p_Wb&UE8v8O^`*+o*#8Hb8=_bf>%&{&?*!~9;OHD-orwLagLOSCOr%;hv$ z(~T4Dqo27o*=(hCa-a>Wo~u5aH7%riMk%DfybyaxtR>D`LzBciv4j6dx(Y~a35-u# ztufO?t6AO$Ew}>Cm7pT!)r1F&o{-$5RKO7n`oj$BQtxL z9c?n^94DH{p^vCJ08=_n4o`!Uj6=HLc1}o=fl_!HpvB0Itnq1*cqFUwJW>S`UCBF$ zfV8TVT2508>E{-Z1u*T?E8rxom{1)r39T_BS9S`pmI0ET&pdMiBz7%x4QSF{k1E>}C@8M2$qYL`B(9+pUi(iHXJiirw`m~n z+p=j2lkwe^BzYxoHo*xG8~P|O`K@ zL2-WH2WMOm3g?qlUeS0w!vZArz%wjBGJiLRc>UU*SHiixjw!E&&EPGlc)P_I<}DB} z=Z|CF0?D2h<}J|84|}`?3W~R@-nr?*ka&wy$a(|w7D%{x2k8PJO^(a!u7nfb)|V=; zfw$NjZ3*2l0%`!%BEdYH2qYsC=#@rmJ{gLs*}axrG0sD%^amInH(Aq-6RlJHm}}Ko zX`LKsgOYXuLJo!btCJXTwPz z#e~Ezd!FhVNP1k@dQn2&j)XX&|1Edx#>oK%RST~kc;F==)dEW4%|0iogtE%}IdK+9 z#(UTmm?os@>0ACd8&2^MUg0nE5NO@aG&EdKJOsLtHW00a6&xot?K_W$Ktb`a>g6+M zgv3LXLbKU`q^JKc@eoL?sN0B#K-y^Gn&q?M6c6D&RwfKd4uNF85IQGHh`#D@%4IJQ z4}lU#J+ACtprCko;gETM35ka&g*PLTq!P-EGxHEg^e<+r(-bD-iYBtfuK#v6oba%| zRCyWu|3IrFRCZYMY8Q~m^N-N#)|eTJsaXKFT%trPRyxKgP1bbdL|Zl2t;uF9t&;<7 zQ1$#qx2Nkvs%MnK(>E>F5@)TUN#dR8eQ22!p)Y95!k!P(%omWq_S+C72%*~Ehil8` zz%c<%;VExhgaSwoo@)9HNM@z6KG0~4k)arxJzz>TN;G^JaC@>9jp@XRX41cvgcxa@ z9B6`)jM*c${%c5*fl_!{w8dD`tnq1*cr=nHXjl?}q}O_g>;WLHDy5bSBOhKn2To8! zALZSU(1IZoh$VId+lWB2uaReWfMj%mu|}LI?;NyR>1&{%YHLuh!81duEtJA*$4M%o z*bThe10=h;?j{ZW{lDhGxx9`kubsD`l0K9*HP8jT-2t;8QA*F7ABq!t>LQP~Ktb^~ zR)1P!NW4WUyq1up5{jI`5=apeP1H(#A&_QIY(L;CIG5ACl-I&(6$EJpHE&lM!J}g! zk!G9@iBg#K#=Le3^zL&W$AN<4_?pYE$b`gkltPncAhEsJ`T&x-;8i5er(bjxobb4q zP-7MEnIW4ENbC#d8jv@e7N@WQyFQ_G08mg|JLKYrXNANyltPnJAhA)gLpw#~l|Ght zc>!rQ+aI303QqA5UP*-|4@j&hZtFnO)4oA^6zI2;JstuD#lw#`|Kie+c!*MHv*bX3 zI+XSXa$5)TMz(1xy*7ru<=4${iihyZ$?c~}4uNDJ7xzU#GMDihkH3E1JnbHjhX@Ob zhi`oRo6AGuAxfdOULetAyjlbFARQh0oL9|(v^CGWCpW_>9>Oc*)aQtYK+>b}x&zQ~ zZs^QIp!zMJRBah3C?4)|-^o{m!owt$S9StoG?XGFJ5;�%;@vhwpBN6Ry>lDlcRI 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 E1y;JcN&o-= literal 0 HcmV?d00001 diff --git a/networktables.json b/networktables.json index fe51488c..6cc7f9ce 100644 --- a/networktables.json +++ b/networktables.json @@ -1 +1,130 @@ -[] +[ + { + "name": "/Preferences/Drive/Module0/Drive Pid Property.mm.kp", + "type": "double", + "value": 0.05, + "properties": { + "persistent": true + } + }, + { + "name": "/Preferences/Drive/Module0/Turn Pid Property.mm.kp", + "type": "double", + "value": 7.0, + "properties": { + "persistent": true + } + }, + { + "name": "/Preferences/Drive/Module0/Turn Pid Property.mm.ki", + "type": "double", + "value": 0.0, + "properties": { + "persistent": true + } + }, + { + "name": "/Preferences/Drive/Module0/Turn Pid Property.mm.kd", + "type": "double", + "value": 0.0, + "properties": { + "persistent": true + } + }, + { + "name": "/Preferences/Drive/Module1/Drive Pid Property.mm.kp", + "type": "double", + "value": 0.05, + "properties": { + "persistent": true + } + }, + { + "name": "/Preferences/Drive/Module1/Turn Pid Property.mm.kp", + "type": "double", + "value": 7.0, + "properties": { + "persistent": true + } + }, + { + "name": "/Preferences/Drive/Module1/Turn Pid Property.mm.ki", + "type": "double", + "value": 0.0, + "properties": { + "persistent": true + } + }, + { + "name": "/Preferences/Drive/Module1/Turn Pid Property.mm.kd", + "type": "double", + "value": 0.0, + "properties": { + "persistent": true + } + }, + { + "name": "/Preferences/Drive/Module2/Drive Pid Property.mm.kp", + "type": "double", + "value": 0.05, + "properties": { + "persistent": true + } + }, + { + "name": "/Preferences/Drive/Module2/Turn Pid Property.mm.kp", + "type": "double", + "value": 7.0, + "properties": { + "persistent": true + } + }, + { + "name": "/Preferences/Drive/Module2/Turn Pid Property.mm.ki", + "type": "double", + "value": 0.0, + "properties": { + "persistent": true + } + }, + { + "name": "/Preferences/Drive/Module2/Turn Pid Property.mm.kd", + "type": "double", + "value": 0.0, + "properties": { + "persistent": true + } + }, + { + "name": "/Preferences/Drive/Module3/Drive Pid Property.mm.kp", + "type": "double", + "value": 0.05, + "properties": { + "persistent": true + } + }, + { + "name": "/Preferences/Drive/Module3/Turn Pid Property.mm.kp", + "type": "double", + "value": 7.0, + "properties": { + "persistent": true + } + }, + { + "name": "/Preferences/Drive/Module3/Turn Pid Property.mm.ki", + "type": "double", + "value": 0.0, + "properties": { + "persistent": true + } + }, + { + "name": "/Preferences/Drive/Module3/Turn Pid Property.mm.kd", + "type": "double", + "value": 0.0, + "properties": { + "persistent": true + } + } +] diff --git a/networktables.json.bck b/networktables.json.bck new file mode 100644 index 00000000..4dc34172 --- /dev/null +++ b/networktables.json.bck @@ -0,0 +1,98 @@ +[ + { + "name": "/Preferences/Drive/Module0/Drive Pid Property.mm.kp", + "type": "double", + "value": 0.05, + "properties": { + "persistent": true + } + }, + { + "name": "/Preferences/Drive/Module0/Turn Pid Property.mm.kp", + "type": "double", + "value": 7.0, + "properties": { + "persistent": true + } + }, + { + "name": "/Preferences/Drive/Module0/Turn Pid Property.mm.ki", + "type": "double", + "value": 0.0, + "properties": { + "persistent": true + } + }, + { + "name": "/Preferences/Drive/Module0/Turn Pid Property.mm.kd", + "type": "double", + "value": 0.0, + "properties": { + "persistent": true + } + }, + { + "name": "/Preferences/Drive/Module1/Drive Pid Property.mm.kp", + "type": "double", + "value": 0.05, + "properties": { + "persistent": true + } + }, + { + "name": "/Preferences/Drive/Module1/Turn Pid Property.mm.kp", + "type": "double", + "value": 7.0, + "properties": { + "persistent": true + } + }, + { + "name": "/Preferences/Drive/Module1/Turn Pid Property.mm.ki", + "type": "double", + "value": 0.0, + "properties": { + "persistent": true + } + }, + { + "name": "/Preferences/Drive/Module1/Turn Pid Property.mm.kd", + "type": "double", + "value": 0.0, + "properties": { + "persistent": true + } + }, + { + "name": "/Preferences/Drive/Module2/Drive Pid Property.mm.kp", + "type": "double", + "value": 0.05, + "properties": { + "persistent": true + } + }, + { + "name": "/Preferences/Drive/Module2/Turn Pid Property.mm.kp", + "type": "double", + "value": 7.0, + "properties": { + "persistent": true + } + }, + { + "name": "/Preferences/Drive/Module2/Turn Pid Property.mm.ki", + "type": "double", + "value": 0.0, + "properties": { + "persistent": true + } + }, + { + "name": "/Preferences/Drive/Module2/Turn Pid Property.mm.kd", + "type": "double", + "value": 0.0, + "properties": { + "persistent": true + } + } +] diff --git a/src/main/java/frc/robot/Constants.java b/src/main/java/frc/robot/Constants.java index 7d81ef09..d1b2241a 100644 --- a/src/main/java/frc/robot/Constants.java +++ b/src/main/java/frc/robot/Constants.java @@ -24,7 +24,7 @@ * constants are needed, to reduce verbosity. */ public final class Constants { - public static final Mode currentMode = Mode.REAL; + public static final Mode currentMode = Mode.SIM; public static enum Mode { /** Running on a real robot. */ diff --git a/src/main/java/frc/robot/RobotContainer.java b/src/main/java/frc/robot/RobotContainer.java index 617eac14..454bd61f 100644 --- a/src/main/java/frc/robot/RobotContainer.java +++ b/src/main/java/frc/robot/RobotContainer.java @@ -74,10 +74,10 @@ public RobotContainer() { new DriveSubsystem( new GyroIO() { }, - new ModuleIOSim(), - new ModuleIOSim(), - new ModuleIOSim(), - new ModuleIOSim()); + new ModuleIOSim(Constants.DriveConstants.FL_MOD_CONSTANTS), + new ModuleIOSim(Constants.DriveConstants.FR_MOD_CONSTANTS), + new ModuleIOSim(Constants.DriveConstants.BL_MOD_CONSTANTS), + new ModuleIOSim(Constants.DriveConstants.BR_MOD_CONSTANTS)); m_shooter = new ShooterSubsystem(new ShooterIOPrototype()); } default -> { diff --git a/src/main/java/frc/robot/subsystems/drive/module/ModuleConstants.java b/src/main/java/frc/robot/subsystems/drive/module/ModuleConstants.java index 5d37d05e..a6457145 100644 --- a/src/main/java/frc/robot/subsystems/drive/module/ModuleConstants.java +++ b/src/main/java/frc/robot/subsystems/drive/module/ModuleConstants.java @@ -5,7 +5,10 @@ public class ModuleConstants { + public static final double DEFAULT_WHEEL_RADIUS_METERS = Units.inchesToMeters(2.0); + public enum GearRatios { + TURN(150.0 / 7.0), L1((14.0 / 50.0) * (25.0 / 19.0) * (15.0 / 45.0)), L2((14.0 / 50.0) * (27.0 / 17.0) * (15.0 / 45.0)), L3((14.0 / 50.0) * (28.0 / 16.0) * (15.0 / 45.0)) @@ -60,8 +63,7 @@ public ModuleConstants(int id, boolean inverted, GearRatios driveRatio) { - double defaultTurnRatio = (150.0 / 7.0); - double defaultWheelRadiusMeters = Units.inchesToMeters(2.0); + double defaultTurnRatio = GearRatios.TURN.ratio; MODULE_INDEX = id; @@ -90,7 +92,7 @@ public ModuleConstants(int id, DRIVE_GEAR_RATIO = driveRatio.ratio; TURNING_GEAR_RATIO = defaultTurnRatio; - WHEEL_RADIUS_METERS = defaultWheelRadiusMeters; + WHEEL_RADIUS_METERS = DEFAULT_WHEEL_RADIUS_METERS; WHEEL_CURCUMFERENCE_METERS = WHEEL_RADIUS_METERS * Math.PI * 2; } diff --git a/src/main/java/frc/robot/subsystems/drive/module/ModuleIOSim.java b/src/main/java/frc/robot/subsystems/drive/module/ModuleIOSim.java index 5b9d49bc..5fb2d65d 100644 --- a/src/main/java/frc/robot/subsystems/drive/module/ModuleIOSim.java +++ b/src/main/java/frc/robot/subsystems/drive/module/ModuleIOSim.java @@ -28,29 +28,36 @@ public class ModuleIOSim implements ModuleIO { private static final double LOOP_PERIOD_SECS = 0.02; - private DCMotorSim driveSim = new DCMotorSim(DCMotor.getNEO(1), 6.75, 0.025); - private DCMotorSim turnSim = new DCMotorSim(DCMotor.getNEO(1), 150.0 / 7.0, 0.004); + private final DCMotorSim m_driveSim = new DCMotorSim(DCMotor.getNEO(1), 6.75, 0.025); + private final DCMotorSim m_turnSim = new DCMotorSim(DCMotor.getNEO(1), 150.0 / 7.0, 0.004); + + private final ModuleConstants m_moduleConstants; // use this mainly for module id + private final Rotation2d turnAbsoluteInitPosition = new Rotation2d(Math.random() * 2.0 * Math.PI); private double driveAppliedVolts = 0.0; private double turnAppliedVolts = 0.0; + public ModuleIOSim(ModuleConstants moduleConstants) { + m_moduleConstants = moduleConstants; + } + @Override public void updateInputs(ModuleIOInputs inputs) { - driveSim.update(LOOP_PERIOD_SECS); - turnSim.update(LOOP_PERIOD_SECS); + m_driveSim.update(LOOP_PERIOD_SECS); + m_turnSim.update(LOOP_PERIOD_SECS); - inputs.drivePositionRad = driveSim.getAngularPositionRad(); - inputs.driveVelocityRadPerSec = driveSim.getAngularVelocityRadPerSec(); + inputs.drivePositionRad = m_driveSim.getAngularPositionRad(); + inputs.driveVelocityRadPerSec = m_driveSim.getAngularVelocityRadPerSec(); inputs.driveAppliedVolts = driveAppliedVolts; - inputs.driveCurrentAmps = new double[] {Math.abs(driveSim.getCurrentDrawAmps())}; + inputs.driveCurrentAmps = new double[] {Math.abs(m_driveSim.getCurrentDrawAmps())}; inputs.turnAbsolutePosition = - new Rotation2d(turnSim.getAngularPositionRad()).plus(turnAbsoluteInitPosition); - inputs.turnPosition = new Rotation2d(turnSim.getAngularPositionRad()); - inputs.turnVelocityRadPerSec = turnSim.getAngularVelocityRadPerSec(); + new Rotation2d(m_turnSim.getAngularPositionRad()).plus(turnAbsoluteInitPosition); + inputs.turnPosition = new Rotation2d(m_turnSim.getAngularPositionRad()); + inputs.turnVelocityRadPerSec = m_turnSim.getAngularVelocityRadPerSec(); inputs.turnAppliedVolts = turnAppliedVolts; - inputs.turnCurrentAmps = new double[] {Math.abs(turnSim.getCurrentDrawAmps())}; + inputs.turnCurrentAmps = new double[] {Math.abs(m_turnSim.getCurrentDrawAmps())}; inputs.odometryDrivePositionsRad = new double[] {inputs.drivePositionRad}; inputs.odometryTurnPositions = new Rotation2d[] {inputs.turnPosition}; @@ -59,12 +66,17 @@ public void updateInputs(ModuleIOInputs inputs) { @Override public void setDriveVoltage(double volts) { driveAppliedVolts = MathUtil.clamp(volts, -12.0, 12.0); - driveSim.setInputVoltage(driveAppliedVolts); + m_driveSim.setInputVoltage(driveAppliedVolts); } @Override public void setTurnVoltage(double volts) { turnAppliedVolts = MathUtil.clamp(volts, -12.0, 12.0); - turnSim.setInputVoltage(turnAppliedVolts); + m_turnSim.setInputVoltage(turnAppliedVolts); + } + + @Override + public ModuleConstants getModuleConstants() { + return m_moduleConstants; } } diff --git a/vendordeps/SnobotSim.json b/vendordeps/SnobotSim.json new file mode 100644 index 00000000..42051560 --- /dev/null +++ b/vendordeps/SnobotSim.json @@ -0,0 +1,43 @@ +{ + "fileName": "SnobotSim.json", + "name": "SnobotSim", + "version": "2024.01.09-03", + "uuid": "f34e80c0-aea1-11ee-a96e-5761b95fc5a8", + "frcYear": "2024", + "mavenUrls": ["https://raw.githubusercontent.com/snobotsim/maven_repo/master/release"], + "jsonUrl": "http://raw.githubusercontent.com/snobotsim/maven_repo/master/release/SnobotSim.json", + "javaDependencies": [ + { + "groupId": "org.snobotv2", + "artifactId": "snobot_sim_java_base", + "version": "2024.01.09-03" + }, + { + "groupId": "org.snobotv2", + "artifactId": "snobot_sim_java_navx", + "version": "2024.01.09-03" + }, + { + "groupId": "org.snobotv2", + "artifactId": "snobot_sim_java_phoenix5", + "version": "2024.01.09-03" + }, + { + "groupId": "org.snobotv2", + "artifactId": "snobot_sim_java_phoenix6", + "version": "2024.01.09-03" + }, + { + "groupId": "org.snobotv2", + "artifactId": "snobot_sim_java_revlib", + "version": "2024.01.09-03" + }, + { + "groupId": "org.snobotv2", + "artifactId": "snobot_swerve_sim", + "version": "2024.01.09-03" + } + ], + "jniDependencies": [], + "cppDependencies": [] +} \ No newline at end of file From 96d2c5bf17e39ce7dd49158705e692abc13f1623 Mon Sep 17 00:00:00 2001 From: GearBoxFox <98189655+GearBoxFox@users.noreply.github.com> Date: Sat, 20 Jan 2024 11:32:58 -0800 Subject: [PATCH 3/4] Fixed some sonarlint stuff while I'm working --- src/main/java/frc/robot/RobotContainer.java | 83 +++++++++---------- .../robot/subsystems/shooter/ShooterIO.java | 3 +- 2 files changed, 38 insertions(+), 48 deletions(-) diff --git a/src/main/java/frc/robot/RobotContainer.java b/src/main/java/frc/robot/RobotContainer.java index 454bd61f..11eb7266 100644 --- a/src/main/java/frc/robot/RobotContainer.java +++ b/src/main/java/frc/robot/RobotContainer.java @@ -20,7 +20,6 @@ import edu.wpi.first.wpilibj.XboxController; import edu.wpi.first.wpilibj2.command.Command; import edu.wpi.first.wpilibj2.command.Commands; -import edu.wpi.first.wpilibj2.command.InstantCommand; import edu.wpi.first.wpilibj2.command.button.CommandXboxController; import frc.robot.commands.DriveCommands; import frc.robot.commands.FeedForwardCharacterization; @@ -34,7 +33,6 @@ import frc.robot.subsystems.shooter.ShooterIOPrototype; import frc.robot.subsystems.shooter.ShooterSubsystem; import org.littletonrobotics.junction.networktables.LoggedDashboardChooser; -import org.littletonrobotics.junction.networktables.LoggedDashboardNumber; /** * This class is where the bulk of the robot should be declared. Since Command-based is a @@ -52,52 +50,43 @@ public class RobotContainer { // Dashboard inputs private final LoggedDashboardChooser autoChooser; - private final LoggedDashboardNumber flywheelSpeedInput = - new LoggedDashboardNumber("Flywheel Speed", 1500.0); /** The container for the robot. Contains subsystems, OI devices, and commands. */ public RobotContainer() { - switch (Constants.currentMode) { - case REAL -> { - // Real robot, instantiate hardware IO implementations - m_driveSubsystem = new DriveSubsystem( - new GyroIOPigeon1(12, true), - new ModuleIOTalonFX(Constants.DriveConstants.FL_MOD_CONSTANTS), - new ModuleIOTalonFX(Constants.DriveConstants.FR_MOD_CONSTANTS), - new ModuleIOTalonFX(Constants.DriveConstants.BL_MOD_CONSTANTS), - new ModuleIOTalonFX(Constants.DriveConstants.BR_MOD_CONSTANTS)); - m_shooter = new ShooterSubsystem(new ShooterIOPrototype()); - } - case SIM -> { - // Sim robot, instantiate physics sim IO implementations - m_driveSubsystem = - new DriveSubsystem( - new GyroIO() { - }, - new ModuleIOSim(Constants.DriveConstants.FL_MOD_CONSTANTS), - new ModuleIOSim(Constants.DriveConstants.FR_MOD_CONSTANTS), - new ModuleIOSim(Constants.DriveConstants.BL_MOD_CONSTANTS), - new ModuleIOSim(Constants.DriveConstants.BR_MOD_CONSTANTS)); - m_shooter = new ShooterSubsystem(new ShooterIOPrototype()); - } - default -> { - // Replayed robot, disable IO implementations - m_driveSubsystem = - new DriveSubsystem( - new GyroIO() { - }, - new ModuleIO() { - }, - new ModuleIO() { - }, - new ModuleIO() { - }, - new ModuleIO() { - }); - m_shooter = new ShooterSubsystem(new ShooterIO() { - }); - } + switch (Constants.currentMode) { + case REAL -> { + // Real robot, instantiate hardware IO implementations + m_driveSubsystem = new DriveSubsystem( + new GyroIOPigeon1(12, true), + new ModuleIOTalonFX(Constants.DriveConstants.FL_MOD_CONSTANTS), + new ModuleIOTalonFX(Constants.DriveConstants.FR_MOD_CONSTANTS), + new ModuleIOTalonFX(Constants.DriveConstants.BL_MOD_CONSTANTS), + new ModuleIOTalonFX(Constants.DriveConstants.BR_MOD_CONSTANTS)); + m_shooter = new ShooterSubsystem(new ShooterIOPrototype()); } + case SIM -> { + // Sim robot, instantiate physics sim IO implementations + m_driveSubsystem = + new DriveSubsystem( + new GyroIO() {}, + new ModuleIOSim(Constants.DriveConstants.FL_MOD_CONSTANTS), + new ModuleIOSim(Constants.DriveConstants.FR_MOD_CONSTANTS), + new ModuleIOSim(Constants.DriveConstants.BL_MOD_CONSTANTS), + new ModuleIOSim(Constants.DriveConstants.BR_MOD_CONSTANTS)); + m_shooter = new ShooterSubsystem(new ShooterIOPrototype()); + } + default -> { + // Replayed robot, disable IO implementations + m_driveSubsystem = + new DriveSubsystem( + new GyroIO() {}, + new ModuleIO() {}, + new ModuleIO() {}, + new ModuleIO() {}, + new ModuleIO() {}); + m_shooter = new ShooterSubsystem(new ShooterIO() {}); + } + } // Set up auto routines autoChooser = new LoggedDashboardChooser<>("Auto Choices", AutoBuilder.buildAutoChooser()); @@ -106,7 +95,9 @@ public RobotContainer() { autoChooser.addOption( "Drive FF Characterization", new FeedForwardCharacterization( - m_driveSubsystem, m_driveSubsystem::runCharacterizationVolts, m_driveSubsystem::getCharacterizationVelocity)); + m_driveSubsystem, + m_driveSubsystem::runCharacterizationVolts, + m_driveSubsystem::getCharacterizationVelocity)); // Configure the button bindings configureButtonBindings(); @@ -146,6 +137,6 @@ private void configureButtonBindings() { * @return the command to run in autonomous */ public Command getAutonomousCommand() { - return new InstantCommand();//autoChooser.get(); + return autoChooser.get(); } } diff --git a/src/main/java/frc/robot/subsystems/shooter/ShooterIO.java b/src/main/java/frc/robot/subsystems/shooter/ShooterIO.java index 4e4ca1d4..366c94a5 100644 --- a/src/main/java/frc/robot/subsystems/shooter/ShooterIO.java +++ b/src/main/java/frc/robot/subsystems/shooter/ShooterIO.java @@ -5,8 +5,7 @@ public interface ShooterIO { @AutoLog - public class ShooterIOInputs { - + class ShooterIOInputs { } default void setMotorVoltageTL(double voltage) {} default void setMotorVoltageTR(double voltage) {} From 93c8e9a734a9a0b26e01392e8f1bb003a82db8bb Mon Sep 17 00:00:00 2001 From: GearBoxFox <98189655+GearBoxFox@users.noreply.github.com> Date: Sat, 20 Jan 2024 12:56:06 -0800 Subject: [PATCH 4/4] restructured ModuleConstants as record data class --- .../robot/subsystems/drive/module/Module.java | 2 +- .../drive/module/ModuleConstants.java | 168 +++++------------- .../drive/module/ModuleIOTalonFX.java | 57 +++--- 3 files changed, 69 insertions(+), 158 deletions(-) diff --git a/src/main/java/frc/robot/subsystems/drive/module/Module.java b/src/main/java/frc/robot/subsystems/drive/module/Module.java index 3f4a466a..ca759931 100644 --- a/src/main/java/frc/robot/subsystems/drive/module/Module.java +++ b/src/main/java/frc/robot/subsystems/drive/module/Module.java @@ -45,7 +45,7 @@ public class Module { public Module(ModuleIO io) { this.m_io = io; this.m_moduleConstants = m_io.getModuleConstants(); - this.m_index = m_moduleConstants.MODULE_INDEX; + this.m_index = m_moduleConstants.MODULE_INDEX(); // delay to initialize all hardware Timer.delay(0.5); diff --git a/src/main/java/frc/robot/subsystems/drive/module/ModuleConstants.java b/src/main/java/frc/robot/subsystems/drive/module/ModuleConstants.java index a6457145..9d766357 100644 --- a/src/main/java/frc/robot/subsystems/drive/module/ModuleConstants.java +++ b/src/main/java/frc/robot/subsystems/drive/module/ModuleConstants.java @@ -3,137 +3,57 @@ import edu.wpi.first.math.geometry.Rotation2d; import edu.wpi.first.math.util.Units; -public class ModuleConstants { - - public static final double DEFAULT_WHEEL_RADIUS_METERS = Units.inchesToMeters(2.0); - - public enum GearRatios { - TURN(150.0 / 7.0), - L1((14.0 / 50.0) * (25.0 / 19.0) * (15.0 / 45.0)), - L2((14.0 / 50.0) * (27.0 / 17.0) * (15.0 / 45.0)), - L3((14.0 / 50.0) * (28.0 / 16.0) * (15.0 / 45.0)) - ; - - GearRatios(double ratio) { - this.ratio = ratio; - } - - public final double ratio; - } +public record ModuleConstants( // Physical constants - public final double DRIVE_GEAR_RATIO; - public final double TURNING_GEAR_RATIO; - - public final double WHEEL_RADIUS_METERS; - public final double WHEEL_CURCUMFERENCE_METERS; - - public final boolean TURN_MOTOR_INVERTED; - public final boolean DRIVE_MOTOR_INVERTED; - public final boolean ENCODER_INVERTED; - - public final Rotation2d ENCODER_OFFSET; - - public final int MODULE_INDEX; - + double DRIVE_GEAR_RATIO, double TURNING_GEAR_RATIO, + double WHEEL_RADIUS_METERS, double WHEEL_CURCUMFERENCE_METERS, + boolean TURN_MOTOR_INVERTED, boolean DRIVE_MOTOR_INVERTED, boolean ENCODER_INVERTED, + Rotation2d ENCODER_OFFSET, + int MODULE_INDEX, // can ID's - public final int DRIVE_MOTOR_ID; - public final int TURN_MOTOR_ID; - public final int ENCODER_ID; - + int DRIVE_MOTOR_ID, int TURN_MOTOR_ID, int ENCODER_ID, // Drive loop gains - public final double DRIVE_KV; - public final double DRIVE_KS; - public final double DRIVE_KA; - - public final double DRIVE_KP; - public final double DRIVE_KI; - public final double DRIVE_KD; - + double DRIVE_KV, double DRIVE_KS, double DRIVE_KA, + double DRIVE_KP, double DRIVE_KI, double DRIVE_KD, // Turning loop gains - public final double TURN_KP; - public final double TURN_KI; - public final double TURN_KD; - - public ModuleConstants(int id, - int[] ids, - double[] driveFF, - double[] driveFB, - double[] turnFB, - double offsetDegs, - boolean inverted, - GearRatios driveRatio) { - - double defaultTurnRatio = GearRatios.TURN.ratio; - - MODULE_INDEX = id; + double TURN_KP, double TURN_KI, double TURN_KD) { + public static final double DEFAULT_WHEEL_RADIUS_METERS = Units.inchesToMeters(2.0); - DRIVE_MOTOR_ID = ids[0]; - TURN_MOTOR_ID = ids[1]; - ENCODER_ID = ids[2]; + public enum GearRatios { + TURN(150.0 / 7.0), + L1((14.0 / 50.0) * (25.0 / 19.0) * (15.0 / 45.0)), + L2((14.0 / 50.0) * (27.0 / 17.0) * (15.0 / 45.0)), + L3((14.0 / 50.0) * (28.0 / 16.0) * (15.0 / 45.0)); - DRIVE_KV = driveFF[0]; - DRIVE_KS = driveFF[1]; - DRIVE_KA = driveFF[2]; - - DRIVE_KP = driveFB[0]; - DRIVE_KI = driveFB[1]; - DRIVE_KD = driveFB[2]; - - TURN_KP = turnFB[0]; - TURN_KI = turnFB[1]; - TURN_KD = turnFB[2]; - - DRIVE_MOTOR_INVERTED = !inverted; - TURN_MOTOR_INVERTED = inverted; - ENCODER_INVERTED = false; - - ENCODER_OFFSET = Rotation2d.fromDegrees(offsetDegs); - - DRIVE_GEAR_RATIO = driveRatio.ratio; - TURNING_GEAR_RATIO = defaultTurnRatio; - - WHEEL_RADIUS_METERS = DEFAULT_WHEEL_RADIUS_METERS; - WHEEL_CURCUMFERENCE_METERS = WHEEL_RADIUS_METERS * Math.PI * 2; + GearRatios(double ratio) { + this.ratio = ratio; } - public ModuleConstants (int id, - int[] ids, - double[] driveFF, - double[] driveFB, - double[] turnFB, - boolean[] inversions, - double offsetDegs, - GearRatios driveRatio, - double turningRatio, - double wheelRadiusMeter) { - MODULE_INDEX = id; - - DRIVE_MOTOR_ID = ids[0]; - TURN_MOTOR_ID = ids[1]; - ENCODER_ID = ids[2]; - - DRIVE_KV = driveFF[0]; - DRIVE_KS = driveFF[1]; - DRIVE_KA = driveFF[2]; - - DRIVE_KP = driveFB[0]; - DRIVE_KI = driveFB[1]; - DRIVE_KD = driveFB[2]; - - TURN_KP = turnFB[0]; - TURN_KI = turnFB[1]; - TURN_KD = turnFB[2]; - - DRIVE_MOTOR_INVERTED = inversions[0]; - TURN_MOTOR_INVERTED = inversions[1]; - ENCODER_INVERTED = false; - - ENCODER_OFFSET = Rotation2d.fromDegrees(offsetDegs); - - DRIVE_GEAR_RATIO = driveRatio.ratio; - TURNING_GEAR_RATIO = turningRatio; - - WHEEL_RADIUS_METERS = wheelRadiusMeter; - WHEEL_CURCUMFERENCE_METERS = WHEEL_RADIUS_METERS * Math.PI * 2; + public final double ratio; } + + public ModuleConstants(int id, + int[] ids, + double[] driveFF, + double[] driveFB, + double[] turnFB, + double offsetDegs, + boolean inverted, + GearRatios driveRatio) { + + this ( + driveRatio.ratio, GearRatios.TURN.ratio, + DEFAULT_WHEEL_RADIUS_METERS, + DEFAULT_WHEEL_RADIUS_METERS * 2 * Math.PI, + inverted, + !inverted, + !inverted, + Rotation2d.fromDegrees(offsetDegs), + id, + ids[0], ids[1], ids[2], + driveFF[0], driveFF[1], driveFF[2], + driveFB[0], driveFB[1], driveFB[2], + turnFB[0], turnFB[1], turnFB[2] + ); + } } diff --git a/src/main/java/frc/robot/subsystems/drive/module/ModuleIOTalonFX.java b/src/main/java/frc/robot/subsystems/drive/module/ModuleIOTalonFX.java index fe14dd60..ed183e4e 100644 --- a/src/main/java/frc/robot/subsystems/drive/module/ModuleIOTalonFX.java +++ b/src/main/java/frc/robot/subsystems/drive/module/ModuleIOTalonFX.java @@ -46,7 +46,6 @@ public class ModuleIOTalonFX implements ModuleIO { private final TalonFX m_driveTalon; private final TalonFX m_turnTalon; - private final CANcoder m_cancoder; private final PidProperty m_drivePid; private final PidProperty m_turnPid; @@ -66,68 +65,60 @@ public class ModuleIOTalonFX implements ModuleIO { private final StatusSignal m_turnAppliedVolts; private final StatusSignal m_turnCurrent; - // Gear ratios for SDS MK4i L2, adjust as necessary - private final double DRIVE_GEAR_RATIO = (50.0 / 14.0) * (17.0 / 27.0) * (45.0 / 15.0); - private final double TURN_GEAR_RATIO = 150.0 / 7.0; - - private final Rotation2d absoluteEncoderOffset; - public ModuleIOTalonFX(ModuleConstants moduleConstants) { - m_driveTalon = new TalonFX(moduleConstants.DRIVE_MOTOR_ID); - m_turnTalon = new TalonFX(moduleConstants.TURN_MOTOR_ID); - m_cancoder = new CANcoder(moduleConstants.ENCODER_ID); + m_driveTalon = new TalonFX(moduleConstants.DRIVE_MOTOR_ID()); + m_turnTalon = new TalonFX(moduleConstants.TURN_MOTOR_ID()); + CANcoder cancoder = new CANcoder(moduleConstants.ENCODER_ID()); m_moduleConstants = moduleConstants; - absoluteEncoderOffset = moduleConstants.ENCODER_OFFSET; - // run configs on drive motor var driveConfig = new TalonFXConfiguration(); driveConfig.CurrentLimits.StatorCurrentLimit = 40.0; driveConfig.CurrentLimits.StatorCurrentLimitEnable = true; driveConfig.MotorOutput.Inverted = - moduleConstants.DRIVE_MOTOR_INVERTED ? InvertedValue.Clockwise_Positive + moduleConstants.DRIVE_MOTOR_INVERTED() ? InvertedValue.Clockwise_Positive : InvertedValue.CounterClockwise_Positive; m_driveTalon.getConfigurator().apply(driveConfig); setDriveBrakeMode(true); // setup pid gains for drive motor m_drivePid = new Phoenix6TalonPidPropertyBuilder( - "Drive/Module" + m_moduleConstants.MODULE_INDEX + "/Drive Pid Property", + "Drive/Module" + m_moduleConstants.MODULE_INDEX() + "/Drive Pid Property", false, m_driveTalon, 0 - ).addP(m_moduleConstants.DRIVE_KP).build(); + ).addP(m_moduleConstants.DRIVE_KP()).build(); // run configs on turning motor var turnConfig = new TalonFXConfiguration(); turnConfig.CurrentLimits.StatorCurrentLimit = 30.0; turnConfig.CurrentLimits.StatorCurrentLimitEnable = true; turnConfig.MotorOutput.Inverted = - moduleConstants.TURN_MOTOR_INVERTED ? InvertedValue.Clockwise_Positive + moduleConstants.TURN_MOTOR_INVERTED() ? InvertedValue.Clockwise_Positive : InvertedValue.CounterClockwise_Positive; m_turnTalon.getConfigurator().apply(turnConfig); setTurnBrakeMode(true); m_turnPid = new Phoenix6TalonPidPropertyBuilder( - "Drive/Module" + m_moduleConstants.MODULE_INDEX + "/Turn Pid Property", + "Drive/Module" + m_moduleConstants.MODULE_INDEX() + "/Turn Pid Property", false, m_turnTalon, 0) - .addP(m_moduleConstants.TURN_KP) - .addI(m_moduleConstants.TURN_KI) - .addD(m_moduleConstants.TURN_KD) + .addP(m_moduleConstants.TURN_KP()) + .addI(m_moduleConstants.TURN_KI()) + .addD(m_moduleConstants.TURN_KD()) .build(); // run factory default on cancoder var encoderConfig = new CANcoderConfiguration(); encoderConfig.MagnetSensor.SensorDirection = - moduleConstants.ENCODER_INVERTED ? SensorDirectionValue.Clockwise_Positive + moduleConstants.ENCODER_INVERTED() ? SensorDirectionValue.Clockwise_Positive : SensorDirectionValue.CounterClockwise_Positive; encoderConfig.MagnetSensor.AbsoluteSensorRange = AbsoluteSensorRangeValue.Signed_PlusMinusHalf; - m_cancoder.getConfigurator().apply(encoderConfig); + cancoder.getConfigurator().apply(encoderConfig); - // Fancy multi-threaded odometry update stuff + // Fancy multithreaded odometry update stuff // setup drive values m_driveTalon.setPosition(0.0); m_drivePosition = m_driveTalon.getPosition(); @@ -139,7 +130,7 @@ public ModuleIOTalonFX(ModuleConstants moduleConstants) { // setup turn values m_turnTalon.setPosition(0.0); - m_turnAbsolutePosition = m_cancoder.getAbsolutePosition(); + m_turnAbsolutePosition = cancoder.getAbsolutePosition(); m_turnPosition = m_turnTalon.getPosition(); m_turnPositionQueue = PhoenixOdometryThread.getInstance().registerSignal(m_turnTalon, m_turnTalon.getPosition()); @@ -177,29 +168,29 @@ public void updateInputs(ModuleIOInputs inputs) { m_turnCurrent); inputs.drivePositionRad = - Units.rotationsToRadians(m_drivePosition.getValueAsDouble()) / DRIVE_GEAR_RATIO; + Units.rotationsToRadians(m_drivePosition.getValueAsDouble()) / m_moduleConstants.DRIVE_GEAR_RATIO(); inputs.driveVelocityRadPerSec = - Units.rotationsToRadians(m_driveVelocity.getValueAsDouble()) / DRIVE_GEAR_RATIO; + Units.rotationsToRadians(m_driveVelocity.getValueAsDouble()) / m_moduleConstants.DRIVE_GEAR_RATIO(); inputs.driveAppliedVolts = m_driveAppliedVolts.getValueAsDouble(); inputs.driveCurrentAmps = new double[] {m_driveCurrent.getValueAsDouble()}; inputs.turnAbsolutePosition = Rotation2d.fromRotations(m_turnAbsolutePosition.getValueAsDouble()) - .minus(absoluteEncoderOffset); + .minus(m_moduleConstants.ENCODER_OFFSET()); inputs.turnPosition = - Rotation2d.fromRotations((m_turnPosition.getValueAsDouble() / TURN_GEAR_RATIO)); + Rotation2d.fromRotations((m_turnPosition.getValueAsDouble() / m_moduleConstants.TURNING_GEAR_RATIO())); inputs.turnVelocityRadPerSec = - Units.rotationsToRadians(m_turnVelocity.getValueAsDouble()) / TURN_GEAR_RATIO; + Units.rotationsToRadians(m_turnVelocity.getValueAsDouble()) / m_moduleConstants.TURNING_GEAR_RATIO(); inputs.turnAppliedVolts = m_turnAppliedVolts.getValueAsDouble(); inputs.turnCurrentAmps = new double[] {m_turnCurrent.getValueAsDouble()}; inputs.odometryDrivePositionsRad = m_drivePositionQueue.stream() - .mapToDouble((Double value) -> Units.rotationsToRadians(value) / DRIVE_GEAR_RATIO) + .mapToDouble((Double value) -> Units.rotationsToRadians(value) / m_moduleConstants.DRIVE_GEAR_RATIO()) .toArray(); inputs.odometryTurnPositions = m_turnPositionQueue.stream() - .map((Double value) -> Rotation2d.fromRotations(value / TURN_GEAR_RATIO)) + .map((Double value) -> Rotation2d.fromRotations(value / m_moduleConstants.DRIVE_GEAR_RATIO())) .toArray(Rotation2d[]::new); m_drivePositionQueue.clear(); m_turnPositionQueue.clear(); @@ -219,7 +210,7 @@ public void setTurnVoltage(double volts) { public void setDriveBrakeMode(boolean enable) { var config = new MotorOutputConfigs(); config.Inverted = - m_moduleConstants.DRIVE_MOTOR_INVERTED ? InvertedValue.Clockwise_Positive + m_moduleConstants.DRIVE_MOTOR_INVERTED() ? InvertedValue.Clockwise_Positive : InvertedValue.CounterClockwise_Positive; config.NeutralMode = enable ? NeutralModeValue.Brake : NeutralModeValue.Coast; m_driveTalon.getConfigurator().apply(config); @@ -229,7 +220,7 @@ public void setDriveBrakeMode(boolean enable) { public void setTurnBrakeMode(boolean enable) { var config = new MotorOutputConfigs(); config.Inverted = - m_moduleConstants.TURN_MOTOR_INVERTED ? InvertedValue.Clockwise_Positive + m_moduleConstants.TURN_MOTOR_INVERTED() ? InvertedValue.Clockwise_Positive : InvertedValue.CounterClockwise_Positive; config.NeutralMode = enable ? NeutralModeValue.Brake : NeutralModeValue.Coast; m_turnTalon.getConfigurator().apply(config);