【MATLAB例程】水下机器人长基线(LBL)定位,用于三维轨迹,使用EKF滤波,融合LBL和IMU,4个锚点(长基线基站数=4),附下载链接

本本文所述程序实现了 水下机器人(AUV)长基线(LBL)+ IMU在三维空间中的定位融合,采用扩展卡尔曼滤波(EKF)方法来融合较高频率的IMU数据和较低频率的声学基站测距数据,从而获得更准确、稳定的轨迹估计结果。

文章目录

程序简介

核心特点

  • 多传感器融合:LBL声学定位 + IMU惯性导航
  • 实时滤波:扩展卡尔曼滤波器处理非线性观测
  • 四面体基站配置:提供三维空间完整覆盖
  • NED坐标系:符合海洋工程标准的北东地坐标系

核心数学模型

  1. 系统状态模型

系统状态向量定义为12维:

复制代码
x = [p_n, p_e, p_d, v_n, v_e, v_d, b_ax, b_ay, b_az, b_gx, b_gy, b_gz]^T

其中:

  • [p_n, p_e, p_d]:北东地坐标系下的位置 (m)
  • [v_n, v_e, v_d]:速度分量 (m/s)
  • [b_ax, b_ay, b_az]:加速度计偏差 (m/s²)
  • [b_gx, b_gy, b_gz]:陀螺仪偏差 (rad/s)
  1. 状态转移方程

预测模型 (恒速度模型)

复制代码
x_{k+1|k} = F_k · x_k + w_k

状态转移矩阵:

复制代码
F = [I_3   Δt·I_3   0_3   0_3]
    [0_3   I_3      0_3   0_3]
    [0_3   0_3      I_3   0_3]  
    [0_3   0_3      0_3   I_3]

其中 I_3 为3×3单位矩阵,0_3 为3×3零矩阵,Δt 为采样间隔。

  1. LBL声学观测模型

距离观测方程

复制代码
r_i = ||p - p_i|| + v_r,i

其中:

  • r_i:到第i个基站的距离测量值
  • p = [p_n, p_e, p_d]^T:AUV当前位置
  • p_i:第i个基站位置
  • v_r,i:距离测量噪声

雅可比矩阵

复制代码
H_acoustic[i, 1:3] = (p - p_i)^T / ||p - p_i||
  1. IMU观测模型

加速度计模型

复制代码
a_meas = R_b^n(a_true + g) + b_a + v_a

陀螺仪模型

复制代码
ω_meas = ω_true + b_g + v_g

其中:

  • R_b^n:体坐标系到导航坐标系的旋转矩阵
  • g = [0, 0, 9.81]^T:重力加速度向量
  • v_a, v_g:传感器噪声
  1. 扩展卡尔曼滤波递推公式

预测步骤

复制代码
x_{k|k-1} = f(x_{k-1|k-1})
P_{k|k-1} = F_k P_{k-1|k-1} F_k^T + Q_k

更新步骤

复制代码
K_k = P_{k|k-1} H_k^T (H_k P_{k|k-1} H_k^T + R_k)^{-1}
x_{k|k} = x_{k|k-1} + K_k(z_k - h(x_{k|k-1}))
P_{k|k} = (I - K_k H_k) P_{k|k-1}
  1. 长基线三维定位解算

采用最小二乘法求解AUV位置:

线性化方程组

复制代码
H · X = a

其中:

复制代码
H = [x_2-x_1, y_2-y_1, z_2-z_1]
    [x_3-x_1, y_3-y_1, z_3-z_1]
    [x_4-x_1, y_4-y_1, z_4-z_1]

a = [0.5(x_2²+y_2²+z_2²-r_2²-x_1²-y_1²-z_1²+r_1²)]
    [0.5(x_3²+y_3²+z_3²-r_3²-x_1²-y_1²-z_1²+r_1²)]
    [0.5(x_4²+y_4²+z_4²-r_4²-x_1²-y_1²-z_1²+r_1²)]

解算公式

复制代码
X = (H^T H)^{-1} H^T a  (伪逆解)

系统参数配置

传感器规格

  • IMU频率:100 Hz
  • 声学定位频率:1 Hz
  • 声速:1500 m/s
  • 距离精度:20 cm (1σ)
  • 加速度计精度:0.02 m/s² (1σ)
  • 陀螺仪精度:0.01 rad/s (1σ)

噪声模型示例:

复制代码
σ_range = 0.2/1500 s     (距离测量噪声)
σ_acc = 0.002 m/s²       (加速度计噪声)  
σ_gyro = 0.001 rad/s     (陀螺仪噪声)

运行结果

轨迹图与锚点(基站)位置在三维空间中的绘图显示如下:

误差曲线:

XoY平面上的二维轨迹图:

命令行窗口输出的结果:

复制代码
=== EKF融合定位性能评估 ===
3D RMSE:        7.392 m
平均误差:       5.406 m
最大误差:       33.617 m
误差标准差:     5.043 m
North RMSE:     3.300 m
East RMSE:      3.298 m
Down RMSE:      5.734 m

=== LBL纯声学定位性能 ===
3D RMSE:        29.133 m
平均误差:       22.820 m
最大误差:       76.001 m

=== 性能改进 ===
融合相对改进:   74.6%
EKF融合定位优于纯LBL定位

=== 系统配置信息 ===
仿真时长:       100.0 秒
IMU频率:        100 Hz
声学定位频率:   1.0 Hz
总计算点数:     10001
声学更新次数:   101

=== 滤波器一致性分析 ===
位置估计偏差 [N,E,D]: [-0.084, 0.058, -0.068] m
速度估计偏差 [N,E,D]: [-0.149, 0.248, -0.044] m/s
估计加速度偏差:       [-7.0385, -3.3170, 19.4977] m/s²
估计陀螺偏差:         [0.0000, 0.0000, 0.0000] rad/s

=== 收敛性分析 ===
初始位置误差:        1.826 m
最终位置误差:        0.387 m
误差收敛比:          0.21
滤波器成功收敛
>> 

MATLAB源代码

程序结构:

部分代码如下:

matlab 复制代码
%% 水下机器人长基线(LBL),三维轨迹定位,使用EKF滤波,融合LBL和IMU,4个锚点
% 适用于AUV自主导航与定位
% 作者: matlabfilter
% 2025-08-19/Ver1

clear; clc; close all;
rng(0);
% 水下长基线定位与IMU融合系统
% 使用扩展卡尔曼滤波进行多传感器融合
% 坐标系:NED (North-East-Down)

%% 系统参数设置
% 基站配置(四面体配置,单位:米)
beacon_positions = [
    -500, -500, -50;    % 基站1 (西北)
    500, -500, -50;    % 基站2 (东北)
    500,  500, -50;    % 基站3 (东南)
    -500,  500, -60    % 基站4 (西南,深度不同)
    ];

% 仿真参数
dt_imu = 0.01;          % IMU采样间隔 (100Hz)
dt_acoustic = 1;      % 声学定位间隔
total_time = 100;       % 总仿真时间 (秒)
sound_speed = 1500;     % 声速 m/s

% 噪声参数(符合实际水下设备精度)
range_noise_std = 0.2/sound_speed;     % 距离测量噪声标准差(20cm)
imu_acc_noise_std = 0.002;   % 加速度计噪声 (0.02 m/s²)
imu_gyro_noise_std = 0.001;  % 陀螺仪噪声 (0.01 rad/s)
imu_bias_acc = 0.01*[0.01, -0.02, 0.015]; % 加速度计偏差

%% 生成真实轨迹(复杂的水下探测轨迹)
t = 0:dt_imu:total_time;
n_steps = length(t);

% 轨迹参数
R = 150;                    % 基础螺旋半径
omega = 2*pi/40;            % 螺旋角频率
descent_rate = -1.5;        % 基础下沉速度 m/s

% 生成真实状态(位置、速度、加速度)
true_pos = zeros(n_steps, 3);
true_vel = zeros(n_steps, 3);
true_acc = zeros(n_steps, 3);
true_euler = zeros(n_steps, 3); % 欧拉角 (roll, pitch, yaw)

for i = 1:n_steps

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

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

相关推荐
yw00yw23 分钟前
常见的设计模式
开发语言·javascript·设计模式
我不是星海1 小时前
RabbitMQ基础入门实战
java·开发语言
jingfeng5142 小时前
C++多态
开发语言·c++
kyle~2 小时前
C/C++---浮点数与整形的转换,为什么使用sqrt函数时,要给参数加上一个极小的小数(如1e-6)
c语言·开发语言·c++
暖苏2 小时前
python-多线程(笔记)(持续更新)
大数据·开发语言·python
The Chosen One9853 小时前
红黑树下探玄机:C++ map&multimap 的幕后之旅
开发语言·c++
林内克思3 小时前
inline内联函数
java·开发语言·算法
博睿谷IT99_4 小时前
OSPF 的工作过程、Router ID 机制、报文结构
开发语言·网络·华为·智能路由器·网络工程师·华为认证·数据通信
piikee4 小时前
php内存缓存插件yac的安装配置--平替apcu,多进程共享内存
开发语言·缓存·php·yac·php扩展·php内存缓存·apcu平替