使用位置查找运动转角

Find movement turn angle using Location

我需要找到以度为单位的车辆转弯角度。

位置点以等间隔(1 秒)更新。因此,设备在转弯时获得 4-5 分。我在图片上示意性地展示了它。

是否可以使用位置计算转角?如果可以,如何计算?


我尝试了什么:

  1. 分别从点 3、4 和点 1、2 创建两个几何向量,并求出这些向量之间的角度。我计算的向量坐标 Vector1 (lat2 - lat1; lon2 - lon2)。不确定这种方法是否适用于位置坐标。
  2. 使用location1.bearingTo(location2)。但这并没有给出预期的结果。似乎它给出了 "compass" 结果。也许我可以以某种方式使用它但不确定。
  3. 还尝试了一些三角函数公式,如 here or here or here。他们没有给出预期的角度。

编辑:解决方案 接受的答案效果很好。但要完成答案,我必须展示 angleDifference 的方法。这个对我有用:

public int getAngleDifference(int currentAngle){
    int r = 0;
    angleList.add(currentAngle);
    if (angleList.size() == 4) {
        int d = Math.abs(angleList.get(0) - angleList.get(3)) % 360;
        r = d > 180 ? 360 - d : d;

        angleList.clear();
    }
    return r;
}

我在列表中添加点直到有 4 个点,然后计算第 1 个点和第 4 个点之间的角度差以获得更好的结果。

希望对大家有所帮助!

方法 1 并不像您描述的那样工作:纬度、经度不是笛卡尔坐标(以米表示的经度不是纬度的度数,这仅在赤道处有效)。您必须首先转换为(本地)笛卡尔系统。

绘图中有错误:标有“?”的角度被放在错误的一边。您很可能想要 angle: 180 - ? 在您的示例中,汽车转弯小于 90°,但您的角度显示大于 90°。 为了更好地理解,再画一张汽车只左转 10 度的图。在您的绘图中,这将是 170°,这是错误的。

方法 2) 效果更好,但您需要总结角度差异。 你得自己写一个方法

double angleDifference(double angle1, double angle2);

虽然代码只有几行,但看起来比实际更容易。 确保您有一些测试用例来测试超过 360° 限制时的行为。 例子

(从方位角 10 转向方位角 350),应该给出 20 或 -20,具体取决于您是否希望该方法给出绝对值或相对角度

vect1 = LatLon2 - LatLon1; // vector subtraction

vect2 = LatLon4 - LatLon3;

根据点积的定义,有 属性:

vect1.vect2 = ||vect1||*||vect2||*Cos(theta)

这是符号的细分

vect1.vect2vect1vect2 的点积。

点积的一般形式可以按分量分解让 v1 = <x1,y1>v2=<x2,y2> 对于两个任意向量 v1v2 点积将是:

v1.v2 = x1*x2 + y1*y2 

并且某个任意向量的大小 v 是:

||v|| = sqrt(v.v); which is a scalar.

以上等价于欧几里德距离公式,分量为x和y:

||v|| = sqrt(x^2 + y^2)

获取角度

给定两个向量 vect1vect2theta 的值:

theta = Math.ArcCos(vect1.vect2/(||vect1||*||vect2||))