GPS定位函数

Posted 皇甫春云

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GPS定位函数相关的知识,希望对你有一定的参考价值。

GPS模块中定位函数的分析

最近接触到了一个项目,使用了GPS定位模块,想在这里分享一下自己是如何一步一步编写出的定位函数!模块通过串口和单片机进行通信,所以发送过来的数据必然是字符串,而要对定位数据设定误差阈值,只有对数值型变量才可以进行比较分析。故首先第一步是对目标位置信息进行数据预处理,确定取值范围;第二步是将字符串转换为数值;第三步是结合阈值范围,对当前位置进行判断。

数值预处理

通过手机软件获得当前的位置信息,即得到原始数据;

北纬 N 度东经 E 度
41.73149343123.5039363A
41.73099301123.501415B
41.72953978123.4998111C共7站
41.72801044123.4968714D
41.72714568123.4925959E
41.72642503123.4894685F
41.72404682123.492274G

将原始数据按照GPS打印的数据,进行格式转换;

4173.14934312350.39363A
4173.09930112350.1415B
4172.95397812349.98111C共7站
4172.80104412349.68714D
4172.71456812349.25959E
4172.64250312348.94685F
4172.40468212349.2274G

考虑到单片机的性能有限,不能进行浮点型数据直接转换,所以需要取消掉一些不变化的字符;

4173.134173.154173.1712350.3712350.3912350.41A
4173.084173.14173.1212350.1212350.1412350.16B
4172.934172.954172.9712349.9612349.9812350C共7站
4172.784172.84172.8212349.6712349.6912349.71D
4172.74172.724172.7412349.2412349.2612349.28E
4172.624172.644172.6612348.9312348.9512348.97F
4172.394172.414172.4312349.2112349.2312349.25G

从上表知道了,选定的是±0.02作为误差范围,因为按照计算,这是20~40米的误差范围。但是数据还是不够精简,通过字符串转数值,还会进行精简。

数值转换

去掉一些并没有发生变化的数字,即简化了程序的编写,也精简了单片机系统运行的压力,所以可以提升位置判断的效率。

313315317503750395041A
308310312501250145016B
293295297499649985000C共7站
278280282496749694971D
270272274492449264928E
262264266489348954897F
239241243492149234925G

位置判断

当GPS采集到的位置信息落入当前的位置区间后,单片机会判断出这是哪个区间,从而执行对应位置上的操作。代码如下:

#include<stdio.h>
#include<string.h>
#define u16 unsigned int 	  //对数据类型进行声明定义
#define u8  unsigned char 
#define uchar unsigned char
#define uint  unsigned int

/*-----字符串转化为数字-----*/
/*-----只有当是数值型的字符串时,才可以完成字符串的转换。目前仅仅是完成了整数部分的转换,*/
u8 set_station(u8 lat[11], u8 lon[12])
{
    u8 station_value;
    u16 lat1;
    u16 lon1;

    lat1 = (lat[3] - '0') * 100 + (lat[5] - '0') * 10 + (lat[6] - '0');
    lon1 = (lon[3] - '0') * 1000 + (lon[4] - '0') * 100 + (lon[6] - '0') * 10 + (lon[7] - '0');

    if (lat1 >= 313 && lat1 <= 317 && lon1 >= 5037 && lon1 <= 5041)
        station_value = 0;
    else
    {
        if (lat1 >= 308 && lat1 <= 312 && lon1 >= 5012 && lon1 <= 5016)
            station_value = 1;
        else
        {
            if (lat1 >= 293 && lat1 <= 297 && lon1 >= 4996 && lon1 <= 5000)
                station_value = 2;
            else
            {
                if (lat1 >= 278 && lat1 <= 282 && lon1 >= 4967 && lon1 <= 4971)
                    station_value = 3;
                else
                {
                    if (lat1 >= 270 && lat1 <= 274 && lon1 >= 4924 && lon1 <= 4928)
                        station_value = 4;
                    else
                    {
                        if (lat1 >= 262 && lat1 <= 266 && lon1 >= 4893 && lon1 <= 4897)
                            station_value = 5;
                        else
                        {
                            if (lat1 >= 239 && lat1 <= 243 && lon1 >= 4921 && lon1 <= 4925)
                                station_value = 6;
                            else
                                station_value = 100;
                        }


                    }
                }
            }      
        }
       
    }  

    return(station_value);

}
int main()
{
    u8 data;
	u8 lat[11];
    u8 lon[12];

	printf("please input string including any ASCII !  \\n ");  //打印字符串
	scanf_s ("%s", lat,11);    //借助scanf_s输入字符串,这个函数包含三个参数,第一个是输入类型,第二个是变量名,第三个是输入字符串的上限
    scanf_s("%s", lon, 12);  //借助scanf_s输入字符串,这个函数包含三个参数,第一个是输入类型,第二个是变量名,第三个是输入字符串的上限
    data = set_station(lat,lon);
	printf("%d \\n", data);

}

运行结果如下图所示:
在这里插入图片描述

以上是关于GPS定位函数的主要内容,如果未能解决你的问题,请参考以下文章

GPS定位误差函数

GPS仿真基于matlab GPS信号捕获跟踪定位仿真含Matlab源码 1960期

《第一行代码》Android特色开发,基于位置服务,出现的问题

iOS 和 Android 上的 GPS 定位

如何在后台线程中启动 GPS 定位?

Android模拟位置信息