0

如果没有光通过任何光传感器,我正试图让我的代码退出。

import edu.cmu.ri.createlab.terk.robot.finch.Finch;


public class RunProgram {

public static Finch LeFinch = new Finch();

public static boolean endProgram = false;

private static long WaitingTime = System.currentTimeMillis();

public static void main(String args[])
{

    LightSensors lightsensor = new LightSensors();

//do {

        while(ObjectSensor.Obstacle()==false || WaitingTime < 5000)
        {

            if (lightsensor.leftsensor() == true && lightsensor.rightsensor() == true) 
            {
                Movement.forward();
            } 
            else if (lightsensor.leftsensor() == true && lightsensor.rightsensor() == false) 
            {
                Movement.left();
                System.out.println("LEFT");
            } 
            else if (lightsensor.leftsensor() == false && lightsensor.rightsensor() == true) 
            {
                Movement.right();
                System.out.println("RIGHT");
            }
            else if (lightsensor.leftsensor() == false && lightsensor.rightsensor() == false) 
            {
                Movement.stop();
            } 

        }System.out.println("Object Detected");

//  } while(endProgram == false);

}

我曾尝试使用 System.currentTimeMillis 并创建一个 while 循环,该循环将在超过 5000 毫秒后停止运行,但这似乎不起作用。

这是使用 finch api。

我已经更新了代码,我决定使用一个计数器,一旦达到 5000+ 就终止应用程序

但是,一旦灯光照射到雀上,这个值就不会重置。

static long counterTime = 0;

while(counterTime < 5000)
        {

            if (lightsensor.leftsensor() == true && lightsensor.rightsensor() == true) 
            {
                Movement.forward();
                counterTime = 0;
            } 
            else if (lightsensor.leftsensor() == true && lightsensor.rightsensor() == false) 
            {
                Movement.left();
                System.out.println("LEFT");
                counterTime = 0;
            } 
            else if (lightsensor.leftsensor() == false && lightsensor.rightsensor() == true) 
            {
                Movement.right();
                System.out.println("RIGHT");
                counterTime = 0;
            }
            else 
            {
                Movement.stop();
                counterTime = System.currentTimeMillis() - startTime;
                System.out.println(counterTime);
            }

        }endProgram = true;
4

3 回答 3

0

您需要更新上次看到光的时间(或您想用来重置超时的任何其他事件):

long lastLightTime = System.nanoTime();
while(ObjectSensor.Obstacle()==false
    || System.nanoTime()-lastLightTime < TimeUnit.SECONDS.toNanos(5)) {
  if (lightsensor.leftsensor() || lightsensor.rightsensor()) {  // Or other condition to reset timeout
    lastLightTime = System.nanoTime();
  }

  // The rest of your loop...
}

为什么System.nanoTime()?这是测量经过时间的正确方法。(请参阅如何在 Java 中测量经过的时间?)。

于 2015-02-05T23:21:41.777 回答
0

几件事:

1)确保更新经过时间:

public class RunProgram {

  private static long initialTime = System.currentTimeMillis();

  public static void main(String args[]) {
    LightSensors lightsensor = new LightSensors();

    while(ObjectSensor.Obstacle()== false && (SystemcurrentTimeMillis() - initialTime < 5000) {
       ...

2)你想在“没有障碍”和“经过的时间<5000”时继续循环。换句话说,如果EITHER为真,那么你想退出“while()”循环。

3)当“没有光”或“超过时间”时,您可能还想设置“endProgram”“true ”

于 2015-02-05T23:22:44.740 回答
0

你错过了实际的计算。您需要检查自WaitingTime计算值以来经过的时间(发生在类负载上)以及实际验证时间的时间,这发生在循环条件下(就像安迪在他的回答中所说的那样)。根据 System.currentTimeMillis() 文档:

返回: 当前时间与 UTC 1970 年 1 月 1 日午夜之间的差异,以毫秒为单位。

所以WaitingTime不是等待时间,只是从 1 月 1 日开始的时间,也称为大纪元时间(这是由于历史原因)。您需要验证两个值之间的差异,以便对经过的时间进行估计:

while (... System.currentTimeMillis() - startTime < 5000) {
 // 

startTime你的初始时间在哪里。

此外,如果您发现自己需要额外的时间窗口精度或TimeUnit .SECONDS 方法将秒转换为毫秒,您可能更喜欢使用System.nanoTime(),这可以提高处理较大窗口时的可读性。

于 2015-02-06T00:11:35.780 回答