2013-12-19 5 views
0

지금은 대학 운동으로 완전히 방해받습니다. 나는 지난 며칠 동안 열심히 노력했으며 또한 많은 연구를했으나 불가능한 일을하려고하거나 추론에서 끔찍한 실수로 고통 받고 있습니다.가속도계 및 자기장 센서를 통한 Android 기기의 기울이기 및 흔들림 감지

내 목표는 무엇입니까? - OSC를 통해 피드백 메시지 (양수 또는 음수)를 전송할 수있는 Android 앱 (android : minSdkVersion = "8")을 구현하고 싶습니다. 피드백 보내기는 일부 버튼 (매우 간단합니다 ;-)을 클릭하는 것뿐만 아니라 장치를 흔들거나 기울이기를 통해 가능해야합니다.

떨리는 것은 스마트 폰을 오른쪽에서 왼쪽으로 또는 다른 방향으로 돌리는 것을 의미합니다. 머리를 흔드는 것과 같습니다. 기울이기 란 장치를 위아래로 회전시키는 것입니다. 머리를 끄덕이며 말합니다.

내 장치가 시장에서 가장 최신 제품이 아니기 때문에 가속도계 및 자기장 센서 만 사용할 수 있습니다 (자이로 스코프 또는 기타 물건이 없음).

내 인터넷 검색은 가속도계 및 자기장 이벤트를 듣고 회전 매트릭스를 사용하여 각도 사이의 델타를 계산했습니다. x 축에있는 특정 델타는 기울이기 (nodding)로 해석되고 y에 대한 특정 델타는 떨 어질 것입니다. 지금까지 좋은 결과를 얻지 못했기에 나는 이것이 올바른 접근인지 직접 묻습니다.

현재 내 SensorEventListener은 다음과 같습니다
/** 
* TYPE_ACCELEROMETER 
* <ul> 
* <li>SensorEvent.values[0] Acceleration force along the x axis (including 
* gravity) in m/s2</li> 
* <li>SensorEvent.values[1] Acceleration force along the y axis (including 
* gravity) in m/s2</li> 
* <li>SensorEvent.values[2] Acceleration force along the z axis (including 
* gravity) in m/s2</li> 
* </ul> 
* 
* TYPE_MAGNETIC_FIELD 
* <ul> 
* <li>SensorEvent.values[0] Geomagnetic field strength along the x axis in 
* µT</li> 
* <li>SensorEvent.values[1] Geomagnetic field strength along the y axis in 
* µT</li> 
* <li>SensorEvent.values[2] Geomagnetic field strength along the z axis in 
* µT</li> 
* </ul> 
*/ 
@Override 
public void onSensorChanged(SensorEvent event) { 
    now = event.timestamp; 

    // Handle the events for which we registered 
    switch (event.sensor.getType()) { 
    case Sensor.TYPE_ACCELEROMETER: 
     System.arraycopy(event.values, 0, valuesAccelerometer, 0, 3); 

     // no magnetic field data 
     if (isArrayZeroFilled(valuesMagneticField)) { 
      return; 
     } 

     // if rotation matrix cannot be retrieved 
     if (!SensorManager.getRotationMatrix(null, rotationMatrix, 
       valuesAccelerometer, valuesMagneticField)) 
      return; 

     SensorManager.getOrientation(rotationMatrix, valuesOrientation); 

     // valuesOrientation 
     // values[0]: azimuth, rotation around the Z axis. 
     // values[1]: pitch, rotation around the X axis. 
     // values[2]: roll, rotation around the Y axis. 

     zRotation = valuesOrientation[0]; 
     xRotation = valuesOrientation[1]; 
     yRotation = valuesOrientation[2]; 

     float xRotationDelta = Math.abs(xRotation - lastXRotation); 
     System.out.println("x rotation delta " + xRotationDelta); 

     float yRotationDelta = Math.abs(yRotation - lastYRotation); 
     System.out.println("y rotation delta " + yRotationDelta); 

     float zRotationDelta = Math.abs(zRotation - lastZRotation); 
     System.out.println("z rotation delta " + zRotationDelta); 

     break; 

    case Sensor.TYPE_MAGNETIC_FIELD: 
     System.arraycopy(event.values, 0, valuesMagneticField, 0, 3); 
     break; 
    } 
} 

는 이상하게 y 및 z 델타에 관계없이 I 이동하거나 내 휴대 전화를 흔들 방법, 항상 0.0

있습니다.

누군가 내 코드 또는 생각에서 잘못된 점에 대한 힌트를 줄 수 있기를 바랍니다.

미리 감사드립니다.

답변

-1

이 코드는 흔들림을 감지하는 데 도움이됩니다. 1