三点定位法(原理及实现)

背景

学习笔记
参考 https://blog.csdn.net/jjwwwww/article/details/87714318#_4
由于文中大量数据来自上述博客,因此记为转载

原理

三点定位,顾名思义,需要三个点,这三个点一般为基站,定谁的位置?一般为客户端或者说终端的位置。通过测量终端和基站的距离(这个测量的过程中可能会存在误差,先假设没有误差),将其作为这三个圆的半径,画图,最终求得三圆的交点,交点即为终端位置,达到定位效果。如图。图中O点即为所求。
   

接下来考虑有测量误差的情况。实际测量过程中很容易出现下面的这种情况。这种情况下相交的是一块区域。如图中三个圆的交集为BCE区域。

这种情况怎么解决?我们先考虑两个圆的情况。这里我们先求C点的坐标。


两个圆(圆心为基站位置,半径是我们的测量数据即终端到基站的距离)交于A,B两点,连接AB,PQ,AQ,AP, AB和PQ交于点C,圆心的距离PQ在布置完基站之后便已知,圆心和半径已知,联立方程可以求得A,B点的坐标,从而根据欧氏距离求得PA,AQ。根据勾股定理:

解得

根据比例关系求得坐标

三个圆两两进行计算可以得到三个点。之后可以取这三个点的坐标的均值作为终端的坐标。

此外,还有可能会出现以下圆不相交的情况。

这种情况怎么解决?我们同样先考虑两个圆的情况。如图。此时我们求O点。

简单的方法是直接根据比例半径计算。

同样的,最终会得到三个点,取这三个点的坐标的均值作为终端的坐标。

代码

struct Point
{             int x;                //x坐标int y;                //y坐标Point() :x(0), y(0) {};
};//三点定位法
//dis:半径
//points:圆心
Point threePoints(float *dis, Point *ps)
{Point p;if (dis == NULL || ps== NULL)return p;for (int i = 0; i < 3; ++i){//检查距离是否有问题if (dis[i] < 0)return Point();for (int j = i + 1; j < 3; ++j) {//圆心距离PQfloat p2p = (float)sqrt((ps[i].x - ps[j].x)*(ps[i].x - ps[j].x) +(ps[i].y - ps[j].y)*(ps[i].y - ps[j].y));//判断两圆是否相交if (dis[i] + dis[j] <= p2p) {//不相交,按比例求p.x += ps[i].x + (ps[j].x - ps[i].x)*dis[i] / (dis[i] + dis[j]);p.y += ps[i].y + (ps[j].y - ps[i].y)*dis[i] / (dis[i] + dis[j]);}else{//相交则套用公式//PCfloat dr = p2p / 2 + (dis[i] * dis[i] - dis[j] * dis[j]) / (2 * p2p); //x = xp + (xq-xp) * PC / PQp.x += ps[i].x + (ps[j].x - ps[i].x)*dr / p2p;//y = yp + (yq-yp) * PC / PQp.y += ps[i].y + (ps[j].y - ps[i].y)*dr / p2p;}}}//三个圆两两求点,最终得到三个点,求其均值p.x /= 3;p.y /= 3;return p;
}

三点定位法(原理及实现)相关推荐

  1. CRC16查表法原理

    Preface CRC(Cyclic Redundancy Check)是数字通信系统中广泛使用的差错检测技术,本文将探究使用广泛的CRC查表法的原理实现细节,也作为一次学习记录总结. 一.CRC校验 ...

  2. N皇后问题 - 构造法原理与证明: 时间复杂度O(1)

    M皇后问题 - 构造法原理 *[原] E.J.Hoffman; J.C.Loessi; R.C.Moore* *The Johns Hopkins University Applied Physics ...

  3. PRI变换法原理解析及其matlab分析

    ---------------------------------------------------------------------------------------------------- ...

  4. 图像金字塔LK光流法原理分析

    图像金字塔LK光流法原理分析 1.LK光流法原理分析 2.基于图像金字塔的LK光流法原理分析 本篇博客只讲述原理,c++代码实现请参考博客< 基于金字塔LK的光流法实现-根据论文自己实现的c++ ...

  5. 【目标追踪】三帧差法原理及实现

    三帧差法原理及实现 (一)帧差法原理及实现: (二)帧差法存在的问题: (三)三帧差法的原理: (四)三帧差法的实现代码: (五)视频中的目标追踪效果: 关注我的公众号: (一)帧差法原理及实现: 这 ...

  6. Catboost-算法原理

    目录 Target Statistics Greedy TS Holdout TS Leave-one-out TS Ordered TS Ordered Boosting Oblivious Tre ...

  7. 详述激光三角测距法原理

    详述激光三角测距法原理 博主介绍 前言 激光雷达四大核心组件 激光三角测距法原理 1.直射式激光三角测距法 2.斜射式激光三角测距法

  8. python解析原理_主成分分析法原理及其python实现

    主成分分析法原理及其python实现 前言: 这片文章主要参考了Andrew Ng的Machine Learning课程讲义,我进行了翻译,并配上了一个python演示demo加深理解. 本文主要介绍 ...

  9. 荧光法原理L-Lactate分析试剂盒方案

    许多食品和饮料中都发现有D-乳酸和L-乳酸.由乳酸菌产生,D-乳酸和L-乳酸存在于牛奶的发酵产品中比如酸奶和奶酪,以及腌菜,腌肉和腌鱼中.L-乳酸被广泛添加入食品和饮料(E270)中,用作不挥发的酸化 ...

最新文章

  1. 黑盒测试之边界值测试
  2. 云数据管理公“云信达”获东方富海数千万A轮投资
  3. RabbitMQ实例教程:Windows下安装RabbitMQ
  4. Java笔记-通过反射获取注解及Spring中获取某包下的所有class文件
  5. easyexcel导入获取表头并且表头为不固定列
  6. Oracle学习总结(7)—— 常用的数据库索引优化语句总结
  7. Nacos 原理 Jraft Distro Grpc 持续跟新中...
  8. causalml安装记录
  9. 选择阿里云服务器的理由
  10. 中文停用词库,不用C币直接复制
  11. fortran 和 java_JNA实现Java调用Fortran
  12. [CC2642R1][VSCODE+Embedded IDE+Cortex-Debug] TI CC2642R1 快速搭建VsCode开发环境
  13. ICPC2021(沈阳)
  14. (附源码)springboot车辆管理系统 毕业设计 031034
  15. 那些创新是如何产生的?
  16. kafka的isr机制
  17. 【毕业设计】深度学习昆虫识别系统 - 图像识别 opencv python
  18. 在李嘉诚传中给年轻人提出了53条人生忠告
  19. JetBrains IDE Support的安装
  20. 配置思科3550三层交换机用TELNET方式登录

热门文章

  1. 帮我写一篇家长会上用的任课教师讲稿
  2. 基于Matlab神经网络语音情感识别系统
  3. transformers库使用--tokenizer
  4. 科技云报道:大小巨头涌入赛道,隐私计算迎来商业落地元年
  5. 计算几何——快速排斥实验和跨立实验
  6. BT功耗问题--连接蓝牙耳机功耗偏高
  7. Incorrect datetime value: '' for column
  8. 第六节 悬索桥结构体系的演变
  9. 外挂辅助技术原理分析
  10. Hearthstone 和 炉石传说 有什么区别