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

如何使用微控制器芯片计算GPS坐标之间的距离,gps,microcontroller,msp430,code-composer,Gps,Microcontroller,Msp430,Code Composer,我需要计算GPS坐标之间的距离来计算行驶距离。我已经尝试了Haversine和Vincenty两种算法,它们在我的台式电脑上运行良好,但是当我使用CCS IDE为MSP430芯片使用相同的代码时,IDE抛出错误,说“程序将无法放入可用内存中” 是否有其他替代方法或代码来查找两个GPS坐标之间的距离?MSP430微控制器的可用内存中适合哪个?内存不足并不奇怪,因为您正在使用的微控制器Texas Instruments MSP430F2274只有32kB的闪存和1kB的RAM 有几种方法可以解决您的

我需要计算GPS坐标之间的距离来计算行驶距离。我已经尝试了
Haversine
Vincenty
两种算法,它们在我的台式电脑上运行良好,但是当我使用CCS IDE为
MSP430芯片
使用相同的代码时,IDE抛出错误,说“程序将无法放入可用内存中”


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

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

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

  • 使用另一个具有更多内存的微控制器(MSP430系列中有很多)
  • 优化代码以适应可用空间
  • 使用比Vincenty或Haversine更简单的公式
我将在下面介绍后两种方法。

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

一种简单的优化方法

也许简单地将编译器设置为针对大小进行优化就可以解决您的问题。在MSP430工具集中,使用
--opt_for_speed=0
开关。根据(第62页),此开关:

启用优化,以通过 性能恶化或影响性能的高风险

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

一种更复杂的优化方法

假设您使用的是编译器提供的浮点数学库,如果您使用更节省空间的版本替换该数学库,您可能仍然可以使用Vincenty或Haversine。定点算法提供了计算三角函数的迭代方法,以牺牲速度换取空间效率。如果您使用自己的数学库,您可能会在空间、速度和精度之间实现良好的平衡。用于MSP430的
sine()
cosine()
的16位CORDIC方法是:;您需要确定它是否提供所需的准确度和精确度。

使用不同的公式 一般来说,计算地球上两点之间距离的各种算法代表了精度和复杂性之间的权衡。您引用的算法比的更精确,因为它更准确地将地球表示为一个扁球体,而不是一个半径为
R
的球体;因此,数学更为复杂

作为参考,这里显示了哈弗森方法(假设地球是一个完美的球体):

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在计算中使用了
arcin()

您可以通过采用极坐标平面地球法进一步简化数学:

a = pi/2 - lat1
b = pi/2 - lat2
c = sqrt(a^2 + b^2 - 2 * a * b * cos(lon2 - lon1)
d = R * c
请注意,此计算中没有
arcin()
,但有一个
sqrt()

讨论了哈弗斯线法和极坐标平地法之间的精度折衷问题

另见

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

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

      • 使用另一个具有更多内存的微控制器(MSP430系列中有很多)
      • 优化代码以适应可用空间
      • 使用比Vincenty或Haversine更简单的公式
      我将在下面介绍后两种方法。

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

      一种简单的优化方法

      也许简单地将编译器设置为针对大小进行优化就可以解决您的问题。在MSP430工具集中,使用
      --opt_for_speed=0
      开关。根据(第62页),此开关:

      启用优化,以通过 性能恶化或影响性能的高风险

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

      一种更复杂的优化方法

      假设您使用的是编译器提供的浮点数学库,如果您使用更节省空间的版本替换该数学库,您可能仍然可以使用Vincenty或Haversine。定点算法提供了计算三角函数的迭代方法,以牺牲速度换取空间效率。如果您使用自己的数学库,您可能会在空间、速度和精度之间实现良好的平衡。用于MSP430的
      sine()
      cosine()
      的16位CORDIC方法是:;您需要确定它是否提供所需的准确度和精确度。

      使用不同的公式 一般来说,计算地球上两点之间距离的各种算法代表了精度和复杂性之间的权衡。这个