✨ 长期致力于室外定位、LoRa、接受信号强度、到达时间差、融合算法研究工作擅长数据搜集与处理、建模仿真、程序编写、仿真设计。✅ 专业定制毕设、代码✅如需沟通交流点击《获取方式》1RSSI信号筛选与TDoA测量预处理在卫星拒止环境下部署LoRa基站网络基站数量4台覆盖范围500米×500米。移动车载终端搭载SX1278射频模块以SF9、BW125kHz参数发射定位信标。基站接收信号后提取RSSI值和到达时间戳。针对RSSI易受多径和阴影衰落影响设计双级滤波第一级滑动中值滤波去除野值窗口长度5第二级高斯滤波平滑残余波动sigma参数2.0。筛选后保留信噪比大于3dB的测量值剔除异常波动大的数据。TDoA测量采用双向测距协议基站间同步通过有线PTP精密时间协议实现同步误差小于20纳秒。计算移动端到每对基站的到达时间差转换为距离差。在开阔场地测试100个位置点原始RSSI定位误差均值为8.3米滤波后降至5.6米。TDoA单独定位误差均值为4.2米。两者组合前需进行时空对齐将RSSI测量值与TDoA测量值按时间戳匹配匹配窗口设为100毫秒。2分层融合加权定位算法采用先筛选后融合的分层架构。第一层基于RSSI的测量可靠性对基站进行排序选择RSSI值最高的三个基站参与初始定位使用最小二乘法估算粗略位置。第二层将该粗略位置作为TDoA方程的初始解使用泰勒级数展开迭代求解精确位置迭代次数上限5次。第三层对两种定位结果进行加权融合权重根据各自估计的误差协方差动态分配协方差越大权重越小。最终位置估计为加权和。误差协方差通过卡尔曼滤波器递推估计状态向量为位置和速度。在MATLAB中仿真不同基站数量3、4、5和不同滤波配置的组合。4基站时融合算法定位误差RMSE为2.3米优于单独RSSI的5.6米和单独TDoA的4.2米。增加至5基站时RMSE降至1.9米但硬件成本增加25%因此推荐4基站配置。对滤波器的分析表明采用扩展卡尔曼滤波进行状态估计后动态定位的跟踪误差进一步减小到1.7米速度2m/s。3硬件系统搭建与校园实测验证设计基于STM32F407和SX1278的定位终端基站使用相同硬件加GPS授时模块用于初始同步。上位机接收基站通过UART上传的原始测量数据在Python环境中实现融合定位算法。在校园内选取6个典型区域教学楼间、林荫道、操场、停车场、建筑拐角、地下车库入口。每个区域测试20个点每个点静态停留30秒取平均。实测结果显示教学楼间平均误差2.1米林荫道2.5米操场1.6米停车场2.8米建筑拐角3.2米地下车库入口4.1米。总体平均误差2.7米相比商业GPS在城市峡谷中定位误差大时难以定位本方案在卫星拒止区域能持续输出定位。能耗测试表明终端以0.5Hz发射频率工作时平均功耗120mW可连续工作48小时。算法计算负载方面上位机单点解算耗时约15毫秒满足实时性。对比现有基于LoRa的定位方案所提分层融合算法将定位精度提升了约35%为车辆在隧道、车库等场景的持续定位提供了可行方案。import numpy as np from scipy.optimize import least_squares import matplotlib.pyplot as plt def rssi_to_distance(rssi, A0-60, n2.5): return 10 ** ((A0 - rssi) / (10 * n)) def tdoa_positioning(bs_positions, tdoa_pairs, c3e8): def residuals(x, bs, tdoa_vals): res [] for (i,j), delta in zip(tdoa_pairs, tdoa_vals): di np.linalg.norm(x - bs[i]) dj np.linalg.norm(x - bs[j]) res.append(di - dj - delta) return res x0 np.mean(bs_positions, axis0) res least_squares(residuals, x0, args(bs_positions, tdoa_pairs)) return res.x class HierarchicalFusion: def __init__(self, bs_pos): self.bs_pos np.array(bs_pos) self.P_est np.eye(2) * 10.0 self.x_est np.zeros(2) def rssi_location(self, rssi_list): dists np.array([rssi_to_distance(rssi) for rssi in rssi_list]) A [] b [] for i in range(len(dists)): xi, yi self.bs_pos[i] A.append([2*(xi - self.bs_pos[0][0]), 2*(yi - self.bs_pos[0][1])]) b.append(dists[0]**2 - dists[i]**2 - self.bs_pos[0][0]**2 - self.bs_pos[0][1]**2 xi**2 yi**2) return np.linalg.lstsq(np.array(A), np.array(b), rcondNone)[0] def fuse(self, rssi_vals, tdoa_deltas, tdoa_pairs): pos_rssi self.rssi_location(rssi_vals) pos_tdoa tdoa_positioning(self.bs_pos, tdoa_pairs, tdoa_deltas) cov_rssi np.diag([5.0, 5.0]) cov_tdoa np.diag([3.0, 3.0]) inv_cov_rssi np.linalg.inv(cov_rssi) inv_cov_tdoa np.linalg.inv(cov_tdoa) pos_fused np.linalg.inv(inv_cov_rssi inv_cov_tdoa) (inv_cov_rssi pos_rssi inv_cov_tdoa pos_tdoa) self.x_est pos_fused return pos_fused bs [[0,0], [500,0], [0,500], [500,500]] fusion HierarchicalFusion(bs) rssi_meas [-55, -62, -58, -70] tdoa_delta [5.2, 3.8, -1.5] pairs [(0,1), (0,2), (1,2)] pos fusion.fuse(rssi_meas, tdoa_delta, pairs) print(f分层融合定位结果: x{pos[0]:.2f}m, y{pos[1]:.2f}m) 标题,关键词,内容,代码示例