【问题标题】:LeJOS NXT Programming Sonic SensorLeJOS NXT 编程声波传感器
【发布时间】:2015-12-19 12:13:33
【问题描述】:

我正在尝试制作一个连接了超声波传感器的 NXT 机器人。它必须一直行驶到距离为 15,然后发动机必须停止。停止后它必须转动,但它不起作用。

import lejos.nxt.*;

public class test {
    public static void main(String [] args) throws InterruptedException {
        UltrasonicSensor ultra = new UltrasonicSensor(SensorPort.S1);
        for (int i = 0; i < 5; i++) {       
            try {
                Motor.B.rotate(-1500 , true);
                Motor.C.rotate(-1500 , true);
            } catch (Exception E){}

            while ( ultra.getDistance() < 15 ) {
                Motor.B.backward();
                Motor.C.backward();
            }

            LCD.clear();
            LCD.drawString("Distance : "+ultra.getDistance(), 0, 0);
        } 

        Button.waitForAnyPress();
    }
}

我的旧代码也不起作用:

import lejos.nxt.*;

public class test {

public static void main(String [] args) throws InterruptedException {
    UltrasonicSensor ultra = new UltrasonicSensor(SensorPort.S1);
    try {
        Motor.B.rotate(-720);
        Motor.C.rotate(-720);

         } catch (Exception E){}

    for (int i = 0; i < 5; i++)
    {
    LCD.drawString("Distance : "+ultra.getDistance(), 0, i);
              Thread.sleep(2000);
         int maxDistance = ultra.getDistance();
         if (maxDistance < 15){
             Motor.B.stop();
             Motor.C.stop();
         }
    }
    Button.waitForAnyPress();
}
}

【问题讨论】:

  • “它不起作用”是什么意思?是否产生了异常或错误,或者机器人做了什么意想不到的事情?
  • 对不起,这真是一个奇怪的描述。问题是它确实检测到墙壁,但如果达到限制 15,它不会停止驱动。就像这样:如果传感器 ping
  • 我在这里没有看到任何与 15 相关的内容。我所看到的只是一些会备份到距离 >= 30 的东西。
  • 对不起,我把 1500 弄糊涂了,我的意思是 30。
  • 自从我使用 LeJOS 已经有一段时间了,所以我可能错了,但是 Motor.x.backward() 不会一直继续下去,直到你明确告诉它停止?

标签: java eclipse nxt lejos-nxj


【解决方案1】:

假设

好的,从表面上看,您的代码可能没有按照您的意愿行事。 (以后在 Stack Overflow 上写问题时,请详细说明预期的行为是什么,以及您看到的错误行为是什么。无论如何,这通常是我们会问您的前两个问题。)

首先,您需要确保您的 NXT 套件已正确设置,两个电机位于 B 和 C,传感器位于 S1。如果是这样,请继续阅读。

代码解读

电机指令:

try {
    Motor.B.rotate(-1500, true);
    Motor.C.rotate(-1500, true);
} catch (Exception E) {}

看起来它们是有效的电机命令...但是等等!您使用的是两轮机器人,电机连接到两个指向相反方向的轮子?但是您使用相同的距离和方向作为电机的极限角度!如果你的轮子相互对立,那么这只会让机器人转一圈。

注意:由于您的电机配置正确,如您的 cmets 中所述,请忽略此部分。

如果您通过将正极更改为负极来更改其中一个电机的方向,那么您将让它们一起工作以向前移动您的机器人(或向后移动,如果您更改了错误的电机!)

另外,请记住将true 作为第二个参数传递

Motor.B.rotate(-1500, true);
Motor.C.rotate(-1500, true);

根据 Javadoc(重点是我的),以非常具体的方式制作此功能:

如果immediateReturn 为真,方法立即返回并且电机自行停止

如果在达到限制之前调用了任何电机方法,则取消旋转。

第一句话的意思是这样做我们想要它:它告诉我们的电机自己找到正确的极限角度,但不要让我们的程序等待它。但是,第二句的意思是如果调用任何其他电机命令,它将停止移动到给定的极限角度。是啊,没错。接下来的几行让我们停止移动马达并按照他们所说的去做。

现在,这段代码有问题有两个原因:

while (ultra.getDistance() < 30) {
    Motor.B.backward();
    Motor.C.backward();
}

首先,这些命令将立即停止执行我们之前的两个电机命令,这基本上意味着电机将直接跳到“向后”并循环,直到距离传感器的读数大于或等于30。这实际上是我们想要的,但我们需要更多...

其次,在您的传感器读取到大于30 的距离后,您的电机永远不会被告知停止!因此,即使您的程序向您显示距离,并等待您的按钮被按下,它仍会继续移动

解决方案

好的,有几件事需要改变:

  • 您的初始运动命令被后面的命令阻止,这些命令告诉它移动到正确的位置。
  • 您的电机不会在应有的时候停止。

以下是您的代码,经过编辑以解决这些问题。我在其中添加了我所做更改的注释,以向您展示我所做的更改。

import lejos.nxt.*;

public class test {
    public static void main(String [] args) throws InterruptedException {
        UltrasonicSensor ultra = new UltrasonicSensor(SensorPort.S1);
        for (int i = 0; i < 5; i++) {

            // No initial motor movement (because it did nothing anyway)

            // We change this to approach from either direction.
            while (ultra.getDistance() != 30) {
                // Check whether it's behind or ahead of it.
                // Assuming that B- and C- increase distance, and B+ and C+ decrease it (depends on robot configuration).
                // This is called a feedback loop, by the way.
                if (ultra.getDistance() < 30) { // Move forward (distance+)
                    Motor.B.backward();
                    Motor.C.backward();
                } else { // Move backward (distance-)
                    Motor.B.forward();
                    Motor.C.forward();
                }
            }

            // We only get here when the distance is right, so stop the motors.
            Motor.B.stop();
            Motor.C.stop();               

            LCD.clear();
            LCD.drawString("Distance : "+ultra.getDistance(), 0, 0);
        }
        Button.waitForAnyPress();
    }
}

现在,这段代码并不完美;它可能会在光滑的表面上向前和向后摆动(由于施加的扭矩不同,它可能会稍微向左或向右转动),或者如果传感器错过了正确的位置并且机器人超出了它。

此代码也不会等到机器人稳定在给定位置,而是等到传感器第一次报告正确的位置。同样,如果车轮没有良好的牵引力、电机设置为平稳加速或电机运行速度过高,这可能会导致滑动。

要纠正这些缺陷,您需要一种更高级的反馈回路来解决加速度和滑移问题,并且您需要等到机器人在正确的位置稳定一小段时间后再停止电机。

但是,可以这么说,这应该会让你朝着正确的方向前进。

EDIT 更正了驱动电机的方向性,如 cmets 中所指定。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-01
    • 1970-01-01
    相关资源
    最近更新 更多