我需要计算GPS co-ordinates
之间的距离来计算行进的距离。我已经尝试了Haversine
和Vincenty
算法,这些算法在我的桌面PC上运行良好,但是当我使用CCS IDE为MSP430 chip
使用相同的代码时,IDE正在投掷错误说" 程序不适合可用内存"。
是否有其他替代方法或代码可以找到两个GPS坐标之间的距离?哪个适合MSP430微控制器的可用内存?
答案 0 :(得分:5)
您的内存不足并不奇怪,因为您使用的微控制器,德州仪器MSP430F2274,只有32kB的闪存和1kB的RAM。
有几种方法可以解决您的问题,每种方法都有不同的权衡。这是三个:
我将在下面讨论后两种方法。
根据应用程序的准确性要求,优化现有代码可能比使用比 Vincenty 或 Haversine 更简单的公式更好。
优化的简单方法
或许只需将编译器设置为优化大小即可解决您的问题。在MSP430工具集中,使用--opt_for_speed=0
开关。根据{{3}}(第62页),此开关:
支持针对使用a改进代码大小的优化 恶化或影响表现的风险很高。
因此,您可以通过使用此开关轻松地完成工作,但代价是以内存空间的速度换取速度。
更优化的参与方式
假设您正在使用随编译器提供的浮点数学库,如果您使用更多数学库替换数学库,则可能仍然可以使用 Vincenty 或 Haversine 节省空间的版本。 MSP430 Optimizing C/C++ Compiler User's Guide (v15.9.0.STS)定点算法提供了迭代方法来计算三角函数,这些方法可以提高空间效率。如果您使用自己的数学库,则可以在空间,速度和准确性之间取得良好的平衡。用于MSP430的sine()
和cosine()
的16位版本的CORDIC方法是CORDIC;您需要确定它是否提供您所需的准确度和精确度。
通常,计算地球上两点之间距离的各种算法代表了准确性和复杂性之间的权衡。您引用的here算法比Vincenty准确得多,因为它更准确地将地球表示为扁球体而不是半径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
是以弧度表示的距离。距离d
与R
(地球半径)的单位相同。
如您所见, Haversine 在计算中使用arcsin()
。
您可以使用 Polar Coordinate Flat-Earth 方法进一步简化数学运算:
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()
。
讨论 Haversine 和 Polar Coordinate Flat-Earth 方法之间的准确性权衡是Haversine。