色另类_婷婷激情四月_亚洲精品无码不卡在线播放he_欧美第七页_精品国产综合区久久久久99_青娱乐极品盛宴在线

產品分類

當前位置: 首頁 > 傳感測量產品 > 工業傳感器 > 加速度傳感器

類型分類:
科普知識
數據分類:
加速度傳感器

android 速度傳感器:android 三軸加速度傳感器【轉】

發布日期:2022-10-09 點擊率:52


android 速度傳感器:android 三軸加速度傳感器【轉】  第1張

android 速度傳感器:android 三軸加速度傳感器【轉】

一、手機中常用的傳感器
在Android2.3 gingerbread系統中,google提供了11種傳感器供應用層使用,具體如下:(Sensor類)
#define SENSOR_TYPE_ACCELEROMETER 1 //加速度
#define SENSOR_TYPE_MAGNETIC_FIELD 2 //磁力
#define SENSOR_TYPE_ORIENTATION 3 //方向
#define SENSOR_TYPE_GYROSCOPE 4 //陀螺儀
#define SENSOR_TYPE_LIGHT 5 //光線感應
#define SENSOR_TYPE_PRESSURE 6 //壓力
#define SENSOR_TYPE_TEMPERATURE 7 //溫度
#define SENSOR_TYPE_PROXIMITY 8 //接近
#define SENSOR_TYPE_GRAVITY 9 //重力
#define SENSOR_TYPE_LINEAR_ACCELERATION 10//線性加速度
#define SENSOR_TYPE_ROTATION_VECTOR 11//旋轉矢量
1-1加速度傳感器
加速度傳感器又叫G-sensor,返回x、y、z三軸的加速度數值。
該數值包含地心引力的影響,單位是m/s^2。
將手機平放在桌面上,x軸默認為0,y軸默認0,z軸默認9.81。
將手機朝下放在桌面上,z軸為-9.81。
將手機向左傾斜,x軸為正值。
將手機向右傾斜,x軸為負值。
將手機向上傾斜,y軸為負值。
將手機向下傾斜,y軸為正值。
加速度傳感器可能是最為成熟的一種mems產品,市場上的加速度傳感器種類很多。
手機中常用的加速度傳感器有BOSCH(博世)的BMA系列,AMK的897X系列,ST的LIS3X系列等。
這些傳感器一般提供±2G至±16G的加速度測量范圍,采用I2C或SPI接口和MCU相連,數據精度小于16bit。
1-2 磁力傳感器
磁力傳感器簡稱為M-sensor,返回x、y、z三軸的環境磁場數據。
該數值的單位是微特斯拉(micro-Tesla),用uT表示。
單位也可以是高斯(Gauss),1Tesla=Gauss。
硬件上一般沒有獨立的磁力傳感器,磁力數據由電子羅盤傳感器提供(E-compass)。
電子羅盤傳感器同時提供下文的方向傳感器數據。
1-3 方向傳感器
方向傳感器簡稱為O-sensor,返回三軸的角度數據,方向數據的單位是角度。
為了得到精確的角度數據,E-compass需要獲取G-sensor的數據,
經過計算生產O-sensor數據,否則只能獲取水平方向的角度。
方向傳感器提供三個數據,分別為azimuth、pitch和roll。
azimuth:方位,返回水平時磁北極和Y軸的夾角,范圍為0°至360°。
0°=北,90°=東,180°=南,270°=西。
pitch:x軸和水平面的夾角,范圍為-180°至180°。
當z軸向y軸轉動時,角度為正值。
roll:y軸和水平面的夾角,由于歷史原因,范圍為-90°至90°。
當x軸向z軸移動時,角度為正值。
電子羅盤在獲取正確的數據前需要進行校準,通常可用8字校準法。
8字校準法要求用戶使用需要校準的設備在空中做8字晃動,
原則上盡量多的讓設備法線方向指向空間的所有8個象限。
手機中使用的電子羅盤芯片有AKM公司的897X系列,ST公司的LSM系列以及雅馬哈公司等等。
由于需要讀取G-sensor數據并計算出M-sensor和O-sensor數據,
因此廠商一般會提供一個后臺daemon來完成工作,電子羅盤算法一般是公司私有產權。
1-4 陀螺儀傳感器
陀螺儀傳感器叫做Gyro-sensor,返回x、y、z三軸的角加速度數據。
角加速度的單位是radians/second。
根據Nexus S手機實測:
水平逆時針旋轉,Z軸為正。
水平逆時針旋轉,z軸為負。
向左旋轉,y軸為負。
向右旋轉,y軸為正。
向上旋轉,x軸為負。
向下旋轉,x軸為正。
ST的L3G系列的陀螺儀傳感器比較流行,iphone4和google的nexus s中使用該種傳感器。
1-5 光線感應傳感器
光線感應傳感器檢測實時的光線強度,光強單位是lux,其物理意義是照射到單位面積上的光通量。
光線感應傳感器主要用于Android系統的LCD自動亮度功能。
可以根據采樣到的光強數值實時調整LCD的亮度。
1-6 壓力傳感器
壓力傳感器返回當前的壓強,單位是百帕斯卡hectopascal(hPa)。
1-7 溫度傳感器
溫度傳感器返回當前的溫度。
1-8 接近傳感器
接近傳感器檢測物體與手機的距離,單位是厘米。
一些接近傳感器只能返回遠和近兩個狀態,
因此,接近傳感器將最大距離返回遠狀態,小于最大距離返回近狀態。
接近傳感器可用于接聽電話時自動關閉LCD屏幕以節省電量。
一些芯片集成了接近傳感器和光線傳感器兩者功能。
下面三個傳感器是Android2新提出的傳感器類型,目前還不太清楚有哪些應用程序使用。
1-9 重力傳感器
重力傳感器簡稱GV-sensor,輸出重力數據。
在地球上,重力數值為9.8,單位是m/s^2。
坐標系統與加速度傳感器相同。
當設備復位時,重力傳感器的輸出與加速度傳感器相同。
1-10 線性加速度傳感器
線性加速度傳感器簡稱LA-sensor。
線性加速度傳感器是加速度傳感器減去重力影響獲取的數據。
單位是m/s^2,坐標系統與加速度傳感器相同。
加速度傳感器、重力傳感器和線性加速度傳感器的計算公式如下:
加速度=重力 + 線性加速度
1-11 旋轉矢量傳感器
旋轉矢量傳感器簡稱RV-sensor。
旋轉矢量代表設備的方向,是一個將坐標軸和角度混合計算得到的數據。
RV-sensor輸出三個數據:
x*sin(theta/2)
y*sin(theta/2)
z*sin(theta/2)
sin(theta/2)是RV的數量級。
RV的方向與軸旋轉的方向相同。
RV的三個數值,與cos(theta/2)組成一個四元組。
RV的數據沒有單位,使用的坐標系與加速度相同。
舉例:
sensors_event_t.data[0]=x*sin(theta/2)
sensors_event_t.data[1]=y*sin(theta/2)
sensors_event_t.data[2]=z*sin(theta/2)
sensors_event_t.data[3]=cos(theta/2)
GV、LA和RV的數值沒有物理傳感器可以直接給出,
需要G-sensor、O-sensor和Gyro-sensor經過算法計算后得出。
算法一般是傳感器公司的私有產權。

二、Android感應檢測管理---SensorManager

1、取得SensorManager
使用感應檢測Sensor首要先獲取感應設備的檢測信號,你可以調用Context.getSysteService(SENSER_SERVICE)方法來取得感應檢測的服務
2、實現取得感應檢測Sensor狀態的監聽功能
實現以下兩個SensorEventListener方法來監聽,并取得感應檢測Sensor狀態:
//在感應檢測到Sensor的精密度有變化時被調用到。
public void onAccuracyChanged(Senso sensor,int accuracy);
//在感應檢測到Sensor的值有變化時會被調用到。
public void onSensorChanged(SensorEvent event);

3、實現取得感應檢測Sensor目標各類的值

實現下列getSensorList()方法來取得感應檢測Sensor的值;
List

4、注冊SensorListener
sm.regesterListener(SensorEventListener listener, Sensor sensor, int rate);

第一個參數:監聽Sensor事件,第二個參數是Sensor目標種類的值,第三個參數是延遲時間的精度密度。延遲時間的精密度參數如下:

參數
延遲時間
SensorManager.SENSOR_DELAY_FASTEST
0ms
SensorManager.SENSOR_DELAY_GAME
20ms
SensorManager.SENSOR_DELAY_UI
60ms
SensorManager.SENSOR_DELAY_NORMAL
200ms

因為感應檢測Sensor的服務是否頻繁和快慢都與電池參量的消耗有關,同時也會影響處理的效率,所以兼顧到消耗電池和處理效率的平衡,設置感應檢測Sensor的延遲時間是一門重要的學問,需要根據應用系統的需求來做適當的設置。
感應檢測Sensor的硬件檢測組件受不同的廠商提供。你可以采用Sensor的getVendor(),Sensor()的getName()和Sensor的getVeesrion()方法來取得 廠商的名稱、產品和版本。

5、取消注冊
sm.unregisterListener(SensorEventListener listener)

6、感應檢測

加速度感應檢測——Accelerometer
Accelerometer Sensor測量的是所有施加在設備上的力所產生的加速度的負值(包括重力加速度)。加速度所使用的單位是m/sec^2,數值是加速度的負值。
SensorEvent.values[0]:加速度在X軸的負值
SensorEvent.values[1]:加速度在Y軸的負值
SensorEvent.values[2]:加速度在Z軸的負值
例如:
當手機Z軸朝上平放在桌面上,并且從左到右推動手機,此時X軸上的加速度是正數。
當手機Z軸朝上靜止放在桌面上,此時Z軸的加速度是+9.81m/sec^2。
當手機從空中自由落體,此時加速度是0
當手機向上以Am/sec^2的加速度向空中拋出,此時加速度是A+9.81m/sec^2
重力加速度感應檢測——Gravity
重力加速度,其單位是m/sec^2,其坐標系與Accelerometer使用的一致。當手機靜止時,gravity的值和Accelerometer的值是一致的。
線性加速度感應檢測——Linear-Acceleration
Accelerometer、Gravity和Linear-Acceleration三者的關系如下公式:
accelerometer=gravity + linear-acceleration
地磁場感應檢測——Magnetic-field
地磁場的單位是micro-Tesla(uT),檢測的是X、Y、Z軸上的絕對地磁場。
陀螺儀感應檢測——Gyroscope
陀螺儀的單位是弧度/秒,測量的是物體分別圍繞X,Y,Z軸旋轉的角速度。它的坐標系與加速度傳感器的坐標系相同。逆時針方向旋轉的角度正的。也就是說,如果設備逆時針旋轉,觀察者向X,Y,Z軸的正方向看去,就報告設備是正轉的。請注意,這是標準的正旋轉的數學定義。
光線感應檢測——Light
values[0]:表示環境光照的水平,單位是SI lux。
位置逼近感應檢測——Proximity
values[0]:逼近的距離,單位是厘米(cm)。有一些傳感器只能支持近和遠兩種狀態,這種情況下,傳感器必須報告它在遠狀態下的maximum_range值和在近狀態下的小值。
旋轉矢量感應檢測——Rotation Vector
旋轉向量是用來表示設備的方向,它是由角度和軸組成,就是設備圍繞x,y,z軸之一旋轉θ角度。旋轉向量的三個要素是,這樣旋轉向量的大小等于sin(θ/2),旋轉向量的方向等于旋轉軸的方向。
values[0]: x*sin(θ/2)
values[1]: y*sin(θ/2)
values[2]: z*sin(θ/2)
values[3]: cos(θ/2) (optional: only if value.length=4)
方向感應檢測——Orientation
其單位是角度
values[0]: Azimuth(方位),地磁北方向與y軸的角度,圍繞z軸旋轉(0到359)。0=North, 90=East, 180=South, 270=West
values[1]: Pitch(俯仰),圍繞X軸旋轉(-180 to 180), 當Z軸向Y軸運動時是正值
values[2]: Roll(滾),圍繞Y軸旋轉(-90 to 90),當X軸向Z軸運動時是正值

三、舉例之-Gsensor
1,圖示三軸方向
Android重力感應系統的坐標系以屏幕的左下方為原點(【注意】2d編程的時候,是以屏幕左上方為原點的),箭頭指向的方向為正。從-10到10,以浮點數為等級單位,想象一下以下情形:
  手機屏幕向上(z軸朝天)水平放置的時侯,(x,y,z)的值分別為(0,0,10);
  手機屏幕向下(z軸朝地)水平放置的時侯,(x,y,z)的值分別為(0,0,-10);
  手機屏幕向左側放(x軸朝天)的時候,(x,y,z)的值分別為(10,0,0);
  手機豎直(y軸朝天)向上的時候,(x,y,z)的值分別為(0,10,0);
  其他的如此類推,規律就是:朝天的就是正數,朝地的就是負數。利用x,y,z三個值求三角函數,就可以精確檢測手機的運動狀態了。

2,通過監測Gsensor判斷手機處于靜止/移動狀態
public class MainActivity extends Activity implements SensorEventListener {
private static final String TAG=MainActivity.class.getSimpleName();
private SensorManager mSensorManager;
private Sensor mSensor;
private TextView textviewX;
private TextView textviewY;
private TextView textviewZ;
private TextView textviewF;
private int mX, mY, mZ;
private long lasttimestamp=0;
Calendar mCalendar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textviewX = (TextView) findViewById(R.id.textView1);
textviewY = (TextView) findViewById(R.id.textView3);
textviewZ = (TextView) findViewById(R.id.textView4);
textviewF = (TextView) findViewById(R.id.textView2);
mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
mSensor =mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);// TYPE_GRAVITY
if (null== mSensorManager) {
Log.d(TAG, "deveice not support SensorManager");
}
// 參數三,檢測的精準度
mSensorManager.registerListener(this, mSensor,
SensorManager.SENSOR_DELAY_NORMAL);// SENSOR_DELAY_GAME
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
@Override
public void onSensorChanged(SensorEvent event) {
if (event.sensor==null) {
return;
}
if (event.sensor.getType()== Sensor.TYPE_ACCELEROMETER) {
int x=(int) event.values[0];
int y=(int) event.values[1];
int z=(int) event.values[2];
mCalendar = Calendar.getInstance();
long stamp=mCalendar.getTimeInMillis() / 1000l;//
textviewX.setText(String.valueOf(x));
textviewY.setText(String.valueOf(y));
textviewZ.setText(String.valueOf(z));
int second=mCalendar.get(Calendar.SECOND);// 53
int px=Math.abs(mX - x);
int py=Math.abs(mY - y);
int pz=Math.abs(mZ - z);
Log.d(TAG, "pX:" + px + "  pY:" + py + "  pZ:" + pz + "    stamp:"
+ stamp + "  second:" + second);
int maxvalue= getMaxValue(px, py, pz);
if (maxvalue > 2 && (stamp - lasttimestamp) > 30) {
lasttimestamp = stamp;
Log.d(TAG, " sensor isMoveorchanged....");
textviewF.setText("檢測手機在移動..");
}
mX = x;
mY = y;
mZ = z;
}
}

public int getMaxValue(int px, int py, int pz) {
int max=0;
if (px > py && px > pz) {
max = px;
} else if (py > px && py > pz) {
max = py;
} else if (pz > px && pz > py) {
max = pz;
}
return max;
}
}

原理就是通過每次得到的x,y,z三軸的值,和下一次的值作比較,它們每個差值中絕對值最大的如果超過某一個閥值(自己定義),并且這種狀態持續了x秒,我們就視為手機處于(顛簸)移動狀態,當然這種判斷肯定是不科學的,有時候也會產生誤判,比較理想的場景就是:攜帶手機坐在公交上或是開車。

其它可供參考資料:

android 速度傳感器:android 三軸加速度傳感器【轉】  第2張

android 速度傳感器:Android傳感器

package org.crazyit.sensor;
import android.app.Activity;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.widget.EditText;
public class AccelerometerTest extends Activity
implements SensorEventListener
{
// 定義系統的Sensor管理器
SensorManager sensorManager;
EditText etTxt1;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// 獲取程序界面上的文本框組件
etTxt1= (EditText) findViewById(R.id1);
// 獲取系統的傳感器管理服務
sensorManager= (SensorManager) getSystemService(
Context.SENSOR_SERVICE);  //①
}
@Override
protected void onResume()
{
super.onResume();
// 為系統的加速度傳感器注冊監聽器
sensorManager.registerListener(this,
sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
SensorManager.SENSOR_DELAY_GAME);  //②
}
@Override
protected void onStop()
{
// 取消注冊
sensorManager.unregisterListener(this);
super.onStop();
}
// 以下是實現SensorEventListener接口必須實現的方法
// 當傳感器的值發生改變時回調該方法
@Override
public void onSensorChanged(SensorEvent event)
{
float[] values= event.values;
StringBuilder sb =new StringBuilder();
sb.append("X方向上的加速度:");
sb.append(values[0]);
sb.append("
Y方向上的加速度:");
sb.append(values[1]);
sb.append("
Z方向上的加速度:");
sb.append(values[2]);
etTxt1.setText(sb.toString());
}
// 當傳感器精度改變時回調該方法。
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy)
{
}
}
android 速度傳感器:android 三軸加速度傳感器【轉】  第3張

android 速度傳感器:Android開發之傳感器(加速度傳感器、方向傳感器)

目前手機集成了多個不同用途的傳感器。最近項目中需要用到加速度傳感器和方向傳感器,故做一下筆記。
加速度傳感器,用于檢測手機運動狀態。
方向傳感器,用于檢測手機方向狀態。
傳感器調用方式:
1、初始化
2、注冊監聽
3、實現OnSensorChange方法,獲取 x,y,z三軸的坐標。
4、使用完畢,記得注銷
需要說明的是,不同手機的傳感器靈敏度不同,而且傳感器的調用是不間斷的,所以使結果更準確,最好是取一段時間內的傳感器變化,為適配大多數手機,需要設定一個閾值或者范圍。
例如調用加速度傳感器,檢測手機搖一搖:
關于方向傳感器坐標軸
z是指向地心的方位角,x軸是仰俯角(由靜止狀態開始前后反轉),y軸是翻轉角(由靜止狀態開始左右反轉)。
方向傳感器結合地磁傳感器可以實現指南針功能。單獨使用,可以檢測手機的方向,例如豎屏橫屏狀態。
其實檢測豎屏橫屏有多種方式,但有些方法會存在適配問題,有些機子不管用,傳感器基本都適用,靈敏度會有差異而已

android 速度傳感器:關于android 加速度傳感器的速度計算

給位大蝦,大家好。
我想用加速度傳感器來測得行走速度的時候碰到了一個問題。
首先我用 android developer 網站提供的信息消除重力的印象。
public void onSensorChanged(SensorEvent event)
{
 // alpha is calculated as t / (t + dT)
 // with t, the low-pass filter's time-constant
 // and dT, the event delivery rate
 final float alpha = 0.8;
 gravity[0] = alpha * gravity[0] + (1 - alpha) * event.values[0];
 gravity[1] = alpha * gravity[1] + (1 - alpha) * event.values[1];
 gravity[2] = alpha * gravity[2] + (1 - alpha) * event.values[2];
 linear_acceleration[0] = event.values[0] - gravity[0];
 linear_acceleration[1] = event.values[1] - gravity[1];
 linear_acceleration[2] = event.values[2] - gravity[2];
}
其中gravity的初始值是0.0;在測試中XYZ軸可以很好的消掉重力的影響。可是我以10/s的頻率讀取Z軸的
加速度a,并設速度V初始值為0,然后累計計算手持手機時移動的速度。V=V+a*t;t=0.1s.在從加速啟動
到減速停止的過程中,我發現加速度可以很好顯示出當前狀態,可計算的V卻出現了累積,并且不等于0。
當我進行另外一個實驗時,也就是把手機由平放狀態改為豎立狀態。在保持豎立狀態時V=4.0m/s左右的值。
(手機移動期間保持屏幕垂直與地面并面對持有者)
這種情況讓我不思其解。我曾嘗試加入Y軸角度來糾正手機的速度,即
speed = (speed+accelerometer*time)*Math.sin(Yorientate/180*Math.PI));但仍然得不到理想的值。既停止運動后,速度應該為0.0。
希望高人能指點下。

下一篇: PLC、DCS、FCS三大控

上一篇: 電氣控制線路圖控制原

推薦產品

更多
主站蜘蛛池模板: 26uuu.mobi| 亚洲精品午夜视频 | 国产欧美在线视频 | 欧美视频亚洲视频 | 国产一区二区精品丝袜 | jizz日本在线播放 | 一二区| 成年网站在线看 | 久久高清 | 国产精品久久久久久一级毛片 | 亚洲 欧洲 偷拍 校园 另类 | 1级毛片| 欧美视频一区二免费视频 | 一区二区国产精品 | 国产在线视频2019最新视频 | 四虎在线免费观看视频 | 毛片一区二区三区四区 | 国产高清在线精品 | 日本三级久久 | 日韩一区二区三区视频 | 亚洲精品无码成人A片九色播放 | 欧美成人伊人十综合色 | www.309809.com| 国产真人做爰视频免费 | 久久综合久色欧美综合狠狠 | 天天草b | 日本人丰满xxxxhd | 黄色免费视频观看 | 日韩黄色网页 | 中文字幕一区在线观看视频 | 国产福利视频一区美女 | 久久99国产精品视频 | 久草手机视频在线观看 | 亚洲不卡视频 | 欧美一级毛片欧美大尺度一级毛片 | 一级做a爰片久久毛片看看 欧美日韩精品国产一区二区 | 在线精品国内外视频 | 欧美日韩在线看 | 久久综合九色综合欧美狠狠 | 天天爽天天操 | a天堂资源在线观看 |