標籤:
好久不見啊各位親,最近剛中期答辯完,得以有時間好好更新下部落格啦。 自從上一個單目AR系統做完後,就仔細思考了一下我到底在做什麼,接下來要做什麼。之前部落格上寫的是3d重建,後來視野開闊了之後發現無論我做3d重建,SLAM,AR,重要的都是姿態更新。一個精準的穩定的姿態更新,決定著系統的好壞。貝葉斯濾波器(EKF擴充卡爾曼濾波,PF粒子濾波)和通用圖最佳化(G2O)是使得姿態更加精準穩定的兩種方法。近些年來G2O在視覺SLAM領域逐漸成為了主流的後端最佳化方法。 具體的視覺SLAM流程和G2O的相關知識,我將在模組《關於SLAM的那些事》裡的接下來兩篇文章中講到(包括自己最佳化的一些代碼)。本篇部落客要講一下G2O在windows環境下的搭配。為什麼要選windows,因為這些年一直用的是vs的編輯器(vc++6.0,vs2012,vs2013),對於這個熟悉的領域突然換到ubuntu下使用cmake還是有點不適應的(儘管這麼說,我還是推薦做學術的童鞋多用用linux系統如ubuntu,各種庫真的很方便而且能學到很多東西)。言歸正傳,接下來講一下開發win32程式和x64程式的G2O的環境搭配。
首先放一張G2O官方github的windows編譯的步驟圖以及G2O源碼的下載連結:
一共6個步驟:編譯Eigen,安裝Qt,編譯libQGVLiewer,Cmake編譯g2o,VS2013產生g2o,添加環境變數並開始使用。不需要g2o_viewer.exe來查看最佳化結果的不需要qt和libqgliewer(我覺得一般人都需要)。在ubuntu下還需要suitesparse但是windows不需要(其實EXTERNAL中有csparse)。
1.編譯Eigen3.2.7
這個步驟在我的PCL編譯中有詳細講解。
2.安裝Qt5.5.1
這裡我們安裝的是5.5.1的32位和64位的版本。大家也可以下載Qt4和Qt5的其他版本,都是可行的。注意下載的時候選擇離線安裝包裡的windows主機下面的。有一個點要強調一下,要開發win32程式,程式中用到的所有lib和dll都需要是32位的,要開發x64程式,程式中用到的所有lib和dll都需要是64位的。include就無所謂了都一樣。為什麼要開發64位的程式呢,因為32位的程式在64位的win7,win8,win10系統裡最大隻能使用4G記憶體(微軟官方說明,使用IMAGE_FILE_LARGE_ADDRESS_AWARE設定),而64位的程式可以使用高達幾百G的記憶體。當然有小夥伴要說怎麼可能使用那麼多的記憶體,肯定存在記憶體流失問題,但是我還是想說,在記憶體管理得當的基礎上,記憶體越大,我們能做的事越多。下載完成後分別安裝,並用容易區分的名字命名(當然也可以只下載安裝大家需要的位元的版本):
大家可以使用cmd輸入qmake -v來查看qt是否安裝成功。
接下來安裝vs2013的QT外掛程式(其他下載 中的 Visual Studio Add-in 1.2.4 for Qt5 (156 MB)),可以在vs中開啟qt的工程(如下一步中的libQGLViewer.pro):
當然也可以用qt creator開啟編譯,但是我的C盤user中的使用者名稱是中文,而creator編譯過程中產生的臨時變數在C:\Users\柴\AppData中老是識別不了中文,報錯,而我不太熟悉qt creator所以經過嘗試沒有解決於是使用了vs的外掛程式來開啟編譯qt工程。下載安裝好之後開啟vs2013,左上方可以看到QT5,開發選項:
添加剛才安裝的qt版本的name和path。name自己決定,path按照中的寫:
(注意圖中下方的預設版本設定比較重要,下一步中編譯不同版本的libqglviewer需要這裡設定不同預設版本的qt)
3.編譯libQGLViewer_2.6.3
安裝好QT之後,我們下載libQGLViewer_2.6.3,解壓後我們用vs2013開啟(左上方QT5 -> 開啟工程):
右鍵點擊QGLViewer中的產生,或者按中的方式產生:
等待,然後看到了成功編譯的Debug版本:(注意我們之前設定預設使用的是64位的qt,所以這裡得到的是64位的libqglviewer編譯結果: QGLViewerd2.lib QGLViewerd2.dll)
選擇Release,再編譯產生一遍:
同樣成功編譯並得到了64位的release版的libqglviewer編譯結果: QGLViewer2.lib QGLViewer2.dll。
對於32位的,我們只需要更改qt外掛程式的預設配置版本:
確定後重新使用外掛程式開啟libQGLViewer.pro,編譯產生debug和release即可。完成後可以用不同名字區分開來,方便後續步驟庫的選取:
4.Cmake編譯g2o原始碼
有了Eigen,Qt,libQGLViewer,我們就可以開始編譯g2o原始碼了,這裡也是分32位和64位兩個版本。文章一開始已經放出了G2O的下載連結,解壓一次命名為win32,在解壓一次命名為x64:
(先以32位為例)開啟cmake,源碼路徑和編譯路徑為,提示建立build:
32位的話編譯器選擇Visual Studio 12 2013:
只需關注eigen,qt,libqglviewer,其他的如csparse等cmake已經幫我們找到了,不需要管。先找到Ungrouped Entries裡和G2O裡的EIGEN,添加路徑(我的為C:/third_party/eigen/include/eigen3,大家的尾碼應該一樣X:/.../eigen/include/eigen3)。然後對於qt,如果沒有改過安裝後的qt原檔案夾的名字的話,cmake是可以找到的。但是我們這裡改成了Qt_32,所以還需要手動添加一下路徑(如),QT_QMAKE_EXECUTABLE選擇qmake.exe檔案,Qt5_DIR選擇檔案夾cmake中的Qt5檔案夾:
對於libqglviewer,手動添加include和lib(其中lib為檔案,QGLViewerd2.lib是debug版,QGLViewer2.lib是release版):
include選擇的是QGLViewer檔案夾,而不是裡面的檔案:
手動添加完後,點擊configure,系統會找到剩下的qt相關資訊:
再次點擊configure確認即可。沒有紅色後點擊generate,即可在build中產生g2o.sln:
接下來再走一邊x64的流程。 cmake設定好64位的原始碼路徑和編譯路徑,提示建立build檔案夾並選擇Visual Studio 12 2013 Win64編譯器(注意和32位不用):
設定好eigen,qt,libqglviewer的路徑:
點擊configure:
確認qt的其他資訊然後再點一次configure,無紅色提示後點擊generate:
我們可以看到32位和64位的build檔案夾中都出現了g2o.sln:
5.VS2013產生G20
用VS2013開啟win32的g2o.sln,然後產生all_build:
等待,然後得到全部成功的結果:
Release下再產生一邊:
成功後可以在bin看到產生的lib,dll,exe檔案:
VS開啟64位檔案夾中的g2o.sln然後產生debug版的all_build:
然後64位的release版的all_build:
6.添加環境變數並開始使用
添加環境變數,在path中添加dll的檔案夾路徑,32位和64位都加上,只開發win32的話不需要添加64位的:
C:\Qt_32\Qt5.5.1\5.5\msvc2013\bin;C:\Qt_64\Qt5.5.1\5.5\msvc2013\bin;C:\g2omaster_x64\bin\Release;C:\g2o-master_x64\bin\Debug; C:\g2o-master_win32\bin\Release; C:\g2o-master_win32\bin\Debug;
到此G2O的編譯和環境配置就都完成啦。我在我的slam工程中已經成功使用g2o,其中有一些注意點,將在《關於SLAM的那些事》的第三篇文章中講到(就是下下篇啦,下篇講一下視覺SLAM的基本流程和代碼)。這裡說幾個重要的:(1)把C:\g2o-master_win32\build\g2o\config.h拷貝到C:\g2o-master_win32\g2o\下,不然vs中提示找不到config.h (2)把C:\g2o-master_win32\EXTERNAL\csparse\cs.h 和 cs_api.h拷貝到C:\g2o-master_win32\g2o\solvers\csparse\裡,然後開啟本檔案夾下的csparse_helper.h檔案,把#include <cs.h>改成#include "cs.h" (3)右鍵vs工程,屬性,C/C++,前置處理器 中加上 _WINDOWS
下面兩張圖是我跑TUM資料集中的Fr1_XYZ資料集(792幀)的g2o最佳化結果:第一張沒有加保護措施,新的一幀和上一個主要畫面格之間如果一直沒有匹配上(合適的漢明距離,合適的姿態變換),那麼接下來很多幀都會丟失,直到重新回到上一個主要畫面格附近的情境;第二張加了保護措施,連續6幀以上沒匹配上,就會把新的一幀加入到主要畫面格裡,同時計算上一個主要畫面格到這個主要畫面格的連續姿態變換然後存到圖最佳化的邊中。
57個主要畫面格節點,616條邊:
139個主要畫面格節點,1270條邊:
具體的資訊接下來的部落格中會慢慢講道。我現在還在學習G2O,未來努力看能不能改進點什麼。最後推薦一篇大牛半閑居士的部落格,我在上面也學到了很多東西,感謝大家,歡迎交流,共同進步!
關於SLAM的那些事——通用圖最佳化(G2O)環境搭配(windows8.1 vs2013)