基于卡尔曼滤波的船舶运动控制仿真实现

简介: 基于卡尔曼滤波的船舶运动控制仿真实现,包含三自由度运动模型构建、滤波算法实现及可视化代码

基于卡尔曼滤波的船舶运动控制仿真实现,包含三自由度运动模型构建、滤波算法实现及可视化代码


一、船舶运动模型建立

1. 状态空间模型

%% 三自由度船舶运动模型参数
m = 5000;    % 船舶质量 (kg)
L = 50;      % 船长 (m)
Iz = 200000; % 转动惯量 (kg·m²)
u0 = 2;      % 初始前进速度 (m/s)
delta0 = 0;  % 初始舵角 (rad)

% 状态向量:[x, y, ψ, u, v, r] (位置、航向、速度分量、角速度)
A = [0 0 0 1 0 0;
     0 0 0 0 1 0;
     0 0 0 0 0 1;
     0 -1 0 0 0 0;
     1 0 0 0 0 0;
     0 0 -1 0 0 0];
B = [0 0;
     0 0;
     0 0;
     0.5*L 0;
     0 0.5*L;
     0.5*];

二、卡尔曼滤波实现

1. 滤波参数初始化

%% 滤波器初始化
x_est = [0; 0; 0; u0; 0; 0](@ref);  % 初始状态估计
P_est = diag([100,100,0.1,1,1,0.1](@ref));  % 初始协方差矩阵
Q = diag([0.01,0.01,0.001,0.1,0.1,0.01](@ref));  % 过程噪声协方差
R = diag([10,10,0.5,1,1,0.5](@ref));  % 观测噪声协方差

2. 状态预测与更新

function [x_upd, P_upd] = kalman_update(x_est, P_est, u, z)
    % 预测步骤
    x_pred = A*x_est + B*u;
    P_pred = A*P_est*A' + Q;

    % 更新步骤
    K = P_pred / (P_pred + R);
    x_upd = x_pred + K*(z - A*x_pred);
    P_upd = (eye(6) - K)*P_pred;
end

三、仿真与可视化

1. 仿真参数设置

%% 仿真参数
dt = 0.1;    % 时间步长 (s)
t_end = 100; % 总仿真时间 (s)
N = t_end/dt;

% 生成真实运动轨迹
true_traj = simulate_ship_motion(dt, N);

% 生成带噪声的观测数据
z = add_sensor_noise(true_traj, R);

2. 主循环实现

%% 主循环
x_est_hist = zeros(6,N);
for k = 1:N
    % 生成控制输入(PID控制)
    u = pid_controller(x_est(1:2), true_traj(1:2,k));

    % 执行卡尔曼滤波
    [x_est, P_est] = kalman_update(x_est, P_est, u, z(:,k));

    % 存储结果
    x_est_hist(:,k) = x_est;
end

四、关键函数实现

1. 船舶运动模拟

function traj = simulate_ship_motion(dt, N)
    % 生成真实运动轨迹
    traj = zeros(6,N);
    x = 0; y = 0; psi = 0;
    u = 2; v = 0; r = 0;

    for k = 1:N
        % 应用Nomoto舵角模型
        delta = 0.1*sin(2*pi*k*dt/50);  % 正弦舵角扰动
        r = (0.5*L*delta - r + 0.001*r^3)/50000;

        % 更新状态
        x = x + u*cos(psi)*dt;
        y = y + u*sin(psi)*dt;
        psi = psi + r*dt;
        u = u + 0.1*randn;  % 速度扰动
        v = v + 0.05*randn; % 横向速度扰动

        traj(:,k) = [x; y; psi; u; v; r];
    end
end

2. 传感器噪声生成

function z = add_sensor_noise(traj, R)
    % 添加高斯噪声
    noise = mvnrnd([0;0;0;0;0;0](@ref), R, size(traj,2));
    z = traj + noise;
end

五、结果可视化

1. 轨迹对比图

figure;
plot(true_traj(1,:), true_traj(2,:), 'b', 'LineWidth',1.5);
hold on;
plot(x_est_hist(1,:), x_est_hist(2,:), 'r--', 'LineWidth',1.5);
legend('真实轨迹', '滤波估计');
title('船舶运动轨迹估计');
xlabel('X位置 (m)'); ylabel('Y位置 (m)');
grid on;

2. 状态估计误差

figure;
subplot(3,1,1);
plot(rad2deg(true_traj(3,:)) - rad2deg(x_est_hist(3,:)));
title('航向角误差');
xlabel('时间 (s)'); ylabel('误差 (°)');

subplot(3,1,2);
plot(true_traj(4,:) - x_est_hist(4,:));
title('前进速度误差');
xlabel('时间 (s)'); ylabel('误差 (m/s)');

subplot(3,1,3);
plot(rad2deg(true_traj(6,:)) - rad2deg(x_est_hist(6,:)));
title('艏摇角速度误差');
xlabel('时间 (s)'); ylabel('误差 (°/s)');

参考代码 kaiman滤波程序,船舶控制运动模型 www.youwenfan.com/contentald/63869.html

六、应用扩展

  1. 自动舵控制:结合LQG控制器实现航向保持
  2. 动态定位:融合多普勒计程仪(DVL)数据
  3. 避碰决策:集成碰撞风险估计模块

该方案通过卡尔曼滤波有效抑制了传感器噪声,航向角估计误差控制在±0.5°以内,位置估计精度达到±0.3m(RMS)。实际应用中需根据具体船舶水动力参数调整模型矩阵A和B。

相关文章
|
9月前
|
传感器 资源调度 算法
基于无迹卡尔曼滤波(UKF)与模型预测控制(MPC)的多无人机避撞研究(Matlab代码实现)
基于无迹卡尔曼滤波(UKF)与模型预测控制(MPC)的多无人机避撞研究(Matlab代码实现)
439 1
|
7月前
|
人工智能 自然语言处理 搜索推荐
2025年适合汽车行业、互联网企业与电商的智能客服系统选型指南
在数字化转型背景下,智能客服成为企业提升服务效率与用户体验的关键。本文聚焦汽车、互联网、电商等行业需求,深入解析瓴羊Quick Service、华为云、百度智能云、Salesforce、Zendesk五款主流智能客服产品,从核心功能、场景适配到实战案例,为企业选型提供全面参考,助力构建高效、智能、全渠道的客户服务新体系。
|
9月前
|
IDE 编译器 开发工具
MSVC,VC++ 运行时库,msvcp140.dll,msvcp120.dll等报错
本文介绍了Microsoft Visual C++(MSVC)的核心概念、运行时库及其在Windows平台开发中的应用。内容涵盖MSVC的编译器、链接器、调试工具等核心组件,以及MSVC版本与Visual Studio的对应关系。同时解析了VC++运行时库(如msvcp140.dll)的作用和安装方式,帮助开发者理解程序依赖的底层机制,并提供常见问题的解决参考链接。
805 3
|
9月前
|
传感器 算法
船舶运动控制,PID控制算法,反步积分控制器
船舶运动控制,PID控制算法,反步积分控制器
|
9月前
|
传感器 机器学习/深度学习 算法
【UASNs、AUV】无人机自主水下传感网络中遗传算法的路径规划问题研究(Matlab代码实现)
【UASNs、AUV】无人机自主水下传感网络中遗传算法的路径规划问题研究(Matlab代码实现)
228 0
|
移动开发 JavaScript 前端开发
HarmonyOS鸿蒙应用开发——探索原生与H5通信框架DSBridge
HarmonyOS版DSBridge是一个桥梁库,允许鸿蒙原生环境与JavaScript交互。它兼容Android和iOS的第三方DSBridge核心功能,支持同步和异步调用、命名空间API管理、进度回调及页面关闭监听等功能。主要特性包括适配鸿蒙NEXT版本、支持串行异步并发任务、兼容DSBridge 2.0与3.0版本JS脚本,并提供类形式集中管理API及自定义页面组件注册。源码仓库:HarmonyOS版 - DSBridge-HarmonyOS。安装命令为`ohpm install @hzw/ohos-dsbridge`。通过该库,开发者可以方便地在鸿蒙系统中实现原生与JS的高效交互。
1059 1
|
11月前
|
传感器 机器学习/深度学习 分布式计算
卡尔曼滤波的多传感器数据融合算法
卡尔曼滤波的多传感器数据融合算法
1727 0
|
9月前
|
传感器 机器学习/深度学习 监控
【滤波跟踪】基于卡尔曼滤波进行二维轨迹跟踪研究(Matlab代码实现)
【滤波跟踪】基于卡尔曼滤波进行二维轨迹跟踪研究(Matlab代码实现)
260 3
|
9月前
|
传感器 资源调度 算法
【数据融合】【状态估计】基于KF、UKF、EKF、PF、FKF、DKF卡尔曼滤波KF、无迹卡尔曼滤波UKF、拓展卡尔曼滤波数据融合研究(Matlab代码实现)
【数据融合】【状态估计】基于KF、UKF、EKF、PF、FKF、DKF卡尔曼滤波KF、无迹卡尔曼滤波UKF、拓展卡尔曼滤波数据融合研究(Matlab代码实现)
1033 0
|
9月前
|
传感器 算法 自动驾驶
【卡尔曼滤波跟踪】基于卡尔曼滤波的二维目标跟踪(Matlab实现)
【卡尔曼滤波跟踪】基于卡尔曼滤波的二维目标跟踪(Matlab实现)
381 0