0

作为考试前的复习,我正在阅读 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. 机器人和野兔放在同一个位置 0
  2. 机器人开始倒车,而野兔匀速前进(误差为负)
  3. 机器人发射声纳
  4. 声纳读数告诉距离为 30(误差为 0)
  5. 机器人停止(错误为 0)
  6. 野兔在此调整期间移动恒定距离
  7. 机器人发射声纳(错误为正)
  8. 机器人将速度提高到 setVelocity(error)
  9. 野兔在此调整期间移动恒定距离
  10. 机器人根据“旧”声纳读数改变速度,因为在速度改变期间,野兔会走得更远
  11. 因此,机器人总是会离期望的距离至少有点远

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

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

4

2 回答 2

2

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

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

推荐阅读:

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

于 2013-04-27T16:38:42.923 回答
0

在标准控制规则下,机器人在稳定状态下总是会离兔子有点远——因为如果它在 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)
}
于 2013-05-23T23:07:32.307 回答