2009-05-11 3 views
1

데이터를 얻기 위해 초당 50Hz/50 번씩 요청하고 있습니다. 장치는 디스플레이 bevore을 향하게하여 테이블에 평평 동안 갑자기 90도 x- 축에 장치를 플립 할 때, 값은 그 위치에 대한 "타겟"값으로 매우 느리게 움직인다.왜 내 가속도계가 너무 느리게 반응합니까?

이제 이상한 일이다 : 나는 측정 속도를 증가 시키면, 값이 갑자기 90도 장치를 뒤집기에 그 새 값으로 빠르게 이동합니다. 그러나 새 값에 대해 초당 한 번만 물으면 값이 목표에 도달 할 때까지 시간이 오래 걸립니다. 이것에 대한 이유는 무엇입니까?

나는 데이터 집계의 모든 종류를하지 않으며, 아무것도 축적하지 않습니다. 나는 노이즈를 없애기 위해 간단한 필터링을 수행한다. 내 방법은 다음과 같습니다

- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration { 
    // Use a basic low-pass filter to only keep the gravity in the accelerometer values for the X and Y axes 
    // accelerationX is an instance variable 
    accelerationX = acceleration.x * 0.05 + accelerationX * (1.0 - 0.05); 

    // round 
    int i = accelerationX * 100; 
    float clippedAccelerationValue = i; 
    clippedAccelerationValue /= 100; 

    [self moveViews:clippedAccelerationValue]; 
} 

을 나중에 내 -moveViews에서 : 장치가 X-achsis에 90도 회전됩니다의, 그 결과

-(IBAction)moveSceneForPseudo3D:(float)accelerationValue { 
    if(fabs(lastAccelerationValue - accelerationValue) > 0.02) { // some little treshold to prevent flickering when it lays on a table 
     float viewAccelerationOffset = accelerationValue * 19 * -1; 

     newXPos = initialViewOrigin + viewAccelerationOffset; 
     myView.frame = CGRectMake(newXPos, myView.frame.origin.y, myView.frame.size.width, myView.frame.size.height); 

     lastAccelerationValue = accelerationValue; 
    } 
} 

: 방법, 나는 이렇게 , 또는 180도,보기가 그냥 아주 천천히 그것의 목표 위치로 이동합니다. 나는 그것이 가속도계의 물리학 때문인지 아니면 내 필터링 코드의 버그인지 여부를 모르겠습니다. 나는 가속도계가 조향에 사용되는 곳에서 빠른 속도로 진행되는 게임이 있다는 것을 알고 있기 때문에 하드웨어 문제라고는 거의 상상할 수 없습니다.

답변

8

이 라인 :

accelerationX = acceleration.x * 0.05 + accelerationX * (1.0 - 0.05); 

는 X 가속도의 이동 평균을 계산하여 동작하는 저역 통과 필터이다. 즉, 콜백이 호출 될 때마다 accelerationX을 새 가속도계 값으로 5 % 만 이동합니다. 따라서 accelerationX에 새로운 방향이 반영되기 전에 많은 반복이 필요합니다.

은 당신이해야 할 것은 0.2 말의 0.05 값을 증가입니다. 전 세계 #define을 만들고 다른 재생 빈도와 함께 다른 값으로 놀아 보겠습니다.

+0

감사합니다! 이것이 바로 문제의 해결책이었습니다. – Thanks

+0

는 (코드가 구현)은 RC 저역 통과 필터에 의해 생성 된 위상 시프트가 중요한 것이 추가되어야한다. 저역 통과 필터 (FFT를 사용하여 구현 된 것과 같은)의 다른 구현은 조금 더 좋고 그와 관련됩니다. 그들은 구현하기가 훨씬 어렵습니다. –

관련 문제