2

iOS에서 Madgwick's sensor fusion algorithm을 실행하려고합니다. 코드는 오픈 소스이기 때문에 이미 프로젝트에 포함되어 있으며 제공된 센서 값으로 메소드를 호출합니다.iOS에서 Madgwick의 센서 융합 알고리즘

그러나 알고리즘은 다른 좌표계에서 센서 측정을 기대합니다. Apple CoreMotion 센서 시스템은 오른쪽에, Madgewick은 왼쪽에 있습니다. 다음은 different coordinate systems의 사진입니다. 두 시스템 모두 오른손 규칙을 따릅니다. Z 축 주위로 90도 회전하는 것처럼 보입니다. 그러나 이것은 효과가 없었습니다.

different coordinate systems

은 또한 x와 y를 플립 (반전 및 z)에 대한 WP other stackoverflow posts 제안하지만이 또한 작동하지 않았던 것에 축을했습니다. 너는 힌트를 가지고 있니? Madgwick의 alogithm 출력이 CoreMotion 출력 (CMAttitudeReferenceFrameXMagneticNorthZVertical)과 동일한 시스템에있을 수 있으면 완벽 할 것입니다.

아이폰에서 betaDef에 대한 좋은 사용 가치를 찾고 있습니다. betaDef은 일종의 비례 이득이며 현재 0.1f로 설정되어 있습니다.

목표 달성 방법에 대한 도움을 주시면 감사하겠습니다.

+0

작업을 완료 할 수 있었습니까? – hariszaman

+0

아니요, 죄송합니다. 더 이상 Mac을 사용하지 마십시오. – flix

+0

빠른 답장을 보내 주셔서 감사합니다 – hariszaman

답변

0

이 글은 어떻게 목표 C로 쓰는지 모르겠지만, 바닐라 c에서 좌표 변환을 수행하는 방법은 다음과 같습니다. + y가 북쪽이되도록 방향을 회전시키고 싶었습니다. 이 번역은 아래의 방법에도 반영됩니다.

이 방법은 WXYZ의 형태로 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; 
} 

희망!