0

我目前正在Lego NXT 2.0使用leJOS 0.9.1 beta固件进行编程。

我有几个不同的传感器,比如颜色传感器和超声波传感器。

我正在使用while循环使机器人向前行驶,直到撞到墙上。但是,出于某种原因,我不喜欢这种方法,而是想实现一个监听器。然而,一位 leJOS 开发人员写道,不建议使用侦听器模型,我应该使用线程来轮询超声波传感器的值。

现在我想知道使用 while 循环的实现到底有多糟糕(操作系统方面,如浪费资源)以及线程模型如何更有益(和实现)?

MWE:

public class SensorTest {
    static UltrasonicSensor sonic;
    static DifferentialPilot pilot;
    public static final int DISTANCE = 20;

    public static void main(String[] args){
        sonic = new UltrasonicSensor(SensorPort.S1);
        pilot = new DifferentialPilot(8.5, 25, Motor.C, Motor.B);
        int i = 0;      

        while (i < DISTANCE) {
            pilot.forward();
            i = sonic.getDistance();
        }
        pilot.stop();
      }
}
4

3 回答 3

2

没有任何乐高积木的经验(我真的很嫉妒)你必须问自己一些严肃的问题。

在简单的情况下,以这种方式使用循环可能不是一个糟糕的解决方案,但是随着您添加更多,处理每个请求所需的时间(检查 n 个传感器,执行 n 个操作),它将变成反应较慢。

线程模型可能允许您处理更多数据,但您可能需要考虑需要多少线程以及它们在做什么。

例如,您可以有一个Driver线程,其唯一职责是移动乐高。它会查询多个“传感器”线程以确定它在告诉什么,但每个传感器线程将以自己的速率轮询数据,而不关心其他任何事情。

您还可以反转模型,允许Driver继续移动,直到Sensor线程发出某种警报并告诉Driver它应该改变方向。

我个人会尝试看看我是否可以让线程模型工作(即使对于一个简单的设备),因为它将为将来扩展操作提供更多的灵活性......

归根结底,这将是平衡行为

严重嫉妒!

于 2013-01-29T01:02:08.593 回答
0

现在我想知道使用 while 循环的实现到底有多糟糕(操作系统方面,如浪费资源)以及线程模型如何更有益(和实现)?

“线程模型”是一个while循环,在主线程以外的某个线程上执行。如果您担心资源消耗,您可以让线程在它再次轮询值之前进入某个固定时间间隔的睡眠。

至于这是如何实现的,您必须通读 . API,但是在标准的 java 程序中,如果您使用的是较新的 JDK,您只需创建一个实现该Runnable接口的类,并将该对象传递给一个线程执行人。

于 2013-01-29T00:56:24.270 回答
0

使用线程与轮询取决于您的情况。我想在对微控制器进行编程时,线程更像是一个中断。使用线程(或中断),您可以更好地模块化代码,使其更高效。看到这个线程-

基于轮询或中断的方法

于 2013-01-29T00:59:35.093 回答