gpt4 book ai didi

java - LeJOS NXT编程声波传感器

转载 作者:行者123 更新时间:2023-11-29 03:04:32 43 4
gpt4 key购买 nike

我正在尝试制作附有超声波传感器的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();
}
}

最佳答案

假设条件

好的,从外观上看,您的代码可能没有执行您想要的操作。 (将来,在编写有关堆栈溢出的问题时,请详细说明预期的行为是什么,以及您看到的错误行为。无论如何,这些通常是我们会问您的前两个问题。)

首先,您将要确保正确安装了NXT套件,两个电动机分别位于B和C上,传感器位于S1上。如果是这样,请继续阅读。

代码解释

电机命令:

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


看起来它们是有效的电机命令...但请等待!您使用的是两轮机器人,其电机连接到指向相反方向的两个轮吗?但是,您要为电动机的极限角使用相同的距离和方向!如果您的轮子彼此相对,那么这只会使机器人旋转一圈而无济于事。

注意:由于按照注释中的说明正确配置了电动机,因此请忽略此部分。

robot spins in a circle

如果您通过将正数更改为负数来更改其中一台电动机的方向,则将使它们同时工作以使机器人向前(或向后移动,如果您更改了错误的电动机!)

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

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


根据Javadoc(强调我的意思),它以非常特定的方式实现了此功能:


  如果 immediateReturn为true,则方法立即返回,并且电动机自行停止。
  
  如果在达到极限之前调用了任何电动机方法,则会取消旋转。


第一句话意味着这可以达到我们想要的目的:它告诉我们的电机自己找到合适的极限角,但不要让我们的程序等待它。但是,第二句话意味着如果调用了任何其他电动机命令,它将停止移动到给定的极限角。是啊,没错。接下来的几行使我们停止移动电动机,而按其说的去做。

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

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();
}
}


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

该代码也不会等到机器人稳定在给定位置,才等到传感器首先报告正确的位置。同样,如果车轮没有适当的牵引力,电动机设置为平稳加速或电动机以太高的速度运行,这可能会导致稍微滑动。

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

但是,可以这么说,这应该使您朝正确的方向前进。

编辑修正了驱动电机的方向性,如注释中所述。

关于java - LeJOS NXT编程声波传感器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32718197/

43 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com