【问题标题】:How to implement dead reckoning when turning is involved?涉及转弯时如何进行航位推算?
【发布时间】:2009-08-11 15:27:10
【问题描述】:

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

我目前正在实现一个简单的服务器,该服务器利用航位推算优化,通过对客户端和服务器进行逻辑假设,最大限度地减少所需的更新。

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

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

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

为了简单起见,这是在 2D 空间中。

【问题讨论】:

    标签: language-agnostic network-programming dead-reckoning


    【解决方案1】:

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

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

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

    给定在步骤 2 中计算的角度 a,如果您从 (0,0) 开始,正北航向(即 pi/2 弧度)并向左转,那么您的新位置是:(rcos( a)-1, rsin(a)).

    如果您的原始标题不同,则说它是“b”,然后只需相应地旋转新位置,即乘以这个旋转矩阵:

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

    最后,添加初始位置就完成了。现在您只需在更改速度或转向时发送更新。

    【讨论】:

      【解决方案2】:

      好吧,我认为“转弯:左/右/否”不足以确定位置 B - 您还需要知道转弯的弧线。如果您沿着半径为 1 的圆形路径向左转,您将到达与沿半径为 10 的圆形路径转弯时不同的位置,即使您的初始位置、速度和转弯方向都是一样。

      如果让客户端为每个新方向发送更新并将它们视为线性段是一种选择,那么计算起来会容易得多。您可以简单地将来自客户端的每个新报告视为一个向量,并将它们相加。计算一堆曲线会更复杂。

      【讨论】:

      • 啊,是的,我当然知道方向变化的速度,但可以假设它是一个常数。
      猜你喜欢
      • 2021-03-02
      • 1970-01-01
      • 1970-01-01
      • 2015-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-10
      • 1970-01-01
      相关资源
      最近更新 更多