'가속도'에 해당되는 글 1건

  1. 2010.09.19 아이폰 어플 , 가속도 센서에 대한 정리
아이폰어플개발정보2010. 9. 19. 01:30
아이폰 어플 , 가속도 센서에 대한 정리

가속 센서를 이용한 시장 리뷰  http://mobizen.pe.kr/836

............................................................................................................................................................................................

아이폰 기기를 포트레이트모드(일반켰을때 모드인듯.)로 정면을 바라보고 있으면 가속도 센서는 -y방향으로 1, 아이폰을 책상 위에 올려두면 -z방향으로 1의 값을 가짐

가속도 센서가 값을 넘겨주는 주기는 우리가 결정가능

최대 1초에 10번~100번가능,

애플리케이션에 가해지는 부하때문에 유틸리티 같은 애플리케이션에서는 20번을 넘지 않도록 함

만약 게임같이 많이 사용하는 경우라도 60번을 넘지않도록 해야함.

>> 가속도 센서의 값을 이용하는 클래스들

1. UIDevice

UIDevice클래스를 이용하면 아이폰 기기에 대해 싱글톤 접근을 할수 있음

(싱클톤 : 해당 어플리케이션 내에서 유일한 하나의 객체임을 보증하기 위한 방법

    - 목적 : 객체를 하나면 만들기 위해

               프로젝트파일에서 모두 공유하기 위해

    - 장점 : 전역변수를 사용하는 것보다 위험성이 적음, 객체가 두번 이상 생성되는

               실수도 자동 방어)

기기 방향의 변경을 알려주는 노티피케이션 제공

( 노티피케이션 : 오브젝트가 멀리 떨어져 있어 서로 알지 못하는 경우 유용하게 사용

   노티피케이션 센터 : 애플리케이션 내에 유일한 오브젝트(싱글톤 객체)

                            오브젝트 내의 어느 곳에서 접근하더라도 동일한 노티피케이션 센터에

                            접근하게 됨.

                            노트피케이션 센터에 자신이 관심을 가지는 메시지가 올라오는지 지켜

                            보는 오브젝트가 있으며 노티피케이션 센터에 메시지를 올리는 오브젝트

                            존재, 특정 메시지가 올라오면 그 메시지에 관심이 있는

                           오브젝트로 메시지가 전달되며 각자 할일 수행)

아래 코딩은 호출을 통해 디바이스의 방향 전환에 대한 노티피케이션을 받겠다고 선언

[[UIDevice currentDevice] beginGeneratingDeviceOrientatonNotifications];

노티피케이션 센터 리턴하는 코딩

[NSNotificationCenter defaultCenter];

노티피케이션 센터에 통지 올리기

AAA라는 이름의 통지 올리기

아래 코딩을 사용하면 노티피케이션 센터에 통지가 올라갈 뿐만 아니라

통지를 받겠다고 등록한 모든 오브젝트에 메시지가 전달

[[NSNotificationCenter defaultCenter[postNotificationName:

@"AAA" object:self userInfo:nil];

object는 노티피케이션에 함께 동봉되는 오브젝트, 오브젝트 안에 self를 넘기는 이유는 노티피케이션을 받는 쪽에서 필요하면 사용할 수 있도록 함.

userInfo는 우리가 임의의 항목을 만들어서 구독받는 오브젝트에 알릴 수 있도록 함.

또한 임의의 데이터를 패키징하는 딕셔너리,

예) 현재 시각값을 가지는 NSDate 오브젝트를 @"nowDate"라는 키와 쌍을 이뤄

딕셔너리에 넣어준 뒤 보내면 노티피케이션을 구독하는 쪽에서 필요에 따라 그 값을 읽어서 사용

할수 있음.

노티피케이션 센터에 자기 자신을 관찰자로 등록하는 내용

AAA라는 이름의 통지가 올라오면 내가 -addBBB:라는 메소드를 실행시키겠다는 의미

[[NSNotificationCenter dafaultCenter] addObserver:self

selector:@selector(addBBB:) name:@"AAA" object:nil];

UIDevice에서 사용하는 노티피케이션 발행

UIDeviceOrientationDidChangNotification - 디바이스의 현재 방향

(기기의 방향이 바뀌었다는 통지가 날라오면 UIDevice클래스로부터 orientation

프라퍼티를 읽어서 방향 변화에 대한 처리를 함)

UIDeviceBatteryLevelDidChangeNotification - 배터리의 레벨이 변함

디바이스 방향이 더 이상 필요 없을 경우엔

[[UIDevice currentDevice] endGeneratingDeviceOrientationNotifications];

호출을 통해 가속도 센서의 이용을 끝내야함.

(가속도 센서를 전원을 많이 소모하는 장치임)

2. UIApplication

애플리케이션에 대한 싱글톤 접근 가능

스테이터스 바(status bar)의 방향을 설정 할 수 있는

statusBarOrientation 프라퍼티 제공

3. UIViewController

이 클래스는 interfaceOrientation프라퍼티를 가지고 있으며

-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation

메소드를 오버라이드해서 뷰 컨트롤러가 관리하는 뷰가 디바이스의 변화에 대응할지를 YEs나

NO값으로 리턴함

4. UIResponder

터치이벤트가 시작되는 클래스

motion이벤트 : 아이폰의 움직임에 대해 이벤트를 발생시키는 모션.

                    아이폰 3.0에서는 쉐이크밖에 제공하고 있지 않음.

5. UIAcceleometer

가속도 센서에 대한 싱글톤 접근 제공

 UIAccelerometer* theAccel = [UIAccelerometer sharedAccelerometer];

theAccel.updateInterval = 1/30;

theAccel.delegate = self;

+sharedAccelerometer 메소드로 가속도 센서에 접근

1초에 30번 가속도 센서의 값을 전달받겠다고 설정

theAccel의 델리게이트를 self로 지정하면 델리게이트 프로토콜 메소드를 구현해야 함.

 -(void)accelerometer:(UIAccelerometer*)accelerometer didAccelerate:(UIAcceleration*)acceleration

{

   // 이벤트 데이터 얻어온다.

   UIAccelerationValue x,y,z;

   x = acceleration.x;

   y = acceleration.y;

   z = acceleration.z;

   // 데이터 처리 코드가 이어져야 한다.

}

UIAccelerameter 오브젝트는 싱글톤이므로 유일한 객체,

따라서 델리게이트메소드 역시 하나만 지정

따라서 하나의 애플리케이션에는 하나의 델리게이트 메소드 역시 하나.

UIAcclerationValue의 값은 double이며, 1이 1g(중력값)을 나타냄

- 하이패스 필터(high pass filter)

 아이폰이 항상 받고 있는 중력값을 필터링해서 없애버리고 움직임만을 얻어내는 기법.

아이폰이 중력에 대해 어떤 상태로 있든 상관없이 저지해있기만 하면

x,y,z값은 0으로 설정하고 움직이는 방향에 대한 값만을 제공하는 것.

  UIAccelerationValue acceleration[3];

 UIAcclerationValue history[kHistorySize][3];

 // 하이패스 필터 기능을 켰는지 점검

 if(filteringIsEnable){

     accleraion[0] = x*kFilteringFactor + acceleration[0]*(1.0-                            kFilteringFactor);

     history[nextIndex][0] = x-accleration[0];

    accleraion[1] = x*kFilteringFactor + acceleration[1]*(1.0-                            kFilteringFactor);

     history[nextIndex][1] = x-accleration[1];

    accleraion[2] = x*kFilteringFactor + acceleration[2]*(1.0-                          kFilteringFactor);

     history[nextIndex][2] = x-accleration[2];

  } else {

     history[nextIndex][0] = x;

     history[nextIndex][1]  = y;

     history[nextIndex][2] = z;

  }

 kFileteringFactor는 다음과 같이 정의되어 있음

#define kFilteringFactor 0.1

그래프는 histroy배열에 값에 의해 그려지며 history는 최근 3개의 x,y,z값을 가진다.

acceleration배열은 현재 가속도 센서의  x값을 0.1비중으로

이전 x값을 0.9비중으로 각축 방향의 값을 구한다.

그리고 그 값을 다시 현재 가속도 센서의 x값에서 뺀 값을 이용해 움직임에 대한 수치만 history에 넣어서 그래프를 그리는데 사용

-로우패스 필터

미세한 움직임을 필터링하고 중력값을 주로 이용하기 위해 가속도 센서의 값을 가공

즉, 가속센서의 그래프에서 많이 튀는것은 하이패스필터로 잡고

작게 튀는것은 로우패스 필터로 잡는다.

  UIAccelerationValue accel[3];

 accel[0] = acceleration.x * kFilteringFactor + accel[0] * (1.0 -                      kFilteringFactor);

accel[1] = acceleration.x * kFilteringFactor + accel[1] * (1.0 -                      kFilteringFactor);

accel[2] = acceleration.x * kFilteringFactor + accel[2] * (1.0 -                      kFilteringFactor);

kFileteringFactor는 다음과 같이 정의되어 있음

#define kFilteringFactor 0.1

현재 가속도 센서의  x값을 0.1비중으로

이전 x값을 0.9비중으로 각축 방향의 값을 구한다.



출처 : http://blog.naver.com/PostList.nhn?blogId=heajin722¤tPage=30
Posted by 오늘마감

댓글을 달아 주세요