uwb最小二乘空间定位+python模拟

这篇具有很好参考价值的文章主要介绍了uwb最小二乘空间定位+python模拟。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

传统最小二乘空间定位原理

假设UWB定位系统里有n个基站。基站坐标设为 ( x i , y i , z i ) (x_{i},y_{i},z_{i}) (xi,yi,zi)(i=1,2,3…),标签坐标为(x,y,z),标签到基站的距离设为 d i ( i = 1 , 2 , 3... ) d_{i}(i=1,2,3...) di(i=1,2,3...)可得以下关系式
{ ( x − x 1 ) 2 + ( y − y 1 ) 2 + ( z − z 1 ) 2 = d 1 2 ( x − x 2 ) 2 + ( y − y 2 ) 2 + ( z − z 2 ) 2 = d 2 2 ⋯ ( x − x n ) 2 + ( y − y n ) 2 + ( z − z n ) 2 = d n 2 \begin{cases}\left(x-x_1\right)^2+\left(y-y_1\right)^2+\left(z-z_1\right)^2=d_1^2\\\left(x-x_2\right)^2+\left(y-y_2\right)^2+\left(z-z_2\right)^2=d_2^2\\\cdots\\\left(x-x_n\right)^2+\left(y-y_n\right)^2+\left(z-z_n\right)^2=d_n^2\end{cases} (xx1)2+(yy1)2+(zz1)2=d12(xx2)2+(yy2)2+(zz2)2=d22(xxn)2+(yyn)2+(zzn)2=dn2
从第二式开始减去第一式,消去 x 2 , y 2 , z 2 x^2,y^2,z^2 x2,y2,z2可得
{ ( x 2 2 − x 1 2 ) + ( y 2 2 − y 1 2 ) + ( z 2 2 − z 1 2 ) − 2 ( x 2 − x 1 ) x − 2 ( y 2 − y 1 ) y − 2 ( z 2 − z 1 ) z = d 2 2 − d 1 2 ( x 3 2 − x 1 2 ) + ( y 3 2 − y 1 2 ) + ( z 3 2 − z 1 2 ) − 2 ( x 3 − x 1 ) x − 2 ( y 3 − y 1 ) y − 2 ( z 3 − z 1 ) z = d 3 2 − d 1 2 ⋮ ( x n 2 − x 1 2 ) + ( y n 2 − y 1 2 ) + ( z n 2 − z 1 2 ) − 2 ( x n − x 1 ) x − 2 ( y n − y 1 ) y − 2 ( z n − z 1 ) z = d n 2 − d 1 2 \begin{cases}({x_2}^2-{x_1}^2)+({y_2}^2-{y_1}^2)+({z_2}^2-{z_1}^2)-2(x_2-x_1)x-2(y_2-y_1)y-2(z_2-z_1)z={d_2}^2-{d_1}^2\\ ({x_3}^2-{x_1}^2)+({y_3}^2-{y_1}^2)+({z_3}^2-{z_1}^2)-2({x_3}-x_1)x-2({y_3}-y_1)y-2({z_3}-z_1)z={d_3}^2-{d_1}^2\\ \vdots\\ ({x_n}^2-{x_1}^2)+({y_n}^2-{y_1}^2)+({z_{n}}^2-{z_1}^2)-2({x_{n}}-{x_1})x-2({y_n}-{y_1})y-2({z_{n}}-z_1)z={d_n}^2-{d_1}^2\end{cases} (x22x12)+(y22y12)+(z22z12)2(x2x1)x2(y2y1)y2(z2z1)z=d22d12(x32x12)+(y32y12)+(z32z12)2(x3x1)x2(y3y1)y2(z3z1)z=d32d12(xn2x12)+(yn2y12)+(zn2z12)2(xnx1)x2(yny1)y2(znz1)z=dn2d12

化成矩阵形式为AX=B
A = 2 [ x 1 − x 2 y 1 − y 2 z 1 − z 2 x 1 − x 3 y 1 − y 3 z 1 − y z 3 ⋮ ⋮ x 1 − x n y 1 − y n z 1 − z n ] \left.A=2\left[\begin{matrix}x_1-x_2 & & y_1-y_2 & z_1-z_2\\ x_1-x_3 & & y_1-y_3 & z_1-yz_3\\ \vdots & & \vdots & \\ x_1-x_{n} & & y_1-y_{n} & z_1-z_{n}\end{matrix}\right.\right] A=2 x1x2x1x3x1xny1y2y1y3y1ynz1z2z1yz3z1zn
X = [ x y z ] X=\begin{bmatrix}x\\y\\z\end{bmatrix} X= xyz
B = [ d 2 2 − d 1 2 + ( x 1 2 − x 2 2 ) + ( y 1 2 − y 2 2 ) + ( z 1 2 − z 2 2 ) d 3 2 − d 1 2 + ( x 1 2 − x 3 2 ) + ( y 1 2 − y 3 2 ) + ( z 1 2 − z 3 2 ) ⋮ d n 2 − d 1 2 + ( x 1 2 − x n 2 ) + ( y 1 2 − y n 2 ) + ( z 1 2 − z n 2 ) ] \left.B=\left[\begin{matrix}{{d}_{2}}^2-{{d}_{1}}^2+({x_{1}}^2-{x_{2}}^2)+({y_{1}}^2-{y_{2}}^2)+({z_1}^2-{z_2}^2) & \\ {{d}_{3}}^2-{{d}_{1}}^2+({x_{1}}^2-{x_{3}}^2)+({y_{1}}^2-{y_{3}}^2)+({z_1}^2-{z_3}^2) & \\ \vdots & \\ {{d}_{n}}^2-{{d}_{1}}^2+({x_{1}}^2-{x_{n}}^2)+({y_{1}}^2-{y_{n}}^2)+({z_1}^2-{z_{n}}^2) & \end{matrix}\right.\right] B= d22d12+(x12x22)+(y12y22)+(z12z22)d32d12+(x12x32)+(y12y32)+(z12z32)dn2d12+(x12xn2)+(y12yn2)+(z12zn2)

要求X可得
[ x y z ] = 1 2 ( A T A ) − 1 A T B \begin{bmatrix}x\\ y\\ z\end{bmatrix}=\dfrac{1}{2}\Big(A^{T}A\Big)^{-1}A^{T}B xyz =21(ATA)1ATB
要求三维坐标至少四个基站

python算法模拟
这里先模拟二维的,使用最小二乘法求解时,会因基站z轴坐标差值小导致误差较大,相较与水平坐标,z坐标不可靠,故采用其他方法获取z值文章来源地址https://www.toymoban.com/news/detail-827184.html

import tkinter as tk

import numpy as np

import math

import random

import matplotlib.pyplot as plt

  

class MapApp:

    def __init__(self, master):

        self.master = master

        self.master.title("UWB Emulation")

        self.master.geometry("800x600")

  

        self.num_base_stations = 4

        self.base_stations = [(random.randint(50, 550), random.randint(50, 550)) for _ in range(self.num_base_stations)]

        self.noise_mean = 0

        self.noise_stddev = 1

  

        self.canvas = tk.Canvas(self.master, width=600, height=600, bg="white")

        self.canvas.pack(side=tk.LEFT)

  

        self.label = tk.Label(self.master, text="")

        self.label.pack()

  

        self.mouse_marker = None

        self.distance_circles = []

  

        self.create_widgets()

        # 鼠标移动时进行一次计算

        self.canvas.bind("<Motion>", self.show_mouse_position)

  

    def create_widgets(self):

        self.create_base_stations()

        self.create_noise_slider()

  

    def create_base_stations(self):

        i=0

        for station in self.base_stations:

  

            x, y = station

            self.canvas.create_oval(x - 5, y - 5, x + 5, y + 5, fill="red")

             # 在标签中显示每个基站的坐标

            station_label = tk.Label(self.master, text=f"Base Station {i+1}: ({x}, {y})")

            station_label.pack()

            i = i+1

  

    def calculate_distance(self, x, y):

        distances = [math.sqrt((x - station[0])**2 + (y - station[1])**2) + random.gauss(self.noise_mean, self.noise_stddev) for station in self.base_stations]

        return distances

  

    def draw_distance_circles(self, x, y, distances):

        for i, station in enumerate(self.base_stations):

            x0, y0 = station

            radius = distances[i]

            circle = self.canvas.create_oval(x0 - radius, y0 - radius, x0 + radius, y0 + radius, outline="blue")

            self.distance_circles.append(circle)

  
  

    #最小二乘法

  

    def uwb_LeastQusare(self, distance_vector):

        # 创建A矩阵

        x_1, y_1 = self.base_stations[0]

        a = np.array([[x_1 - station[0], y_1 - station[1]] for station in self.base_stations[1:]])

        # 创建B矩阵

        d_1 = distance_vector[0]

        # print('test')

        # print(distance_vector[1]**2 - d_1**2)

        # print(distance_vector[1]**2 - d_1**2 + (x_1**2 - self.base_stations[1][0]**2))

        # print(distance_vector[1]**2 - d_1**2 + (x_1**2 - self.base_stations[1][0]**2) + (y_1**2 - self.base_stations[1][1]**2))

        b = np.array([[distance_vector[i]**2 - d_1**2 + (x_1**2 - station[0]**2) + (y_1**2 - station[1]**2)] for i, station in enumerate(self.base_stations[1:],start=1)])

  

        X = np.dot(np.linalg.inv(np.dot(np.transpose(a), a)), np.dot(np.transpose(a), b)) * 0.5

        # print('aa:')

        # print(a)

        # print('bb:')

        # print(b)

        # print('cc')

        # print(X)

        return X;

  

  

    def show_mouse_position(self, event):

        if self.mouse_marker:

            self.canvas.delete(self.mouse_marker)

        true_val = event.x, event.y

        x, y = event.x, event.y

        distances = self.calculate_distance(x, y)

        distance_text = "\n".join([f"Base Station {i+1}: {dist:.2f}" for i, dist in enumerate(distances)])

        self.label.config(text=f"Mouse Position: ({x}, {y})\nDistances to Base Stations:\n{distance_text}")

        #最小二乘法求解

        result = self.uwb_LeastQusare(distances)

        Err_val = (true_val[0]-result[0])**2 + (true_val[1]-result[1])**2

        print('result'+'     '+str(result))

        print(Err_val)

  

        self.mouse_marker = self.canvas.create_oval(x - 3, y - 3, x + 3, y + 3, fill="green")

  

        for circle in self.distance_circles:

            self.canvas.delete(circle)

        self.distance_circles = []

  

        self.draw_distance_circles(x, y, distances)

  

    def create_noise_slider(self):

        noise_frame = tk.Frame(self.master)

        noise_frame.pack()

  

        noise_label = tk.Label(noise_frame, text="Noise Level:")

        noise_label.pack(side=tk.LEFT)

  

        noise_slider = tk.Scale(noise_frame, from_=0, to=100, resolution=0.1, orient=tk.HORIZONTAL, command=self.update_noise_level)

        noise_slider.pack(side=tk.LEFT)

  

    def update_noise_level(self, value):

        self.noise_stddev = float(value)

  

    def get_distance_values(self):

        # 获取显示在窗口上的距离值

        return self.label["text"]

  
  

def main():

    root = tk.Tk()

    app = MapApp(root)

    root.mainloop()

  

    # 获取显示在窗口上的距离值

    distance_values = app.get_distance_values()

    print("Distance Values:", distance_values)

  

if __name__ == "__main__":

    main()

到了这里,关于uwb最小二乘空间定位+python模拟的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【scipy】Python调用非线性最小二乘法

    在scipy中,非线性最小二乘法的目的是找到一组函数,使得误差函数的平方和最小,可以表示为如下公式 arg min ⁡ f i F ( x ) = 0.5 ∑ i = 0 m − 1 ρ ( f i ( x ) 2 ) , x ∈ [ L , R ] argmin_{f_i} F(x) = 0.5sum_{i=0}^{m-1}rho(f_i(x)^2),quad xin[L,R] f i ​ arg min ​ F ( x ) = 0.5 i = 0 ∑ m − 1 ​ ρ ( f i

    2024年02月09日
    浏览(38)
  • chatgpt赋能python:Python如何拟合直线:使用最小二乘法

    在数据分析和机器学习领域,拟合一个最佳的直线是很常见和有用的。Python中有很多库可以拟合直线,但最小二乘法是其中最常用的一种方法。在本文中,我们将介绍最小二乘法的原理和如何在Python中实现。 最小二乘法是一种常用的回归分析方法,目的是找到一条直线来拟合

    2024年02月08日
    浏览(61)
  • Python实现递归最小二乘法回归模型(RecursiveLS算法)项目实战

    说明:这是一个机器学习实战项目(附带 数据+代码+文档+视频讲解 ),如需 数据+代码+文档+视频讲解 可以直接到文章最后获取。 RLS主要是在误差平方和最小的原则基础上, 提出一种解析的拟合模型参数的迭代递推公式;可以实现在新的样本数据到来时, 利用新的样本数据以及

    2024年01月16日
    浏览(59)
  • UWB定位问题(TOA定位matlab实现)

    四点定位(Four-Anchor Positioning)是一种基于距离测量的定位方法,通常采用TOA方法来计算目标物体到每个基站的距离。通过测量目标物体到至少四个基站的距离,并利用三角定位等算法计算出目标物体的位置。因此,四点定位属于TOA定位方法的一种。 在UWB精确定位中,四点定

    2024年02月16日
    浏览(44)
  • 采用UWB定位技术开发的室内定位系统源码

    UWB 精准定位系统源码 UWB 是什么?         UWB(Ultra Wideband)超宽带技术是一种全新的、与传统通信技术有极大差异的通信新技术。它不需要使用传统通信体制中的载波,而是通过发送和接收具有纳秒或纳秒级以下的极窄脉冲来传输数据,实现精准定位。   技术细节:  开发语

    2024年02月09日
    浏览(59)
  • 室内定位常用定位技术_米级蓝牙定位方案,厘米级UWB定位方案

    随着物联网生态链逐渐走向成熟,各行各业对定位的需求也大大增加。由于GPS卫星信号在室内无法定位,且容易受到各种无线电信号的干扰,为实现“最后一公里”的室内位置服务,目前主流的室内定位你技术多依赖于热门的无线通信技术,比如蓝牙技术、WiFi技术、超宽带技

    2024年02月01日
    浏览(57)
  • 2304. 网格中的最小路径代价 : 从「图论最短路」过渡到「O(1) 空间的原地模拟」

    这是 LeetCode 上的 「2304. 网格中的最小路径代价」 ,难度为 「中等」 。 Tag : 「最短路」、「图」、「模拟」、「序列 DP」、「动态规划」 给你一个下标从 0 开始的整数矩阵 grid ,矩阵大小为 m x n ,由从 0 到 的不同整数组成。 你可以在此矩阵中,从一个单元格移动到下一行

    2024年01月23日
    浏览(49)
  • 最小二乘估计理论

    不需输入输出为随机过程,求最优权向量使得输出估计结果的样本均方误差最小 b ^ ⃗ H = w ⃗ H A H { b ^ H = [ d ^ ( M ) d ^ ( M + 1 ) ⋯ d ^ ( N ) ] A H = [ u ( M ) u ( M + 1 ) ⋯ u ( N ) ] = [ u ( M ) u ( M + 1 ) ⋯ u ( N ) u ( M − 1 ) u ( M ) ⋯ u ( N − 1 ) ⋮ ⋮ ⋱ ⋮ u ( 1 ) u ( 2 ) ⋯ u ( N − M + 1 ) ] w =

    2024年02月09日
    浏览(37)
  • 最小二乘估计心得

    存在一组观察值 ( x i , y i ) (x_i, y_i) ( x i ​ , y i ​ ) ,其中 y i y_i y i ​ 和 x i x_i x i ​ 之间满足一定的线性关系,如 y = a 0 f 0 ( x ) + a 1 f 1 ( x ) + . . . + a m − 1 f m − 1 ( x ) y = a_0 f_0(x) + a_1 f_1(x) + ... + a_{m-1} f_{m-1}(x) y = a 0 ​ f 0 ​ ( x ) + a 1 ​ f 1 ​ ( x ) + ... + a m − 1 ​ f m −

    2024年02月08日
    浏览(36)
  • 非线性最小二乘

    在经典最小二乘法估计中,假定被解释变量的条件期望是关于参数的线性函数,例如 E ( y ∣ x ) = a + b x E(y|x) = a+bx E ( y ∣ x ) = a + b x 其中 a , b a,b a , b 为待估参数, E ( y ∣ x ) E(y|x) E ( y ∣ x ) 是关于参数 a , b a,b a , b 的线性函数。但 E ( y ∣ x ) E(y|x) E ( y ∣ x ) 是关于参数的非线

    2024年02月04日
    浏览(61)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包