搜索
bottom↓
回复: 20

请推荐好的距离检测算法

[复制链接]

出0入0汤圆

发表于 2015-6-28 14:34:15 | 显示全部楼层 |阅读模式
本帖最后由 霸气侧漏 于 2015-6-28 15:38 编辑

最近在研究GPS想弄个GPS  报站,弄了个代码,不大好,求推荐个可以用的距离检测代码

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2015-6-28 16:01:10 | 显示全部楼层
报站还需要测距离?

出0入0汤圆

 楼主| 发表于 2015-6-28 16:46:55 来自手机 | 显示全部楼层
zyw19987 发表于 2015-6-28 16:01
报站还需要测距离?

肯定要检测是否到站,对吧

出0入0汤圆

发表于 2015-6-28 17:20:42 来自手机 | 显示全部楼层
呵呵,思路错了。

出0入0汤圆

 楼主| 发表于 2015-6-28 17:37:58 | 显示全部楼层
zyw19987 发表于 2015-6-28 17:20
呵呵,思路错了。

哥们有好的思路,说下被

出0入0汤圆

发表于 2015-6-28 17:43:17 | 显示全部楼层
本帖最后由 zyw19987 于 2015-6-28 18:08 编辑
霸气侧漏 发表于 2015-6-28 17:37
哥们有好的思路,说下被


以目标点经纬坐标为圆点画圆。
长期对目标点坐标进行修正


简单点就画个正方形吧。
这样不需要测距了吧。

出0入0汤圆

 楼主| 发表于 2015-6-28 19:22:51 | 显示全部楼层
zyw19987 发表于 2015-6-28 17:43
以目标点经纬坐标为圆点画圆。
长期对目标点坐标进行修正

那怎么知道在圆圈内?不还是要靠距离检测。  画圆还有其他的办法没

出0入0汤圆

发表于 2015-6-28 21:11:53 | 显示全部楼层
霸气侧漏 发表于 2015-6-28 19:22
那怎么知道在圆圈内?不还是要靠距离检测。  画圆还有其他的办法没

哥们别逗,在圆内都算不出来?
直接算距离就行,精确度不需要太高。

出0入0汤圆

 楼主| 发表于 2015-6-28 21:49:09 | 显示全部楼层
brahen 发表于 2015-6-28 21:11
哥们别逗,在圆内都算不出来?
直接算距离就行,精确度不需要太高。

你的签名很有个性

出0入0汤圆

发表于 2015-6-28 23:02:29 | 显示全部楼层
霸气侧漏 发表于 2015-6-28 19:22
那怎么知道在圆圈内?不还是要靠距离检测。  画圆还有其他的办法没

化简为比较xy坐标了啊,不用算长度了啊

出0入0汤圆

 楼主| 发表于 2015-6-28 23:43:30 来自手机 | 显示全部楼层
zyw19987 发表于 2015-6-28 23:02
化简为比较xy坐标了啊,不用算长度了啊

因为gps有漂移,不是说经纬度一模一样,是在一个区间内

出0入0汤圆

发表于 2015-6-29 00:52:12 | 显示全部楼层
霸气侧漏 发表于 2015-6-28 23:43
因为gps有漂移,不是说经纬度一模一样,是在一个区间内


你画成XY坐标
xy坐标都满足误差范围就可以啦

到目标点是长期修正的

出0入0汤圆

 楼主| 发表于 2015-6-29 07:03:45 来自手机 | 显示全部楼层
本帖最后由 霸气侧漏 于 2015-6-29 07:18 编辑
zyw19987 发表于 2015-6-29 00:52

你画成XY坐标
xy坐标都满足误差范围就可以啦


哥们,你的意思是,(x,y),(x1,y1)2点
if(    (x-x1)<0.2  &&  (y-y10<0.2)  )成立就说明进站,是这样的意思么???

出0入0汤圆

 楼主| 发表于 2015-6-29 07:05:47 来自手机 | 显示全部楼层
本帖最后由 霸气侧漏 于 2015-6-29 07:18 编辑

哥们,你的意思是,(x,y),(x1,y1)2点
if(    (x-x1)<0.2  &&  (y-y10<0.2)  )成立就说明进站,是这样的意思么???

出0入0汤圆

发表于 2015-6-29 07:44:10 来自手机 | 显示全部楼层
霸气侧漏 发表于 2015-6-29 07:05
哥们,你的意思是,(x,y),(x1,y1)2点
if(    (x-x1)

意思是这样的,处理好特殊情况。
你觉得不行?

出0入0汤圆

 楼主| 发表于 2015-6-29 07:55:29 来自手机 | 显示全部楼层
zyw19987 发表于 2015-6-29 07:44
意思是这样的,处理好特殊情况。
你觉得不行?

思路不错,只是这个经纬度差值,去算距离不大好算

出0入0汤圆

发表于 2015-6-29 12:47:54 | 显示全部楼层
霸气侧漏 发表于 2015-6-29 07:55
思路不错,只是这个经纬度差值,去算距离不大好算

论坛好像有高人开源过,而且还考虑了球面距离问题。你找找

出0入0汤圆

 楼主| 发表于 2015-6-29 23:47:36 | 显示全部楼层
zyw19987 发表于 2015-6-29 12:47
论坛好像有高人开源过,而且还考虑了球面距离问题。你找找

没找到,有个
/**
  ******************************************************************************
  * @file    GPS_App.c
  * @author  DevLabs
  * @version V0.1
  * @date
  * @brief
  ******************************************************************************
  * @attention
  *
  * <br />Copyright 2013
  * <br />http://www.DevLabs.cn
  *
  * <h2><center>&copy; COPYRIGHT 2013 DevLabs</center></h2>
  ******************************************************************************
  */


/* Includes ------------------------------------------------------------------*/
#include "GPS_App.h"

/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/

//! @name WGS84椭球
//! @{
//! a = 6378137.0000000000;
//! b = 6356752.3142;
//! c = 6399593.6258;
//! _a = 1.0 / 298.257223563;
//! e2 = 0.0066943799013;
//! e2 = (a * a - b * b) / (a * a);
//! e_2 = 0.00673949674227;
//! e_2 = (a * a - b * b) / (b * b);
#define v0 (6.36744914585577e+006)
#define v1 (6.39959362580000e+006)
#define v2 (-2.15650202422767e+004)
#define v3 (1.09003037983916e+002)
#define v4 (-6.12188017458933e-001)
#define v5 (-3.21444799442298e+004)
#define v6 (1.35366946123277e+002)
#define v7 (-7.09481085293974e-001)
#define v8 (4.06137292124076e-003)
#define v9 (-4.16666666666667e-002)
#define v10 (2.50000000000000e-001)
#define v11 (2.52731128372009e-003)
#define v12 (7.57013608867423e-006)
#define v13 (1.38888888888889e-003)
#define v14 (-8.33333333333333e-002)
#define v15 (1.66666666666667e-001)
#define v16 (-1.66666666666667e-001)
#define v17 (3.33333333333333e-001)
#define v18 (1.12324945943115e-003)
#define v19 (8.33333333333333e-003)
#define v20 (-1.66666666666667e-001)
#define v21 (1.96742576567650e-001)
#define v22 (4.04369805395214e-003)
#define PI (3.1415926535898)
//! @}

/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
static BOOL init = FALSE;
static float distance = 0.0;

/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/

/**
* @brief  大地坐标->高斯平面坐标
*
* @param  B 纬度(单位度)
* @param  L 经度(单位度)
* @param  x x坐标(单位米)
* @param  y y坐标(单位米)
*/
void WGS84_to_cartesian(float B, float L, float *x, float *y)
{
    float l, l2, _N, w0, w1, w2, w3, w4, cosb, cosb2;

    l = L - ((int)L / 6 * 6 + 3); // 求经差

    B = B * PI / 180.0; // 转弧度
    l = l * PI / 180.0; // 转弧度
    l2 = l * l;

    cosb = cos(B);
    cosb2 = cosb * cosb;

    _N = v1 + (v2 + (v3 + v4 * cosb2) * cosb2) * cosb2;
    w0 = v5 + (v6 + (v7 + v8 * cosb2) * cosb2) * cosb2;
    w1 = v9 + (v10 + (v11 + v12 * cosb2) * cosb2) * cosb2;
    w2 = v13 + (v14 + v15 * cosb2) * cosb2;
    w3 = v16 + (v17 + v18 * cosb2) * cosb2;
    w4 = v19 + (v20 + (v21 + v22 * cosb2) * cosb2) * cosb2;

    *y = v0 * B + (w0 + (0.5 + (w1 + w2 * l2) * l2) * l2 * _N) * cosb * sin(B);
    *x = (1.0 + (w3 + w4 * l2) * l2) * l * _N * cosb;

    *x += 500000.0;
}

//! 清零记录的距离值(从当前点开始重新计算)
void dis_reset(void)
{
    distance = 0;
    init = FALSE;

    return;
}


//! 距离计算
void dis_calc_process(void)
{
    static float x0, y0;                // 前一次坐标值
    float len = 0.0;
    float x1, y1;                       // 当前坐标值
    float lat, lon;                     // 纬度,经度

    // 如果GPS未定位
    if (!GPS_get_state())
    {
        return;
    }

    // TODO
    // 即使定位偶尔也会出现经纬度为0的情况
    // if (..)
    // {
    // }
    lat = GPS_get_latitude();
    lon = GPS_get_longitude();
    // 坐标转换
    WGS84_to_cartesian(lat, lon, &x1, &y1);

    if (init)
    {
        len = (sqrt((x1 - x0) * (x1 - x0) + (y1 - y0) * (y1 - y0)));
    }
    else
    {
        init = TRUE;
    }

    x0 = x1;
    y0 = y1;

    distance += len;

    return;
}



/**
* @brief  获取从指定点开始的距离
*
* @return distance
*/
INT32U dis_get(void)
{
    return (INT32U)distance;
}




/******************* (C) COPYRIGHT 2013 DevLabs **********END OF FILE**********/

出0入0汤圆

发表于 2015-6-30 09:39:29 | 显示全部楼层
电子围栏

出0入0汤圆

 楼主| 发表于 2015-6-30 10:01:37 | 显示全部楼层

什么意思???

出0入0汤圆

发表于 2015-11-19 18:10:46 | 显示全部楼层
mark         
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-26 08:15

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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