如果没有光通过任何光传感器,我试图让我的代码退出。
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;
答案 0 :(得分: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()
?这是衡量经过时间的正确方法。 (见How do I measure time elapsed in Java?)。
答案 1 :(得分: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)你想继续循环,而没有障碍&#34; AND &#34;经过时间&lt; 5000)。换句话说,如果 EITHER 为真,那么你想退出&#34; while()&#34;循环。
3)你可能还想设置&#34; endProgram&#34; &#34;真&#34;当&#34;没有光&#34; OR &#34;超过了经过的时间&#34;
答案 2 :(得分:0)
您错过了实际计算。您需要检查自计算WaitingTime
值的时间(在类加载时发生)以及实际验证时间的时间,这发生在循环条件上(就像Andy在答案中所说的那样) )。
根据System.currentTimeMillis()文档:
返回: 当前时间与1970年1月1日午夜时间之间的差异,以毫秒为单位。
所以WaitingTime
不是等待时间,只是1月1日以来的时间,也称为大纪元时间(这是由于历史原因)。
您需要验证两个值之间的差异,以便估算经过的时间:
while (... System.currentTimeMillis() - startTime < 5000) {
//
其中startTime
是您的初始时间。
此外,如果您发现自己在时间窗口或System.nanoTime()中需要额外的准确性,则可能更喜欢使用TimeUnit。SECONDS将秒转换为毫秒的方法,这可以提高处理较大窗口时的可读性