代码之家  ›  专栏  ›  技术社区  ›  Blixt

涉及转弯时如何进行航位推算?

  •  4
  • Blixt  · 技术社区  · 15 年前

    航位推算 是根据先前确定的位置估计一个人当前的位置,并根据已知或估计的速度在经过的时间和过程中前进的过程。( Wikipedia )

    我目前正在实现一个简单的服务器,它利用航位推算优化,通过对客户机和服务器进行逻辑假设来最小化所需的更新。

    用户控制的物体可以说是转动的,也可以说是不转动的。这就提出了航位推算的问题(我的看法)。

    例如,假设你有观点 在[位置、速度、转弯:左/右/否]定义的时间内。现在你想要要点 之后 T 时间量。当不转动时,新位置很容易外推。由此产生的方向也很容易外推。但当这两个因素结合在一起时呢?当物体翻转时,速度的方向将沿着曲线变化。 T 时间量。

    我是否应该使用另一种解决方案(比如让客户机发送每个新方向的更新,而不是仅仅告诉服务器“我现在左转”)?

    顺便说一下,为了简单起见,这是在二维空间中。

    2 回复  |  直到 13 年前
        1
  •  2
  •   redtuna    13 年前

    为了简单起见,假设您的车辆的转弯半径r与速度无关。因此,要计算给定初始坐标和时间的新位置:

    • 计算距离(即速度*时间)
    • 计算你转弯的距离(即距离/(2*pi*r))。
    • 将该弧添加到原始位置。

    最后的步骤需要详细说明。

    考虑到步骤2中计算出的角度a,如果开始于(0,0),正北航向(即pi/2弧度),并左转,则新位置为:(r CoS(A)- 1,R 罪(a)。

    如果您的原始标题不同,假设它是“B”,那么只需相应地旋转新位置,即乘以该旋转矩阵:

     [ cos b , -sin b ]
     [ sin(b), cos(b) ]
    

    最后,添加初始位置,就完成了。现在你只需要发送一个更新,如果你改变速度或转向。

        2
  •  1
  •   John Hyland    15 年前

    嗯,我认为“左转/右转/否”不足以确定位置B——你还需要知道转弯的弧。如果你沿着半径为1的圆形路径左转,你会在一个不同的地方结束,而不是沿着半径为10的圆形路径,即使你的初始位置、速度和转弯方向都是一样的。

    如果让客户机发送每个新方向的更新,并将其视为线性段是一个选项,那么这将是一个更容易计算的方法。您可以简单地将来自客户机的每个新报告视为一个向量,并对它们进行合计。计算一组曲线将会更加复杂。

    推荐文章