【问题标题】:NXT - Tortoise and Hare - follow moving object - TheoreticalNXT - 龟兔赛跑 - 跟随移动物体 - 理论
【发布时间】:2013-04-27 13:58:39
【问题描述】:

我正在检查 Robotics 过去的试卷作为考试前的复习,我发现了一个看起来非常令人困惑的问题。我的部门没有对过去的论文提供答案,所以我无法检查我是否正确。

public class Question4i{

  public static main(){
    float d = 30;
    float k = 1; //If it's equal to 1, why do we need it at all?
    while(true){
      error= GetSonarDepth() - d;
      if(error>100) error=100;
      setVelocity(k * error)
    }
  }

}

然后第二部分是有趣的地方:

这是我的理解:

  1. Robot 和 Hare 放置在同一位置 0
  2. 机器人开始倒车,而野兔匀速前进(误差为负)
  3. 机器人发射声纳
  4. 声纳读数显示距离为 30(误差为 0)
  5. 机器人停止(错误为 0)
  6. 在此调整过程中,野兔的移动距离保持不变
  7. 机器人发射声纳(错误为正)
  8. 机器人将速度提高到 setVelocity(error)
  9. 在此调整过程中,野兔的移动距离保持不变
  10. 机器人根据“旧”声纳读数改变速度,因为在速度改变期间,野兔会走得更远
  11. 因此,机器人总是与期望的距离至少有点太远

我还得出一个结论,如果野兔速度高于机器人,距离会不断增加。不会有 STEADY STATE - 稳定是指保持距离。

问题:我认为在最好的情况下,机器人会在 30 到 30+ 距离之间摆动,但是您将如何更改程序以使其以恒定的 30 厘米距离行进?我也觉得 i 部分中 k 为 1 很可疑,可以吗?

【问题讨论】:

    标签: robotics robot nxt lego lejos-nxj


    【解决方案1】:

    使用比例增益,机器人的前进速度将与其与机器人的距离成正比 - 30 厘米。当我们达到稳定状态时,机器人将在一定距离处匹配野兔的前进速度,使得 (d - 30) * k == 野兔的速度。 IE。在某个恒定距离 > 30 厘米。

    至于如何修改程序,您可能希望设置机器人的速度不仅与误差成正比,还要考虑误差的变化率。

    推荐阅读:

    或者,您也可以破解它以记住距离停止变化时的速度,并将其用作新的基本速度,并定期按比例增益以保持距离恒定,但使用 PD 控制会更强大:-)。

    【讨论】:

    • "至于如何修改程序,您可能希望设置机器人的速度不仅与误差成正比,还要考虑误差的变化率。"基本上就是这样。如果您不将加速度与到野兔的距离的导数相匹配,它将振荡。
    • 它会不会停在与它的速度完全匹配的距离上?
    • 感谢您的帮助!但是我仍然不知道如何仅使用问题文本中概述的方法来修改程序。我们如何在没有时间概念的情况下测量误差变化率?另外,你觉得我的第一个答案怎么样?我觉得 k=1 很可疑。
    • 哪里说只能使用这些方法?选项:1)假设循环的每次迭代都是一个恒定的时间单位(有风险)2)假设您可以使用睡眠方法,我认为他们不会反对。至于 k,有一个 k 可能很重要,它是调谐常数,但由于这是假设的,它的实际值并不重要,所以可以是 1。它不会改变任何结果,只是改变它们发生的速度。
    【解决方案2】:

    在标准控制规则下,机器人 在稳定状态下总是离野兔有点太远——因为 如果它在 30 厘米之外,它会将速度设置为零,而野兔会 离得远一点,所以最后会在远一点的地方安定下来 超过30厘米。

    解决方案是为速度引入一个变量;在主循环中,在 每次迭代都将机器人速度设置为变量值。然后看 当前到野兔的距离与 30 厘米之间的差值,以及 调整与该速度成正比的速度 不同之处。这最终会给机器人带来一个稳定的状态 在 30 厘米的固定距离处将其速度与野兔匹配。

     public class Question4ii{
      public static main(){
        float d = 30;
        float speed = 0;
        float k = 1; //If it's equal to 1, why do we need it at all?
        while(true){
          change = k * (GetSonarDepth() - d);
          speed += change
          if(speed>100) speed=100;
            if(speed<-100) speed=-100;
        setVelocity(speed)
    }
    

    【讨论】:

    • 所以,基本上,一个 PI 控制器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-17
    • 2021-04-20
    • 1970-01-01
    • 2016-05-12
    • 1970-01-01
    • 2021-02-10
    相关资源
    最近更新 更多