ESP32-S3-DevKitC-1开发记录帖——与MPU6050进行姿态检测

目录

MPU6050传感器——姿态检测

1.姿态检测

1.1 基本认识

1)坐标系

2)姿态角的关系

3)陀螺仪检测的缺陷

4)利用加速度计检测角度

5)利用磁场检测角度

1.2 姿态融合与四元数

1.3传感器工作原理

1.4 MPU6050模块简介

1.5 实践是检验真理的唯一标准

1.5.1 连接引脚确认

1.5.2 代码编写调试并运行


MPU6050传感器——姿态检测

1.姿态检测

1.1 基本认识

1)坐标系

分为载体坐标系、地理坐标系和地球坐标系

载体坐标系:以运载体的质心为原点,一般根据运载体自身结构方向构成坐标系

地理坐标系:原点在地球表面,Z轴沿当地地理垂涎的方向,XY轴沿当地经纬线的切线方向。

地球坐标系:以地球球心为原点,Z轴沿地球自转轴方向,XY轴在赤道平面内的坐标系

2)姿态角的关系

偏航角、俯仰角和横滚角

3)陀螺仪检测的缺陷

陀螺仪测量角度时需要使用积分,会存在一定的积分误差。而根据积分的性质可知,积分时间越小,误差就越小。所以可以用提高陀螺仪传感器的采样频率来减少积分误差。

4)利用加速度计检测角度

一般使用加速度传感器来检测倾角,通过检测器件在各个方向的形变情况而采样得到受力数据,根据F=ma转换,传感器直接输出加速度数据。

而在加速度传感器静止的时候,测出来的是加速度g,表示传感器在该方向作加速度为g的运动

那么是如何检测陀螺仪测出来的角度是否正确呢?

利用各方向的测量结果,根据力的分解原理,可以求出各个坐标轴与重力之间的夹角。因为重力方向是与地理坐标系的“天地”轴固连的,所以通过测量载体坐标系各轴与重力方向的角度即可修正角度

5)利用磁场检测角度

为了弥补加速度传感器无法检测偏航角的问题,通过检测地球磁场可实现指南针的功能。由于地磁场与地理坐标系的南北轴固联,利用磁场检测传感器的指南针功能

1.2 姿态融合与四元数

我们同时使用这两种传感器,并设计一个滤波算法,当物体处于静止状态时,增大加速度数据的权重,当物体处于运动状时,增大陀螺仪数据的权重,从而获得更准确的姿态数据。同理,检测偏航角,当载体在静止状态时,可增大磁场检测器数据的权重,当载体在运动状态时,增大陀螺仪和GPS检测数据的权重。这些采用多种传感器数据来检测姿态的处理算法被称为姿态融合。

1.3传感器工作原理

敏感元件:直接感受被测物理量,并输出与该物理量有确定关系的信号

转换原件:将物理信号转换为电信号量

变换电路:对转换元件输出的电信号进行放大调制,最后输出容易检测的电信号量

1.4 MPU6050模块简介

功能:检测三轴加速度、三轴陀螺仪的运动数据以及温度数据

引脚说明:

如何使用MPU6050传输和计算数据?

可以使用STM32控制器把这些数据读取出来然后进行姿态融合解算,以求出传感器当前的姿态。

也可以使用传感器内部的DMP单元进行解算,可以直接对采样得到的加速度及角速度进行姿态解算。

1.5 实践是检验真理的唯一标准

1.5.1 连接引脚确认

我首先查了MPU每个引脚具体该怎么连接ESP32,在这个博客中看到了这样一句话:

“使用的是IO19与IO20两个引脚,使用杜邦线将开发板的这两个引脚分别接到mpu6050模块的SCL与SDA引脚上,将ADO引脚接到GND。

ADO引脚为从机地址设置引脚,接地或悬空时, 地址为: 0x68;接VCC时,地址为:0x69”

而该博主用的是ESP32-S3-LCD-EV-Board-MB开发板,所以我搜了一下他的引脚:

根据ESP32-DevKitc-1的引脚说明书,找到符合I2C协议的引脚。

得出结论:

名称为21的引脚连接MPU6050的SCL,名称为20连接MPU6050的SDA

1.5.2 代码编写调试并运行

调试代码教程:

烧录的时候出现了以下错误:

结果是自己电脑端口出现了问题...在别人电脑上却能跑通。

点击调试和运行运行代码:

#include <Wire.h>
#include <MPU6050.h>
#include <WiFi.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>#define SDA_PIN 21
#define SCL_PIN 22MPU6050 mpu6050(0x68); // 使用默认地址 0x68
unsigned long last_sample_time = 0;
int peak_count = 0;
bool condition_met = false;int16_t ax,ay,az,gx,gy,gz;void setup() {Serial.begin(115200);Wire.begin(SDA_PIN, SCL_PIN);// 校准陀螺仪偏移mpu6050.setXGyroOffset(220);mpu6050.setYGyroOffset(76);mpu6050.setZGyroOffset(-85);last_sample_time = millis();
}void loop() {mpu6050.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);// 将原始数据转换为实际值float ax_g = ax * 2.0 / 32768.0;float ay_g = ay * 2.0 / 32768.0;float az_g = az * 2.0 / 32768.0;float gx_rad = gx * 250.0 / 32768.0 * 0.0174533;float gy_rad = gy * 250.0 / 32768.0 * 0.0174533;float gz_rad = gz * 250.0 / 32768.0 * 0.0174533;// 检查加速度是否超过阈值if (abs(ax_g) > 1.0 || abs(ay_g) > 1.0 || abs(az_g) > 1.0) {peak_count++;}// 检查是否达到采样周期unsigned long current_time = millis();if (current_time - last_sample_time >= 1000) { // 1秒采样一次// 计算峰值频率float peak_frequency = (peak_count * 60.0) / (current_time - last_sample_time);peak_count = 0;// 检查峰值频率是否在指定范围内if (peak_frequency >= 100 && peak_frequency <= 120) {condition_met = true;}last_sample_time = current_time;// 如果条件满足,发送完成信息到后端if (condition_met) {sendCompletionToBackend(ax_g, ay_g, az_g, gx_rad, gy_rad, gz_rad);condition_met = false;}}// 打印数据Serial.print("ax: ");Serial.print(ax_g);Serial.print(" g\t");Serial.print("ay: ");Serial.print(ay_g);Serial.print(" g\t");Serial.print("az: ");Serial.print(az_g);Serial.print(" g\t");Serial.print("gx: ");Serial.print(gx_rad);Serial.print(" rad/s\t");Serial.print("gy: ");Serial.print(gy_rad);Serial.print(" rad/s\t");Serial.print("gz: ");Serial.println(gz_rad);Serial.print("\n");delay(10); // 避免循环过快
}void sendCompletionToBackend(float ax, float ay, float az, float gx, float gy, float gz) {Serial.println("Sending data to backend...");// 连接WiFiWiFi.begin(ssid, password);while (WiFi.status() != WL_CONNECTED) {delay(500);Serial.print(".");}// 创建HTTP客户端请求HTTPClient http;http.begin(serverUrl);http.addHeader("Content-Type", "application/json");// 构建JSON数据StaticJsonDocument<200> jsonDoc; // 根据需要调整JSON文档的大小jsonDoc["ax"] = ax;jsonDoc["ay"] = ay;jsonDoc["az"] = az;jsonDoc["gx"] = gx;jsonDoc["gy"] = gy;jsonDoc["gz"] = gz;String jsonData;serializeJson(jsonDoc, jsonData); // 序列化JSON// 发送POST请求int httpResponseCode = http.POST(jsonData);if (httpResponseCode > 0) {String response = http.getString();Serial.println("Response from server: ");Serial.println(response);} else {Serial.println("Error on sending POST request");}http.end();
}

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

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

相关文章

【PyTorch】图像多分类项目

【PyTorch】图像二分类项目 【PyTorch】图像二分类项目-部署 【PyTorch】图像多分类项目 【PyTorch】图像多分类项目部署 多类图像分类的目标是为一组固定类别中的图像分配标签。 目录 加载和处理数据 搭建模型 定义损失函数 定义优化器 训练和迁移学习 用随机权重进行训…

one-api 源码调试配置

本文主要介绍通过 VSCode 调试 one-api 源码。 一、环境配置 1.1 VSCode 和 one-api 安装 首先,确保已经安装了 VSCode(下载链接)和 one-api 源码(下载链接)已下载并安装了依赖 1.2 安装 Go 插件 在 VSCode 中,安装 Go 插件。 1.3 安装 dlv 调试包 可以通过下载源码…

【黑马java基础】多线程

什么是线程&#xff1f; 线程(Thread)是一个程序内部的一条执行流程。 这个是一条执行流程&#xff0c;虽然有循环&#xff0c;但是最后只有一条流程往前推进&#xff0c;所以视为一条。 程序中如果只有一条执行流程&#xff0c;那这个程序就是单线程的程序。 程序是指令序列…

Ubuntu20.04安装Elasticsearch

简介 ELK&#xff08;Elasticsearch, Logstash, Kibana&#xff09;是一套开源的日志管理和分析工具&#xff0c;用于收集、存储、分析和可视化日志数据。以下是如何在Ubuntu服务器上安装和配置ELK堆栈以便发送和分析日志信息的步骤。 安装Elasticsearch 首先&#xff0c;安…

【系统架构设计师】十八、架构设计实践(信息系统架构设计理论与实践2)

目录 四、企业信息系统的总体框架 4.1 战略系统 4.2 业务系统 4.3 应用系统 4.4 企业信息基础设施 4.5 业务流程重组BPR 4.6 业务流程管理BPM 五、信息系统架构设计方法 5.1 行业标准的体系架构框架 5.2 架构开发方法 5.3 信息化总体架构方法 5.4 信息化建设生命周…

防火墙——网络环境支持

目录 网络环境支持 防火墙的组网 web连接上防火墙 web管理口 让防火墙接到网络环境中 ​编辑 管理员用户管理 缺省管理员 接口 配置一个普通接口 创建安全区域 路由模式 透明模式 混合模式 防火墙的安全策略 防火墙转发流程 与传统包过滤的区别 创建安全策略 …

DDoS攻击:威胁与防护策略

DDoS&#xff08;分布式拒绝服务&#xff09;攻击是网络安全领域的一大挑战&#xff0c;对企业造成严重的影响。本文将深入探讨DDoS攻击的原理和防护方法。 DDoS攻击的原理 DDoS攻击通过大量请求&#xff0c;使目标系统无法响应正常请求。攻击者利用多台计算机发送大量请求&am…

气膜羽毛球馆的维护和运营成本解析—轻空间

随着人们对健康生活方式的追求不断增加&#xff0c;羽毛球这项运动也愈发受到欢迎。然而&#xff0c;传统的羽毛球馆往往存在建设周期长、成本高、维护复杂等问题。气膜羽毛球馆作为一种新型的运动场馆解决方案&#xff0c;因其快速搭建、环保节能、舒适环境等优势而逐渐被广泛…

跨平台桌面应用程序框架Electron

用于构建跨平台桌面应用程序的框架。Electron 由 GitHub 开发&#xff0c;它允许开发者使用 Web 技术&#xff08;如 HTML、CSS 和 JavaScript&#xff09;来创建桌面软件。Electron 基于 Node.js 和 Chromium&#xff0c;因此可以提供丰富的功能和性能。 Electron 的主要优点…

LabVIEW和IQ测试仪进行WiFi测试

介绍一个使用LabVIEW和LitePoint IQxel-MW IQ测试仪进行WiFi测试的系统。包括具体的硬件型号、如何实现通讯、开发中需要注意的事项以及实现的功能。 使用的硬件​ IQ测试仪型号: LitePoint IQxel-MW 电脑: 配置高效的台式机或笔记本电脑 路由器: 支持802.11ax (Wi-Fi 6) 的…

C语言 | Leetcode C语言题解之第282题给表达式添加运算符

题目&#xff1a; 题解&#xff1a; #define MAX_COUNT 10000 // 解的个数足够大 #define NUM_COUNT 100 // 操作数的个数足够大 long long num[NUM_COUNT] {0};long long calc(char *a) { // 计算表达式a的值// 将数字和符号&#xff0c;入栈memset(num, 0, sizeof(num));in…

2024大家都想掌握的4种PDF翻译技巧

借着互联网的东风现在全球化的交流越发频繁&#xff0c;很多时候都会遇到跨语言交流的问题。外语不好的小伙伴阅读外国文献的时候应该都很头疼吧&#xff0c;这时候pdf翻译成中文的工具就可以解决这个问题啦。 1.福昕翻译 直通车&#xff1a;https://fanyi.pdf365.cn/ 这个…

PSINS工具箱函数介绍——insplot

insplot是一个绘图命令,用于将avp数据绘制出来 本文所述的代码需要基于PSINS工具箱,工具箱的讲解: PSINS初学指导基于PSINS的相关程序设计(付费专题)使用方法 此函数使用起来也很简单,直接后面加avp即可,如: insplot(avp);其中,avp为: 每行表示一个时间1~3列为姿态…

量化交易策略解读

光大证券-20190606-重构情绪体系&#xff0c;探知市场温度——市场情绪体系系列报告之二.pdf 市场情绪与股市择时体系研究 市场情绪的重要性 市场情绪反映了投资者心理状态的集体体现&#xff0c;对市场走势有同步或滞后的影响&#xff0c;并在某些情况下预示市场转折点。 择…

一键解锁:科研服务器性能匹配秘籍,选择性能精准匹配科研任务和计算需求的服务器

一键解锁&#xff1a;科研服务器性能匹配秘籍 HPC科研工作站服务器集群细分领域迷途小书童 专注于HPC科研服务器细分领域kyfwq001 &#x1f3af;在当今科技飞速发展的时代&#xff0c;科研工作对计算资源的需求日益增长&#x1f61c;。选择性能精准匹配科研任务和计算需求的服…

集合的面试题和五种集合的详细讲解

20240724 一、面试题节选二、来自于b站人人都是程序员的视频截图 &#xff08;感谢人人都是程序员大佬的视频&#xff0c;针对于个人复习。&#xff09; 一、面试题节选 二、来自于b站人人都是程序员的视频截图 hashmap&#xff1a; 唯一的缺点&#xff0c;无序&#xf…

maven项目容器化运行之3-优雅的利用Jenkins和maven使用docker插件调用远程docker构建服务并在1Panel中运行

一.背景 在《maven项目容器化运行之1》中&#xff0c;我们开启了1Panel环境中docker构建服务给到了局域网。在《maven项目容器化运行之2》中&#xff0c;我们基本实现了maven工程创建、远程调用docker构建镜像、在1Panel选择镜像运行容器三大步骤。 但是&#xff0c;存在一个问…

昇思25天学习打卡营第23天 | CycleGAN图像风格迁移互换

昇思25天学习打卡营第23天 | CycleGAN图像风格迁移互换 文章目录 昇思25天学习打卡营第23天 | CycleGAN图像风格迁移互换CycleGAN模型模型结构循环一致损失函数 数据集数据下载创建数据集 网络构建生成器判别器损失函数和优化器前向计算梯度计算与反向传播 总结打卡 CycleGAN模…

【办公软件】Office 2019以上版本PPT 做平滑切换

Office2019以上版本可以在切页面时做平滑切换&#xff0c;做到一些简单的动画效果。如下在快捷菜单栏中的切换里选择平滑。 比如&#xff0c;在两页PPT中&#xff0c;使用同一个形状对象&#xff0c;修改了大小和颜色。 选择切换为平滑后&#xff0c;可以完成如下的动画显示。 …

java-poi实现excel自定义注解生成数据并导出

因为项目很多地方需要使用导出数据excel的功能&#xff0c;所以开发了一个简易的统一生成导出方法。 依赖 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>4.0.1</version…