陀螺儀在車聯網中的應用
github原始碼下載地址:https://github.com/geduo83/drivingbehaviorcollect
前言:
這篇文章寫於2014年11月,當時公司要搞一個技術沙龍,所以我就寫下了下面的這些文字,今天把它分享出來以示紀念。
說到沙龍,我想到了公元365年,在中國歷史所舉辦的,有史料記載的,最早的一次文學沙龍“蘭亭詩會”,當時有會稽市(也就是浙江紹興南亭這個地方,當時王羲之作為紹興市市長)市長王羲之,謝安等41位軍政高官參會,大家在一起吟詩作賦,把酒言歡,一時間,群賢畢至,少長鹹集,雖無絲竹管絃之聲,一觴一詠,亦足以暢敘幽情。彼時彼刻,正如此時此刻,在一千多年後的今天,我們大家歡聚一堂在九五智駕,今天我們不談文學,不談大資料、也不談網際網路哪些事兒,今天主要和大家來聊一聊陀螺儀在車聯網中的應用。
未來的時代是連線的時代,百度連線了人和資訊,阿里巴巴連線了人和商品,騰訊連線了人和人,那麼九五智駕連線了人和車,未來的時代是資料的時代,那麼海量的資料探勘工作已經是迫在眉睫,基於此,就誕生了今天我們所要講到的,公司的一個研究性的專案,車輛駕駛行為資料採集系統,也就是通過手機陀螺儀採集資料,進行加工分析,來判斷車輛的左轉彎,右轉彎,以及急加速,急減速的問題
本次沙龍共分為三個部分,第一部分講左轉彎,右轉彎,第二部分我們講急加速,急減速,第三部分我進行歸納總結、提問討論
當時接到這個專案壓力也是相當的大,因為以前對這塊也沒有任何的瞭解和接觸,陀螺儀是什麼?能幹這個事兒嗎?帶著這些疑問,我就問了下當時的度娘,度娘立即就回應了,給了我一張圖片,大家請看,當時看了就有些暈
我們在看另外一張圖片,這是什麼,地動儀,東漢末年我國著名的天文學家張衡所發明的地動儀,他是用來測量地震的,尺子大家都知道是用來測量長度的工具,那麼我們的陀螺儀是測量什麼的?他是用來測量角速度,所以陀螺儀也叫角速度感測器,何為角速度,說道角速度,大家可能會想到線速度,物體單位時間內所走的距離那就是線速度,同樣道理那麼物體在單位時間內所走的角度,就是角速度,手機上的陀螺儀叫微機械陀螺儀,他是手機感測器當中的一種。
感測器分類:感知環境的、感知距離的、感知運動的
1 方向感測器:Sensor.TYPE_ORIENTATION
2 加速度感測器:Sensor.TYPE_ACCELEROMETER
3 線性加速度感測器:Sensor.TYPE_LINEAR_ACCELERATION
4 光感測器:Sensor.TYPE_LIGHT
5 磁場感測器:Sensor.TYPE_MAGNETIC_FIELD
6 距離感測器:Sensor.TYPE_PROXIMITY
7 溫度感測器:Sensor.TYPE_TEMPERATURE
8 旋轉向量感測器:Sensor.TYPE_ROTATION_VECTOR
9 角速度感測器:Sensor.TYPE_GYROSCOPE//gyroscope
10 重力感測器:Sensor.TYPE_GRAVITY
11 壓力感測器:Sensor.TYPE_PRESSURE
大家想了,現在我們拋開陀螺儀,車輛的轉彎大家都知道,畫直線,轉完了嗎?沒有,畫轉彎線,轉彎了嗎?轉彎了,為什麼?因為角度的變化對不對,那麼我們只要知道了裝置運動方位,然後根據前後兩個方位角的角度差值和我們的參考值做對比是不是問題就解決了,比如說此時初始方位角是50度,結束方位角為90度,參考值為30度,那麼90度鍵50度,得40度大於了30度我們我們就認為他就轉彎了,那麼現在我們只要通過陀螺儀計算出裝置運動是的方位角問題就解決了
SensorManager.getOrientation(currentRotationMatrixCalibrated,gyroscopeOrientationCalibrated);
SensorManager.getRotationMatrixFromVector(deltaRotationMatrixCalibrated, deltaRotationVectorCalibrated);
SensorManager.getRotationMatrix(initialRotationMatrix, null, acceleration, magnetic);
1.通過加速計和磁強計初始化了一個旋轉矩陣
2.通過矩陣乘法對初始化的旋轉矩陣進行資料校對
3.通過陀螺儀感測器得到三個軸的角速度分量
4.根據三軸分量計算角速度
5.根據角速度和時間求方位角
6.根據方位角求正弦、餘弦
7.根據正弦、餘弦求旋轉向量四元素
8.根據旋轉向量四元素求旋轉矩陣
9.根據旋轉矩陣和初始旋轉矩陣通過矩陣乘法得到一個校準的旋轉矩陣
10.根據旋轉矩陣就得到了方位角
11.根據方位角之間的角度差就判斷車輛轉彎了
x*x + y*y + z*z = a*a
a = (x + y + z)/3
private float[] matrixMultiplication(float[] a, float[] b) {
float[] result = new float[9];
result[0] = a[0] * b[0] + a[1] * b[3] + a[2] * b[6];
result[1] = a[0] * b[1] + a[1] * b[4] + a[2] * b[7];
result[2] = a[0] * b[2] + a[1] * b[5] + a[2] * b[8];
result[3] = a[3] * b[0] + a[4] * b[3] + a[5] * b[6];
result[4] = a[3] * b[1] + a[4] * b[4] + a[5] * b[7];
result[5] = a[3] * b[2] + a[4] * b[5] + a[5] * b[8];
result[6] = a[6] * b[0] + a[7] * b[3] + a[8] * b[6];
result[7] = a[6] * b[1] + a[7] * b[4] + a[8] * b[7];
result[8] = a[6] * b[2] + a[7] * b[5] + a[8] * b[8];
return result;
}
α:初始方位角
β:結束方位角
γ:角度差
若0<α<90 &&270<β<360&&360-β+α>45,則左轉彎了
若270<α<360 &&0<β<90&&360-α+β>45,則右轉彎了
若β-α>45,則右轉彎了
若β-α<-45,則左轉彎了
x軸:右轉彎(0-->π,-π-->0),左轉彎(0-->-π,π-->0)
y軸:上坡(0-->-π/2),下坡(0-->π/2)
z軸:左側翻(0-->π),右側翻(0-->-π)
右左左右
加速度:單位時間類速度的變化率
為正則急加速,為負則急減速
加速度大說明單位時間裡速度變化快,要麼急加速,要麼急減速了
如果裝置運動方向和軸的方向一致,則正值為急加速,負值為急減速
如果裝置運動方向和軸的方向不一致,則正值為急減速,負值為急加速
x軸:水平方向,向右為正方向
y軸:垂直方向,向上為正方向
z軸:垂直於手機螢幕,螢幕的正前方為正方向
剛才我們討論了手機的急加速和減速的問題
那麼現在我們怎麼通過手機來測試車機的急加速和急減速
是不是就是判斷裝置運動的方向和軸的方向的關係,同向:正為正就是急加速,為負就是急減速,異向:負為急加速,正為急減速
α:手機方位角
β:車機方位角
y軸:
若0<=α<=90,則0 < β < α + 90 || α+270 <= β <=360
若270<=α<360,則0 < β < α - 270 || α - 90 < β < 360
若90<=α<=270,則α-90 < β < α + 90
x軸:
α = α + 90
若α > 360 則 α - 360
z軸:
α = α + 180
若α > 360 則 α - 360
位移:s=v*t+0.5*a*t*t
陀螺儀關鍵在計算方位角、分情況討論左轉彎,右轉彎
加速度關鍵在於怎麼判斷車輛運動的方向和軸的方向
通過手機感測器來測量車輛左轉彎、右轉彎、急加速、急減速行得通不?有沒有前提條件?
通過分析我們不難得出結論:通過陀螺儀來測量車輛左轉彎、右轉彎,急加速、急減速是行不通的,因為手機放在車上,不可能將其固定不動放在一個位置之上。比如電話來了,使用者很快的拿出手機接了電話,有急加速嗎?有;有轉彎嗎?有;但是車輛轉彎了嗎?沒有;車輛急加速了嗎?沒有。
問題反饋
在使用中有任何問題,歡迎反饋給我,可以用以下聯絡方式跟我交流
- QQ:303704981
- email:[email protected]
- weibo:@geduo_83
關於作者
var geduo_83 = {
nickName : "geduo_83",
site : "http://www.weibo.com/geduo83"
}