news 2026/4/23 13:36:59

直接上干货,咱们用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/4/18 21:21:43

周末项目:用M2FP和预配置镜像打造智能相册

周末项目:用M2FP和预配置镜像打造智能相册 你是否曾经想过开发一个能自动分析家庭照片中人物互动的应用?比如识别谁在和谁拥抱、谁在微笑、谁在看向镜头等。这类任务通常需要复杂的计算机视觉模型和GPU环境支持,但好消息是,借助M2…

作者头像 李华
网站建设 2026/4/20 9:57:42

微调即服务:基于Llama Factory构建模型定制平台

微调即服务:基于Llama Factory构建模型定制平台 大模型微调是当前AI领域的热门技术,但传统微调流程往往需要复杂的代码编写和环境配置,对新手极不友好。LLaMA Factory作为一款开源低代码大模型微调框架,通过可视化界面和标准化流程…

作者头像 李华
网站建设 2026/4/23 13:07:50

毕业设计救星:快速搭建M2FP人体解析系统

毕业设计救星:快速搭建M2FP人体解析系统 作为一名大四学生,毕业设计答辩迫在眉睫,却卡在环境配置环节?M2FP作为当前最先进的人体解析模型之一,能够精准分割图像中的人体各部件,但本地部署往往需要折腾CUDA、…

作者头像 李华
网站建设 2026/4/17 14:09:34

毕业设计救星:用云端M2FP轻松完成计算机视觉项目

毕业设计救星:用云端M2FP轻松完成计算机视觉项目 作为一名即将毕业的大四学生,突然发现毕设需要实现多人人体解析功能时,难免会感到时间紧迫、无从下手。传统方法从零开始学习模型部署不仅耗时,还需要配置复杂的GPU环境。本文将介…

作者头像 李华
网站建设 2026/4/17 14:26:33

Ubuntu硬盘性能测试工具推荐

📊 hdparm 详细使用指南 1. 基本安装与识别硬盘 # 安装 sudo apt install hdparm# 查看所有硬盘 lsblk # 或 sudo fdisk -l# 识别硬盘类型 sudo hdparm -I /dev/sda | grep -i "model"2. 常用测试命令 基础性能测试 # 基本读取测试(推荐&#…

作者头像 李华
网站建设 2026/4/18 5:50:55

懒人必备:无需代码的Llama Factory微调可视化教程

懒人必备:无需代码的Llama Factory微调可视化教程 如果你需要快速比较不同微调参数的效果,但又不想折腾复杂的命令行操作,那么Llama Factory的Web可视化界面就是你的救星。这款工具专为像产品经理老王这样的非技术用户设计,只需点…

作者头像 李华