陀螺仪模块mpu6050

1.感慨

     这个模块是我参考学习的野火电子的,它们的文档也很详细,但是我做一个属于自己的总结,算是分享一下经验和遇到的问题。

2.模块硬件

    5v电源,iic通讯(建议软件iic),可以再接一个iic传感器。一个dmp数据更新通知引脚。总共7个引脚,stm32驱动接个iic就行。模块自带Dmp计算,想用模块自带的DMP功能,必须接pin7也就是dmp数据更新引脚。这是一个6轴,三个加速度,三个角速度。

3.原理

    一个真空室有一悬浮小球,你一动他就会因为惯性对室壁产生压力,将压力量化细分就是每个方向的力,通过牛三算出加速度。然后利用一个陀螺的定轴性和进动性,你只要动,陀螺就会转,陀螺转过的角度与时间的关系就是角速度。

      获得加速度和角速度后,你需要一个方法去实现姿势的计算。就是四元数到欧拉角的计算。

四元数,任何旋转都有一个定轴,绕定轴转过的角度,绕xyz三轴转过的角度,就是这4个角度。然后根据四元数计算出欧拉角,也就是pitch,yaw,roll。

    如何确定定轴,这个你都获得xyz旋转过的角度了,定轴在xyz上的投影就是你获得的角度计算出来的。倒推一下公式就行。公式查一下,比较繁琐,去官网查看会更详细,我说的可能会有问题。

4.移植DMP库,找一个项目例程看看,把文件移过来就行。

         此处只是基于stm32裸机标准库的移植:

       如何获得这些文件,直接百度搜或者去官网下载就行。

  1.移植所有的源文件和头文件路径,

       

      2.移植I2C,就是选择一下你要用软件iic还是硬件iic,然后设定你想要的引脚:

         在iic头文件中定义一下:

          

    

   3.移植初始化程序和数据处理函数

       1.   iic初始化:

             配置引脚时钟资源,基础操作。

      2.dmp初始化

           初始化硬件,也就是mpu6050,先复位,再唤醒,配置一些跳过,回调的函数。

           初始化mpl数据处理模块。

           涉及的东西比较多,可以参考一下官方的示例。

     3.数据处理

           

          直接调用dmp提供的api接口。

      4.注意事项

               1.记得初始化一下时间戳。

                     get_tick_count(&timestamp);就是定义一下这个函数,程序中很多地方会调用这个函数。

                   

                 TimingDelay_Decrement();
                  TimeStamp_Increment();

                将这两个函数放到毫秒定时器中。

   5.数值变化

              mpu6050平放:x,y的值一般小于1.z的数值会有规律的增长。

   6.算法

            如果不加dmp库,直接iic读取数值的话,读取的值为加速度和角速度一共6个数值。

          角速度转化为角度:

           陀螺仪角速度=读取值/灵敏度  度/秒   \omegax=陀螺仪读取的值/16.4   16.4对应\pm2000 度/秒的量程。

             Rx=Rx0+\omegax*dt   //积分一下就得到 绕x轴旋转的角度,y,z依次。

             然后再将角度转换成四元数:

       此处只是3轴角速度转换成加速度。

       float  X, Y, Z = Rx/180 * PI,Ry/180 * PI,Rz/180 * PI
       Qx = math.cos(Y/2)*math.cos(Z/2)*math.sin(X/2)-math.sin(Y/2)*math.sin(Z/2)*math.cos(X/2)
       Qy = math.sin(Y/2)*math.cos(Z/2)*math.cos(X/2)+math.cos(Y/2)*math.sin(Z/2)*math.sin(X/2)
       Qz = math.cos(Y/2)*math.sin(Z/2)*math.cos(X/2)-math.sin(Y/2)*math.cos(Z/2)*math.sin(X/2)
      QW = math.cos(Y/2)*math.cos(Z/2)*math.cos(X/2)+math.sin(Y/2)*math.sin(Z/2)*math.sin(X/2)

      这是最简单的转换,比较厉害的还会加入加速度,磁场计,通过九轴转换的肯定比三轴角速度更好,DMP库支持6轴和9轴转换,需要在头文件选择使能9轴计算。

          四元数定义:

                          

                                  

                              w:空间旋转轴     \displaystyle \alpha:绕w旋转的角度   为什么引入w,为了归一化。

                             x:w在x轴的投影     \cos \left ( \beta x \right ) x轴上的分量

                             y:w 在y轴对策投影    。。。。。。

                              z与上面一样。

                  

            公式抄的:数学很差,自己推导。想办法消掉含有\alpha的变量的公式。角速度是角度的变化量,也就是陀螺仪的测量对象,但是旋转的度数和速度的变化量之间的转换就是dmp这个库所做的事(也就是你知道速度,但是路程是多少是要计算的。

    角速度无法直接转换成四元数,只能通过推导,推导过程比较复杂,不是搞飞控算法的了解一下直接调用dmp库是最好的,毕竟造汽车的不一定会造发动机。

5.z轴会漂移是没有进行滤波,但是是有规律的增长,所以取相对数值进行调整也是完全没有问题的。

6.两个坐标系

     惯性坐标系:就是东西一根x轴,南北一根y轴,天地一根z轴。

     刚体固定坐标系:以运动物体质心为原点,初始状态平行与东西为Bx轴,平行与南北By轴,平行与天地Bz轴,运动物体姿态发生变化,既Bx,By,Bz不再与惯性坐标系各轴平行。通过变化的角度求出刚体的新的坐标轴相对于惯性坐标系的位置。

     姿势:就是物体坐标系相对于惯性坐标系的变化,比如飞机刚开始(0,0,0),抬一下头(0,1,0)就是它的俯仰角发生了变化。也就是欧拉角中的Roll变大。(pitch,roll,yaw)对应(横滚角,俯仰角,偏航角),这些的依据是运动物体自身的坐标相对于惯性坐标系的变化。

       

  • 6
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MPU6050 是一种常用的六轴陀螺仪传感器模块,可以用于检测物体的加速度和角速度。要使用 MPU6050 模块,需要连接到 Arduino 单片机,并使用相应的库进行编程。 以下是使用 MPU6050 模块的基本步骤: 1. 连接 MPU6050 模块到 Arduino 单片机。连接方法如下: - 将 MPU6050 模块的 VCC 引脚连接到 Arduino 的 5V 引脚。 - 将 MPU6050 模块的 GND 引脚连接到 Arduino 的 GND 引脚。 - 将 MPU6050 模块的 SDA 引脚连接到 Arduino 的 A4 引脚。 - 将 MPU6050 模块的 SCL 引脚连接到 Arduino 的 A5 引脚。 2. 在 Arduino IDE 中安装 MPU6050 库。可以在库管理器中搜索 MPU6050 并安装。 3. 编写程序,使用 MPU6050 库读取 MPU6050 模块的数据。以下是一个简单的示例程序: ```c++ #include <Wire.h> #include <MPU6050.h> MPU6050 mpu; // 创建一个 MPU6050 对象 void setup() { Wire.begin(); // 初始化 I2C 总线 mpu.initialize(); // 初始化 MPU6050 Serial.begin(9600); // 初始化串口 } void loop() { int16_t ax, ay, az, gx, gy, gz; // 定义变量存储 MPU6050 的数据 mpu.getMotion6(&ax, &ay, &az, &gx, &gy, &gz); // 读取 MPU6050 的数据 Serial.print("加速度计:"); Serial.print(ax); Serial.print(", "); Serial.print(ay); Serial.print(", "); Serial.println(az); Serial.print("陀螺仪:"); Serial.print(gx); Serial.print(", "); Serial.print(gy); Serial.print(", "); Serial.println(gz); delay(10); } ``` 在这个程序中,我们使用了 Wire 库和 MPU6050 库,需要在 Arduino IDE 中安装这两个库才能正常编译和上传。在 `setup()` 函数中,我们初始化了 I2C 总线、MPU6050 传感器模块和串口。在 `loop()` 函数中,我们读取了 MPU6050 传感器模块的加速度计和陀螺仪数据,并通过串口输出到电脑上。程序每隔 10 毫秒执行一次。 通过这个程序,我们可以实时读取 MPU6050 传感器模块的加速度计和陀螺仪数据,用于控制舵机等其他组件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值