programing

3d 가속도계가 방향을 계산합니다.

cafebook 2023. 10. 25. 23:44
반응형

3d 가속도계가 방향을 계산합니다.

3축에 대한 가속도계 값이 있습니다(보통 중력만 -1.0에서 1.0 사이의 데이터를 포함하는 경우).

  float Rx;
  float Ry;
  float Rz;

몇 가지 계산을 해보고 각 축에 대한 각도를 알아봅니다.

  float R =  sqrt(pow(Rx,2)+pow(Ry,2)+pow(Rz,2));
  float Arx = acos(Rx/R)*180/M_PI;
  float Ary = acos(Ry/R)*180/M_PI;
  float Arz = acos(Rz/R)*180/M_PI;

그런 다음 박스 각도 값을 opengl로 설정합니다.

rquad = Arx;
yquad = Ary;

내 상자를 회전시키는 방법:

glRotatef(yquad,1.0f,0.0f,0.0f);
glRotatef(rquad,0.0f,1.0f,0.0f);

그것은 반구상에서 작동합니다.풀스피어를 사용하고 싶고 Arz값을 사용해야 작동이 된다는 것을 알고 있지만 이번 회전에는 어떻게 사용할 수 있는지 모르겠습니다.좀 도와 주시겠습니까?

업데이트: 최종 답변은 다음과 같습니다.

  rquad = -atan2(Rx/R, Rz/R)*180/M_PI;
  yquad = -atan2(Ry/R, Rz/R)*180/M_PI;

정답은 다음과 같습니다.

Roll = atan2(Y, Z) * 180/M_PI;
Pitch = atan2(-X, sqrt(Y*Y + Z*Z)) * 180/M_PI;

출처 : https://www.nxp.com/docs/en/application-note/AN3461.pdf (10페이지, 25&26)

유에스피의 대답은 틀렸습니다.피치와 롤이 모두 45도 이상이 될 때까지 허용 가능한 근사치처럼 보입니다.

저는 다른 방향 규칙을 가정하고 있을 수 있지만, 축을 교환하고 값을 일정한 방식으로 반전시키더라도 uesp의 계산은 결코 동등하지 않을 것입니다.

mateo의 답변은 정확하지만 완전하고 완벽한 해결책을 제공하지는 못합니다.공식이 정확합니다.

Roll = atan2(Y, Z) * 180/M_PI;
Pitch = atan2(-X, sqrt(Y*Y + Z*Z)) * 180/M_PI;

그러나 피치가 +90/-90도이고 X축이 수직으로 위/아래를 가리키면 이상적인 가속도계 정규화 출력은 다음과 같습니다.

accX = -1  / accX = 1 
accY = 0
accZ = 0

그 말은 a.roll angle of 0 degrees; 정확한하지만 실제로는 가속도계 출력이 시끄럽기 때문에 다음과 같은 것에 가까워질 수 있습니다.

accX = -1  / accX = 1 
accY = 0.003
accZ = 0.004

이것은 작게 보일 수 있지만 롤 각도가 ~30degrea가 되어 정확하지 않습니다.

명백한 본능은 마지막 숫자를 걸러내는 것이지만, 이것은 정확성에 영향을 미칠 것이고, 이것은 항상 허용될 수 있는 것은 아닙니다.

참조 앱 노트에서 매우 잘 설명되는 절충점은 롤 공식에 가속도계 X축 판독값의 매우 적은 비율을 포함하는 것입니다.

Roll  = atan2( Y,   sign* sqrt(Z*Z+ miu*X*X));
sign  = 1 if accZ>0, -1 otherwise 
miu = 0.001

위에서 설명한 것과 같은 조건에서 롤을 측정할 때의 오차는 이전의 경우보다 2~3도 정도 줄어듭니다.

권장 솔루션(matteo's)을 사용해 보았는데 처음에는 잘 작동하는 것 같았지만 피치가 90도에 가까워지면(약 70도에서 시작하지만 반드시 다른 전화기에서 일관되지는 않음) 갑자기 롤이 급증하는 것을 발견했습니다.피치가 90에 있을 때 0 정도여야 하는 롤은 이제 100을 넘어 계속해서 180으로 증가합니다.수학적으로 이를 방지할 수 있는 방법을 생각하려고 합니다. 롤을 +90/-90으로 제한하면 정상적으로 작동하지만 원하는 범위(+180/-180)를 얻지 못합니다.Math.atan2(y, Math.sqrt(xx) + (z)) * (180/Math)PI))

위해서roll, 당신이 사용할 수 있다는 것을 알았습니다.arctan(y/sqrt(X*X)+(z*z))이것은 롤을 줄 것입니다.-90/90피치 문제를 주지 않고 항공 표준입니다.

다음 계산을 사용하여 가속도계 수치를 롤 값과 피치 값으로 변환합니다.

Roll = atan2( sqrt(Y*Y + X*X), Z) * 180/M_PI;
Pitch = atan2( sqrt(X*X + Z*Z), Y) * 180/M_PI;

가속도계를 정의하는 방법에 따라 X/Y/Z 값을 바꾸거나 롤/피치를 변환해야 할 수도 있습니다.디스플레이에 사용하는 것은 다음과 같은 간단한 문제는 다음과 같습니다.

glRotatef (Pitch, 0.0f, 0.0f, 1.0f);
glRotatef (Roll,  1.0f, 0.0f, 0.0f);

언급URL : https://stackoverflow.com/questions/3755059/3d-accelerometer-calculate-the-orientation

반응형