MPU6050中调用DMP库做参考面使用绝对水平面的方法

阅读: 评论:0

MPU6050中调用DMP库做参考面使用绝对水平面的方法

MPU6050中调用DMP库做参考面使用绝对水平面的方法

MPU6050中调用DMP参考面使用绝对水平面的方法

实践是检验真理的唯一标准,这句话在任何时候都不过时,特别是像编程这种需要实际操作反馈的技术,通过断断续续半个月来鼓捣DMP库的艰辛历程来看,这一切都是值得的,当你发现答案竟然如此简单的时候,可能会为此前所花的时间感到后悔,但是这无疑教会了我很多东西

1、DMP库移植

其实移植DMP我相信大家都会,要不就是野火要不就是正点原子,但是如果你想用串口上位机而不是官方python上位机的话,可以看看我的移植过程,也许对你有启发,这里我使用的是正点原子的例程,B站上有一节的视频,参考移植相应头文件,主函数改下参数就可以实现串口打印DMP解算后的值了。

但是!!!!
我发现如果使用正点原子MPD解算出来的姿态角,是根据一开始静止时的姿态,作为参考水平面的,也就是说如果你想要相对于地球的水平面倾角,是不能得到的。

但是我的项目又要求我一开始有一个绝对的水平面,我就花了大量时间去理解DMP的函数,但是你们都知道,这看着头大的官方程序就算看懂了也不会改。所以我在网上逛了很多论坛,终于找到了解决方案。

2、run_self_test中的参数修改

链接:

小马哥视频12讲,在1小时3分钟出重点了,他说如果不想让一开始的初始化为绝对水平,那就在 run_self_test(void)中加上accel_sens = 0;
但是实际上我的代码已经没有了这部分,可是还是以初始化为绝对平面,所以我想想不如反其道行之,我加上accel_sens = 0;,事实证明是对的。代码部分如下,我是在inv_mpu.c文件2898行中加上这句话(移植的是正点原子)。这里我以pitch轴为转动角,既可以实现绝对水平面的角度显示。

u8 run_self_test(void)
{int result;//char test_packet[4] = {0};long gyro[3], accel[3]; result = mpu_run_self_test(gyro, accel);if (result == 0x3) {/* Test passed. We can trust the gyro data here, so let's push it down* to the DMP.*/float sens;unsigned short accel_sens;mpu_get_gyro_sens(&sens);gyro[0] = (long)(gyro[0] * sens);gyro[1] = (long)(gyro[1] * sens);gyro[2] = (long)(gyro[2] * sens);dmp_set_gyro_bias(gyro);mpu_get_accel_sens(&accel_sens);accel_sens = 0;//这里加上,即可实现任意角度初始化来实现Z轴与重力重合accel[0] *= accel_sens;accel[1] *= accel_sens;accel[2] *= accel_sens;dmp_set_accel_bias(accel);return 0;}else return 1;
}

本文发布于:2024-01-31 01:32:20,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170663594324377.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:水平面   方法   DMP
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23