極品巧克力 github
經過前兩篇文章,《D-LG-EKF詳細解讀》和《偏差狀態四元數詳細解讀》,已經把相機和IMU融合的理論所有都推導一遍了。並且《偏差狀態四元數》還對實際操做中的可能遇到的一些狀況,進行指導。 算法
這些理論都已經比較完整了,那麼,該如何在實際當中操做呢?該如何用到實際產品中呢?偏差狀態四元數,是有開源的程序的,可是它是集成在rtslam( https://www.openrobots.org/wiki/rtslam/ )裏面的,不方便提取出來使用。 app
但還有另一個開源的程序,ETH的MSF(https://github.com/ethz-asl/ethzasl_msf),它是獨立的一個開源程序,能夠比較方便地用在本身的工程裏面,而且它的理論與偏差狀態四元數很接近,稍微有點不一樣,因此MSF開源程序就成了一個不錯的選擇。 框架
因此,我把MSF的程序所有都通讀一遍以後,結合程序來推導MSF的理論,總結成本文,包括MSF的實驗,與各位分享。 優化
基本模型以下圖所示。 spa
MSF的可擴展性很好,程序裏能夠接入新的傳感器,好比GPS,激光雷達,碼盤等。 3d
主要的理論仍是偏差狀態四元數裏面的理論。 blog
相比於《卡爾曼四元數帶外參融合方法》,它的方法更好。 get
首先,它的核心狀態裏面沒有重力在世界座標系下的表示。由於它用的就是《偏差狀態四元數》裏面的5.3.1的方法,直接就是以水平座標系爲世界座標系。只是初始位置根據當前加速度計的測量值和理論重力計算出來,初始位置帶着一個協方差而已。由於反正最後都是要轉換到水平座標系下的,因此這種方法反而更加方便。
並且,IMU的世界座標系和相機的世界座標系,也不用綁在一塊兒,同時創建。能夠在IMU開啓一小段時間之後,相機再獲取它的世界座標系。但相隔時間應該仍是要儘可能短點,由於位移單靠IMU的加速度計的積分,時間久了會很不許確,若是有輪子碼盤的話,則又能夠好一些。調整的目的,多是由於世界座標系和相機的世界座標系,在時間戳上並不對應得很好,因此須要微調。
或者,爲了不這樣的麻煩,直接把IMU的世界座標系和相機的世界座標系,綁在一塊兒,同時創建。這樣子,。
也應該用ETH的手眼標定方法,借用棋盤格先標定好,再固定住。
就直接用尺子量好,固定住。若是用雙目相機的話,就不用考慮
了。
(若是加上輪速計的話,怎麼更新呢?它的做用與IMU是相同的,都是相對值,而不是絕對值。因此,它應該與IMU實時融合,在主狀態與相機融合後,IMU預測出一個位姿態,輪速計預測出一個位姿,而後二者融合出主狀態。只有主狀態才能與相機位姿融合。融合的話,能夠用偏差狀態的思想來融合。)
因此,參考《偏差狀態四元數詳細解讀》,一個簡單魯棒的IMU與相機融合的模型應該是這樣的。
核心狀態爲,。
核心狀態上的擾動爲,。
運動模型跟《偏差狀態四元數》裏面的同樣,
則相機位姿的觀測方程爲,
使用《偏差狀態四元數》裏面的公式,
其中,
首先,要計算第一項關於的雅克比,
則用表示上式,則雅克比計算以下,
而後,第二項,要轉成三個元素的形式,即角軸李代數的形式。
用matlab程序,解出上面的式子,以及關於的雅克比。
syms qicw qicx qicy qicz thetax thetay thetaz ...
qwiw qwix qwiy qwiz qzocw qzocx qzocy qzocz real
q1=[qicw,-qicx,-qicy,-qicz]';
q2=[1,-1/2*thetax,-1/2*thetay,-1/2*thetaz]';
q3=[qwiw,-qwix,-qwiy,-qwiz]';
q4=[qicw,qicx,qicy,qicz]';
q5=[qzocw,qzocx,qzocy,qzocz]';
temp = quaternion_mul(q1,q2);
temp = quaternion_mul(temp,q3);
temp = quaternion_mul(temp,q4);
temp = quaternion_mul(temp,q5);
temp
J=jacobian(2*temp(2:4,:),[thetax,thetay,thetaz])
simplify(J)
雅克比能夠是,把temp轉換成角軸,再關於求導。或者,角軸直接近似等於temp向量部分的2倍,再關於
求導,像上面的matlab程序這樣。
這樣子計算雖然準確,可是太麻煩了。論文裏還用了近似的方法。爲了方便地求雅克比,認爲測量值近似爲預測值直接轉換出來,即,。
這時候,上式轉換成角軸,就是,向量部分的2倍,即,。因此,雅克比爲,
(這種用近似的方法,來算雅克比,雖然不如從原始公式上推導準確,可是能夠極大地簡化計算,也許能夠給D-LG-EKF裏面計算H矩陣時借鑑。)
因此,就獲得了雅克比矩陣。
而後,。就能夠計算了。其他的流程,就跟《偏差狀態四元數》裏面同樣了。
前提條件是,各個傳感器的時間戳得是同一個時間源的,或者,時間戳很穩定,能夠經過一些方法把它們時間戳之間的對應關係找到。不一樣傳感器的時間戳能準確對應上。
而後,由於測量值有時候會過一段時間才處理完,因此,把濾波中的狀態都記錄起來,而後,當有測量值過來的時候,更新對應時刻的狀態。而後繼續日後預測。若是有多個不一樣傳感器的測量值,也是如此操做。
若是要融合單目相機。考慮到單目尺度的狀況,怕有時候尺度會忽然發生變化。爲了應對這種狀況,就都計算相對測量,就是兩個時刻之間的相對位姿態,這樣子,這一段的尺度就能夠濾得比較準確。而後,再把優化後的值,加入到原來的狀態中,方法跟《偏差狀態四元數》中的傳播差很少,就是把新濾出來的這段位姿的均值和擾動,加到原先狀態的均值和擾動中去,整合出新的均值和擾動。
而若是要融合的是輪子碼盤的話,則沒必要用這樣的方法。由於雖然輪子碼盤也有尺度問題,可是尺度是較穩定的。
若是是雙目相機的話,也沒必要考慮這種尺度忽然變化的狀況。
爲了更好地與GPS融合,就須要當前狀態須要有準確的協方差。
而之前計算出來的相機位姿的協方差是不許確的,沒有考慮到累積偏差形成的影響。形成了與IMU融合後的狀態協方差也是不許確的。得準確地計算出要融合的每幀圖像的協方差。這協方差,就是經過全局BA的方法,計算出來的。
但其實爲了簡化。若是真的要與GPS融合的話。
在即時建圖的狀況下,用上一段的方法。可是視覺的偏差累積仍是很可觀的,因此若是是遠距離的話,應該以GPS爲外界絕對測量,視覺只是用來計算相對測量的。只能用短距離的視覺相對測量。在主狀態以後,以此爲起點,視覺的相對測量值與IMU的相對測量值融合,融合出相對測量狀態,再把相對狀態的均值和擾動合併進主狀態以及主狀態擾動,主狀態再與GPS融合,融合出新的主狀態。融合的話,能夠用偏差狀態的思想來融合。
若是已經提早建圖,迴環檢測都作了,地圖點固定且準確了,則視覺協方差就是當前幀的協方差,沒必要經過全局BA算出。
MSF的方法考慮得很全面,這個理論框架,能夠用來融合多種傳感器。
我上面思考出來的方法,還考慮了與輪速計碼盤,GPS融合的具體操做狀況,之後須要時再用。
MSF的安裝與跑例程,能夠參考這篇文章,
而後,我本身用ORBSLAM2跑Euroc的V201數據集,生成軌跡數據,和IMU數據一塊兒送入到MSF中運行。爲何要跑標準數據集呢?由於標準數據集提供了IMU噪聲的真實參數,能夠直接拿來使用,並且有真實的軌跡,groundtruth,能夠用來評價融合結果的好壞。
但是運行結果卻老是發散,融合後的軌跡鋸齒很是嚴重。但是在理論上來說,它應該能取得比較好的效果的呀?因此猜想應該是程序與理論沒有對應上。
只好從程序裏去查問題的緣由。將程序裏的全部的計算過程與算法公式一一對應起來以後,最終發現,是由程序裏的2個地方致使的。
1.MSF程序有個隱含的假設,即圖像的世界座標系是水平的。而我送的是以第一幀爲世界座標系的,而V201的第一幀並非水平的。
2. 通過仔細推導程序的計算過程,發現MSF程序中的qwv,本質上是qvw,這個致使參數的初值給錯了。
將以上兩個問題改過來以後,MSF就能夠正常運行我本身提供的數據了。
其中,在y軸上的結果以下。
以上,黑色的線是真實值,綠色的線是ORBSLAM經過圖像計算出來的位姿,紅色的線是圖像位姿和IMU融合後的結果,線上的每個點都表明一個輸出數據。能夠看出,msf融合後的結果,不只能夠把位姿的輸出頻率提升到和IMU同樣的頻率,還可讓軌跡更加接近真實值。
可是,msf有一個缺點,那就是IMU的bias收斂得很慢,猜想是因爲近似形成的。以下圖所示。
上圖是加速度計的bias的收斂狀況,和陀螺儀的bias的收斂狀況。也許能夠經過修改這部分的公式,讓bias收斂得更快。