实践是检验真理的唯一标准,这句话在任何时候都不过时,特别是像编程这种需要实际操作反馈的技术,通过断断续续半个月来鼓捣DMP库的艰辛历程来看,这一切都是值得的,当你发现答案竟然如此简单的时候,可能会为此前所花的时间感到后悔,但是这无疑教会了我很多东西
其实移植DMP我相信大家都会,要不就是野火要不就是正点原子,但是如果你想用串口上位机而不是官方python上位机的话,可以看看我的移植过程,也许对你有启发,这里我使用的是正点原子的例程,B站上有一节的视频,参考移植相应头文件,主函数改下参数就可以实现串口打印DMP解算后的值了。
但是!!!!
我发现如果使用正点原子MPD解算出来的姿态角,是根据一开始静止时的姿态,作为参考水平面的,也就是说如果你想要相对于地球的水平面倾角,是不能得到的。
但是我的项目又要求我一开始有一个绝对的水平面,我就花了大量时间去理解DMP的函数,但是你们都知道,这看着头大的官方程序就算看懂了也不会改。所以我在网上逛了很多论坛,终于找到了解决方案。
链接:
小马哥视频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小时内删除。
留言与评论(共有 0 条评论) |