私は自分のデバイスからさまざまなセンサーの読み取り値を取得しています(Android用のプログラミング)。ロール(1〜100の数字のように見える)を角度に変換し、磁力計の向きを度に変換しようとしています..
どんな単純な方程式でも歓迎します..私の幾何学はつかの間の記憶です..
public void onSensorChanged(SensorEvent evt) {
int type=evt.sensor.getType();
if(type == Sensor.TYPE_ORIENTATION){
azimuth = evt.values[0]; // azimuth rotation around the z-axis
pitch = evt.values[1]; // pitch rotation around the x-axis
roll = evt.values[2]; // roll rotation around the y-axis
}
//Smoothing the sensor data a bit seems like a good idea.
if (type == Sensor.TYPE_MAGNETIC_FIELD) {
orientation[0]=(orientation[0]*1+evt.values[0])*0.5f;
orientation[1]=(orientation[1]*1+evt.values[1])*0.5f;
orientation[2]=(orientation[2]*1+evt.values[2])*0.5f;
} else if (type == Sensor.TYPE_ACCELEROMETER) {
acceleration[0]=(acceleration[0]*2+evt.values[0])*0.33334f;
acceleration[1]=(acceleration[1]*2+evt.values[1])*0.33334f;
acceleration[2]=(acceleration[2]*2+evt.values[2])*0.33334f;
}
if ((type==Sensor.TYPE_MAGNETIC_FIELD) || (type==Sensor.TYPE_ACCELEROMETER)) {
float newMat[]=new float[16];
//Toast toast = Toast.makeText(ctx.getApplicationContext(), "accel", Toast.LENGTH_SHORT);
//toast.show();
SensorManager.getRotationMatrix(newMat, null, acceleration, orientation);
if(displayOri==0||displayOri==2){
SensorManager.remapCoordinateSystem(newMat,SensorManager.AXIS_X*-1, SensorManager.AXIS_MINUS_Y*-1,newMat);
}else{
SensorManager.remapCoordinateSystem(newMat,SensorManager.AXIS_Y, SensorManager.AXIS_MINUS_X,newMat);
}
matrix=newMat;
}
}
ロールしたいだけかどうかわからないことを追加する必要があります..私のアプリはランドスケープモードでロックされますが、明らかに、ユーザーはアクセス時に電話を任意の角度に向けることができます..したがって、角度を取得するには、おそらく上記の3つすべてが必要です.探している。
問題の角度は、ユーザーが携帯電話をどのように持っていても、現実の世界を見ているかのようであり、地平線から外を見ている角度が必要です..
たとえば、彼らが地平線を見ている場合は 90 度が返されるようにします。彼らが空を見上げている場合は 180 度、真下に -180 度を取得する必要があります。また、彼らが見ている磁北からの度数も必要です..磁力計を使用して