如何使用微控制器芯片计算 GPS 坐标之间的距离

How do I calculate distance between GPS co-ordinates using Microcontroller chip

我需要计算 GPS co-ordinates 之间的距离来计算行进的距离。我已经尝试了 HaversineVincenty 算法,它们在我的台式电脑上运行良好,但是当我使用 CCS IDE 为 MSP430 chip 使用相同的代码时,IDE 抛出错误提示“程序不适合可用内存”。

是否有任何其他替代方法或代码来查找两个 GPS 坐标之间的距离?哪个适合 MSP430 微控制器的可用内存?

您 运行 内存不足并不奇怪,因为您使用的微控制器 Texas Instruments MSP430F2274 只有 32kB 闪存和 1kB RAM。

有多种方法可以解决您的问题,每种方法都有不同的权衡。这是三个:

  • 使用另一个具有更多内存的微控制器(MSP430 系列中有很多)。
  • 优化您的代码以适应可用的 space。
  • 使用比 VincentyHaversine.
  • 更简单的公式

我将在下面介绍后两种方法。

优化您的代码

根据应用程序的准确性要求,优化现有代码可能比使用比 VincentyHaversine[=96 更简单的公式更好。 =].

一种简单的优化方法

也许只需将编译器设置为优化大小 即可解决您的问题。在 MSP430 工具集中,使用 --opt_for_speed=0 开关。根据 MSP430 Optimizing C/C++ Compiler User's Guide (v15.9.0.STS)(第 62 页),此开关:

enables optimizations geared towards improving the code size with a high risk of worsening or impacting performance.

因此,您可以通过使用此开关很容易地使事情正常工作,代价是牺牲速度换取内存 space。

更复杂的优化方式

假设您正在使用随编译器提供的浮点数学库,如果您用 space 更高效的版本替换数学库。 CORDIC fixed-point algorithms provide iterative approaches to calculating the trigonometric functions, that trade away speed for space efficiency. If you roll your own math library, you might achieve a good balance between space, speed, and accuracy. A 16-bit version of the CORDIC approach for sine() and cosine() for the MSP430 is here;您将需要确定它是否提供了您需要的准确度和精确度。

使用不同的公式

一般来说,计算地球上两点之间距离的各种算法代表了准确性和复杂性之间的权衡。 Vincenty algorithm you cited is much more accurate than the Haversine,因为它更正确地将地球表示为扁球体而不是半径为 R 的球体;因此数学更复杂。

作为参考,此处显示了 Haversine 方法(假设地球是一个完美的球体):

dlon = lon2 - lon1
dlat = lat2 - lat1
a = sin^2(dlat/2) + cos(lat1) * cos(lat2) * sin^2(dlon/2)
c = 2 * arcsin(min(1,sqrt(a)))
d = R * c

中间结果c是以弧度为单位的距离。距离 dR(地球半径)的单位相同。

如您所见,Haversine 在计算中使用了 arcsin()

您可以使用极坐标平面地球方法进一步简化数学运算:

a = pi/2 - lat1
b = pi/2 - lat2
c = sqrt(a^2 + b^2 - 2 * a * b * cos(lon2 - lon1)
d = R * c

注意这个计算中没有arcsin(),但是有一个sqrt().

关于 HaversinePolar Coordinate Flat-Earth 方法之间精度权衡的讨论是 here, question Q5.1

另见