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

嵌入式学习笔记-卡尔曼滤波,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 的串口。

相关文章:

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

文章目录 卡尔曼滤波卡尔曼滤波的核心思想卡尔曼滤波的数学模型1. 状态转移模型(预测系统状态)2. 观测模型(预测测量值) 卡尔曼滤波的五个关键步骤1. 预测状态2. 预测误差协方差3. 计算卡尔曼增益4. 更新状态5. 更新误差协方差 卡…...

什么是hive

Apache Hive 是一个基于 Hadoop 生态系统构建的数据仓库工具,主要用于处理和分析大规模的结构化数据。它允许用户通过类似 SQL 的查询语言(HiveQL)进行数据操作,而无需直接编写复杂的 MapReduce 程序。以下是 Hive 的核心特点和应…...

MAC电脑常用操作

环境:M3芯片 ,macOS15.2 🚀 快捷键 🖥️ 窗口管理 ✅ 退出/进入全屏模式 • 浏览器等应用:⌘ Command Ctrl F ✅ 最小化当前窗口 • ⌘ Command M • 💡 隐藏窗口但保留应用在后台运行 ✅ 关闭当前标…...

leetcode 1287. 有序数组中出现次数超过25%的元素 简单

给你一个非递减的 有序 整数数组&#xff0c;已知这个数组中恰好有一个整数&#xff0c;它的出现次数超过数组元素总数的 25%。 请你找到并返回这个整数 示例&#xff1a; 输入&#xff1a;arr [1,2,2,6,6,6,6,7,10] 输出&#xff1a;6提示&#xff1a; 1 < arr.length…...

3.8【Q】cv

这个draw_line函数的逻辑和功能是什么&#xff1f;代码思路是什么&#xff1f;怎么写的&#xff1f; 这个t是什么&#xff1f;t.v[0]和t.v[1],[2]又是什么&#xff1f; void rst::rasterizer::draw(rst::pos_buf_id pos_buffer, rst::ind_buf_id ind_buffer, rst::Primitive ty…...

upload-labs文件上传

第一关 上传一个1.jpg的文件&#xff0c;在里面写好一句webshell 保留一个数据包&#xff0c;将其中截获的1.jpg改为1.php后重新发送 可以看到&#xff0c;已经成功上传 第二关 写一个webshell如图&#xff0c;为2.php 第二关在过滤tpye的属性&#xff0c;在上传2.php后使用b…...

PyTorch中Tensor对象的属性和方法

目录 一、核心属性 复数支持 转置与视图操作 ​元信息 ​梯度相关 ​二. 常用方法 ​基本操作 ​转置与视图 ​数学运算 ​深度学习相关 ​3. 使用示例 ​梯度计算 ​设备管理 ​自定义反向传播 ​4. 注意事项 ​总结 一、核心属性 1.requires_grad: _bool: 该…...

C++20 格式化库:强大的字符串格式化工具

文章目录 格式化语法常见用法1. 填充和对齐2. 数值格式化3. 进制格式化4. 自定义类型 示例代码注意事项 C20 的格式化库是一个强大的工具&#xff0c;用于处理字符串的格式化操作。它提供了类似于 Python 中 str.format() 的功能&#xff0c;但语法和用法更符合 C 的风格。以下…...

[傻瓜式教学]如何将MathType公式编辑器内嵌到WPS工具栏中

[傻瓜式教学]如何将MathType公式编辑器内嵌到WPS工具栏中 将MathType公式编辑器内嵌到WPS工具栏中 下载好所需文件 我用夸克网盘分享了「mathtype安装教程超简单易上手.zip」&#xff0c;点击链接即可保存。打开「夸克APP」 链接&#xff1a;https://pan.quark.cn/s/4726c684…...

分析TCP三次握手与四次挥手

TCP&#xff08;传输控制协议&#xff09;通过三次握手建立连接&#xff0c;四次挥手终止连接&#xff0c;确保数据传输的可靠性。 TCP的三个控制标志位&#xff1a; SYN——用于建立连接&#xff0c;同步序列号。 ACK——用于确认收到的数据。 FIN——用于终止连接。 ISN…...

【深度学习】宠物品种分类Pet Breeds Classifier

文章目录 宠物品种数据集制作宠物品种标签图像预处理Presizing 损失函数loss观察模型的性能提升模型的性能learning rate finder使用CLR算法训练选择学习率的策略重新训练 迁移学习微调fine_tunefit_one_cycle有判别力的学习率 选择epoch的数量更深的网络架构 宠物品种数据集 …...

【从零开始学习计算机科学】HLS算子调度

算子调度 调度是HLS 中的核心问题,为无时序或部分时序的输入指定时钟边界,其对最终结果质量具有很大的影响。调度会影响时钟频率、延时、吞吐率、面积、功耗等多种因素。 调度的输入是控制数据流图,其节点表示算子/操作,有向边表示数据依赖,控制依赖,优先依赖。如果没有…...

centos 安装composer 教程

打开命令行 php -r "copy(https://getcomposer.org/installer, composer-setup.php);" sudo php composer-setup.php --install-dir/usr/local/bin --filenamecomposer composer --version sudo chmod us /usr/local/bin/composer Super18120/article/details/14388…...

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

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

嵌入式人工智能应用-第6章 人脸检测

嵌入式人工智能应用 人脸检测 嵌入式人工智能应用1 人脸检测1.1 CNN 介绍1.2 人脸检测原理1.3 MTCNN介绍1.4 NCNN介绍2 系统安装2.1 安装依赖库NCNN2.2 运行对应的库3 总结1 人脸检测 1.1 CNN 介绍 卷积神经网络。卷积是什么意思呢?从数学上说,卷积是一种运算。它是我们学习…...

关于无感方波启动预定位阶段

一、预定位的核心目标与原理 消除启动不确定性 无位置传感器下&#xff0c;转子初始位置未知&#xff0c;直接换相可能导致反转或失步。预定位通过施加固定方向磁场&#xff0c;强制转子对齐至预定角度&#xff08;通常0或60电角度&#xff09;&#xff0c;建立初始位置基准。 …...

WSL安装及问题

1 概述 Windows Subsystem for Linux&#xff08;简称WSL&#xff09;是一个在Windows 10\11上能够运行原生Linux二进制可执行文件&#xff08;ELF格式&#xff09;的兼容层。它是由微软与Canonical公司合作开发&#xff0c;开发人员可以在 Windows 计算机上同时访问 Windows 和…...

MySQL中的脏读与幻读:概念、影响与解决方案

在数据库事务处理中&#xff0c;脏读和幻读是两种常见的并发问题&#xff0c;可能导致数据不一致或逻辑错误。本文将结合实际场景&#xff0c;深入解析两者的原理及解决方案。 一、脏读&#xff08;Dirty Read&#xff09; 1. 概念解析 脏读指一个事务读取了另一个事务未提交…...

基于SpringBoot的商城管理系统(源码+部署教程)

运行环境 数据库&#xff1a;MySql 编译器&#xff1a;Intellij IDEA 前端运行环境&#xff1a;node.js v12.13.0 JAVA版本&#xff1a;JDK 1.8 主要功能 基于Springboot的商城管理系统包含管理端和用户端两个部分&#xff0c;主要功能有&#xff1a; 管理端 首页商品列…...

HeidiSQL:一款免费的数据库管理工具

HeidiSQL 是一款免费的图形化数据库管理工具&#xff0c;支持 MySQL、MariaDB、Microsoft SQL、PostgreSQL、SQLite、Interbase 以及 Firebird&#xff0c;目前只能在 Windows 平台使用。 HeidiSQL 的核心功能包括&#xff1a; 免费且开源&#xff0c;所有功能都可以直接使用。…...

Ae 效果详解:VR 色差

Ae菜单&#xff1a;效果/沉浸式视频/VR 色差 Immersive Video/VR Chromatic Aberrations VR 色差 VR Chromatic Aberrations效果用于模拟镜头色散现象&#xff0c;在 VR 视频中制造 RGB 通道错位的色彩偏移&#xff0c;以增强视觉风格或创造数字失真效果。 本效果适用于所有色深…...

计算机毕业设计SpringBoot+Vue.js制造装备物联及生产管理ERP系统(源码+文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…...

Ubuntu 安装docker docker-compose

Docker 通过提供轻量级、可移植且高效的解决方案&#xff0c;简化了软件开发和部署。“docker build”命令是 Docker 镜像创建过程的核心。本文将探讨 Docker 构建命令、用法以及 Docker 构建的优化。 Docker 构建有什么作用&#xff1f; Docker build 是一个命令行界面 CLI命…...

【Linux内核系列】:深入解析输出以及输入重定向

&#x1f525; 本文专栏&#xff1a;Linux &#x1f338;作者主页&#xff1a;努力努力再努力wz ★★★ 本文前置知识&#xff1a; 文件系统以及文件系统调用接口 用c语言简单实现一个shell外壳程序 内容回顾 那么在此前的学习中&#xff0c;我们对于Linux的文件系统已经有了…...

【linux网络编程】端口

一、端口&#xff08;Port&#xff09;概述 在计算机网络中&#xff0c;端口&#xff08;Port&#xff09; 是用来标识不同进程或服务的逻辑通信端点。它类似于一座大楼的房间号&#xff0c;帮助操作系统和网络协议区分不同的应用程序&#xff0c;以便正确地传输数据。 1. 端口…...

PyTorch系列教程:Tensor.view() 方法详解

这篇简明扼要的文章是关于PyTorch中的tensor.view()方法的介绍与应用&#xff0c;与reshape()方法的区别&#xff0c;同时给出示例进行详细解释。 Tensor基础 Tensor(张量)的视图是一个新的Tensor&#xff0c;它与原始Tensor共享相同的底层数据&#xff0c;但具有不同的形状或…...

软件测试的基础入门(二)

文章目录 一、软件&#xff08;开发&#xff09;的生命周期什么是生命周期软件&#xff08;开发&#xff09;的生命周期需求分析计划设计编码测试运行维护 二、常见的开发模型瀑布模型流程优点缺点适应的场景 螺旋模型流程优点缺点适应的场景 增量模型和迭代模型流程适应的场景…...

Springboot + minio

参考&#xff1a; SpringBoot整合Minio_springboot minio-CSDN博客 <!--minio 依赖--><dependency><groupId>io.minio</groupId><artifactId>minio</artifactId><version>8.5.11</version></dependency> applicaio…...

地下变电站如何实现安全智能运营-以110kV站为例看环境监测与设备联控

1、地下变电站简介 在经济发达的地区&#xff0c;由于城市中心土地资源紧张、征地拆迁费用昂贵&#xff0c;因此采用地下变电站来解决这些问题不失为一个好的途径和思路。地下变电站一般采用室内全封闭式组合电气设备&#xff0c;&#xff12;&#xff12;&#xff10;&#x…...

windows无界面后台定时任务 (重启自启动,ODBS为例)

一、前言 mdb(Microsoft Database)是Microsoft Access中使用的一种数据存储格式,可以通过ODBC驱动程序进行访问和操作,在Python中也可以安装相应模块打开。 这是我在项目中更新bs数据的一个实践记录,结合windows定时一起记录一下,方便以后照搬~ 二、安装 Python安装库…...