嵌入式学习笔记-卡尔曼滤波,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.mzph.cn/diannao/72800.shtml

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

相关文章

一周热点-文本生成中的扩散模型- Mercury Coder

一、背景知识 在人工智能领域,文本生成模型一直是研究的热点。传统的大型语言模型多采用自回归架构,从左到右逐个预测下一个标记。这种模型虽然在生成连贯文本方面表现出色,但在速度上存在一定的局限性,因为它需要按顺序生成每个标…

Qt调试功能使用方法

QT编程环境 QT在Windows操作系统下的三种编程环境搭建。 方案编程环境编译器调试器1Qt CreatorMinGW GCCGDB2Qt CreatorMicrosoft Visual C CompilerDebugging Tools for Widows3Microsoft Visual Studio VS自带VS自带 方案提及的QT安装程序及压缩包均能在官网Index of /off…

vulnhub靶场之【digitalworld.local系列】的mercy靶机

前言 靶机:digitalworld.local-mercy,IP地址为192.168.10.11 攻击:kali,IP地址为192.168.10.6 kali采用VMware虚拟机,靶机选择使用VMware打开文件,都选择桥接网络 这里官方给的有两种方式,一…

Fiddler抓取App接口-Andriod/IOS配置方法

Andriod配置方法: 1)确保手机和Fiddler所在主机在同一个局域网中 2)获取Fiddler所在主机的ip地址,通过cmd命令进入命令编辑器,输入ipconfig -all,找到IPv4地址,记下该地址 3)对手机…

步进电机软件细分算法解析与实践指南

1. 步进电机细分技术概述 步进电机是一种将电脉冲信号转换为角位移的执行机构,其基本运动单位为步距角。传统步进电机的步距角通常为 1.8(对应 200 步 / 转),但在高精度定位场景下,这种分辨率已无法满足需求。细分技术…

C语言_数据结构总结2:动态分配方式的顺序表

0——静态分配内存的顺序表和动态分配内存的顺序表的相同之处和不同之处 相同之处 基本操作逻辑相同:无论是静态分配还是动态分配的顺序表,其核心的操作逻辑是一致的。例如插入操作都需要将插入位置之后的元素依次后移,删除操作都需要将删除…

Vue 与 Element UI 深度探秘:从 Array.isArray 到动态绑定的技术之旅!✨

以下是一篇深入的技术博客&#xff0c;基于我们对 compare-form.vue 和 <w-form-select.vue> 的所有讨论&#xff0c;涵盖 Array.isArray、option-label/option-value、:list 动态绑定、: 语法以及 Vue 2/3 兼容性等问题。博客风格轻松有趣&#xff0c;加入 SVG 图解和实…

计算机视觉|3D卷积网络VoxelNet:点云检测的革新力量

一、引言 在科技快速发展的背景下&#xff0c;3D 目标检测技术在自动驾驶和机器人领域中具有重要作用。 在自动驾驶领域&#xff0c;车辆需实时、准确感知周围环境中的目标物体&#xff0c;如行人、车辆、交通标志和障碍物等。只有精确检测这些目标的位置、姿态和类别&#x…

前端打包优化相关 Webpack

前端打包优化相关 Webpack 打包时间的优化&#xff08;基于 Vue CLI 4 Webpack 5&#xff09; 1. Webpack 配置减少打包时间 1.1 对 JS 配置&#xff1a;排除 node_modules 和 src 中的打包内容 在开发环境下&#xff0c;修改 Webpack 的 JS 规则&#xff0c;排除 /node_m…

leetcode69.x 的平方根

题目&#xff1a; 给你一个非负整数 x &#xff0c;计算并返回 x 的 算术平方根 。 由于返回类型是整数&#xff0c;结果只保留 整数部分 &#xff0c;小数部分将被 舍去 。 注意&#xff1a;不允许使用任何内置指数函数和算符&#xff0c;例如 pow(x, 0.5) 或者 x ** 0.5 。…

Docker 部署 MongoDB 并持久化数据

Docker 部署 MongoDB 并持久化数据 在现代开发中&#xff0c;MongoDB 作为 NoSQL 数据库广泛应用&#xff0c;而 Docker 则提供了高效的容器化方案。本教程将介绍如何使用 Docker 快速部署 MongoDB&#xff0c;并实现数据持久化&#xff0c;确保数据不会因容器重启或删除而丢失…

信奥赛CSP-J复赛集训(模拟算法专题)(3):P1089 [NOIP 2004 提高组] 津津的储蓄计划

信奥赛CSP-J复赛集训&#xff08;模拟算法专题&#xff09;&#xff08;3&#xff09;&#xff1a;P1089 [NOIP 2004 提高组] 津津的储蓄计划 题目描述 津津的零花钱一直都是自己管理。每个月的月初妈妈给津津 300 300 300 元钱&#xff0c;津津会预算这个月的花销&#xff0…

日新F1、瑞研F600P 干线光纤熔接(熔接损耗最大0.03DB)

Ⅰ. 设备特性对比与实测验证 1. 日新F1&#xff08;两马达&#xff09;极限参数 切割角度&#xff1a;必须≤0.3&#xff08;双边累计误差&#xff1c;0.6&#xff09; ▶ 实测案例&#xff1a;切割0.35时&#xff0c;损耗波动达0.05-0.08dB&#xff08;超干线标准&#xff09…

【量化科普】Sharpe Ratio,夏普比率

【量化科普】Sharpe Ratio&#xff0c;夏普比率 &#x1f680;量化软件开通 &#x1f680;量化实战教程 在量化投资领域&#xff0c;夏普比率&#xff08;Sharpe Ratio&#xff09;是一个非常重要的风险调整后收益指标。它由诺贝尔经济学奖得主威廉F夏普&#xff08;William…

数据结构--【顺序表与链表】笔记

顺序表 template <class T> class arrList :public List<T> //表示 arrList 类以公有继承的方式继承自 List<T> 类 //公有继承意味着 List<T> 类的公共成员在 arrList 类中仍然是公共成员&#xff0c;受保护成员在 arrList 类中仍然是受保护成员。 { …

idea中隐藏目录

可能的解决步骤&#xff1a; 排除目录的方法是否在2021版本中有变化&#xff1f;应该没有&#xff0c;还是通过右键标记为排除。 用户可能想完全隐藏目录&#xff0c;比如在项目视图中不显示&#xff0c;这可能需要调整项目视图的设置&#xff0c;比如取消勾选“显示排除的文件…

AWS 如何导入内部SSL 证书

SSL 证书的很重要的功能就是 HTTP- > HTTPS, 下面就说明一下怎么导入ssl 证书,然后绑定证书到ALB. 以下示例说明如何使用 AWS Management Console 导入证书。 从以下位置打开 ACM 控制台:https://console.aws.amazon.com/acm/home。如果您是首次使用 ACM,请查找 AWS Cer…

2025最新群智能优化算法:基于RRT的优化器(RRT-based Optimizer,RRTO)求解23个经典函数测试集,MATLAB

一、基于RRT的优化器 基于RRT的优化器&#xff08;RRT-based Optimizer&#xff0c;RRTO&#xff09;是2025年提出的一种新型元启发式算法。其受常用于机器人路径规划的快速探索随机树&#xff08;RRT&#xff09;算法的搜索机制启发&#xff0c;首次将RRT算法的概念与元启发式…

doris: Oracle

Apache Doris JDBC Catalog 支持通过标准 JDBC 接口连接 Oracle 数据库。本文档介绍如何配置 Oracle 数据库连接。 使用须知​ 要连接到 Oracle 数据库&#xff0c;您需要 Oracle 19c, 18c, 12c, 11g 或 10g。 Oracle 数据库的 JDBC 驱动程序&#xff0c;您可以从 Maven 仓库…

im即时聊天客服系统SaaS还是私有化部署:成本、安全与定制化的权衡策略

随着即时通讯技术的不断发展&#xff0c;IM即时聊天客服系统已经成为企业与客户沟通、解决问题、提升用户体验的重要工具。在选择IM即时聊天客服系统时&#xff0c;企业面临一个重要决策&#xff1a;选择SaaS&#xff08;软件即服务&#xff09;解决方案&#xff0c;还是进行私…