在iOS上使用Madgwick的传感器融合algorithm

我试图在iOS上运行Madgwick的传感器融合algorithm 。 由于代码是开源的,我已经将其包含在我的项目中,并使用提供的传感器值调用方法。

但是,似乎algorithm期望在不同的坐标系中进行传感器测量。 苹果CoreMotion传感器系统位于右侧Madgewick的左侧。 这里是不同坐标系的图片。 两个系统都遵循右手的规则。 对我来说,似乎围绕z轴旋转了90度。 但是这不起作用。

不同的坐标系统

我也尝试翻转x和y(和反转z)轴build议其他stackoverflow职位为WP,但这并没有工作。 那么你有提示吗? 如果Madgwick的algorithm输出可能与CoreMotion输出(CMAttitudeReferenceFrameXMagneticNorthZVertical)在同一个系统中,那将是完美的。

此外,我正在为iPhone上的betaDef寻找一个很好的工作价值。 betaDef是一种比例增益,目前设置为0.1f。

任何帮助如何实现目标将不胜感激。

我不知道如何写在客观的c,但这是我如何完成在香草c坐标转换。 我也想旋转的方向,使+ y是北。 这个翻译也反映在下面的方法中。

此方法需要wxyzforms的4元素四元数,并返回相同格式的转换后的四元数:

void madgeq_to_openglq(float *fMadgQ, float *fRetQ) { float fTmpQ[4]; // Rotate around Z-axis, 90 degres: float fXYRotationQ[4] = { sqrt(0.5), 0, 0, -1.0*sqrt(0.5) }; // Inverse the rotation vectors to accomodate handedness-issues: fTmpQ[0] = fMadgQ[0]; fTmpQ[1] = fMadgQ[1] * -1.0f; fTmpQ[2] = fMadgQ[2]; fTmpQ[3] = fMadgQ[3] * -1.0f; // And then store the translated Rotation into ret: quatMult((float *) &fTmpQ, (float *) &fXYRotationQ, fRetQ); } // Quaternion Multiplication operator. Expects its 4-element arrays in wxyz order void quatMult(float *a, float *b, float *ret) { ret[0] = (b[0] * a[0]) - (b[1] * a[1]) - (b[2] * a[2]) - (b[3] * a[3]); ret[1] = (b[0] * a[1]) + (b[1] * a[0]) + (b[2] * a[3]) - (b[3] * a[2]); ret[2] = (b[0] * a[2]) + (b[2] * a[0]) + (b[3] * a[1]) - (b[1] * a[3]); ret[3] = (b[0] * a[3]) + (b[3] * a[0]) + (b[1] * a[2]) - (b[2] * a[1]); return; } 

希望有所帮助!

Interesting Posts