学习目标

  • 可以通过MPU6050获取加速度信息
  • 可以通过DMP库获取角度信息

    学习内容

    MPU6050

    MPU6050是一种常用的集成电路(IC),结合了3轴陀螺仪和3轴加速度计。它用于各种需要运动跟踪和感应的电子项目和设备。MPU6050由英飞凌科技公司(InvenSense)制造,现在已被TDK收购。它的一些主要特点包括:

  • 3轴陀螺仪:测量角速度,单位为每秒度。

  • 3轴加速度计:测量三个方向的加速度。
  • 数字运动处理器(DMP):对原始传感器数据执行复杂的计算。
  • I2C通信接口:可以与微控制器和其他数字设备轻松集成。

MPU6050在涉及运动跟踪、手势识别和定向检测的项目中很受欢迎。它通常用于无人机、机器人、游戏和虚拟现实系统,以及各种消费电子设备中。开发人员和爱好者经常将MPU6050与Arduino、树莓派和其他嵌入式系统集成,以创建各种运动感应应用程序。

在MPU6050中,DMP代表数字运动处理器(Digital Motion Processor)。DMP是一个处理器,内置在MPU6050中,用于处理原始的陀螺仪和加速度计数据。它可以执行复杂的运动处理算法,如姿态估计、运动追踪和运动补偿,以提供更精确的运动数据。
通过使用DMP,用户可以从MPU6050获得处理过的数据,而不需要过多的处理器负担。DMP可以执行传感器融合算法,将来自陀螺仪和加速度计的数据融合在一起,以提供更准确、更稳定的姿态和运动跟踪信息。
使用DMP可以简化开发过程,因为它减少了对外部处理器的要求,同时提供了更高级的功能。这使得开发人员能够更容易地实现复杂的运动感应应用,如姿态控制、手势识别和空间定位等。

欧拉角

欧拉角(Euler angles)是一种用于描述物体在三维空间中旋转的方式。它由三个角度组成,分别表示绕三个相互垂直的轴(通常是固定的坐标系的X、Y、Z轴)旋转的量。这三个旋转通常被称为“滚动”(Roll)、“俯仰”(Pitch)和“偏航”(Yaw)。
可以通过右手法则判断rpy:
righthand.png

  • 滚动(Roll):绕X轴旋转,将物体沿着X轴的正方向旋转。这种旋转会导致物体绕着自身的横轴旋转。

roll.gif

  • 俯仰(Pitch):绕Y轴旋转,将物体沿着Y轴的正方向旋转。这种旋转会导致物体绕着自身的纵轴旋转。

pitch.gif

  • 偏航(Yaw):绕Z轴旋转,将物体沿着Z轴的正方向旋转。这种旋转会导致物体绕着自身的垂直轴旋转。

yaw.gif
欧拉角通常用于描述物体的旋转姿态,并且相对直观,易于理解。但是,使用欧拉角存在一些问题,特别是在物体进行多次旋转时,可能会产生奇异性和歧义性。这些问题可以导致万向节锁(Gimbal lock)等旋转表示上的限制,特别是当俯仰角接近90度或270度时。
尽管欧拉角在许多情况下都很有用,并且易于人类理解,但在某些情况下,使用四元数等其他表示方法可能更适合处理旋转问题,特别是在需要连续旋转操作或精确姿态控制的情况下。

移植与使用

bsp_mpu6050.cbsp_mpu6050.hdmpKey.hdmpmap.hinv_mpu.cinv_mpu.hinv_mpu_dmp_motion_driver.cinv_mpu_dmp_motion_driver.h

  • bsp_mpu6050 为mpu6050驱动
  • inv_mpu inv_mpu_dmp_motion_driver为dmp处理器,可以计算出当前的欧拉角。

测试代码:

  1. #include "gd32f4xx.h"
  2. #include "systick.h"
  3. #include <stdio.h>
  4. #include "main.h"
  5. #include "Usart.h"
  6. #include "I2C.h"
  7. #include "bsp_mpu6050.h"
  8. #include "inv_mpu.h"
  9. #include "inv_mpu_dmp_motion_driver.h"
  10. void Usart0_recv(uint8_t* data, uint32_t len) {
  11. printf("recv: %s\r\n", data);
  12. }
  13. int main(void)
  14. {
  15. nvic_priority_group_set(NVIC_PRIGROUP_PRE4_SUB0);
  16. systick_config();
  17. Usart_init();
  18. I2C_init();
  19. printf("start \r\n");
  20. delay_1ms(100);
  21. while(MPU6050_Init()) {
  22. delay_1ms(200);
  23. }
  24. while(mpu_dmp_init()) {
  25. delay_1ms(200);
  26. }
  27. short gx, gy, gz;
  28. float pitch,roll,yaw;
  29. while(1) {
  30. MPU6050ReadGyro(&gx, &gy, &gz);
  31. mpu_dmp_get_data(&pitch, &roll, &yaw);
  32. printf("(%d %d %d)(%f %f %f) \r\n", gx, gy, gz, roll, pitch, yarw);
  33. delay_1ms(15);
  34. }
  35. }

练习

  • 实现mpu6050数据读取