你的问题有几点不清楚,所以我必须做出一些假设:
- 在每个时间间隔内,平移速度和旋转速度是恒定的。
- 您知道每个时间间隔中这些变量的值(并且您知道可用单位的旋转速度,例如每秒弧度,而不仅仅是“非常左”)。
- 你知道初始航向。
- 您可以保持足够的精度,舍入误差不是问题。
鉴于此,有一个确切的解决方案。首先是简单的部分:
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! - ...]
但是角度通常不等于零,所以我们必须旋转这些位移:
dx = cos(angle) * dx0 - sin(angle) * dy0
dy = sin(angle) * dx0 - cos(angle) * dy0