【问题标题】:How do I calculate distance between GPS co-ordinates using Microcontroller chip如何使用微控制器芯片计算 GPS 坐标之间的距离
【发布时间】:2015-12-22 09:40:07
【问题描述】:

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

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

【问题讨论】:

  • 你用的是哪种芯片?
  • 还有另一种方法叫Sferical Law of Cosines,但我不知道它的内存要求。
  • 我在这个过程中使用了 msp430f2274 微控制器。在尝试查找值的 cos 的倒数时出现此问题。
  • 所以 msp430f2274 有 32KB 闪存,1K RAM,但是在应用程序的基本内容之后,可用内存是多少?您能否强加/应对最大弧/距离的限制?什么精度是可以接受的?
  • @WeatherVane 根据faqs.org/faqs/geography/infosystems-faq(问题Q5.1),余弦球定律对于短距离是不可靠的,因为反余弦的精度会随着角度变小而降低。

标签: gps microcontroller msp430 code-composer


【解决方案1】:

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

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

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

我将在下面讨论后两种方法。

优化您的代码

根据应用程序的准确性要求,优化现有代码可能比使用比 Vincenty 或 Haversine 更简单的公式更好。

一种简单的优化方法

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

启用旨在改进代码大小的优化 恶化或影响性能的高风险。

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

一种更复杂的优化方式

假设您使用的是编译器提供的浮点数学库,如果您将数学库替换为 more节省空间的版本。 CORDIC 定点算法提供了计算三角函数的迭代方法,以牺牲速度换取空间效率。如果您推出自己的数学库,您可能会在空间、速度和准确性之间取得良好的平衡。 MSP430 的sine() 和cosine() 的CORDIC 方法的16 位版本是here;您需要确定它是否提供了您需要的准确度和精确度。

使用不同的公式

一般来说,计算地球上两点之间距离的各种算法代表了准确性和复杂性之间的权衡。您引用的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(地球半径)的单位相同。

如您所见,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()。

Haversine 和 Polar Coordinate Flat-Earth 方法之间的精度权衡讨论是 here, question Q5.1。

另见

【讨论】:

    猜你喜欢
    • 2010-09-26
    • 1970-01-01
    • 1970-01-01
    • 2020-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多