我需要计算之间的距离GPS co-ordinates
来计算正在行驶的距离。我已经尝试了Haversine
和Vincenty
算法,它们在我的台式电脑上运行良好,但是当我使用相同的代码来MSP430 chip
使用 CCS IDE 时,IDE 会抛出错误,说“程序不适合可用内存”。
是否有任何其他替代方法或代码来查找两个 GPS 坐标之间的距离?哪个适合 MSP430 微控制器的可用内存?
我需要计算之间的距离GPS co-ordinates
来计算正在行驶的距离。我已经尝试了Haversine
和Vincenty
算法,它们在我的台式电脑上运行良好,但是当我使用相同的代码来MSP430 chip
使用 CCS IDE 时,IDE 会抛出错误,说“程序不适合可用内存”。
是否有任何其他替代方法或代码来查找两个 GPS 坐标之间的距离?哪个适合 MSP430 微控制器的可用内存?
内存不足并不奇怪,因为您使用的微控制器德州仪器 MSP430F2274 只有 32kB 的闪存和 1kB 的 RAM。
有几种方法可以解决您的问题,每种方法都有不同的权衡。这里有三个:
我将在下面讨论后两种方法。
根据应用程序的准确性要求,优化现有代码可能比使用比Vincenty或Haversine更简单的公式更好。
一种简单的优化方法
也许只需将编译器设置为优化大小即可解决您的问题。在 MSP430 工具集中,使用--opt_for_speed=0
开关。根据MSP430 Optimizing C/C++ Compiler User's Guide (v15.9.0.STS)(第 62 页),此开关:
启用旨在提高代码大小的优化,但具有恶化或影响性能的高风险。
因此,您可能很容易通过使用此开关让事情正常工作,但代价是牺牲速度换取内存空间。
一种更复杂的优化方式
假设您使用的是编译器提供的浮点数学库,如果您将数学库替换为更节省空间的版本,您可能仍然可以使用Vincenty或Haversine 。CORDIC定点算法提供了计算三角函数的迭代方法,以牺牲速度换取空间效率。如果您推出自己的数学库,您可能会在空间、速度和准确性之间取得良好的平衡。适用于 MSP430的 CORDIC 方法sine()
的16 位版本在这里;您需要确定它是否提供了您需要的准确度和精确度。
cosine()
一般来说,计算地球上两点之间距离的各种算法代表了准确性和复杂性之间的权衡。您引用的Vincenty算法比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
是以弧度表示的距离。距离d
的单位与R
(地球半径)相同。
如您所见,Haversinearcsin()
在计算中使用了一个。
您可以通过使用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()
.
在这里,问题 Q5.1讨论了Haversine和Polar Coordinate Flat-Earth方法之间的精度权衡。