当前位置: 首页 > news >正文

卡尔曼滤波。 (代码非常详细、非常齐全) 1、卡尔曼滤波的含义是现时刻的最佳估计为在前一时刻的...

卡尔曼滤波。 (代码非常详细、非常齐全) 1、卡尔曼滤波的含义是现时刻的最佳估计为在前一时刻的最佳估计的基础上根据现时刻的观测值作线性修正。 2、卡尔曼滤波在数学上是一种线性最小方差统计估算方法,它是通过处理一系列带有误差的实际测量数据而得到物理参数的最佳估算。 1、包含噪声的,对物体位置的观察序列(可能有偏差)预测出物体的位置的坐标及速度。 3、这个估计可以是对当前目标位置的估计(滤波),也可以是对于将来位置的估计(预测),也可以是对过去位置的估计(插值或平滑)。

卡尔曼滤波这玩意儿听起来高大上,其实本质就是"用过去猜现在,再用测量值修bug"。举个栗子,你在用GPS追踪无人机,GPS数据跳来跳去像抽风,这时候就需要它来算个靠谱的位置。咱们直接上代码实战——假设有个小车在直线上匀速运动,但观测数据有噪声。

先导入必要的库:

import numpy as np import matplotlib.pyplot as plt real_v = 0.5 # 真实速度0.5m/s total_time = 30 dt = 1.0 # 采样间隔

接下来造点假数据:

# 生成带噪声的观测数据 np.random.seed(42) true_pos = [real_v * t for t in range(total_time)] obs_noise = np.random.normal(0, 0.6, total_time) # 标准差0.6m的噪声 obs_pos = true_pos + obs_noise

重点来了,卡尔曼滤波器实现:

class KalmanFilter: def __init__(self, initial_pos, initial_vel, process_noise, measurement_noise): # 状态向量 [位置, 速度] self.state = np.array([[initial_pos], [initial_vel]]) # 状态转移矩阵(假设匀速模型) self.F = np.array([[1, dt], [0, 1]]) # 测量矩阵(只能观测位置) self.H = np.array([[1, 0]]) # 过程噪声协方差 self.Q = np.eye(2) * process_noise # 测量噪声协方差 self.R = np.array([[measurement_noise]]) # 协方差矩阵 self.P = np.eye(2) * 500 # 初始不确定度大 def predict(self): self.state = self.F @ self.state self.P = self.F @ self.P @ self.F.T + self.Q return self.state[0][0] def update(self, measurement): y = measurement - self.H @ self.state S = self.H @ self.P @ self.H.T + self.R K = self.P @ self.H.T @ np.linalg.inv(S) self.state = self.state + K @ y self.P = (np.eye(2) - K @ self.H) @ self.P

代码里有个骚操作是过程噪声Q和测量噪声R的设置。这两个参数相当于调参师的快乐开关——Q调大表示更相信测量值,R调大则更相信预测值。比如在跟踪无人机时,如果GPS信号不稳定,就该把R设大些。

跑个完整流程试试:

kf = KalmanFilter(initial_pos=0, initial_vel=0.5, process_noise=0.01, measurement_noise=0.6**2) estimates = [] for z in obs_pos: kf.predict() estimates.append(kf.update(z)) # 画个对比图 plt.figure(figsize=(12,6)) plt.plot(true_pos, label='真实轨迹', linestyle='--') plt.scatter(range(total_time), obs_pos, s=15, label='观测值', alpha=0.6) plt.plot(estimates, color='r', linewidth=2, label='卡尔曼滤波') plt.legend() plt.title('卡尔曼滤波效果对比(红线和真实轨迹几乎重合)') plt.show()

运行后会发现红线几乎贴着真实轨迹走,这说明滤波成功地把那些乱跳的观测点给熨平了。重点观察协方差矩阵P的变化——初始值设得很大,随着迭代会逐渐收敛,说明系统对自己估计越来越有信心。

想玩预测功能的话,可以连续调用predict()不更新:

# 预测未来5秒 future_pred = [] current_state = kf.state.copy() for _ in range(5): current_state = kf.F @ current_state future_pred.append(current_state[0][0]) print(f'未来5秒预测位置: {future_pred}')

这时候就能看出卡尔曼滤波的另一个妙用:在目标短暂丢失时(比如无人机飞进楼宇遮挡区),能继续给出合理的位置推测。不过要注意,长期预测会越来越不靠谱,毕竟现实世界的运动模型不可能永远匀速直线。

http://www.cnnetsun.cn/news/26277.html

相关文章:

  • 模块化多电平变换器MMC(20子模块、21电平,工作条件220kV(AC)/400kV(DC)...
  • 生态共舞!恭喜10家企业荣获“2025龙蜥社区最佳联合解决方案奖”
  • Java常见开发框架大比拼:Jeesite 、jeecgBoot、smartAdmin、ruoyi
  • IDEA(2020版)实现HttpServletRequest对象
  • 跨平台开发框架选型指南:Uniapp、React Native、Flutter
  • 数字孪生软件开发公司
  • springboot基于vue的校园报修管理系统设计与实现_t45k51ip
  • 嵌入式彩屏单色字体点阵的存储结构设计
  • 《Medical Vision Generalist: Unifying Medical Imaging Tasks in Context》(医学视觉通才:在上下文中统一医学成像任务)的
  • 西安电子科技大学专属信纸模板:3分钟打造专业学术形象
  • 【每日一题】PCIe答疑 - 接大量 GPU 时主板不认设备或无法启动和MMIO的可能关系?
  • 富有的哈佛人 —— 储蓄:财富积累的第一块基石
  • 终极指南:快速掌握eventpp事件处理库的8种集成方法
  • 光刻胶用二正丁基胺增感剂:
  • Spyder vs Jupyter:科学计算效率大比拼
  • 【第八天】08c#今日小结
  • Windows临时文件夹清理指南:释放C盘空间
  • AI助力:用自然语言生成复杂tar命令,告别记忆负担
  • 三相L型并网逆变器:dq坐标系下的控制系统设计与Simulink仿真模型搭建
  • RBP神经网络PID自适应控制模型(Matlab仿真模型及详解资料包,省去PID参数调节
  • 华为OD机试双机位C卷 - 挑选宝石 (C++ Python JAVA JS GO)
  • 用ROS2快速验证机器人创意:48小时开发挑战
  • 光伏电池电网能量管理控制策略模型仿真与优化在Simulink平台下的研究
  • 在flac3d7.0中实现flac3d和3dec的耦合计算
  • 3分钟用requestIdleCallback打造性能分析工具
  • 如何用Skyvern在5分钟内构建智能Web自动化工作流
  • 必看!2025年OK镜保养注意事项高品质推荐榜单,助你提升视力体验
  • LLC谐振变换器:变频与移相混合控制的仿真模型
  • 科研人员必备:Sci-Hub论文下载与管理的自动化方案
  • 基于Android的安卓云笔记系统(源代码+文档+PPT+调试+讲解)