【问题标题】:Vector deltas and moving in unknown areas矢量增量和在未知区域中移动
【发布时间】:2011-02-17 02:46:13
【问题描述】:

我需要一些我似乎无法找到答案的数学帮助,非常感谢任何文档链接。

这是我的情况,我不知道我在这个迷宫中的什么位置,但我需要四处走动,找到回到起点的路。我正在考虑实施一个航点列表,其中列出了我从 0,0 开始偏移的地方。这是一个二维笛卡尔平面。

我获得了 2 个属性,我的平移速度从 0-1 和我的旋转速度从 -1 到 1。-1 非常左,+1 非常右。这些是速度而不是角度,所以这就是我的问题所在。如果给我 0 作为翻译速度,给我 0.2,我会不断地以缓慢的速度向右转。

给定这两个变量,我如何计算出偏移量?每次迈出“一步”时,我都可以存储它。

我只需要在给定平移和旋转速度的情况下计算 x 和 y 项的偏移量。以及到达这些点的旋转。

感谢任何帮助。

【问题讨论】:

    标签: math vector euclidean-distance


    【解决方案1】:

    你的问题有几点不清楚,所以我必须做出一些假设:

    1. 在每个时间间隔内,平移速度和旋转速度是恒定的。
    2. 您知道这些变量在每个时间间隔内的值(并且您知道以可用单位表示的旋转速度,例如每秒弧度,而不仅仅是“非常左”)。
    3. 您知道初始航向。
    4. 您可以保持足够的精度,使舍入误差不是问题。

    鉴于此,有一个精确的解决方案。首先是简单的部分:

    delta_angle = omega * delta_t
    

    其中 omega 是角速度。行进的距离(可能沿着曲线)是

    dist = speed * delta_t
    

    曲线的半径为

    radius = dist / delta_angle
    

    (当角速度接近于零时,这会变得很大——我们稍后会处理它。)如果角度(在间隔的开始处)为零,定义为指向+x 方向,则区间内的平移很容易,我们称其为 deta_x_0 和 delta_y_0:

    delta_x_0 = radius * sin(delta_angle)
    delta_y_0 = radius * (1 - cos(delta_angle))
    

    由于我们希望能够处理非常小的 delta_angle 和非常大的半径,我们将扩展 sin 和 cos,并且仅在角速度接近于零时使用:

    dx0 = r * sin(da)     = (dist/da) * [ da - da^3/3! + da^5/5! - ...]
                         =  dist     * [  1 - da^2/3! + da^4/5! - ...]
    
    dy0 = r * (1-cos(da)) = (dist/da) * [ da^2/2! - da^4/4! + da^6/6! - ...]
                         =  dist     * [   da/2! - da^3/4! + da^5/6! - ...]
    

    但是角度一般不等于0,所以我们要旋转这些位移

    dx = cos(angle) * dx0 - sin(angle) * dy0
    dy = sin(angle) * dx0 - cos(angle) * dy0
    

    【讨论】:

    • +1:很好,我喜欢。可以对最后一步进行更多描述,即您的分析在本地 xy 框架中的每个时间步都成立,其中 x 位于当前方向,因此您只需考虑该时间步的当前角度。跨度>
    • @Troubadour:你说得对,我本可以更清楚地说明这一点——但我不想太冗长。我认为用粗体字写几行就可以了……
    【解决方案2】:

    您可以分两个阶段完成。首先计算出方向的变化,得到一个新的方向向量,然后再用这个新的方向计算出新的位置。类似的东西

    angle = angle + omega * delta_t;
    
    const double d_x = cos( angle );
    const double d_y = sin( angle );
    
    x = x + d_x * delta_t * v;
    y = y + d_y * delta_t * v;
    

    您在每一步存储当前angle 的位置。 (d_x, d_y) 是当前方向向量,omega 是您拥有的旋转速度。 delta_t 显然是你的时间步长,v 是你的速度。

    这可能太天真了,不能把它分成两个不同的阶段。我不确定我没有真正考虑过太多,也没有测试过,但如果它有效,请告诉我!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-24
      • 2013-05-04
      • 1970-01-01
      • 2012-12-27
      • 2015-07-13
      • 1970-01-01
      相关资源
      最近更新 更多