首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >LeJOS NXT编程声传感器

LeJOS NXT编程声传感器
EN

Stack Overflow用户
提问于 2015-09-22 13:28:03
回答 1查看 1.6K关注 0票数 1

我正在尝试制造一个NXT机器人,它连接了超声波传感器。它必须驾驶,直到距离15,然后引擎必须停止。它停止后,它必须转向,但它不能工作。

代码语言:javascript
复制
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();
    }
}

我的旧代码也没用:

代码语言:javascript
复制
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();
}
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-22 14:30:08

假设

好吧,从外观上看,您的代码可能没有做您想做的事情。(将来,当在Stack溢出上写问题时,请详细说明预期的行为,以及您看到的错误行为。这通常是我们要问你的前两个问题。)

首先,您需要确保您的NXT工具包已经安装妥当,您的两个马达在B和C上,传感器在S1上。如果是这样的话,继续阅读。

代码解释

电机指令:

代码语言:javascript
复制
try {
    Motor.B.rotate(-1500, true);
    Motor.C.rotate(-1500, true);
} catch (Exception E) {}

看上去是有效的马达指令..。但是等等!你用的是两轮机器人,马达连接到两个轮子上,指向相反的方向,?但是,您使用的是相同的距离和方向为您的电机极限角!如果你的轮子互相对立,那么这只会使机器人旋转成一个圆圈。

注意:由于您的电机配置正确,如您的注释中所写的,请忽略此部分.

如果你改变了其中一个马达的方向,把正片改为负值,那么你就会让它们一起工作,向前移动(如果你换错了,也可以向后移动!)

同时,请记住,将true作为

代码语言:javascript
复制
Motor.B.rotate(-1500, true);
Motor.C.rotate(-1500, true);

根据Javadoc (重点雷),以一种非常特殊的方式来实现这个功能:

如果immediateReturn为真,则方法立即返回,马达自动停止。 如果在达到限制之前调用任何电机方法,则将取消旋转。

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

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

代码语言:javascript
复制
while (ultra.getDistance() < 30) {
    Motor.B.backward();
    Motor.C.backward();
}

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

第二,当你的传感器读取的距离大于30,你的马达从来没有被告知停止!所以,即使当你的程序显示的距离,并等待你的按钮被按下,它仍然会移动!

解决方案

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

  • 你最初的电机指令被后面的命令屏蔽了,这些命令告诉它移动到正确的位置。
  • 你的马达应该停不下来。

下面是您的代码,编辑以解决其中的每一个问题。我包括了一些我做了修改的笔记,向你们展示了我改变了什么。

代码语言:javascript
复制
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();
    }
}

现在,这段代码并不完美;它可能有在滑面上前后摆动的倾向(由于施加扭矩的不同,它可能会稍微向左或向右转),或者如果传感器没有正确的位置而机器人将其超调。

这个代码也不会等到机器人稳定在给定的位置,直到传感器第一次报告正确的位置。再一次,如果车轮没有足够的牵引力,电机被设定为平稳的加速度,或者如果马达以过高的速度运行,这可能会导致稍微滑动。

为了纠正这些缺陷,你需要一个更先进的反馈回路来解释加速和滑动,你需要等到机器人在正确的位置上稳定很短的时间后才能停止马达。

然而,可以说,这会让你朝着正确的方向前进。

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32718197

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档