Tuning OpModes File
The easiest option is to use this: https://gramgra07.github.io/PidTuners-Generator/, which will generate the opmode for you.
If you want to do it manually, here is a template you can use:
import com.dacodingbeast.pidtuners.Constants.GravityModelConstants;
import com.dacodingbeast.pidtuners.Constants.PivotSystemConstants;
import com.dacodingbeast.pidtuners.Constants.SlideSystemConstants;
import com.dacodingbeast.pidtuners.HardwareSetup.ArmMotor;
import com.dacodingbeast.pidtuners.HardwareSetup.Hardware;
import com.dacodingbeast.pidtuners.HardwareSetup.SlideMotor;
import com.dacodingbeast.pidtuners.Simulators.AngleRange;
import com.dacodingbeast.pidtuners.Simulators.SlideRange;
import com.dacodingbeast.pidtuners.utilities.DataLogger;
import com.qualcomm.robotcore.eventloop.opmode.OpMode;
import com.qualcomm.robotcore.eventloop.opmode.OpModeManager;
import com.qualcomm.robotcore.eventloop.opmode.OpModeRegistrar;
import com.qualcomm.robotcore.hardware.DcMotorSimple;
import org.firstinspires.ftc.robotcore.internal.opmode.OpModeMeta;
import CommonUtilities.PIDParams;
class PIDTuningOpModes {
public static Double spoolDiameter = 1.0;
static double frictionRPMSlide = 0.0;
static SlideRange slideRange = SlideRange.fromTicks(0.0,700.0); // found using PSO Direction Debugger
static SlideSystemConstants slideSystemConstants = new SlideSystemConstants(0.0, frictionRPMSlide);
public static SlideMotor slideMotor = new SlideMotor.Builder("Slide", DcMotorSimple.Direction.FORWARD,
new Hardware.HDHex(//TODO
).getMotorSpecs(),
slideSystemConstants, spoolDiameter,slideRange.asArrayList()).pidParams(0.0,0.0,0.0,0.0).build();
static double frictionRPM = 0.0;
static double inertia = 0.0;
static AngleRange angleRange = AngleRange.fromDegrees(0.0, 45.0);
static PivotSystemConstants pivotSystemConstants = new PivotSystemConstants(inertia, frictionRPM, new GravityModelConstants(0.0,0.0,0.0));
public static ArmMotor armMotor = new ArmMotor.Builder("Arm", DcMotorSimple.Direction.FORWARD,
Hardware.YellowJacket.RPM223, pivotSystemConstants, angleRange.asArrayList())
.pidParams(new PIDParams(0.0, 0.0, 0.0, 0.0))
.build();
private static OpModeMeta metaForClass(Class<? extends OpMode> cls, String tag) {
return new OpModeMeta.Builder()
.setName(cls.getSimpleName() + tag)
.setGroup("PIDTuners")
.setFlavor(OpModeMeta.Flavor.TELEOP)
.build();
}
@OpModeRegistrar
public static void register(OpModeManager manager) {
boolean armEN = false;
boolean slidesEN = false;
if (armEN||slidesEN) {
manager.register(metaForClass(PSODirectionDebugger.class, ""), new PSODirectionDebugger(slideMotor, armMotor));
DataLogger.getInstance().initLogger(armEN,slidesEN);
}
if (armEN) {
manager.register(
metaForClass(FrictionTest.class, "Arm"), new FrictionTest(armMotor,angleRange,slideRange)
);
manager.register(
metaForClass(SampleOpMode.class, "Arm"), new SampleOpMode(armMotor)
);
manager.register(
metaForClass(FindPID.class, "Arm"), new FindPID(armMotor)
);
manager.register(
metaForClass(GravityTest.class, "Arm"), new GravityTest(armMotor,angleRange)
);
}
if (slidesEN){
manager.register(
metaForClass(FrictionTest.class,"Slide"), new FrictionTest(slideMotor,angleRange,slideRange)
);
manager.register(
metaForClass(SampleOpMode.class,"Slide"), new SampleOpMode(slideMotor)
);
manager.register(
metaForClass(FindPID.class,"Slide"),new FindPID(slideMotor)
);
}
}
}
Inertia, friction, and gravity values are all set to 0.0 by default, and will be found in a different test.
Last modified: 30 June 2025