TDOA定位方法的Fang算法的程序实现(二维)

摘要:

蜂窝无线定位服务(LCS)是一种具有广阔市场前景的移动增值业务,其基本原理是利用现有蜂窝网络,通过对各种位置特征参数,包括到达时间(TOA),到达时间差(TDOA),到达方向(DOA)的测量和估计,从而实现移动用户的定位。
本篇介绍TDOA定位方法的Fang算法及其程序实现。

1、引言:
在各种无线定位系统中,采用的基本定位方法和技术都是相同或者相似的。
从几何角度讲,确定目标在二维或者三维空间的位置可以由两个或者多个曲线在二维或者三维空间内相交得到,以这一标准进行划分,可供选择的定位方法有:
1:圆周定位方法
2:双曲线定位方法
3:方位角测量定位方法
4:混合定位方法
一般,基于电磁波场强和TOA的定位采用的是圆周定位。基于AOA采用的是方位角定位。基于TDOA的定位是采用双曲线定位,混合定位则是基于AOA、TDOA或者其他组合。

2、TDOA双曲线模型


根据上面的方程组,进而可以求解得到移动台MS的位置坐标。
不管是哪种TDOA的双曲线算法(熟知的如Chan 或者Fang),在二维平面中,只需要三个基站就可以定位出移动台MS的XY坐标。
如果是三维空间中,需要四个基站才可以定位出MS的XYZ坐标。

3、Fang 算法原理


解方程(3.3),可以得到两个X值,,利用有关先验信息如(标签得到两个基站的距离差R21),就可以取到正确的X值。然后利用式(3.2)得到Y值。

4、代码实现

这里我们用C++做程序实现:

这里我们先预设了3个基站、及标签T到基站的距离

//基站1--基站3坐标
double AncLoc[3][3]={{0,0,0},                   {700,0,0},                 {700,740,0},// {30,740,300},};//标签到3个基站的距离
double T2A_R[3] = {671,506,351};

主函数

int main(int argc, char** argv) {FangTDOA Anc;                       //创建对象Anc.GetAncData(&AncLoc[0][0],3,3);  //获取基站坐标Anc.displayAncData();               //显示基站坐标Anc.getRang(&T2A_R[0]);             //获取标签到基站的距离Anc.displayATrang();                //显示标签到基站的距离Anc.DeviationRang(1);               //计算标签到基站的距离差Anc.get3gh();                       //计算得到参数g,hAnc.get3def();                      //计算得到参数d,e,fAnc.getX();                         //得到X坐标Anc.getY();                         //得到Y坐标Anc.checkResult();                  //得到最终坐标点return 0;
}

主要关键代码:

#include <iostream>
#include <math.h>
#include <cmath>
#include<fstream>
#include<cstdlib>
#include<QString>
#include<FangTDOA.h>using namespace std;//Fang TDOA 分为三基站和四基站模式,
//三基站模式下,标签的Z轴的影响,会使得定位的精度变弱。
//四基站模式下,定位精度会比较高。FangTDOA::FangTDOA()
{for (int i = 0; i < 3; ++i){for(int j = 0; j<3; ++j){AncXYZ[i][j]=0;}}for (int i = 0; i < 3; ++i){ATrang[i] = 0;devi_R[i] = 0;}// *sloveX = NULL;// *solution = NULL;// return 0;}FangTDOA::~FangTDOA()
{//   return 0;}//获取基站坐标
double FangTDOA::GetAncData(double *inputAncDate,const int irows,const int jcolum)
{for (int i = 0; i < irows; ++i){for(int j = 0; j<jcolum; ++j){AncXYZ[i][j]= *(inputAncDate+i*jcolum+j);}}return 0;
}//显示基站坐标
void FangTDOA::displayAncData()
{cout<<"the AncXYZ data is:"<<endl;for (int i = 0; i < 3; ++i){for(int j = 0; j<3; ++j){cout<<setprecision(10)<< AncXYZ[i][j]<<"  ";}cout<<endl;}}//获取标签到4个基站的距离
void FangTDOA::getRang(double rang[])
{for (int i = 0; i < 3; ++i){ATrang[i] = rang[i];}
}void FangTDOA::displayATrang()
{cout<<setprecision(10)<< "tag to Anc rang is:  "<<endl;for (int i = 0; i < 3 ; ++i){cout<<setprecision(10)<< ATrang[i]<<"  ";}cout<<endl;
}//标签到基站的距离差
void FangTDOA::DeviationRang(int rel)
{switch (rel) {case 1:devi_R[0] = ATrang[0]; // R1devi_R[1] = ATrang[1] - ATrang[0] ; // R2-R1devi_R[2] = ATrang[2] - ATrang[0] ; //R3-R1devi_R[3] = ATrang[3] - ATrang[0] ; //R4-R1break;case 2:devi_R[0] = ATrang[1]; // R1devi_R[1] = ATrang[2] - ATrang[1] ; // R2-R1devi_R[2] = ATrang[3] - ATrang[1] ; //R3-R1devi_R[3] = ATrang[0] - ATrang[1] ; //R4-R1break;case 3:devi_R[0] = ATrang[2]; // R1devi_R[1] = ATrang[3] - ATrang[2] ; // R2-R1devi_R[2] = ATrang[0] - ATrang[2] ; //R3-R1devi_R[3] = ATrang[1] - ATrang[2] ; //R4-R1break;case 4:devi_R[0] = ATrang[3]; // R1devi_R[1] = ATrang[0] - ATrang[3] ; // R2-R1devi_R[2] = ATrang[1] - ATrang[3] ; //R3-R1devi_R[3] = ATrang[2] - ATrang[3] ; //R4-R1break;default:break;}
}void FangTDOA::get3gh()
{double temp = 0;g = (devi_R[2]* AncXYZ[1][0]/devi_R[1] - AncXYZ[2][0])/AncXYZ[2][1];temp = pow(AncXYZ[2][0],2) + pow(AncXYZ[2][1],2) - pow(devi_R[2],2);temp = temp + devi_R[2]*devi_R[1]*(1 - pow((AncXYZ[1][0] / devi_R[1]) ,2) ) ;h = (temp / 2)/AncXYZ[2][1];}void FangTDOA::get3def()
{double temp = 0;temp = pow((AncXYZ[1][0]/devi_R[1]),2);d = - (( 1 - temp)  + g*g);e = AncXYZ[1][0]*(1-temp)-2*g*h;temp = pow(devi_R[1],2) -pow(AncXYZ[1][0],2);temp = pow(temp,2);f = (temp/pow(devi_R[1],2))*0.25 - h*h;
}double FangTDOA::getX()
{getfunction2(d,e,f);// return sloveX;
}double FangTDOA::getY()
{sloveY[0] = g*sloveX[0]+h;sloveY[1] = g*sloveX[1]+h;
}double FangTDOA::checkResult()
{double tempR2 = sqrtf(pow((sloveX[0]-AncXYZ[1][0]),2) + pow(sloveY[0],2));double tempR1 = sqrtf(pow(sloveX[0],2)+pow(sloveY[0],2));double tempslotR =  fabs((tempR2-tempR1) -devi_R[1]) ;if(tempslotR<5){finalXYZ[0] = sloveX[0];finalXYZ[1] = sloveY[0];}else{finalXYZ[0] = sloveX[1];finalXYZ[1] = sloveY[1];}cout<<setprecision(10)<<finalXYZ[0]<< " ";cout<<setprecision(10)<<finalXYZ[1]<< " ";
}

结果输出:


相关参考代码详见附件
//download.csdn.net/download/qq_21291397/12103237

PS:
1、Fang 算法,相对Chan 算法相对复杂,而且对基站的参数有一定的限制,如果基站的坐标可任意设定,这里还需要通过坐标变换(平移和旋转)来实现。
2、三维Fang算法,也可以进一步实现:可以参考下面一片文章:
http://www.doc88.com/p-7724949260733.html,可惜该论文有很多印刷的错误,部分公式的推导也是错误的。但思路可以借鉴。

TDOA定位方法的Fang算法的程序实现(二维)相关推荐

  1. linux查看toa模块,TOA和TDOA定位方法

    TOA和TDOA定位方法 来源:华强电子网 作者:华仔 浏览:6224 时间:2016-08-10 14:18 标签: 摘要: ;;; 无线传感器网络测距技术中已经 HCPL-M456-500E讲解了 ...

  2. 微信小程序转二维码方法分享

    微信小程序转二维码方法分享 需要转码的可以看看 这个东西是看个人需求的,618就要来了,各种活动也将来袭 有些小伙伴不知道怎么生成 为了方便小程序邀请活动没法外发,这里分享下将小程序转二维码的方法 首 ...

  3. 张小龙详细解读:微信小程序扫描二维码可进入(附实录)

    在今天举行的2017微信公开课PRO版上,腾讯微信负责人张小龙表示,微信小程序特性是:无须安装.触手可及.用完即走.无须卸载. 张小龙解答了关于小程序的疑问,并透露小程序计划于2017年1月9日正式上 ...

  4. 微信小程序获取二维码中URL中带的参数

    解析微信小程序获取二维码中的url参数 onLoad: function (options) { console.log(options) let qrUrl = decodeURIComponent ...

  5. 微信小程序普通二维码解析

    1.区别于微信小程序官方二维码是直接从onLoad的 options 解构出来就行,它是一个对象,这个大家都知道. 2.普通二维码 也是从onLoad的 options 里解构出来,此时options ...

  6. 微信小程序获取二维码

    原文链接:https://blog.csdn.net/w410589502/article/details/77702358/ 版权归原有博主,此处为了方便自己是查看,故copy一份,B接口调用,亲测 ...

  7. 飞鹅小票打印机嵌入生成指定小程序页面二维码的解决方案 | 扫普通链接二维码打开小程序示例 | 生成正方形小程序码

    部分朋友不需要打印机的业务,则 忽略有关打印机的部分 即可. 其他有关 微信小程序配置的介绍是通用的!通用的! 生成正方形小程序码,请看 标题一. 扫普通链接生成的二维码打开小程序,请看 标题二. 目 ...

  8. java---编写一个方法,返回一个int型的二维数组,数组中的元素通过解析字符串参数获得。

    题目: 编写一个方法,返回一个int型的二维数组,数组中的元素通过解析字符串参数获得,字符串如下"1,2:3,4,5:6,7"对应的数组为: d[0][0]=1 d[0][1]=2 ...

  9. 【微信小程序】二维码跳转规则的前缀匹配是什么意思?

    前言 基础库 2.12.0 开发者工具 1.03.2008270 微信小程序的二维码跳转规则 为了方便小程序开发者更便捷地推广小程序,兼容线下已有的二维码,微信公众平台开放扫描普通链接二维码跳转小程序 ...

最新文章

  1. 我也转发一个关于特斯拉的文章
  2. php+堆排序算法,排序算法-堆排序-php
  3. 牛客练习赛69 解方程
  4. centos 7用ss命令来查看端口占用和对应进程
  5. 两万字教会你解析库之Beautiful Soup
  6. 1101 害死人不偿命的猜想 PAT
  7. 最大对称字符串的长度
  8. Git本地仓库的文件夹不显示红色感叹号、绿色对号等图标
  9. 淘宝导航css相关说明
  10. 2017年苹果开发者账号申请——账号VISA卡支付流程
  11. 本专栏所有力扣题目的目录链接, 刷算法题目的顺序(由易到难/面试频率)/注意点/技巧, 以及思维导图源文件问题(持续更新中)
  12. rtx3050参数 rtx3050相当于gtx什么显卡 rtx3050显卡什么水平
  13. 查询计算机系男生修了,sql练习参考答案
  14. 模拟滑动android无障碍,Android无障碍简单开发-模拟滑动点击输入等
  15. Excel表格中如何快速在空白处添加短横杠(-)
  16. Linux TTY基本概念之ttys*、tty*、ttyS*、console理解
  17. 开始使用MarkDown
  18. Google Map API使用谷歌地图api实现地点搜索功能
  19. WZOI基础题库1~15题答案
  20. 《第一行代码》12.2学习中遇到的一些问题and心得

热门文章

  1. C++中system(“pause“)的作用
  2. USACO 1月 2020-2021 January Contest Silver 题解
  3. 如何制定WordPress SEO 内容营销策略
  4. Three.js--》实现3d球形机器人模型展示
  5. form表单的action和onsubmit事件说明
  6. 3 款 SQL INJECTION 攻击检测工具
  7. Error: invalid constant (6bf) after fixup
  8. taskkill详解
  9. jquery选择器返回值
  10. 多维度雷达图怎么做_雷达图 | ECharts 数据可视化实验室