定位算法-三边测距定位

article/2025/11/10 10:40:31

作者:姜小明 @github

日期:2020-09-06

关键字:RANSAC, Multilateral positioning, localization

上一篇文章(《使用RANSAC的鲁棒TDOA Chan定位算法》)中提到,如果我们知道当前位置到各个基站的距离,可以很方便的确定位置。本篇文章我们简短介绍测距定位算法及其实现。

1. 三边测距定位算法简介

利用信号源到各个监测站的距离,最少通过三个监测站,我们就能确定信号的位置,该方法为三边测距定位。如下图,以监测站为中心,距离为半径作圆可以确定信号的位置:

在这里插入图片描述

2. 算法

2.1 算法推导

算法推导如下图(参考知乎-三边测量及多边测量):
在这里插入图片描述

2.2 算法实现

算法实现如下:

bool calculate_pos_with_index_(const Position2D landmarks[], const double distances[], const int effective_landmark_indexes[], int effective_landmark_num, double* x_out, double* y_out) {if (is_landmarks_in_one_line(landmarks, effective_landmark_indexes, effective_landmark_num)) {printf("all landmarks in one line, cannot locate the position.\n");return false;}int matrix_row_num = effective_landmark_num - 1;int coefficient_num = 2;// Ax=bgsl_matrix* A = gsl_matrix_alloc(matrix_row_num, coefficient_num);gsl_matrix* a = gsl_matrix_alloc(matrix_row_num, coefficient_num);gsl_vector* b = gsl_vector_alloc(matrix_row_num);// resultgsl_vector *sx = gsl_vector_alloc(coefficient_num);//Clear datagsl_matrix_set_zero(A);gsl_vector_set_zero(b);int index_last = effective_landmark_indexes[effective_landmark_num - 1];for (int i = 0; i < effective_landmark_num - 1; i++) {int index_i = effective_landmark_indexes[i];gsl_matrix_set(A, i, 0, (landmarks[index_i].x - landmarks[index_last].x) * 2);gsl_matrix_set(A, i, 1, (landmarks[index_i].y - landmarks[index_last].y) * 2);double bi = landmarks[index_i].x * landmarks[index_i].x - landmarks[index_last].x * landmarks[index_last].x+ landmarks[index_i].y * landmarks[index_i].y - landmarks[index_last].y * landmarks[index_last].y+ distances[index_last] * distances[index_last] - distances[index_i] * distances[index_i];gsl_vector_set(b, i, bi);}gsl_matrix_memcpy(a, A);gsl_vector* tau = gsl_vector_alloc(coefficient_num); //matrix_row_num, coefficient_numgsl_vector* residuals = gsl_vector_alloc(matrix_row_num);gsl_multifit_linear_workspace *w = gsl_multifit_linear_alloc(matrix_row_num, coefficient_num);gsl_multifit_linear_svd(A, w);double rcond = gsl_multifit_linear_rcond(w); // reciprocal condition numberprintf("conditional number is:%f\n", 1.0 / rcond);if (rcond < 1e-4) {printf("conditional number is too large, indicating that the problem is ill-conditioned.\n");return false;}double lambda_gcv = 0.1;double chisq, rnorm, snorm;gsl_multifit_linear_solve(0.0, A, b, sx, &rnorm, &snorm, w);*x_out = gsl_vector_get(sx, 0);*y_out = gsl_vector_get(sx, 1);gsl_matrix_free(A);gsl_matrix_free(a);gsl_vector_free(b);gsl_vector_free(tau);gsl_vector_free(sx);gsl_vector_free(residuals);return true;
}

3. 项目描述

全部工程代码:github-RANSAC_Locator_using_distances

项目使用C语言实现了三边测距定位算法。和上一篇定位文章类似地,本项目使用了RANSAC思想排除异常点的干扰,获取稳定的解。main.c中包含了一段测试代码。编译方式和gsl库配置方法详见readme.md。


http://chatgpt.dhexx.cn/article/XbYer9pf.shtml

相关文章

三边测距定位算法详解

关注、星标公众号&#xff0c;直达精彩内容 来源&#xff1a;平行机器人 | 赵得江 整理&#xff1a;李肖遥 通过GPS定位系统实现无人机的空中悬停定点飞行 “定位”这个概念我想大家并不陌生&#xff0c;可以说定位技术的迅猛发展给我们的日常生活带来了极大的便利。比如&#…

Android框架揭秘电子书pdf下载

Android框架揭秘下载链接: https://pan.baidu.com/s/1W1xrsC2-w5MgsrY-6i_cFg 提取码获取方式&#xff1a;关注下面微信公众号&#xff0c;回复关键字: 1119

Android初学之路—Android系统框架

从下到上依次为&#xff1a; 1.Linux内核&#xff08;Linux Kernel&#xff09; Android系统的最底层是基于Linux内核实现的&#xff0c;它负责硬件驱动、网络管理、电源管理、系统安全、内存管理等。例如它可以负责显示驱动、基于Linux的帧缓存驱动、键盘驱动、Flash驱动、摄…

《Android框架揭秘》——2.2节搭建Android平台编译环境

本节书摘来自异步社区《Android框架揭秘》一书中的第2章&#xff0c;第2.2节搭建Android平台编译环境&#xff0c;作者 金泰延 , 宋亨周 , 朴知勋 , 李白 , 林起永&#xff0c;更多章节内容可以访问云栖社区“异步社区”公众号查看 2.2 搭建Android平台编译环境Android框架揭秘…

《Android框架揭秘》——2.3节搭建Android SDK开发环境

本节书摘来自异步社区《Android框架揭秘》一书中的第2章&#xff0c;第2.3节搭建Android SDK开发环境&#xff0c;作者 金泰延 , 宋亨周 , 朴知勋 , 李白 , 林起永&#xff0c;更多章节内容可以访问云栖社区“异步社区”公众号查看 2.3 搭建Android SDK开发环境Android框架揭秘…

《Android框架揭秘》——2.4节开发Android应用程序

本节书摘来自异步社区《Android框架揭秘》一书中的第2章&#xff0c;第2.4节开发Android应用程序&#xff0c;作者 金泰延 , 宋亨周 , 朴知勋 , 李白 , 林起永&#xff0c;更多章节内容可以访问云栖社区“异步社区”公众号查看 2.4 开发Android应用程序Android框架揭秘在上一节…

《Android框架揭秘》——2.1节主机环境构成

本节书摘来自异步社区《Android框架揭秘》一书中的第2章&#xff0c;第2.1节主机环境构成&#xff0c;作者 金泰延 , 宋亨周 , 朴知勋 , 李白 , 林起永&#xff0c;更多章节内容可以访问云栖社区“异步社区”公众号查看 2.1 主机环境构成Android框架揭秘虽然Android开发环境多…

《Android框架揭秘》——1.2节通过启动过程分析Android Framework

本节书摘来自异步社区《Android框架揭秘》一书中的第1章&#xff0c;第1.2节通过启动过程分析Android Framework&#xff0c;作者 金泰延 , 宋亨周 , 朴知勋 , 李白 , 林起永&#xff0c;更多章节内容可以访问云栖社区“异步社区”公众号查看 1.2 通过启动过程分析Android Fra…

《Android框架揭秘》——2.5节应用程序Framework源码级别调试

本节书摘来自异步社区《Android框架揭秘》一书中的第2章&#xff0c;第2.5节应用程序Framework源码级别调试&#xff0c;作者 金泰延 , 宋亨周 , 朴知勋 , 李白 , 林起永&#xff0c;更多章节内容可以访问云栖社区“异步社区”公众号查看 2.5 应用程序Framework源码级别调试An…

《Android框架揭秘》读书笔记--在Java中调用C库函数

简介 以下试验在Ubuntu16.04 x86&#xff0c;jdk安装&#xff1a;sudo apt-get install openjdk-9-jdk-headless&#xff0c;原书介绍的是在win系统实现。 步骤 第一步&#xff1a;编写Java代码第二步&#xff1a;编译Java代码第三步&#xff1a;生成C语言头文件第四步&#…

Android 框架揭秘 --读书笔记

Android 框架揭秘 Insied the Android Framework 转载于:https://www.cnblogs.com/drduan/p/4788554.html

android框架揭秘!Android开发者跳槽指南一线互联网公司面经总结

前言概要&#xff1a; 1&#xff0c;进大公司还是小公司&#xff0c;真的有的选&#xff1f; 2&#xff0c;校招的潜规则 3&#xff0c;校招想进大厂怎么办 4&#xff0c;社招的潜规则 5&#xff0c;社招想进大厂怎么办&#xff1f; 面试部门 岗位&#xff1a;商业化 - 高级 …

《Android框架揭秘》——导读

本节书摘来自异步社区《Android框架揭秘》一书中的目录&#xff0c;作者 金泰延 , 宋亨周 , 朴知勋 , 李白 , 林起永&#xff0c;更多章节内容可以访问云栖社区“异步社区”公众号查看 目 录 第1章 Android Framework概要 1.1 Android源代码组成1.2 通过启动过程分析Android…

Android框架揭秘读书笔记

Android启动过程 1.linux内核&#xff0c;加载linux内核 2 init 进程对各种设备进行初始化&#xff0c; 执行Daemon进程&#xff0c;管理USB、ADB链接管理器、Debugger系统、rild管理无线通信链接 Content Manager进程&#xff0c;提供运行Android各种系统服务信息 Media …

android框架揭秘!连续四年百度Android岗必问面试题!实战篇

前言 今天想停下代码&#xff0c;写点脑袋里不断浮现出来的一些看法。 也就是最近在微博和知乎上老看到“互联网寒冬”的说法。要么是看到啥公司薪水无法如期发放了&#xff0c;要么是看到别人说什么“裁员了&#xff0c;没有交接&#xff0c;签字然后电脑还了就走人&#xf…

字节大佬封神之作《Android Framework高级开发笔记》,完整版开放下载

在现阶段的Android开发工作中&#xff0c;无论是底层&#xff0c;还是应用层&#xff0c;Framework都至关重要。Framework的火热程度&#xff0c;相信我也不必再赘述。 为帮助大家深度学习Framework背景及它的巨大作用&#xff0c;这里分享一份《Android Framework高级开发笔记…

ANDROID框架揭秘

本书通过对Android系统源代码的分析&#xff0c;主要介绍Android框架的初始化过程及 主要组件的工作原理。作者直接分析和整理了Android框架的主要源代码&#xff0c;并详细讲 解了理解框架工作原理所需的各种基础知识和构成实际Android平台骨干的服务框架。 其中的主要内容包括…

用Java写linux命令行cd,java执行linux命令cd

java执行linux命令cd [2021-01-31 01:51:23] 简介: php去除nbsp的方法&#xff1a;首先创建一个PHP代码示例文件&#xff1b;然后通过“preg_replace("/(\s|\&nbsp\;| |\xc2\xa0)/", " ", strip_tags($val));”方法去除所有nbsp即可。推荐&#xff1…

Linux 常用命令与教程

http://c.biancheng.net/view/705.html C语言编程网的教程很好 还有菜鸟教程的 还有这个 https://mp.weixin.qq.com/s/7bSwKiPmtJbs7FtRWZZqpA 讲的也不错 https://baike.baidu.com/item/PS/8850709 百度百科 搜索一个linux命令 会出来这个 〇、序言&#xff1a;命令基本格式…

最强的linux命令总结.pdf

白月光-焰灵姬 来源&#xff1a;掘金- Lion https://juejin.cn/post/6938385978004340744 | 编辑&#xff1a;五角钱的程序员 前言 Linux 的学习对于一个程序员的重要性是不言而喻的。前端开发相比后端开发&#xff0c;接触 Linux机会相对较少&#xff0c;因此往往容易忽视它。…