ORB-SLAM2在window下的配置 (3)

配置Pangolin


接下來,開始進入有難度的地方了。
Pangolin是一個優秀的繪圖庫,它是對opengl的一層封裝,在ORB-SLAM2中用於可視化的部分。下載地址爲:https://github.com/stevenlovegrove/Pangolin

從這上面地址下載下來的,應該是其最新的源碼,我們可以直接用vs開幹,但這樣會多出很多工作,包括將源碼全部添加到vs工程中,設置一些編譯參數等等。這個時候,我們要祭出編譯工具,CMake.

打開CMake的GUI程序,可以看到如下畫面:
打開cmake
我們只關心上面的source codebuild路徑的設置,前者對應pangolin的根目錄,那裏有個總的CMakeList.txt,後者就如平常咱們在linux下編譯前建立的build文件夾一樣,來放一些雜物和生成後的東西。我們就在pangolin源碼根目錄下建立一個build文件夾。

設置好路徑後,點擊下方Configure按鈕,此時彈窗出現編譯器的選擇,我們選vs 2017 win64
配置CMake

設置完畢後,點擊Finish,接下來便是一段時間的等待,設置完成後,CMake中間會多出一些東西,那些是編譯選項,滑到最下方,有一個“build shared library”的選項,如果我們勾選它,就能夠生成動態鏈接的庫,意味着用pangolin的時候,需要爲其配置環境,方法在(1)中談了兩個;如果不勾選它(默認),那麼則不需配置環境,但生成的程序體積就大一些。關於這一點,不同情況的選擇不一樣,往後我不再談這個問題,環境配置的步驟也會忽略。

再點一次Configure按鈕,讓中間內容全變成白色(這一步應該可以忽略,但是多點幾下,總覺得比較安心),點擊Generate按鈕,生成vs工程。現在該vs工程已經在build文件夾中生成了,打開.sln工程文件,得到如下畫面:
打開vs工程
可以看到右邊一大排壯觀的東西,這就是CMake的功勞。

我們要的是release版本的庫就好了(除非你想調試Pangolin),將上方調試器模式調整爲release x64。如果此時你看不到x64的選項,那麼就是你在CMake選擇編譯器的時候,選錯了,如果是這樣,可以回到剛纔的CMake,點擊File->Delete Cahce,然後重新執行剛纔的步驟。

好了,點擊編譯吧,看看會發生什麼事。Pangolin的代碼原本就有設置給window編譯用的,因此不會有太大問題。主要有一點,中間vs會停留很久,似乎卡死一般,但其實它是在下載pangolin的依賴庫,記得開翻牆,然後慢慢等待就好了。

等得夠久的吧?不出意外的話,vs成功生成了pangolin的庫文件了。也許會出現一些錯誤,不過請看仔細,是否爲pangolin那個項目的問題,如果不是的話,大可忽略,以後出問題再說。

部署Pangolin


現在我們開始部署一下pangolin,所謂部署,正如我在(1)中所說,就是將它的頭文件、庫文件抽取出來,放在一個專用的文件夾中,然後爲其配置一個屬性表,供其它工程使用。

先說頭文件,我們在XXX/Pangolin/下建立一個include文件夾,(XXX指的是專門放庫的地方,而非庫的源碼目錄),裏邊的內容可以從Pangolin源碼根目錄的include文件夾中的全部內容。不過這樣還是不夠的,還需從build/src/include/pangolin/中拿所有內容來。

爲何我會發現這件事?可以有兩種思路:

  1. 後邊編譯的時候,會有找不到頭文件的錯誤,缺的就是這幾個,然後在pangolin源碼目錄下搜索一下就能發現了。
  2. pangolin的vs工程中,有個HelloPangolin的項目,很明顯是一個樣例,我們運行它發現是OK的,那麼這裏邊的東西便可以借鑑,然後就會發現它的包含目錄中,就多了以上說的那兩個include文件夾。

前面已經說過了,從現在開始,要動點腦子才行了。

OK,現在在XXX/Pangolin/下建立一個lib文件夾,裏邊的內容包括了:

  • build/src/Release下的全部內容(dll也放這裏來吧);
  • build/external/glew的lib和include文件夾;
  • build/external/libjpeg的lib和include文件夾;
  • build/external/libpng的lib和include文件夾,注意,其有個dll放在其的bin文件夾下,也一起拿到其lib中去吧;
  • build/external/zlib的lib和include文件夾,注意,其有個dll同上。

external的東西其實就是pangolin的依賴庫,它們也都有頭文件,但我們不放在XXX/Pangolin/include下,是爲了避免混亂(因爲那些東西,pangolin使用者不會用到)。

最後一步,我們建一個新的vs工程,爲pangolin建立一個新的屬性表,並測試一下。屬性表如(2)配置OpenCV時一樣,需要設置包含目錄庫目錄、和鏈接器輸入,特別的是,這三者均需要包含pangolin的依賴庫的東西,我們可以直接拷貝HelloPangolin項目的代碼進行測試:

#include <pangolin/pangolin.h>

int main( int /*argc*/, char** /*argv*/ )
{  
    pangolin::CreateWindowAndBind("Main",640,480);
    glEnable(GL_DEPTH_TEST);

    // Define Projection and initial ModelView matrix
    pangolin::OpenGlRenderState s_cam(
        pangolin::ProjectionMatrix(640,480,420,420,320,240,0.2,100),
        pangolin::ModelViewLookAt(-2,2,-2, 0,0,0, pangolin::AxisY)
    );

    // Create Interactive View in window
    pangolin::Handler3D handler(s_cam);
    pangolin::View& d_cam = pangolin::CreateDisplay()
            .SetBounds(0.0, 1.0, 0.0, 1.0, -640.0f/480.0f)
            .SetHandler(&handler);

    while( !pangolin::ShouldQuit() )
    {
        // Clear screen and activate view to render into
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        d_cam.Activate(s_cam);

        // Render OpenGL Cube
        pangolin::glDrawColouredCube();

        // Swap frames and Process Events
        pangolin::FinishFrame();
    }

    return 0;
}

成功的話,你會看到一個窗口,裏邊有個三色立方體。不過對於第一次配置pangolin的人來說,你現在會碰到“LNK2001 無法解析外部符號”的鏈接錯誤,這是因爲現在實際上還少了很多庫,而這些庫存在於window中。

何以見得?從HelloPangolin的項目屬性中可以看到,其鏈接器輸入不僅有以上提到的那些庫.lib文件,還有其他好多.lib文件。不過有一些是用於控制檯應用程序本身的,這可以從該對話框下方“繼承的值”那裏挑出來:
屬性表配置
我這裏給出我配置的時候,.lib文件的清單,可能不同情況有所差異,所以還是按照上面的步驟來操作比較好:

  • pangolin.lib
  • glew.lib
  • jpeg.lib
  • libpng16_static.lib
  • zlibstatic.lib
  • glu32.lib
  • opengl32.lib
  • mfplat.lib
  • mfreadwrite.lib
  • mfuuid.lib
  • strmiids.lib
  • mf.lib

注意到,我用的lib都是靜態的,意味着不需要配置運行環境。現在我們再編譯一次看看。不出意外的話,這個時候會報另外一個錯誤,“LNK2038 RuntimeLibrary不匹配項”,從錯誤提示我們得出以下解決步驟:項目屬性->C++->代碼生成->運行庫:從Md改成Mt

由於pangolin編譯的時候是Mt選項,而默認的控制檯程序是Mt選項,所以會報此錯。不過這樣改貌似有點問題,因爲不確認所有的庫是不是都一樣的。這一點我沒去深究,現在先暫時這樣,以後出問題再說吧。

好了,現在應該能夠看到這個畫面了:
配置成功

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章