news 2026/7/28 8:49:46

直接上干货,咱们用Matlab手撕卡尔曼滤波。先看最基础的KF代码,从状态预测到测量更新,一行一行拆解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
直接上干货,咱们用Matlab手撕卡尔曼滤波。先看最基础的KF代码,从状态预测到测量更新,一行一行拆解

Matlab学习卡尔曼滤波以及状态观测器的各种实例代码和模型 讲解,各种卡尔曼滤波的m代码,可以一行一行讲(KF,EKF,UKF,SRUKF,CKF,SRCKF等) KF,EKF,UKF,SRUKF,CKF,SRCKF,滑模观测器,PID观测器等 本人硕士写的,有简单版本的纯m代码,也有进阶学习的Sfunction代码,以及simulink模型代码,代码附有详细的注释,提供卡尔曼滤波理论方面的。

% KF基础版(线性系统) function [x_est, P] = kalman_filter(z, x_prev, P_prev, A, H, Q, R) % 预测阶段 x_pred = A * x_prev; % 状态预测 (式1) P_pred = A * P_prev * A' + Q;% 协方差预测 (式2) % 更新阶段 K = P_pred * H' / (H*P_pred*H' + R); % 卡尔曼增益 (式3) x_est = x_pred + K*(z - H*x_pred); % 状态修正 P = (eye(size(P_prev)) - K*H)*P_pred; % 协方差更新 end

式1到式3直接对应卡尔曼五公式里的前三步。重点注意K的计算用了矩阵右除代替逆运算,数值稳定性更好。实际调试时盯着协方差矩阵P会不会爆炸,很多时候问题出在系统噪声Q和观测噪声R的取值不合适。

遇到非线性系统怎么办?EKF出场。看这段扩展卡尔曼滤波的雅可比矩阵处理:

%EKF关键片段(非线性系统) F = jacobian_state(x_prev); % 状态转移雅可比 H_jac = jacobian_measure(x_pred); % 观测雅可比 % 预测协方差时改用雅可比矩阵线性化 P_pred = F * P_prev * F' + Q; K = P_pred * H_jac' / (H_jac*P_pred*H_jac' + R);

这里jacobianstatejacobianmeasure需要自己写函数计算当前状态的偏导。新手常踩的坑是雅可比矩阵更新频率——要么每个步长都重新计算(计算量大),要么固定间隔更新(可能发散),具体要看系统非线性强度。

再来个UKF的Sigma点采样,感受下无迹变换的暴力美学:

% UKF的Sigma点生成 function [X] = sigma_points(x, P, alpha, beta, kappa) n = length(x); lambda = alpha^2*(n + kappa) - n; sqrt_P = chol((n + lambda)*P)'; % Cholesky分解 X(:,1) = x; for i = 1:n X(:,i+1) = x + sqrt_P(:,i); X(:,i+n+1) = x - sqrt_P(:,i); end end

参数alpha控制Sigma点分布范围,通常取1e-3。注意Cholesky分解可能失败,实操时要加正则化处理。SRUKF(Square-Root UKF)用QR分解代替协方差直接计算,数值稳定性更好,适合长期运行的嵌入式系统。

滑模观测器代码更有意思,这种鲁棒性强的设计适合存在建模误差的场景:

% 滑模观测器核心更新律 s = C*x_hat - y; % 滑模面 v = -rho * sign(s); % 控制量 dx_hat = A*x_hat + B*u + L*(y - C*x_hat) + v;

这里的rho是切换增益,决定了收敛速度和抖振强度的trade-off。实际工程中常用饱和函数sat(s/φ)代替sign函数,用边界层厚度φ来抑制高频抖振。

进阶玩家可以玩Sfunction,把算法封装成Simulink模块。看这个S-function的伪代码结构:

function sys=mdlDerivatives(t,x,u) % 获取输入 z = u(1); u_ctrl = u(2); % 调用KF算法 [x_est, ~] = ekf_core(z, x, P, u_ctrl); % 导数计算 sys = A*x_est + B*u_ctrl; end

重点在离散-连续系统的混合仿真设置,需要处理好采样时间和过零检测。Simulink模型里记得用Memory模块保持状态同步,否则会出现代数环问题。

代码仓库里有个双摆系统的CKF仿真案例,用了球面径向规则采样,比UKF的Sigma点数量少一半。关键在这段容积点计算:

% CKF容积点生成 for i=1:n Xi(:,i) = x_est + sqrt_P(:,i); Xi(:,n+i) = x_est - sqrt_P(:,i); end weights = ones(2*n,1)/(2*n); % 等权重

CKF在计算效率上有优势,但要求系统维度不能太高。SRCKF版本用平方根滤波替代协方差矩阵传递,适合低精度微控制器实现。

调参经验:先通过蒙特卡洛仿真确定噪声统计特性,再现场微调。有个暴力但有效的方法——把QR的对角元素设为估计误差的方差,运行时用移动平均在线自适应。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/22 2:39:27

LLaMA Factory技巧:如何用云端GPU快速调试微调参数

LLaMA Factory技巧:如何用云端GPU快速调试微调参数 作为一名经常需要微调大模型的工程师,我深知本地调试的痛点:显存不足、速度慢、参数组合多时等待时间过长。最近在尝试LLaMA Factory框架时,我发现通过云端GPU环境可以大幅提升调…

作者头像 李华
网站建设 2026/7/23 18:39:54

Llama Factory微调终极指南:从零到部署的一站式方案

Llama Factory微调终极指南:从零到部署的一站式方案 如果你正在寻找一个快速验证基于Llama 3的客服机器人方案,但苦于缺乏专业的AI基础设施团队,那么Llama Factory可能是你的理想选择。本文将带你从数据准备到模型部署,用几小时完…

作者头像 李华
网站建设 2026/7/22 19:26:39

M2FP模型应用案例:快速搭建虚拟试衣间原型

M2FP模型应用案例:快速搭建虚拟试衣间原型 作为一名电商创业者,你是否曾为如何验证虚拟试衣概念的可行性而头疼?精准的人体解析是虚拟试衣的核心技术难点之一。本文将介绍如何利用M2FP多人人体解析模型,快速搭建虚拟试衣间的原型系…

作者头像 李华
网站建设 2026/7/23 17:17:35

Llama Factory对话模板解析:如何让模型回答更符合预期

Llama Factory对话模板解析:如何让模型回答更符合预期 在实际使用大语言模型(LLM)进行应用开发时,很多开发者会遇到一个典型问题:微调后的模型虽然掌握了专业知识,但回答格式却变得不稳定,时而符…

作者头像 李华
网站建设 2026/7/22 8:25:17

Sambert-HifiGan语音合成服务案例研究集锦

Sambert-HifiGan 中文多情感语音合成服务案例研究集锦 📌 案例背景:中文多情感语音合成的现实需求 随着智能客服、虚拟主播、有声读物等应用场景的快速发展,传统“机械式”语音合成已无法满足用户对自然度与情感表达的需求。尤其在中文语境下…

作者头像 李华