我正在尝试制作一个连接超声波传感器的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();
}
}
答案 0 :(得分:4)
好的,从外观上看,你的代码可能没有做你想要的。 (将来,当在Stack Overflow上写一个问题时,请详细说明预期的行为是什么,以及你看到的错误行为。无论如何,这些通常是我们会问你的前两个问题。)
首先,您需要确保正确设置NXT套件,B和C上的两个电机以及S1上的传感器。如果是这样,继续阅读。
电机命令:
try {
Motor.B.rotate(-1500, true);
Motor.C.rotate(-1500, true);
} catch (Exception E) {}
看起来他们是有效的电机命令......但是等等!您使用的是两轮机器人,电机连接到两个指向相反方向的车轮?但是你的电机极限角度使用相同的距离和方向!如果你的轮子彼此相对,那么除了使机器人旋转一圈之外什么都不做。
注意:由于您的电机配置正确,如评论中所述,请忽略此部分。
如果你通过将正面变为负面来改变其中一个电机的方向,那么你将让它们一起工作以向前移动机器人(或者如果你改变了错误的机器人则向后移动!)
另外,请记住将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();
}
}
现在,这段代码并不完美;它可能会在光滑的表面上向前和向后摆动(由于施加的扭矩的差异可能会略微向左或向右转动),或者如果传感器错过了正确的位置并且机器人超过了它。
此代码也不会等到机器人稳定在给定位置,直到传感器首次报告正确的位置。同样,如果车轮没有良好的牵引力,电机设置为平稳加速,或者电机运行速度过高,可能会导致滑动。
要纠正这些缺陷,你需要一种更先进的反馈回路来解决加速度和滑动问题,你需要等到机器人在短时间内稳定在正确的位置才能停止电机。
然而,这应该让你朝着正确的方向前进,可以这么说。
编辑更正了驱动电机的方向性,如注释中所述。