国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
陀螺儀、加速計(jì)、磁力計(jì)等傳感器匯總
陀螺儀、加速計(jì)、磁力計(jì)等傳感器匯總
陀螺儀就是內(nèi)部有一個陀螺,它的軸由于陀螺效應(yīng)始終與初始方向平行,這樣就可以通過與初始方向的偏差計(jì)算出實(shí)際方向。手機(jī)里陀螺儀實(shí)際上是一個結(jié)構(gòu)非常精密的芯片,內(nèi)部包含超微小的陀螺。
加速計(jì)是用來檢測手機(jī)受到的加速度的大小和方向的,而手機(jī)靜置的時候是只受到重力加速度(這個高中學(xué)過)的.所以很多人把加速計(jì)功能又叫做重力感應(yīng)功能。
磁力計(jì)是測試磁場強(qiáng)度和方向的。
陀螺儀測量是參考標(biāo)準(zhǔn)是內(nèi)部中間在與地面垂直的方向上進(jìn)行轉(zhuǎn)動的陀螺。通過設(shè)備與陀螺的夾角得到結(jié)果。
加速計(jì)是以內(nèi)部測量組件在各個方向上的受力情況來得到結(jié)果。
磁力計(jì)的原理就是中學(xué)物理中涉及到的那個最簡單的指南針了(那記得那根被磁化的鋼針么)。
它們分別有自己的強(qiáng)項(xiàng):
陀螺儀的強(qiáng)項(xiàng)在于測量設(shè)備自身的旋轉(zhuǎn)運(yùn)動。對設(shè)備自身運(yùn)動更擅長。但不能確定設(shè)備的方位。
加速計(jì)的強(qiáng)項(xiàng)在于測量設(shè)備的受力情況。對設(shè)備相對外部參考物(比如,地面)的運(yùn)動更擅長。但用來測量設(shè)備相對于地面的擺放姿勢,則精確度不高。
磁力計(jì)的強(qiáng)項(xiàng)在于定位設(shè)備的方位。可以測量出當(dāng)前設(shè)備與東南西北四個方向上的夾角。
舉幾個例子:
陀螺儀對設(shè)備旋轉(zhuǎn)角度的檢測是瞬時的而且是非常精確的,能滿足一些需要高分辨率和快速反應(yīng)的應(yīng)用比如FPS游戲的瞄準(zhǔn)。而且陀螺儀配合加速計(jì)可以在沒有衛(wèi)星和網(wǎng)絡(luò)的情況下進(jìn)行導(dǎo)航,這是陀螺儀的經(jīng)典應(yīng)用。加速度計(jì)可用于有固定的重力參考坐標(biāo)系、存在線性或傾斜運(yùn)動但旋轉(zhuǎn)運(yùn)動被限制在一定范圍內(nèi)的應(yīng)用。同時處理直線運(yùn)動和旋轉(zhuǎn)運(yùn)動時,就需要把加速度和陀螺儀計(jì)結(jié)合起來使用。如果還想設(shè)備在運(yùn)動時不至于迷失方向,就再加上磁力計(jì)。
對于一個發(fā)射出去的導(dǎo)彈來說,要想精確追蹤并調(diào)整導(dǎo)彈的軌道的話,下面幾組數(shù)據(jù)必不可少:
GPS定位它的位置
加速計(jì)測量當(dāng)前加速度
磁力計(jì)確定導(dǎo)彈頭的方向(只能知道東南西北四個方向上的夾角),陀螺儀知道導(dǎo)彈的角速度。這兩個儀器結(jié)合才能確定導(dǎo)彈的準(zhǔn)確的立體運(yùn)動方向。
加速計(jì)得到的結(jié)果就是XYZ三個值,分別代表三個方向的加速度。關(guān)于XYZ三值的介紹,可以看這里:
android 重力感應(yīng)和屏幕旋轉(zhuǎn)關(guān)系
http://blog.csdn.net/lzx_bupt/archive/2010/04/20/5507165.aspx
用加速計(jì)和磁力計(jì)可以計(jì)算出orientation(方位計(jì)),orientation涉及到了三個概念:
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
下面代碼是Android2.3中/development/samples/Compass的源碼,演示了如何使用加速計(jì)和磁力計(jì)來確定手機(jī)的擺放姿勢和方位。因?yàn)槭謾C(jī)運(yùn)動的加速度不高,精確度也沒有太大的要求,用加速計(jì)替代陀螺儀也可以。但如果做一些精度比較高的游戲的話,最好還是有陀螺儀。
view plain
//打開加速計(jì)和磁力計(jì)兩個傳感器。Sensor gsensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);Sensor msensor = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);mSensorManager.registerListener(this, gsensor, SensorManager.SENSOR_DELAY_GAME);mSensorManager.registerListener(this, msensor, SensorManager.SENSOR_DELAY_GAME);//加速計(jì)數(shù)據(jù)。private float[] mGData = new float[3];//磁力計(jì)數(shù)據(jù)。private float[] mMData = new float[3];//旋轉(zhuǎn)矩陣(rotation matrix),用于計(jì)算手機(jī)自身相對于地面坐標(biāo)系的旋轉(zhuǎn)角度。比如手機(jī)現(xiàn)在是橫著還是豎著的。反映的是手機(jī)的立體擺放位置。這個數(shù)據(jù)最好用陀螺儀來測量,沒有陀螺儀的話,借助于加速計(jì)和重力加速度也可以,只是精度不夠強(qiáng)罷了。private float[] mR = new float[16];//傾斜矩陣(inclination matrix),用于計(jì)算手機(jī)方位。比如手機(jī)的頭部現(xiàn)在朝南還是朝北。是針對一個平面上的東南西北四個方向而言的。private float[] mI = new float[16];//存放最終的旋轉(zhuǎn)角度數(shù)據(jù)private float[] mOrientation = new float[3];public void onSensorChanged(SensorEvent event) {        int type = event.sensor.getType();        float[] data;        if (type == Sensor.TYPE_ACCELEROMETER) {            data = mGData;        } else if (type == Sensor.TYPE_MAGNETIC_FIELD) {            data = mMData;        } else {            // we should not be here.            return;        }        for (int i = 0; i < 3; i++)            data[i] = event.values[i];//這一步的目的是獲取mR和mI兩個矩陣。        SensorManager.getRotationMatrix(mR, mI, mGData, mMData);//用矩陣mR獲取手機(jī)的旋轉(zhuǎn)角度。        SensorManager.getOrientation(mR, mOrientation);//用矩陣mI獲取手機(jī)在東南西北四個方向上的夾角。        float incl = SensorManager.getInclination(mI);        final float rad2deg = (float)(180.0f / Math.PI);        Log.d("Compass", "yaw: " + (int)(mOrientation[0] * rad2deg) + "  pitch: " + (int)(mOrientation[1] * rad2deg) + "  roll: " + (int)(mOrientation[2] * rad2deg) + "  incl: " + (int)(incl * rad2deg));}
補(bǔ)充于2011.7.14
gsensor的較正比較容易完成,一般是讓機(jī)器以某個固定角度(比如水平)放置,然后連續(xù)取N個值(比如20個)進(jìn)行一系列計(jì)算。Android和iphone中,屏幕會隨著設(shè)備的旋轉(zhuǎn)方向變化而改變,其實(shí)應(yīng)用的只是gsensor。
msensor的較正分為水平較正和傾斜補(bǔ)償。水平較正有平面較正、8字較正、十面較正等幾種方法。經(jīng)過水平較正后,msensor在水平放置時已經(jīng)可以使用了,但設(shè)備與水平面有一定的傾斜角時,這個傾斜角會對msensor的精度造成影響。因此,還需要進(jìn)行傾斜角補(bǔ)償較正。先通過較正好的gsensor得出傾斜角,然后使用傾斜角(pitch,roll)進(jìn)行補(bǔ)償較正計(jì)算。
orientation sensor可以由一個單獨(dú)芯片來實(shí)現(xiàn),也可以由gsensor和msensor共同計(jì)算出來的(我看android2.3的Sample中的Compass就已經(jīng)這樣干了)。orientation sensor輸出三個值:roll,pitch,yaw。其中,roll和pitch分別代表手機(jī)的X軸和Y軸與水平面的夾角,所以這兩個值可以由gsensor計(jì)算出來。yaw代表手機(jī)y軸水平面上的投影與正北方向的夾角,由msensor計(jì)算出來。
陀螺儀可以捕捉很微小的運(yùn)動軌跡變化,因此可以做高分辨率和快速反應(yīng)的旋轉(zhuǎn)檢測。但不能像msensor或orientation sensor那樣測量當(dāng)前的運(yùn)行方向。飛機(jī)當(dāng)中就用它記錄運(yùn)動角度改變,從而形成運(yùn)動軌跡。缺點(diǎn)就是隨著時間增長會有誤差積累,
補(bǔ)充于2011.7.19
陀螺儀的XYZ分別代表設(shè)備圍繞XYZ三個軸旋轉(zhuǎn)的角速度:radians/second。至于XYZ使用的坐標(biāo)系與gsensor相同。逆時針方向旋轉(zhuǎn)時,XYZ的值是正的。下面是使用陀螺儀進(jìn)行開發(fā)時的演示代碼:
view plain
private static final float NS2S = 1.0f / 1000000000.0f;
private float timestamp;
public void onSensorChanged(SensorEvent event)
{
if (timestamp != 0) {
final float dT = (event.timestamp - timestamp) * NS2S;
angle[0] += event.data[0] * dT;
angle[1] += event.data[1] * dT;
angle[2] += event.data[2] * dT;
}
timestamp = event.timestamp;
}
另外,陀螺儀運(yùn)轉(zhuǎn)一段時間以后,noise和offset會導(dǎo)致數(shù)據(jù)偏差,需要借助其它傳感器進(jìn)行較正。
補(bǔ)充于2011.7.20
利用加速計(jì)(gsensor),磁力計(jì)(msensor)模擬出方位傳感器(orientation)來
Android最近的新版本已經(jīng)不建議我們在開發(fā)的時候像下面這樣直接用方位傳感器了:
Sensor ori = mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);
mSensorManager.registerListener(this, ori, SensorManager.SENSOR_DELAY_GAME);
而是建議使用SensorManager.getOrientation(mR, mOrientation)這個API自己在應(yīng)用程序的onSensorChanged中計(jì)算出方位傳感器。但我們在做HAL層時,卻不得不考慮一些APK還是像上面代碼那樣直接使用方位傳感器的情況,所以,我們必須在sensor.c中模擬出一個方位傳感器來:
激活方位傳感器時,同時激活加速計(jì)和磁力計(jì),關(guān)閉方位傳感器時也要同時關(guān)閉加速計(jì)和磁力計(jì),同時還要考慮如果用戶注冊了加速計(jì)或磁力計(jì),并且正在使用的情況。
view plain
//默認(rèn)狀態(tài),0代表關(guān)閉。
static int accStatus = 0;
static int magStatus = 0;
static int switchSensor(int fd, int handle, int enabled) {
int status = 0;
switch (handle) {
case ID_ACCELERATION:
if (enabled) {
if (!accStatus) {//=0說明當(dāng)前狀態(tài)是關(guān)閉時,執(zhí)行打開操作。否則,說明已經(jīng)打開過。
status = ioctl(fd, ACC_FLAG, 1);
LOGW("open gsensor");
}
accStatus++;
} else {
if (accStatus > 0) {//>0說明當(dāng)前狀態(tài)是打開,這個時候才會嘗試關(guān)閉gsensor。
accStatus--;
if (!accStatus) {//減1后如果==0,說明orientation沒有使用gsensor,可以關(guān)閉gsensor了
status = ioctl(fd, ACC_FLAG, 0);
LOGW("close gsensor");
}
}
}
break;
case ID_MAGNETIC:
if (enabled) {
if (!magStatus) {
status = ioctl(fd, MAG_FLAG, 1);
LOGW("open msensor");
}
magStatus++;
} else {
if (magStatus > 0) {
magStatus--;
if (!magStatus) {
status = ioctl(fd, MAG_MFLAG, 0);
LOGW("close msensor");
}
}
}
break;
case ID_ORIENTATION:
if (enabled) {
if (!accStatus) {//=0說明gsensor沒有打開過,直接打開。
status = ioctl(fd, ACC_AFLAG, 1);
LOGW("open msensor");
}
if (!magStatus) {
status = ioctl(fd, MAG_FLAG, 1);
LOGW("open msensor");
}
accStatus++;
magStatus++;
} else {
if (accStatus > 0) {//>0說明被打開過,嘗試關(guān)閉gsensor。
accStatus--;
if (!accStatus) {//減1后=0說明用戶沒有直接使用gsensor,只是使用了orientation,可以關(guān)閉gsensor了。
status = ioctl(fd, ACC_AFLAG, 0);
LOGW("close gsensor");
}
}
if (magStatus > 0) {
magStatus--;
if (!magStatus) {
status = ioctl(fd, MAG_FLAG, 0);
LOGW("close msensor");
}
}
}
break;
default:
LOGW("unsupported sensor type");
}
return status;
}
參考文章:
加速度計(jì)和陀螺儀的區(qū)別
http://www.cnblogs.com/liuq0s/archive/2010/09/02/1816394.html
三軸陀螺儀與加速度計(jì)如何輔助Iphone定位的
http://www.weizhiquan.com/archives/1072
ST集成傳感器方案實(shí)現(xiàn)電子羅盤功能
http://www.eeworld.com.cn/gykz/2011/0408/article_5352.html
Android設(shè)備中實(shí)現(xiàn)陀螺儀(Orientation Sensor)
http://blog.csdn.net/beeboobeeboo/article/details/6536941
簡單易懂的文字 帶你認(rèn)識iPhone 4陀螺儀
http://mobile.zol.com.cn/187/1876651.html
Android操作系統(tǒng)11種傳感器介紹
http://hi.baidu.com/aokikyon/blog/item/f9a539d74a4f5fc4a044df40.html
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Motion Sensors | Android Developers
Android重力感應(yīng)器Sensor編程
陀螺儀、加速計(jì)和磁力計(jì)
一文帶你搞懂 sensor 傳感器
Android指南針的實(shí)現(xiàn)
手機(jī)如何知道方向?8分鐘了解加速度計(jì)、陀螺儀和磁力計(jì)的原理
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服