產品分類

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

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

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

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

      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中使用加速度傳感器

      主要功能
      記錄行走的步數,行走的時間
      根據錄入的體重,步長可以計算出每天行走的歷程,消耗的熱量
      對每天行走的歷程進行記錄,并給出星級評價
      軟件原理
      判斷人是否處于行走中,主要從以下幾個方面判斷:
      人如果走起來了,一般會連續多走幾步。因此,如果沒有連續4-5個波動,那么就極大可能是干擾。
      人走動的波動,比坐車產生的波動要大,因此可以看波峰波谷的高度,只檢測高于某個高度的波峰波谷。
      人的反射神經決定了人快速動的極限,怎么都不可能兩步之間小于0.2秒,因此間隔小于0.2秒的波峰波谷直接跳過通過重力加速計感應,重力變化的方向,大小。與正常走路或跑步時的重力變化比對,達到一定相似度時認為是在走路或跑步。實現起來很簡單,只要手機有重力感應器就能實現。
      軟件記步數的精準度跟用戶的補償以及體重有關,也跟用戶設置的傳感器的靈敏度有關系,在設置頁面可以對相應的參數進行調節。一旦調節結束,可以重新開始。手機QQ早就加入了計算步幅功能,還能和好友PK“炫步”。本項目可以作為一個獨立的模塊放到合適的項目里面。android加速度傳感器:android 三軸加速度傳感器【轉】  第2張

      android加速度傳感器:Android中的傳感器之---加速度傳感器

      加速度傳感器
      加速度傳感器又叫G-sensor,返回x、y、z三軸的加速度數值。

      該數值包含地心引力的影響,單位是m/s^2。

      將手機平放在桌面上,x軸默認為0,y軸默認0,z軸默認9.81(由于地球的固有重力)。

      將手機朝下放在桌面上,z軸為-9.81。

      將手機向左傾斜,x軸為正值。

      將手機向右傾斜,x軸為負值。

      將手機向上傾斜,y軸為負值。

      將手機向下傾斜,y軸為正值。

      Android 加速度傳感器的類型是? Sensor.TYPE_ACCELEROMETER

      通過 android.hardware.SensorEvent 返回加速度傳感器值。

      加速度傳感器在手機中應用非常的廣泛,在開發的過程當中也非常的簡單,(獲取到值是真的非常的簡單,想要實現某種功能還是需要自己想想怎么加判斷吧)

      舉個栗子:手機搖一搖的功能:

      這個算是比較簡單的判斷了,獲取到x,y,z的值之后,對這三個值進行判斷,搖一搖手機的話這些值肯定會發生變化,我們定一個閾值,當它們的值超過某一個數字之后就進行了搖一搖,配合代碼實現更容易理解

      手機搖一搖功能實現

      上面代碼可以看到,通過x,y,z的值的變化來判斷手機是否進行了搖一搖,這個判斷是比較簡單的,思路就是這么個思路,這種判斷有缺點,上面判斷的是xyz的值不管是哪一個超過了20就認定手機進行了搖一搖,但是忽略了一點,就是用戶往一個方向甩動手機也能觸發,最好的就是只判斷zy,并且判斷的xy必須同時超過20才能認定是搖一搖,以下是改過的代碼

      抬手亮屏
      還有相對搖一搖來說復雜一點的功能--抬手亮屏,這個也是對xyz進行判斷,這里就不放代碼了,簡單說一下思路,當我們拿起手機的時候,加速度傳感器xyz的值肯定會發生變化,我們可以判斷它的結束值,就是手機對著我們的臉的時候傳感器的值是個什么樣的狀態(我低著頭對著手機的時候是x:0,y:8,z:5),我們可以對這個值進行判斷,在手機200ms內達到這個值就被認定抬手亮屏

      代碼部分
      下面是獲取加速度傳感器的值以及手機搖一搖的代碼

      更多手機傳感器使用請看Android中的傳感器(總)
      android加速度傳感器:android 三軸加速度傳感器【轉】  第3張

      android加速度傳感器:Android傳感器SensorEventListener之加速度傳感器

      這個類(我的是Activity中)繼承SensorEventListener接口
      先獲取傳感器對象,再獲取傳感器對象的類型
      //獲取傳感器管理對象
      SensorManager mSensorManager=(SensorManager)getSystemService(Context.SENSOR_SERVICE);
      // 獲取傳感器的類型(TYPE_ACCELEROMETER:加速度傳感器)
      Sensor mSensor=mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
      這里我們除了可以獲取加速度傳感器之外,還可以獲取其他類型的傳感器,如:
       * Sensor.TYPE_ORIENTATION:方向傳感器。
       * Sensor.TYPE_GYROSCOPE:陀螺儀傳感器。
       * Sensor.TYPE_MAGNETIC_FIELD:磁場傳感器。
       * Sensor.TYPE_GRAVITY:重力傳感器。
       * Sensor.TYPE_LINEAR_ACCELERATION:線性加速度傳感器。
       * Sensor.TYPE_AMBIENT_TEMPERATURE:溫度傳感器。
       * Sensor.TYPE_LIGHT:光傳感器。
       * Sensor.TYPE_PRESSURE:壓力傳感器。
      重寫注冊方法
      @Override
       protected void onResume(){
      super.onResume();
      //為加速度傳感器注冊監聽器
      mSensorManager.registerListener(this, mSensor, SensorManager.SENSOR_DELAY_GAME);
       }
      重寫onSensorChanged方法
      @Override
        public void onSensorChanged(SensorEvent event){
      values=event.values;
      StringBuilder sb=new StringBuilder();
      sb.append("X方向的加速度:");
      sb.append(values[0]);
      sb.append("/nY方向的加速度:");
      sb.append(values[1]);
      sb.append("/nZ方向的加速度:");
      sb.append(values[2]);
      mTextValue.setText(sb.toString());//輸出到Imageview上,就可看見加速度的變化
        }
      重寫取消監聽的方法
       @Override
       protected void onStop(){
      super.onStop();
      //取消監聽
      mSensorManager.unregisterListener(this);
       }
      這樣就能獲取加速啦。
      將values[]數組傳給需要使用的對象就能使用了。
      總結
      以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。如果你想了解更多相關內容請查看下面相關鏈接

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

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

      推薦產品

      更多
      主站蜘蛛池模板: 国产成人无码aa精品一区| 无码日韩精品一区二区免费| 午夜福利一区二区三区高清视频 | 国产精品伦一区二区三级视频| 亚洲狠狠狠一区二区三区| 精品一区二区三区AV天堂| 亚洲国产一区国产亚洲 | 久久亚洲国产精品一区二区| 国产午夜一区二区在线观看| 亚洲色精品VR一区区三区| 日本不卡免费新一区二区三区| 一区二区在线免费视频| 日韩在线视频一区| 成人一区二区三区视频在线观看| 91视频一区二区| 国产伦理一区二区| 中文字幕亚洲乱码熟女一区二区 | 精品国产一区二区三区久久狼 | 亚洲日韩精品无码一区二区三区| 合区精品久久久中文字幕一区| 日韩十八禁一区二区久久| 亚洲一区二区三区电影| 国产高清不卡一区二区| 国产精品伦一区二区三级视频| 国内精品无码一区二区三区| 亚洲一区精品无码| 亚洲AV无码一区二区三区DV| 亚洲成AV人片一区二区| 无码乱人伦一区二区亚洲一| 久久综合亚洲色一区二区三区| 亚洲高清美女一区二区三区| 国产乱码精品一区二区三区中| 伊人久久大香线蕉AV一区二区| 亚洲熟妇无码一区二区三区| 无码人妻啪啪一区二区| 国产成人一区二区三区电影网站| 日本韩国黄色一区二区三区| 日韩人妻无码一区二区三区久久99 | V一区无码内射国产| 亚洲乱码一区二区三区在线观看 | 中文字幕日韩一区二区三区不 |