2013-05-20 3 views
3

안녕 내 응용 프로그램에서 자이로 스코프를 만들 필요가 있습니다.이 다음 코드를 사용하고 있습니다.Yaw, Roll & Pitch 값을 (x, y) 좌표로 변환하는 방법은 무엇입니까?

public class AccessGyroscope extends Activity implements SensorEventListener 
{ 
    private TextView tv; 
    private SensorManager sManager; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     tv = (TextView) findViewById(R.id.tv); 
     sManager = (SensorManager) getSystemService(SENSOR_SERVICE); 
    } 

    @Override 
    protected void onResume() 
    { 
     super.onResume(); 
     sManager.registerListener(this, sManager.getDefaultSensor(Sensor.TYPE_ORIENTATION),SensorManager.SENSOR_DELAY_FASTEST); 
    } 

    @Override 
    protected void onStop() 
    { 
     sManager.unregisterListener(this); 
     super.onStop(); 
    } 

    @Override 
    public void onAccuracyChanged(Sensor arg0, int arg1) 
    { 
    } 

    @Override 
    public void onSensorChanged(SensorEvent event) 
    { 
     if (event.accuracy == SensorManager.SENSOR_STATUS_UNRELIABLE) 
     { 
      return; 
     } 

     tv.setText("Orientation X (Roll) :"+ Float.toString(event.values[2]) +"\n"+ 
        "Orientation Y (Pitch) :"+ Float.toString(event.values[1]) +"\n"+ 
        "Orientation Z (Yaw) :"+ Float.toString(event.values[0])); 
    } 
} 

나는 요, 롤 & 피치 값을 얻을 수 있습니다하지만 난 2 차원 평면이 보여주고 싶은. 기본적으로이보기는 Gyroscope View입니다.

빨간색 점은 장치의 방향에 따라 이동해야합니다. 나는 캔버스에서 그 시각을 준비 할 수 있습니다.하지만 실제로 원하는 것은 Yaw, Roll과 관련된 좌표입니다. & 피치 값.

도와주세요

답변

3

마지막으로 답변을 찾았습니다.

먼저 TYPE_ORIENTATION을 사용하는 대신 TYPE_GRAVITY를 사용했습니다.

여기 내 코드가 있습니다. 내 사용자 정의보기에 대한

코드

public class GyroscopeView extends View 
{ 
    private final static String TAG = "GyroscopeView"; 

    private float bearing; 
    float pitch = 0; 
    float roll = 0; 

    private Paint paintOuter; 
    private Paint paintInner; 
    private Paint paintDot; 

    float pointX, pointY; 
    float dotX, dotY; 
    int radius; 

    public GyroscopeView(Context context, AttributeSet attrs, int defStyle) 
    { 
     super(context, attrs, defStyle); 
     // TODO Auto-generated constructor stub 
     initCompassView(); 
    } 

    public GyroscopeView(Context context, AttributeSet attrs) 
    { 
     super(context, attrs); 
     // TODO Auto-generated constructor stub 
     initCompassView(); 
    } 

    public GyroscopeView(Context context) 
    { 
     super(context); 
     // TODO Auto-generated constructor stub 
     initCompassView(); 
    } 

    protected void initCompassView() 
    { 
     setFocusable(true); 

     Resources r = this.getResources(); 

     paintOuter = new Paint(Paint.ANTI_ALIAS_FLAG); 
     paintOuter.setColor(Color.WHITE); 
     paintOuter.setStrokeWidth(1); 
     paintOuter.setStyle(Paint.Style.FILL_AND_STROKE); 

     paintInner = new Paint(Paint.ANTI_ALIAS_FLAG); 
     paintInner.setColor(Color.BLUE); 
     paintInner.setStrokeWidth(1); 
     paintInner.setStyle(Paint.Style.STROKE); 

     paintDot = new Paint(Paint.ANTI_ALIAS_FLAG); 
     paintDot.setColor(Color.RED); 
     paintDot.setStrokeWidth(1); 
     paintDot.setStyle(Paint.Style.FILL_AND_STROKE); 

    } 

    @Override 
    protected void onDraw(Canvas canvas) 
    { 
     // TODO Auto-generated method stub 
     super.onDraw(canvas); 

     int px = getMeasuredWidth()/2; 
     int py = getMeasuredHeight()/2; 
     radius = Math.min(px, py); 

     pointX = px; 
     pointY = py; 

     canvas.drawCircle(pointX, pointY, radius, paintOuter); 

     canvas.drawCircle(pointX, pointY, 40, paintInner); 
     canvas.drawCircle(dotX, dotY, 5, paintDot); 

    } 

    void update(float z, float yy, float xx) 
    { 

     if (yy > 0) 
     { 
      dotY = pointY - ((1 - yy) * z); 
     } else 
     { 
      dotY = pointY + ((1 - yy) * z); 
     } 
     if (xx > 0) 
     { 
      dotX = pointX - ((1 - xx) * z); 
     } else 
     { 
      dotX = pointX + ((1 - xx) * z); 
     } 
     invalidate(); 
    } 

가 여기 내 Activiy 코드입니다 ..입니다.

public class GyroscopeActivity extends Activity 
{ 
    GyroscopeView gyroscopeView; 
    SensorManager sensorManager; 

    float[] gValues = new float[3]; 


    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.gyroscope); 

     gyroscopeView = (GyroscopeView) findViewById(R.id.gyroscope_view); 
     initSensor(); 
    } 

    void initSensor() 
    { 
     sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); 
    } 

    @Override 
    protected void onResume() 
    { 
     super.onResume(); 
     Sensor sensorGyroscope = sensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY); 
     sensorManager.registerListener(sensorGyroListener, sensorGyroscope, SensorManager.SENSOR_DELAY_UI); 
    } 

    @Override 
    protected void onStop() 
    { 
     sensorManager.unregisterListener(sensorGyroListener); 
     super.onStop(); 
    } 

    private final SensorEventListener sensorGyroListener = new SensorEventListener() 
    { 
     public void onSensorChanged(SensorEvent event) 
     { 
      if (event.sensor.getType() == Sensor.TYPE_GRAVITY) 
       gValues = event.values; 

      gyroscopeView.update(gValues[0], gValues[1], gValues[2]); 
     } 

     public void onAccuracyChanged(Sensor sensor, int accuracy) 
     { 
     } 
    }; 

희망이 있으면 도움이 될 것입니다.

관련 문제