1. 程式人生 > >Sensors基礎知識---

Sensors基礎知識---

1 感測器選型 6 axis:Bosch BMI160(比較差),InvenSense MPU6050(DMP),ST LSM6Dxx Acc:Freescale MMA,Kionix KXSD9,ST LIS3DH Magnetic:AKM / ALPS / memsic Gyro:ST,BMG160(包含FIFO模式) Pedometer:DS3553,MMA9553L,STP201,ucomm提供計步演算法 Pressure(barometer):Bosch BMP(差),Global mems Sensorhub:Bosch BHI160(ARC EM4 CPU),Cywee cmh1000(tensilica CPU),MegaChips frizz,InvenSense ICM-30630(三軸加速度計 + 三軸陀螺儀 + sensorhub),ST-Movea_STM32_Sensor_Hub BHI160 Datasheet http://www.bosch-sensortec.com/bst/products/all_products/bhi160 ST-Movea_STM32_Sensor_Hub方案 http://www.docin.com/p-770378873.html 2 Acc-Mag-Gyro 2.1 MSM SSC 加速度、陀螺儀等資料量較大的最好使用FIFO(batch)模式,光線、距離等資料有變化才需要上報的感測器使用DRI(Data Ready Interrupt)模式。 SSC(Snapdragon Sensors Core)中帶有uimg(__attribute__((section ("text.SMGR"))))標識的程式碼執行在快取中,其中程式碼一般是做資料上報相關工作的,執行期間可以將外部ddr關閉以實現最低功耗的感測器執行;不帶有uimg標識的程式碼執行期間是需要ddr開啟的,其中程式碼一般做一些初始化相關的工作。 @ sensors/dsps/reg_defaults/sensor_def_qcomdev.conf off_to_idle和idle_to_ready:單位為us,根據硬體spec獲得 i2c_bus:0-based index i2c_address:7位地址,沒有左移一位 該檔案標識方向的關鍵字是900,901,902,分別代表的是感測器的xyz方向,帶個負號表示取反。 例如: 900    2 901    1 902    -3 表示x和y資料互換,z的方向取反。 2.2 Accelerometer 加速度計算公式:(16bit_ADC / 32768) * 量程,16bit_ADC的最高一位是符號位,量程選項有正負2g、正負4g、正負8g、正負16g。 例如量程取正負2g,那麼計算公式是 (((signed short)16bit_ADC) / 0x8000) * (2 * 9.8)低通濾波

:多個取樣值取平均值Sensors 報點時的時間戳單位是ms。 2.2.1 如何判斷ACC校準PASS The norm of accelerometer coordiate value should be close (0, 0, +9.8) (m/s^2), when device Z-axis faces sky direction. we have to calculate bias value that makes accelerometer coordiate value close the norm for each device. How to get accelerometer bias value: xdata[0:99] = xraw[0:99] + x_pervious_bias; ydata[0:99] = yraw[0:99] + y_pervious_bias; zdata[0:99] = zraw[0:99] + z_pervious_bias; x_newbias = (xdata[0]+..+xdata[99])/100; y_newbias = (ydata[0]+..+ydata[99])/100; z_newbias = ((zdata[0]+..+zdata[99])/100); if (absf(x_newbias) > 0.39f)     return (x_newbias = 0.0f); /*that means bias value is not met criterion*/ if (absf(y_newbias) > 0.39f)     return (y_newbias = 0.0f); /*that means bias value is not met criterion*/ if ((absf(z_newbias) > 10.2f) || (absf(z_newbias) < 9.0f)))     return (z_newbias = 0.0f); /*that means bias value is not met criterion*/ 2.2.2 Pedometer 人步行過程中,加速度三軸平方和後開根號大概呈現正弦波,每一個週期算一步。每秒步頻就是正弦波的頻率。區分行走還是跑步可以通過波峰的值來區分(跑步時,每秒步頻也會變快),值大於2g認為在跑步(異常情況是:大於等於2.8g一般認為是跌倒了),值在[1.2g, 2g]之間認為是行走,小於1.2g認為是靜態,不進行計步。 accumulated_step_count/步數:總共走或跑的步數 (unit: 步) accumulated_step_length:所有步幅的總和,即所走的路程(unit:meter) step_frequency/步頻:每分鐘走或跑的步數 (unit: 步/分鐘) step_length/步幅:每步的步長 (unit: centimeter) step_type: 1 for walk, 2 for run, and 3 for jogging 配速的單位是min/KM,即為每公里的用時。 DirectionUp:加速度sqrt(x*x + y*y + z*z) 不斷增加,往波峰爬坡 DirectionDown:加速度sqrt(x*x + y*y + z*z) 不斷減少,往波谷下坡 2.2.3 根據加速度計算Azimuth-Pitch-Roll姿態角做跌倒檢測 Gyro 繞z軸旋轉的叫Azimuth(航向角,又叫Yaw或者Heading),繞x軸旋轉的叫Pitch(俯仰),繞y軸旋轉的叫Roll(翻滾,3個單詞記憶縮寫為APR),加速度只能計算出Pitch和Roll,航向角Azimuth必須通過Gyro或者Mag計算。 ρ、ψ、θ分別為感測器的xyz軸與重力加速度的夾角。感測器3個軸輸出的加速度訊號Ax、Ay、Az與重力加速度方向形成的夾角計算公式如下:
2.2.4 計步演算法URLs 計步器演算法是如何實現的 https://www.zhihu.com/question/28840089 基於加速度感測器的計步器設計與實現 https://wenku.baidu.com/view/c262e09809a1284ac850ad02de80d4d8d05a0145.html 一種基於自適應波峰檢測的MEMS計步演算法 https://wenku.baidu.com/view/46d0d91080eb6294dc886c80.html 基於加速度感測器的人體姿態識別系統 http://www.docin.com/p-1311770991.html 利用加速度求解位置的演算法——三軸感測器 https://www.cnblogs.com/cposture/p/4378922.html 2.3 Gyro(陀螺儀) unit: deg/s或者dps(degree per second) 陀螺儀計算公式:(16bit_ADC / 32768) * 量程,16bit_ADC的最高一位是符號位,量程選項有正負125dps、正負250dps、正負500dps、正負1000dps、正負2000dps。 例如量程取正負2000dps,那麼計算公式是 (((signed short)16bit_ADC) / 0x8000) * 2000 陀螺儀耗流一般比較大,可達1mA。 陀螺儀的XYZ分別代表裝置圍繞XYZ三個軸旋轉的角速度:deg/second。XYZ使用的座標系與gsensor相同。Gyro校準時,X或者Y或者Z > 0.4會判fail。

azimuth方位角(PDR中叫heading):就是繞z軸轉動的角度(順時針為正),0度=正北,(假設Y軸指向地磁正北方);90度=正東;180度=正南;270度=正西。 pitch仰俯:繞X軸轉動的角度(-180<=pitch<=180), 如果裝置水平放置,前方向下俯就是正;前方向上仰就是負值。 roll滾轉:繞Y軸轉動(-90<=roll<=90),向左翻滾是正值。 Sample Rate(Output Data Rate,ODR): ACC:50/100 Hz(PDR和指南針用100 Hz,其它場景切換到50 Hz) MAG:25 Hz GRYO:100 Hz poll_interval為輪訓週期,即odr輸出速率的倒數1000 / odr(單位是ms) DCM:Direction Cosine Matrix(參看四元數與旋轉矩陣) 2.3.1 角速率零點漂移 將陀螺儀放置在水平的桌面上,讀出(x0, y0, z0)這3個值,即為3個軸的0點漂移;運動狀態讀出的值(x, y, z)需要減去0點漂移的值,再做離散點積分計算。 零點漂移不斷修正的公式: gOffset = EMAOFFSET * gyroRaw + (1 - EMAOFFSET) * gOffset; gyroSpeed = gyroRaw - gOffset; gAngleGlobal += gyroSpeed * tInterval; gyroAngle = gAngleGlobal; 其中EMAOFFSET = 0.0005 說明漂移也一直在修正。 2.3.2 陀螺儀積分 陀螺儀積分原理是使用離散點積分,根據ODR(Output Data Rate)的倒數,可以算出2個點的時間間隔(dt = 1 / ODR),將讀取到的x或者y或者z減去offset(0點漂移)後乘以時間間隔(dt = 1 / ODR)即是2點之間的積分,加上上一次的旋轉角度,就是新的角度。 例子: #include <Wire.h> #include <L3G4200D.h> #define EMAoffset 0.05 #define Gyr_Gain 0.076335877862595  // 1/131,250dps float angleG; float G_offset; float gyroSpeed; unsigned long timer = 0; L3G4200D gyro; void setup() {     Serial.begin(9600);     Wire.begin();     gyro.enableDefault();     delay(500); } void loop() {     long o_timer = timer;     timer = millis();     int dt = timer - o_timer;     gyro.read();     G_offset = EMAoffset *(gyro.g.x - 55) / 131 + (1-EMAoffset) * G_offset;     gyroSpeed = (gyro.g.x - 55) / 131 - G_offset;     angleG = angleG + gyroSpeed * dt / 1000;     Serial.print("angle_x: ");     Serial.print(angleG,6);     Serial.println(";");        delay(100); } 積分運算的累積誤差: PITCH/ROLL角速度積分->PITCH/ROLL姿態角,再結合加速度糾正累積誤差。 AZIMUTH(YAW)角速度積分->方向角,再結合地磁感測器、GPS糾正累積誤差。 2.3.3 URLs 簡單介紹一下用加速度感測器修正角速度感測器(陀螺儀)累計誤差的原理 https://blog.csdn.net/djimon/article/details/5815860 2.4 Magnetic(磁力計) unit:microtesla 暫存器讀出來的16bit_ADC值 (x, y, z),16bit_ADC是無符號數,換算成uT,分成3步。 第一步,無符號的16bit_ADC值範圍是[0,65536],轉換到有符號數,就是16bit_ADC-32768後的,範圍就是[-32768,32768] 第二步,得出Gauss:((16bit_ADC - 32768)/ 1024),就是1Gauss的變化,需要ADC的值變化1024 第三步,得出uT:((16bit_ADC - 32768)/ 1024) * 100

地磁場是一個向量,對於一個固定的地點來說,這個向量可以被分解為兩個與當地水平面平行的分量和一個與當地水平面垂直的分量。如果保持電子羅盤和當地的水平面平行,那麼羅盤中磁力計的三個軸就和這三個分量對應起來,如下圖所示。

 

實際上對水平方向的兩個分量來說,他們的向量和總是指向磁北的。羅盤中的航向角(Azimuth)就是當前方向和磁北的夾角。由於羅盤保持水平,只需要用磁力計水平方向兩軸(通常為X軸和Y軸)的檢測資料就可以計算出航向角。當羅盤水平旋轉的時候,航向角在0°- 360°之間變化。 磁力計會上報 (x, y, z, accuracy),其中accuracy的範圍在0-3之間,數字越大越精確,低了需要做8字校準。 採集地磁三個軸的資料,通過畫八字的形式,用MATLAB做個空間球,未校準的資料是個橢球,校準後就是個球了。橢球或者球對應點的直徑(三個軸的合成磁場強度)是sqrt(x*x + y*y + z*z)。 2.5 方位感測器(Orientation Sensors)

Android指南針應用就是用的這個型別。 這個感測器是virtual sensor,是通過Magnetic的 (x, y, z, accuracy) 計算出來的,其中azimuth作為指南針應用的指標方向來源。 azimuth方位角(PDR中叫heading):就是繞z軸轉動的角度(順時針為正),0度=正北,(假設Y軸指向地磁正北方);90度=正東;180度=正南;270度=正西。 pitch仰俯:繞X軸轉動的角度 (-180<=pitch<=180), 如果裝置水平放置,前方向下俯就是正;前方向上仰就是負值。 roll滾轉:繞Y軸轉動(-90<=roll<=90),向左翻滾是正值。 Android上報的3個數據格式如下所示(APR): values[0]:azimuth, rotation around the Z axis values[1]:pitch, rotation around the X axis values[2]:roll, rotation around the Y axis 2.6 URLs 2.6.1 四元數與旋轉矩陣 四元數AHRS姿態解算和IMU姿態解算分析 https://blog.csdn.net/xiaoxie613520/article/details/78227170 加速度計補償陀螺儀漂移的原理 http://x-io.co.uk/open-source-imu-and-ahrs-algorithms/ 3 其他Sensor 3.1 心率 Beats Per Minute,每分鐘心跳次數 3.1.1 光學HRM(心率監控) IC:臺灣原相 光學感測器(2個綠光LED和一個紅外LED)會產生PPG1和TOUCH兩個資料,基於這2個數據,計算得出HRM和TAKE_OFF資料。 HRM融合了G-sensor和光學感測器PPG1的資料。 TAKE_OFF(從手腕上脫下手錶)檢測是用G-sensor和紅外TOUCH的資料計算而得。 SLEEPING檢測是用G-sensor與HRM資料計算而得。 3.1.2 ECG(美國叫EKG,心電圖,雙電極技術) IC:NeuroSky(神念科技)BMD101 aVR:augmented Voltage Right Hand,心電導聯的一種接法 醫療器械三巨頭:GE、飛利浦、西門子(GPS) 穿戴類ECG僅顯示單通道心電圖(第一導聯,Lead I ECG) 3.1.3 HRV HRV是指Heart Rate Variability(心率變異性),HRV的單位是ms(毫秒),HRV特指心跳時間間隔的微小變化。心率變異性變化越大,表明自主神經系統對身體協調作用越好、身體具備更多的活力。測量心率變異性(HRV)可以直觀反映一個人的身體健康狀況,並且也能夠判斷目前的訓練方式對改善身體狀態是否有效。 Figure 3-1 ECG心電圖各種波段解析 Figure 3-2 RR間期、JJ間期和PP間期 Figure 3-3 2個不同的HRV比較 Figure 3-4 HRV測量的散點圖 3.1.4 URLs 名副其實,專業級可穿戴裝置參考方案——佳明Forerunner 630運動手錶拆解 http://www.eeboard.com/teardown/garmin630/ 佳明Forerunner 235拆解,超長待機、支援防水 http://www.eeboard.com/teardown/forerunner-235/2/ GARMIN 佳明 fenix3 HR 小銀人(含拆解) https://post.smzdm.com/p/595994/ 3.2 Pressure(氣壓計) 單位hPa(hundred Pa,Android就是用這個:hardware/*/sensors.h),100帕斯卡 0.12 hPa = 1米 3.3 PDR(室內定位) 根據GPS輸入的值(經度,維度,地面速度m/sec,定位精度GPACCURACY,真北True方位角-順時針為正),sensorhub或者sensor fusion庫返回經度和維度作為PDR的輸出值。一般情況是GPS喂一次資料,sensorhub預測並給出接下來的幾個GPS點。GPS不喂資料,sensorhub也不吐資料。 Cywee CMH1000 sensorhub(224KB DRAM,336KB IRAM,SRAM電壓是1V)帶有這個演算法。 PDR實現方式 https://wenku.baidu.com/view/f2675c3010661ed9ad51f355.html 3.4 Sedentary reminder(久坐提醒) Probability of sedentary reminder, the value range is from 0 to 100. 久坐一般由MMI層預設一個時間下到sensorhub中去,時間unit: minute 久坐的演算法:一般是如果在觸發時間到之前(譬如1小時),有累計行走一分鐘就會解除久坐,並重新計算時間(還是按照1小時計算)。 3.5 Sleep 3.5.1 Sleep Cycle 睡眠監測過程分為:Awake、Light Sleep、Deep Sleep、REM(清醒、輕度睡眠、深度睡眠和快速動眼睡眠) Sleep Cycle:睡眠質量(百分數),(快速動眼睡眠 + 深度睡眠) / 總睡眠 夜晚會翻身的那些時間就是睡眠質量不好(Light Sleep)的時間,演算法將它扣除後,剩下的就是實打實睡眠質量好(快速動眼睡眠 + 深度睡眠)的時間段。 3.5.2 演算法 主要判斷入睡和出睡滿足的條件。 包括SLEEP和SLEEP_STAGING(SLEEPING) SLEEP:純粹由G-sensor的資料計算而得 SLEEP_STAGING(SLEEPING):融合了G-sensor、光學感測器PPG1和BISI(Beat Interval and Signal Integrity detection)的資料;半小時以上的低運動量才會觸發SLEEP_STAGING測量人的睡眠狀態(進入睡眠、淺度睡眠、深度睡眠、狀態切換或起床、結束睡眠);睡眠資料的幾種狀態都儲存在sensorhub中(起床時會集中一次上報),如果中途有起床方便之類的(這個也會報一次資料),只要時間不大於30分鐘,演算法會認為仍然是一次睡眠過程,將起床前後的2個時間段一起計算睡眠資料。 SLEEPING演算法需要data-time,這個需要每天都寫入SLEEPING演算法中。 睡眠狀態值: 0:入睡,enter sleep 1:淺睡,light sleep 2:深睡,deep sleep 3:清醒或翻身,awake/stat change 4:出睡,leave sleep 3.6 Watch Hand up and down(擡手亮屏) 與之相類似的還有Android tilt和wrist感測器。 有2種實現方式: - 使用ACC實現,需要分左右手,功耗較小 - 使用GYRO實現,不分左右手,功耗較大,很多GYRO啟動後,最大耗流能達到1mA 3.7 血氧計(oximeter) 血氧飽和度(SpO2)是醫學界最新確立的衡量人體健康與否的指標,用於標註動脈血液中氧合血紅蛋白佔總血紅蛋白的比值。健康人群的血氧飽和度普遍在94%以上,脈搏在60到100之間。 程式碼中一般使用PPG2表示,PPG1表示的是光學心率的原始資料。一般使用紅光LED來測量。 3.8 顆粒物感測器 測量顆粒物的等效粒徑及單位體積內不同粒徑的顆粒物數量。 主要輸出資料一是PMx.x下的濃度,單位是ug/m3;二是表示0.1升空氣中直徑在x.x微米以上顆粒物個數。 3.9 溼度感測器 絕對溼度:每立方米大氣所含水汽的克數來表示,單位為g/m3。 相對溼度:通常把大氣的絕對溼度跟當時氣溫下飽和水汽壓的百分比稱為大氣相對溼度,用%RH(Relative Humidity)表示,若大氣中所含水汽的壓強等於當時氣溫下的飽和水汽壓時,這是大氣的相對溼度等於100%RH。 4 URLs 博世BMI160六軸感測器I2C通訊配置 https://blog.csdn.net/zzfenglin/article/details/52512871 linux驅動由淺入深系列:高通sensor架構例項分析之三(adsp上報資料詳解、校準流程詳解) https://blog.csdn.net/radianceblau/article/details/76180915 如何portingADSP中的sensor https://blog.csdn.net/u011006622/article/details/54598426 高通平臺android 環境配置編譯及開發經驗總結 https://blog.csdn.net/beyondioi/article/details/18675055 5 AbbreviationsAHRS:Automatic Heading Reference System,自動航向基準系統,廣泛應用於四軸飛行器上 BISI:Beat interval (BI) and signal integrity (SI) detection. The BI is computed based on subtracting the peak position of the successive PPG beats. The SI is an indicator to identify the PPG signal integrity. DDF:Device Driver Framework EEG:Electroencephalography (EEG) is an electrophysiological monitoring method to record electrical activity of the brain. EKG:Electrocardiography (ECG or EKG) is the process of recording the electrical activity of the heart over a period of time using electrodes placed on a patient's body. EMG:Electromyography (EMG) is an electrodiagnostic medicine technique for evaluating and recording the electrical activity produced by skeletal muscles. FSR:Full Scale Ranges,滿量程範圍 GSR:Galvanic skin response (GSR) is an electrophysiological monitoring method to record conductance of the skin. HRV:Heart Rate Variability,心率變異性,需要ECG測量加演算法 IMU:Inertial Measurement Units MPU6050 DMP:Digital Motion Processing,數字運動處理器 ODR:Output Data Rate,for sensors sample rate(poll_interval = 1 / ODR),或者Output Data Register(STM32 GPIO) PDR:Pedestrian dead reckoning, calculating one's current position by using a previously determined position or fix, and advancing that position based upon known or estimated speeds over elapsed time and course. PPG:Photoplethysmogram (PPG) is an optical volumetric measurement of an organ. By illuminating skin with LED, the PPG is measured from the light transmitted or reflected to photodiode.