嵌入式学习笔记-卡尔曼滤波,PID,MicroPython

文章目录

    • 卡尔曼滤波
      • 卡尔曼滤波的核心思想
      • 卡尔曼滤波的数学模型
        • 1. 状态转移模型(预测系统状态)
        • 2. 观测模型(预测测量值)
      • 卡尔曼滤波的五个关键步骤
        • 1. 预测状态
        • 2. 预测误差协方差
        • 3. 计算卡尔曼增益
        • 4. 更新状态
        • 5. 更新误差协方差
      • 卡尔曼滤波算法步骤总结
      • 代码实现(Python 示例)
    • PID调节
      • 总结
    • MicroPython
      • 示例代码:控制 LED 灯并连接 WiFi
        • 1. 硬件准备
        • 2. 连接方式
        • 3. 示例代码
      • 代码说明
      • 开发环境搭建

今天开组会,中午没睡困得要死,但是每天都得不停学习。

参考下面视频

卡尔曼滤波

卡尔曼滤波是一种用于估计动态系统状态的算法,它是一种线性递归滤波
器,即使测量数据中存在噪声,它也能提供对真实状态的最佳估计。这种滤波算法在控制系统、导航、信号处理等领域应用广泛。


卡尔曼滤波的核心思想

卡尔曼滤波是一种递归估计算法,它在每个时刻执行两步:

  1. 预测阶段:根据上一时刻的状态,利用系统的动态模型预测当前时刻的状态。
  2. 更新阶段:结合当前的测量数据,校正预测值,得到更准确的状态估计。

卡尔曼滤波的数学模型

卡尔曼滤波假设系统可以用线性模型描述,并且噪声服从高斯分布。系统模型由以下两部分组成:

1. 状态转移模型(预测系统状态)

x k = F k x k − 1 + B k u k + w k x_k = F_k x_{k-1} + B_k u_k + w_k xk=Fkxk1+Bkuk+wk

  • x k x_k xk:系统在时刻 k k k 的状态向量(例如位置、速度)。
  • F k F_k Fk:状态转移矩阵,描述状态之间的变化关系。
  • B k B_k Bk:控制输入矩阵,描述控制输入对状态的影响。
  • u k u_k uk:控制输入。
  • w k w_k wk:过程噪声,服从均值为 0 0 0,协方差为 Q Q Q 的高斯分布。
    在这里插入图片描述
2. 观测模型(预测测量值)

z k = H k x k + v k z_k = H_k x_k + v_k zk=Hkxk+vk

  • z k z_k zk:时刻 k k k 的观测值。
  • H k H_k Hk:观测矩阵,描述状态如何映射到观测空间。
  • v k v_k vk:测量噪声,服从均值为 0 0 0,协方差为 R R R 的高斯分布。

卡尔曼滤波的五个关键步骤

1. 预测状态

根据状态转移模型,预测当前时刻的状态:
x ^ k − = F k x ^ k − 1 + B k u k \hat{x}_k^- = F_k \hat{x}_{k-1} + B_k u_k x^k=Fkx^k1+Bkuk
这里, x ^ k − \hat{x}_k^- x^k 表示预测的状态。

2. 预测误差协方差

预测状态的误差协方差:
P k − = F k P k − 1 F k T + Q P_k^- = F_k P_{k-1} F_k^T + Q Pk=FkPk1FkT+Q

  • P k − P_k^- Pk:预测误差协方差矩阵,反映预测值的不确定性。
  • Q Q Q:过程噪声协方差矩阵。
3. 计算卡尔曼增益

根据预测的不确定性和测量的不确定性计算卡尔曼增益:
K k = P k − H k T ( H k P k − H k T + R ) − 1 K_k = P_k^- H_k^T (H_k P_k^- H_k^T + R)^{-1} Kk=PkHkT(HkPkHkT+R)1

  • K k K_k Kk:卡尔曼增益,决定了预测和测量数据的权重。
4. 更新状态

结合测量值更新状态估计:
x ^ k = x ^ k − + K k ( z k − H k x ^ k − ) \hat{x}_k = \hat{x}_k^- + K_k (z_k - H_k \hat{x}_k^-) x^k=x^k+Kk(zkHkx^k)

  • z k − H k x ^ k − z_k - H_k \hat{x}_k^- zkHkx^k:测量残差(即预测值与观测值的差异)。
5. 更新误差协方差

更新误差协方差矩阵:
P k = ( I − K k H k ) P k − P_k = (I - K_k H_k) P_k^- Pk=(IKkHk)Pk

  • I I I:单位矩阵。

卡尔曼滤波算法步骤总结

  1. 初始化:设定初始状态 x ^ 0 \hat{x}_0 x^0 和初始协方差矩阵 P 0 P_0 P0
  2. 循环执行
    • 预测状态 x ^ k − \hat{x}_k^- x^k 和协方差 P k − P_k^- Pk
    • 计算卡尔曼增益 K k K_k Kk
    • 更新状态 x ^ k \hat{x}_k x^k 和协方差 P k P_k Pk

代码实现(Python 示例)

以位置和速度为状态(经典一维运动模型)为例:

import numpy as np# 初始化参数
F = np.array([[1, 1], [0, 1]])  # 状态转移矩阵
H = np.array([[1, 0]])          # 观测矩阵
Q = np.array([[1, 0], [0, 1]])  # 过程噪声协方差
R = np.array([[10]])            # 测量噪声协方差
B = np.array([[0], [0]])        # 控制输入矩阵
u = np.array([[0]])             # 控制输入# 初始状态和协方差
x = np.array([[0], [1]])        # 初始状态:[位置, 速度]
P = np.array([[1, 0], [0, 1]])  # 初始误差协方差# 模拟观测数据
z_real = [5, 6, 7, 9, 10]       # 实际观测值for z in z_real:# 预测阶段x_predict = F @ x + B @ uP_predict = F @ P @ F.T + Q# 计算卡尔曼增益K = P_predict @ H.T @ np.linalg.inv(H @ P_predict @ H.T + R)# 更新阶段z = np.array([[z]])  # 当前观测值x = x_predict + K @ (z - H @ x_predict)P = (np.eye(2) - K @ H) @ P_predict# 输出当前状态估计print("位置估计:", x[0, 0], "速度估计:", x[1, 0])

PID调节

之前学过点,所以就简单学下怎么调节。

环节功能描述作用优点缺点实际应用注意事项
P(比例环节)将比例系数与偏差信号e(t)相乘后输出快速响应系统误差,调节系统向误差减小的方向移动响应迅速,能快速调整系统可能引起系统震荡,存在稳态误差1. 比例增益系数KP不能过大,以避免震荡。 通过逐步增大KP,找到系统等幅振荡时的KP值,取其70%作为最优比例增益系数。
I(积分环节)对偏差信号e(t)进行积分,使输出持续增加或减少,直至偏差为零消除稳态误差消除稳态误差,提高系统精度可能引起系统惯性干扰,导致响应变慢1. 在无过谐振荡、稳态误差近似为0时,积分时间常数TI取值合理。 与比例环节结合(PI控制),可同时提高响应速度和消除稳态误差。
D(微分环节)对偏差信号e(t)的变化率进行反馈,提前修正偏差减少调节时间,提前校正系统提高动态性能,减少超调对噪声敏感,可能导致误调节1. 在动态系统中,微分环节可以提前发出校正信号,防止偏差扩大。

总结

  • P环节:快速响应,但可能导致震荡和稳态误差。
  • I环节:消除稳态误差,但可能使系统响应变慢。
  • D环节:提前校正偏差,提高动态性能,但对噪声敏感。

三者结合(PID控制)可综合各环节的优点,克服单一环节的缺点,广泛应用于闭环控制系统中,以实现快速、稳定且无误差的控制效果。感觉PID可以对应快准稳。P越大,冲的越快,I适度,可以用来调节冲刺到最后的精度,D适度可以用来调价波痕,更加稳定。

MicroPython

MicroPython 是一种轻量级的 Python 解释器,专为嵌入式系统和微控制器设计,能够在资源受限的硬件上运行。它保留了 Python 的核心语法,同时提供了丰富的硬件控制接口,非常适合在 ESP32 等单片机上开发。

以下是一个基于 ESP32 单片机的 MicroPython 示例代码,介绍如何通过 GPIO 控制 LED 灯的闪烁,并连接 WiFi 网络。

示例代码:控制 LED 灯并连接 WiFi

1. 硬件准备
  • ESP32 开发板
  • 一个 LED 灯
  • 电阻(可选)
  • 杜邦线若干
2. 连接方式

将 LED 的正极连接到 ESP32 的 GPIO 引脚(如 GPIO 5),负极通过电阻连接到 GND。

3. 示例代码

以下代码展示了如何控制 GPIO 引脚来点亮和熄灭 LED,并连接到 WiFi 网络。

# 导入必要的模块
from machine import Pin
import network
import time# 初始化 LED 引脚
led = Pin(5, Pin.OUT)  # GPIO 5 作为输出# 定义 WiFi 连接函数
def connect_wifi(ssid, password):wlan = network.WLAN(network.STA_IF)  # 创建 WLAN 对象wlan.active(True)  # 激活 WiFi 接口if not wlan.isconnected():  # 检查是否已连接print("Connecting to WiFi...")wlan.connect(ssid, password)  # 连接到指定 WiFiwhile not wlan.isconnected():  # 等待连接passprint("Connected to WiFi!")print("IP Address:", wlan.ifconfig()[0])  # 打印 IP 地址# 连接到 WiFi
connect_wifi("your_ssid", "your_password")  # 替换为你的 WiFi 名称和密码# 主循环:控制 LED 闪烁
while True:led.value(1)  # 点亮 LEDtime.sleep(1)  # 等待 1 秒led.value(0)  # 熄灭 LEDtime.sleep(1)  # 等待 1 秒

代码说明

  1. GPIO 控制

    • 使用 machine.Pin 模块控制 GPIO 引脚。
    • Pin(5, Pin.OUT) 表示将 GPIO 5 设置为输出模式。
    • led.value(1)led.value(0) 分别用于点亮和熄灭 LED。
  2. WiFi 连接

    • 使用 network 模块连接到 WiFi 网络。
    • network.WLAN(network.STA_IF) 创建一个 WiFi 客户端对象。
    • wlan.connect(ssid, password) 用于连接到指定的 WiFi 网络。

开发环境搭建

  1. 固件烧录

    • 从 MicroPython 官网下载适用于 ESP32 的固件。
    • 使用 esptool.py 工具将固件烧录到 ESP32 开发板。
  2. IDE 选择

    • 推荐使用 Thonny IDE 或 uPyCraft IDE。
    • 在 Thonny 中配置 MicroPython 解释器,并连接到 ESP32 的串口。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/27353.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机网络学习————(五)TCP/IP学习

前文学习: 一、二、三、四 学习来源网站 : 极客时间 TCP协议 发展历史 ARPA-NCP协议————可扩展性差、且对应的一般为单对单 解决问题: 在IP协议之上,解决网络通讯可依赖问题 点对点,面向连接 双向传递 字节流&am…

智能笔记,智慧管理:Obsidian 与 DeepSeek 携手引领 AI 知识新时代

清华大学出品《DeepSeek:从入门到精通》分享 清华大学出品《DeepSeek:从入门到精通》分享 清华大学出品《DeepSeek:从入门到精通》分享 AI 助力下的知识管理革新:构建你的智能 Obsidian 系统 在数字时代,如何高效地整…

VSCode 移除EmmyLua插件的红色波浪线提示

VSCode 中安装插件EmmyLua,然后打开lua文件的时候,如果lua代码引用了C#脚本的变量,经常出现 “undefined global variable: UnityEngineEmmyLua(undefined-global)” 的红色波浪线提示,这个提示看着比较烦人,我们可以通…

优得运维推出光伏电站运维精进班,助力新能源行业人才培养

随着全球新能源产业的快速发展,光伏电站的运维需求日益增长。为了满足行业对高素质运维人才的需求,优得运维——联盛新能源集团的核心成员,正式推出光伏电站运维精进班。该课程旨在通过系统化的培训,帮助学员夯实电工基础、提升应…

anything文本分割优化

1、文本分割优化&#xff0c;建议 200 和40&#xff0c;把文档切得更碎一些方便检索命中。 2、RAG接口进一步优化 /*** RAG知识库接口** param prompt* return*/GetMapping(value "/rag/chat", produces MediaType.TEXT_EVENT_STREAM_VALUE)public Flux<ChatCom…

全志A133 android10 mipi屏幕调试

一&#xff0c;确认屏幕信息 屏幕调试首先要查看屏幕规格书&#xff0c;主要看里面的屏供电电压vdd&#xff0c;背光供电电压&#xff0c;timing参数部分。 举个例子&#xff1a; 屏供电电压 可以看出供电电压为3.3V&#xff0c;过大则会烧屏&#xff1b;背光供电电压 屏幕…

(下:补充——五个模型的理论基础)深度学习——图像分类篇章

目录 1.1 卷积神经网络基础 3.1 AlexNet网络结构详解与花分类数据集下载 4.1 VGG网络详解及感受野的计算 5.1 GoogLeNet网络详解 6.1 ResNet网络结构&#xff0c;BN以及迁移学习详解 总结&#xff08;可以直接看总结&#xff09; 1.1 卷积神经网络基础 视频讲解&#xf…

批量给 Word 添加文字和图片水印

在 Word 中添加水印是非常常见的一个需求&#xff0c;当我们需要将 Word 文档发送给第三方&#xff0c;或者需要将 Word 文档打印出来的时候&#xff0c;给 Word 文档加上水印是一个很重要的操作&#xff0c;可以声明版权&#xff0c;也可以起到广告标识作用。如果少量 Word 文…

数据挖掘工程师的技术图谱和学习路径

数据挖掘工程师的技术图谱和学习路径: 1.基础知识 数据挖掘工程师是负责从大量数据中发现潜在模式、趋势和规律的专业人士。以下是数据挖掘工程师需要掌握的基础知识: 数据库知识:熟悉关系数据库和非关系数据库的基本概念和操作,掌握SQL语言。 统计学基础:了解统计学的基…

JavaSE-4方法 递归 数组

一、方法 public static 返回值类型 方法名{ 方法体&#xff1b; } 1&#xff09;修饰符&#xff1a;public static 2&#xff09;形参返回值类型和实参返回值类型一致 3&#xff09;方法名字&#xff1a;小驼峰 4&#xff09;参数列表&#xff1a;如果方法没有参数就不写…

快瞳通用文档解析技术是怎样赋能下游各类大语言模型任务?

、为什么不直接用大模型去解析文档&#xff1f; 在文档、票据结构化识别这个赛道上&#xff0c;大语言模型存在天然的局限性&#xff1a; 1.结构化数据生成效率低 大模型在处理表格、公式等结构化内容时&#xff0c;需消耗大量计算资源&#xff0c;生成速度慢且成本高昂。例如…

Microk8s Ingress实现七层负载均衡

Microk8s Ingress是什么 Ingress是k8s的一种资源对象&#xff0c;用于管理外部对集群内服务的访问, 它通过提供一个统一的入口点&#xff0c;将外部流量路由到集群内部的不同服务。 Microk8s Ingress用于解决什么问题 k8s集群中服务默认只能在集群内访问。 如果需要从外部访…

C语言(19)----------->函数(2)

本文介绍了C语言的return语句及其它在C语言函数中的作用&#xff0c;以及介绍了二维数组和一维数组传参时的一些注意事项和使用数组传参时的方法。 若没有学习过C语言的一维数组和二维数组&#xff0c;建议参考如下文章&#xff1a; C语言&#xff08;15&#xff09;--------…

数据结构——单调栈

一.单调栈简介 1.1单调栈定义与特性 本质&#xff1a;单调栈是一种特殊的栈结构&#xff0c;其内部元素始终保持单调递增或单调递减的顺序。核心规则&#xff1a;当新元素入栈时&#xff0c;会通过弹出破坏单调性的栈顶元素来维持有序性。单调方向&#xff1a; 单调递增栈&…

知微传感3D相机上位机DkamViewer使用:设置相机的静态IP

写在前面 本人从事机器视觉细分的3D相机行业。编写此系列文章主要目的有&#xff1a; 1、便利他人应用相机&#xff0c;本系列文章包含公司所出售相机的SDK的使用例程及详细注释&#xff1b;2、促进行业发展及交流。 知微传感Dkam系列3D相机可以应用于定位分拣、焊接焊缝提取、…

DeepSeek掘金——DeepSeek-R1微调指南

DeepSeek掘金——DeepSeek-R1微调指南 在这篇博文中,我们将逐步指导你在消费级 GPU 上使用 LoRA(低秩自适应)和 Unsloth 对 DeepSeek-R1 进行微调。 微调像 DeepSeek-R1 这样的大型 AI 模型可能需要大量资源,但使用正确的工具,可以在消费级硬件上进行有效训练。让我们探索…

GPT-4.5来了

https://chat.xutongbao.top/

从 JVM 源码(HotSpot)看 synchronized 原理

大家好&#xff0c;我是此林。 不知道大家有没有这样一种感觉&#xff0c;网上对于一些 Java 框架和类的原理实现众说纷纭&#xff0c;看了总是不明白、不透彻。常常会想&#xff1a;真的是这样吗&#xff1f; 今天我们就从 HotSpot 源码级别去看 synchronized 的实现原理。全…

下载b站视频音频

文章目录 方案一&#xff1a;jjdown如何使用 方案二&#xff1a;bilibili哔哩哔哩下载助手如何使用进入插件网站插件下载插件安装 使用插件下载视频音频&#xff1a;复制音频下载地址 方案三&#xff1a;bat命令下载单个音频下载单个视频下载单个音视频 方案一&#xff1a;jjdo…

快速在本地运行SpringBoot项目的流程介绍

目录 前言 一、环境配置 1.1Java环境 1.2Maven环境 1.3IntelliJ IDEA安装 1.4MySql安装 二、项目导入与启动的过程 2.1Maven镜像和本地仓库 2.1.2镜像配置 2.1.3配置本地仓库 2.2导入项目与启动 2.2.1加载Maven设置 2.2.2配置jdk与java版本 2.2.3创建数据库 2.2…