详解IMU标定经典论文:A Robust and Easy to Implement Method for IMU Calibration without External Equipments
本文介紹一篇 關于IMU 標定的經典論文,論文收錄于 ICRA14,在論文中作者介紹了如何不適用外部設備標定 IMU 加速度和角速度偏差、尺度系數、軸偏移參數。
論文鏈接:https://readpaper.com/paper/2021503353、https://readpaper.com/paper/2211578699
項目鏈接:https://github.com/JzHuai0108/imu_tk_matlab
1. Sensor Error Model
首先介紹傳感器誤差模型,令 aO\mathbf{a}^{O}aO 表示為理想情況下的加速度數據,aS\mathbf{a}^{S}aS 表示為實際的加速度數據,Ta=[1?αyzαzy01?αzx001]\mathbf{T}^{a}=\left[\begin{array}{ccc}1 & -\alpha_{y z} & \alpha_{z y} \\ 0 & 1 & -\alpha_{z x} \\ 0 & 0 & 1\end{array}\right]Ta=???100??αyz?10?αzy??αzx?1???? 表示從 aS\mathbf{a}^{S}aS 到 aO\mathbf{a}^{O}aO 的旋轉變換。ba=[bxabyabza]\mathbf{b}^{a}=\left[\begin{array}{l}b_{x}^{a} \\ b_{y}^{a} \\ b_{z}^{a}\end{array}\right]ba=???bxa?bya?bza????? 為加速度偏差,Ka=[sxa000sya000sza]\mathbf{K}^{a}=\left[\begin{array}{ccc}s_{x}^{a} & 0 & 0 \\ 0 & s_{y}^{a} & 0 \\ 0 & 0 & s_{z}^{a}\end{array}\right]Ka=???sxa?00?0sya?0?00sza????? 為加速度尺度系數,νa\boldsymbol{\nu}^{a}νa 為加速度測量噪聲,則可以得到加速度誤差模型:
aO=TaKa(aS+ba+νa)\mathbf{a}^{O}=\mathbf{T}^{a} \mathbf{K}^{a}\left(\mathbf{a}^{S}+\mathbf{b}^{a}+\boldsymbol{\nu}^{a}\right) aO=TaKa(aS+ba+νa)
同樣也可以得到角速度誤差模型,令 Tg=[1?γyzγzyγxz1?γzx?γxyγyx1]\mathbf{T}^{g}=\left[\begin{array}{ccc}1 & -\gamma_{y z} & \gamma_{z y} \\ \gamma_{x z} & 1 & -\gamma_{z x} \\ -\gamma_{x y} & \gamma_{y x} & 1\end{array}\right]Tg=???1γxz??γxy???γyz?1γyx??γzy??γzx?1????,Kg=[sxg000syg000szg]\mathbf{K}^{g}=\left[\begin{array}{ccc}s_{x}^{g} & 0 & 0 \\ 0 & s_{y}^{g} & 0 \\ 0 & 0 & s_{z}^{g}\end{array}\right]Kg=???sxg?00?0syg?0?00szg?????,bg=[bxgbygbzg]\mathbf{b}^{g}=\left[\begin{array}{l}b_{x}^{g} \\ b_{y}^{g} \\ b_{z}^{g}\end{array}\right]bg=???bxg?byg?bzg?????,νg\boldsymbol{\nu}^{g}νg 為角速度測量噪聲,則角速度誤差模型為:
ωO=TgKg(ωS+bg+νg)\boldsymbol{\omega}^{O}=\mathbf{T}^{g} \mathbf{K}^{g}\left(\boldsymbol{\omega}^{S}+\mathbf{b}^{g}+\boldsymbol{\nu}^{g}\right) ωO=TgKg(ωS+bg+νg)
2. Basic Calibration Framework
加速度標定我們需要估計的未知參數為:
θacc=[αyz,αzy,αzx,sxa,sya,sza,bxa,bya,bza]\theta^{a c c}=\left[\alpha_{y z}, \alpha_{z y}, \alpha_{z x}, s_{x}^{a}, s_{y}^{a}, s_{z}^{a}, b_{x}^{a}, b_{y}^{a}, b_{z}^{a}\right]θacc=[αyz?,αzy?,αzx?,sxa?,sya?,sza?,bxa?,bya?,bza?]
此時我們可以忽略測量噪聲,則加速度誤差模型簡化為:
aO=TaKa(aS+ba)\mathbf{a}^{O}=\mathbf{T}^{a} \mathbf{K}^{a}\left(\mathbf{a}^{S}+\mathbf{b}^{a}\right) aO=TaKa(aS+ba)
正如在傳統的多位置策略中,我們將 IMU 置于 MMM 個不同的位置,在每一個靜止周期內讀取加速度測量值 akS\mathbf{a}^{S}_{k}akS?,我們可以使用以下損失函數來估計加速度誤差模型參數:
L(θacc)=∑k=1M(∥g∥2?∥h(akS,θacc)∥2)2\mathbf{L}\left(\boldsymbol{\theta}^{a c c}\right)=\sum_{k=1}^{M}\left(\|\mathbf{g}\|^{2}-\left\|h\left(\mathbf{a}_{k}^{S}, \boldsymbol{\theta}^{a c c}\right)\right\|^{2}\right)^{2} L(θacc)=k=1∑M?(∥g∥2?∥∥?h(akS?,θacc)∥∥?2)2
其中,∣∣g∥||\mathbf{g}\|∣∣g∥ 是當地重力加速度幅值。損失函數程序為:
function [res_vector] = accCostFunctLSQNONLIN(E, a_hat, magnitude)misalignmentMatrix = [1, -E(1), E(2); 0, 1, -E(3); 0, 0, 1];scalingMtrix = diag([E(4), E(5), E(6)]);a_bar = misalignmentMatrix*scalingMtrix*(a_hat + (diag([E(7), E(8), E(9)])*ones(3, size(a_hat,2))));% Magnitude taken from tables if(nargin<3)magnitude = 9.81744;endresiduals = zeros(length(a_bar(1,:)), 1);for i = 1:length(a_bar(1,:))residuals(i,1) = (magnitude^2 - (a_bar(1,i)^2 + a_bar(2,i)^2 + a_bar(3,i)^2))^2;endres_vector = residuals;end我們使用同樣的靜止周期來標定陀螺儀。在這里我們通過對初始靜止時刻角速度值求平均來得到角速度偏差。這樣我們需要求解的參數簡化為:
θgyro=[γyz,γzy,γxz,γzx,γxy,γyx,sxg,syg,szg]\boldsymbol{\theta}^{g y r o}=\left[\gamma_{y z}, \gamma_{z y}, \gamma_{x z}, \gamma_{z x}, \gamma_{x y}, \gamma_{y x}, s_{x}^{g}, s_{y}^{g}, s_{z}^{g}\right] θgyro=[γyz?,γzy?,γxz?,γzx?,γxy?,γyx?,sxg?,syg?,szg?]
我們使用標定后的加速度數據作為參考,給定一個初始的重力向量,對角速度數據進行積分,我們可以估計最終的重力向量,則損失函數可以寫為:
L(θgyro)=∑k=2M∥ua,k?ug,k∥2\mathbf{L}\left(\boldsymbol{\theta}^{g y r o}\right)=\sum_{k=2}^{M}\left\|\mathbf{u}_{a, k}-\mathbf{u}_{g, k}\right\|^{2} L(θgyro)=k=2∑M?∥ua,k??ug,k?∥2
其中,ua,k\mathbf{u}_{a, k}ua,k? 是標定后的加速度向量,ug,k\mathbf{u}_{g, k}ug,k? 是估計后的重力向量。角速度積分這里使用的是 RK4,不過目前 IMU 的采樣頻率都很高了,一般很少再使用了。
3. Calibration Procedure
A. Static Detector
IMU 標定的準確性非常依賴于靜止和運動時間間隔的準確區分,為了標定加速度計我們使用靜止周期,標定陀螺儀我們使用兩個靜態周期之間的動態時間間隔。我們這里使用基于方差的靜止檢測器,對于時間周期長度 twaitt_{wait}twait? 秒,我們有加速度 (axt,ayt,azt)\left(\mathbf{a}_{x}^{t}, \mathbf{a}_{y}^{t}, \mathbf{a}_{z}^{t}\right)(axt?,ayt?,azt?),然后我們計算標準差:
?(t)=[var?tw(axt)]2+[var?tw(ayt)]2+[var?tw(azt)]2\varsigma(t)=\sqrt{\left[\operatorname{var}_{t_{w}}\left(\mathbf{a}_{x}^{t}\right)\right]^{2}+\left[\operatorname{var}_{t_{w}}\left(\mathbf{a}_{y}^{t}\right)\right]^{2}+\left[\operatorname{var}_{t_{w}}\left(\mathbf{a}_{z}^{t}\right)\right]^{2}} ?(t)=[vartw??(axt?)]2+[vartw??(ayt?)]2+[vartw??(azt?)]2?
我們通過比較方標準差?(t)\varsigma(t)?(t) 是否大于某一閾值來區分靜止和運動狀態。我們將初始方差 ?init\varsigma_{init}?init? 擴大整數倍來作為閾值。下圖是靜止檢測器的檢測結果,這里整數倍為6倍。
B. Runge-Kutta Integration
下面簡單介紹下四階龍格庫塔法,這里主要用在陀螺儀的標定。四元數微分方程為:
f(q,t)=q˙=12Ω(ω(t))q\mathbf{f}(\mathbf{q}, t)=\dot{\mathbf{q}}=\frac{1}{2} \boldsymbol{\Omega}(\boldsymbol{\omega}(t)) \mathbf{q} f(q,t)=q˙?=21?Ω(ω(t))q
其中,Ω(ω)\Omega(\boldsymbol{\omega})Ω(ω) 是一個反對稱矩陣,形式為:
Ω(ω)=[0?ωx?ωy?ωzωx0ωz?ωyωy?ωz0ωxωzωy?ωx0]\boldsymbol{\Omega}(\boldsymbol{\omega})=\left[\begin{array}{cccc} 0 & -\omega_{x} & -\omega_{y} & -\omega_{z} \\ \omega_{x} & 0 & \omega_{z} & -\omega_{y} \\ \omega_{y} & -\omega_{z} & 0 & \omega_{x} \\ \omega_{z} & \omega_{y} & -\omega_{x} & 0 \end{array}\right] Ω(ω)=?????0ωx?ωy?ωz???ωx?0?ωz?ωy???ωy?ωz?0?ωx???ωz??ωy?ωx?0??????
四階龍格庫塔法原理為:
qk+1=qk+Δt16(k1+2k2+2k3+k4)ki=f(q(i),tk+ciΔt),for?i=1q(i)=qk,for?i>1q(i)=qk+Δt∑j=1i?1aijkj,\begin{array}{ll} \mathbf{q}_{k+1}=\mathbf{q}_{k}+\Delta t \frac{1}{6}\left(\mathbf{k}_{1}+2 \mathbf{k}_{2}+2 \mathbf{k}_{3}+\mathbf{k}_{4}\right) \\ \mathbf{k}_{i}=\mathbf{f}\left(\mathbf{q}^{(i)}, t_{k}+c_{i} \Delta t\right), & \text { for } i=1 \\ \mathbf{q}^{(i)}=\mathbf{q}_{k}, & \text { for } i>1 \\ \mathbf{q}^{(i)}=\mathbf{q}_{k}+\Delta t \sum_{j=1}^{i-1} a_{i j} \mathbf{k}_{j}, & \end{array} qk+1?=qk?+Δt61?(k1?+2k2?+2k3?+k4?)ki?=f(q(i),tk?+ci?Δt),q(i)=qk?,q(i)=qk?+Δt∑j=1i?1?aij?kj?,??for?i=1?for?i>1?
各個參數為:
c1=0,c2=12,c3=12,c4=1a21=12,a31=0,a41=0a32=12,a42=0,a43=1\begin{gathered} c_{1}=0, \quad c_{2}=\frac{1}{2}, \quad c_{3}=\frac{1}{2}, \quad c_{4}=1 \\ a_{21}=\frac{1}{2}, \quad a_{31}=0, \quad a_{41}=0 \\ a_{32}=\frac{1}{2}, \quad a_{42}=0, \quad a_{43}=1 \end{gathered} c1?=0,c2?=21?,c3?=21?,c4?=1a21?=21?,a31?=0,a41?=0a32?=21?,a42?=0,a43?=1?
最終得到積分后的四元數,還需要再轉化為單位四元數,整個RK4 程序為:
function [R] = rotationRK4(omega, dt)omega_x = omega(1,:);omega_y = omega(2,:);omega_z = omega(3,:);num_samples = length(omega_x);q_k = fromOmegaToQ([omega_x(1); omega_y(1); omega_z(1)], [dt])';q_next_k = q_k; % was [0; 0; 0; 0]; changed by Huaifor i = 1:num_samples - 1% first Runge-Kutta coefficientq_i_1 = q_k;OMEGA_omega_t_k = ...[0 -omega_x(i) -omega_y(i) -omega_z(i);omega_x(i) 0 omega_z(i) -omega_y(i);omega_y(i) -omega_z(i) 0 omega_x(i);omega_z(i) omega_y(i) -omega_x(i) 0 ];k_1 = (1/2)*OMEGA_omega_t_k*q_i_1;% second Runge-Kutta coefficientq_i_2 = q_k + dt*(1/2)*k_1;OMEGA_omega_t_k_plus_half_dt = ...[0 -(omega_x(i) + omega_x(i + 1))/2 -(omega_y(i) + omega_y(i + 1))/2 -(omega_z(i) + omega_z(i + 1))/2;(omega_x(i) + omega_x(i + 1))/2 0 (omega_z(i) + omega_z(i + 1))/2 -(omega_y(i) + omega_y(i + 1))/2;(omega_y(i) + omega_y(i + 1))/2 -(omega_z(i) + omega_z(i + 1))/2 0 (omega_x(i) + omega_x(i + 1))/2;(omega_z(i) + omega_z(i + 1))/2 (omega_y(i) + omega_y(i + 1))/2 -(omega_x(i) + omega_x(i + 1))/2 0 ];k_2 = (1/2)*OMEGA_omega_t_k_plus_half_dt*q_i_2;% third Runge-Kutta coefficientq_i_3 = q_k + dt*(1/2)*k_2;OMEGA_omega_t_k_plus_half_dt = ...[0 -(omega_x(i) + omega_x(i + 1))/2 -(omega_y(i) + omega_y(i + 1))/2 -(omega_z(i) + omega_z(i + 1))/2;(omega_x(i) + omega_x(i + 1))/2 0 (omega_z(i) + omega_z(i + 1))/2 -(omega_y(i) + omega_y(i + 1))/2;(omega_y(i) + omega_y(i + 1))/2 -(omega_z(i) + omega_z(i + 1))/2 0 (omega_x(i) + omega_x(i + 1))/2;(omega_z(i) + omega_z(i + 1))/2 (omega_y(i) + omega_y(i + 1))/2 -(omega_x(i) + omega_x(i + 1))/2 0 ];k_3 = (1/2)*OMEGA_omega_t_k_plus_half_dt*q_i_3;% forth Runge-Kutta coefficientq_i_4 = q_k + dt*1*k_3;OMEGA_omega_t_k_plus_dt = ...[0 -omega_x(i + 1) -omega_y(i + 1) -omega_z(i + 1);omega_x(i + 1) 0 omega_z(i + 1) -omega_y(i + 1);omega_y(i + 1) -omega_z(i + 1) 0 omega_x(i + 1);omega_z(i + 1) omega_y(i + 1) -omega_x(i + 1) 0 ];k_4 = (1/2)*OMEGA_omega_t_k_plus_dt*q_i_4;q_next_k = q_k + dt*((1/6)*k_1 + (1/3)*k_2 + (1/3)*k_3 + (1/6)*k_4);q_next_k = q_next_k/norm(q_next_k);q_k = q_next_k;endR = inv(fromQtoR(q_next_k));endC. Complete Procedure
為了避免標定參數估計中的不可觀察性,至少需要收集IMU9個不同姿態的數據,姿態數越多,標定結果越準確。整個標定算法如下,需要知道采集好的加速度數據 aS\mathbf{a}^{S}aS 和角速度數據 ωS\boldsymbol{\omega}^{S}ωS,初始靜止時間 TinitT_{init}Tinit?,以及運動后的靜止時間 twaitt_{wait}twait?。
- 首先根據初始時間計算陀螺儀偏差 bg\boldsymbol{b}^gbg;
- 根據計算后的陀螺儀偏差得到無偏角速度數據 ωbiasfreeS\boldsymbol{\omega}^{S}_{biasfree}ωbiasfreeS?;
- 計算初始協方差 ?init\varsigma_{init}?init? ;
- 設 i=1:ki=1:ki=1:k ,根據等待時間 twaitt_{wait}twait? 和閾值計算靜止間隔、再根據靜止間隔 twaitt_{wait}twait? 和加速度數據得到估計參數;
- 最后選取殘差最小對應的參數為加速度標定參數,然后再使用同樣的靜止周期計算陀螺儀標定參數;
總結
以上是生活随笔為你收集整理的详解IMU标定经典论文:A Robust and Easy to Implement Method for IMU Calibration without External Equipments的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 建行信用卡分期手续费怎么算 三种分期手续
- 下一篇: 在银行可以买到什么理财产品?银行常见的理