創建兩個檔案(TeleOpMode.java, TeleOp_Base.java)
先在Base中設定馬達,並實作scaling function
public abstract class TeleOp_Base extends LinearOpMode {
public DcMotorEx FR, FL, BR, BL;
public void init_hardware() {
FR = hardwareMap.get(DcMotorEx.class, "FR");
FL = hardwareMap.get(DcMotorEx.class, "FL");
BR = hardwareMap.get(DcMotorEx.class, "BR");
BL = hardwareMap.get(DcMotorEx.class, "BL");
FR.setDirection(DcMotorSimple.Direction.REVERSE);
BR.setDirection(DcMotorSimple.Direction.REVERSE);
FR.setMode(DcMotor.RunMode.RUN_WITHOUT_ENCODER);
FL.setMode(DcMotor.RunMode.RUN_WITHOUT_ENCODER);
BR.setMode(DcMotor.RunMode.RUN_WITHOUT_ENCODER);
BL.setMode(DcMotor.RunMode.RUN_WITHOUT_ENCODER);
}
public double scaling_power(double fr, double fl, double br, double bl) {
double max = Math.max(Math.max(Math.abs(fr), Math.abs(fl)), Math.max(Math.abs(br), Math.abs(bl)));
if(max <= 1) {
max = 1;
}
return max;
}
}
TeleOpMode
public class TeleOpMode extends TeleOp_Base {
double drive, turn, strafe;
double fr, fl, br, bl, scale;
@Override
public void runOpMode() throws InterruptedException {
init_hardware();
waitForStart();
while(opModeIsActive()) {
drive = -gamepad1.left_stick_y; //前進
turn = gamepad1.right_stick_x; //自旋
strafe = gamepad1.left_stick_x; //平移
fr = forward - rotate - strafe;
fl = forward + rotate + strafe;
br = forward - rotate + strafe;
bl = forward + rotate - strafe;
scale = scaling_power(fr, fl, br, bl);
FR.setPower(fr/scale);
FL.setPower(fl/scale);
BR.setPower(br/scale);
BL.setPower(bl/scale);
}
}
}