OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6948|回复: 15

GPS两点测距精度问题

[复制链接]

2

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2014-9-14
在线时间
7 小时
发表于 2015-4-4 20:12:40 | 显示全部楼层 |阅读模式
5金钱
我的GPS是从原子哥这买的,最近做毕设,做的是GSM和GPS汽车防盗系统,我发现GPS测量两点之间的距离要超过38.3125米才能分辨出来(也就是不在是0了),我的思路是,GPS启动完成后,用个外部中断摁键记录当前的经纬度坐标(分别sheding_jingdu,sheding_weidu来表示停车位置),然后,人工模拟汽车被移动(GPS实时获得此时的xianzai_jingdu,xianzai_weidu),并实时计算此时的位置和停车位置之间的距离。
[mw_shl_code=c,true]float GPs_count(void) { float MLatA,MLatB;//MlatA是设定的纬度值计算式子里的形式,同理MlatB是现在车辆的实时纬度值得计算式子里的形式 float MLonA,MLonB;//MLonA设定的经度值,东经取正数,西经取负。 float C; MLatA=90-sheding_weidu;//设定的纬度 MLatB=90-xianzai_weidu;//现在的纬度 MLonA=sheding_jingdu;//设定的经度 MLonB=xianzai_jingdu;//设定的纬度 C=sin(MLatA)*sin(MLatB)*cos(MLonA- MLonB)+cos(MLatA)*cos(MLatB); Distance=1000.00000*R*acosf(C)*Pi/180.00000; // 千米*1000化成米为单位 sprintf((char *)dtbuf,"Distance:%.5f %1c ",Distance,'m'); //得到经度字符串 LCD_ShowString(30,64,dtbuf,GREEN,BLACK); //显示实际停车位置和当前的车辆位置之间的距离 return Distance; }[/mw_shl_code]
上面这个函数的由来,来源于我下面这张图,网址http://blog.csdn.net/lfqsy/article/details/6750537   ,原子哥有什么好思路么。急求,快答辩咯

程序员只有光棍节
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2015-4-4 22:17:48 | 显示全部楼层
这个没什么好办法哦
看你的定位质量,经纬度应该是一直抖动的,你的会一直是一个值??
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

2

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2014-9-14
在线时间
7 小时
 楼主| 发表于 2015-4-5 09:03:23 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
我的确实不是一个 定值,但是停车位置固定(由摁键设定),车辆移动肯定会变化,我就在原子哥你这个void Gps_Msg_Show(void)函数里每次都调用距离计算函数float GPs_count(void),但是发现精度没想象中的10米,晚上10点多的时候,我发现一个更糟的结果,我回到原来的位置,经度差值居然差了0.00007°,1经度85.39km,那么距离居然差了5.9773米。纬度差值为0     .我的经纬度差值实时显示在lcd上面。后来我干脆这么想,你不是1经度85.39km么,1纬度大约111km ,于是我直接用上面的Distance1=(经度差值*85.39)*1000米,Distance2=(纬度差值*111)*1000,结果距离值就不再从零 开始了,每次都有读数。但是跳变得厉害,,,,有什么解决办法能稳定一下数值么
程序员只有光棍节
回复

使用道具 举报

85

主题

378

帖子

0

精华

高级会员

Rank: 4

积分
902
金钱
902
注册时间
2013-4-29
在线时间
87 小时
发表于 2015-4-5 10:10:05 | 显示全部楼层
做做 滤波了么
回复

使用道具 举报

2

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2014-9-14
在线时间
7 小时
 楼主| 发表于 2015-4-5 10:44:17 | 显示全部楼层
回复【4楼】盒子:
---------------------------------
没研究过率滤波算法,能给说说思路么
程序员只有光棍节
回复

使用道具 举报

2

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2014-9-14
在线时间
7 小时
 楼主| 发表于 2015-4-5 20:01:45 | 显示全部楼层
回复【5楼】huangchangxin10:
---------------------------------
回复【2楼】正点原子:
---------------------------------现在找到个好一点的办法,就是用去除那些跳变得厉害的的经纬度,然后这样
//显示GPS定位信息
void Gps_Msg_Show(void)
{
  float tp;     
tp=gpsx.longitude;

xianzai_jingdu=tp/100000.00000;//记录当前经度,东经多少度?
if(((fabs(xianzai_jingdu-sheding_jingdu))>0.0018)&&(sheding_jingdu!=0))  //预防错误的发生,判断是不是超过了0.01度经度,如果是则把前一个正确的结果赋给xianzai_jingdu
{
xianzai_jingdu=previous_jingdu;
}
previous_jingdu=xianzai_jingdu;   //记录先前的经度,方便处理错误的经度值(由于GPS存在有时候定位不了的错误)

sprintf((char *)dtbuf,"Longitude:%.5f %1c   ",tp/=100000,gpsx.ewhemi); //得到经度字符串
  LCD_ShowString(30,130,dtbuf,BLACK,BLUE);

tp=gpsx.latitude;
xianzai_weidu=tp/100000.00000;   //记录当前纬度值,北纬多少度?
if(((fabs(xianzai_weidu-sheding_weidu))>0.0018)&&(sheding_weidu!=0))
{
xianzai_weidu=previous_weidu;   //如果现在纬度和设定的纬度差值大于0.0018说明现在纬度值无效,把以前的值赋给xianzai_weidu            
}
previous_weidu=xianzai_weidu;         //记录先前的纬度,方便处理错误的纬度值。

sprintf((char *)dtbuf,"Latitude:%.5f %1c   ",tp/=100000,gpsx.nshemi); //得到纬度字符串


  LCD_ShowString(30,150,dtbuf,BLACK,BLUE);    
tp=gpsx.altitude;    
  sprintf((char *)dtbuf,"Altitude:%.1fm     ",tp/=10);      //得到海拔高度
  LCD_ShowString(30,170,dtbuf,BLACK,BLUE);      
tp=gpsx.speed;    
  sprintf((char *)dtbuf,"Speed:%.3fkm/h     ",tp/=1000);      //得到速度字符串
  LCD_ShowString(30,190,dtbuf,BLACK,BLUE);       
if(gpsx.fixmode<=3) //定位状态
{  
sprintf((char *)dtbuf,"Fix Mode:%s",fixmode_tbl[gpsx.fixmode]);
   LCD_ShowString(30,210,dtbuf,BLACK,BLUE);    
}      
sprintf((char *)dtbuf,"Valid satellite:%02d",gpsx.posslnum);   //用于定位的卫星数目
  LCD_ShowString(30,230,dtbuf,BLACK,BLUE);     
sprintf((char *)dtbuf,"Visible satellite:%02d",gpsx.svnum%100);   //可见卫星数
  LCD_ShowString(30,250,dtbuf,BLACK,BLUE);  
sprintf((char *)dtbuf,"UTC Date:%04d/%02d/%02d   ",gpsx.utc.year,gpsx.utc.month,gpsx.utc.date); //显示UTC日期
//printf("year2:%d\r\n",gpsx.utc.year);
LCD_ShowString(30,270,dtbuf,BLACK,BLUE);     
sprintf((char *)dtbuf,"UTC Time:%02d:%02d:%02d   ",gpsx.utc.hour,gpsx.utc.min,gpsx.utc.sec); //????UTC?±??
  LCD_ShowString(30,290,dtbuf,BLACK,BLUE);

//显示设定经纬度(停车位置)
sprintf((char *)dtbuf,"sheding jingdu:%.5f %1c   ",sheding_jingdu,'N'); //得到经度字符串
LCD_ShowString(30,0,dtbuf,BLACK,BLUE);
sprintf((char *)dtbuf,"sheding weidu:%.5f %1c   ",sheding_weidu,'E'); //得到纬度字符串
LCD_ShowString(30,16,dtbuf,BLACK,BLUE);

//显示设定值和当前值的差值
sprintf((char *)dtbuf,"chazhi jingdu:%.5f %1c   ",fabs(sheding_jingdu-xianzai_jingdu),'N'); //fabs为取绝对值的函数,得到经度差值
LCD_ShowString(30,32,dtbuf,RED,BLUE);
sprintf((char *)dtbuf,"chazhi weidu:%.5f %1c   ", fabs(sheding_weidu-xianzai_weidu),'E'); //fabs为取绝对值的函数,得到纬度差值
LCD_ShowString(30,48,dtbuf,RED,BLUE);

//计算并显示当前的车辆位置和设定的位置之间的距离

Distance1=fabs(sheding_jingdu-xianzai_jingdu)*100353.16000;   //经度相差1度,为100353.16000米

sprintf((char *)dtbuf,"Distan1_E:%.5f %1c       ",Distance1,'m'); //得到经度字符串
LCD_ShowString(30,64,dtbuf,GREEN,BLUE);

Distance2=fabs(sheding_weidu-xianzai_weidu)*111000.00000;//纬度相差一度为111000.00000米,由纬度算出来的值,单位为米
sprintf((char *)dtbuf,"Distan2_N:%.5f %1c       ",Distance2,'m'); //得到纬度字符串
LCD_ShowString(30,80,dtbuf,GREEN,BLUE);

LCD_ShowString(30,96,"GSM&&GPS BY WEI CHANG MAO",BLACK,BLUE);
//GPs_count();
//LCD_ShowString(30,112,"                          ",BLACK,BLUE);
//if((xianzai_jingdu>(sheding_jingdu+xianzhi))||(xianzai_jingdu<(sheding_jingdu-xianzhi))||(xianzai_weidu>(sheding_weidu+xianzhi))||(xianzai_weidu<(sheding_weidu-xianzhi)))
if(Distance1>30||Distance2>30)   //实际测量值测量值,有待测量.
{
// if(send_flag==1)
// {
// sim900a_sms_send_test();
// send_flag=0;   //报警标志置0,只发一次短信就不再发送,信息费好贵的说
// }
for(t=0;t<10;t++)
{
led=!led;
delay_ms(500);
}
 }
else
{
led=1;
beep=0;
}

delay_ms(100);

/* current=sim900a_sms_read_num();  //获取当前的短信数目

if(current==previous)           //当前的短信数目和以前的短信数目比较,数目不变,不读取短信,else读取短信
{
//不读取短信

}
else   //短信增加了,读取短信内容并判断,是否是车主发的
{
   //读取短信并判断内容
table_current[0]=current/10+'0';
table_current[1]=current%10+'0';
table_current[2]='\0';
 
sim900a_sms_read_test(table_current);
previous=current;   //改变短信数目。标记新短信已经读过了

}
*/


}  那些注释掉的是为了方便调试GPS,所以把GSM部分注释掉了
程序员只有光棍节
回复

使用道具 举报

2

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2014-9-14
在线时间
7 小时
 楼主| 发表于 2015-4-5 20:04:25 | 显示全部楼层
回复【6楼】huangchangxin10:
---------------------------------
想想,好像可以用勾股定理,因为报警的距离不超过50米,而地球这么大,类似一个知道两直角边求第三边的几何运算,呵呵
程序员只有光棍节
回复

使用道具 举报

2

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2014-9-14
在线时间
7 小时
 楼主| 发表于 2015-4-5 20:09:49 | 显示全部楼层
大家可以一起来讨论讨论啊,开阔思维,嘿嘿,程序员就怕没思路
程序员只有光棍节
回复

使用道具 举报

5

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2015-4-6
在线时间
4 小时
发表于 2015-4-13 17:09:14 | 显示全部楼层


有没有试过这种办法,误差比你那种大吗?今天在百度地图拾取坐标计算了下,这种精度不高,误差几十米?你那种你试过吗,误差有多少?
还有就是你不做方向定位吗?就是现在点与原始点的连线方向与真北或磁北的夹角,如果有做,有什么思路方法吗?我是做飞控的,也要用到GPS这块。

回复

使用道具 举报

3

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2013-10-19
在线时间
4 小时
发表于 2015-6-15 23:14:21 | 显示全部楼层
这是个好帖,最近有可能用到。
回复

使用道具 举报

21

主题

68

帖子

0

精华

高级会员

Rank: 4

积分
938
金钱
938
注册时间
2014-2-18
在线时间
177 小时
发表于 2015-7-6 21:19:59 | 显示全部楼层
哥们把你的程序都放上来吧
回复

使用道具 举报

11

主题

60

帖子

0

精华

初级会员

Rank: 2

积分
128
金钱
128
注册时间
2015-10-9
在线时间
24 小时
发表于 2016-8-16 17:49:32 | 显示全部楼层
哥们  你问题解决了吗?  遇到跟你一样的问题
回复

使用道具 举报

13

主题

79

帖子

0

精华

初级会员

Rank: 2

积分
83
金钱
83
注册时间
2015-9-22
在线时间
76 小时
发表于 2016-8-30 16:34:06 | 显示全部楼层
mark一下看看  我以后也要用这个,我想问一下原子哥给的解析经纬度的程序是不是就是十进制的,不是N31°53′10.23″ 东经E118°48′54.36形式啊~~~应该是换算过来的吧~@正点原子
回复

使用道具 举报

84

主题

766

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2775
金钱
2775
注册时间
2015-6-1
在线时间
394 小时
发表于 2016-8-30 17:59:35 | 显示全部楼层
春夜喜小雨 发表于 2016-8-30 16:34
mark一下看看  我以后也要用这个,我想问一下原子哥给的解析经纬度的程序是不是就是十进制的,不是N31°53 ...

我记得经纬度本来读出来就不是N31°53′10.23″的形式,而是11848.76589...这种形式,你自己转一下就好
自在随心
回复

使用道具 举报

13

主题

79

帖子

0

精华

初级会员

Rank: 2

积分
83
金钱
83
注册时间
2015-9-22
在线时间
76 小时
发表于 2016-8-30 21:55:53 | 显示全部楼层
yuzeyuan1 发表于 2016-8-30 17:59
我记得经纬度本来读出来就不是N31°53′10.23″的形式,而是11848.76589...这种形式,你自己转一下就好

所以我觉得是度,不是度分秒~
回复

使用道具 举报

1

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2016-12-27
在线时间
10 小时
发表于 2017-1-5 17:06:13 | 显示全部楼层
帮顶,目前我也遇到了GPS模块经纬度误差问题~
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-29 04:56

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表