Arduino提高篇(十七)MPU6050姿态解算

对于大多数MPU6050的应用来说,获取到的原始数据并没有多大用处,我们需要对原始数据进行姿态融合解算,最终得到姿态数据,也就是三个欧拉角:航向角(yaw)、横滚角(roll)和俯仰角(pitch)。

MPU6050内部自带数字运动处理器(DMP)硬件加速引擎,配合运动驱动库直接输出四元数,进而很方便的计算出欧拉角,大大降低了主控MCU的负担。本篇使用MPU6050的驱动库来获取姿态数据。

1. MPU6050驱动库安装
MPU6050的驱动库有很多,我们可以在IDE中单击「项目」—「加载库」—「管理库」,在搜索栏输入"6050",可以看到不同的驱动库。


本篇我们使用的由国外大牛Jeff Rowberg开发的库并没有在列表中,需要下载后导入到Arduino。点击跳转到Github下载。

下载到的库文件其实是多种设备的IIC驱动库,我们这里只需要两个文件夹下的文件。解压后,进入"Arduino"文件夹,里面的"I2Cdev"和"MPU6050"就是我们需要的文件。

找到Arduino的libraries文件路径,Windows下路径为"C:\Users\Tony\Documents\Arduino\libraries",修改“Tony”为你的电脑用户名。我们拷贝这两个文件夹到该路径下,至此库文件安装完成。

2. 实验材料
Uno R3开发板
配套USB数据线
面包板及配套连接线
MPU6050传感器模块
3. 实验步骤
1. 根据原理图搭建电路图。
MPU6050传感器模块的VCC、GND分别连接开发板的3.3V、GND,传感器的SDA、SCL引脚连接开发板A4、A5引脚。

实验原理图如下图所示:

实物连接图如下图所示:

2. 新建sketch,拷贝如下代码替换自动生成的代码并进行保存。
/*
   DMP
   MPU6050姿态解算
*/

#include "I2Cdev.h"
#include "MPU6050_6Axis_MotionApps20.h"

MPU6050 mpu;
uint8_t fifoBuffer[64];
Quaternion q;
VectorFloat gravity;
float ypr[3];

void setup()
{
  Serial.begin(115200);
  mpu.initialize();
  mpu.dmpInitialize();
  mpu.CalibrateAccel(6);
  mpu.CalibrateGyro(6);
  mpu.PrintActiveOffsets();
  mpu.setDMPEnabled(true);
}

void loop()
{
  if (mpu.dmpGetCurrentFIFOPacket(fifoBuffer))
  {
    mpu.dmpGetQuaternion(&q, fifoBuffer);
    mpu.dmpGetGravity(&gravity, &q);
    mpu.dmpGetYawPitchRoll(ypr, &q, &gravity);
    Serial.print("ypr\t");
    Serial.print(ypr[0] * 180 / M_PI);
    Serial.print("\t");
    Serial.print(ypr[1] * 180 / M_PI);
    Serial.print("\t");
    Serial.println(ypr[2] * 180 / M_PI);
  }
}

3. 连接开发板,设置好对应端口号和开发板类型,进行程序下载。

4. 实验现象

打开串口监视器,波特率设置成与程序中相一致的115200。监视器中输出三个欧拉角数据,移动MPU6050,数据发生变化。

Arduino学习交流群:672088578
更多内容,欢迎关注我的公众号。 微信扫一扫下方二维码即可关注:

### MPU6050 使用 DMP 进行姿态并获得四元数 #### 原理概述 MPU6050 的 DMP (Digital Motion Processor) 是一种嵌入式的协处理器,能够独立处理来自传感器的数据流。DMP 可以执行复杂的运动融合法而不需要主机微控制器的干预。对于姿态而言,DMP 能够直接提供经过校准后的四元数值,这些值代表了设备的空间方向。 当启用 DMP 后,该模块会自动读取内部陀螺仪和加速计数据,并利用内置法计出精确的姿态信息——通常是以四元数形式表示[^1]。四元数是一种用于描述三维空间中的旋转的有效工具,在避免万向锁问题方面优于传统的欧拉角表达方式[^2]。 #### 示例代码实现 为了展示如何配置 MPU6050 并从其 DMP 获取四元数输出,以下是 Python 和 Arduino C++ 两种不同平台下的示例程序: ##### Python 实现(基于 `mpu6050` 库) ```python import smbus from mpu6050 import mpu6050 sensor = mpu6050(0x68) def setup(): sensor.dmp_initialize() def loop(): packet = sensor.get_integrated_dmp_data() q_w, q_x, q_y, q_z = packet['quaternion'] print(f'Quaternion: w={q_w}, x={q_x}, y={q_y}, z={q_z}') ``` ##### Arduino C++ 实现(基于 I2CdevLib 库) ```cpp #include "I2Cdev.h" #include "MPU6050_6Axis_MotionApps20.h" MPU6050 accelgyro; uint8_t dmpPacketSize; void setup() { Serial.begin(9600); while (!Serial); Wire.begin(); accelgyro.initialize(); devStatus = accelgyro.dmpInitialize(); if (devStatus == 0) { dmpPacketSize = accelgyro.dmpGetFIFOPacketSize(); fifoCount = accelgyro.getFIFOCount(); } } void loop() { uint8_t *fifoBuffer; if (accelgyro.dmpGetCurrentFIFOPacket(fifoBuffer)) { Quaternion q; accelgyro.dmpGetQuaternion(&q, fifoBuffer); Serial.print("w:"); Serial.print(q.w); Serial.print("\tx:"); Serial.print(q.x); Serial.print("\ty:"); Serial.print(q.y); Serial.print("\tz:"); Serial.println(q.z); } } ``` 上述两段代码展示了初始化 MPU6050 设备以及周期性地请求最新的四元数更新的过程。Python 版本依赖于第三方库来简化通信过程;Arduino 则更接近底层硬件接口编程,提供了更多控制选项。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值