当前位置: 首页 > article >正文

【MATLAB例程】三维环境,基于TOA的动态轨迹定位,轨迹使用UKF(无迹卡尔曼滤波)进行滤波,模拟TOA/IMU的数据融合

请添加图片描述

本代码实现了一个基于到达时间(TOA)测距的三维定位系统,结合无迹卡尔曼滤波(UKF)对移动目标的轨迹进行优化。代码通过多锚节点(>3)的TOA测量数据,先进行初步定位解算,再通过UKF算法融合运动模型,实现对目标轨迹的高精度估计。

文章目录

  • 代码概述
  • 核心功能
  • 代码结构
  • 关键代码特点
  • 结果示例
  • 代码运行结果
    • 使用说明
  • MATLAB源代码

代码概述

本代码实现了一个基于到达时间(TOA)测距的三维定位系统,结合**无迹卡尔曼滤波(UKF)**对移动目标的轨迹进行优化。代码通过多锚节点(>3)的TOA测量数据,先进行初步定位解算,再通过UKF算法融合运动模型,实现对目标轨迹的高精度估计。

核心功能

  1. TOA定位仿真

    • 在三维空间中生成9个锚节点(baseP),通过三角函数添加随机扰动,模拟实际部署环境。
    • 目标沿预设轨迹(positions)运动:x轴匀速递增,y轴匀速递减,z轴保持恒定。
    • 计算每个锚节点到目标的真实距离(R_real),加入高斯噪声模拟TOA测量误差,生成带噪声的观测距离(R_calcu)。
  2. 最小二乘定位解算

    • 调用position_3dim函数,通过伪逆矩阵(pinv)求解超定方程组,实现目标位置的初步估计(p_out)。
  3. UKF轨迹优化

    • 构建状态空间模型:假设目标匀速运动(实际运动模型需根据场景调整)。
    • 使用Sigma点法处理非线性观测(如代码中Z = [x²/20; y; z]的非线性转换),通过预测-校正步骤优化定位结果。
    • 对比未滤波的纯观测解算(p_out)与UKF滤波结果,验证UKF对噪声的抑制能力。
  4. 可视化与误差分析

    • 三维轨迹图显示真实路径、观测值、UKF估计值及未滤波值的对比。
    • 分轴绘制绝对误差曲线,计算各时刻RMSE(均方根误差),量化定位精度。

代码结构

  1. 参数初始化

    • 设置光速(c)、测距误差(range_err)、目标轨迹(positions)及锚节点坐标(baseP)。
  2. 数据生成

    • 循环计算每个时刻目标的真实位置,生成含噪声的TOA测量数据。
  3. UKF滤波

    • 初始化噪声协方差矩阵(Q, R)及状态变量。
    • Sigma点生成、状态预测、观测更新及协方差调整。
  4. 结果分析

    • 绘制三维轨迹图及误差曲线,输出终点坐标误差及全程RMSE统计。

在这里插入图片描述

关键代码特点

  • 锚节点生成:采用三角函数叠加随机扰动(如sin(1:n)),确保锚节点在三维空间非共面分布,避免定位歧义。
  • 非线性观测模拟:在UKF观测模型中,故意将x坐标平方后除以20(Z = [x²/20; y; z]),测试滤波器处理非线性能力。

结果示例

  • 轨迹对比:UKF估计值(蓝色点)紧密贴合真实轨迹(蓝色线),显著优于未滤波的观测值(散点)和纯惯性模拟(未滤波值)。
  • 误差分析:UKF在各轴上的RMSE均低于直接观测,尤其在X轴(存在非线性观测)提升明显。
  • 统计输出:终点距离误差UKF较纯观测减少约30%~50%,验证滤波有效性。

代码运行结果

定位示意图:
在这里插入图片描述
三轴误差图:
在这里插入图片描述
命令行输出截图:
在这里插入图片描述
RMSE曲线对比(三轴误差合并为距离误差):
在这里插入图片描述

使用说明

  1. 参数调整

    • 修改range_err调整测距噪声强度,QR影响滤波器的收敛速度与稳定性。
    • 调整锚节点数量(n)及生成方式(baseP)以适应不同场景。
  2. 扩展方向

    • 替换运动模型为更复杂的动力学方程(如加速度模型)。
    • 改进观测模型,适配实际传感器的非线性特性。

MATLAB源代码

部分源代码如下:

% TOA测距定位,三维任意(>3)个锚节点,对一个未知点定位、带UKF的轨迹解算
% author:Evand(VX:matlabfilter)
% 2025-03-17/Ver1
clear;clc;close all;
rng(0);
%% 主程序
c = 3e8; %信号传输速度,即光速
range_err = 1e-9; %时钟与时间计算误差
point1 = [1,2,1]; %待求点坐标真值
% 生成目标的运动
positions = repmat(point1,21,1)+[0:0.2:4;0:-0.2:-4;zeros(1,21)]';

for i1 = 1:size(positions,1)
    point1 = positions(i1,:);
    n = 9; %定义锚节点数量
    baseP = 2*[sin(1:n)+0.01*[1:n]+1;cos(4*(1:n))+0.01*[1:n]+1;cos(2*(1:n))+0.01*[1:n]+1]';
    R_real = sqrt(diag((point1-baseP)*(point1'-baseP')));
    TOA = R_real/c+range_err*randn; %含噪声的传播时间
    R_calcu = TOA*c;
    p_out(i1,:) = position_3dim(R_calcu,baseP);

end

%% UKF部分
% 滤波模型初始化
t = 1:1:size(positions,1); %设置时间序列
Q = 0.01 * diag([1, 1, 1]); % 过程噪声协方差矩阵
w = sqrt(Q) * randn(size(Q, 1), length(t)); % 过程噪声
R = 0.1 * diag([1, 1, 1]); % 观测噪声协方差矩阵
% v = sqrt(R) * randn(size(R, 1), length(t)); % 观测噪声
P0 = 0.2 * eye(3); % 初始状态协方差矩阵
X = zeros(3, length(t)); % 真实状态
X_ukf = zeros(3, length(t)); % 扩展卡尔曼滤波估计的状态
Z = zeros(3, length(t)); % 观测值形式

完整代码下载链接:https://download.csdn.net/download/callmeup/90538614

如需帮助,或有导航、定位滤波相关的代码定制需求,请点击下方卡片联系作者


http://www.kler.cn/a/613741.html

相关文章:

  • 初级:I/O与NIO面试题深度剖析
  • 使用node-cmd重启electron
  • 算法学习第十七天:LRU缓存与布隆过滤器
  • 轮循取值算法数据库
  • TwinCAT3-Udp点对点自由协议通信
  • 自动驾驶---打造自动驾驶系统之参考线平滑(四)
  • gitee 常用指令
  • springboot的跨域是什么?遇到跨域问题如何解决?
  • 华宇TAS应用中间件与晓窗科技智慧校园管理一体化平台完成兼容互认证
  • linux ACL权限控制之用户权限控制程序设计
  • 使用Python和OpenCV进行指纹识别与验证
  • Resume全栈项目(二)(.React+Ts)
  • 【漫话机器学习系列】166.向量(Vectors)
  • ubuntu 创建新用户
  • Flink Credit-based机制解析
  • 数字化攻防战场的进化论:红蓝对抗训练如何重塑网络安全范式
  • PTA 7-16 一元多项式求导
  • Axure项目实战:智慧城市APP(六)市民互动(动态面板、显示与隐藏)
  • 【Linux-驱动开发-模块的加载和卸载】
  • 【深度学习】训练集、测试集、验证集、过拟合、欠拟合详解