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