【MATLAB例程】三维环境下,动态轨迹的AOA定位与UKF滤波,模拟IMU/AOA的数据融合(AOA的测角基站数量可自适应,目标运动轨迹可自行修改)

embedded/2025/3/31 0:24:04/

在这里插入图片描述

本文所述的MATLAB 代码实现了基于到达角(AOA)定位的三维定位算法,使用自适应基站数量进行动态轨迹优化。通过无迹卡尔曼滤波(UKF)技术,代码能够提高定位精度,处理动态目标的轨迹

文章目录

  • 程序讲解
    • 功能模块
    • 关键技术
    • 结果示例
  • MATLAB源代码

程序讲解

功能模块

  1. 初始化

    • 清空工作环境,设置随机种子。
    • 生成目标点坐标和运动轨迹,定义固定基站的位置。
  2. AOA 定位

    • 计算目标到各基站的距离。
    • 模拟接收到的 AOAs(包括噪声)。
    • 使用最小二乘法进行三维定位估计。
  3. UKF 部分

    • 初始化滤波模型,包括过程噪声和观测噪声协方差矩阵。
    • 进行状态预测和更新,通过迭代优化目标位置的估计。
  4. 绘图

    • 绘制目标的真实轨迹、预测轨迹和观测值的三维图。
    • 生成每个轴的误差图,展示观测值与真实值的差异。
  5. 位置与误差输出

    • 打印终点的真实坐标、估计坐标及其误差。
    • 计算并输出每时刻的均方根误差(RMSE),并绘制 RMSE 比较图。

关键技术

  • AOA 定位:通过测量目标相对于多个基站的角度来进行位置估计。
  • 最小二乘法:用于求解定位估计的线性方程。
  • 无迹卡尔曼滤波(UKF):一种非线性滤波技术,用于提高动态系统状态估计的精度。

结果示例

  1. 轨迹对比图
    • UKF估计值(蓝色点)紧密贴合真实轨迹(蓝色线),显著优于未滤波的观测值(散点)。
    • 锚点(红色星号)随机分布,验证算法的自适应能力。
  2. 误差分析
    • X/Y轴误差受运动模型影响较大,UKF有效抑制累计误差;Z轴误差因静态假设接近零。
    • RMSE曲线显示UKF全程误差波动最小,稳定性优于纯观测

具体如下:

  • 定位示意图:
    在这里插入图片描述

  • RMSE对比曲线图:
    在这里插入图片描述

  • 三轴误差图:
    在这里插入图片描述

  • 命令行窗口截图:
    在这里插入图片描述

MATLAB源代码

源代码的结构如下:

在这里插入图片描述
部分代码如下:

matlab">% AOA定位,三维、N个锚点(自适应基站数量),动态轨迹UKF优化
% 作者:matlabfilter
% 2025-03-17/Ver1%% 初始化
clc;clear;close all;
rng(0);
% 生成目标点坐标
position = [-1,-1,1];
% 生成目标的运动
positions = repmat(position,21,1)+[0:0.2:4;0:-0.2:-4;zeros(1,21)]';% 固定基站位置
num_station =10; %基站数量
stations_position=2*randn(num_station,3); %定义基站的坐标,这里是随机坐标for i1 = 1:size(positions,1)position = positions(i1,:);
%% AOA定位
% 计算目标到各基站的距离
true_distances = vecnorm(stations_position - position, 2, 2);% 模拟接收到的AOA(此时是角度理想值,后面要加噪声)
azimuth_angles = atan2(position(2) - stations_position(:, 2), position(1) - stations_position(:, 1));
elevation_angles = atan2(position(3) - stations_position(:, 3), ...sqrt((position(1) - stations_position(:, 1)).^2 + (position(2) - stations_position(:, 2)).^2));% 假设测量的AOA角度和距离上加一些噪声
AOA_noise = 1e-2; % AOA 角度噪声
azimuth_angles = azimuth_angles + AOA_noise * randn(num_station, 1);
elevation_angles = elevation_angles + AOA_noise * randn(num_station, 1);
% 使用最小二乘法进行定位估计 三维直接求解(无需距离)
H = zeros(2*20,3);
Y = zeros(2*20,1);
for i2 = 1:num_stationH(2*i2-1:2*i2,:) = [sin(azimuth_angles(i2)),-cos(azimuth_angles(i2)),0;cos(azimuth_angles(i2))*sin(elevation_angles(i2)),sin(azimuth_angles(i2))*sin(

完整代码:https://download.csdn.net/download/callmeup/90538619

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


http://www.ppmy.cn/embedded/177468.html

相关文章

【面试题】在 CSS 中,实现一个 div 中的子 div 水平垂直居中

1. 使用 Flexbox 特点:简单、直观,现代浏览器支持良好。 代码: css .parent {display: flex;justify-content: center; /* 水平居中 */align-items: center; /* 垂直居中 */height: 200px; /* 父容器需有高度 */ } .child {…

第七章:优化热点语句_《C++性能优化指南》_notes

优化热点语句 第七章重难点详解与代码示例1. 从循环中移除代码2. 从函数中移除代码3. 优化表达式4. 控制流程优化 总结《C性能优化指南》第七章核心内容多选题目设计题目多选题答案与解析设计题答案与示例代码 第七章重难点详解与代码示例 1. 从循环中移除代码 1.1 缓存循环结…

Flutter完整开发实战详解(一、Dart语言和Flutter基础)

前言 在如今的 Flutter 大潮下,本系列是让你看完会安心的文章。本系列将完整讲述:如何快速从0开发一个完整的 Flutter APP,配套高完成度 Flutter 开源项目 GSYGithubAppFlutter。同时也会提供一些 Flutter 的开发细节技巧,并针对…

browser-use 库网页自动化截图

目录 代码代码解释执行效果 代码 import asyncio import base64 import os from datetime import datetimeimport pytestfrom browser_use.browser.browser import Browser, BrowserConfigasync def test_take_full_page_screenshot():browser Browser(configBrowserConfig(b…

【Kafka】Kafka生产者如何实现冥等的?

Kafka的生产者在发送数据到broker,如果broker在收到消息后崩溃或者断开连接,导致生产者没有接收到成功响应,这时会触发重试机制,这种场景下回导致消息的重复。 冥等性 如果一个操作被执行多次,结果与执行一次相同&…

【树莓派Pico FreeRTOS】-Mutex(互斥体)

Mutex(互斥体) 文章目录 Mutex(互斥体)1、硬件准备2、软件准备3、FreeRTOS的Mutex介绍4、完整示例RP2040 由 Raspberry Pi 设计,具有双核 Arm Cortex-M0+ 处理器和 264KB 内部 RAM,并支持高达 16MB 的片外闪存。 广泛的灵活 I/O 选项包括 I2C、SPI 和独特的可编程 I/O (P…

OpenCV图像拼接(9)实现图像拼接功能的一个高级接口cv::Stitcher

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 cv::Stitcher 类是OpenCV中用于实现图像拼接功能的一个高级接口。它简化了从一组部分重叠的图像创建全景图的过程,隐藏了许多底层细节…

vscode连接服务器失败问题解决

文章目录 问题描述原因分析解决方法彻底删除VS Code重新安装较老的版本 问题描述 vscode链接服务器时提示了下面问题: 原因分析 这是说明VScode版本太高了。 https://code.visualstudio.com/docs/remote/faq#_can-i-run-vs-code-server-on-older-linux-distribu…