zcan 发表于 2014-6-23 15:19:52

MPU6050 DMP出来了欧拉角和四元数,都是以初始位置为参考?

本帖最后由 zcan 于 2014-6-23 15:24 编辑

今天移植了一下MPU6050的DMP到飞思卡尔M0上,输出的四元数欧拉角什么的都是以初始状态为参照的吗?我斜着放置,再上电的话读出来的数据Pitch Roll Yaw都是0附近的数,我怎么才能得到真实的值呢,真实的位置或是角度值?
怎么才能以地面为参照输出真实情况值?

qzrzq 发表于 2014-6-26 14:47:52

在自测函数里面改,run_self_test函数在上电的时候会执行,传感器会读取静止时的陀螺仪和加速度值,作为静态误差,输出的时候会减去这个静态误差再输出,所以你斜着放的时候读回来的数据也是0附近

我解决的方法是,把传感器放水平了,读取10次左右陀螺仪和加速度的值,算出平均值,在自测函数里面直接把刚才算出来的陀螺仪和加速度的平均值写入到传感器里面,这样无论你怎么放传感器,输出的时候都会减去这个你最初设定的在水平位置的值(水平位置的静态误差)就可以避免你说的这种的情况。。。。。。仅供参考。。不知道还有没有其他更好的方法。。。

zcan 发表于 2014-6-27 10:28:01

qzrzq 发表于 2014-6-26 14:47
在自测函数里面改,run_self_test函数在上电的时候会执行,传感器会读取静止时的陀螺仪和加速度值,作为静 ...

初始时候的静态误差读取是dmp_set_gyro_bias 与dmp_set_accel_bias 这两个函数里吗?具体修改哪里 你设置的修改多少呀?我程序看的一头雾水的{:sweat:}

maxwelllls 发表于 2014-6-27 10:42:09

俯仰和滚转是通过加速度计对准的,是真实的,偏航是以初始角度为0度 但是没有磁阻传感器,零偏稳定性很差,跑得很严重,没有参考价值

lbz024 发表于 2014-6-27 11:43:24

隐藏了这么好的东西。。

qzrzq 发表于 2014-6-29 18:42:09

在selftest函数里面,
mpu_run_self_test(gyro, accel);这个函数会把你初始状态加速度值和陀螺仪值读取回来,放到gyro和accel两个数组里面,作为静态误差,并且返回result,
如果result为3,说明测试自测通过,就会把刚才读回来的gyro和accel数组里面的数据乘以分辨率(由mpu_get_gyro_sens(&sens)获得),最后把结果通过dmp_set_gyro_bias(gyro)函数
和dmp_set_accel_bias(accel)函数写入到dmp。。。
我是在dmp_set_accel_bias(accel)函数前把accel数组里面的值改了。。改成我再水平状态下测到的值

xyq665513 发表于 2014-7-5 16:11:45

qzrzq 发表于 2014-6-29 18:42
在selftest函数里面,
mpu_run_self_test(gyro, accel);这个函数会把你初始状态加速度值和陀螺仪值读取回来 ...

终于碰到个大神。。。请教一下初始坐标的问题,gyro_orientation这个数组的值,MPU6050水平放的时候,赋值成{-1,0,0,0,-1,0,0,0,-1},这个时候Z轴对应YAW轴,Y轴对应PITCH轴,X轴对应ROLL轴,没问题!我现在需要芯片立起来,Y轴与地面水平,怎么设置这个数组?我试过N种,好像都不行。

claytoncn 发表于 2014-7-8 21:55:30

xyq665513 发表于 2014-7-5 16:11
终于碰到个大神。。。请教一下初始坐标的问题,gyro_orientation这个数组的值,MPU6050水平放的时候, ...


    MPU默认的安装方向如图a,若要让芯片立起来,则相当于MPU的安装方向绕Y轴旋转了+90度,如图b。此时欧拉转动的轴的顺序发生了改变,应该为"Z轴(俯仰)-->Y轴(滚转)-->X轴(偏航)",而不是默认的XYZ。由inv_orientation_matrix_to_scalar()函数可知,当转动顺序为ZYX时,scalar的值为000_001_010,由inv_row_2_scale()函数反推,既可得到gyro_orientation[]的值为{0 0 1, 0 1 0, 1 0 0}。
    板子不在身边,@xyq665513可以先试一下。

claytoncn 发表于 2014-7-8 21:57:12

楼主的情况可以直接注释掉run_self_test()函数中的:
    /* 这里注释掉了加速度计校准的部分,防止写入加速度计的偏置,以得到真正的重力方向 */
//    mpu_get_accel_sens(&accel_sens);
//    accel *= accel_sens;
//    accel *= accel_sens;
//    accel *= accel_sens;
//    dmp_set_accel_bias(accel);

zcan 发表于 2014-7-8 23:38:24

claytoncn 发表于 2014-7-8 21:57
楼主的情况可以直接注释掉run_self_test()函数中的:
    /* 这里注释掉了加速度计校准的部分,防止写入加 ...

嗯 明天试试

zcan 发表于 2014-7-18 14:15:33

claytoncn 发表于 2014-7-8 21:57
楼主的情况可以直接注释掉run_self_test()函数中的:
    /* 这里注释掉了加速度计校准的部分,防止写入加 ...

嗯 很好

zddd 发表于 2014-10-23 11:26:42

赞一个!

wangjiawu187 发表于 2015-3-13 16:47:23

不错!!!

fastchaser 发表于 2015-3-16 20:05:56

学习了,用adis16405做的姿态解算都没考虑这个。

zhenhuajiang 发表于 2018-11-23 10:45:13

mark正在学习!

bobo89 发表于 2018-11-23 11:26:23

收藏一下,感觉会用的上!

zfeng0123 发表于 2018-12-26 20:26:53

学习下,赞一个

wilderujs 发表于 2018-12-31 19:22:08

学习了,谢谢

whxemail1121 发表于 2020-3-18 09:15:27

static void run_self_test(void)函数中
执行到
PrintChar("bias has not been modified ......\n");

怎么回事,咋处理啊
页: [1]
查看完整版本: MPU6050 DMP出来了欧拉角和四元数,都是以初始位置为参考?