基于命令的Java:从命令中的子系统访问方法(Java)

基于命令的Java:从命令中的子系统访问方法(Java),java,methods,command,subsystem,Java,Methods,Command,Subsystem,这是我第一次使用Java,我似乎被卡住了。我试图在命令(DriveStright)中从一个子系统(传动系)访问一个方法(getHeading),但当我尝试heading=Robot.DriveTrain.getHeading()时,我不断得到错误,即“类型子系统的getHeading(double)未定义”。这是命令: public class DriveStraight extends Command { private double speed; private doubl

这是我第一次使用Java,我似乎被卡住了。我试图在命令(DriveStright)中从一个子系统(传动系)访问一个方法(getHeading),但当我尝试
heading=Robot.DriveTrain.getHeading()时,我不断得到错误,即“类型子系统的getHeading(double)未定义”。这是命令:

public class DriveStraight extends Command {

    private double speed;
    private double duration;
    private double heading;

    public DriveStraight(float driveSpeed, float duration) {
        requires(Robot.DriveTrain);
        **heading = Robot.DriveTrain.getHeading();**
    }

    // Called just before this Command runs the first time
    protected void initialize() {
        setTimeout(duration);
    }

    // Called repeatedly when this Command is scheduled to run
    protected void execute() {
        **float currentheading = Robot.DriveTrain.getHeading();**
        Robot.DriveTrain.arcadeDrive(speed, (heading - currentheading) * 0.08);
    }
这就是子系统:

public class DriveTrain extends Subsystem {
    AnalogGyro gyro;

    RobotDrive drive;
    VictorSP frontLeftMotor, rearLeftMotor, frontRightMotor, rearRightMotor;

    public DriveTrain() {
        frontLeftMotor = new VictorSP(RobotMap.frontLeftMotor);
        rearLeftMotor = new VictorSP(RobotMap.rearLeftMotor);
        frontRightMotor = new VictorSP(RobotMap.frontRightMotor);
        rearRightMotor = new VictorSP(RobotMap.rearRightMotor);

        gyro = new AnalogGyro(RobotMap.analogGyro);
        gyro.setSensitivity(0.00666);
        gyro.calibrate();
    }

    public void arcadeDrive(float speed, float turn) {
        drive.arcadeDrive(OI.joy.getRawAxis(OI.LEFT_Y_AXIS),
                OI.joy.getRawAxis(OI.RIGHT_X_AXIS), true);
    }

    public void tankDrive(float leftValue, float rightValue) {
        drive.tankDrive(OI.joy.getRawAxis(OI.LEFT_Y_AXIS),
                OI.joy.getRawAxis(OI.RIGHT_Y_AXIS), true);
    }

    public double getHeading() {
        return gyro.getAngle();
    }

    protected void initDefaultCommand() {
        arcadeDrive(0, 0);
    }   
}
我刚从C++开始,所以我想我可能会尝试使用指针,但我不确定。那么,从子系统调用方法的正确方法是什么

谢谢,
Sethra53

您没有在任何地方管理Robot.DriveTrain的实例-编译器会将您对DriveTrain类的所有方法调用视为对
静态方法的调用(这些方法与对象无关,仅与类相关)。您在任何地方定义的最接近的匹配方法是
public-double-getHeading(){
,这是一种实例方法,因此应该在实例上调用。在您的代码中有4个地方是指
机器人。传动系
,我不确定您的
需要
方法做什么,因此很难知道您应该传递给它什么。但是,其他三个地方应该是指实例
机器人传动系统的s

e、 g

但是,如果不了解
所需的方法调用是如何工作的,我不能保证任何一种方法都会“起作用”

更好的方法是将实例传递给
DriveStraight
构造函数

public class DriveStraight extends Command {
    private Robot.DriveTrain driveTrain;

    public DriveStraight(float driveSpeed, float duration, DriveTrain driveTrain) {
        this.driveTrain = driveTrain; // use instance created elsewhere
    ...

尝试这样做
DriveTrain ob=new DriveTrain();double currentheading=ob.getHeading();
不幸的是,运气不好。感谢您的帮助!原来Robot.java中子系统的构造函数声明不正确。现在命令可以访问子系统了。
public class DriveStraight extends Command {
    private Robot.DriveTrain driveTrain;

    public DriveStraight(float driveSpeed, float duration, DriveTrain driveTrain) {
        this.driveTrain = driveTrain; // use instance created elsewhere
    ...