我正在寻找游戏的简单停车算法。
汽车和车库的位置各由3个数字
(x, y, theta)
定义。其中 x
和 y
- 对象中心,theta
- 对象轴与 X 轴之间的角度。
汽车运动被简化 - 它是一个点(无需计算精确的轮胎运动),可以以
fixed speed
来回行驶或沿着半径为 R
的圆转弯(转弯半径可以是固定的或灵活 - 没关系 - 任何选择对我来说都很好)并且它有 no inertia or acceleration
。
车库有 3 堵墙,汽车不能碰触。可以使用精确的碰撞尺寸,但为了简单起见,通过测量汽车和车库之间的角度以及汽车轴线和车库中心之间的距离来检查碰撞。当汽车和车库足够近时(中心之间的距离小于某个常数
CloseEnough
),通过(alpha, d) < (maxAlpha, maxDistance)
检查碰撞
由刻度模拟的世界,我们采用当前的汽车控制 -
moving direction
向前或向后和 turning angle
并计算汽车的下一个位置。
该算法应产生一系列控制命令,例如
[forward, left], [forward, left], [backward, straight], [forward, right]
。
如果它是迭代的并一次生成一个命令,那就没问题了——然后检查下一个刻度发生了什么并生成另一个命令。 它可以要求模拟引擎根据控制命令模拟并产生新的坐标或使用模拟引擎尝试多个选项并选择最好的一个。
如果它通过一系列近似运动来做到这一点也没关系,就像它尝试了一次 - 错过了,尝试了另一次 - 靠近,第三次 - 最后停了下来(但它应该或多或少是合理的,不要这样做数十或数百次来回迭代)。
不失一般性,假设汽车沿直线和最小半径圆移动。 (较大的圆圈将提供更短且更温和的骑行,但请稍后再考虑。)在实践中,这将意味着交替的线-圆-线-圆-线...
最终目标是直接驶入车库。
之前的目标(“倒数第二个”)是进入与该路径相切的圆圈之一,尽可能靠近车库。因此,如果车库位于 (0,0,0),则圆的中心位于 (0, +/1r)。一般来说,如果车库位于 (x, y, θ),则圆的中心位于 (x-/+rsinθ, y+/-rcosθ)。
在此之前的目标(“倒数第二个”?)是从汽车已经所在的圆之一(极左或极右)到达与该圆和目标圆相切的线。
在此之前的目标是在需要时绕过车库,以便汽车可以执行已经描述的动作而不会撞到它。解决这个问题的一种方法是以车库的每个角为中心画一个圆圈,然后从一个圆圈转到另一个圆圈。
够了吗?