我需要计算GPS co-ordinates
计算行进距离之间的距离.我都试过了Haversine
和Vincenty
算法,做工精细我的台式电脑上,但是当我使用相同的代码MSP430 chip
使用CCS IDE,IDE会抛出错误,指出" 计划将不适合可用内存 ".
是否有其他替代方法或代码可以找到两个GPS坐标之间的距离?哪个适合MSP430微控制器的可用内存?
因为你使用的微控制器德州仪器MSP430F2274只有32kB的闪存和1kB的RAM,所以你的内存不足也就不足为奇了.
有几种方法可以解决您的问题,每种方法都有不同的权衡.这是三个:
使用另一个具有更多内存的微控制器(MSP430系列中有许多内存).
优化代码以适应可用空间.
使用比Vincenty或Haversine更简单的公式.
我将在下面讨论后两种方法.
根据应用程序的准确性要求,优化现有代码可能比使用比Vincenty或Haversine更简单的公式更好.
一种简单的优化方法
也许只是将编译器设置为针对大小进行优化将解决您的问题.在MSP430工具集中,使用--opt_for_speed=0
开关.根据MSP430优化C/C++编译器用户指南(v15.9.0.STS)(第62页),此开关:
实现针对改进代码大小的优化,具有恶化或影响性能的高风险.
所以你可以很容易地通过使用这个开关让事情变得有效,代价是以记忆空间的速度换取速度.
更多涉及的优化方法
假设您正在使用随编译器提供的浮点数学库,如果您使用更节省空间的版本替换数学库,则可能仍然可以使用Vincenty或Haversine.在CORDIC定点算法提供迭代方法来计算所述三角函数,即交易走速度为空间效率.如果您使用自己的数学库,则可以在空间,速度和准确性之间取得良好的平衡.对于CORDIC方法的16位版本sine()
和cosine()
用于MSP430是这里 ; 您需要确定它是否提供您所需的准确度和精确度.
通常,计算地球上两点之间的距离的各种算法表示精度和复杂度之间的折衷.您引用的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()
.
关于Haversine和Polar Coordinate Flat-Earth方法之间的准确性权衡的讨论在这里,问题Q5.1.
如何计算浮点支持较差的处理器上GPS坐标之间的距离?
http://www.faqs.org/faqs/geography/infosystems-faq/问题Q5.1
地理距离(维基百科)