我想强制一个方法在一定时间后结束,即使它还没有完成它的任务。我该怎么做呢?
编辑(添加说明和代码): 我正在使用Android Studio为FTC(第一次技术挑战赛)机器人竞赛编程一个机器人。为了控制机器人,我使用的是FTC SDK(见https://github.com/ftctechnh/ftc_app)。
该方法适用于特定距离然后停止,但在停止后通过将所有电机的功率设置为零,它似乎挂起并且没有调用后续方法。目前,它应该只允许电机在退出之前停止一秒钟,但它似乎仍然停留在将电机功率设置为零的方法的第一次调用(setPower)。出于这个原因,我希望能够在运行一段时间后终止setPower,以便我的方法可以退出并且可以调用后续方法。
这是我的方法:
public void moveLine(DcMotor m1, DcMotor m2, DcMotor m3, DcMotor m4, double distance /* distance to move in meters */, double motorPower /* power to set the motors */) {
final double SPROCKET_CIRCUMFRENCE = Math.PI * 0.0652; //calculates the circumference of the sprocket
final int ENCODER_CPR_NR60 = 1680; //encoder counts for NeveRest 60
//final static int ENCODER_CPR_NR40 = 1120; //encoder counts for NeveRest 40
double amountOfRotationsCalc = distance / SPROCKET_CIRCUMFRENCE; //calculates the amount of rotations to move to reach the target distance
double amountOfEncUnitsCalc = ENCODER_CPR_NR60 * amountOfRotationsCalc; //calculates the amount of encoder units to move
//this gets the sum of the encoder positions of the drive motors
int currentEncPosSum = m1.getCurrentPosition() + m2.getCurrentPosition() + m3.getCurrentPosition() + m4.getCurrentPosition();
//this gets the average encoder position
int currentEncPosAvg = currentEncPosSum / 4;
//if the robot is supposed to be moving forward (positive distance), the motors will be set to positive values
if (distance > 0) {
//it may make sense to make this a while loop. Will this fix the issue?
if (currentEncPosAvg < amountOfEncUnitsCalc) {
m1.setPower(motorPower);
m2.setPower(motorPower);
m3.setPower(motorPower);
m4.setPower(motorPower);
} else {
//these stop the robot. Without them, it continues to move.
long start = System.currentTimeMillis();
long end = start + 1000;
while (System.currentTimeMillis() < end) {
m1.setPower(0);
m2.setPower(0);
m3.setPower(0);
m4.setPower(0);
}
return; //this is supposed to exit this method
}
} else {
//this is essentially the opposite of the code for going forwards
if (currentEncPosAvg > amountOfEncUnitsCalc) {
m1.setPower(-motorPower);
m2.setPower(-motorPower);
m3.setPower(-motorPower);
m4.setPower(-motorPower);
} else {
//these stop the robot. Without them, it continues to move.
long start = System.currentTimeMillis();
long end = start + 1000;
while (System.currentTimeMillis() < end) {
m1.setPower(0);
m2.setPower(0);
m3.setPower(0);
m4.setPower(0);
}
return;
}
}
}
答案 0 :(得分:1)
long beginning = System.currentTimeMillis();
long end=beginning + yourTimeInMilliseconds;
while (end > System.currentTimeMillis()){
//your code here
}
我相信这就是你的意思。
如果您需要,可以做一些澄清: 开头是以毫秒为单位的当前时间。 结束时显然是结束了。 (开始时间加延迟) 虽然时间仍然小于设定的结束时间,但代码仍在继续。
答案 1 :(得分:0)
我知道这个问题有点旧,但在最新的ftc_app Android SDK中,建议团队使用ElapsedTime类的时间感知方法和程序。
暂停opmode时要考虑的最重要的事情是,当在驾驶台应用程序上按下停止按钮时,您仍然可以将其关闭。你可以通过在while条件中包含opModeIsActive()方法来确保这一点
在我们的团队中,我们有一种暂停OpModes的方法,看起来像这样。我们在用于库目的的单独类中声明了这一点。
public static void pauseOpMode(LinearOpmode op, ElapsedTime et, double waitTime){
double startTime = et.milliseconds();
while (op.opModeIsActive() && et.milliseconds() < startTime + waitTime){}
}
现在这个方法存在,在我们的OpMode中我们可以创建一个Elapsed time Object并将必要的参数传递给暂停OpMode所需的函数
class someOpMode extends LinearOpMode{
ElapsedTime gameTimer = new ElapsedTime();
@Override
public void RunOpMode(){
//pause program for 5 seconds
pauseOpMode(this,gameTimer,5000);
}
}