Класс AutoRedBuilding объявляет переменные экземпляра leftMotor, rightMotor и foundationServo. Класс RobotMover содержит методы, которые используют эти переменные экземпляра, и я хотел бы вызвать методы RobotMover в AutoRedBuilding.
В частности, переменные экземпляра, объявленные в AutoRedBuilding, являются приводами, такими как двигатели и сервоприводы. RobotMover - это класс, который содержит методы, которые перемещают исполнительные механизмы определенным образом, такие как движение вперед и поворот. Я хотел бы как-то вызвать методы RobotMover в AutoRedBuilding.
Я пытался сделать общедоступными переменные AutoRedBuilding, а затем создать экземпляр RobotMover в AutoRedBuilding, но это не сработало (код ниже). Пример сообщения об ошибке (я получаю одно и то же сообщение об ошибке для всех переменных привода):
RobotMover.java - cannot find symbol
symbol: leftMotor
// Copyright (c) 2019 Terrace BroBots. All rights reserved.
package org.firstinspires.ftc.teamcode;
import com.qualcomm.robotcore.eventloop.opmode.Autonomous;
import com.qualcomm.robotcore.eventloop.opmode.LinearOpMode;
import com.qualcomm.robotcore.hardware.DcMotor;
import com.qualcomm.robotcore.hardware.Servo;
@Autonomous(name="Autonomous: Red Building Zone", group="SkyStone")
public class AutoRedBuilding extends LinearOpMode {
// declare hardware variables
public DcMotor leftMotor;
public DcMotor rightMotor;
public Servo foundationServo;
@Override
public void runOpMode() {
// initialise hardware variables
leftMotor = hardwareMap.get(DcMotor.class, "leftMotor");
rightMotor = hardwareMap.get(DcMotor.class, "rightMotor");
foundationServo = hardwareMap.get(Servo.class, "foundationServo");
// wait for game to start
waitForStart();
/*
THIS IS WHERE RobotMover CLASS METHODS ARE CALLED
*/
RobotMover mover = new RobotMover();
mover.driveForward(10, 1);
mover.driveReverse(10, 1);
mover.turnRight90();
mover.turnLeft90();
mover.clipFoundation();
mover.unclipFoundation();
}
}
// Copyright (c) 2019 Terrace BroBots. All rights reserved.
import java.lang.Math;
public class RobotMover {
// unit conversion rates
private double robotWidthCm = 0;
private double wheelRadiusCm = 0;
private double degree90ToCm = (2 * Math.PI * robotWidthCm) / 4;
private double cmToTicks = 2240 / (2 * Math.PI * wheelRadiusCm);
public void setMotorPowers(double leftPower, double rightPower) {
leftMotor.setPower(leftPower);
rightMotor.setPower(rightPower);
}
public void driveMotorDistances(double cmLeftDistance, double cmRightDistance, double power) {
// reset encoders
leftMotor.setMode(DcMotor.RunMode.STOP_AND_RESET_ENCODER);
rightMotor.setMode(DcMotor.RunMode.STOP_AND_RESET_ENCODER);
// convert cm to ticks and set target position
int tickLeftDistance = (int) Math.round(cmLeftDistance * cmToTicks);
int tickRightDistance = (int) Math.round(cmRightDistance * cmToTicks);
leftMotor.setTargetPosition(tickLeftDistance);
rightMotor.setTargetPosition(tickRightDistance);
// drive until position is reached
setMotorPowers(power, power);
while(leftMotor.isBusy() && rightMotor.isBusy()) {}
setMotorPowers(0, 0);
}
/*
THESE ARE THE METHODS CALLED IN AutoRedBuilding CLASS
*/
public void driveForward(double cmDistance, double power) {
driveMotorDistances(cmDistance, cmDistance, power);
}
public void driveReverse(double cmDistance, double power) {
driveMotorDistances(-cmDistance, -cmDistance, power);
}
public void turnRight90() {
driveMotorDistances(degree90ToCm, 0, 0.8);
}
public void turnLeft90() {
driveMotorDistances(0, degree90ToCm, 0.8);
}
public void clipFoundation() {
foundationServo.setPosition(0.5);
}
public void unclipFoundation() {
foundationServo.setPosition(0);
}
}