/*********************************************
Android傳感器:
2015-03-04 16:17:19
*******************************************/
STEP:
Step1:為MainAvtivy extern 添加Senser接口:
public class RemotetempActivity extends Activity implements SensorEventListener{ ……………
Step2:添加兩個全局類型如下,一個為管理器類型一個傳感器類型:
private SensorManager mSensorManager;
private Sensor mOrientation;
Step3:初始化管理器并打開傳感器(OnCreate中):
mSensorManager=(SensorManager)getSystemService(Context.SENSOR_SERVICE);
mOrientation=mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
Step4:OnResume()中注冊傳感器事件
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
//注冊傳感器事件
mSensorManager.registerListener(this,mOrientation,SensorManager.SENSOR_DELAY_NORMAL);
}
Step5:onSensorChanged()中捕獲傳感器變化。這個函數是在Step1的Implements時自動添加的
@Override
public void onSensorChanged(SensorEvent arg0) {
// TODO Auto-generated method stub
float azimuth_angle = arg0.values[0];
float pitch_angle = arg0.values[1];
String tt=Float.toString(azimuth_angle);
//Toast.makeText(RemotetempActivity.this,tt,Toast.LENGTH_SHORT).show();
// tt=""
tv.setText(tt);
}
Step6:在OnStop()中范注冊傳感器
@Override
protected void onStop() {
// TODO Auto-generated method stub
mSensorManager.unregisterListener(this);//反注冊傳感器
super.onStop();
}
資料:
1.android 的坐標系是如何定義x, y z 軸的。
x軸的方向是沿著屏幕的水平方向從左向右,如果手機不是正方形的話,較短的邊需要水平放置,較長的邊需要垂直放置。
Y軸的方向是從屏幕的左下角開始沿著屏幕的的垂直方向指向屏幕的頂端。
將手機放在桌子上,z軸的方向是從手機指向天空。
2.方向傳感器
在方向傳感器中values變量的3個值都表示度數,它們的含義如下:
values[0]:該值表示方位,也就是手機繞著Z軸旋轉的角度。0表示北(North);90表示東(East);180表示南(South);270表示西(West)。如果values[0]的值正好是這4個值,并且手機是水平放置,表示手機的正前方就是這4個方向。可以利用這個特性來實現電子羅盤,實例76將詳細介紹電子羅盤的實現過程。
values[1]:該值表示傾斜度,或手機翹起的程度。當手機繞著X軸傾斜時該值發生變化。values[1]的取值范圍是-180≤values[1]≤180。
假設將手機屏幕朝上水平放在桌子上,這時如果桌子是完全水平的,values[1]的值應該是0(由于很少有桌子是絕對水平的,因此,該值很可能不為0,但一般都是-5和5之間的某個值)。這時從手機頂部開始抬起,直到將手機沿X軸旋轉180度(屏幕向下水平放在桌面上)。在這個旋轉過程中,values[1]會在0到-180之間變化,也就是說,從手機頂部抬起時,values[1]的值會逐漸變小,直到等于-180。如果從手機底部開始抬起,直到將手機沿X軸旋轉180度,這時values[1]會在0到180之間變化。也就是values[1]的值會逐漸增大,直到等于180。可以利用values[1]和下面要介紹的values[2]來測量桌子等物體的傾斜度。
values[2]:表示手機沿著Y軸的滾動角度。取值范圍是-90≤values[2]≤90。假設將手機屏幕朝上水平放在桌面上,這時如果桌面是平的,values[2]的值應為0。將手機左側逐漸抬起時,values[2]的值逐漸變小,直到手機垂直于桌面放置,這時values[2]的值是-90。將手機右側逐漸抬起時,values[2]的值逐漸增大,直到手機垂直于桌面放置,這時values[2]的值是90。在垂直位置時繼續向右或向左滾動,values[2]的值會繼續在-90至90之間變化。
3.加速傳感器
該傳感器的values變量的3個元素值分別表示X、Y、Z軸的加速值。例如,水平放在桌面上的手機從左側向右側移動,values[0]為負值;從右向左移動,values[0]為正值。
4.重力感應器
加速度傳感器的類型常量是Sensor.TYPE_GRAVITY。重力傳感器與加速度傳感器使用同一套坐標系。values數組中三個元素分別表示了X、Y、Z軸的重力大小。
5.陀螺儀傳感器
陀螺儀傳感器的類型常量是Sensor.TYPE_GYROSCOPE。values數組的三個元素表示的含義如下:
values[0]:延X軸旋轉的角速度。
values[1]:延Y軸旋轉的角速度。
values[2]:延Z軸旋轉的角速度。
當手機逆時針旋轉時,角速度為正值,順時針旋轉時,角速度為負值。陀螺儀傳感器經常被用來計算手機已轉動的角度。
近程傳感器(Sensor.TYPE_PROXIMITY)
線性加速度傳感器(Sensor.TYPE_LINEAR_ACCELERATION)
旋轉向量傳感器(Sensor.TYPE_ROTATION_VECTOR)
磁場傳感器(Sensor.TYPE_MAGNETIC_FIELD)
壓力傳感器(Sensor.TYPE_PRESSURE)
溫度傳感器(Sensor.TYPE_TEMPERATURE)
======================================
陀螺儀的強項在于測量設備自身的旋轉運動。對設備自身運動更擅長。但不能確定設備的方位。
加速計的強項在于測量設備的受力情況。對設備相對外部參考物(比如,地面)的運動更擅長。但用來測量設備相對于地面的擺放姿勢,則精確度不高。
磁力計的強項在于定位設備的方位。可以測量出當前設備與東南西北四個方向上的夾角。
舉幾個例子:
陀螺儀對設備旋轉角度的檢測是瞬時的而且是非常精確的,能滿足一些需要高分辨率和快速反應的應用比如FPS游戲的瞄準。而且陀螺儀配合加速計可以在沒有衛星 和網絡的情況下進行導航,這是陀螺儀的經典應用。加速度計可用于有固定的重力參考坐標系、存在線性或傾斜運動但旋轉運動被限制在一定范圍內的應用。同時處 理直線運動和旋轉運動時,就需要把加速度和陀螺儀計結合起來使用。如果還想設備在運動時不至于迷失方向,就再加上磁力計。
對于一個發射出去的導彈來說,要想精確追蹤并調整導彈的軌道的話,下面幾組數據必不可少:
GPS定位它的位置
加速計測量當前加速度
磁力計確定導彈頭的方向(只能知道東南西北四個方向上的夾角),陀螺儀知道導彈的角速度。這兩個儀器結合才能確定導彈的準確的立體運動方向。
加速計得到的結果就是XYZ三個值,分別代表三個方向的加速度。關于XYZ三值的介紹,可以看這里:
android 重力感應和屏幕旋轉關系
http://blog.csdn.net/lzx_bupt/archive/2010/04/20/5507165.aspx
采用重力加速度感應控制屏幕旋轉最為理想。
不方便作圖,簡單說:重力加速度感應可以想象成一個小球在坐標系中,三個方向上的加速度。永遠以手機屏幕為準,不以外界為準作圖,手機水平放置,向上是y軸正向,向右是x軸正向,向外是z軸正向。這和高數坐標系一樣。
注意:你移動手機反映在坐標系上你移動的是坐標系遠點(旋轉)
1. Accelrator的x,y,z軸的正負向變化:
手機屏幕向上水平放置時: (x,y,z) = (0, 0, -9.81)
當手機頂部抬起時: y減小,且為負值
當手機底部抬起時: y增加,且為正值
當手機右側抬起時: x減小,且為負值
當手機左側抬起時: x增加,且為正值
2. Accelrator的z軸的變化:
手機屏幕向上水平放置時,z= -9.81
手機屏幕豎直放置時, z= 0
手機屏幕向下水平放置時,z= 9.81
3. 系統默認屏幕橫豎切換
當y變為-5時, 手機畫面切換為豎向
當x變為-5時, 手機畫面切換為橫向
4.根據需要你可以設定你想要的旋轉閾值
=====================================
用加速計和磁力計可以計算出orientation(方位計),orientation涉及到了三個概念:
Roll:左右傾斜角度,也叫滾轉角 http://baike.baidu.com/view/1769672.htm
Pitch:前后傾斜,也叫俯仰角 http://baike.baidu.com/view/3832041.htm
Yaw:左右搖擺,也叫偏航角 http://baike.baidu.com/view/1769448.htm