基本原理

Trilateration(三边测量)是一种常用的定位算法:

  1. 已知三点位置 (x1, y1), (x2, y2), (x3, y3)
  2. 已知未知点 (x0, y0) 到三点距离 d1, d2, d3

以 d1, d2, d为半径作三个圆,根据毕达哥拉斯定理,得出交点即未知点的位置计算公式:

  1. ( x1 - x)2 + ( y1 - y0 )2 = d12
  2. ( x2 - x)2 + ( y2 - y0 )2 = d22
  3. ( x3 - x)2 + ( y3 - y0 )2 = d32

解法推导

设未知点位置为 (x, y), 令其中的第一个球形 P1 的球心坐标为 (0, 0),P2 处于相同纵坐标,球心坐标为 (d, 0),P3 球心坐标为 (i, j),三个球形半径分别为 r1, r2, r3,z为三球形相交点与水平面高度。则有:

  1. r12 = x2 + y2 + z2
  2. r22 = (x - d)2 + y2 + z2
  3. r32 = (x - i)2 + (y - j)2 + z2

当 z = 0 时, 即为三个圆在水平面上相交为一点,首先解出 x:

  1. x = (r12 - r22 + d2) / 2d

将公式二变形,将公式一的 z2 代入公式二,再代入公式三得到 y 的计算公式:

  1. y = (r12 - r32 - x2 + (x - i)2 + j2) / 2j

D3.js实现

定义三个圆的坐标及半径,计算出交点的坐标 (obj_x, obj_y).

  1. var x_0 = 150, y_0 = 150;
  2. var x_1 = x_0, y_1 = y_0, d = 150, x_2 = x_0 + d, x_3 = 225, y_3 = 315, r = 100;
  3. var i = x_3 - x_0, j = y_3 - y_0;
  4. var x = (Math.pow(r, 2) - Math.pow(r, 2) + Math.pow(d, 2)) / (2 * d) + x_0;
  5. var obj_x = x + x_0;
  6. var y = (Math.pow(r, 2) - Math.pow(r, 2) - Math.pow(x, 2) + Math.pow((x - i), 2)
  7. + Math.pow(j, 2)) / (2 * j);
  8. var obj_y = y + y_0;

绘出圆形及交点:

  1. svg.append("circle").attr("cx", x_1)
  2. .attr("cy", y_1).attr("r", r)
  3. .style("fill", "blue").style("opacity", 0.3);
  4. svg.append("circle").attr("cx", x_2)
  5. .attr("cy", y_0).attr("r", r)
  6. .style("fill", "red").style("opacity", 0.4);
  7. svg.append("circle").attr("cx", x_3)
  8. .attr("cy", y_3).style("opacity", 0.5)
  9. .attr("r", r).style("fill", "yellow");
  10. svg.append("circle").attr("cx", obj_x)
  11. .attr("cy", obj_y).attr("r", 3)
  12. .style("fill", "red");

但在实际定位中,给定的距离由于测量的误差,并不能真正让三个圆交于一点,需要在相交区域绘制出矩形并计算矩形的中心位置,除三边测量计算公式之外,也许还可以采用K-Means或Overlap聚类算法,后两者在地图标注上使用比较广,有兴趣的可以进一步对定位算法进行研究。

参考

A robust localization algorithm in wireless sensor networks
Calculating the intersection area of 3+ circles
Clustering Map Symbols

Trilateration三边测量定位算法的更多相关文章

  1. [CLPR] 定位算法探幽 - 边缘和形态学

    一. 引言 如何从一副图片中找到车牌? 这是机器视觉的一个应用. 理所当然地, 思考的角度是从车牌本身的信息入手, 为了讨论方便, 下面均以长窄型蓝白车牌为例. 下图就是这样一张车牌的基本信息. 一眼 ...

  2. 关于APIT定位算法的讨论

    关于APIT定位算法的讨论 [摘要]   无线传感器网络节点定位机制的研究中,基于距离无关的定位技术得到快速发展,其中基于重叠区域的APIT定位技术在实际环境中的定位精度高,被广泛研究和应用. [关键 ...

  3. LED室内定位算法:RSS,TOA,AOA,TDOA(转载)

    转载自:https://blog.csdn.net/baidu_38197452/article/details/77115935 基于LED的室内定位算法大致可以分为四类: 1. 几何测量法 这种方 ...

  4. 基于麦克风阵列的声源定位算法之GCC-PHAT

    目前基于麦克风阵列的声源定位方法大致可以分为三类:基于最大输出功率的可控波束形成技术.基于高分辨率谱图估计技术和基于声音时间差(time-delay estimation,TDE)的声源定位技术. 基 ...

  5. 伪距定位算法(matlab版)

    在各种伪距定位算法中,最小二乘法是一种比较简单而广泛的方法,该算法可以分为以下几步: 1.准备数据与设置初始值 这里准备数据,主要是对于各颗可见卫星,收集到它们在同一时刻的伪距测量值,计算测量值的各项 ...

  6. SIFT定位算法关键步骤的说明

    1. SIFT算法中一些符号的说明 $I(x,y)$表示原图像. $G(x,y,\sigma)$表示高斯滤波器,其中$G(x,y,\sigma) = \frac{1}{2\pi\sigma^2}exp ...

  7. mser 最大稳定极值区域(文字区域定位)算法 附完整C代码

    mser 的全称:Maximally Stable Extremal Regions 第一次听说这个算法时,是来自当时部门的一个同事, 提及到他的项目用它来做文字区域的定位,对这个算法做了一些优化. ...

  8. 基于Ubuntu1604+ROS-kinetic+roscpp的激光雷达定位算法从零开始移植

    调试的过程太麻烦了,因此打算详细解释一下每步的含义,很多地方懂了之后发现其实很简单,但是学起来却发现很多地方无从下手,因为资料太少了,真的都是不断踩坑一点一点摸索出来的,写以此文以便后人乘凉 此处将展 ...

  9. 自动驾驶定位算法-直方图滤波(Histogram Filter)定位

    1.直方图滤波(Histogram Filter)的算法思想 直方图滤波的算法思想在于:它把整个状态空间dom(x(t))切分为互不相交的部分\(b_1.b_2....,b_{n-1}\),使得: 然 ...

随机推荐

  1. Mysql数据库上修改日期-->造数据

    这次要给客户安装测试ineedle设备,但是安装后不会立刻有数据显示,不能够全面的展示给用户web界面的一些信息.此时需要有一个公网服务器能够展示一下ineedle统计数据,但是公司58设备上没有流量 ...

  2. spring 注入一个以枚举类型对象

    1.枚举 在实际编程中,往往存在着这样的“数据集”,它们的数值在程序中是稳定的,而且“数据集”中的元素是有限的. 例如星期一到星期日七个数据元素组成了一周的“数据集”,春夏秋冬四个数据元素组成了四季的 ...

  3. Debian Environment Variables

    原文:EnvironmentVariables General Environment variables are named strings available to all application ...

  4. Puppet3在CentOS6.5集群下的安装

    环境:3台主机, IP分别为10.211.55.11.12.13 puppet master安装在10.211.55.11 puppet agent安装在10.211.55.11.12.13 1.安装 ...

  5. C#基础---扩展方法的应用

     最近对扩展方法比较感兴趣,就看了看资料,记录一下扩展方法的几种方法. 一. 扩展方法的基本使用: Note: 1. 扩展方法必须在静态类中, 2 扩展方法必须声明静态方法,3 扩展方法里面不能调用其 ...

  6. MYSQL数据库的操作

    Mysql的连接方式: 1.原生函数:mysql_connect($server,$username,$password);   //打开一个到Mysql服务器的连接 mysql_select_db( ...

  7. 学习ROS的基本知识,节点、话题、服务等

    之前我在电脑上安装的ROS版本为jade版的. 可是后来发现各个教程安装的是indigo版的 于是我又去看了看ROS官网,在官网上有这样的一句话. 而且又因为indigo版的资料多一些,于是我就换了r ...

  8. 转: Eclipse使用SVN

    评注: 很细节的说明了,svn与eclipse的使用.     Eclipse使用SVN 收藏 老黎 发表于 5年前 阅读 35124 收藏 12 点赞 3 评论 6 SVN的功能再多,如果不能有效的 ...

  9. Javascript异步编程的4种方法

    你可能知道,Javascript语言的执行环境是"单线程"(single thread).   所谓"单线程",就是指一次只能完成一件任务.如果有多个任务,就必 ...

  10. lua 模块与环境

    编写一个模块的最简单方法: -- complex.lua -- 模块实际上是一个表 complex = {} -- 定义模块函数 function complex.add(c1,c2) ... end ...