地磁,干擾及校准,橢球擬合
參考 https://www.zhihu.com/column/c_1150063812093825024
IMU,AHRS 加速度計,陀螺儀,地磁計概念
來源 https://zhuanlan.zhihu.com/p/56073859
臨時加進來的,前面已經進行了不少理論學習,這一篇注重介紹一些現實中的傳感器,沒有公式,與前后之間的關系也不大
加速度計,陀螺儀,地磁計
加速度是常用的慣性傳感器,它測量線性加速度+加速度。即所謂的比力。

加速計測量三軸所感受到的加速度,所以當加速度計水平靜止放置在地球上時候,讀數為0,0,1G. 當加速度計收到X軸正方向1G 加速的時候,讀數為1,0,1G
這里有一點小tricky. 重力是垂直向下的,但是正面水平放置,度數是0.0.1G ,為啥不是0.0,-1G. 這是因為 加速度計感受到的是外面對他的作用力(把加速度計想彈簧模型)。而不是重力場。

加速度計模型
陀螺儀
陀螺儀測量三軸角速度,說白了就是測量繞每個軸的旋轉,也叫角速度傳感器,也是一種慣性器件。

加速度計+陀螺儀就叫IMU(慣性測量單元),所謂的6軸傳感器
地磁場傳感器
讓我們再把地磁計加上,他測量三個軸的磁場強度(地磁場+附近的其他干擾磁場(比如磁鐵,金屬物體等等))

所謂9軸傳感器,或者叫MARG(magnetic, angular rate), 如果再配上一個單片機就有處理能力,配合合適的算法就可以叫做一個AHRS(attitude heading reference system)
三軸磁傳感器感應周圍的磁場:一個理想的磁傳感器可以描述為下面數學模型:
![[公式]](/image/aHR0cHM6Ly9pbWcyMDIyLmNuYmxvZ3MuY29tL2Jsb2cvODI1NDY4LzIwMjIwMy84MjU0NjgtMjAyMjAzMjYyMzQxMTc1NTgtMTUzNzg0NzEyMi5zdmc=.png)
地磁場和周圍環境的磁場的總和
傳感器零偏
傳感器噪聲
例 MPU6050 就是一個最典型的的6軸傳感器,內含3個互相垂直的加速度計和三軸互相垂直的陀螺儀。坐標表示如下。

地球磁場
地球磁場的幾何分布是非常不規則的,總體來說磁力線游地磁南極出發,回歸到地磁北極:

注意磁力線的方向: 由地磁南極出發到地磁北極
對於北半球來說,地磁場方向斜向下,對於南半球,地磁場方向斜向上。

一個典型的北半球地磁場
Intensity 那條線就是3軸磁傳感器的讀值,是一個三維空間向量,Intensity的模就是磁場強度 = ![[公式]](/image/aHR0cHM6Ly9pbWcyMDIyLmNuYmxvZ3MuY29tL2Jsb2cvODI1NDY4LzIwMjIwMy84MjU0NjgtMjAyMjAzMjYyMzQxMTcwNDUtMzI1NDY4NzQ1LnN2Zw==.png)
- Declination(磁偏角):地磁場和地理北向的夾角。
- Inclination(磁傾角):地磁場與水平方向的夾角。
- 單位換算: 常用單位: 微特斯拉(uT), 毫高斯(mGauss)
- 1 uT = 10 mGauss ,地磁場的范圍:250 - 650 mGauss 或 25 - 64 uT
在NED坐標系下,

慣性系地磁場矢量計算公式
其中
為磁偏角
為磁傾角
為地磁場大小
地磁場傾角速查:
某地詳細地磁參數查詢(NOAA):
例,通過NOAA網站查的北京的地磁場詳細參數為:

可見北京地區總磁場強度為~54uT, 垂直分量:47uT, 水平分量:28uT, 傾角59°,偏角:-7°
參考
- GNSS與慣性及多傳感器組合導航系統原理-第二版
- https://hal.inria.fr/hal-016501
NXP傳感器融合筆記09(地磁,干擾及校准,橢球擬合)
來源 https://zhuanlan.zhihu.com/p/98325286
地球磁場簡介

地球上某點的地磁場是一個三維空間矢量,從地磁南極出發到地磁北極。強度大約為23-66uT. 這個磁場強度在生活中屬於非常小的量級。如果離一塊小磁鐵很近,那么磁鐵產生的磁場可以輕輕松松超過地磁場上千倍。除了顯而易見的磁鐵,生活中的一些其他物品,包括你想到的想不到的,比如手機,電機,電子產品,耳機,內嵌金屬的家具,辦公桌,帶電導線,甚至建築鋼架結構, 衣服里鑰匙等等等等都會對地磁場產生嚴重干擾,總之:室內磁場分布非常復雜,地磁場在室內受干擾非常嚴重。
關於地磁場的一些更多知識和地磁傳感器的基本概念,可以參看之前的筆記:
美國某地的地磁場具體參數,可以通過NOAA網站查詢:

可以看出,這個地方的地磁場大部分 分量是朝下的哦。。
硬磁和軟磁干擾
硬磁干擾
硬磁干擾其實就相當於磁傳感器的零偏,但是這個零偏不是由傳感器自身引起。如果沒有硬磁干擾,我們讓磁傳感器旋轉所有可能的角度,把數據記錄下來,會得到一個球,而且球心在0,0,0 原點,但由於硬磁干擾的影響。總會測得一個bias(球的圓心不在原點),這個bias就是硬磁干擾。

軟磁干擾
軟磁是由於傳感器周圍的磁性物質扭曲磁場得到,如果向上面那樣讓傳感器旋轉然后采集點,軟磁干擾表現為將球變成橢球:

注意無論是硬磁還是軟磁干擾,都指的是在傳感器坐標系下,換句話說,干擾源和傳感器在同一個設備里,一起運動,旋轉。如果干擾源不再傳感器坐標系下而在固定坐標系下,那么就屬於空間磁干擾,是無法校准補償的!(比如室內的固定干擾源,桌子椅子,鋼筋等)。 這也是為啥室內地磁電子羅盤不准的原因
總結一下硬磁干擾和軟磁干擾對於磁場的畸變影響:
無干擾,硬磁干擾,軟磁干擾
以及他們對磁傳感器采樣結果的影響:

完美的圓(無干擾),偏心的圓(只有硬磁干擾),偏心橢圓(硬磁+軟磁 )
數學知識- 橢圓/圓擬合
這塊一部分時后來加進來,地磁校准和圓/橢圓/球/橢球擬合這個數學問題息息相關,所以這里打算着重大書特書一下有關的數據知識,主要是看到一篇非常好的英文文章:
http://ztrw.mchtr.pw.edu.pl/en/least-squares-circle-fit/ 這節內容基本翻譯自這篇文章
最小二乘圓擬合
機器視覺,包括本章說要解決的地磁校准問題都會可以歸結於圓/橢圓或者橢球/橢球的數據擬合問題。這里有兩本比較老但非常不錯的論文可以參考:
- Gander W. Golub G.H. Strebel R. Least–Squares Fitting of Circles and Ellipses BIT Numerical Mathematics, 34(4) pp. 558–578, 1994
- Coope L.D. Circle fitting by linear and nonlinear least squares Journal of Optimization Theory and Applications, 76(2) pp. 381–388, 1993
圓擬合問題的提出:
給定一些數據點(X,Y) 求圓形坐標和圓半徑,給出的數據點要大於未知數的個數。
比如給出的數據點記作:P
數據點
代數法求解
代數法求解原理簡單直接,我們把圓方程寫為代數形式:

設待求向量為

則有:
其中B:

一般情況下,我們需要加一個約束來轉換成最小二層問題:
,由此可得最小二層問題:

最終轉換為圓形和半徑:

matlab代碼:
clear; clc; close all; P = [1 7; 2 6; 5 8; 7 7; 9 5; 3 7]; B = [(P.*P)*[1 1]', P(:,1), P(:,2)]; b = -ones(length(P), 1); res = (B'*B)^(-1)*B'*b; xc = -res(2)/(2*res(1)); yc = -res(3)/(2*res(1)); c = sqrt(1 - res(1)^2 - res(2)^2 - res(3)^2); r = sqrt((res(2)^2 + res(3)^2)/(4*res(1)^2) - c/res(1)); plot(P(:,1), P(:,2), '*') viscircles([xc, yc],r); axis equal

最小二乘法求解
這個結果可以說不怎么好,實際上,這種算法只是求得了圓形到這些數據點距離最近的一個圓,並沒有考慮這些點的幾何關系,所以擬合效果不佳,如果數據點比較少(比如上面這個例子),那么效果會更差。
幾何法求解

幾何求解法直接優化(最小化) 各數據點與圓心所形成的向量的長度與圓半徑的差值平方和,如上圖所示。換成數學語言:設
, ![[公式]](/image/aHR0cHM6Ly9pbWcyMDIyLmNuYmxvZ3MuY29tL2Jsb2cvODI1NDY4LzIwMjIwMy84MjU0NjgtMjAyMjAzMjYyMzQxMTcyNjEtNDk5NjA2NjE4LnN2Zw==.png)
則有: ![[公式]](/image/aHR0cHM6Ly9pbWcyMDIyLmNuYmxvZ3MuY29tL2Jsb2cvODI1NDY4LzIwMjIwMy84MjU0NjgtMjAyMjAzMjYyMzQxMTcwNDAtNTU0NTEzMjgxLnN2Zw==.png)
或者寫做: ![[公式]](/image/aHR0cHM6Ly9pbWcyMDIyLmNuYmxvZ3MuY29tL2Jsb2cvODI1NDY4LzIwMjIwMy84MjU0NjgtMjAyMjAzMjYyMzQxMTc1MjAtMTY4ODMxNzI0NS5zdmc=.png)
如上所述,定義cost function:
. 現在,要解決的問題變成了非線性問題,不能用傳統的最小二乘來解決了,我們采用高斯牛頓迭代來搞定它!
高斯牛頓迭代
高斯牛法采用迭代方法來實現優化:
實際上就是梯度下降法
其中
是雅克比矩陣的逆,
是殘差。當方程數多於未知數時,系統變成超定問題,雅克比矩陣逆通過偽逆求得: ![[公式]](/image/aHR0cHM6Ly9pbWcyMDIyLmNuYmxvZ3MuY29tL2Jsb2cvODI1NDY4LzIwMjIwMy84MjU0NjgtMjAyMjAzMjYyMzQxMTcwMzktMTc5MzA0Mjg4Ny5zdmc=.png)
雅克比矩陣怎么求呢,實際就是按每個變量求偏導數所組成的矩陣,不再贅述:

雅克比矩陣
matlab代碼:
clear; clc; close all; P = [1 7; 2 6; 5 8; 7 7; 9 5; 3 7]; %給定初值 xc = 5.3794; yc = 7.2532; r = 3.0370; res = [xc; yc; r]; max_iters = 20; max_dif = 10^(-6); % max difference between consecutive results for i = 1 : max_iters J = Jacobian(res(1), res(2), P); R = Residual(res(1), res(2), res(3), P); prev = res; res = res - (J'*J)^(-1)*J'*R; dif = abs((prev - res)./res); if dif < max_dif fprintf('Convergence met after %d iterations\n', i); break; end end if i == max_iters fprintf('Convergence not reached after %d iterations\n', i); end xc = res(1); yc = res(2); r = res(3); plot(P(:,1), P(:,2), '*') viscircles([xc, yc],r); axis equal function J = Jacobian(xc, yc, P) len = size(P); r = sqrt((xc - P(:,1)).^2 + (yc - P(:,2)).^2); J = [(xc - P(:,1))