基于命令的Java:从命令中的子系统访问方法(Java)
这是我第一次使用Java,我似乎被卡住了。我试图在命令(DriveStright)中从一个子系统(传动系)访问一个方法(getHeading),但当我尝试基于命令的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
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
...