GPS定位函数
Posted 皇甫春云
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GPS定位函数相关的知识,希望对你有一定的参考价值。
GPS模块中定位函数的分析
最近接触到了一个项目,使用了GPS定位模块,想在这里分享一下自己是如何一步一步编写出的定位函数!模块通过串口和单片机进行通信,所以发送过来的数据必然是字符串,而要对定位数据设定误差阈值,只有对数值型变量才可以进行比较分析。故首先第一步是对目标位置信息进行数据预处理,确定取值范围;第二步是将字符串转换为数值;第三步是结合阈值范围,对当前位置进行判断。
数值预处理
通过手机软件获得当前的位置信息,即得到原始数据;
北纬 N 度 | 东经 E 度 | ||
---|---|---|---|
41.73149343 | 123.5039363 | A | |
41.73099301 | 123.501415 | B | |
41.72953978 | 123.4998111 | C | 共7站 |
41.72801044 | 123.4968714 | D | |
41.72714568 | 123.4925959 | E | |
41.72642503 | 123.4894685 | F | |
41.72404682 | 123.492274 | G |
将原始数据按照GPS打印的数据,进行格式转换;
4173.149343 | 12350.39363 | A | |
---|---|---|---|
4173.099301 | 12350.1415 | B | |
4172.953978 | 12349.98111 | C | 共7站 |
4172.801044 | 12349.68714 | D | |
4172.714568 | 12349.25959 | E | |
4172.642503 | 12348.94685 | F | |
4172.404682 | 12349.2274 | G |
考虑到单片机的性能有限,不能进行浮点型数据直接转换,所以需要取消掉一些不变化的字符;
4173.13 | 4173.15 | 4173.17 | 12350.37 | 12350.39 | 12350.41 | A | ||
---|---|---|---|---|---|---|---|---|
4173.08 | 4173.1 | 4173.12 | 12350.12 | 12350.14 | 12350.16 | B | ||
4172.93 | 4172.95 | 4172.97 | 12349.96 | 12349.98 | 12350 | C | 共7站 | |
4172.78 | 4172.8 | 4172.82 | 12349.67 | 12349.69 | 12349.71 | D | ||
4172.7 | 4172.72 | 4172.74 | 12349.24 | 12349.26 | 12349.28 | E | ||
4172.62 | 4172.64 | 4172.66 | 12348.93 | 12348.95 | 12348.97 | F | ||
4172.39 | 4172.41 | 4172.43 | 12349.21 | 12349.23 | 12349.25 | G |
从上表知道了,选定的是±0.02作为误差范围,因为按照计算,这是20~40米的误差范围。但是数据还是不够精简,通过字符串转数值,还会进行精简。
数值转换
去掉一些并没有发生变化的数字,即简化了程序的编写,也精简了单片机系统运行的压力,所以可以提升位置判断的效率。
313 | 315 | 317 | 5037 | 5039 | 5041 | A | ||
---|---|---|---|---|---|---|---|---|
308 | 310 | 312 | 5012 | 5014 | 5016 | B | ||
293 | 295 | 297 | 4996 | 4998 | 5000 | C | 共7站 | |
278 | 280 | 282 | 4967 | 4969 | 4971 | D | ||
270 | 272 | 274 | 4924 | 4926 | 4928 | E | ||
262 | 264 | 266 | 4893 | 4895 | 4897 | F | ||
239 | 241 | 243 | 4921 | 4923 | 4925 | G |
位置判断
当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仿真基于matlab GPS信号捕获跟踪定位仿真含Matlab源码 1960期