【ESP32Arduino+MPU6050姿态解算】自制无人机学习笔记2 PLatformIO 下载即可使用

0.引入

本人之前发表过一篇关于esp32读取mpu6050数据的文章,链接:http://t.csdn.cn/AwzSZ,但其存在一些漏洞,具体表现在输出数据存在不连贯和错误,在mpu6050高速运动时存在较大误差等。仅作为参考。故在此重发作为修正。当前该篇文章中所述的模块,已经过无人机稳定性控制的测试,可控制四轴无人机进行稳定性控制,故可保证其可靠性,请大家放心食用!

esp32,国产之光,双核算力强大,并且自带互联网模块,在控制飞行姿态的同时可以兼顾其它运算任务,集通讯和控制为一身,可作为无人机良好的开发平台。MPU6050,价格低廉,体积小,功能强大,可靠性高,可与esp32通讯辅助无人机调整姿态。本篇将教大家如何用esp32+mpu6050初步实现无人机的自稳定。当前作者已实现,大家可以放心阅读。

下图为本人搭载于无人机上的控制主板,其中最上方蓝色模块为MPU6050,左手边蓝色模块为无人机电池的电压转换模块,与本篇内容无关,在今后的文章中会介绍到,中间黑色模块为esp32。其中的陀螺仪姿态解算程序就是本篇介绍的内容。

1.废话不多说,先上干货。

链接:https://pan.baidu.com/s/1_Wlu54wnzNP1WX9bcKo1pA?pwd=cf9h

提取码:cf9h

食用方法:

step1:下载后用VScode打开文件夹,能看到src里面有这几个文件:

(不会搞VScode platformio的同学强烈推荐这个教程: https://www.bilibili.com/video/BV1xY4y1b7un/?share_source=copy_web&vd_source=203f2aa16a22e4820da35c4fe0a39593

其中start.cpp是主程序,点击上传到esp32

step2:硬件连接

esp32与MPU6050引脚接法:

3.3v->VCC

GND->GND

GPIO22->SCL

GPIO21->SDA

step3:将esp32连接电脑,打开串口监视器即可看到esp32正在输出陀螺仪的姿态数据:

此处注意波特率是115200。可以看到,输出的速率非常快,这归功于esp32超高的运算速度,此时限制输出速度的不再是MCU,而是MPU6050。仔细整理数据将发现,无论6050以多高的速度转动,输出的相邻数据都会出现重复现象。这是因为esp32在6050的下一组数据传来前已经将上一组数据处理了两次。

2.详细介绍

代码源自arduinoIDE中MPU6050实例,本人将该实例整理并调整为适用于esp32的模式供大家使用。arduinoIDE中的原始代码可直接在arduino开发板上稳定运行,只是速度远不如esp32

输出的数三个数据(PRY)分别是Pitch(俯仰角)、Roll(横滚角)、Yaw(偏航角)的缩写。

如果想在串口监视器中看到其它数据可在<可视化>部分中找到要显示的数据的相关函数进行调用。

文件夹中其它文件主要为esp32与MPU6050的I2C通讯程序和陀螺仪数据的dmp解算程序,其中数据不建议改动。

最后,同为小白,希望本篇能帮到大家!谢谢大家的光顾!

### ESP32MPU6050姿态及四元数获取 #### 硬件连接 为了使ESP32能够读取来自MPU6050的数据,需建立两者间的物理连接。通常情况下,VCC接3.3V电源,GND接地;SDA和SCL分别对应I2C总线的数据线和时钟线[^1]。 #### I2C通信设置 在程序中初始化I2C接口对于确保稳定可靠的通讯至关重要。下面是一段用于启动I2C服务的Arduino风格代码片段: ```cpp #include <Wire.h> void setup() { Wire.begin(); // 初始化I2C作为主机模式 } ``` #### DMP固件加载 DMP(Digital Motion Processor)是内置在MPU6050内部的一个协处理器,专门负责处理加速度计和陀螺仪产生的大量原始数据,并将其转换成更有意义的信息形式——如四元数。要激活这一特性,则需要向设备上传特定版本的固件文件。 #### 数据析函数编写 一旦成功启用了DMP功能之后,就可以调用相应的API来提取所需的结果了。这里给出一段示范性的源码用来演示怎样从传感器那里取得最新的姿态估计值: ```cpp #include "MPU6050_DMP6.h" // 创建类实例对象 MPU6050 mpu; Quaternion q; // [w, x, y, z] 四元数值 VectorFloat gravity; // [x, y, z] 重力矢量 void loop(){ if (mpu.dmpGetCurrentFIFOPacket(fifoBuffer)) { mpu.dmpGetQuaternion(&q, fifoBuffer); Serial.print("quat:\t"); Serial.print(q.w);Serial.print("\t"); Serial.print(q.x);Serial.print("\t"); Serial.print(q.y);Serial.print("\t"); Serial.println(q.z); delay(100); } } ``` 上述代码实现了每间隔一定时间打印一次由DMP计得出的最新四元数表示法下的旋转状态信息至串口监视器上显示出来。 #### 调试与优化 在整个开发过程中不可避免会遇到各种各样的挑战,在此期间持续调整参数直至达到满意的效果是非常重要的环节之一。比如适当降低采样频率或者增加滤波强度都可以有效改善最终输出质量。
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值