该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

%三边测量的定位算法

%dA,dB,dC为A,B,C到未知节点(假定坐标[x,y]未知)的模拟测量距离

A = [0,0];

B = [25,25*sqrt(3)];

C = [50,0];

dA=51/sqrt(3);

dB=51/sqrt(3);

dC=51/sqrt(3);

%A,B,C为三个选定的信标节点,节点坐标已知(为便于防真及验证,代码中采用的等边三角形)

%定义未知坐标x,y为符号变量

syms x y;

%距离方程,以信标节点为圆心,信标节点到未知节点的测量距离为半径作三个圆

f1 = (A(1)-x)^2+(A(2)-y)^2-dA^2;

f2 = (B(1)-x)^2+(B(2)-y)^2-dB^2;

f3 = (C(1)-x)^2+(C(2)-y)^2-dC^2;

%任两个方程联立,求任两圆交点

s1 = solve(f1,f2); %求A,B两圆的交点

s2 = solve(f2,f3); %求B,C两圆的交点

s3 = solve(f1,f3); %求A,C两圆的交点

%将结果(符号变量)转换为双精度数值

x1 = double(s1.x);

y1 = double(s1.y);

x2 = double(s2.x);

y2 = double(s2.y);

x3 = double(s3.x);

y3 = double(s3.y);

%选择内侧的三个交点

%两圆相交于两点,距第三个圆心近的为选定交点Pab,Pbc,Pac

d1(1) = sqrt(((C(1)-x1(1))^2+(C(2)-y1(1))^2));

d1(2) = sqrt(((C(1)-x1(2))^2+(C(2)-y1(2))^2));

if d1(1) <= d1(2)

Pab(1) = x1(1);

Pab(2) = y1(1);

else

Pab(1) = x1(2);

Pab(2) = y1(2);

end

d2(1) = sqrt(((A(1)-x2(1))^2+(A(2)-y2(1))^2));

d2(2) = sqrt(((A(1)-x2(2))^2+(A(2)-y2(2))^2));

if d2(1) <= d2(2)

Pbc(1) = x2(1);

Pbc(2) = y2(1);

else

Pbc(1) = x2(2);

Pbc(2) = y2(2);

end

d3(1) = sqrt(((B(1)-x3(1))^2+(B(2)-y3(1))^2));

d3(2) = sqrt(((B(1)-x3(2))^2+(B(2)-y3(2))^2));

if d3(1) <= d3(2)

Pac(1) = x3(1);

Pac(2) = y3(1);

else

Pac(1) = x3(2);

Pac(2) = y3(2);

end

%求三个圆内侧三个交点Pab,Pbc,Pac的质心,即为未知节点P,完成定位

P(1) = (Pab(1)+Pbc(1)+Pac(1))/3;

P(2) = (Pab(2)+Pbc(2)+Pac(2))/3;

转为c的代码如下

编译链接环境VC6.0

代码如下:

//三边测量的定位算法

//dA,dB,dC为A,B,C到未知节点(假定坐标[x,y]未知)的模拟测量距离

#include

#include

struct point_t

{

double x;

double y;

};

struct circle_t

{

struct point_t center;//圆心

double r;//半径

};

int double_equals(double const a, double const b)

{

static const double ZERO = 1e-9;

return fabs(a - b) < ZERO;

}

double distance_sqr(struct point_t const* a, struct point_t const* b)

{

return (a->x - b->x) * (a->x - b->x) + (a->y - b->y) * (a->y - b->y);

}

double distance(struct point_t const* a, struct point_t const* b)

{

return sqrt(distance_sqr(a, b));

}

double distance_pow(double x1,double y1,double x2,double y2)

{

return pow((x1-x2),2) + pow((y1-y2),2);

}

int insect(struct circle_t circles[], struct point_t points[])

{

double d, a, b, c, p, q, r;

double cos_value[2], sin_value[2];

if (double_equals(circles[0].center.x, circles[1].center.x)

&& double_equals(circles[0].center.y, circles[1].center.y)

&& double_equals(circles[0].r, circles[1].r))

{

return -1;

}

d = distance(&circles[0].center, &circles[1].center);

if (d > circles[0].r + circles[1].r

|| d < fabs(circles[0].r - circles[1].r))

{

return 0;

}

a = 2.0 * circles[0].r * (circles[0].center.x - circles[1].center.x);

b = 2.0 * circles[0].r * (circles[0].center.y - circles[1].center.y);

c = circles[1].r * circles[1].r - circles[0].r * circles[0].r

- distance_sqr(&circles[0].center, &circles[1].center);

p = a * a + b * b;

q = -2.0 * a * c;

if (double_equals(d, circles[0].r + circles[1].r)

|| double_equals(d, fabs(circles[0].r - circles[1].r))){

cos_value[0] = -q / p / 2.0;

sin_value[0] = sqrt(1 - cos_value[0] * cos_value[0]);

points[0].x = circles[0].r * cos_value[0] + circles[0].center.x;

points[0].y = circles[0].r * sin_value[0] + circles[0].center.y;

if (!double_equals(distance_sqr(&points[0], &circles[1].center),circles[1].r * circles[1].r))

{

points[0].y = circles[0].center.y - circles[0].r * sin_value[0];

}

return 1;

}

r = c * c - b * b;

cos_value[0] = (sqrt(q * q - 4.0 * p * r) - q) / p / 2.0;

cos_value[1] = (-sqrt(q * q - 4.0 * p * r) - q) / p / 2.0;

sin_value[0] = sqrt(1 - cos_value[0] * cos_value[0]);

sin_value[1] = sqrt(1 - cos_value[1] * cos_value[1]);

points[0].x = circles[0].r * cos_value[0] + circles[0].center.x;

points[1].x = circles[0].r * cos_value[1] + circles[0].center.x;

points[0].y = circles[0].r * sin_value[0] + circles[0].center.y;

points[1].y = circles[0].r * sin_value[1] + circles[0].center.y;

if (!double_equals(distance_sqr(&points[0], &circles[1].center),circles[1].r * circles[1].r))

{

points[0].y = circles[0].center.y - circles[0].r * sin_value[0];

}

if (!double_equals(distance_sqr(&points[1], &circles[1].center),circles[1].r * circles[1].r))

{

points[1].y = circles[0].center.y - circles[0].r * sin_value[1];

}

if (double_equals(points[0].y, points[1].y)&& double_equals(points[0].x, points[1].x))

{

if (points[0].y > 0)

{

points[1].y = -points[1].y;

}

else

{

points[0].y = -points[0].y;

}

}

return 2;

}

void main()

{

point_t Pab;

point_t Pbc;

point_t Pac;

point_t A;

point_t B;

point_t C;

double dA,dB,dC;

A.x = 0.0; //圆心

A.y = 0.0;

B.x = 25.0; //圆心

B.y = 25.0*sqrt(3);

C.x = 50.0; //圆心

C.y = 0.0;

dA = 51.0/sqrt(3);//半径

dB = 51.0/sqrt(3);//半径

dC = 51.0/sqrt(3);//半径

//A,B,C为三个选定的信标节点,节点坐标已知(为便于防真及验证,代码中采用的等边三角形)

//定义未知坐标x,y为符号变量

//距离方程,以信标节点为圆心,信标节点到未知节点的测量距离为半径作三个圆

struct circle_t circles_AB[2];

struct point_t points_AB[2];

circles_AB[0].center.x = A.x;

circles_AB[0].center.y = A.y;

circles_AB[0].r = dA;

circles_AB[1].center.x = B.x;

circles_AB[1].center.y = B.y;

circles_AB[1].r = dB;

switch (insect(circles_AB, points_AB))

{

case -1:

printf("THE CIRCLES ARE THE SAME\n");

break;

case 0:

printf("NO INTERSECTION\n");

break;

case 1:

printf("(%.3lf %.3lf)\n", points_AB[0].x, points_AB[0].y);

break;

case 2:

printf("求A,B两圆的交点为\n");

printf("(%.3lf %.3lf) (%.3lf %.3lf)\n",points_AB[0].x, points_AB[0].y,

points_AB[1].x, points_AB[1].y);

}

//printf("(%.3lf %.3lf %.3lf)\n", A.x, A.y,dA);

//printf("(%.3lf %.3lf %.3lf)\n", B.x, B.y,dA);

//printf("(%.3lf %.3lf %.3lf)\n", C.x, C.y,dA);

double points_AB_0 = distance_pow(points_AB[0].x,points_AB[0].y,C.x,C.y);

double points_AB_1 = distance_pow(points_AB[1].x,points_AB[1].y,C.x,C.y);

if(points_AB_0 < points_AB_1)

{

Pab.x = points_AB[0].x;

Pab.y = points_AB[0].y;

}

else

{

Pab.x = points_AB[1].x;

Pab.y = points_AB[1].y;

}

struct circle_t circles_BC[2];

struct point_t points_BC[2];

circles_BC[0].center.x = B.x;

circles_BC[0].center.y = B.y;

circles_BC[0].r = dB;

circles_BC[1].center.x = C.x;

circles_BC[1].center.y = C.y;

circles_BC[1].r = dC;

switch (insect(circles_BC, points_BC))

{

case -1:

printf("THE CIRCLES ARE THE SAME\n");

break;

case 0:

printf("NO INTERSECTION\n");

break;

case 1:

printf("(%.3lf %.3lf)\n", points_BC[0].x, points_BC[0].y);

break;

case 2:

printf("求B,C两圆的交点为\n");

printf("(%.3lf %.3lf) (%.3lf %.3lf)\n",points_BC[0].x, points_BC[0].y,

points_BC[1].x, points_BC[1].y);

}

double points_BC_0 = distance_pow(points_BC[0].x,points_BC[0].y,A.x,A.y);

double points_BC_1 = distance_pow(points_BC[1].x,points_BC[1].y,A.x,A.y);

if(points_BC_0 < points_BC_1)

{

Pbc.x = points_BC[0].x;

Pbc.y = points_BC[0].y;

}

else

{

Pbc.x = points_BC[1].x;

Pbc.y = points_BC[1].y;

}

struct circle_t circles_AC[2];

struct point_t points_AC[2];

circles_AC[0].center.x = A.x;

circles_AC[0].center.y = A.y;

circles_AC[0].r = dA;

circles_AC[1].center.x = C.x;

circles_AC[1].center.y = C.y;

circles_AC[1].r = dC;

switch (insect(circles_AC, points_AC))

{

case -1:

printf("THE CIRCLES ARE THE SAME\n");

break;

case 0:

printf("NO INTERSECTION\n");

break;

case 1:

printf("(%.3lf %.3lf)\n", points_AC[0].x, points_AC[0].y);

break;

case 2:

printf("求A,C两圆的交点为\n");

printf("(%.3lf %.3lf) (%.3lf %.3lf)\n",points_AC[0].x, points_AC[0].y,

points_AC[1].x, points_AC[1].y);

}

double points_AC_0 = distance_pow(points_AC[0].x,points_AC[0].y,B.x,B.y);

double points_AC_1 = distance_pow(points_AC[1].x,points_AC[1].y,B.x,B.y);

if(points_AC_0 < points_AC_1)

{

Pac.x = points_AC[0].x;

Pac.y = points_AC[0].y;

}

else

{

Pac.x = points_AC[1].x;

Pac.y = points_AC[1].y;

}

double P_1,P_2;

P_1 = (Pab.x + Pbc.x + Pac.x)/3.0;

P_2 = (Pab.y + Pbc.y + Pac.y)/3.0;

printf("三个圆内侧三个交点Pab,Pbc,Pac的质心为\n");

printf("(%.3lf %.3lf)\n", P_1, P_2);

}

matlab 三边测量,三边测量的定位算法,matlab转为c相关推荐

  1. aoa定位算法matlab仿真,基于信号到达角度(AOA)的定位算法研究

    内容摘要:基于信号到达角度(AOA)的定位算法是一种常见的无线传感器网络节点自定位算法,算法通信开销低,定位精度较高.由于各种原因,估测的多个节点位置可能存在不可靠位置,提出了一种改进的基于信号到达角 ...

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

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

  3. 在matlab下实现TDOA定位算法性能仿真

    一.题目 TDOA定位算法性能仿真 二.仿真要求 要求一:编写两个函数TDOA_CHAN和TDOA_Taylor得到位置的估计. 要求二:用RMSE实现两种算法的性能比较, 得到两种算法的RMSE曲线 ...

  4. 【目标定位】基于matlab粒子滤波的定位算法【含Matlab源码 2161期】

    一.基于粒子滤波污染源定位简介 粒子滤波定位算法是目前最精准定位可移动物体的位置,由于水域的流动,工业固体废物污染源很可能随着水流移动位置,基于粒子滤波算法将污染物定位分为预测.测量以及重新采样可大大 ...

  5. 【定位问题】基于RSSI均值的等边三角形定位算法matlab系统

    1 简介 为了提高无线传感网络的定位精度从提高测量精度.改善信标N点分布的角度提出了一种基于RSSI均值的等边三角形定位算法.该算法引入信号强指( RSSI)敏感区和非敏感区概念采用高斯模型对非敏感区 ...

  6. tdoa/aoa定位的扩展卡尔曼滤波定位算法matlab源码,TDOA/AOA定位的扩展卡尔曼滤波定位跟踪算法Matlab源码...

    TDOA/AOA定位是无线定位领域里使用得最多的一种定位体制,扩展卡尔曼滤波器是最经典的非线性滤波算法,可用于目标的定位和动态轨迹跟踪,GreenSim团队实现了该算法,本源码由GreenSim团队原 ...

  7. matlab控制算法C语言,PID算法Matlab仿真程序和C程序

    <PID算法Matlab仿真程序和C程序>由会员分享,可在线阅读,更多相关<PID算法Matlab仿真程序和C程序(6页珍藏版)>请在人人文库网上搜索. 1.增量式PID控制算 ...

  8. 分裂层次聚类matlab实现,凝聚层次聚类算法matlab源码

    <凝聚层次聚类算法matlab源码>由会员分享,可在线阅读,更多相关<凝聚层次聚类算法matlab源码(3页珍藏版)>请在人人文库网上搜索. 1.共享一个在数据挖掘课程中作为示 ...

  9. croppos分割点位置matlab,关于指纹中心点定位的matlab程序,跪求高人指点!!

    在网上找了一基于matlab的指纹中心点定位的程序,看不太懂,哪位高人来指点一下图像从哪个地方输入才是正确的,跪谢!! function [Outputprint,XofCenter,YofCente ...

  10. 超宽带定位算法matlab,毕业设计_--超宽带(UWB)无线定位技术.doc

    毕 业 设 计 题目: 超宽带(UWB)无线定位技术 学 校 院 系 专 业 姓 名 学 号 2012 年 6 月 论文题目: 超宽带(UWB)无线通信技术 专 业: 学 生: 签名: 指导教师: 签 ...

最新文章

  1. 我的个人博客搭建记录
  2. 利用ISA Server 2006服务器阵列构建高性能、高可靠的企业防火墙
  3. apache hive_Hive:使用Apache Hive查询客户最喜欢的搜索查询和产品视图计数
  4. 文档声明和HTML样式表
  5. TCP/IP网络编程之基于TCP的服务端/客户端(二)
  6. 最近打算学习windows核心编程
  7. PSTN和互联网——无线接入与定位(1)
  8. html5+php调用android手机图片,HTML5拍照上传图片Phonegap封装HTML5调用Android相机拍照上传到PHP端...
  9. pythonmysql包_[Python] MySQLdb(即 MySQL-python 包)在 OS X 中安装指南
  10. Oracle 11gR2 GI基本安装手册
  11. 2021认证杯 第二阶段 思路加代码
  12. Learning Modality-Specific Representation with Self-Supervised Mulit-Task Learning for MSA
  13. QT 如何在背景图中将部分区域设置为透明
  14. python初级课程-辛舒展-专题视频课程
  15. 机器学习项目:泰坦尼克号幸存者预测
  16. 【记录】螺栓连接——预紧力
  17. 真正实现网络下载,文件不落地.解决XmlHttp对象、winnet.dll、URLDownloadToFile生成的ie缓存(Hook_CreateFileW阻止缓存生成)
  18. 科学家与艺术家心中都装着什么
  19. 说说Teams里的Card
  20. mysql导出数据到csv的方式

热门文章

  1. 求边界点 -- Python
  2. EasyRecovery免费版一键数据恢复还原软件
  3. bootstrap批量删除操作!
  4. mysql 嵌套_MySQL的嵌套查询
  5. 平面设计专业学什么?大学平面设计主修课程有哪些?
  6. 联想y430完全拆机图解_联想Y430P笔记本拆机加内存和SSD图文教程
  7. Visio从安装到使用完整版
  8. 电子邮件工作原理_为什么不应该放弃电子邮件,以及我们在工作中进行交流的方式...
  9. 本周赠书:卓有成效的工程师
  10. 无法启动WORKSTATION服务解决方案