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

news2024/9/23 4:26:28

目录

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 22

MPU6050 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...");

  // 连接WiFi
  WiFi.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.coloradmin.cn/o/1946671.html

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

相关文章

k8s集群可视化工具安装(dashboard)

可视化安装 2.1、下载相关的yaml文件 wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0/aio/deploy/recommended.yaml Vim recommended.yaml 2.2、部署 kubectl apply -f recommended.yaml 查看那kubernetes-dashboard命令空间下的资源 kubectl get …

Edge浏览器加载ActiveX控件

背景介绍 新版Edge浏览器也是采用Chromium内核&#xff0c;虽然没有谷歌浏览器市场占有率高&#xff0c;但是依托微软操作系统的优势&#xff0c;Edge浏览器还是发展很强劲&#xff0c;占据着市场第二的位置。随着微软停止服务IE浏览器&#xff0c;曾经风光无限的IE浏览器页退出…

LLM 大语言模型显存消耗估计与计算

LLM 大语言模型显存消耗估计与计算 1. LLM 大语言模型开发流程 在大模型&#xff08;如 LLaMA-7B、GPT-3 等&#xff09;的开发、训练、微调、推理和部署过程中&#xff0c;各个阶段的流程都涉及多个复杂的步骤。以下是详细的流程描述&#xff0c;涵盖训练和微调的区别&#…

docker相关内容学习

一、docker的四部分 二、镜像相关命令 三、容器相关命令

SpringCloud断路器的使用与原理解析

Spring Cloud断路器是在分布式系统中实现容错的一种方式。它的原理是通过在调用链路上添加断路器,当某个服务的调用出现故障或超时时,断路器会自动迅速地切换到快速失败模式,防止故障扩散,从而保护整个系统的稳定性。 Spring Cloud断路器的使用与原理解析如下: 一、使用断…

计算机网络知识点总结————物理层

前言 一、物理层的基本概念 物理层解决什么问题 物理层的主要特性 二、传输媒体 导引型传输媒体 同轴电缆 双绞线 光纤 非导引型传输媒体 三、数据通信的基础知识 1.术语 2.编码方式 总结 前言 我站在清醒和麻木的边缘&#xff0c;不能堕落也不能解脱 一、物理层的…

Godot学习笔记4——函数

GDScript中函数也叫方法或模块&#xff0c;与变量一样&#xff0c;包括自定义函数与内置函数。大部分内置函数可以对游戏内容产生实质性影响&#xff0c;少部分函数比较特殊。 一、函数定义 在Godot中&#xff0c;我们使用“func”来定义函数&#xff0c;后面跟函数名、括号和…

php仓库管理系统设计与实现

1.1 研究背景 随着经济一体化和电子商务的迅速发展&#xff0c;网络传播信息的速度打破了传统信息传递的模式&#xff0c;互联网的高速发展和计算机应用在各个高校进展迅速&#xff0c;更多信息化产品的突飞猛进&#xff0c;让现代的管理模式也发生了巨大的变化&#xff0c;本…

0503触发器的电路结构和工作原理

触发器的电路结构和工作原理 如何区分锁存器还是触发器&#xff0c; 看有没有这个三角符号&#xff0c;告诉是上升沿触发还是下降沿触发&#xff0c;没有三角符号就是电平触发。低电平触发就画个小圈。高电平触发就不画小圈。有小圈的三角就是下降沿触发 setup建立时间 hold 保…

ecshop网站部署

目录 步骤1 ecshop网站的部署 一、安装环境 二、设置开机启动 ​三、 测试php ​四、上传安装包 五、安装ecshop 步骤1 ecshop网站的部署 一、安装环境 yum install -y httpd mariadb-server php php-devel php-mysql 浏览器访问&#xff1a;192.168.30.2 二、设置开机启…

解决小程序web-view两个恶心问题

&#x1f9d1;‍&#x1f4bb; 写在开头 点赞 收藏 学会&#x1f923;&#x1f923;&#x1f923; 1.web-view覆盖层问题 问题由来 web-view 是一个 web 浏览器组件&#xff0c;可以用来承载网页的容器&#xff0c;会自动铺满整个页面。 所以这得多恶心。。。不仅铺满&…

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

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

mysql之视图的创建以及查询;

一&#xff1a;数据库及其表的创建&#xff1a; mysql> create database mydb15_indexstu; Query OK, 1 row affected (0.00 sec)mysql> use mydb15_indexstu; Database changed mysql> create table student(-> sno int primary key auto_increment,-> sname …

js语法 proxy对象拦截方法详解,proxy代理一个对象(数组,函数)的操作方法

如果还不能理解什么是proxy代理可以参考&#xff1a;js语法---理解反射Reflect对象和代理Proxy对象_js代理对象-CSDN博客 proxy代理对象(数组&#xff0c;函数)&#xff0c;可以拦截的操作 apply---拦截方法的执行(包括直接执行&#xff0c;通过apply&#xff0c;call执行),和对…

【element ui】input输入控件绑定粘贴事件,从 Excel 复制的数据粘贴到输入框(el-input)时自动转换为逗号分隔的数据

目录 1、需求2、实现思路:3、控件绑定粘贴事件事件修饰符说明: 4、代码实现&#x1f680;写在最后 1、需求 在 Vue 2 和 Element UI 中&#xff0c;要实现从 Excel 复制空格分隔的数据&#xff0c;并在粘贴到输入框&#xff08;el-input&#xff09;时自动转换为逗号分隔的数据…

Pycharm 和虚拟环境的那些事?

背景: 我既有 python 又有Anaconda Pycharm新建虚拟环境: 只说两种方式 通过Virualenv Environment新建: 这里我们勾选上 Make available to all projects ,之后点击&#x1f197; 然后可以发现只有非常少的包,因为没有勾选继承 编译器的包 创建的虚拟环境一般目录如下&…

【Git多人协作开发】知识点总结

目录 知识点总结 1.创建dev分支开发 1.1在本地创建 1.1在远程创建&#xff08;推荐&#xff09; 2.远程分支和本地分支建立连接☞pull和push操作 2.1情况1 2.2情况2 2.3情况3 3.本地仓库对远程仓库的拉取pull操作 3.1情况1 3.2情况2 4.将开发分支的内容合并到远程m…

充电桩浪涌保护方案—保障充电设施安全稳定运行的关键

在当今新能源汽车蓬勃发展的时代&#xff0c;充电桩作为电动汽车的“加油站”&#xff0c;其重要性不言而喻。然而&#xff0c;由于其复杂的电气环境和暴露于户外的特点&#xff0c;充电桩容易受到浪涌的影响。浪涌可能来自雷电、电网故障、大功率设备的启停等&#xff0c;对充…

在 Windows 上安装 PostgreSQL

官网下载地址&#xff1a; https://www.enterprisedb.com/downloads/postgres-postgresql-downloadsWindows平台 官网直接提供exe安装包&#xff0c;没有手动安装的压缩包 postgresql-14.4-1-windows-x64.exe几个重要的安装选项 安装界面会指定服务程序和库两个路径&#xf…

5G赋能车联网,无人驾驶引领未来出行

无人驾驶车联网应用已成为智能交通领域的重要发展趋势。随着无人驾驶技术的不断进步和5G网络的广泛部署&#xff0c;5G工业路由器在无人驾驶车联网中的应用日益广泛&#xff0c;为无人驾驶车辆提供了稳定、高效、低时延的通信保障。 5G工业路由器的优势 低时延&#xff1a;5G网…