【PSINS进阶例程】雷达三维跟踪与EKF轨迹滤波。带坐标转换,观测为斜距、方向角、俯仰角。MATLAB编写,附下载链接

基于 PSINS工具箱【需提前安装,工具箱开源】的运动建模与滤波,实现 IMU 与雷达观测融合的扩展卡尔曼滤波(EKF)示例。利用PSINS的轨迹生成模块构造三维机动轨迹,并按设定的加速度、转弯、爬升/下降段生成真实 AVP(姿态-速度-位置)序列。随后给 IMU 数据加入安装误差、随机漂移和噪声,形成带误差的惯导数据,并通过 insupdate 完成惯导解算。
人工撰写,拒绝AI,包运行成功

文章目录

程序简介

本程序利用 P S I N S PSINS PSINS工具箱构建一个三维机动轨迹,并模拟 I M U IMU IMU与雷达观测数据,用于演示扩展卡尔曼滤波(EKF)在惯导与外部传感器融合中的具体实现流程。

程序首先通过多段轨迹段(匀速、加速、转弯、爬升、下降等)生成一条空间运动轨迹,并得到对应的姿态、速度、位置及理想 IMU 数据。随后为 IMU 引入噪声、随机漂移和安装误差,得到更贴近真实环境的带误差惯导信息,并使用惯导解算模块进行连续更新。

雷达传感器被放置在固定位置,能量测目标的距离、俯仰角和方位角。程序构造带噪声的雷达观测,并将其转换成三维位置,以此作为 E K F EKF EKF的外部观测量。滤波器根据惯导预测结果与雷达观测之间的差异,估计位置误差、速度误差以及陀螺仪和加速度计的偏置,并通过反馈机制实时修正惯导解算,使结果逐步逼近真实轨迹。

代码最后绘制真实轨迹、雷达反算轨迹、滤波后轨迹,并提供三轴状态对比、误差对比以及统计信息,包含最大误差、平均误差和标准差等。整体流程清晰地展示了 IMU 与雷达融合在三维定位中的效果,也是使用 PSINS 进行多传感器融合的一个完整示例。

运行结果

运动轨迹、雷达位置绘图:

滤波误差绘图:

三轴误差分开显示:

命令行输出的结果:

MATLAB源代码

程序结构:

部分代码如下:

matlab 复制代码
% 基于PSINS工具箱的IMU数据和雷达观测对目标滤波,EKF
% 作者:matlabfilter
% 2025-11-25/Ver1

clear;clc;close all;
rng(0);
glvs
psinstypedef(153);
ts = 0.1;       % sampling interval
avp0 = [[0;0;0]; [0;0;0]; [0;0;0]]; % 初始化avp
traj_ = [];
%% 轨迹设置
seg = trjsegment(traj_, 'init',         0);
seg = trjsegment(seg, 'uniform',      100);

%% = 滤波结果误差统计 ==
fprintf('========== 滤波结果误差统计 ==========\n');
% X轴(纬度)
fprintf('滤波X轴(纬度)误差:\n');
fprintf('  最大值:%.4f\n', max(abs(error_filter_x)));
fprintf('  最小值:%.4f\n', min(abs(error_filter_x)));
fprintf('  平均值:%.4f\n', mean(abs(error_filter_x)));
fprintf('  标准差:%.4f\n', std(error_filter_x));

% Y轴(经度)
fprintf('滤波Y轴(经度)误差:\n');
fprintf('  最大值:%.4f\n', max(abs(error_filter_y)));
fprintf('  最小值:%.4f\n', min(abs(error_filter_y)));
fprintf('  平均值:%.4f\n', mean(abs(error_filter_y)));
fprintf('  标准差:%.4f\n', std(error_filter_y));

% Z轴(高度)
fprintf('滤波Z轴(高度)误差:\n');
fprintf('  最大值:%.4f\n', max(abs(error_filter_z)));
fprintf('  最小值:%.4f\n', min(abs(error_filter_z)));
fprintf('  平均值:%.4f\n', mean(abs(error_filter_z)));
fprintf('  标准差:%.4f\n', std(error_filter_z));

% ========== 雷达观测误差统计 ==========
fprintf('\n========== 雷达观测误差统计 ==========\n');
% X轴(纬度)
fprintf('雷达X轴(纬度)误差:\n');
fprintf('  最大值:%.4f\n', max(abs(error_radar_x)));
fprintf('  最小值:%.4f\n', min(abs(error_radar_x)));
fprintf('  平均值:%.4f\n', mean(abs(error_radar_x)));
fprintf('  标准差:%.4f\n', std(error_radar_x));

% Y轴(经度)
fprintf('雷达Y轴(经度)误差:\n');
fprintf('  最大值:%.4f\n', max(abs(error_radar_y)));
fprintf('  最小值:%.4f\n', min(abs(error_radar_y)));
fprintf('  平均值:%.4f\n', mean(abs(error_radar_y)));
fprintf('  标准差:%.4f\n', std(error_radar_y));

% Z轴(高度)
fprintf('雷达Z轴(高度)误差:\n');
fprintf('  最大值:%.4f\n', max(abs(error_radar_z)));
fprintf('  最小值:%.4f\n', min(abs(error_radar_z)));
fprintf('  平均值:%.4f\n', mean(abs(error_radar_z)));
fprintf('  标准差:%.4f\n', std(error_radar_z));

% ========== 整体误差统计(可选) ==========
error_filter_all = sqrt(error_filter_x.^2 + error_filter_y.^2 + error_filter_z.^2); % 滤波三维位置误差
error_radar_all = sqrt(error_radar_x.^2 + error_radar_y.^2 + error_radar_z.^2);   % 雷达三维位置误差

fprintf('\n========== 三维位置误差统计 ==========\n');
fprintf('雷达(滤波前)三维位置误差:\n');
fprintf('  最大值:%.4f\n', max(error_radar_all));
fprintf('  最小值:%.4f\n', min(error_radar_all));
fprintf('  平均值:%.4f\n', mean(error_radar_all));
fprintf('  标准差:%.4f\n', std(error_radar_all));

fprintf('滤波后,三维位置误差:\n');
fprintf('  最大值:%.4f\n', max(error_filter_all));
fprintf('  最小值:%.4f\n', min(error_filter_all));
fprintf('  平均值:%.4f\n', mean(error_filter_all));
fprintf('  标准差:%.4f\n', std(error_filter_all));

完整代码可直接运行,下载链接:
https://download.csdn.net/download/callmeup/92413556

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

相关推荐
专业开发者42 分钟前
Android 位置服务(LBS)客户支持指南
开发语言·php
cws2004011 小时前
微软系统中AD域用户信息及状态报表命令介绍
开发语言·microsoft·php
熬了夜的程序员1 小时前
【RUSTFS】rustfs的go语言sdk
开发语言·后端·golang
Hello.Reader1 小时前
Rocket 0.5 快速上手3 分钟跑起第一个 Rust Web 服务
开发语言·前端·rust
hefaxiang1 小时前
分支和循环(中)
c语言·开发语言
爱装代码的小瓶子1 小时前
【c++知识铺子】最后一块拼图-多态
java·开发语言·c++
认真敲代码的小火龙1 小时前
【JAVA项目】基于JAVA的超市订单管理系统
java·开发语言·课程设计
CryptoRzz1 小时前
对接墨西哥股票市场 k线图表数据klinechart 数据源API
开发语言·javascript·web3·ecmascript
yue0081 小时前
C# 实现电脑锁屏功能
开发语言·c#·电脑·电脑锁屏