From 70586db640679d1db1b5091c352b0270006384b9 Mon Sep 17 00:00:00 2001 From: vivi-o Date: Thu, 27 Aug 2026 01:19:06 -0700 Subject: [PATCH 1/4] tuning draft (not formatted yet etc) --- Docs/3_Specifics/3.6_GainsTuning.md | 81 ++++++++++++++++++ .../.gradle/7.5.1/checksums/checksums.lock | Bin 0 -> 17 bytes .../.gradle/7.5.1/checksums/md5-checksums.bin | Bin 0 -> 18547 bytes .../7.5.1/checksums/sha1-checksums.bin | Bin 0 -> 18659 bytes .../dependencies-accessors.lock | Bin 0 -> 17 bytes .../dependencies-accessors/gc.properties | 0 .../executionHistory/executionHistory.lock | Bin 0 -> 17 bytes .../.gradle/7.5.1/fileChanges/last-build.bin | Bin 0 -> 1 bytes .../.gradle/7.5.1/fileHashes/fileHashes.lock | Bin 0 -> 17 bytes .../.gradle/7.5.1/gc.properties | 0 .../buildOutputCleanup.lock | Bin 0 -> 17 bytes .../buildOutputCleanup/cache.properties | 2 + .../.gradle/vcs-1/gc.properties | 0 .../bin/main/frc/robot/Constants.class | Bin 0 -> 385 bytes .../bin/main/frc/robot/Main.class | Bin 0 -> 1044 bytes .../bin/main/frc/robot/Robot.class | Bin 0 -> 1933 bytes .../bin/main/frc/robot/RobotContainer.class | Bin 0 -> 2321 bytes .../Subsystems/DrivetrainSubsystem.class | Bin 0 -> 3107 bytes .../.gradle/7.5.1/checksums/checksums.lock | Bin 0 -> 17 bytes .../.gradle/7.5.1/checksums/md5-checksums.bin | Bin 0 -> 22497 bytes .../7.5.1/checksums/sha1-checksums.bin | Bin 0 -> 28811 bytes .../dependencies-accessors.lock | Bin 0 -> 17 bytes .../dependencies-accessors/gc.properties | 0 .../executionHistory/executionHistory.lock | Bin 0 -> 17 bytes .../.gradle/7.5.1/fileChanges/last-build.bin | Bin 0 -> 1 bytes .../.gradle/7.5.1/fileHashes/fileHashes.lock | Bin 0 -> 17 bytes .../.gradle/7.5.1/gc.properties | 0 .../buildOutputCleanup.lock | Bin 0 -> 17 bytes .../buildOutputCleanup/cache.properties | 2 + .../.gradle/vcs-1/gc.properties | 0 .../bin/main/frc/robot/BuildConstants.class | Bin 0 -> 808 bytes .../bin/main/frc/robot/Main.class | Bin 0 -> 469 bytes .../bin/main/frc/robot/Robot.class | Bin 0 -> 5854 bytes .../bin/main/frc/robot/RobotContainer.class | Bin 0 -> 2550 bytes .../DrivetrainIO$DrivetrainIOInputs.class | Bin 0 -> 1113 bytes .../subsystems/Drivetrain/DrivetrainIO.class | Bin 0 -> 408 bytes .../Drivetrain/DrivetrainIOSim.class | Bin 0 -> 3131 bytes .../Drivetrain/DrivetrainSubsystem.class | Bin 0 -> 2699 bytes .../.gradle/7.5.1/checksums/checksums.lock | Bin 0 -> 17 bytes .../dependencies-accessors.lock | Bin 0 -> 17 bytes .../dependencies-accessors/gc.properties | 0 .../executionHistory/executionHistory.lock | Bin 0 -> 17 bytes .../.gradle/7.5.1/fileChanges/last-build.bin | Bin 0 -> 1 bytes .../.gradle/7.5.1/fileHashes/fileHashes.lock | Bin 0 -> 17 bytes .../KitbotDemoSim/.gradle/7.5.1/gc.properties | 0 .../buildOutputCleanup.lock | Bin 0 -> 17 bytes .../buildOutputCleanup/cache.properties | 2 + .../KitbotDemoSim/.gradle/vcs-1/gc.properties | 0 .../bin/main/frc/robot/Constants.class | Bin 0 -> 385 bytes .../bin/main/frc/robot/Main.class | Bin 0 -> 469 bytes .../bin/main/frc/robot/Robot.class | Bin 0 -> 5854 bytes .../bin/main/frc/robot/RobotContainer.class | Bin 0 -> 2272 bytes .../DrivetrainIO$DrivetrainIOInputs.class | Bin 0 -> 1023 bytes .../Subsystems/Drivetrain/DrivetrainIO.class | Bin 0 -> 379 bytes .../Drivetrain/DrivetrainIOSim.class | Bin 0 -> 2670 bytes .../Drivetrain/DrivetrainSubsystem.class | Bin 0 -> 2593 bytes 56 files changed, 87 insertions(+) create mode 100644 Docs/3_Specifics/3.6_GainsTuning.md create mode 100644 Examples/KitbotDemoBasic/.gradle/7.5.1/checksums/checksums.lock create mode 100644 Examples/KitbotDemoBasic/.gradle/7.5.1/checksums/md5-checksums.bin create mode 100644 Examples/KitbotDemoBasic/.gradle/7.5.1/checksums/sha1-checksums.bin create mode 100644 Examples/KitbotDemoBasic/.gradle/7.5.1/dependencies-accessors/dependencies-accessors.lock create mode 100644 Examples/KitbotDemoBasic/.gradle/7.5.1/dependencies-accessors/gc.properties create mode 100644 Examples/KitbotDemoBasic/.gradle/7.5.1/executionHistory/executionHistory.lock create mode 100644 Examples/KitbotDemoBasic/.gradle/7.5.1/fileChanges/last-build.bin create mode 100644 Examples/KitbotDemoBasic/.gradle/7.5.1/fileHashes/fileHashes.lock create mode 100644 Examples/KitbotDemoBasic/.gradle/7.5.1/gc.properties create mode 100644 Examples/KitbotDemoBasic/.gradle/buildOutputCleanup/buildOutputCleanup.lock create mode 100644 Examples/KitbotDemoBasic/.gradle/buildOutputCleanup/cache.properties create mode 100644 Examples/KitbotDemoBasic/.gradle/vcs-1/gc.properties create mode 100644 Examples/KitbotDemoBasic/bin/main/frc/robot/Constants.class create mode 100644 Examples/KitbotDemoBasic/bin/main/frc/robot/Main.class create mode 100644 Examples/KitbotDemoBasic/bin/main/frc/robot/Robot.class create mode 100644 Examples/KitbotDemoBasic/bin/main/frc/robot/RobotContainer.class create mode 100644 Examples/KitbotDemoBasic/bin/main/frc/robot/Subsystems/DrivetrainSubsystem.class create mode 100644 Examples/KitbotDemoFinal/.gradle/7.5.1/checksums/checksums.lock create mode 100644 Examples/KitbotDemoFinal/.gradle/7.5.1/checksums/md5-checksums.bin create mode 100644 Examples/KitbotDemoFinal/.gradle/7.5.1/checksums/sha1-checksums.bin create mode 100644 Examples/KitbotDemoFinal/.gradle/7.5.1/dependencies-accessors/dependencies-accessors.lock create mode 100644 Examples/KitbotDemoFinal/.gradle/7.5.1/dependencies-accessors/gc.properties create mode 100644 Examples/KitbotDemoFinal/.gradle/7.5.1/executionHistory/executionHistory.lock create mode 100644 Examples/KitbotDemoFinal/.gradle/7.5.1/fileChanges/last-build.bin create mode 100644 Examples/KitbotDemoFinal/.gradle/7.5.1/fileHashes/fileHashes.lock create mode 100644 Examples/KitbotDemoFinal/.gradle/7.5.1/gc.properties create mode 100644 Examples/KitbotDemoFinal/.gradle/buildOutputCleanup/buildOutputCleanup.lock create mode 100644 Examples/KitbotDemoFinal/.gradle/buildOutputCleanup/cache.properties create mode 100644 Examples/KitbotDemoFinal/.gradle/vcs-1/gc.properties create mode 100644 Examples/KitbotDemoFinal/bin/main/frc/robot/BuildConstants.class create mode 100644 Examples/KitbotDemoFinal/bin/main/frc/robot/Main.class create mode 100644 Examples/KitbotDemoFinal/bin/main/frc/robot/Robot.class create mode 100644 Examples/KitbotDemoFinal/bin/main/frc/robot/RobotContainer.class create mode 100644 Examples/KitbotDemoFinal/bin/main/frc/robot/subsystems/Drivetrain/DrivetrainIO$DrivetrainIOInputs.class create mode 100644 Examples/KitbotDemoFinal/bin/main/frc/robot/subsystems/Drivetrain/DrivetrainIO.class create mode 100644 Examples/KitbotDemoFinal/bin/main/frc/robot/subsystems/Drivetrain/DrivetrainIOSim.class create mode 100644 Examples/KitbotDemoFinal/bin/main/frc/robot/subsystems/Drivetrain/DrivetrainSubsystem.class create mode 100644 Examples/KitbotDemoSim/.gradle/7.5.1/checksums/checksums.lock create mode 100644 Examples/KitbotDemoSim/.gradle/7.5.1/dependencies-accessors/dependencies-accessors.lock create mode 100644 Examples/KitbotDemoSim/.gradle/7.5.1/dependencies-accessors/gc.properties create mode 100644 Examples/KitbotDemoSim/.gradle/7.5.1/executionHistory/executionHistory.lock create mode 100644 Examples/KitbotDemoSim/.gradle/7.5.1/fileChanges/last-build.bin create mode 100644 Examples/KitbotDemoSim/.gradle/7.5.1/fileHashes/fileHashes.lock create mode 100644 Examples/KitbotDemoSim/.gradle/7.5.1/gc.properties create mode 100644 Examples/KitbotDemoSim/.gradle/buildOutputCleanup/buildOutputCleanup.lock create mode 100644 Examples/KitbotDemoSim/.gradle/buildOutputCleanup/cache.properties create mode 100644 Examples/KitbotDemoSim/.gradle/vcs-1/gc.properties create mode 100644 Examples/KitbotDemoSim/bin/main/frc/robot/Constants.class create mode 100644 Examples/KitbotDemoSim/bin/main/frc/robot/Main.class create mode 100644 Examples/KitbotDemoSim/bin/main/frc/robot/Robot.class create mode 100644 Examples/KitbotDemoSim/bin/main/frc/robot/RobotContainer.class create mode 100644 Examples/KitbotDemoSim/bin/main/frc/robot/Subsystems/Drivetrain/DrivetrainIO$DrivetrainIOInputs.class create mode 100644 Examples/KitbotDemoSim/bin/main/frc/robot/Subsystems/Drivetrain/DrivetrainIO.class create mode 100644 Examples/KitbotDemoSim/bin/main/frc/robot/Subsystems/Drivetrain/DrivetrainIOSim.class create mode 100644 Examples/KitbotDemoSim/bin/main/frc/robot/Subsystems/Drivetrain/DrivetrainSubsystem.class diff --git a/Docs/3_Specifics/3.6_GainsTuning.md b/Docs/3_Specifics/3.6_GainsTuning.md new file mode 100644 index 0000000..78c2a06 --- /dev/null +++ b/Docs/3_Specifics/3.6_GainsTuning.md @@ -0,0 +1,81 @@ +Understanding PID and Feedforward Control + +In the previous article, we introduced feedback and feedforward control and explained why combining them is useful for tuning FRC mechanisms. Now, we need to understand how to actually use these constants in our control systems. + +There are two main groups of constants to understand + +The feedforward gains include +kS - static friction +kV - velocity +kA - acceleration +kG - gravity +The feedback gains include +kP - proportional +kI - integral +kD - derivative + + +Feedforward is proactive. We predict how much motor output is needed and apply that output immediately. + +Feedback is reactive. the controller looks at what the mechanism is actually doing, compares it to the desired outcome, and corrects the error. + + +Feedforward constants: + +kS is static friction. kS represents the amount of motor output required to overcome static friction and get the mechanism to move. +if kS is too low the mechanism may not actually move or not move as much as it should because it's not outputting enough to overcome static friction +if kS is too high the mechanism can jump when it starts moving because the output is more than necessary for overcoming static friction +kS is particularly important for mechanisms with significant friction including arms, elevators, and some other gear-driven mechanisms +kV is velocity. kV represents how much motor output is required to maintain a particular velocity. As a mechanism moves faster it will require more motor voltage to maintain that speed and kV shows that relationship. kV is important for any machismo where we care about controlling velocity. +kA is acceleration. kA represents how much additional motor output is needed to accelerate the mechanism. +a mechanism that is already moving at a constant velocity does not need as much output as a mechanism that is rapidly trying to speed up for example, an elevator moving upward at a constant velocity needs enough output to overcome gravity while maintaining its speed so if we want it to accelerate upward we need more output which is represented by kA. +not all mechanisms need kA but important for some +kG is gravity. kG represents the amount of motor output required to counteract gravity. +only really useful when gravity actually affects a mechanism like an elevator or arms need it to account for the constant downward force exerted on it by gravity. + +Feedback constants +kP is proportional. kP is based on the current error. if the mechanism is far away from its target the controller will apply a large correction and if its close it will apply a smaller correction. +if kP is too low the mechanism responds slowly and can't keep up with the target accurately +if kP is too high the mechanism may overshoot, oscillate, or become unstable +kI is based on the accumulated error over time. An integral is the area under a curve or in our case the error accumulated over time so if error gradually builds up in our system I can help with that. +kI is often not needed and will be set to 0 or a very small value in most cases. This is because kP and kD are often good enough. If kI is too high it can cause overshooting. +kD is based on how quickly the error is changing, it is looking at the rate of change of the error or how quickly it's approaching the target. +low kD can make the mechanism overshoot or oscillate. +high kD can make the mechanism too slow to react or react excessively. + +Understanding these things is the first step but now we will include a guide on tuning for practical use. + In general you should not tune everything at once. A solid approach is making feedforward reasonably accurate, then using feedback to reduce the rest of the error. The process and constants you will need depends on the mechanism because they have different physics. + +in general the order for tuning is kS, kV, kA, kG, kP, kD, kI (note: not all may be needed) + +The procedure can depend on the motor controller, control mode, and mechanism so it's important to distinguish between velocity and position control. For example if you're tuning a roller to maintain a certain RPM then you're dealing with velocity. However if you're dealing with an elevator that needs to move to particular heights that's position control. + +Elevator tuning: +tune kS +determine how much output is necessary to overcome static friction and get the elevator moving. The voltage when the mechanism just starts moving is approximately kS. +tune kV +determine the kv by entering different velocities and determining how much kV is needed to maintain those. +tune kA +tune kG +increase kG until it counteract gravity (i.e enough to hold its position, not fall or rise when its supposed to hold still) +tune kP +increase kP until elevator reaches target quickly and accurately, it its overshooting or oscillating its probably too high +tune kD if the elevator overshoots or oscillates as it approaches the target adding kD may help. you can tune it by increasing it until the elevator settles smoothly without becoming excessively sluggish +kI may not be necessarily but if there's consistently small position error it may help +Arm tuning +similar to elevator processes with kS, kV, kA if necessary, kG(when arm i horizontal), kP, kD, and kI is necessary + +roller tuning +typical rollers only need kS, kV, kA, kP, and kD + +Additional tips: +using tools such as SysID (see sysId article) rather than this process can give you kS, kV, and kA +your tuning process and gains need to make sense for the control system your using whether that position, velocity, voltage, etc + +many motor controllers support control slots allowing you to store and select different gains this may be helpful for situations where there is not one perfect set of gains for every situation such as carrying a game piece vs not carrying a game piece + + + + + + diff --git a/Examples/KitbotDemoBasic/.gradle/7.5.1/checksums/checksums.lock b/Examples/KitbotDemoBasic/.gradle/7.5.1/checksums/checksums.lock new file mode 100644 index 0000000000000000000000000000000000000000..216107236aa0077c5c9b00b61beddf160322acf8 GIT binary patch literal 17 UcmZQhdysPc%PtLh1_}k za^6hZDP>7@6+*uflVo#i{`NlBoBa6atGGWXV%%@%XI26P2oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK;RVw2C<0jv410*wZ&ixIE;QCfgXh55UDK*Z=?k literal 0 HcmV?d00001 diff --git a/Examples/KitbotDemoBasic/.gradle/7.5.1/checksums/sha1-checksums.bin b/Examples/KitbotDemoBasic/.gradle/7.5.1/checksums/sha1-checksums.bin new file mode 100644 index 0000000000000000000000000000000000000000..1fa5891900a72bace1420f207d4ab4ae920668c7 GIT binary patch literal 18659 zcmeI(KS)AB9Ki9jG$M=w4a~i%SBQc`1yM8z5k$~nG`KZHHiYODIOv#57%nbCf)G5Y z)jx#LRzpy`g5Xe45Jl0Sd)<48IJ?OA;NJcC9l!f=pY?HTLU<;B%^^BtsuL0+fB*sr zAb_vyhzsF!%3!#>;MjW$*`L&Q zXvO+}@cHA7Y`oSJX8yv;e-{rcXZy*vnU7m}YnA!1+T)7=0tg_000IagfB*srAb7Ql3 literal 0 HcmV?d00001 diff --git a/Examples/KitbotDemoBasic/.gradle/7.5.1/dependencies-accessors/dependencies-accessors.lock b/Examples/KitbotDemoBasic/.gradle/7.5.1/dependencies-accessors/dependencies-accessors.lock new file mode 100644 index 0000000000000000000000000000000000000000..3ca85c7e2206d7c5a9b6440b82ca2b635b90490e GIT binary patch literal 17 TcmZSn+hz4)T2bP31}FdkJS7CJ literal 0 HcmV?d00001 diff --git a/Examples/KitbotDemoBasic/.gradle/7.5.1/dependencies-accessors/gc.properties b/Examples/KitbotDemoBasic/.gradle/7.5.1/dependencies-accessors/gc.properties new file mode 100644 index 0000000..e69de29 diff --git a/Examples/KitbotDemoBasic/.gradle/7.5.1/executionHistory/executionHistory.lock b/Examples/KitbotDemoBasic/.gradle/7.5.1/executionHistory/executionHistory.lock new file mode 100644 index 0000000000000000000000000000000000000000..f72c8dc7f89f62968891f9ff98feb5cd30323f0f GIT binary patch literal 17 TcmZRMJn^LCwf)v81}FdkJmCb& literal 0 HcmV?d00001 diff --git a/Examples/KitbotDemoBasic/.gradle/7.5.1/fileChanges/last-build.bin b/Examples/KitbotDemoBasic/.gradle/7.5.1/fileChanges/last-build.bin new file mode 100644 index 0000000000000000000000000000000000000000..f76dd238ade08917e6712764a16a22005a50573d GIT binary patch literal 1 IcmZPo000310RR91 literal 0 HcmV?d00001 diff --git a/Examples/KitbotDemoBasic/.gradle/7.5.1/fileHashes/fileHashes.lock b/Examples/KitbotDemoBasic/.gradle/7.5.1/fileHashes/fileHashes.lock new file mode 100644 index 0000000000000000000000000000000000000000..ccd179f066d5de2ed18ac26589adaad259afe71b GIT binary patch literal 17 ScmZS16JqeN6Zm3q(6Q6W+A06Y|8 z&murUGpFx%XLt7F^X(nLB_<&P!f0u;$ePr+Xliufgmy)UI$^L8TM^|#ucG^OBQr;s zEUel}XNA(ST)LUaGo$CX1ez1NJ9{GXQr36{2uHt;2en%NSbUiX&1Dt?apR)7Q-X> zI9_SE@Bxg^WIWr}v8WI_S_^HDwWIHc$d%k@wGGTDPoOb>F;o7cF?Qhp^XO07Pe{MrVBJ0 zS*3(J4TJ3dxgfJA49@!~61o}kBoT>)XAD~xx_w#CEWBV?y_!moW87do2W=;9Dv+a( z-UaCvX)Z}da&G$@N?%9UHl5iuU}K(6XG|b@jkGUVK!uRZc$Z|xE1#hXe8kpE}c2t!z#%vz!qVT@EA|ALx@d?OF6&9${#A?5Jdn0 literal 0 HcmV?d00001 diff --git a/Examples/KitbotDemoBasic/bin/main/frc/robot/Robot.class b/Examples/KitbotDemoBasic/bin/main/frc/robot/Robot.class new file mode 100644 index 0000000000000000000000000000000000000000..6429f38ecb2fe21459c20d790c2e1d9147db54bf GIT binary patch literal 1933 zcma)6ZBNrs6n-unE88wF0|aEKpaP=^MP5W1po3r}nZ^hqF@7LjSERVLr0dkbWg_59 z;zvLDqm1Xar7gH+%aYrB+w(lZ* z>&mB7Lpd_+nj>}CX)@qAB+_ z&7Y_rRq7Tsi*9BI{m2=2N8?4$Uiv~aPHUP@3OyM;JLL=TFK$>5tqJ#Knt}oD1)vWZ zI?+uCz-yF3fVun=18*;I;|xO~M~YH|qSMsvkcS66BLU9}u?QaN8*ZNC&UK1mDrY1@ zAq5n71BzL+;@44q@@3}Pq$ zCLihX9S<0UiWo#E`Vpsfl3bjoeGXa35&kh>(L*<$Wr=t(NYvDmxd=n($x>_JLPOwk z04(~A%v{m464le=j^#4_*R4?Ps}aJ?RV{tQ^*CT|s%0(05NdhS8o1FAxE27f4rM-^ lD{rm~G?ZHrif|}51B#|a??ixM(N9|gUo-?hqwaU0@DH5XLbU(@ literal 0 HcmV?d00001 diff --git a/Examples/KitbotDemoBasic/bin/main/frc/robot/RobotContainer.class b/Examples/KitbotDemoBasic/bin/main/frc/robot/RobotContainer.class new file mode 100644 index 0000000000000000000000000000000000000000..e03fbd28553f06a8f7f2c387d4b663ed0e8ee03f GIT binary patch literal 2321 zcmbtVZBtuC6n-{90_i2ZmRGG5sU)fP(yFbRwg|)uHBcpp&|3B8W)qg&+|As(7v-O* z;~(%->x_j?o$&`a{wBw>H&+sdzGOz2YNw)0XwR<(AD-pp&V!x_5^uPwJCP`8gs*R*|P@T#2mx9DpyN>UIroHV*15VnL>E;ff9~c z30zwVy2WN-F=#X#!97A|nAOLcH;_h#YRTtnTRO_Ba(~IQtul}9ok68L0PMge^QwZ2 zGA>&_&uMO#4ZMwaNMqub=M^h(sKmqCWVoE}5G|)GYgCIDP&LcC4Ez(2Y`RlUxn5jl znAwms)(Omv-6TWbQ3;fjco**{@E*hbE9y4l;2XG(8w@=SPq@^fA4gh;ZCg}itmZo9 z80yB5s>`yd9Nv}Gk;1O&($8n|N#t-Vft$47dKcC$wP)ZqKBNw`N`8Ft*Pry?&)Rv} zz>408`=aUw)Y&oNGO#>De^FU>ZQW`_b=>P%^-|fITL}A@GNo|Wz-L%x=q23?yrOn> z%d8vtKqLO=e^q;aZr}^;*+-t6qPnMc=$R_Yz_a-sp<8FwLmJkTq@=LVo0ERV-Uc@6f<5?o&(ETPB9T+og{po8YVT8amvc zD@a)j8o6evx8G2k+@`~j+MWJ|ZAdW8wv8rYN#=xgo z9Z29I86ul)U?a4Z$iQH%x%8{C;#j`V{RH+HE}aqac~T^>&v4=8u2exy-Efh}bkU0z zqYpj7G(x|oG{$L%9()?l(ds_BX$H(>k6~p0Kx((^7=uqRLi6*x#~6QtiR=-kej}e4 zUZ-)4@PHwT>&GAlFpXinfe~CFtI@=w^$e|I`qhr|JdE;8XMZO^{dqk>bM(PjT&WNJJCY2L~OY z6&*hzO1%M$m0{jy%R>U{=t~8jwsP}0?>qvEXgr)gta3SG<;L#CfSKLvPKh@FsPbdfN}3R o7?Wo)DD!5RsfaE5*0djx?Q49C@4}gdGB_%xvNJ^%m! literal 0 HcmV?d00001 diff --git a/Examples/KitbotDemoBasic/bin/main/frc/robot/Subsystems/DrivetrainSubsystem.class b/Examples/KitbotDemoBasic/bin/main/frc/robot/Subsystems/DrivetrainSubsystem.class new file mode 100644 index 0000000000000000000000000000000000000000..9827881655a591cb818d8090f912597530d70fa8 GIT binary patch literal 3107 zcmb_e`*#yX7`@Y$EKL{s0HHjD779&MV0owrL4`I}Dgl(#K*850nIua$yKx^a_4Olv zkDdcm;piXW@o(~YXR{=!q%?YLPqUM6XYT#xe)pT{AAddn9l%BWsG(0FRq;xO=N8?- z$cIIL-4A5lH?p3!Dg)27oK{f7fWRqP4vn>jWmGKB57fxEiVx2lCAVHTopKvu&h(`~ z(w3EA!L&=RBXBauSw<=Fq|vCk(y<;jJlCk1UU|)AY{|4;XW?E(V92wowbrsBg;8+r zz^oE+rYi{X1JAX6Bc69V42YvgIIX3LE0$vg?+f&&W(ooW^KMxt(T`yrL(nyh3QYBq zp@uyId)l(iyN(~2PT(gof;SY{KBA`qY4;nMIp2jpf{uX%|e-Qs3j?Kv1)Mfpo5& zd#k!#ORj3+%a`JF>5f#ENvN!5b)3R!R(Q<{YLvSX26P8g?72QlEknmyoFfWZD5I*O zz>QST7~R?Off8avdY< zhSV<~HX61iy-W{NW^&uKNX)1jB%|S7T6&uWcS0v#GseEXtRsUfG_e=5ryi$zFJ=$P z_b_FqImb4gs=>@0y#1aY`J`*_IwI)WiQzL6tD$TXR+JKvD9>}LjXAD?S@AaLnl<v#(n1QLG4B9Q6snx0bR8I*TJuOt^Nb$*UVo8No^o>5g27@2e3z~`&R zO&QeOGLQW#EDbe*V^JL=D_hR0yCRKT%TAvBE;u+aZBJJDVV0*#y7N zOVyVCRL*r*!bW`lL^@jX!FPoIFU)y;I#I*CKZRf2(W`+}}j6he$ zbaha$rL|Vyq<@E>YS#s7qtqIIfs4!O*;CJPiPHUs_m=z9`3-#V6W=vAmWVKpcW{ii zIL65_7rh@R#~fD(%(pnce1#*s1xIr~(-=dV@=b5S^J0;203K^!SY^wvBKw9>bVKMx%U)CX^0ctzpCXvDoLbR=TX|pM3HIsqr`Y0%8>Ca ho3T0?_y%g^A;c=y_->4|?(@QUM8~h=JN$qHe**)XFC_o~ literal 0 HcmV?d00001 diff --git a/Examples/KitbotDemoFinal/.gradle/7.5.1/checksums/checksums.lock b/Examples/KitbotDemoFinal/.gradle/7.5.1/checksums/checksums.lock new file mode 100644 index 0000000000000000000000000000000000000000..531ecfba49e4ad659813163cd12f54d85190006d GIT binary patch literal 17 VcmZSHwQFVXyuFP^3}C=03;;cu1keBg literal 0 HcmV?d00001 diff --git a/Examples/KitbotDemoFinal/.gradle/7.5.1/checksums/md5-checksums.bin b/Examples/KitbotDemoFinal/.gradle/7.5.1/checksums/md5-checksums.bin new file mode 100644 index 0000000000000000000000000000000000000000..4235fb50f831c02565dec757c2b48fc33dade481 GIT binary patch literal 22497 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 H6Epq;Thz`w literal 0 HcmV?d00001 diff --git a/Examples/KitbotDemoFinal/.gradle/7.5.1/checksums/sha1-checksums.bin b/Examples/KitbotDemoFinal/.gradle/7.5.1/checksums/sha1-checksums.bin new file mode 100644 index 0000000000000000000000000000000000000000..1af35d5cecfeb7d7372fd30026f7c14f74d1813b GIT binary patch literal 28811 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 I;|y&5ALf)~vH$=8 literal 0 HcmV?d00001 diff --git a/Examples/KitbotDemoFinal/.gradle/7.5.1/dependencies-accessors/dependencies-accessors.lock b/Examples/KitbotDemoFinal/.gradle/7.5.1/dependencies-accessors/dependencies-accessors.lock new file mode 100644 index 0000000000000000000000000000000000000000..79d4d50939a59c64f85cc12f6e905857c3e7d065 GIT binary patch literal 17 TcmZSX%)Q=y>Z<1?1}FdkJfj5G literal 0 HcmV?d00001 diff --git a/Examples/KitbotDemoFinal/.gradle/7.5.1/dependencies-accessors/gc.properties b/Examples/KitbotDemoFinal/.gradle/7.5.1/dependencies-accessors/gc.properties new file mode 100644 index 0000000..e69de29 diff --git a/Examples/KitbotDemoFinal/.gradle/7.5.1/executionHistory/executionHistory.lock b/Examples/KitbotDemoFinal/.gradle/7.5.1/executionHistory/executionHistory.lock new file mode 100644 index 0000000000000000000000000000000000000000..543e83b97f3d52d33a2621968a5f95de245a4ced GIT binary patch literal 17 ScmZS9755Q|p6#=r0SW*fH3F#s literal 0 HcmV?d00001 diff --git a/Examples/KitbotDemoFinal/.gradle/7.5.1/fileChanges/last-build.bin b/Examples/KitbotDemoFinal/.gradle/7.5.1/fileChanges/last-build.bin new file mode 100644 index 0000000000000000000000000000000000000000..f76dd238ade08917e6712764a16a22005a50573d GIT binary patch literal 1 IcmZPo000310RR91 literal 0 HcmV?d00001 diff --git a/Examples/KitbotDemoFinal/.gradle/7.5.1/fileHashes/fileHashes.lock b/Examples/KitbotDemoFinal/.gradle/7.5.1/fileHashes/fileHashes.lock new file mode 100644 index 0000000000000000000000000000000000000000..04f7f779512eca87c2b7cab78c6fa53edd46e8d2 GIT binary patch literal 17 TcmZSX43jEh-*;po0~7!ND*XeS literal 0 HcmV?d00001 diff --git a/Examples/KitbotDemoFinal/.gradle/7.5.1/gc.properties b/Examples/KitbotDemoFinal/.gradle/7.5.1/gc.properties new file mode 100644 index 0000000..e69de29 diff --git a/Examples/KitbotDemoFinal/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/Examples/KitbotDemoFinal/.gradle/buildOutputCleanup/buildOutputCleanup.lock new file mode 100644 index 0000000000000000000000000000000000000000..4e2c946b62082d117a18b4b60ba8a5525f9c8382 GIT binary patch literal 17 UcmZR!-L`g12CHcS0|YPv04#C?YXATM literal 0 HcmV?d00001 diff --git a/Examples/KitbotDemoFinal/.gradle/buildOutputCleanup/cache.properties b/Examples/KitbotDemoFinal/.gradle/buildOutputCleanup/cache.properties new file mode 100644 index 0000000..c68b6ab --- /dev/null +++ b/Examples/KitbotDemoFinal/.gradle/buildOutputCleanup/cache.properties @@ -0,0 +1,2 @@ +#Mon Jun 15 19:21:29 PDT 2026 +gradle.version=7.5.1 diff --git a/Examples/KitbotDemoFinal/.gradle/vcs-1/gc.properties b/Examples/KitbotDemoFinal/.gradle/vcs-1/gc.properties new file mode 100644 index 0000000..e69de29 diff --git a/Examples/KitbotDemoFinal/bin/main/frc/robot/BuildConstants.class b/Examples/KitbotDemoFinal/bin/main/frc/robot/BuildConstants.class new file mode 100644 index 0000000000000000000000000000000000000000..acd878ec353eebafccfab016324d4f1a230461cb GIT binary patch literal 808 zcmZ{i*>2N76o&uF(wH=*B`tJe3t~$PX`IC&4G1Y)TSJyAaU!@OvYknp;@DN(-1* zxWWL2=sdAiZq_Bl7?xiPm!7Thv9m91-C~IJ>z%IJZb?|CcV_nVl$&BC_>duXplX9o zy{~$H2Brq7hYF>5_ua#?gzF4R!{B*t%7!^C%7u}V)fJf+3b{R9Ol9RnCSS_!mE>&VsHRcTUR(;3-={MFuC1l2vwaSk0OZe7#`vg&95PB-kOaKKGAf;;@&bGQ@8s1M0k9D8FJr? zDZ^Ide~YGtMZ3;yV)A|AsjU9{4|cr;BSQ=H>WX3$VJr|uhysv^qds0FUh?r(;uT!G zh>sJm`uuCeH+;NKyy@dDqFX+`O?(%L3%z^9_kH>g$P@79L+4|vFij`@K7@C^BKhU4 acTu+N!r4+a3&_1S<-Po}z-)f_U1bYu%FUmTl~R@aK3cDCpfE zB~GHH2(mE4n>RCW=Y4*?z603Djtz^U_FzKK=s+jl1((W3o}n?}bM8f4jlHX2BEp2B zcqo-jju>*C?vNpWsz<^>4&@38C^FQ2sl??|90+s6gGewmeI4>>$c;?#Z!w=d${7jx ze^vXmF(!3}cIVz-sSgq()wtgs+E^!z6>(;aHYIE@9N#Jk4!6E_gjAcKr20>&Cu%nr_JCD^pgq2xlHdWr#9`TU%?*8 z5AqVQ=#dYEZ9*PpM!C>ip!AZ_4#kuP9IR2S{4`Lm5_(1rb*iMpJzAOdy`gc}Y%Z|* UK~;<9mK&p0A12(s0KmY&$ literal 0 HcmV?d00001 diff --git a/Examples/KitbotDemoFinal/bin/main/frc/robot/Robot.class b/Examples/KitbotDemoFinal/bin/main/frc/robot/Robot.class new file mode 100644 index 0000000000000000000000000000000000000000..65724cd745801cbddb87f024b117fae130e1ae66 GIT binary patch literal 5854 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 bUxHP*! zEomJwV1F^l){&ca?t~`0$l%OQ15p+QZ=yp(vlTU3R)m&Hz~Ex3C~7q{sGQ((uUPbw zf{y+slyJW@IF+BtC)d{4954$_Q)7*#^8H4GWtvzv|4Us)u$RnLMBNlpXR?J zNelOUFT2q|Uo<0aoUcv2Acb=homQ!CC@DYWN@?d;(Eq^t$O)@)VJ8xWnlRQSPf}F2 z3RX1ZcCf;MpL1;TI!Sw7XquU0qds4fUkiDVJbb5p?r(D=IO)X8epz4FiUy47WuFK~ z+uW*l+Vs%E{_kmzeoU)UsQRJDKTlR|S^SHK@ECl?+F#vA(tTbZHR=iX^I#S(=imbP z45ss?y`8e`5&_&#cGB^ZQ20mOtf1LQM9*NNq(d$@JBy&xIqVw3GPqM3*4hlpdkpf7{db66{-_o1Be*`Vj~exa`!N`^m>z9N2P64n zF)8FcgDamdB>k;PmE^ga92@LYG-afdPn8Z3WgVLkmqnu6scxl^^a_dI8RS-!LbD{f zwP-W&GlPeNXt;;|D4Fh1ZBb_6R|Yc&7Lf8-71q+K+n`o`JKeJ>F^0!THplfXTF->a^4F4cWuQy#U|ReTJ-sG!B6G3TFSD`0jtW z^oDweCi2B-uAA1lU^d!u|%`U>oF5y-W!rwg! iKMg>@9)wd+pr}I-!0jYDWpjsS{1=+%yJRQxwD2Bajp3RA literal 0 HcmV?d00001 diff --git a/Examples/KitbotDemoFinal/bin/main/frc/robot/subsystems/Drivetrain/DrivetrainSubsystem.class b/Examples/KitbotDemoFinal/bin/main/frc/robot/subsystems/Drivetrain/DrivetrainSubsystem.class new file mode 100644 index 0000000000000000000000000000000000000000..4ebbbe6286c2b28da8e2b6c17ef37f56cce6de11 GIT binary patch literal 2699 zcmeHJTTc@~6h2c5Z5I?pQB=gi3$}^rCSId8CPFnKsq#=H(YNXDv>n{eY-VRM{1g9) z2`2jP5AxA?W?NdI3jwP!CO+(3cFy@`&v)j0v)_K~d;x$*P|87uz`dsST&)_)xKZ4Q zwj;wkkz3VbiyO^^+%v52uIC_2;12g=_d_V$rqGeGqd+t^@4BAqbeQzrzV$MTIDx$K zRR)56YsFSDjCP!%4WKu`LzhGH?E zR3VB+v08ms+Q`E^f$ztVgdu@TN!~wJECi+!GFH0kPvB!OGqDkY+l-}Wh0(357}>AK zVHgOmE8XOs*koC$fHT>LDIK^_hVG)?SJ|7Wk_Sp)@#rj}ZsUy=axIiEygb|>Wans) zMC$(w#>m&muWQZWfzn9Ej0a&Vi#{9tuhWbu^05>bRIvyPEQ zun730fIn0A8HWjM0dkN}`T{uEXVGF3rm#JQv-@aCuy;Pg>9;dyKEcdaoMm7Z+llT9 zT)?rlM=Q7pbJ!EO1edYhMX>vH5w4^lETtk`g@ru`**?Ox6a+UFVeybCuBRY8OhL%N PP24pDx1fl<@}3{U_7JmCcj literal 0 HcmV?d00001 diff --git a/Examples/KitbotDemoSim/.gradle/7.5.1/gc.properties b/Examples/KitbotDemoSim/.gradle/7.5.1/gc.properties new file mode 100644 index 0000000..e69de29 diff --git a/Examples/KitbotDemoSim/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/Examples/KitbotDemoSim/.gradle/buildOutputCleanup/buildOutputCleanup.lock new file mode 100644 index 0000000000000000000000000000000000000000..9aa7cc49ea74a4236a3afd1579b53747814b6f87 GIT binary patch literal 17 TcmZRsP0Kx&|AQ%*0Rk8SFzy4_ literal 0 HcmV?d00001 diff --git a/Examples/KitbotDemoSim/.gradle/buildOutputCleanup/cache.properties b/Examples/KitbotDemoSim/.gradle/buildOutputCleanup/cache.properties new file mode 100644 index 0000000..fbd7a9b --- /dev/null +++ b/Examples/KitbotDemoSim/.gradle/buildOutputCleanup/cache.properties @@ -0,0 +1,2 @@ +#Mon Jun 15 19:22:10 PDT 2026 +gradle.version=7.5.1 diff --git a/Examples/KitbotDemoSim/.gradle/vcs-1/gc.properties b/Examples/KitbotDemoSim/.gradle/vcs-1/gc.properties new file mode 100644 index 0000000..e69de29 diff --git a/Examples/KitbotDemoSim/bin/main/frc/robot/Constants.class b/Examples/KitbotDemoSim/bin/main/frc/robot/Constants.class new file mode 100644 index 0000000000000000000000000000000000000000..5a06dc66eb3093cc07f1052d4397b22fc7e73828 GIT binary patch literal 385 zcmZvXy-veG5QJx)ABT`X5)wp72NbxZ0MP_Rie!NV$o<*5Bo~=G>3q(6Q6W+A06Y|8 z&murUGpFx%XLt7F^X(nLB_<&P!f0u;$ePr+Xliufgmy)UI$^L8TM^|#ucG^OBQr;s zEUel}XNA(ST)LUaGo$CX1ez1NJ9{GXQr36{2uHt;2en%NSbUiX&1cTu+N!r4+a3&_1S<-Po}z-)f_U1bYu%FUmTl~R@aK3cDCpfE zB~GHH2(mE4n>RCW=Y4*?z603Djtz^U_FzKK=s+jl1((W3o}n?}bM8f4jlHX2BEp2B zcqo-jju>*C?vNpWsz<^>4&@38C^FQ2sl??|90+s6gGewmeI4>>$c;?#Z!w=d${7jx ze^vXmF(!3}cIVz-sSgq()wtgs+E^!z6>(;aHYIE@9N#Jk4!6E_gjAcKr20>&Cu%nr_JCD^pgq2xlHdWr#9`TU%?*8 z5AqVQ=#dYEZ9*PpM!C>ip!AZ_4#kuP9IR2S{4`Lm5_(1rb*iMpJzAOdy`gc}Y%Z|* UK~;<9mK&p0A12(s0KmY&$ literal 0 HcmV?d00001 diff --git a/Examples/KitbotDemoSim/bin/main/frc/robot/Robot.class b/Examples/KitbotDemoSim/bin/main/frc/robot/Robot.class new file mode 100644 index 0000000000000000000000000000000000000000..4eb579e921895112470dba35e7f98640ef60f139 GIT binary patch literal 5854 zcmeI0e{b7F7{{OMO5Kq9qNYG(;>5Z zOh^@7d91s8#d4As)_%(sWcp8HGpjsMHVddAaG~>@@q>HVe(oj?0bH_AxNFK9;w$x!&2hzayBUI)nLJiX`+v@=0h0vIJYR)i@lik6xD0rW%q$$Sy2$6jDxz|WfkIIdGT{Ab6{;YI5jdUgiBX;~phe(^iS#)PD6P(7#!D49;9~+mP3cq$DeYKJ zsU&di>6NM^bd9X)FyK=HqlpyCI+s`GaHV3v@}$Zf29$PaUzsFK*QZmak`Nh+CRLFE zHwdT+15`;tg&8?=B3%Xsd^u^p$#*Xunplw}FkelhNF`xuJmR5n=sgxyWR3ViydBkV zSjeph4i6+g0^{@lH;f8fID@?!tPwaF*Fed82Nd-IlM>6k=;2qwMZmX1_%3S(KQF;t zd{qMj&+~Yv4h=k>#9zzUir~5ND>T1bJpD5){2sSGi^sY6P7Pkh>t@ml&cQ4Ai@^B; z!mAp>c`e~W0pWEGp`|6fSwMJ8L%5_Rm<5E38p35Q;oSnldm6%3E#ZR#!iO5dH7#MO zfbfxqa9d0Gq=0ZqL%5?QSOtX38p4{EaHW87RYT}#37-`Zu4xDxTEgcAgfBFNEiGZC mfN)bo*wGSh6%cM~2;XZ6C*bRN1>b>HJOkXr?<}s^yMF^~x8j@t literal 0 HcmV?d00001 diff --git a/Examples/KitbotDemoSim/bin/main/frc/robot/RobotContainer.class b/Examples/KitbotDemoSim/bin/main/frc/robot/RobotContainer.class new file mode 100644 index 0000000000000000000000000000000000000000..10a9c144826de041a9231425de9ed3ed96e608ef GIT binary patch literal 2272 zcmbtVk5d~(6#h2Qq@>4h%1=eCRFYJCw6(38(v~FFQUg_j2x`^K-6kwtZZmg#D1VhY zW1&-L`~w{SCdapzGYS2f(P6T;`}XbkzJ2?>$De;c{R6;F)KW+=OxJwd^kr2lb5oB+ z=_yNi+)tsOVPxMrv`p9X>gL1hKDQM^+9nTQx-Rz_R?6H7%^#b>tO-9*dghAi{#DbK zjfUkpW;IkwdSFwBtuAAHjo!l;HCBkastc6$H}69nZhK) zwg136jq@1PI5P%PIGd)~oPjrxW*DVJ*F-(^c|mxN@ah4>aG9QFBWzT;zhzZj&M;P% zw&iYHzR>H~*st~kdCzv`@$}>7$4CMf47`IyhI4hUR)dlZBfvYEm!Ha(BRzylxMnT% zY$fPzTL&v)v*`-%6EedEeXS(}8DvRe0ax47RaTt`tG;bHJXQmP%Jcx(gG=^xGK?b@ ztbpe=w@U`z!~2wD;#T4{D|AWtkzyGxWqL%*YmrUpk=`|9LIRpl7;3mVFrY}6I+q-eDqhhWoGS>6Ga*XoE zFw~Has2x3!RHwo|&{a^%meR;$C52nG-{}_XmfACL8y`_s2BPkTRMrXMF|ZQDS=VY* z9cytps#F3PLdn1_f zf-S0)M#sePS9eC^lP&Q3)cRZ=ES9A_2%Gtqg1ZynWjS?l>!``Q-Fx3`g?#ndxO^ib zF>=vz-HK2=Kb*wF5fpUVcMPneFr30yWQc8#4BU@w-;#mBSo7##MA5Z^fCnj587@AT z#22L^1&3k&)vlzNR^IS7k?EsGm7pIrSsJ06B#lYhp_WeLIa+;f?IL5oj$aO-@6IC6kA5%nmnv^?(37SulZI=Ezq2}UH43}ZX zp_b{Zuaq2HeuAsNL_{=keR0qgI;WFuqEsvK=@p8q6F0E5bg=XUA0Pbu48URpFd1cb zAO;|J+`(P2k%WH#80rQA>5xW_E)4>LX8R@Cwy{euu4muiJA98HXivY81sfbQ{{XVOK4Sm? literal 0 HcmV?d00001 diff --git a/Examples/KitbotDemoSim/bin/main/frc/robot/Subsystems/Drivetrain/DrivetrainIO$DrivetrainIOInputs.class b/Examples/KitbotDemoSim/bin/main/frc/robot/Subsystems/Drivetrain/DrivetrainIO$DrivetrainIOInputs.class new file mode 100644 index 0000000000000000000000000000000000000000..435819f41b30c7b65a999d1ef388fdcee9a14a1f GIT binary patch literal 1023 zcmbtTO^Xvj5Uq|eA7eDT*Znm8$mSvlt|%d^7>Jw2#DI93Olp%}X1a&&nm`Wz zE{wT3#GLl5}ARcC3clE2PSJlXhgZojdzcl%ux#bk?+7qE5a&AnFOscEY}K0}`bR0BMveoV|6>42;Nal}L; zr?X9SJt2-T(7vR_8zeOL1kC__ttJBYQ-{AE*AnLwZ6!&qmd*lpQlHge*yDh!Uc59$n-W|R z@bR58Xmv2hiRl2+;ENZ-1?r<5jl zjP9>kPPrYE?&;|t&Ro*2=h7lV$AMkAR)KA}E?}?OTL~PHk!pIF6j1F+g~xF?Ml?c~oxrmec_Qx#c=Rv&xYqUb%fS{e9!!79LDod z;FW-4hNTS489EtW$glzzQ~sq4s~K)($hAX_Zwo9Mt(= pNKcBe&+E#P1vlU(@A7afWx1?#$-BdNm%l`>fCk)$GCW8*ji0-X82$hN literal 0 HcmV?d00001 diff --git a/Examples/KitbotDemoSim/bin/main/frc/robot/Subsystems/Drivetrain/DrivetrainIO.class b/Examples/KitbotDemoSim/bin/main/frc/robot/Subsystems/Drivetrain/DrivetrainIO.class new file mode 100644 index 0000000000000000000000000000000000000000..5f83e4e11c35c71c18dcfc7aede24b1d94b029d3 GIT binary patch literal 379 zcmbtQyKcfj5S)d8!9aL?1BHrjo|62{0kN-f4xfXzN`4^$CQoixKF!NP6hQM-yP+5ezRq#K_Ii KU5;HnV)zF@hi;w# literal 0 HcmV?d00001 diff --git a/Examples/KitbotDemoSim/bin/main/frc/robot/Subsystems/Drivetrain/DrivetrainIOSim.class b/Examples/KitbotDemoSim/bin/main/frc/robot/Subsystems/Drivetrain/DrivetrainIOSim.class new file mode 100644 index 0000000000000000000000000000000000000000..a30ee3bc41b1b02e925d4d25bf71b1b11d319eca GIT binary patch literal 2670 zcmeHJ-*3|}5I%R^+Gd50vH@fK$Y6{PMk6F7qz%Et%1}i|rL_$9=%jAzDYYZp=@@?% zZ%81)JAV}7(spYfGP?E=p(u{ezWaQ>`+Ux?-`{=!z;h_3AVI)sD$h~UmBy)su0GL* zb+l7byvvNDT#R(f)f(@lAW2~1h<2&tQ_*s&?h*4$3g!rGP69>1@>$dDQs0w;zN#}vov)R$uS<2HeL#arz&v-t?)K>CKZ7=evg5X3i1`q~-j zRYQX~*&fcBsTH(OH1{;_kibf%#G6f~m@u6B!&u-XTF$-Tf}58FW(pez1d=6C-rwjf^o<17;cqI0@#FWPdc9JyMM%vUiCjqlE zlh|3Ax7^^t+>=JC7%%#`U8*=mDxGS-VK^XK7uNsKX3Veg&+GyglXyS6>oLI`Gd=C9 z|G1q6dAOd19NZwVRHzJ#Pt8OG*p7-*uEGU-7j|5x>Jdo@5ehX;=Nn?Fghb z>s`jkgV{o<6eV(v!0O)pSER^NU~M+D{x!z%sUTsDm?b6Wi>dzXG>VB5)h-j36W; zy&l5d7z8^OVHNI;AVmK65$?wzY{ekVzyq{Nz&bpPY!Rz~QFw&Ae}Zxn<;Q;jeVbbg literal 0 HcmV?d00001 diff --git a/Examples/KitbotDemoSim/bin/main/frc/robot/Subsystems/Drivetrain/DrivetrainSubsystem.class b/Examples/KitbotDemoSim/bin/main/frc/robot/Subsystems/Drivetrain/DrivetrainSubsystem.class new file mode 100644 index 0000000000000000000000000000000000000000..66ffc39e3495b74231316eb7d04513a63d196ffa GIT binary patch literal 2593 zcmc&$QBM;=5S}e9Z4U%RQB=UKineNc32KaDOpt0qQstr8#K-O3wq3m5UiS7d{2G6T z2`2jPk2204wJr48Al2~D+r68aZ)U#R`K~{I9exLZXYe2kDFTn1%CVJfNNv}mMtBfv z-U;oB68l^$Cj5bI&z^-efk)hp?9YL)n?i-!>^#xfTeltA=`i2zqrGM!Cy)}7K)HJQ zY}-2<1g3=_L^>p}TJ4v#y|W!Z-Hf!X%2tcJ=$VtQ>|n_U1fExqm)2prZGRFz$Bl5X zIniu##eFT97o+ZULrub$!Wa4#fvIAtP9VJ{U7m$`0`q%ppV=PsTlO2Jq{_i1GPUx- zS3H#7K6fehjTB%8>C*rS^^nIG)XML+ITf8iDov$ol|7-g$F=lh&aoWoFyEJ&HaPu* zbu0*bDI>Y%m}avxG?!iTf)Yc=@stoiwWN&dgMeH4NkUI@nvlxMd%UR=3`h(WAvG*8 z+7#S#t-KPg_Gx`5s5?GCDxs#y*yxSV@L5gB^{?K+xnv#9papYqc@}2i3W3F9wLd^L zt%Tp&FatJU#kqVRbsAjlGMpI#3svbbug;V(_uYqS-4>_OK3R9(^(=Qo6GjG=WZ?Pv~d{30O55DTlumW@wlC_4VeiYz96HMFPux>#!aYn0+V0 z5CvfuKSCiC06)I?2gUp{FpXD$Eac)f4;HQ&^q7HJyk5Y&C+JCVwZ6gJ$AybuVc`ef zrC<@S)3GHFS8;Fr(F?A@Qf$8tHwF+g#ug*oOh70kAP`uA)d2)k?`VXzM1)%-5NJXT d4-*k?kKo}>0>XL%LJHPmHts Date: Thu, 27 Aug 2026 17:08:14 -0700 Subject: [PATCH 2/4] format and links --- Docs/3_Specifics/3.6_GainsTuning.md | 32 +++++++++++++++++++---------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/Docs/3_Specifics/3.6_GainsTuning.md b/Docs/3_Specifics/3.6_GainsTuning.md index 78c2a06..b584a6a 100644 --- a/Docs/3_Specifics/3.6_GainsTuning.md +++ b/Docs/3_Specifics/3.6_GainsTuning.md @@ -1,26 +1,26 @@ -Understanding PID and Feedforward Control +# Understanding PID and Feedforward Control In the previous article, we introduced feedback and feedforward control and explained why combining them is useful for tuning FRC mechanisms. Now, we need to understand how to actually use these constants in our control systems. -There are two main groups of constants to understand +### There are two main groups of constants to understand -The feedforward gains include +The feedforward gains include: kS - static friction kV - velocity kA - acceleration kG - gravity -The feedback gains include + +The feedback gains include: kP - proportional kI - integral kD - derivative - Feedforward is proactive. We predict how much motor output is needed and apply that output immediately. Feedback is reactive. the controller looks at what the mechanism is actually doing, compares it to the desired outcome, and corrects the error. -Feedforward constants: +## Feedforward constants: kS is static friction. kS represents the amount of motor output required to overcome static friction and get the mechanism to move. if kS is too low the mechanism may not actually move or not move as much as it should because it's not outputting enough to overcome static friction @@ -33,7 +33,7 @@ not all mechanisms need kA but important for some kG is gravity. kG represents the amount of motor output required to counteract gravity. only really useful when gravity actually affects a mechanism like an elevator or arms need it to account for the constant downward force exerted on it by gravity. -Feedback constants +## Feedback constants kP is proportional. kP is based on the current error. if the mechanism is far away from its target the controller will apply a large correction and if its close it will apply a smaller correction. if kP is too low the mechanism responds slowly and can't keep up with the target accurately if kP is too high the mechanism may overshoot, oscillate, or become unstable @@ -43,6 +43,8 @@ kD is based on how quickly the error is changing, it is looking at the rate of c low kD can make the mechanism overshoot or oscillate. high kD can make the mechanism too slow to react or react excessively. +## Tuning Process + Understanding these things is the first step but now we will include a guide on tuning for practical use. In general you should not tune everything at once. A solid approach is making feedforward reasonably accurate, then using feedback to reduce the rest of the error. The process and constants you will need depends on the mechanism because they have different physics. @@ -50,7 +52,7 @@ in general the order for tuning is kS, kV, kA, kG, kP, kD, kI (note: not all may The procedure can depend on the motor controller, control mode, and mechanism so it's important to distinguish between velocity and position control. For example if you're tuning a roller to maintain a certain RPM then you're dealing with velocity. However if you're dealing with an elevator that needs to move to particular heights that's position control. -Elevator tuning: +### Elevator tuning: tune kS determine how much output is necessary to overcome static friction and get the elevator moving. The voltage when the mechanism just starts moving is approximately kS. tune kV @@ -63,17 +65,25 @@ increase kP until elevator reaches target quickly and accurately, it its oversho tune kD if the elevator overshoots or oscillates as it approaches the target adding kD may help. you can tune it by increasing it until the elevator settles smoothly without becoming excessively sluggish kI may not be necessarily but if there's consistently small position error it may help Arm tuning -similar to elevator processes with kS, kV, kA if necessary, kG(when arm i horizontal), kP, kD, and kI is necessary +similar to elevator processes with kS, kV, kA if necessary, kG(when arm is horizontal), kP, kD, and kI is necessary -roller tuning +### roller tuning typical rollers only need kS, kV, kA, kP, and kD -Additional tips: +## Additional tips: using tools such as SysID (see sysId article) rather than this process can give you kS, kV, and kA your tuning process and gains need to make sense for the control system your using whether that position, velocity, voltage, etc many motor controllers support control slots allowing you to store and select different gains this may be helpful for situations where there is not one perfect set of gains for every situation such as carrying a game piece vs not carrying a game piece +### Resources + +- [WPILib Intro to PID](https://docs.wpilib.org/en/stable/docs/software/advanced-controls/introduction/introduction-to-pid.html) +- [WPILib PID Control](https://docs.wpilib.org/en/stable/docs/software/advanced-controls/controllers/pidcontroller.html) +- [WPILib PIDController](https://github.wpilib.org/allwpilib/docs/release/java/edu/wpi/first/math/controller/PIDController.html) + + + From 19dbb649530e2f1807fb30438fcdb648b7ff1fb6 Mon Sep 17 00:00:00 2001 From: vivi-o Date: Thu, 27 Aug 2026 17:36:38 -0700 Subject: [PATCH 3/4] small edits --- Docs/3_Specifics/3.6_GainsTuning.md | 82 +++++++++++++++-------------- 1 file changed, 43 insertions(+), 39 deletions(-) diff --git a/Docs/3_Specifics/3.6_GainsTuning.md b/Docs/3_Specifics/3.6_GainsTuning.md index b584a6a..c0fd52f 100644 --- a/Docs/3_Specifics/3.6_GainsTuning.md +++ b/Docs/3_Specifics/3.6_GainsTuning.md @@ -1,80 +1,84 @@ # Understanding PID and Feedforward Control -In the previous article, we introduced feedback and feedforward control and explained why combining them is useful for tuning FRC mechanisms. Now, we need to understand how to actually use these constants in our control systems. +In the [controls article](3.1_ControlsIntro.md), we introduced feedback and feedforward control and explained why combining them is useful for tuning FRC mechanisms. Now, we need to understand how to actually use these constants in our control systems. ### There are two main groups of constants to understand The feedforward gains include: -kS - static friction -kV - velocity -kA - acceleration -kG - gravity +- kS - static friction +- kV - velocity +- kA - acceleration +- kG - gravity The feedback gains include: -kP - proportional -kI - integral -kD - derivative +- kP - proportional +- kI - integral +- kD - derivative Feedforward is proactive. We predict how much motor output is needed and apply that output immediately. Feedback is reactive. the controller looks at what the mechanism is actually doing, compares it to the desired outcome, and corrects the error. - ## Feedforward constants: kS is static friction. kS represents the amount of motor output required to overcome static friction and get the mechanism to move. -if kS is too low the mechanism may not actually move or not move as much as it should because it's not outputting enough to overcome static friction -if kS is too high the mechanism can jump when it starts moving because the output is more than necessary for overcoming static friction -kS is particularly important for mechanisms with significant friction including arms, elevators, and some other gear-driven mechanisms -kV is velocity. kV represents how much motor output is required to maintain a particular velocity. As a mechanism moves faster it will require more motor voltage to maintain that speed and kV shows that relationship. kV is important for any machismo where we care about controlling velocity. -kA is acceleration. kA represents how much additional motor output is needed to accelerate the mechanism. -a mechanism that is already moving at a constant velocity does not need as much output as a mechanism that is rapidly trying to speed up for example, an elevator moving upward at a constant velocity needs enough output to overcome gravity while maintaining its speed so if we want it to accelerate upward we need more output which is represented by kA. -not all mechanisms need kA but important for some +- if kS is too low the mechanism may not actually move or not move as much as it should because it's not outputting enough to overcome static friction +- if kS is too high the mechanism can jump when it starts moving because the output is more than necessary for overcoming static friction +- kS is particularly important for mechanisms with significant friction including arms, elevators, and some other gear-driven mechanisms + +kV is velocity. kV represents how much motor output is required to maintain a particular velocity. As a mechanism moves faster it will require more motor voltage to maintain that speed and kV shows that relationship. +- kV is important for any mechanism where we care about controlling velocity. + +kA is acceleration. kA represents how much additional motor output is needed to accelerate the mechanism. A mechanism that is already moving at a constant velocity does not need as much output as a mechanism that is rapidly trying to speed up for example, an elevator moving upward at a constant velocity needs enough output to overcome gravity while maintaining its speed so if we want it to accelerate upward we need more output which is represented by kA. +- not all mechanisms need kA but important for some + kG is gravity. kG represents the amount of motor output required to counteract gravity. -only really useful when gravity actually affects a mechanism like an elevator or arms need it to account for the constant downward force exerted on it by gravity. +- only really useful when gravity actually affects a mechanism like an elevator or arms need it to account for the constant downward force exerted on it by gravity (i.e not things like rollers). ## Feedback constants kP is proportional. kP is based on the current error. if the mechanism is far away from its target the controller will apply a large correction and if its close it will apply a smaller correction. -if kP is too low the mechanism responds slowly and can't keep up with the target accurately -if kP is too high the mechanism may overshoot, oscillate, or become unstable +- if kP is too low the mechanism responds slowly and can't keep up with the target accurately +- if kP is too high the mechanism may overshoot, oscillate, or become unstable + kI is based on the accumulated error over time. An integral is the area under a curve or in our case the error accumulated over time so if error gradually builds up in our system I can help with that. -kI is often not needed and will be set to 0 or a very small value in most cases. This is because kP and kD are often good enough. If kI is too high it can cause overshooting. +- kI is often not needed and will be set to 0 or a very small value in most cases. This is because kP and kD are often good enough. If kI is too high it can cause overshooting. + kD is based on how quickly the error is changing, it is looking at the rate of change of the error or how quickly it's approaching the target. -low kD can make the mechanism overshoot or oscillate. -high kD can make the mechanism too slow to react or react excessively. +- low kD can make the mechanism overshoot or oscillate. +- high kD can make the mechanism too slow to react or react excessively. ## Tuning Process -Understanding these things is the first step but now we will include a guide on tuning for practical use. - In general you should not tune everything at once. A solid approach is making feedforward reasonably accurate, then using feedback to reduce the rest of the error. The process and constants you will need depends on the mechanism because they have different physics. - -in general the order for tuning is kS, kV, kA, kG, kP, kD, kI (note: not all may be needed) +Understanding these things conceptually is the first step, but now we will include a guide on tuning for practical use. In general, you should not tune everything at once. A solid approach is making feedforward reasonably accurate, then using feedback to reduce the rest of the error. The process and constants you will need depends on the mechanism because they all have different physics. The procedure can depend on the motor controller, control mode, and mechanism. For example, it's important to distinguish between velocity and position control. If you're tuning a roller to maintain a certain RPM then you're dealing with velocity. However, if you're dealing with an elevator that needs to move to particular heights that's position control. -The procedure can depend on the motor controller, control mode, and mechanism so it's important to distinguish between velocity and position control. For example if you're tuning a roller to maintain a certain RPM then you're dealing with velocity. However if you're dealing with an elevator that needs to move to particular heights that's position control. +In general, the order for tuning is: kS, kV, kA, kG, kP, kD, kI (note: not all may be needed) ### Elevator tuning: tune kS -determine how much output is necessary to overcome static friction and get the elevator moving. The voltage when the mechanism just starts moving is approximately kS. +- determine how much output is necessary to overcome static friction and get the elevator moving. The voltage when the mechanism just starts moving is approximately kS. tune kV -determine the kv by entering different velocities and determining how much kV is needed to maintain those. +- determine the kV by entering different velocities and determining how much kV is needed to maintain those. tune kA +- pretty much tune kG -increase kG until it counteract gravity (i.e enough to hold its position, not fall or rise when its supposed to hold still) +- increase kG until it counteract gravity (i.e enough to hold its position, not fall or rise when its supposed to hold still). tune kP -increase kP until elevator reaches target quickly and accurately, it its overshooting or oscillating its probably too high -tune kD if the elevator overshoots or oscillates as it approaches the target adding kD may help. you can tune it by increasing it until the elevator settles smoothly without becoming excessively sluggish -kI may not be necessarily but if there's consistently small position error it may help -Arm tuning +- increase kP until elevator reaches target quickly and accurately, it its overshooting or oscillating its probably too high. +tune kD +- if the elevator overshoots or oscillates as it approaches the target adding kD may help. You can tune it by increasing it until the elevator settles smoothly without becoming excessively sluggish. +tune kI +- kI may not be necessarily but if there's consistently small position error it may help. + +### Arm tuning: similar to elevator processes with kS, kV, kA if necessary, kG(when arm is horizontal), kP, kD, and kI is necessary -### roller tuning +### roller tuning: typical rollers only need kS, kV, kA, kP, and kD ## Additional tips: -using tools such as SysID (see sysId article) rather than this process can give you kS, kV, and kA -your tuning process and gains need to make sense for the control system your using whether that position, velocity, voltage, etc - -many motor controllers support control slots allowing you to store and select different gains this may be helpful for situations where there is not one perfect set of gains for every situation such as carrying a game piece vs not carrying a game piece +- using tools such as SysID (see sysId article) rather than this process can give you kS, kV, and kA +- your tuning process and gains need to make sense for the control system your using whether that position, velocity, voltage, etc +- many motor controllers support control slots allowing you to store and select different gains this may be helpful for situations where there is not one perfect set of gains for every situation (such as carrying a game piece vs not carrying a game piece) ### Resources From e364705129c58a38491f7f49fa5466c2a9055108 Mon Sep 17 00:00:00 2001 From: vivi-o Date: Thu, 27 Aug 2026 17:42:43 -0700 Subject: [PATCH 4/4] formatting again --- Docs/3_Specifics/3.6_GainsTuning.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Docs/3_Specifics/3.6_GainsTuning.md b/Docs/3_Specifics/3.6_GainsTuning.md index c0fd52f..90d7d9d 100644 --- a/Docs/3_Specifics/3.6_GainsTuning.md +++ b/Docs/3_Specifics/3.6_GainsTuning.md @@ -56,16 +56,22 @@ In general, the order for tuning is: kS, kV, kA, kG, kP, kD, kI (note: not all m ### Elevator tuning: tune kS - determine how much output is necessary to overcome static friction and get the elevator moving. The voltage when the mechanism just starts moving is approximately kS. + tune kV - determine the kV by entering different velocities and determining how much kV is needed to maintain those. + tune kA -- pretty much +- depends on how quickly we need the mechanism to accelerate, try increasing kA until it works + tune kG - increase kG until it counteract gravity (i.e enough to hold its position, not fall or rise when its supposed to hold still). + tune kP - increase kP until elevator reaches target quickly and accurately, it its overshooting or oscillating its probably too high. + tune kD - if the elevator overshoots or oscillates as it approaches the target adding kD may help. You can tune it by increasing it until the elevator settles smoothly without becoming excessively sluggish. + tune kI - kI may not be necessarily but if there's consistently small position error it may help.