1. 程式人生 > >加速度計和陀螺儀的數學模型和基本演算法

加速度計和陀螺儀的數學模型和基本演算法

本帖轉自http://www.geek-workshop.com/thread-1695-1-1.html

本帖翻譯自IMU(加速度計和陀螺儀裝置)在嵌入式應用中使用的指南。

這篇文章主要介紹加速度計和陀螺儀的數學模型和基本演算法,以及如何融合這兩者,側重演算法、思想的討論

________________________________________________________________________________________________

不能直接轉載,就直接重新貼上了一下。方面後期檢視。很有用的一篇內容。

________________________________________________________________________________________________

介紹

本指南旨在向興趣者介紹慣性MEMS(微機電系統)感測器,特別是加速度計和陀螺儀以及其他整合IMU( 慣性測量單元 )裝置。
1.jpg  
IMU單元例子 :上圖中MCU頂端的 ACC Gyro 6DOF ,名為 USBThumb ,支援USB/串列埠通訊

在這篇文章中我將概括這麼幾個基本並且重要的話題:
- 加速度計(accelerometer)檢測什麼
- 陀螺儀(gyroscope,也稱作 gyro)檢測什麼
- 如何將感測器ADC讀取的資料轉換為物理單位(加速度感測器的單位是g,陀螺儀的單位是 度/秒)
- 如何結合加速度感測器和陀螺儀的資料以得到裝置和地平面之間的傾角的準確資訊

在整篇文章中我儘量將數學運算降低到最少。如果你知道什麼是正弦、餘弦、正切函式,那無論你的專案使用哪種平臺你應該都會明白和運用這篇文章中的思想,這些平臺如Arduino、Propeller、Basic Stamp、Ateml晶片、PIC晶片等等。總有些人認為使用IMU單元需要複雜的數學運算(複雜的FIR或IIR濾波,如卡爾曼濾波,Parks-McClellan濾波等)。你如果研究這些會得到很棒且很複雜的結果。我解釋事情的方式,只需要基本的數學。我非常堅信簡單的原則。我認為一個簡單的系統更容易操作和監控,另外許多嵌入式裝置並不具備能力和資源去實現需要進行矩陣運算的複雜演算法。
我會用我設計的一個新IMU模組——
Acc_Gyro Accelerometer + Gyro IMU 作為例子。在下面的例子中我們會使用這個裝置的引數。用這個模組作為介紹非常合適,因為它由3個裝置組成:
- LIS331AL ( datasheet ) – 3軸 2G 模擬加速度計
- LPR550AL ( datasheet ) – 雙軸(俯仰、翻滾) 500°/s 加速度感測器
- LY550ALH ( datasheet ) –單軸(偏航)陀螺儀 最後這個裝置在這篇介紹中不使用,不過他在  DCM Matrix implementation 中有重要作用
它們一起組成了一個6自由度的慣性測量單元。這是個花哨的名字!然而,在花哨的名字後面是個非常有用的裝置組合,接下來我們會詳細介紹之。
第一部分 加速度計
要了解這個模組我們先從加速度計開始。當我們在想象一個加速度計的時候我們可以把它想作一個圓球在一個方盒子中。你可能會把它想作一個餅乾或者甜圈,但我就把它當做一個球好了:
2.png  
我們假定這個盒子不在重力場中或者其他任何會影響球的位置的場中,球處於盒子的正中央。你可以想象盒子在外太空中,遠離任何天體,如果很難想象,那就當做盒子在太空梭中,一切東西都處於無重力狀態。在上面的圖中你可以看到我們給每個軸分配了一對牆(我們移除了Y+以此來觀察裡面的情況)。設想每面牆都能感測壓力。如果我們突然把盒子向左移動(加速度為1g=9.8m/s^2),那麼球會撞上X-牆。然後我們檢測球撞擊牆面產生的壓力,X軸輸出值為-1g。
3.png  
請注意加速度計檢測到得力的方向與它本身加速度的方向是相反的。這種力量通常被稱為 慣性力或假想力  。在這個模型中你你應該學到加速度計是通過間接測量力對一個牆面的作用來測量加速度的,在實際應用中,可能通過彈簧等裝置來測量力。這個力可以是加速度引起的,但在下面的例子中,我們會發現它不一定是加速度引起的。
如果我們把模型放在地球上,球會落在Z-牆面上並對其施加一個1g的力,見下圖:
4.png  
在這種情況下盒子沒有移動但我們任然讀取到Z軸有-1g的值。球在牆壁上施加的壓力是由引力造成的。在理論上,它可以是不同型別的力量 - 例如,你可以想象我們的球是鐵質的,將一個磁鐵放在盒子旁邊那球就會撞上另一面牆。引用這個例子只是為了說明加速度計的本質是檢測力而非加速度。只是加速度所引起的慣性力正好能被加速度計的檢測裝置所捕獲。
雖然這個模型並非一個MEMS感測器的真實構造,但它用來解決與加速度計相關的問題相當有效。實際上有些類似感測器中有金屬小球,它們稱作傾角開關,但是它們的功能更弱,只能檢測裝置是否在一定程度內傾斜,卻不能得到傾斜的程度。
到目前為止,我們已經分析了單軸的加速度計輸出,這是使用單軸加速度計所能得到的。三軸加速度計的真正價值在於它們能夠檢測全部三個軸的慣性力。讓我們回到盒子模型,並將盒子向右旋轉45度。現在球會與兩個面接觸:Z-和X-,見下圖:
5.png  
0.71g這個值是不是任意的,它們實際上是1/2的平方根的近似值。我們介紹加速度計的下一個模型時這一點會更清楚。
在上一個模型中我們引入了重力並旋轉了盒子。在最後的兩個例子中我們分析了盒子在兩種情況下的輸出值,力向量保持不變。雖然這有助於理解加速度計是怎麼和外部力相互作用的,但如果我們將座標系換為加速度的三個軸並想象向量力在周圍旋轉,這會更方便計算。
6.png  
請看看在上面的模型,我保留了軸的顏色,以便你的思維能更好的從上一個模型轉到新的模型中。想象新模型中每個軸都分別垂直於原模型中各自的牆面。向量R是加速度計所檢測的向量(它可能是重力或上面例子中慣性力的合成)。RX,RY,RZ是向量R在X,Y,Z上的投影。請注意下列關係:
,R ^ 2 = RX ^ 2 + RY ^ 2 + RZ ^ 2( 公式1
此公式等價於 三維空間勾股定理
還記得我剛才說的1/2的平方根0.71不是個隨機值吧。如果你把它們代回上式,回顧一下重力加速度是1g,那我們就能驗證:
1 ^ 2 =(SQRT(1/2))^ 2 + 0 ^ 2 +(SQRT(1/2))^ 2
公式1 中簡單的取代: R=1, Rx = -SQRT(1/2), Ry = 0 , Rz = -SQRT(1/2)
經過一大段的理論序言後,我們和實際的加速度計很靠近了。RX,RY,RZ值是實際中加速度計輸出的線性相關值,你可以用它們進行各種計算。
在我們運用它之前我們先討論一點獲取加速度計資料的方法。大多數加速度計可歸為兩類:數字和模擬。數字加速度計可通過I2C,SPI或USART方式獲取資訊,而模擬加速度計的輸出是一個在預定範圍內的電壓值,你需要用ADC(模擬量轉數字量)模組將其轉換為數字值。我將不會詳細介紹ADC是怎麼工作的,部分原因是這是個很廣的話題,另一個原因是不同平臺的ADC都會有差別。有些MCU具有內建ADC模組,而有些則需要外部電路進行ADC轉換。不管使用什麼型別的ADC模組,你都會得到一個在一定範圍內的數值。例如一個10位ADC模組的輸出值範圍在0 .. 1023間,請注意,1023 = 2 ^ 10 -1。一個12位ADC模組的輸出值範圍在0 .. 4095內,注意,4095 = 2 ^ 12-1。
我們繼續,先考慮下一個簡單的例子,假設我們從10位ADC模組得到了以下的三個軸的資料:
AdcRx = 586
AdcRy = 630
AdcRz = 561
每個ADC模組都有一個參考電壓,假設在我們的例子中,它是3.3V。要將一個10位的ADC值轉成電壓值,我們使用下列公式:
VoltsRx = AdcRx * VREF / 1023
小注:8位ADC的最大值是255 = 2 ^ 8 -1,12位ADC最大值是4095 = 2 ^ 12 -1。
將3個軸的值代入上式,得到:
VoltsRx = 586 * 3.3 / 1023 =~1.89V(結果取兩位小數)
VoltsRy = 630 * 3.3 / 1023 =~2.03V
VoltsRz = 561 * 3.3 / 1023 =~1.81V
每個加速度計都有一個零加速度的電壓值,你可以在它的說明書中找到,這個電壓值對應於加速度為0g。通過計算相對0g電壓的偏移量我們可以得到一個有符號的電壓值。比方說,0g電壓值 VzeroG= 1.65V,通過下面的方式可以得到相對0g電壓的偏移量:
DeltaVoltsRx = 1.89V - 1.65V = 0.24V
DeltaVoltsRy = 2.03V - 1.65V = 0.38V
DeltaVoltsRz = 1.81V - 1.65V = 0.16V
現在我們得到了加速度計的電壓值,但它的單位還不是g(9.8m/s^2),最後的轉換,我們還需要引入加速度計的靈敏度(Sensitivity),單位通常是 mV/g。比方說,加速度計的靈敏度 Sensitivity= 478.5mV / g = 0.4785V /g。靈敏度值可以在加速度計說明書中找到。要獲得最後的單位為g的加速度,我們使用下列公式計算:
RX = DeltaVoltsRx /Sensitivity
RX = 0.24V / 0.4785V / G =~0.5g
RY = 0.38V / 0.4785V / G =~0.79g
RZ = 0.16V / 0.4785V / G =~0.33g
當然,我們可以把所有的步驟全部放在一個式子裡,但我想通過介紹每一個步驟以便讓你瞭解怎麼讀取一個ADC值並將其轉換為單位為g的向量力的分量。
Rx = (AdcRx * Vref / 1023 – VzeroG) / Sensitivity  (公式2)
Ry = (AdcRy * Vref / 1023 – VzeroG) / Sensitivity
Rz = (AdcRz * Vref / 1023 – VzeroG) / Sensitivity
現在我們得到了慣性力向量的三個分量,如果裝置除了重力外不受任何外力影響,那我們就可以認為這個方向就是重力向量的方向。如果你想計算裝置相對於地面的傾角,可以計算這個向量和Z軸之間的夾角。如果你對每個軸的傾角都感興趣,你可以把這個結果分為兩個分量:X軸、Y軸傾角,這可以通過計算重力向量和X、Y軸的夾角得到。計算這些角度比你想象的簡單,現在我們已經算出了Rx,Ry,Rz的值,讓我們回到我們的上一個加速度模型,再加一些標註上去:
7.png  
我們感興趣的角度是向量R和X,Y,Z軸之間的夾角,那就令這些角度為Axr,Ayr,Azr。觀察由R和Rx組成的直角三角形:
cos(Axr) = Rx / R , 類似的:
cos(Ayr) = Ry / R
cos(Azr) = Rz / R
公式1 我們可以推匯出 R = SQRT( Rx^2 + Ry^2 + Rz^2)
通過arccos()函式(cos()的反函式)我們可以計算出所需的角度:
Axr = arccos(Rx/R)
Ayr = arccos(Ry/R)
Azr = arccos(Rz/R)
我們花了大段的篇幅來解釋加速度計模型,最後所要的只是以上這幾個公式。根據你的應用場合,你可能會用到我們推匯出來的幾個過渡公式。我們接下來要介紹陀螺儀模組,並向大家介紹怎麼融合加速度計和陀螺儀的資料以得到更精確的傾角值。
但在此之前,我們再介紹幾個很常用的公式:
cosX = cos(Axr) = Rx / R
cosY = cos(Ayr) = Ry / R
cosZ = cos(Azr) = Rz / R
這三個公式通常稱作 方向餘弦  ,它主要表達了單位向量(長度為1的向量)和R向量具有相同的方向。你可以很容易地驗證:
SQRT(cosX ^ 2 + COSY ^ 2 + cosZ ^ 2)= 1
這是個很好的性質,因為它避免了我們一直檢測R向量的模(長度)。通常如果我們只是對慣性力的方向感興趣,那標準化模長以簡化其他計算是個明智的選擇。
第二部分陀螺儀
對於陀螺儀我們將不會像加速度計一樣介紹它的等價盒子模型,而是直接跳到加速度計的第二個模型,通過這個模型我們會向大家介紹陀螺儀是怎麼工作的。
8.png  
陀螺儀的每個通道檢測一個軸的旋轉。例如,一個2軸陀螺儀檢測繞X和Y軸的旋轉。為了用數字來表達這些旋轉,我們先引進一些符號。首先我們定義:
Rxz – 慣性力向量R在XZ平面上的投影
Ryz – 慣性力向量R在YZ平面的上投影
在由Rxz和Rz組成的直角三角形中,運用勾股定理可得:
Rxz^2 = Rx^2 + Rz^2 ,同樣:
Ryz^2 = Ry^2 + Rz^2
同時注意:
R^2 = Rxz^2 + Ry^2 ,這個公式可以 公式1 和上面的公式推匯出來,也可由R和Ryz所組成的直角三角形推匯出來
R ^ 2 = Ryz ^ 2 + RX ^ 2
在這篇文章中我們不會用到這些公式,但知道模型中的那些數值間的關係有助於理解。
相反,我們按如下方法定義Z軸和Rxz、Ryz向量所成的夾角:
AXZ - Rxz(向量R在XZ平面的投影)和Z軸所成的夾角
AYZ - Ryz(向量R在YZ平面的投影)和Z軸所成夾角
現在我們離陀螺儀要測量的東西又近了一步。陀螺儀測量上面定義的角度的變化率。換句話說,它會輸出一個與上面這些角度變化率線性相關的值。為了解釋這一點,我們先假設在t0時刻,我們已測得繞Y軸旋轉的角度(也就是Axz),定義為Axz0,之後在t1時刻我們再次測量這個角度,得到Axz1。角度變化率按下面方法計算:
RateAxz = (Axz1 – Axz0) / (t1 – t0).
如果用度來表示角度,秒來表示時間,那這個值的單位就是 度/秒。這就是陀螺儀檢測的東西。
在實際運用中,陀螺儀一般都不會直接給你一個單位為度/秒的值(除非它是個特殊的數字陀螺儀)。就像加速度計一樣,你會得到一個ADC值並且要用類似 公式2 的式子將其轉換成單位為 度/秒的值。讓我們來介紹陀螺儀輸出值轉換中的ADC部分(假設使用10位ADC模組,如果是8位ADC,用1023代替255,如果是12為ADC用4095代替1023)。
RateAxz = (AdcGyroXZ * Vref / 1023 – VzeroRate) / Sensitivity  公式3
RateAyz = (AdcGyroYZ * Vref / 1023 – VzeroRate) / Sensitivity
AdcGyroXZ,AdcGyroYZ - 這兩個值由ADC讀取,它們分別代表向量R的投影在XZ和YZ平面內裡的轉角,也可等價的說,旋轉可分解為單獨繞Y和X軸的運動。
Vref – ADC的參考電壓,上例中我們使用3.3V
VzeroRate – 是零變化率電壓,換句話說它是陀螺儀不受任何轉動影響時的輸出值,對 Acc Gyro 板來說,可以認為是1.23V(此值通常可以在說明書中找到——但千萬別相信這個值,因為大多數的陀螺儀在焊接後會有一定的偏差,所以可以使用電壓計測量每個通道的輸出值,通常這個值在焊接後就不會改變,如果有跳動,在裝置使用前寫一個校準程式對其進行測量,使用者應當在裝置啟動的時候保持裝置靜止以進行校準)。
Sensitivity –陀螺儀的靈敏度,單位mV/(deg/s),通常寫作mV/deg/s,它的意思就是如果旋轉速度增加1°/s,陀螺儀的輸出就會增加多少mV。 Acc_Gyro 板的靈敏度值是2mV/deg/s或0.002V/deg/s
讓我們舉個例子,假設我們的ADC模組返回以下值:
AdcGyroXZ = 571
AdcGyroXZ = 323
用上面的公式,在代入 Acc Gyro 板的引數,可得:
RateAxz = (571 * 3.3V / 1023 – 1.23V) / ( 0.002V/deg/s) =~ 306 deg/s
RateAyz = (323 * 3.3V / 1023 – 1.23V) / ( 0.002V/deg/s) =~ -94 deg/s
換句話說裝置繞Y軸(也可以說在XZ平面內)以306°/s速度和繞X軸(或者說YZ平面內)以-94°/s的速度旋轉。請注意,負號表示該裝置朝著反方向旋轉。按照慣例,一個方向的旋轉是正值。一份好的陀螺儀說明書會告訴你哪個方向是正的,否則你就要自己測試出哪個旋轉方向會使得輸出腳電壓增加。最好使用示波器進行測試,因為一旦你停止了旋轉,電壓就會掉回零速率水平。如果你使用的是萬用表,你得保持一定的旋轉速度幾秒鐘並同時比較電壓值和零速率電壓值。如果值大於零速率電壓值那說明這個旋轉方向是正向。
第三部分 將它們綜合起來。融合加速度計和陀螺儀的資料。
如果你在閱讀這篇文章你可能已經有了或準備購買一個IMU裝置,或者你準備用獨立的加速度計和陀螺儀搭建一個。
注:具體的程式碼實現和演算法測試,請閱讀這篇文章:
http://starlino.com/imu_kalman_arduino.html


在使用整合了加速度計和陀螺儀的IMU裝置時,首先要做的就是統一它們的座標系。最簡單的辦法就是將加速度計作為參考座標系。大多數的加速度計技術說明書都會指出對應於物理晶片或裝置的XZY軸方向。例如,下面就是Acc Gyro板的說明書中給出的XYZ軸方向:
9.png  
接下來的步驟是:
- 確定陀螺儀的輸出對應到上述討論的RateAxz,RateAyz值。
- 根據陀螺儀和加速度計的位置決定是否要反轉輸出值
不要設想陀螺儀陀的輸出有XY,它會適應加速度計座標系裡的任何軸,儘管這個輸出是IMU模組的一部分。最好的辦法就是測試。
接下來的示例用來確定哪個陀螺儀的輸出對應RateAxz。
- 首先將裝置保持水平。加速度計的XY軸輸出會是零加速度電壓( Acc Gyro 板的值是1.65V)
- 接下來將裝置繞Y軸旋轉,換句話說就是將裝置在XZ平面內旋轉,所以X、Z的加速度輸出值會變化而Y軸保持不變。
-當以勻速旋轉裝置的時候,注意陀螺儀的哪個通道輸出值變化了,其他輸出應該保持不變。
- 在陀螺儀繞Y軸旋轉(在XZ平面內旋轉)的時候輸出值變化的就是AdcGyroXZ,用於計算RateAxz
-最後一步,確認旋轉的方向是否和我們的模型對應,因為陀螺儀和加速度的位置關係,有時候你可能要把RateAxz值反向
-重複上面的測試,將裝置繞Y軸旋轉,這次檢視加速度計的X軸輸出(也就是AdcRx)。如果AdcRx增大(從水平位置開始旋轉的第一個90°),那AdcGyroXZ應當減小。這是因為我們觀察的是重力向量,當裝置朝一個方向旋轉時向量會朝相反的方向旋轉(相對座標系運動)。所以,如果你不想反轉RateAxz,你可以在 公式3 中引入正負號來解決這個問題:
RateAxz = InvertAxz * (AdcGyroXZ * Vref / 1023 – VzeroRate) / Sensitivity ,其中InvertAxz= 1 或-1
同樣的方法可以用來測試RateAyz,將裝置繞X軸旋轉,你就能測出陀螺儀的哪個輸出對應於RateAyz,以及它是否需要反轉。一旦你確定了InvertAyz,你就能可以用下面的公式來計算RateAyz:
RateAyz = InvertAyz * (AdcGyroYZ * Vref / 1023 – VzeroRate) / Sensitivity
如果對Acc Gyro板進行這些測試,你會得到下面的這些結果:
- RateAxz的輸出管腳是GX4,InvertAxz = 1
- RateAyz輸出管腳是GY4,InvertAyz = 1
從現在開始我們認為你已經設定好了IMU模組並能計算出正確的Axr,Ayr,Azr值(在第一部分加速度計中定義)以及RateAyz,RateAyz(在第二部分陀螺儀中)。下一步,我們分析這些值之間的關係並得到更準確的裝置和地平面之間的傾角。
你可能會問自己一個問題,如果加速度計已經告訴我們Axr,Ayr,Azr的傾角,為什麼還要費事去得到陀螺儀的資料?答案很簡單:加速度計的資料不是100%準確的。有幾個原因,還記加速度計測量的是慣性力,這個力可以由重力引起(理想情況只受重力影響),當也可能由裝置的加速度(運動)引起。因此,就算加速度計處於一個相對比較平穩的狀態,它對一般的震動和機械噪聲很敏感。這就是為什麼大部分的IMU系統都需要陀螺儀來使加速度計的輸出更平滑。但是怎麼辦到這點呢?陀螺儀不受噪聲影響嗎?
陀螺儀也會有噪聲,但由於它檢測的是旋轉,因此對線性機械運動沒那麼敏感,不過陀螺儀有另外一種問題,比如漂移(當選擇停止的時候電壓不會回到零速率電壓)。然而,通過計算加速度計和陀螺儀的平均值我們能得到一個相對更準確的當前裝置的傾角值,這比單獨使用加速度計更好。
接下來的步驟我會介紹一種演算法,演算法受卡爾曼濾波中的一些思想啟發,但是它更簡單並且更容易在嵌入式裝置中實現。在此之前,讓我們先看看我們需要演算法計算什麼值。所要算的就是重力向量R=[Rx,Ry,Rz],它可由其他值推匯出來,如Axr,Ayr,Azr或者cosX,cosY,cosZ,由這些值我們能得到裝置相對地平面的傾角值,這些關係我們在第一部分已經討論過。有人可能會說-根據第一部分的 公式2 我們不是已經得到Rx,Ry,Rz的值了嗎?是的,但是記住,這些值只是由加速度計資料推匯出來的,如果你直接將它們用於你的程式你會得到難以忍受的噪聲。為了避免進一步的混亂,我們重新定義加速度計的測量值:
Racc – 是由加速度計測量到得慣性力向量,它可分解為下面的分量(在XYZ軸上的投影):
RxAcc = (AdcRx * Vref / 1023 – VzeroG) / Sensitivity
RyAcc = (AdcRy * Vref / 1023 – VzeroG) / Sensitivity
RzAcc = (AdcRz * Vref / 1023 – VzeroG) / Sensitivity
現在我們得到了一組只來自於加速度計ADC的值。我們把這組資料叫做“vector”,並使用下面的符號:
Racc = [RxAcc,RyAcc,RzAcc]
因為這些Racc的分量可由加速度計資料得到,我們可以把它當做演算法的輸入。
請注意Racc測量的是重力,如果你得到的向量長度約等於1g那麼你就是正確的:
|Racc| = SQRT(RxAcc^2 +RyAcc^2 + RzAcc^2),
但是請確定把向量轉換成下面的向量非常重要:
Racc(normalized) = [RxAcc/|Racc| , RyAcc/|Racc| , RzAcc/|Racc|].
這可以確保標準化Racc始終是1。
接來下我們引進一個新的向量:
Rest = [RxEst,RyEst,RzEst]
這就是演算法的輸出值,它經過陀螺儀資料的修正和基於上一次估算的值。
這是演算法所做的事:
-加速度計告訴我們:“你現在的位置是Racc”
我們回答:“謝謝,但讓我確認一下”
-然後根據陀螺儀的資料和上一次的Rest值修正這個值並輸出新的估算值Rest。
-我們認為Rest是當前裝置姿態的“最佳值”。
讓我們看看它是怎麼實現的。
數列的開始,我們先認為加速度值正確並賦值:
Rest(0) = Racc(0)
Rest和Racc是向量,所以上面的式子可以用3個簡單的式子代替,注意別重複了:
RxEst(0)= RxAcc(0)
RyEst(0)= RyAcc(0)
RzEst(0)= RzAcc(0)
接下來我們在每個等時間間隔T秒做一次測量,得到新的測量值,並定義為Racc(1),Racc(2),Racc(3)等等。同時,在每個時間間隔我們也計算出新的估算值Rest(1),Rest(2),Rest(3),等等。
假設我們在第n步。我們有兩列已知的值可以用:
Rest(n-1) – 前一個估算值,Rest(0) = Racc(0)
Racc(n) – 當前加速度計測量值
在計算Rest(n)前,我們先引進一個新的值,它可由陀螺儀和前一個估算值得到。
叫做Rgyro,同樣它是個向量並由3個分量組成:
Rgyro = [RxGyro,RyGyro,RzGyro]
我們分別計算這個向量的分量,從RxGyro開始。
10.png  
首先觀察陀螺儀模型中下面的關係,根據由Rz和Rxz組成的直角三角形我們能推出:
tan(Axz) = Rx/Rz => Axz = atan2(Rx,Rz)
你可能從未用過atan2這個函式,它和atan類似,但atan返回值範圍是(-PI/2,PI/2),atan2返回值範圍是(-PI,PI),並且他有兩個引數。它能將Rx,Rz值轉換成360°(-PI,PI)內的角度。更多資訊請閱讀  atan2 .
所以,知道了RxEst(n-1)和RzEst(n-1)我們發現:
Axz(n-1) = atan2( RxEst(n-1) , RzEst(n-1) ).
記住,陀螺儀測量的是Axz角度變化率,因此,我們可以按如下方法估算新的角度Axz(n):
Axz(n) = Axz(n-1) + RateAxz(n) * T
請記住,RateAxz可由陀螺儀ADC讀取得到。通過使用平均轉速可由得到一個更準確的公式:
RateAxzAvg =(RateAxz(N)+ RateAxz(N-1))/ 2
Axz(n) = Axz(n-1) + RateAxzAvg * T
同理可得:
Ayz(n) = Ayz(n-1) + RateAyz(n) * T
好了,現在我們有了Axz(n),Ayz(n)。現在我們如何推匯出RxGyro/RyGyro?根據 公式1 我們可以把Rgyro長度寫成下式:
| Rgyro | = SQRT(RxGyro ^ 2 + RyGyro ^ 2 + RzGyro ^ 2)
同時,因為我們已經將Racc標準化,我們可以認為它的長度是1並且旋轉後保持不變,所以寫成下面的方式相對比較安全:

相關推薦

基於Arduino開發板使用MEMS加速度陀螺磁力計的方法

在本篇文章中,我們將學習MEMS加速度計、陀螺儀和磁力計的工作原理以及如何將它們與Arduino開發部一起使用。通過使用Processing IDE,我們將使用感測器進行一些實際應用。 MEMS概述 MEMS是非常小的系統或器件,由尺寸範圍為0.001mm至0.1mm的微小元件組

V-rep中的加速度陀螺

gets 函數 nal result cte 物體 publisher gettime mage 加速度計(Accelerometer)   VREP的模型瀏覽器components→sensors中可以找到加速度計的模型,用於測量物體沿著世界坐標系三個坐標軸的加速度值

[Sensor]--BMI160-加速度陀螺感測器

最近在搞一個和加速度計相關的專案,所以接觸到的感測器比較多,現在寫一個總結吧,防止後來者和我一樣走這麼多的彎路。   首先看到的是引腳圖,如果驅動不了應該首先排除硬體的問題: SPI接法 IIC接法 接著我們就著重看下面的幾個暫存器:

慣性導航系統、加速度陀螺原理

1. 慣性導航系統 INS( Inertia Navigation System,以下簡稱慣導)     慣導是一種利用慣性感測器測量載體的比力及角速度資訊,並結合給定的初始條件實時推算速度、位置、姿態等引數的自主式導航系統.具體來說慣性導航系統屬於一種推算導航方式。即從

加速度陀螺數學模型基本演算法

本帖轉自http://www.geek-workshop.com/thread-1695-1-1.html 本帖翻譯自IMU(加速度計和陀螺儀裝置)在嵌入式應用中使用的指南。 這篇文章主要介紹加速度計和陀螺儀的數學模型和基本演算法,以及如何融合這兩者,側重演算法、思想的討論 _________

加速度陀螺指南

本帖翻譯自IMU(加速度計和陀螺儀裝置)在嵌入式應用中使用的指南。 這篇文章主要介紹加速度計和陀螺儀的數學模型和基本演算法,以及如何融合這兩者,側重演算法、思想的討論介紹 本指南旨在向興趣者介紹慣性MEMS(微機電系統)感測器,特別是加速度計和陀螺儀以及其他整合IMU(慣性測量單元)裝置。 IMU單元例子:上

加速度感測器,磁場感測器陀螺感測器案例

Sensor.TYPE_GYROSCOPE  陀螺儀就是內部有一個陀螺,它的軸由於陀螺效應始終與初始方向平行,這樣就可以通過與初始方向的偏差計算出實際方向。手機裡陀螺儀實際上是一個結構非常精密的晶片,內部包含超微小的陀螺。 陀螺儀測量是參考標準是內部中間在與地面垂直的方

大家談談數學模型之美

“我接觸數學模型是從一本書開始的。那時候,還是改革開放的初期,翻譯者們帶回國《數學模型》這本書,

加速陀螺6軸資料融合演算法解析

  四旋翼和雲臺都離不開加速計和陀螺儀。加速計提供實時的重力加速度方向,進而可以計算出機體姿態角度。陀螺儀提供實時的旋轉角度,通過積分也能換算成機體姿態角度。加速計對機體振動非常敏感,稍有擾動,加速度方向就會偏移(外力與重力的合力),但是長期執行時,經過平滑濾波演算法之後的

加速度、螺旋

在iOS4之前,加速度計由UIAccelerometer類來負責採集工作,而電子羅盤則由Core Location接管。而iPhone4的推出,由於加速度計的升級(有訊息說使用的是這款晶片) 和陀螺儀的引入,與motion相關的程式設計成為重頭戲,所以,蘋果在iOS4中增加一個一個專門負責該方面處理的框架,

Android 下陀螺加速度磁場感測器資料定義

摘自Android SensorEvent.java程式碼註釋 Sensor.TYPE_ACCELEROMETER(加速度感測器型別) All values are in SI units (m/s^2) values[0]: Accelerati

陀螺加速度感測器 MPU6050 I2C在stm32上的使用

STM32F4發讀取MPU6050的加速度和角度感測器資料(非中斷方式) 初始化步驟: 1.初始化IIC介面 軟體通過io模擬i2c和利用STM32 i2c外設兩種方法; 2.復位MPU6050 對電

數學模型:3.非監督學習--聚類分析 K-means聚類

rand tar 聚類分析 復制 clust tle 降維算法 generator pro 1. 聚類分析 聚類分析(cluster analysis)是一組將研究對象分為相對同質的群組(clusters)的統計分析技術 ---->> 將觀測對象的群體按照

數學模型的過擬合欠擬合

1. 過擬合 1.1 產生原因 訓練集中的資料抽取錯誤,太少,或者不均衡,不足以有效代表業務邏輯或場景; 訓練集中的資料噪音(異常值)干擾過大; 訓練模型的“邏輯假設“到了模型應用時已經不能成立 引數太多,模型複雜度太高; 特徵量太多,模型訓練過度,比如決策樹模型,神經網路模型

姿態解算知識(三)-陀螺加速度6軸資料融合

這麼久的慣導總算是沒白看,加上一篇部落格的指點,這兩天把Mahony的九軸資料融合演算法看懂了。可惜第二版硬體還沒到,磁力計用不了,沒法驗證效果~今天先總結下陀螺儀和加速度計的六軸資料融合。 原創文章,轉載請說明出處:sheng-blog.cn 原文

基於卡爾曼濾波演算法融合影象速度資料加速度資料

最近在改進之前做的視覺定點演算法,以前只有一個位置環,現在準備再串一級速度環,但是解算出無人機的平移速度還是頗為頭疼的,網上的資料很少,需要我們自己動腦去解決這個問題。 首先要測水平速度,傳統的方法是GPS,我所設計的無人機的應用場景中的GPS訊號雖然有,但是

姿態解算進階:互補濾波(陀螺加速度、地磁資料融合)

互補濾波原理:      在四軸入門理論知識那節我們說,加速度計和磁感測器都是極易受外部干擾的感測器,都只能得到2維的角度關係,但是測量值隨時間的變化相對較小,結合加速度計和磁感測器可以得到3維的角度關係。陀螺儀可以積分得到三維的角度關係,動態效能好,受外部干擾小,但測量值隨

MongoDB數據模型索引學習總結

-c 指定 explain creat 生效 上下 通信協議 必須 數據類型 MongoDB數據模型和索引學習總結 1. MongoDB數據模型: MongoDB數據存儲結構: MongoDB針對文檔(大文件採用GridFS協議)採用BSON(binary jso

a=a+1背後的內存模型CPU高速緩存

變量 線程編程 臨時 一份 提高工作效率 的人 str 運行 結果   學過JAVA的人都知道,程序運行過程中的臨時數據,都是從外部存儲設備調入內存(物理內存)中,再進行讀寫操作的。而計算機在執行程序時,對程序的每條指令都是在CPU中執行的,而指令的執行,勢必涉及到對數據的