장치가 수평으로 유지되는 동안 내 앱이 장치 회전을 감지 할 수있게하려고합니다. 나침반에서 판독 값을 사용할 수는 있지만 자이로 스코프의 yaw 값이 더 정확할 것이라고 생각합니다. yaw 수치가 주어지면 360 ° 회전 (시계 방향 또는 시계 반대 방향)을 결정하는 가장 좋은 알고리즘은 무엇입니까? 그리고 한 방향으로는 180 °, 반대 방향으로는 180 ° 뒤로 돌리는 것이 아니라 전체 360 °가되어야합니다.자이로 스코프를 사용하여 360 ° iOS 장치 회전 감지
답변
짧은 간격으로 판독 값을 얻을 수 있고 yaw을 특정 시작 지점에서 제로화 할 수 있다고 가정합니다. 이것은 연속적으로 적응 된 시작 지점에서 전체 원을 감지하는 다른 대답과 다릅니다.
이 접근법에서는 현재 요와 이전 요를 비교하여 180도 또는 180 초의 검사 점을 통과했는지 여부를 묻습니다. 처음에는 체크 포인트 플래그 cp_pi
이 NO
이고 어느 한 방향으로 전달하면 해당 상태가 토글됩니다. yaw는 0 점에서 두 곳, 다시 PI
에서 -PI
으로 기호를 변경합니다. 개체를 가정
검출기, BOOL cp_pi;
및 float prev_yaw;
, 우리는 d_yaw
이 원의 반대편에 교차 0과보다 큰 PI
교차에 대한 PI
미만임을 고려의 tick
의 사이에 지속적 두 가지 속성이 있습니다. 반대쪽을 건너면 cp_pi
을 토글합니다. 우리의 인생을 더 쉽게하기 위해, 우리는을 건너 뛸 것을
-(void)tick
{
float yaw = [self zeroedYaw];
if ((fabs(yaw) == PI) || (yaw == 0.0f)) return;
if (yaw * prev_yaw < 0)
{
float d_yaw = fabs(yaw - prev_yaw);
if (d_yaw > PI)
{
cp_pi = ! cp_pi;
}
else if (cp_pi)
{
// fire detection event
}
}
prev_yaw = yaw;
}
참고 : 그렇지, cp_pi
가 NO
로 다시 전환 된 것 - 0 교차하면서 cp_pi
이 YES
때, 우리는 완전한 원을 통과 보장됩니다 탐지기 기능은 완전히 yaw
이 검문소 중 하나에 앉아있는 경우에만 작동합니다.
CoreMotion을 사용하여 세로 축을 기준으로 회전을 얻습니다. 델타 회전 이벤트를 추가해야합니다. 최소값 이상이 지난 시점과 다를 때마다 출발점을 재설정합니다. 그 다음이 시작점에서 360도 또는 360도에 도착하면 회전합니다.
예, CoreMotion은 자이로 스코프와 나침반의 조합을 사용하여 장치 방향을보다 정확하고 정확하게 판독합니다. – Fogmeister
한 방향으로 180 ° 교차 한 다음 반대 방향으로 180 ° 뒤쪽으로 0 °로 되돌릴 경우 어떻게됩니까? 여전히 회전으로 간주 될 것입니까? – thisiscrazy4
'cp_pi =! cp_pi '는 두 번째 교차점에서'아니오 '로 되돌아 가므로 회전으로 감지되지 않습니다. –
그런 다음 완전한 원을 완료하기 위해 다른 시간을 돌리면'cp_pi'는 +/-'PI'에서 다시'YES'로 바뀌고 이벤트는 결국 0으로 트리거됩니다. 그러면 전체 원만 계산됩니다. –