最近买了一个MPU6050 六轴陀螺仪模块,参考原子哥的例程轻松使用DMP驱动并在匿名上位机上成功显示其方位,温度,加速度,欧拉角等参数。
正在兴致勃勃时刻,我随意放置陀螺仪模块后,复位了单片机,发现在陀螺仪并不水平的情况下,经过开机初始化之后,其输出状态居然是水平的。于是乎在思考,如果我要做一款平衡车,岂不是每一次上电都需要手动将小车放平然后再开机?????
这也太不可学了,遍历了原子哥的论坛和度娘,发现也有人有和我一样的疑问,但是都没有找到问题的根本所在。没办法只能一步一步的去看DMP的开机初始化程序。当我看到这样一步的时候突然好像有所发现:(图中框框)
mpu_get_gyro_sens(&sens); 这个就不用说了,用于获得角速度的计算比例;好戏在下头。
dmp_set_gyro_bias(gyro); 这个把开机当前的角速度计算完成后送走了,送到哪里去了呢??当然是DMP 寄存器去了,为什么呐??它开机保存这个开机时刻的角速度干嘛呢??
我们知道,对于运动,我们都要为其设立一个参考系,因为运动都是相对的,陀螺仪输出了值,这个值是相对与谁呢??我们在地球上,相对参考系当然是地面。假如我们在动车上做实验,陀螺仪输出的值是相对与谁呢??当然是动车!!!! 那为什么是动车呢?那我就告诉你,因为开机陀螺仪初始化的时候陀螺仪是相对火车静止的,故开机对谁静止,陀螺仪输出的值就是相对于谁的运动速率。
回到主题,DMP自检时刻保存了开机时的陀螺仪速率,其实就是让陀螺仪检测到的速率去除开机时刻的速率,自然得到了陀螺仪与开机时刻参考系的相对速率,也就是我们需要的有效值。这也就是抑制温漂的原理。
再来看看加速度重心的校准程序,与陀螺仪一样,均是修正相对参考系的速率和位置。但是加速度传感器不一样,只要传感器不动,其重力加速度方向是不变的,默认的是-Y是重力加速的的正方向。如果在模块非水平情况下进行了重力校准,那么-Y就不是重力方向了,为了得到无论模块处于什么状态是都需要—y是重力的正方向,我们就有这样的一个高大上的办法。那就是“不要对重力进行校准”


。
改掉源代码就是在使用accel_sens前加一行: accel_sens=0;使其重力校准失效!!!即可!!!
经修改后,模块的初始方位不再收开机时刻模块位置的影响,使用DMP一样需要8S左右的时间稳定,起码不用再担心开机需要去将小车扶正吧!(如果是其他用途,需要开机修正方位的程序,这样就不行了哟!目测比较少)
最后要感谢广大的电子同胞,看了你们的帖子和问题,我颇收益匪浅。感谢你们,因为你们都有一颗有福同享的心。
jermy_z 发表于 2015-11-22 20:44
呵呵 帮顶 其实论坛里早就有一版DMP 是无视初始位置的,但是原理是不是 ...
BigDiong 发表于 2017-9-14 14:49
楼主,我的模块跑mpu_run_self_test一直失败,是什么原因
BigDiong 发表于 2017-9-14 14:49
楼主,我的模块跑mpu_run_self_test一直失败,是什么原因
mark2020 发表于 2020-6-16 18:54
垂直放置还是无法自检通过
于玮 发表于 2017-5-18 14:43
**** 作者被禁止或删除 内容自动屏蔽 ****
| 欢迎光临 OpenEdv-开源电子网 (http://47.111.11.73/) | Powered by Discuz! X3.4 |