IMU預積分程序(PVIO)配置、運行的全過程記錄
0 前言
疊甲:本人不是導航、自動駕駛這類研究方向的,做的是點云三維重建,接觸到該項目的起因為了幫忙趕材料。下文中若有任何疏漏錯誤還請海涵,亦多謝您耐心指正。本文供記錄、整合和墊腳石之用。
使用的項目地址:
Publication聲明:
路過的大佬能否指點一下:PVIO的執(zhí)行命令中,有沒有僅以imu數據來進行解算并生成軌跡線的命令?(有累計誤差也ok,主要是有沒有這個功能)
imu預積分作用:網上很多理論的解析,參考
簡述下我認為預積分的作用:(1)提取每次迭代運算中的不變量,且只需線性運算便可校正測量值,減少運算時間;(2)通過融合傳感器數據來抑制累積誤差,估計imu的零偏bias值(存疑)。
好了,接下來便是PVIO程序配置與運行的過程記錄,希望對你有所幫助。

1硬件準備與系統(tǒng)安裝
(1)一臺硬盤容量80G以上的電腦。感謝同門暫借了我一臺老筆記本,這是它的配置:

(2)一塊16G的移動U盤。用于制作ubuntu系統(tǒng)啟動盤。
ubuntu系統(tǒng)為ubuntu-18.04.6-desktop-amd64,制作啟動盤參考:
【win11下用rufus安裝Ubuntu雙系統(tǒng)】 https://www.bilibili.com/video/BV1BP411577g/?share_source=copy_web&vd_source=1e602e9eb283891156fa67e21d45244a
系統(tǒng)安裝參考:
【Windows 和 Ubuntu 雙系統(tǒng)的安裝和卸載】 https://www.bilibili.com/video/BV1554y1n7zv/?p=8&share_source=copy_web&vd_source=1e602e9eb283891156fa67e21d45244a
其中使用的是GPT分區(qū)進行安裝,未使用MBR分區(qū)。

2依賴項安裝
2.1vim+gcc+gdb
參考https://blog.csdn.net/Nonpc123/article/details/90043490
打開ubuntu的終端,輸入命令:
2.2cmake
一開始用apt-get安裝的版本為3.10.2,比項目中要求的cmake版本低?,F版本為3.25.2,具體的更新步驟忘了...
可參考https://blog.csdn.net/qq_27350133/article/details/121994229
安裝好cmake后,其實就可以跳轉到3,嘗試編譯cmakeList文件來生成項目的工程文件,然后根據報告的錯誤信息去安裝相應的依賴項。比方說報錯“OpenCV_DIR does not exist”,那“_DIR”前面的為系統(tǒng)缺少的依賴項名稱。
2.3OpenCV
安裝的版本為4.7.0,參考https://blog.csdn.net/weixin_44698673/article/details/127082446
(1)安裝依賴環(huán)境。在終端中輸入命令:
(2)打開opencv官網https://opencv.org/releases/,點擊sources下載源碼并解壓。
(3)進入解壓后的源碼目錄,【右鍵】>【在終端打開】,輸入命令:
(4)配置環(huán)境變量。打開終端輸入命令:
在打開的ld.so.conf文件的末尾另起一行,輸入、保存:
回到終端并輸入:
在文件的末尾另起一行,輸入以下兩行命令、保存:
回到終端并輸入:
(5)使用pkg-config工具檢測OpenCV的版本,是否安裝成功
2.4yaml-cpp
一個使用C++語言的YAML解析器與發(fā)射器。參考https://blog.csdn.net/qq_43278899/article/details/128474075
(1)在https://github.com/jbeder/yaml-cpp下載源碼壓縮包并解壓。
(2)進入源碼目錄,【右鍵】>【在終端打開】,輸入命令:
2.5Eigen3
參考https://blog.csdn.net/qq_57061492/article/details/126163112
(1)在eigen官網http://eigen.tuxfamily.org/index.php?title=Main_Page中點擊“The?latest stable release..”后的鏈接,下載壓縮包并解壓。
(2)進入源碼目錄,【右鍵】>【在終端打開】,輸入命令:
(3)進入目錄/usr/local/include/eigen3,復制目錄下的文件“Eigen”到目錄/usr/local/include。該步驟是為了讓項目內.cpp文件中的#include <Eigen/Dense>能檢索到eigen依賴項。
2.6ceres-solver
一個非線性優(yōu)化庫,使用版本2.1.0。參考
注意最好使用官網提供的包或git,我第一次安裝的是github上其他源的,后續(xù)的編譯有較多報錯。
(1)進入ceres-solver官網http://ceres-solver.org/installation.html,在“獲取源碼”下方點擊鏈接“l(fā)atest stable release”下載壓縮包并解壓。
(2)進入源碼目錄,【右鍵】>【在終端打開】,輸入命令:
(3)進入目錄/usr/local/include查看是否存在ceres文件夾。

2.7OpenGL
這個庫是臨時補充的依賴項。在cmake項目PVIO時報錯:
參考:https://blog.csdn.net/ei1990/article/details/84890005
在終端中輸入命令:
2.8FFMPEG
該依賴項可能不是必須的。參考https://blog.csdn.net/u011178262/article/details/120565605
在終端中輸入如下命令:

3安裝PVIO
終于,在配置好各種依賴項后(或者還在配置中),我們開始安裝PVIO程序。
(1)下載PVIO源碼并解壓。
(2)進入源碼目錄,【右鍵】>【在終端打開】,輸入命令:
(3)cmake、make過程中出現的問題:
有兩種解決方法:一是重新執(zhí)行命令“cmake?..”并祈禱連接到GitHub的網絡能穩(wěn)定通暢,是可行的但得多試幾次;
二是自己動手把庫下載下來:點擊子模組‘ext/nanogui’后提供的GitHub地址,下載源碼并解壓到程序提供的子模組路徑下,然后重新執(zhí)行命令“cmake?..”。

解決方法:安裝OpenGL庫,見2.7部分,然后重新執(zhí)行命令“cmake?..”。若仍報相同錯誤,可能原因是程序未查詢到該庫的依賴項。參考https://blog.csdn.net/CCCDeric/article/details/129722580
在終端輸入如下命令:
解決方法:查看標紅代碼中函數的命名空間,或編譯該代碼所在的文件目錄,根據這些名稱重裝相應的依賴項。

PVIO?cmake、make成功的截圖:



4下載示例數據
(1)使用的是公開的EuRoC MAV 數據集,下載地址:
在“Downloads”下有數組數據集,點擊表格ASL Dataset Format下的link鏈接,下載相應數據的壓縮包。
(2)在PVIO源碼目錄創(chuàng)建文件夾Data(與文件夾build處在同一級目錄下),將壓縮包文件解壓至Data文件夾內。

5運行PVIO
(1)這里截取了PVIO源碼ReadMe中關于執(zhí)行的部分:
參考chatgpt的翻譯,PVIO的執(zhí)行命令分三部分:(1)運行文件pvio-pc,該文件位于源碼目錄/build/pvio-pc;(2)指定所使用的數據集[data_scheme]://和該數據集所在路徑[data_path];(3)數據集的配置文件[config_yaml_path],位于源碼目錄/config。
執(zhí)行命令的每部分前需要敲個空格。
(2)進入build文件夾目錄,【右鍵】>【在終端打開】,輸入命令:
終端會顯示相應的配置信息,并打開NanoVis可視化窗口。

報錯“段錯誤(核心已轉儲)”的解決方法:關閉NanoVis窗口,重新輸入命令。該報錯的原因未知,可能是電腦內存不夠。
(3)點擊NanoVis中的按鈕【Run】開始解算?!維tep】為逐幀解算,【ShutDown】為關閉程序。第一列數據為慣導系統(tǒng)三軸角速度和三軸加速度的靜態(tài)偏差值,第二列為逐幀影像及匹配的同名點(猜測),第三列為儀器的狀態(tài)參數。不清楚藍線與紫線哪條為糾正后的軌跡。




解決方法:嘗試再點一下【Run】;或者檢查下數據集的所在路徑是否有誤,重新在終端輸入PVIO執(zhí)行命令。
(4)在build文件夾下的trajectory.tum為生成的軌跡線文件,可用文本格式讀寫。有八列數據,沒有表頭不清楚各列含義。

6其他、后記
(1)有關PVIO的論文,在項目的ReadMe文件中有它的下載地址:
該文P290的頁腳處,有關于PVIO實驗補充材料的下載鏈接,其中有兩段視頻——記錄有多個數據集經預積分后生成的軌跡線;以及一份報告,PVIO與其他算法在多個數據集下的軌跡精度對比。
佷詳實,佩服。(汗,雖然看不太懂)
(2)從配置到運行成功大概花了一天半,如果同學你也有復現的需要,建議預留出兩天時間來習慣ubuntu的操作,并耐心配置這繁多的依賴項。

ok,至此有關PVIO的記錄已基本完畢,余下的為吐槽時間。
PVIO后續(xù)若要納為己用,肯定是要涉及源碼優(yōu)化和數據集的制作,自己應該是不會繼續(xù)向下推進了,淺嘗輒止。弄好當天就找老師做了個簡短匯報——從輸入數據上看得有相機+慣導的數據,沒法僅處理imu數據,不然估計要大改程序,還得摸索著找各個功能的入口,不是個短時間的任務。估計老師聽著也有些懵,但好在已pass掉我這塊的內容了,因為這看著也不像是純imu解算能到的精度和結果。這幾天的精力和時間就這么棄掉也挺可惜的,于是,這篇記錄被攢出來了(笑)。
以及關于引言部分的求指點,我猜,PVIO的程序里,imu預積分功能大概是沒法這樣弄,哪怕實現了,這種通過遞推得到的精度,在未知靜態(tài)偏差值的情況下,應該也好不到哪去。純imu應該是沒法算bias值的,得有其他源的數據來進行標定,按《預積分總結與公式推導》中所說:
對于理解 IMU 預積分理論所需的慣導知識...的更多復雜內容,比如對地球自轉的處理,以及地速與絕對速度等概念就不做展開了。
IMU 和視覺這兩種不同源的測量,也使得 IMU 的 bias 可觀,從而可以在優(yōu)化中被有效估計。
只能說...我也沒做好功課,傻乎乎地撲上去弄這個imu預積分了。若要達到老師的要求,其實該去摸索下傳統(tǒng)的捷聯導航算法,至少也能憋出點實在的內容。
那么,感謝你耐心看到這里,承蒙厚愛,有緣再見。
以上。