首页 > 其他分享 >UWB多基站定位浅试

UWB多基站定位浅试

时间:2023-07-08 13:35:28浏览次数:44  
标签:distances positions 基站 position 浅试 UWB estimated anchor

UWB多基站定位浅试

介绍

在现代的定位技术中,通过多个基站(或锚点)来确定目标位置是一种常见的方法。这种技术被广泛应用于许多领域,如无线通信、室内定位和物联网等。本文将介绍一种通过多个基站进行三边测量(trilateration)的定位算法,以估计目标在三维空间中的坐标。

算法原理

该算法基于三边测量原理,通过测量目标到多个基站的距离来估计目标的位置。下面是算法的基本步骤:

  1. 定义一个三维向量类vec3d,用于表示三维空间中的坐标点。
  2. 实现一个距离计算函数calculate_distance,用于计算两个坐标点之间的欧氏距离。
  3. 实现一个误差函数error_function,用于评估估计位置与实际位置之间的误差。该函数计算估计位置到每个基站的距离,并将其与实际测量的距离进行比较。
  4. 主要的定位算法函数trilateration使用最小二乘优化方法来最小化误差函数。它需要提供初始估计位置、基站的位置信息以及目标到每个基站的距离作为输入参数,并返回估计的目标位置。

最小二乘法是一种常用的数学优化方法,用于找到一组参数,使得观测数据和模型预测之间的残差平方和最小化。它被广泛应用于拟合数据、解决线性方程组和参数估计等问题。

最小二乘法的基本原理是通过调整参数的值,使得模型的预测值与观测数据之间的误差最小化。具体来说,对于给定的数据集,最小二乘法通过最小化残差的平方和来确定最佳的参数。残差是观测数据与模型预测值之间的差异,平方和是为了忽略正负差异并放大较大的误差。

通过最小化残差的平方和,最小二乘法可以得到参数的最优解,这个解可以使得模型与实际观测数据之间的差异最小化。最小二乘法可以用于线性问题和非线性问题,具体的求解方法和算法可能会有所不同。

在实际应用中,最小二乘法广泛应用于各种领域,例如回归分析、数据拟合、信号处理和机器学习等。它提供了一种数学上可行且较为稳定的方法,通过优化参数来拟合数据并找到最佳的解决方案。

代码实现

以上述算法原理为基础,我们编写了以下2份Python代码来实现该定位算法

Python源码

通过4个基站求出标签坐标
import numpy as np
from scipy.optimize import least_squares


class vec3d:

    def __init__(self, x, y, z):
        self.x = x
        self.y = y
        self.z = z


def calculate_distance(p1, p2):
    return np.sqrt((p1.x - p2.x)**2 + (p1.y - p2.y)**2 + (p1.z - p2.z)**2)


def error_function(params, anchor_positions, distances):
    num_anchors = len(anchor_positions)
    x, y, z = params

    # Compute distances from estimated position to anchors
    estimated_position = vec3d(x, y, z)
    estimated_distances = np.zeros(num_anchors)
    for i in range(num_anchors):
        estimated_distances[i] = calculate_distance(estimated_position,
                                                    anchor_positions[i])

    # Calculate error as the difference between estimated distances and measured distances
    error = estimated_distances - distances
    return error


def trilateration(anchor_positions, distances):
    # Initial estimate for the target position
    initial_position = np.array([0.0, 0.0, 0.0])

    # Use least squares optimization to minimize the error function
    result = least_squares(error_function,
                           initial_position,
                           args=(anchor_positions, distances))

    # Extract the estimated target position
    estimated_position = result.x
    return estimated_position


if __name__ == '__main__':
    # Example usage
    anchor_positions = [
        vec3d(0, 0, 0.5),
        vec3d(6, 0, 0.5),
        vec3d(6, 6, 0.5),
        vec3d(0, 6, 2.5),
    ]
    distances = np.array([
        1.000000,
        5.000000,
        7.810250,
        6.403125,
    ])

    estimated_position = trilateration(anchor_positions, distances)
    # 结果精确到小数点后三位即可
    estimated_position = np.round(estimated_position, 3)
    print("Estimated Position:", estimated_position)
    # 验证距离以检查答案是否正确
    for i in range(len(anchor_positions)):
        print(
            calculate_distance(
                vec3d(estimated_position[0], estimated_position[1],
                      estimated_position[2]), anchor_positions[i]))

输出信息

Estimated Position: [ 1.  -0.   0.5]
1.0
5.0
7.810249675906654
6.4031242374328485
通过多个基站求出标签坐标

多基站定位其实跟上面的4基站定位是一样的代码,只不过anchor_positionsdistances这两个变量中多新增n组值,具体源码见下

import numpy as np
from scipy.optimize import least_squares


class vec3d:

    def __init__(self, x, y, z):
        self.x = x
        self.y = y
        self.z = z


def calculate_distance(p1, p2):
    return np.sqrt((p1.x - p2.x)**2 + (p1.y - p2.y)**2 + (p1.z - p2.z)**2)


def error_function(params, anchor_positions, distances):
    num_anchors = len(anchor_positions)
    x, y, z = params

    # Compute distances from estimated position to anchors
    estimated_position = vec3d(x, y, z)
    estimated_distances = np.zeros(num_anchors)
    for i in range(num_anchors):
        estimated_distances[i] = calculate_distance(estimated_position,
                                                    anchor_positions[i])

    # Calculate error as the difference between estimated distances and measured distances
    error = estimated_distances - distances
    return error


def trilateration(anchor_positions, distances):
    # Initial estimate for the target position
    initial_position = np.array([0.0, 0.0, 0.0])

    # Use least squares optimization to minimize the error function
    result = least_squares(error_function,
                           initial_position,
                           args=(anchor_positions, distances))

    # Extract the estimated target position
    estimated_position = result.x
    return estimated_position


# 通过指定标签坐标,计算与各基站的距离
def get_distance(anchor_positions, tag_position):
    num_anchors = len(anchor_positions)
    distances = np.zeros(num_anchors)
    for i in range(num_anchors):
        distances[i] = calculate_distance(tag_position, anchor_positions[i])
    return distances


if __name__ == '__main__':
    # 基站坐标
    anchor_positions = [
        vec3d(0, 0, 0.5),
        vec3d(6, 0, 0.5),
        vec3d(6, 6, 0.5),
        vec3d(0, 6, 2.5),
        vec3d(12, 6, 1.5),
        vec3d(18, 12, 0.5),
    ]

    # 通过指定标签坐标,计算与各基站的距离
    # tag_position = vec3d(3, 3, 1)
    # distances = get_distance(anchor_positions, tag_position)
    # print(distances)

    # 通过指定距离,计算标签坐标
    distances = np.array([4.27200187, 4.27200187, 4.27200187, 4.5, 9.5, 17.5])
    estimated_position = trilateration(anchor_positions, distances)
    estimated_position = np.round(estimated_position, 3)
    print("Estimated Position:", estimated_position)
    # 验证距离以检查答案是否正确
    for i in range(len(anchor_positions)):
        print(
            calculate_distance(
                vec3d(estimated_position[0], estimated_position[1],
                      estimated_position[2]), anchor_positions[i]))

输出信息

Estimated Position: [3. 3. 1.]
4.272001872658765
4.272001872658765
4.272001872658765
4.5
9.5
17.5

使用示例

为了演示该算法的使用,我们提供了一个简单的示例。假设有多个基站的位置和目标到这些基站的距离已知。通过调用trilateration函数,我们可以获得估计的目标位置。

结果分析

该算法通过利用多个基站的位置和距离信息,利用三边测量原理来估计目标在三维空间中的坐标。通过最小二乘优化,该算法能够提供较为准确的估计结果。然而,需要注意的是,该算法对基站位置的准确性要求较高,且受到信号传输的影响

结论

通过多个基站求出标签坐标的定位算法是一种常见而有效的定位方法。它在许多领域中具有广泛的应用前景,特别是在室内定位和物联网领域。通过三边测量和最小二乘优化,该算法能够提供准确的目标定位结果,为实际应用提供了一种可行的解决方案。

其他

此外,这是根据某UWB店铺给出的QT源码写的ESP32单片机的三边定位算法demo

该demo通过输入3个或4个基站的坐标,以及标签分别与基站的距离,得到标签的空间坐标

标签:distances,positions,基站,position,浅试,UWB,estimated,anchor
From: https://www.cnblogs.com/dapenson/p/17537093.html

相关文章

  • 晨控智能UWB室内定位:工厂智能化的新引擎
    晨控智能UWB室内定位:工厂智能化的新引擎工厂是一个复杂而庞大的环境,通常包括多个车间、设备、人员以及大量的物料和产品。需要实时、准确的定位数据来支持各项运营活动。然而,传统的定位技术无法满足工厂内部的高精度定位需求。而UWB室内定位技术的出现为工厂解决了这一难题。作为工......
  • UWB定位系统的应用及技术架构详解
    UWB定位是通过TDOA到达时间差的算法来实现人员定位的,有抗遮挡、抗干扰的优点,更适用于室内定位。其次,UWB是一种实时定位技术,可以不停的上报当前的人员数据,实时性非常强。再者,UWB定位系统的超高精度,定位误差小于10cm,使企业能够很精确的对人员进行监控。最为重要的是,UWB定位系统还可提......
  • UWB定位系统做0维一维二维三维定位
    UWB定位系统做0维/一维/二维/三维定位一、0维UWB定位(存在性检测)0维UWB定位系统,硬件方面只需要一个UWB基站和一个UWB标签即可实现,如下图1所示,一个UWB基站VDU2503和一个UWB标签VDU1501,UWB标签和基站之间相互通信,再通过和后台的交互实现对人员的存在性监测、报警等功能。二、一维......
  • UWB隧道管廊人员定位
    UWB隧道管廊人员定位技术:精准解决安全与效率问题隧道、地下轨道交通、矿井的建筑施工环境艰苦恶劣、事故多发、管理复杂,施工过程中迫切需要能够保障施工人员安全的管理系统,实现管理的现代化、信息化,提升作业人员的管理效率,同时保障人员的安全。在隧道管廊作业中,精确的定位和测距......
  • UWB MAC层技术浅谈
    前言​ 对于大多数人来说,使用DW1000相关测距例程,按着教程实现简单的一对一测距不会有什么大问题。但当应用到实际场景后,现场环境同时出现几台,几十台设备时就会发现整套系统会出现严重的丢包、通信不良问题。而这其中的原因,是因为DW1000芯片只提供了UWBPHY层的实现,只完成了设备之......
  • UWB定位 三基站加一个标签UWB相关资料 dwm1000模块 uwb定位 ds-twr测距 dw1000模块,
    UWB定位三基站加一个标签UWB相关资料dwm1000模块uwb定位ds-twr测距dw1000模块,双边双向测距,研创物联代码,最多支持4基站8标签测距,基站和标签、信道、速率等配置可通过USB虚拟串口进行切换,支持连接官方上位机(有QT5源码),可实现测距显示及定位坐标解算并显示位置,原理图,PCB,手册等......
  • UWB通信技术基本原理和测试流程
    简介:什么是UWB技术?超宽带(UltraWideBand,UWB)技术是一种无线载波通信技术,它不采用正弦载波,而是利用纳秒级的非正弦波窄脉冲传输数据,因此其所占的频谱范围很宽。UWB技术是一种使用1GHz以上频率带宽的无线载波通信技术。它不采用正弦载波,而是利用纳秒级的非正弦波窄脉冲传输数据,因......
  • 2023-05-30 浅试nodejs实现登录接口业务(未完,待测试)
    constexpress=require('express');constbodyParser=require('body-parser');constmysql=require('mysql');//创建MySQL连接池constpool=mysql.createPool({host:'localhost',user:'root',password......
  • 塔克拉玛干沙漠5G基站成为首个700MHz5G超远覆盖基站
    安科瑞虞佳豪近日,在位于新疆巴音郭勒蒙古自治州轮台县的塔克拉玛干沙漠,中国移动新疆公司开通了首个沙漠公路700MHz5G超远覆盖基站,覆盖距离达30公里。新疆移动网络优化中心总经理祁江伟介绍,700MHz网络由中国移动和中国广电共建共享,具有绕射能力强等优势,尤其适合新疆区域地广人稀......
  • FMC子卡设计资料原理图450-基于ADRV9009的双收双发射频FMC子卡 数字信号处理卡 射频收
    FMCJ450-基于ADRV9009的双收双发射频FMC子卡   一、板卡概述       ADRV9009是一款高集成度射频(RF)、捷变收发器,提供双通道发射器和接收器、集成式频率合成器以及数字信号处理功能。这款IC具备多样化的高性能和低功耗组合,FMC子卡为2路输入,2路输出的......