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 を使用して、5000 ミリ秒を超えると停止する while ループを作成しようとしましたが、うまくいかないようです。

これはフィンチ 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

あなたは実際の計算を見逃しています。値が計算された瞬間から経過した時間WaitingTime(クラスのロード時に発生) と、ループ条件で発生した時間を実際に確認する時間を確認する必要があります (Andy が回答で述べたように)。System.currentTimeMillis() ドキュメントに従って:

戻り値: 現在時刻と UTC 1970 年 1 月 1 日午前 0 時との差 (ミリ秒単位)。

これWaitingTimeは待機時間ではなく、エポック時間とも呼ばれる 1 月 1 日以降の時間です (これは歴史的な理由によるものです)。経過時間の見積もりを得るには、両方の値の違いを確認する必要があります。

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

startTimeあなたの最初の時間はどこですか.

また、タイム ウィンドウでさらに精度が必要な場合はSystem.nanoTime()を使用するか、 TimeUnit .SECONDS メソッドを使用して秒をミリ秒に変換すると、より大きなウィンドウを処理する際の読みやすさが向上します。

于 2015-02-06T00:11:35.780 に答える