데이터를 얻기 위해 초당 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도,보기가 그냥 아주 천천히 그것의 목표 위치로 이동합니다. 나는 그것이 가속도계의 물리학 때문인지 아니면 내 필터링 코드의 버그인지 여부를 모르겠습니다. 나는 가속도계가 조향에 사용되는 곳에서 빠른 속도로 진행되는 게임이 있다는 것을 알고 있기 때문에 하드웨어 문제라고는 거의 상상할 수 없습니다.
감사합니다! 이것이 바로 문제의 해결책이었습니다. – Thanks
는 (코드가 구현)은 RC 저역 통과 필터에 의해 생성 된 위상 시프트가 중요한 것이 추가되어야한다. 저역 통과 필터 (FFT를 사용하여 구현 된 것과 같은)의 다른 구현은 조금 더 좋고 그와 관련됩니다. 그들은 구현하기가 훨씬 어렵습니다. –