我正在尝试制造一个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();
}
}发布于 2015-09-22 14:30:08
假设
好吧,从外观上看,您的代码可能没有做您想做的事情。(将来,当在Stack溢出上写问题时,请详细说明预期的行为,以及您看到的错误行为。这通常是我们要问你的前两个问题。)
首先,您需要确保您的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();
}
}现在,这段代码并不完美;它可能有在滑面上前后摆动的倾向(由于施加扭矩的不同,它可能会稍微向左或向右转),或者如果传感器没有正确的位置而机器人将其超调。
这个代码也不会等到机器人稳定在给定的位置,直到传感器第一次报告正确的位置。再一次,如果车轮没有足够的牵引力,电机被设定为平稳的加速度,或者如果马达以过高的速度运行,这可能会导致稍微滑动。
为了纠正这些缺陷,你需要一个更先进的反馈回路来解释加速和滑动,你需要等到机器人在正确的位置上稳定很短的时间后才能停止马达。
然而,可以说,这会让你朝着正确的方向前进。
编辑校正驱动电机方向性,如注释中所述。
https://stackoverflow.com/questions/32718197
复制相似问题